From 1349c76cef06beda0401c9dbcf906e951393f145 Mon Sep 17 00:00:00 2001 From: Inesh Bose Date: Thu, 11 Apr 2024 20:17:18 +0100 Subject: [PATCH 1/7] chore(kit): provide type support for module options in installModule --- packages/kit/src/module/install.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/kit/src/module/install.ts b/packages/kit/src/module/install.ts index b17cee47ca48..4c81400162e3 100644 --- a/packages/kit/src/module/install.ts +++ b/packages/kit/src/module/install.ts @@ -1,5 +1,5 @@ import { existsSync, promises as fsp, lstatSync } from 'node:fs' -import type { ModuleMeta, Nuxt, NuxtModule } from '@nuxt/schema' +import type { ModuleMeta, Nuxt, NuxtModule, NuxtConfig } from '@nuxt/schema' import { dirname, isAbsolute, join, resolve } from 'pathe' import { defu } from 'defu' import { isNuxt2 } from '../compatibility' @@ -12,7 +12,10 @@ import { logger } from '../logger' const NODE_MODULES_RE = /[/\\]node_modules[/\\]/ /** Installs a module on a Nuxt instance. */ -export async function installModule (moduleToInstall: string | NuxtModule, inlineOptions?: any, nuxt: Nuxt = useNuxt()) { +export async function installModule < + T extends string | NuxtModule, + Config extends Extract[number], [T, any]> +>(moduleToInstall: T, inlineOptions?: [Config] extends [never] ? any : Config[1], nuxt: Nuxt = useNuxt()) { const { nuxtModule, buildTimeModuleMeta } = await loadNuxtModuleInstance(moduleToInstall, nuxt) const localLayerModuleDirs = new Set() From 649933eaf87fa4c5e2eed282a554dcecde158b01 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Thu, 11 Apr 2024 19:19:59 +0000 Subject: [PATCH 2/7] [autofix.ci] apply automated fixes --- packages/kit/src/module/install.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/kit/src/module/install.ts b/packages/kit/src/module/install.ts index 4c81400162e3..bf895bebe91e 100644 --- a/packages/kit/src/module/install.ts +++ b/packages/kit/src/module/install.ts @@ -1,5 +1,5 @@ import { existsSync, promises as fsp, lstatSync } from 'node:fs' -import type { ModuleMeta, Nuxt, NuxtModule, NuxtConfig } from '@nuxt/schema' +import type { ModuleMeta, Nuxt, NuxtConfig, NuxtModule } from '@nuxt/schema' import { dirname, isAbsolute, join, resolve } from 'pathe' import { defu } from 'defu' import { isNuxt2 } from '../compatibility' @@ -12,10 +12,10 @@ import { logger } from '../logger' const NODE_MODULES_RE = /[/\\]node_modules[/\\]/ /** Installs a module on a Nuxt instance. */ -export async function installModule < +export async function installModule< T extends string | NuxtModule, - Config extends Extract[number], [T, any]> ->(moduleToInstall: T, inlineOptions?: [Config] extends [never] ? any : Config[1], nuxt: Nuxt = useNuxt()) { + Config extends Extract[number], [T, any]>, +> (moduleToInstall: T, inlineOptions?: [Config] extends [never] ? any : Config[1], nuxt: Nuxt = useNuxt()) { const { nuxtModule, buildTimeModuleMeta } = await loadNuxtModuleInstance(moduleToInstall, nuxt) const localLayerModuleDirs = new Set() From aa0d0ad798eb42f3be0fcc1225b5cef2debc3c58 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Sat, 13 Apr 2024 00:18:46 +0200 Subject: [PATCH 3/7] test: add test --- test/fixtures/basic-types/nuxt.config.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/test/fixtures/basic-types/nuxt.config.ts b/test/fixtures/basic-types/nuxt.config.ts index 0a8ff268c721..737f338cbf67 100644 --- a/test/fixtures/basic-types/nuxt.config.ts +++ b/test/fixtures/basic-types/nuxt.config.ts @@ -1,4 +1,4 @@ -import { addTypeTemplate } from 'nuxt/kit' +import { addTypeTemplate, installModule } from 'nuxt/kit' export default defineNuxtConfig({ experimental: { @@ -41,6 +41,15 @@ export default defineNuxtConfig({ filename: 'test.d.ts', getContents: () => 'declare type Fromage = "cheese"', }) + function _test () { + installModule('~/modules/example', { + typeTest (val) { + // @ts-expect-error module type defines val as boolean + const b: string = val + return !!b + }, + }) + } }, './modules/test', [ From b6f4d27d4fac269843c02b8e06d6591c923aa04f Mon Sep 17 00:00:00 2001 From: Inesh Bose Date: Sat, 13 Apr 2024 17:11:16 +0100 Subject: [PATCH 4/7] chore: use raw path --- packages/kit/src/module/install.ts | 12 +++++++++--- packages/nuxt/src/core/templates.ts | 4 ++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/kit/src/module/install.ts b/packages/kit/src/module/install.ts index bf895bebe91e..96ddc0d758e2 100644 --- a/packages/kit/src/module/install.ts +++ b/packages/kit/src/module/install.ts @@ -1,5 +1,5 @@ import { existsSync, promises as fsp, lstatSync } from 'node:fs' -import type { ModuleMeta, Nuxt, NuxtConfig, NuxtModule } from '@nuxt/schema' +import type { ModuleMeta, Nuxt, NuxtModule } from '@nuxt/schema' import { dirname, isAbsolute, join, resolve } from 'pathe' import { defu } from 'defu' import { isNuxt2 } from '../compatibility' @@ -14,7 +14,7 @@ const NODE_MODULES_RE = /[/\\]node_modules[/\\]/ /** Installs a module on a Nuxt instance. */ export async function installModule< T extends string | NuxtModule, - Config extends Extract[number], [T, any]>, + Config extends Extract[number], [T, any]>, > (moduleToInstall: T, inlineOptions?: [Config] extends [never] ? any : Config[1], nuxt: Nuxt = useNuxt()) { const { nuxtModule, buildTimeModuleMeta } = await loadNuxtModuleInstance(moduleToInstall, nuxt) @@ -46,10 +46,16 @@ export async function installModule< } nuxt.options._installedModules = nuxt.options._installedModules || [] + const entryPath = typeof moduleToInstall === 'string' ? resolveAlias(moduleToInstall) : undefined + + if (typeof moduleToInstall === 'string' && entryPath !== moduleToInstall) { + buildTimeModuleMeta.rawPath = moduleToInstall + } + nuxt.options._installedModules.push({ meta: defu(await nuxtModule.getMeta?.(), buildTimeModuleMeta), timings: res.timings, - entryPath: typeof moduleToInstall === 'string' ? resolveAlias(moduleToInstall) : undefined, + entryPath, }) } diff --git a/packages/nuxt/src/core/templates.ts b/packages/nuxt/src/core/templates.ts index 2234e60dca7c..74ae9505691f 100644 --- a/packages/nuxt/src/core/templates.ts +++ b/packages/nuxt/src/core/templates.ts @@ -150,7 +150,7 @@ export const schemaTemplate: NuxtTemplate = { const relativeRoot = relative(resolve(nuxt.options.buildDir, 'types'), nuxt.options.rootDir) const getImportName = (name: string) => (name[0] === '.' ? './' + join(relativeRoot, name) : name).replace(/\.\w+$/, '') - const modules = moduleInfo.map(meta => [genString(meta.configKey), getImportName(meta.importName)]) + const modules = moduleInfo.map(meta => [genString(meta.configKey), getImportName(meta.importName), meta]) const privateRuntimeConfig = Object.create(null) for (const key in nuxt.options.runtimeConfig) { if (key !== 'public') { @@ -164,7 +164,7 @@ export const schemaTemplate: NuxtTemplate = { ...modules.map(([configKey, importName]) => ` [${configKey}]?: typeof ${genDynamicImport(importName, { wrapper: false })}.default extends NuxtModule ? Partial : Record`, ), - modules.length > 0 ? ` modules?: (undefined | null | false | NuxtModule | string | [NuxtModule | string, Record] | ${modules.map(([configKey, importName]) => `[${genString(importName)}, Exclude]`).join(' | ')})[],` : '', + modules.length > 0 ? ` modules?: (undefined | null | false | NuxtModule | string | [NuxtModule | string, Record] | ${modules.map(([configKey, importName, meta]) => `[${genString(meta?.rawPath || importName)}, Exclude]`).join(' | ')})[],` : '', ' }', generateTypes(await resolveSchema(privateRuntimeConfig as Record), { From a59ba423b590c89c7a62a5c59545ddb10c3bd9e2 Mon Sep 17 00:00:00 2001 From: Inesh Bose Date: Fri, 31 May 2024 16:13:40 +0100 Subject: [PATCH 5/7] chore: remove dynamic import --- packages/kit/build.config.ts | 1 + packages/kit/src/module/install.ts | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/kit/build.config.ts b/packages/kit/build.config.ts index 10db29592736..f7af5ecdda1b 100644 --- a/packages/kit/build.config.ts +++ b/packages/kit/build.config.ts @@ -7,6 +7,7 @@ export default defineBuildConfig({ ], externals: [ '@nuxt/schema', + 'nuxt/schema', 'nitropack', 'webpack', 'vite', diff --git a/packages/kit/src/module/install.ts b/packages/kit/src/module/install.ts index 96ddc0d758e2..8b233fc8951d 100644 --- a/packages/kit/src/module/install.ts +++ b/packages/kit/src/module/install.ts @@ -1,5 +1,6 @@ import { existsSync, promises as fsp, lstatSync } from 'node:fs' import type { ModuleMeta, Nuxt, NuxtModule } from '@nuxt/schema' +import type { NuxtConfig } from 'nuxt/schema' import { dirname, isAbsolute, join, resolve } from 'pathe' import { defu } from 'defu' import { isNuxt2 } from '../compatibility' @@ -14,7 +15,7 @@ const NODE_MODULES_RE = /[/\\]node_modules[/\\]/ /** Installs a module on a Nuxt instance. */ export async function installModule< T extends string | NuxtModule, - Config extends Extract[number], [T, any]>, + Config extends Extract[number], [T, any]>, > (moduleToInstall: T, inlineOptions?: [Config] extends [never] ? any : Config[1], nuxt: Nuxt = useNuxt()) { const { nuxtModule, buildTimeModuleMeta } = await loadNuxtModuleInstance(moduleToInstall, nuxt) From a05e78606f5c6b7988d031b2a91788ddb315e813 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Mon, 10 Jun 2024 07:58:50 +0100 Subject: [PATCH 6/7] chore: update to `@nuxt/schema` --- packages/kit/build.config.ts | 1 - packages/kit/src/module/install.ts | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/kit/build.config.ts b/packages/kit/build.config.ts index f7af5ecdda1b..10db29592736 100644 --- a/packages/kit/build.config.ts +++ b/packages/kit/build.config.ts @@ -7,7 +7,6 @@ export default defineBuildConfig({ ], externals: [ '@nuxt/schema', - 'nuxt/schema', 'nitropack', 'webpack', 'vite', diff --git a/packages/kit/src/module/install.ts b/packages/kit/src/module/install.ts index 8b233fc8951d..cc047aa58a5a 100644 --- a/packages/kit/src/module/install.ts +++ b/packages/kit/src/module/install.ts @@ -1,6 +1,5 @@ import { existsSync, promises as fsp, lstatSync } from 'node:fs' -import type { ModuleMeta, Nuxt, NuxtModule } from '@nuxt/schema' -import type { NuxtConfig } from 'nuxt/schema' +import type { ModuleMeta, Nuxt, NuxtConfig, NuxtModule } from '@nuxt/schema' import { dirname, isAbsolute, join, resolve } from 'pathe' import { defu } from 'defu' import { isNuxt2 } from '../compatibility' From 94986cfd2337f5164dff1fa0a5afb1f6758214eb Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Mon, 10 Jun 2024 09:32:47 +0100 Subject: [PATCH 7/7] fix: augment `@nuxt/schema `also --- packages/nuxt/src/core/templates.ts | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/nuxt/src/core/templates.ts b/packages/nuxt/src/core/templates.ts index 623d670f7f92..0395ff2cbbc9 100644 --- a/packages/nuxt/src/core/templates.ts +++ b/packages/nuxt/src/core/templates.ts @@ -163,14 +163,22 @@ export const schemaTemplate: NuxtTemplate = { privateRuntimeConfig[key] = nuxt.options.runtimeConfig[key] } } - return [ - 'import { NuxtModule, RuntimeConfig } from \'nuxt/schema\'', - 'declare module \'nuxt/schema\' {', - ' interface NuxtConfig {', + const moduleOptionsInterface = [ ...modules.map(([configKey, importName]) => ` [${configKey}]?: typeof ${genDynamicImport(importName, { wrapper: false })}.default extends NuxtModule ? Partial : Record`, ), - modules.length > 0 ? ` modules?: (undefined | null | false | NuxtModule | string | [NuxtModule | string, Record] | ${modules.map(([configKey, importName, meta]) => `[${genString(meta?.rawPath || importName)}, Exclude]`).join(' | ')})[],` : '', + modules.length > 0 ? ` modules?: (undefined | null | false | NuxtModule | string | [NuxtModule | string, Record] | ${modules.map(([configKey, importName, meta]) => `[${genString(meta?.rawPath || importName)}, Exclude]`).join(' | ')})[],` : '', + ] + return [ + 'import { NuxtModule, RuntimeConfig } from \'@nuxt/schema\'', + 'declare module \'@nuxt/schema\' {', + ' interface NuxtConfig {', + moduleOptionsInterface, + ' }', + '}', + 'declare module \'nuxt/schema\' {', + ' interface NuxtConfig {', + moduleOptionsInterface, ' }', generateTypes(await resolveSchema(privateRuntimeConfig as Record), {