/* jscpd:ignore-start */ import type { MethodOptions } from '../../options/method.js' import type { UnionToIntersection } from '../../utils/intersect.js' import type { SliceFirst } from '../../utils/slice.js' import type { Plugin, Plugins } from '../shape/main.js' import type { InstanceMethod, InstanceMethods } from './main.js' /* jscpd:ignore-end */ /** * Bound instance method parameters */ type ErrorInstanceMethodParams< InstanceMethodArg extends InstanceMethod, MethodOptionsArg extends MethodOptions, > = | SliceFirst> | ([MethodOptionsArg] extends [never] ? never : readonly [ ...SliceFirst>, MethodOptionsArg, ]) /** * Bound instance method of a plugin */ type ErrorInstanceMethod< InstanceMethodArg extends InstanceMethod, MethodOptionsArg extends MethodOptions, > = ( ...args: ErrorInstanceMethodParams ) => ReturnType /** * Bound instance methods of a plugin, always defined */ type ErrorInstanceMethods< InstanceMethodsArg extends InstanceMethods, MethodOptionsArg extends MethodOptions, > = { readonly [MethodName in keyof InstanceMethodsArg]: ErrorInstanceMethod< InstanceMethodsArg[MethodName], MethodOptionsArg > } /** * Bound instance methods of a plugin, if defined */ type PluginInstanceMethods = PluginArg extends { instanceMethods: InstanceMethods } ? ErrorInstanceMethods> : object /** * Bound instance methods of all plugins */ export type PluginsInstanceMethods = UnionToIntersection> & {}