diff --git a/packages/nuxt/src/app/config.ts b/packages/nuxt/src/app/config.ts index 0c3dd95baa..99eddf85a9 100644 --- a/packages/nuxt/src/app/config.ts +++ b/packages/nuxt/src/app/config.ts @@ -65,7 +65,7 @@ if (process.dev) { // Vite if (import.meta.hot) { import.meta.hot.accept((newModule) => { - const newConfig = newModule._getAppConfig() + const newConfig = newModule?._getAppConfig() applyHMR(newConfig) }) } diff --git a/packages/schema/src/types/global/vite.ts b/packages/schema/src/types/global/vite.ts index 18979845e3..58199475b9 100644 --- a/packages/schema/src/types/global/vite.ts +++ b/packages/schema/src/types/global/vite.ts @@ -1,35 +1,134 @@ /** * Reference: https://github.com/vitejs/vite/blob/main/packages/vite/types/importMeta.d.ts */ +export type ModuleNamespace = Record & { + [Symbol.toStringTag]: 'Module' +} export interface ViteHot { readonly data: any accept (): void - accept (cb: (mod: any) => void): void - accept (dep: string, cb: (mod: any) => void): void - accept (deps: readonly string[], cb: (mods: any[]) => void): void + accept (cb: (mod: ModuleNamespace | undefined) => void): void + accept (dep: string, cb: (mod: ModuleNamespace | undefined) => void): void + accept (deps: readonly string[], cb: (mods: Array) => void): void + acceptExports (exportNames: string | readonly string[], cb?: (mod: ModuleNamespace | undefined) => void): void dispose (cb: (data: any) => void): void - decline (): void - invalidate (): void + prune (cb: (data: any) => void): void + invalidate (message?: string): void on (event: any, cb: (payload: any) => void): void send (event: any, data?: any): void } -export interface ViteGlobOptions { - as?: string - eager?: boolean +export interface KnownAsTypeMap { + raw: string + url: string + worker: Worker +} + +export interface ImportGlobOptions< + Eager extends boolean, + AsType extends string +> { + /** + * Import type for the import url. + */ + as?: AsType + /** + * Import as static or dynamic + * + * @default false + */ + eager?: Eager + /** + * Import only the specific named export. Set to `default` to import the default export. + */ import?: string + /** + * Custom queries + */ query?: string | Record + /** + * Search files also inside `node_modules/` and hidden directories (e.g. `.git/`). This might have impact on performance. + * + * @default false + */ exhaustive?: boolean } +export interface ImportGlobFunction { + /** + * Import a list of files with a glob pattern. + * + * Overload 1: No generic provided, infer the type from `eager` and `as` + */ + < + Eager extends boolean, + As extends string, + T = As extends keyof KnownAsTypeMap ? KnownAsTypeMap[As] : unknown + >( + glob: string | string[], + options?: ImportGlobOptions + ): (Eager extends true + ? true + : false) extends true + ? Record + : Record Promise> + /** + * Import a list of files with a glob pattern. + * + * Overload 2: Module generic provided, infer the type from `eager: false` + */ + ( + glob: string | string[], + options?: ImportGlobOptions + ): Record Promise> + /** + * Import a list of files with a glob pattern. + * + * Overload 3: Module generic provided, infer the type from `eager: true` + */ + ( + glob: string | string[], + options: ImportGlobOptions + ): Record +} + +export interface ImportGlobEagerFunction { + /** + * Eagerly import a list of files with a glob pattern. + * + * Overload 1: No generic provided, infer the type from `as` + */ + < + As extends string, + T = As extends keyof KnownAsTypeMap ? KnownAsTypeMap[As] : unknown + >( + glob: string | string[], + options?: Omit, 'eager'> + ): Record + /** + * Eagerly import a list of files with a glob pattern. + * + * Overload 2: Module generic provided + */ + ( + glob: string | string[], + options?: Omit, 'eager'> + ): Record +} + export interface ViteImportMeta { /** Vite client HMR API - see https://vitejs.dev/guide/api-hmr.html */ readonly hot?: ViteHot /** vite glob import utility - https://vitejs.dev/guide/features.html#glob-import */ - glob (glob: string | string[], options?: ViteGlobOptions): Record Promise>> + glob: ImportGlobFunction + + /** + * @deprecated Use `import.meta.glob('*', { eager: true })` instead + */ + globEager: ImportGlobEagerFunction }