import { AllowedComponentProps, AppContext, Component, EmitsOptions, ObjectPlugin, SetupContext, VNodeProps } from "vue"; import { ComponentEmit, ComponentProps } from "vue-component-type-helpers"; //#region ../../packages/utils/vue/typescript.d.ts type NativeType = null | undefined | number | string | boolean | symbol | Function; /** * Reference from https://github.com/vuejs/core/blob/main/packages/runtime-core/src/apiSetupHelpers.ts#L338-L340 */ type InferDefaults = { [K in keyof T as string extends K ? never : K]?: InferDefault }; type InferDefault = (() => T & {}) | (T extends NativeType ? T : never); type ExtractEventNames = ComponentEmit extends ((event: string, ...args: any[]) => any) ? never : keyof { [K in keyof ComponentProps as K extends `on${infer Event}` ? ComponentEmit extends ((event: Uncapitalize, ...args: any[]) => any) ? K : never : never]: unknown }; type ExcludedProps = ExtractEventNames | keyof VNodeProps | keyof AllowedComponentProps; type SFCWithInstall = T & ObjectPlugin & SFCWithPropsDefaultsSetter; type SFCInstallWithContext = SFCWithInstall & { _context: AppContext | null; }; type SFCWithPropsDefaultsSetter = T extends Component ? { setPropsDefaults: (defaults: InferDefaults<{ [K in keyof ComponentProps as K extends ExcludedProps ? never : K]?: ComponentProps[K] }>) => void; } : unknown; type EmitFn = SetupContext['emit']; //#endregion export { EmitFn, SFCInstallWithContext, SFCWithInstall, SFCWithPropsDefaultsSetter };