From ed40935041dea29ca57fe1a0671e40a0cd2a2deb Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Sat, 18 Jul 2026 09:44:52 +0100 Subject: [PATCH 1/3] fix(config): inline config for useRuntimeConfig() composable --- examples/app-vitest-full/tests/paths.spec.ts | 11 +++++++++++ src/module.ts | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 examples/app-vitest-full/tests/paths.spec.ts diff --git a/examples/app-vitest-full/tests/paths.spec.ts b/examples/app-vitest-full/tests/paths.spec.ts new file mode 100644 index 000000000..6ba61c0ca --- /dev/null +++ b/examples/app-vitest-full/tests/paths.spec.ts @@ -0,0 +1,11 @@ +/** @vitest-environment happy-dom */ +import { describe, expect, it } from 'vitest' +// @ts-expect-error virtual module +import { baseURL, buildAssetsDir } from '#internal/nuxt/paths' + +describe('generated paths module', () => { + it('resolves outside the nuxt environment', () => { + expect(() => baseURL()).not.toThrow() + expect(() => buildAssetsDir()).not.toThrow() + }) +}) diff --git a/src/module.ts b/src/module.ts index 5aae81bba..28a940cd5 100644 --- a/src/module.ts +++ b/src/module.ts @@ -37,6 +37,24 @@ export default defineNuxtModule({ await setupImportMocking(nuxt) } + // inline runtime config the way dev builds do + if (nuxt.options.test && !nuxt.options.dev) { + nuxt.hook('app:templates', (app) => { + const template = app.templates.find(t => t.filename === 'paths.mjs') + if (!template?.getContents) { + return + } + const original = template.getContents + const inlineAppConfig = JSON.stringify(nuxt.options.app) + template.getContents = async (data) => { + const contents = await original(data) + return contents + .replace(/^import \{ useRuntimeConfig \} from ['"]nitropack\/runtime['"]\n?/m, '') + .replace(/const getAppConfig = \(\) => useRuntimeConfig\(\)\.app/, `const getAppConfig = () => (${inlineAppConfig})`) + } + }) + } + const { addVitePlugin } = await loadKit(nuxt.options.rootDir) const resolver = createResolver(import.meta.url) From 9dfe582d1dad3aa4a9aa85dd8a4b3036fc86048f Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Sat, 18 Jul 2026 09:53:14 +0100 Subject: [PATCH 2/3] chore: update test assertion --- examples/app-vitest-full/tests/resolved-files.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/app-vitest-full/tests/resolved-files.spec.ts b/examples/app-vitest-full/tests/resolved-files.spec.ts index c50dd6f70..d3e49762d 100644 --- a/examples/app-vitest-full/tests/resolved-files.spec.ts +++ b/examples/app-vitest-full/tests/resolved-files.spec.ts @@ -20,5 +20,5 @@ test('it should include nuxt spec files', { timeout: 30000 }, async ({ onTestFin const regularSpecFiles = testFiles.filter(file => file.project.name === 'node') expect(nuxtSpecFiles.length).toEqual(26) - expect(regularSpecFiles.length).toEqual(2) + expect(regularSpecFiles.length).toEqual(3) }) From 717212d330ca31df1db91c16933def6399436dba Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Sat, 18 Jul 2026 09:53:18 +0100 Subject: [PATCH 3/3] chore: use replacer --- src/module.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/module.ts b/src/module.ts index 28a940cd5..f81a437b0 100644 --- a/src/module.ts +++ b/src/module.ts @@ -50,7 +50,7 @@ export default defineNuxtModule({ const contents = await original(data) return contents .replace(/^import \{ useRuntimeConfig \} from ['"]nitropack\/runtime['"]\n?/m, '') - .replace(/const getAppConfig = \(\) => useRuntimeConfig\(\)\.app/, `const getAppConfig = () => (${inlineAppConfig})`) + .replace(/const getAppConfig = \(\) => useRuntimeConfig\(\)\.app/, () => `const getAppConfig = () => (${inlineAppConfig})`) } }) }