diff --git a/packages/nuxt/src/pages/module.ts b/packages/nuxt/src/pages/module.ts index 864a5701d5..6a27df6bb9 100644 --- a/packages/nuxt/src/pages/module.ts +++ b/packages/nuxt/src/pages/module.ts @@ -47,11 +47,12 @@ export default defineNuxtModule({ configKey: 'pages', }, defaults: nuxt => ({ - enabled: undefined as undefined | boolean, + enabled: typeof nuxt.options.pages === 'boolean' ? nuxt.options.pages : undefined as undefined | boolean, pattern: `**/*{${nuxt.options.extensions.join(',')}}` as string | string[], }), async setup (_options, nuxt) { - const options = typeof _options === 'boolean' ? { enabled: _options, pattern: `**/*{${nuxt.options.extensions.join(',')}}` } : _options + const options = typeof _options === 'boolean' ? { enabled: _options ?? nuxt.options.pages, pattern: `**/*{${nuxt.options.extensions.join(',')}}` } : { ..._options } + options.pattern = Array.isArray(options.pattern) ? [...new Set(options.pattern)] : options.pattern const useExperimentalTypedPages = nuxt.options.experimental.typedPages const builtInRouterOptions = await findPath(resolve(runtimeDir, 'router.options')) || resolve(runtimeDir, 'router.options') @@ -95,6 +96,7 @@ export default defineNuxtModule({ return false } options.enabled = await isPagesEnabled() + nuxt.options.pages = options if (nuxt.options.dev && options.enabled) { // Add plugin to check if pages are enabled without NuxtPage being instantiated diff --git a/packages/nuxt/test/load-nuxt.test.ts b/packages/nuxt/test/load-nuxt.test.ts index b6a99d4cec..0c21509373 100644 --- a/packages/nuxt/test/load-nuxt.test.ts +++ b/packages/nuxt/test/load-nuxt.test.ts @@ -4,6 +4,7 @@ import { normalize } from 'pathe' import { withoutTrailingSlash } from 'ufo' import { logger, tryUseNuxt, useNuxt } from '@nuxt/kit' import { loadNuxt } from '../src' +import type { NuxtConfig } from '../schema' const repoRoot = withoutTrailingSlash(normalize(fileURLToPath(new URL('../../../', import.meta.url)))) @@ -107,3 +108,21 @@ describe('loadNuxt', () => { expect(loggerWarn).not.toHaveBeenCalled() }) }) + +const pagesDetectionTests: [test: string, overrides: NuxtConfig, result: NuxtConfig['pages']][] = [ + ['pages dir', {}, { enabled: true }], + ['pages dir empty', { dir: { pages: 'empty-dir' } }, { enabled: false }], + ['user config', { pages: false }, { enabled: false }], + ['user config', { pages: { enabled: false } }, { enabled: false }], + ['user config', { pages: { enabled: true, pattern: '**/*{.vue}' } }, { enabled: true, pattern: '**/*{.vue}' }], +] + +const pagesFixtureDir = withoutTrailingSlash(normalize(fileURLToPath(new URL('./pages-fixture', import.meta.url)))) +describe('pages detection', () => { + it.each(pagesDetectionTests)('%s `%s`', async (_, overrides, result) => { + const nuxt = await loadNuxt({ cwd: pagesFixtureDir, overrides, ready: true }) + // @ts-expect-error should resolve to object? + expect(nuxt.options.pages).toMatchObject(result) + await nuxt.close() + }) +}) diff --git a/packages/nuxt/test/pages-fixture/nuxt.config.ts b/packages/nuxt/test/pages-fixture/nuxt.config.ts new file mode 100644 index 0000000000..268da7f8c1 --- /dev/null +++ b/packages/nuxt/test/pages-fixture/nuxt.config.ts @@ -0,0 +1 @@ +export default defineNuxtConfig({}) diff --git a/packages/nuxt/test/pages-fixture/pages/index.vue b/packages/nuxt/test/pages-fixture/pages/index.vue new file mode 100644 index 0000000000..04d85e1bdb --- /dev/null +++ b/packages/nuxt/test/pages-fixture/pages/index.vue @@ -0,0 +1,3 @@ +