From 708a5f61985df8b9730fc8239520498c89ef354d Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Thu, 4 Aug 2022 10:54:27 +0100 Subject: [PATCH 1/5] fix(nuxt): include plugins/middleware without extensions in transform --- packages/nuxt/src/core/plugins/unctx.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/nuxt/src/core/plugins/unctx.ts b/packages/nuxt/src/core/plugins/unctx.ts index 6c2d4ba970a..03830b5d1f1 100644 --- a/packages/nuxt/src/core/plugins/unctx.ts +++ b/packages/nuxt/src/core/plugins/unctx.ts @@ -14,7 +14,7 @@ export const UnctxTransformPlugin = (nuxt: Nuxt) => { name: 'unctx:transfrom', enforce: 'post', transformInclude (id) { - return Boolean(app?.plugins.find(i => i.src === id) || app.middleware.find(m => m.path === id)) + return Boolean(app?.plugins.find(i => matchesPath(id, i.src)) || app.middleware.find(m => matchesPath(id, m.path))) }, transform (code, id) { const result = transformer.transform(code) @@ -27,3 +27,5 @@ export const UnctxTransformPlugin = (nuxt: Nuxt) => { } })) } + +const matchesPath = (path: string, withoutExt: string) => path === withoutExt || path.startsWith(withoutExt + '.') From f423665c01fa272bae37e71c524c09cd87f48f77 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Thu, 4 Aug 2022 11:08:52 +0100 Subject: [PATCH 2/5] test: add unctx module transform tests --- test/fixtures/basic/modules/example.ts | 13 ++++++++++++- test/fixtures/basic/modules/runtime/middleware.ts | 4 ++++ test/fixtures/basic/modules/runtime/plugin.ts | 4 ++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/basic/modules/runtime/middleware.ts create mode 100644 test/fixtures/basic/modules/runtime/plugin.ts diff --git a/test/fixtures/basic/modules/example.ts b/test/fixtures/basic/modules/example.ts index d0c8fd880ba..9f28b73c11c 100644 --- a/test/fixtures/basic/modules/example.ts +++ b/test/fixtures/basic/modules/example.ts @@ -1,4 +1,5 @@ -import { defineNuxtModule } from '@nuxt/kit' +import { fileURLToPath } from 'node:url' +import { defineNuxtModule, addPlugin, useNuxt } from '@nuxt/kit' export default defineNuxtModule({ defaults: { @@ -7,5 +8,15 @@ export default defineNuxtModule({ meta: { name: 'my-module', configKey: 'sampleModule' + }, + setup () { + addPlugin(fileURLToPath(new URL('./runtime/plugin', import.meta.url))) + useNuxt().hook('app:resolve', (app) => { + app.middleware.push({ + name: 'unctx-test', + path: fileURLToPath(new URL('./runtime/middleware', import.meta.url)), + global: true + }) + }) } }) diff --git a/test/fixtures/basic/modules/runtime/middleware.ts b/test/fixtures/basic/modules/runtime/middleware.ts new file mode 100644 index 00000000000..7ddcb23d820 --- /dev/null +++ b/test/fixtures/basic/modules/runtime/middleware.ts @@ -0,0 +1,4 @@ +export default defineNuxtRouteMiddleware(async () => { + await new Promise(resolve => setTimeout(resolve, 1)) + useNuxtApp() +}) diff --git a/test/fixtures/basic/modules/runtime/plugin.ts b/test/fixtures/basic/modules/runtime/plugin.ts new file mode 100644 index 00000000000..61a24ed6d20 --- /dev/null +++ b/test/fixtures/basic/modules/runtime/plugin.ts @@ -0,0 +1,4 @@ +export default defineNuxtPlugin(async () => { + await new Promise(resolve => setTimeout(resolve, 1)) + useNuxtApp() +}) From 2ad5a559a2f0105821b8c33f8afb40e2e1810c09 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Thu, 4 Aug 2022 12:36:53 +0100 Subject: [PATCH 3/5] refactor: normalize plugins and middleware after `app:resolve` --- packages/nuxt/src/core/app.ts | 18 +++++++++++++++--- packages/nuxt/src/core/plugins/unctx.ts | 4 +--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/packages/nuxt/src/core/app.ts b/packages/nuxt/src/core/app.ts index fbb820e060f..b3e806fc1ad 100644 --- a/packages/nuxt/src/core/app.ts +++ b/packages/nuxt/src/core/app.ts @@ -2,7 +2,7 @@ import { promises as fsp } from 'node:fs' import { dirname, resolve } from 'pathe' import defu from 'defu' import type { Nuxt, NuxtApp, NuxtPlugin } from '@nuxt/schema' -import { findPath, resolveFiles, normalizePlugin, normalizeTemplate, compileTemplate, templateUtils, tryResolveModule } from '@nuxt/kit' +import { findPath, resolveFiles, normalizePlugin, normalizeTemplate, compileTemplate, templateUtils, tryResolveModule, resolvePath, resolveAlias } from '@nuxt/kit' import * as defaultTemplates from './templates' import { getNameFromPath, hasSuffix, uniqueBy } from './utils' @@ -94,7 +94,6 @@ export async function resolveApp (nuxt: Nuxt, app: NuxtApp) { return { name, path: file, global: hasSuffix(file, '.global') } })) } - app.middleware = uniqueBy(app.middleware, 'name') // Resolve plugins app.plugins = [ @@ -109,8 +108,21 @@ export async function resolveApp (nuxt: Nuxt, app: NuxtApp) { ]) ].map(plugin => normalizePlugin(plugin as NuxtPlugin))) } - app.plugins = uniqueBy(app.plugins, 'src') // Extend app await nuxt.callHook('app:resolve', app) + + // Normalize and de-duplicate plugins and middleware + app.middleware = uniqueBy(await normalizePaths(app.middleware, 'path'), 'name') + app.plugins = uniqueBy(await normalizePaths(app.plugins, 'src'), 'src') +} + +const normalizePaths = >(items: Item[], key: { [K in keyof Item]: Item[K] extends string ? K : never }[keyof Item]) => { + return Promise.all(items.map(async (item) => { + if (!item[key]) { return item } + return { + ...item, + [key]: await resolvePath(resolveAlias(item[key])) + } + })) } diff --git a/packages/nuxt/src/core/plugins/unctx.ts b/packages/nuxt/src/core/plugins/unctx.ts index 03830b5d1f1..0b5d8ccfc01 100644 --- a/packages/nuxt/src/core/plugins/unctx.ts +++ b/packages/nuxt/src/core/plugins/unctx.ts @@ -14,7 +14,7 @@ export const UnctxTransformPlugin = (nuxt: Nuxt) => { name: 'unctx:transfrom', enforce: 'post', transformInclude (id) { - return Boolean(app?.plugins.find(i => matchesPath(id, i.src)) || app.middleware.find(m => matchesPath(id, m.path))) + return app?.plugins.some(i => i.src === id) || app.middleware.some(m => m.path === id) }, transform (code, id) { const result = transformer.transform(code) @@ -27,5 +27,3 @@ export const UnctxTransformPlugin = (nuxt: Nuxt) => { } })) } - -const matchesPath = (path: string, withoutExt: string) => path === withoutExt || path.startsWith(withoutExt + '.') From 5f69a3db741a33719d86072c81cc698b86bfe5f8 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Thu, 4 Aug 2022 12:42:47 +0100 Subject: [PATCH 4/5] fix: check app existence in both --- packages/nuxt/src/core/plugins/unctx.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nuxt/src/core/plugins/unctx.ts b/packages/nuxt/src/core/plugins/unctx.ts index 0b5d8ccfc01..4bb7c8295d5 100644 --- a/packages/nuxt/src/core/plugins/unctx.ts +++ b/packages/nuxt/src/core/plugins/unctx.ts @@ -14,7 +14,7 @@ export const UnctxTransformPlugin = (nuxt: Nuxt) => { name: 'unctx:transfrom', enforce: 'post', transformInclude (id) { - return app?.plugins.some(i => i.src === id) || app.middleware.some(m => m.path === id) + return app?.plugins.some(i => i.src === id) || app?.middleware.some(m => m.path === id) }, transform (code, id) { const result = transformer.transform(code) From b0885a2ee44863b962ca8a172c1c41d257ba20aa Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Thu, 4 Aug 2022 15:11:11 +0100 Subject: [PATCH 5/5] fix: normalize before `app:resolve` as well, for consistency --- packages/nuxt/src/core/app.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/nuxt/src/core/app.ts b/packages/nuxt/src/core/app.ts index b3e806fc1ad..1ae5080960d 100644 --- a/packages/nuxt/src/core/app.ts +++ b/packages/nuxt/src/core/app.ts @@ -109,15 +109,19 @@ export async function resolveApp (nuxt: Nuxt, app: NuxtApp) { ].map(plugin => normalizePlugin(plugin as NuxtPlugin))) } + // Normalize and de-duplicate plugins and middleware + app.middleware = uniqueBy(await resolvePaths(app.middleware, 'path'), 'name') + app.plugins = uniqueBy(await resolvePaths(app.plugins, 'src'), 'src') + // Extend app await nuxt.callHook('app:resolve', app) // Normalize and de-duplicate plugins and middleware - app.middleware = uniqueBy(await normalizePaths(app.middleware, 'path'), 'name') - app.plugins = uniqueBy(await normalizePaths(app.plugins, 'src'), 'src') + app.middleware = uniqueBy(await resolvePaths(app.middleware, 'path'), 'name') + app.plugins = uniqueBy(await resolvePaths(app.plugins, 'src'), 'src') } -const normalizePaths = >(items: Item[], key: { [K in keyof Item]: Item[K] extends string ? K : never }[keyof Item]) => { +function resolvePaths > (items: Item[], key: { [K in keyof Item]: Item[K] extends string ? K : never }[keyof Item]) { return Promise.all(items.map(async (item) => { if (!item[key]) { return item } return {