diff --git a/packages/nuxt/src/imports/module.ts b/packages/nuxt/src/imports/module.ts index a26d941de1..8fad47af86 100644 --- a/packages/nuxt/src/imports/module.ts +++ b/packages/nuxt/src/imports/module.ts @@ -72,11 +72,17 @@ export default defineNuxtModule>({ addVitePlugin(TransformPlugin.vite({ ctx, options, sourcemap: nuxt.options.sourcemap.server || nuxt.options.sourcemap.client })) addWebpackPlugin(TransformPlugin.webpack({ ctx, options, sourcemap: nuxt.options.sourcemap.server || nuxt.options.sourcemap.client })) + const priorities = nuxt.options._layers.map((layer, i) => [layer.config.srcDir, -i] as const).sort(([a], [b]) => b.length - a.length) + const regenerateImports = async () => { ctx.clearDynamicImports() await ctx.modifyDynamicImports(async (imports) => { // Scan composables/ - imports.push(...await scanDirExports(composablesDirs)) + const composableImports = await scanDirExports(composablesDirs) + for (const i of composableImports) { + i.priority = i.priority || priorities.find(([dir]) => i.from.startsWith(dir))?.[1] + } + imports.push(...composableImports) // Modules extending await nuxt.callHook('imports:extend', imports) }) diff --git a/test/basic.test.ts b/test/basic.test.ts index 48bfd745e5..2f2e0706c5 100644 --- a/test/basic.test.ts +++ b/test/basic.test.ts @@ -487,6 +487,10 @@ describe('extends support', () => { const html = await $fetch('/foo') expect(html).toContain('Composable | useExtendsFoo: foo') }) + it('allows overriding composables', async () => { + const html = await $fetch('/extends') + expect(html).toContain('test from project') + }) }) describe('plugins', () => { diff --git a/test/fixtures/basic/composables/override-base.ts b/test/fixtures/basic/composables/override-base.ts new file mode 100644 index 0000000000..43f65fec99 --- /dev/null +++ b/test/fixtures/basic/composables/override-base.ts @@ -0,0 +1 @@ +export const useOverrideableComposable = () => 'test from project' diff --git a/test/fixtures/basic/extends/bar/composables/base.ts b/test/fixtures/basic/extends/bar/composables/base.ts new file mode 100644 index 0000000000..21e0ca6805 --- /dev/null +++ b/test/fixtures/basic/extends/bar/composables/base.ts @@ -0,0 +1 @@ +export const useOverrideableComposable = () => 'test from layer' diff --git a/test/fixtures/basic/pages/extends.vue b/test/fixtures/basic/pages/extends.vue new file mode 100644 index 0000000000..5327ad9b4f --- /dev/null +++ b/test/fixtures/basic/pages/extends.vue @@ -0,0 +1,5 @@ +