diff --git a/packages/nuxt/__tests__/nuxt-layer.spec.ts b/packages/nuxt/__tests__/nuxt-layer.spec.ts new file mode 100644 index 0000000000..a844c11a60 --- /dev/null +++ b/packages/nuxt/__tests__/nuxt-layer.spec.ts @@ -0,0 +1,37 @@ +/** + * @vitest-env node + */ +import { fileURLToPath } from 'node:url' +import path from 'node:path' +import { describe, it, expect } from 'vitest' +import { setup, $fetch } from '@nuxt/test-utils' + +const __dirname = path.dirname(fileURLToPath(import.meta.url)) + +await setup({ + server: true, + rootDir: path.join(__dirname, '../layer/playground'), + nuxtConfig: { + hooks: { + 'vite:extendConfig'(config, { isClient }) { + config.define!.__BROWSER__ = isClient + }, + }, + vite: { + define: { + __DEV__: false, + __TEST__: true, + __FEATURE_PROD_DEVTOOLS__: false, + __USE_DEVTOOLS__: false, + }, + }, + }, +}) + +describe('works with nuxt layers', async () => { + it('loads stores when extending', async () => { + const html = await $fetch('/') + expect(html).toContain('Base store: 3') + expect(html).toContain('App store: xyz') + }) +}) diff --git a/packages/nuxt/layer/nuxt.config.ts b/packages/nuxt/layer/nuxt.config.ts new file mode 100644 index 0000000000..ee7f504645 --- /dev/null +++ b/packages/nuxt/layer/nuxt.config.ts @@ -0,0 +1,25 @@ +import { dirname, join } from 'node:path' +import { fileURLToPath } from 'node:url' +import { defineNuxtConfig } from 'nuxt/config' +import piniaModule from '../src/module' + +const currentDir = dirname(fileURLToPath(import.meta.url)) + +export default defineNuxtConfig({ + alias: { + pinia: fileURLToPath(new URL('../../pinia/src/index.ts', import.meta.url)), + }, + modules: [piniaModule], + + pinia: { + storesDirs: [join(currentDir, 'stores')], + }, + + vite: { + define: { + __DEV__: JSON.stringify(process.env.NODE_ENV !== 'production'), + __USE_DEVTOOLS__: true, + __TEST__: false, + }, + }, +}) diff --git a/packages/nuxt/layer/playground/app.vue b/packages/nuxt/layer/playground/app.vue new file mode 100644 index 0000000000..4bdbfbe983 --- /dev/null +++ b/packages/nuxt/layer/playground/app.vue @@ -0,0 +1,10 @@ + + \ No newline at end of file diff --git a/packages/nuxt/layer/playground/nuxt.config.ts b/packages/nuxt/layer/playground/nuxt.config.ts new file mode 100644 index 0000000000..2883b6efb9 --- /dev/null +++ b/packages/nuxt/layer/playground/nuxt.config.ts @@ -0,0 +1,15 @@ +import { defineNuxtConfig } from 'nuxt/config' + +export default defineNuxtConfig({ + extends: ['..'], + pinia: { + storesDirs: ['xyz'], + }, + vite: { + define: { + __DEV__: JSON.stringify(process.env.NODE_ENV !== 'production'), + __USE_DEVTOOLS__: true, + __TEST__: false, + }, + }, +}) diff --git a/packages/nuxt/layer/playground/xyz/store.ts b/packages/nuxt/layer/playground/xyz/store.ts new file mode 100644 index 0000000000..27db71a48f --- /dev/null +++ b/packages/nuxt/layer/playground/xyz/store.ts @@ -0,0 +1,6 @@ +export const useXYZStore = defineStore('xyz', () => { + const foo = ref('xyz') + return { + foo, + } +}) diff --git a/packages/nuxt/layer/stores/example.ts b/packages/nuxt/layer/stores/example.ts new file mode 100644 index 0000000000..deaeb69457 --- /dev/null +++ b/packages/nuxt/layer/stores/example.ts @@ -0,0 +1,6 @@ +export const useExampleStore = defineStore('example', () => { + const example = ref(3) + return { + example, + } +}) diff --git a/packages/nuxt/src/module.ts b/packages/nuxt/src/module.ts index 43ec644207..c469cd21cf 100644 --- a/packages/nuxt/src/module.ts +++ b/packages/nuxt/src/module.ts @@ -93,14 +93,8 @@ const module: NuxtModule = defineNuxtModule({ options.storesDirs = [resolver.resolve(nuxt.options.srcDir, 'stores')] } - if (options.storesDirs) { - for (const storeDir of [ - ...options.storesDirs, - /* @ts-expect-error storesDirs isn't on base NuxtOptions type */ - ...(nuxt.options.pinia?.storesDirs || []), - ]) { - addImportsDir(resolver.resolve(nuxt.options.rootDir, storeDir)) - } + for (const storeDir of options.storesDirs) { + addImportsDir(resolver.resolve(nuxt.options.rootDir, storeDir)) } }, })