From d173c618cb5c4ff609c807b1378123d089b41690 Mon Sep 17 00:00:00 2001 From: markthree <1801982702@qq.com> Date: Thu, 22 Feb 2024 16:02:57 +0800 Subject: [PATCH 01/14] fix(nuxt): sort global middleware on layers, close #25891 --- packages/nuxt/src/core/templates.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/nuxt/src/core/templates.ts b/packages/nuxt/src/core/templates.ts index 55ee480e135f..d0739c2e2e44 100644 --- a/packages/nuxt/src/core/templates.ts +++ b/packages/nuxt/src/core/templates.ts @@ -7,7 +7,7 @@ import escapeRE from 'escape-string-regexp' import { hash } from 'ohash' import { camelCase } from 'scule' import { filename } from 'pathe/utils' -import type { NuxtTemplate } from 'nuxt/schema' +import type { NuxtMiddleware, NuxtTemplate } from 'nuxt/schema' import { annotatePlugins, checkForCircularDependencies } from './app' export const vueShim: NuxtTemplate = { @@ -208,14 +208,21 @@ export const layoutTemplate: NuxtTemplate = { export const middlewareTemplate: NuxtTemplate = { filename: 'middleware.mjs', getContents ({ app }) { - const globalMiddleware = app.middleware.filter(mw => mw.global) + const globalMiddleware = sortGlobalMiddleware(app.middleware.filter(mw => mw.global)) const namedMiddleware = app.middleware.filter(mw => !mw.global) const namedMiddlewareObject = genObjectFromRawEntries(namedMiddleware.map(mw => [mw.name, genDynamicImport(mw.path)])) + return [ ...globalMiddleware.map(mw => genImport(mw.path, genSafeVariableName(mw.name))), `export const globalMiddleware = ${genArrayFromRaw(globalMiddleware.map(mw => genSafeVariableName(mw.name)))}`, `export const namedMiddleware = ${namedMiddlewareObject}` ].join('\n') + function sortGlobalMiddleware (globalMiddleware: NuxtMiddleware[]): NuxtMiddleware[] { + const reg = /^\d/ + const withOrdergGobalMiddleware = globalMiddleware.filter(m => reg.test(m.name)).toSorted((l, r) => l.name > r.name ? 1 : -1) + const withoutOrdergGobalMiddleware = globalMiddleware.filter(m => !reg.test(m.name)) + return [...withOrdergGobalMiddleware, ...withoutOrdergGobalMiddleware] + } } } From 71ad1f8d166677e4b1a1b4bfd42d58fbcc83ca16 Mon Sep 17 00:00:00 2001 From: markthree <1801982702@qq.com> Date: Thu, 22 Feb 2024 17:14:24 +0800 Subject: [PATCH 02/14] Update packages/nuxt/src/core/templates.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Damian GÅ‚owala --- packages/nuxt/src/core/templates.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/nuxt/src/core/templates.ts b/packages/nuxt/src/core/templates.ts index d0739c2e2e44..ec55781b14d4 100644 --- a/packages/nuxt/src/core/templates.ts +++ b/packages/nuxt/src/core/templates.ts @@ -219,9 +219,9 @@ export const middlewareTemplate: NuxtTemplate = { ].join('\n') function sortGlobalMiddleware (globalMiddleware: NuxtMiddleware[]): NuxtMiddleware[] { const reg = /^\d/ - const withOrdergGobalMiddleware = globalMiddleware.filter(m => reg.test(m.name)).toSorted((l, r) => l.name > r.name ? 1 : -1) - const withoutOrdergGobalMiddleware = globalMiddleware.filter(m => !reg.test(m.name)) - return [...withOrdergGobalMiddleware, ...withoutOrdergGobalMiddleware] + const orderedGlobalMiddleware = globalMiddleware.filter(m => reg.test(m.name)).toSorted((l, r) => l.name > r.name ? 1 : -1) + const unorderedGlobalMiddleware = globalMiddleware.filter(m => !reg.test(m.name)) + return [...orderedGlobalMiddleware, ...unorderedGlobalMiddleware] } } } From 4a96c6cba84489554461746e41739cf64b83a7ec Mon Sep 17 00:00:00 2001 From: markthree <1801982702@qq.com> Date: Thu, 22 Feb 2024 21:22:51 +0800 Subject: [PATCH 03/14] refactor(nuxt): resolves layer middleware in correct order --- packages/nuxt/src/core/app.ts | 19 ++++++++++++++++++- packages/nuxt/src/core/templates.ts | 10 ++-------- packages/nuxt/test/app.test.ts | 10 ++++++++-- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/packages/nuxt/src/core/app.ts b/packages/nuxt/src/core/app.ts index 467376d827d3..0ae0d941255d 100644 --- a/packages/nuxt/src/core/app.ts +++ b/packages/nuxt/src/core/app.ts @@ -2,7 +2,7 @@ import { promises as fsp, mkdirSync, writeFileSync } from 'node:fs' import { dirname, join, relative, resolve } from 'pathe' import { defu } from 'defu' import { compileTemplate, findPath, logger, normalizePlugin, normalizeTemplate, resolveAlias, resolveFiles, resolvePath, templateUtils, tryResolveModule } from '@nuxt/kit' -import type { Nuxt, NuxtApp, NuxtPlugin, NuxtTemplate, ResolvedNuxtTemplate } from 'nuxt/schema' +import type { Nuxt, NuxtApp, NuxtMiddleware, NuxtPlugin, NuxtTemplate, ResolvedNuxtTemplate } from 'nuxt/schema' import * as defaultTemplates from './templates' import { getNameFromPath, hasSuffix, uniqueBy } from './utils' @@ -141,6 +141,7 @@ export async function resolveApp (nuxt: Nuxt, app: NuxtApp) { app.middleware.push({ name, path: file, global: hasSuffix(file, '.global') }) } } + app.middleware = sortMiddleware(app.middleware) // Resolve plugins, first extended layers and then base app.plugins = [] @@ -239,3 +240,19 @@ export function checkForCircularDependencies (_plugins: Array mw.global) + const namedMiddleware = middleware.filter(mw => !mw.global) + return [ + ...sortOrderedMiddleware(globalMiddleware), + ...sortOrderedMiddleware(namedMiddleware) + ] + function sortOrderedMiddleware (middleware: NuxtMiddleware[]) { + const reg = /^\d/ + const orderedMiddleware = middleware.filter(m => reg.test(m.name)).toSorted((l, r) => l.name > r.name ? 1 : -1) + const unorderedMiddleware = middleware.filter(m => !reg.test(m.name)) + return [...orderedMiddleware, ...unorderedMiddleware] + } +} \ No newline at end of file diff --git a/packages/nuxt/src/core/templates.ts b/packages/nuxt/src/core/templates.ts index ec55781b14d4..7c2a24e65e4a 100644 --- a/packages/nuxt/src/core/templates.ts +++ b/packages/nuxt/src/core/templates.ts @@ -7,7 +7,7 @@ import escapeRE from 'escape-string-regexp' import { hash } from 'ohash' import { camelCase } from 'scule' import { filename } from 'pathe/utils' -import type { NuxtMiddleware, NuxtTemplate } from 'nuxt/schema' +import type { NuxtTemplate } from 'nuxt/schema' import { annotatePlugins, checkForCircularDependencies } from './app' export const vueShim: NuxtTemplate = { @@ -208,7 +208,7 @@ export const layoutTemplate: NuxtTemplate = { export const middlewareTemplate: NuxtTemplate = { filename: 'middleware.mjs', getContents ({ app }) { - const globalMiddleware = sortGlobalMiddleware(app.middleware.filter(mw => mw.global)) + const globalMiddleware = app.middleware.filter(mw => mw.global) const namedMiddleware = app.middleware.filter(mw => !mw.global) const namedMiddlewareObject = genObjectFromRawEntries(namedMiddleware.map(mw => [mw.name, genDynamicImport(mw.path)])) @@ -217,12 +217,6 @@ export const middlewareTemplate: NuxtTemplate = { `export const globalMiddleware = ${genArrayFromRaw(globalMiddleware.map(mw => genSafeVariableName(mw.name)))}`, `export const namedMiddleware = ${namedMiddlewareObject}` ].join('\n') - function sortGlobalMiddleware (globalMiddleware: NuxtMiddleware[]): NuxtMiddleware[] { - const reg = /^\d/ - const orderedGlobalMiddleware = globalMiddleware.filter(m => reg.test(m.name)).toSorted((l, r) => l.name > r.name ? 1 : -1) - const unorderedGlobalMiddleware = globalMiddleware.filter(m => !reg.test(m.name)) - return [...orderedGlobalMiddleware, ...unorderedGlobalMiddleware] - } } } diff --git a/packages/nuxt/test/app.test.ts b/packages/nuxt/test/app.test.ts index cb9075b6c5b2..842328f4cab5 100644 --- a/packages/nuxt/test/app.test.ts +++ b/packages/nuxt/test/app.test.ts @@ -152,17 +152,20 @@ describe('resolveApp', () => { it('resolves layer middleware in correct order', async () => { const app = await getResolvedApp([ // layer 1 + 'layer1/middleware/01.order.global.ts', 'layer1/middleware/global.global.ts', 'layer1/middleware/named-from-layer.ts', 'layer1/middleware/named-override.ts', 'layer1/nuxt.config.ts', // layer 2 + 'layer2/middleware/02.order.global.ts', 'layer2/middleware/global.global.ts', 'layer2/middleware/named-from-layer.ts', - 'layer2/middleware/named-override.ts', + 'layer1/middleware/named-override.ts', 'layer2/plugins/override-test.ts', 'layer2/nuxt.config.ts', // final (user) layer + 'middleware/00.order.global.ts', 'middleware/named-override.ts', 'middleware/named.ts', { @@ -171,9 +174,12 @@ describe('resolveApp', () => { } ]) const fixtureMiddleware = app.middleware.filter(p => p.path.includes('')).map(p => p.path) - // TODO: fix this + expect(fixtureMiddleware).toMatchInlineSnapshot(` [ + "/middleware/00.order.global.ts", + "/layer1/middleware/01.order.global.ts", + "/layer2/middleware/02.order.global.ts", "/layer2/middleware/global.global.ts", "/layer2/middleware/named-from-layer.ts", "/middleware/named-override.ts", From ae4df0413f4319cca9d18d194e110cf7cb19474b Mon Sep 17 00:00:00 2001 From: markthree <1801982702@qq.com> Date: Thu, 22 Feb 2024 21:25:14 +0800 Subject: [PATCH 04/14] chore(nuxt): fmt --- packages/nuxt/src/core/templates.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/nuxt/src/core/templates.ts b/packages/nuxt/src/core/templates.ts index 7c2a24e65e4a..55ee480e135f 100644 --- a/packages/nuxt/src/core/templates.ts +++ b/packages/nuxt/src/core/templates.ts @@ -211,7 +211,6 @@ export const middlewareTemplate: NuxtTemplate = { const globalMiddleware = app.middleware.filter(mw => mw.global) const namedMiddleware = app.middleware.filter(mw => !mw.global) const namedMiddlewareObject = genObjectFromRawEntries(namedMiddleware.map(mw => [mw.name, genDynamicImport(mw.path)])) - return [ ...globalMiddleware.map(mw => genImport(mw.path, genSafeVariableName(mw.name))), `export const globalMiddleware = ${genArrayFromRaw(globalMiddleware.map(mw => genSafeVariableName(mw.name)))}`, From 7a219a74c9557b1e5a675c1c5d6d651c6cc8a0f0 Mon Sep 17 00:00:00 2001 From: markthree <1801982702@qq.com> Date: Thu, 22 Feb 2024 22:11:06 +0800 Subject: [PATCH 05/14] fix(nuxt): fix typo --- packages/nuxt/test/app.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nuxt/test/app.test.ts b/packages/nuxt/test/app.test.ts index 842328f4cab5..95ff2aa87ef5 100644 --- a/packages/nuxt/test/app.test.ts +++ b/packages/nuxt/test/app.test.ts @@ -161,7 +161,7 @@ describe('resolveApp', () => { 'layer2/middleware/02.order.global.ts', 'layer2/middleware/global.global.ts', 'layer2/middleware/named-from-layer.ts', - 'layer1/middleware/named-override.ts', + 'layer2/middleware/named-override.ts', 'layer2/plugins/override-test.ts', 'layer2/nuxt.config.ts', // final (user) layer From 81c31c090f97bb4c74bf3f2922b37f2b03164297 Mon Sep 17 00:00:00 2001 From: markthree <1801982702@qq.com> Date: Thu, 22 Feb 2024 22:37:54 +0800 Subject: [PATCH 06/14] Update packages/nuxt/src/core/app.ts Co-authored-by: Daniel Roe --- packages/nuxt/src/core/app.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nuxt/src/core/app.ts b/packages/nuxt/src/core/app.ts index 0ae0d941255d..ef128f1456c8 100644 --- a/packages/nuxt/src/core/app.ts +++ b/packages/nuxt/src/core/app.ts @@ -251,7 +251,7 @@ function sortMiddleware(middleware: NuxtMiddleware[]) { ] function sortOrderedMiddleware (middleware: NuxtMiddleware[]) { const reg = /^\d/ - const orderedMiddleware = middleware.filter(m => reg.test(m.name)).toSorted((l, r) => l.name > r.name ? 1 : -1) + const orderedMiddleware = middleware.filter(m => reg.test(m.name)).sort((l, r) => l.name > r.name ? 1 : -1) const unorderedMiddleware = middleware.filter(m => !reg.test(m.name)) return [...orderedMiddleware, ...unorderedMiddleware] } From 3a708e56585f04b0e1018749dd7c4dc3d07d6fb2 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Fri, 15 Mar 2024 08:44:05 -0700 Subject: [PATCH 07/14] style: lint --- packages/nuxt/src/core/app.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/nuxt/src/core/app.ts b/packages/nuxt/src/core/app.ts index cbef0b6dd616..81836750feba 100644 --- a/packages/nuxt/src/core/app.ts +++ b/packages/nuxt/src/core/app.ts @@ -149,6 +149,8 @@ export async function resolveApp (nuxt: Nuxt, app: NuxtApp) { app.middleware.push({ name, path: file, global: hasSuffix(file, '.global') }) } } + + // app.middleware = sortMiddleware(app.middleware) // Resolve plugins, first extended layers and then base @@ -254,8 +256,7 @@ export function checkForCircularDependencies (_plugins: Array mw.global) const namedMiddleware = middleware.filter(mw => !mw.global) return [ @@ -266,6 +267,6 @@ function sortMiddleware(middleware: NuxtMiddleware[]) { const reg = /^\d/ const orderedMiddleware = middleware.filter(m => reg.test(m.name)).sort((l, r) => l.name > r.name ? 1 : -1) const unorderedMiddleware = middleware.filter(m => !reg.test(m.name)) - return [...orderedMiddleware, ...unorderedMiddleware] + return [...orderedMiddleware, ...unorderedMiddleware] } -} \ No newline at end of file +} From 9576fed33e07591f376901f1b1d36eee86d8834f Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Fri, 15 Mar 2024 08:45:27 -0700 Subject: [PATCH 08/14] fix: require dot after number to mark middleware as ordered; --- packages/nuxt/src/core/app.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nuxt/src/core/app.ts b/packages/nuxt/src/core/app.ts index 81836750feba..a9ec03ed74aa 100644 --- a/packages/nuxt/src/core/app.ts +++ b/packages/nuxt/src/core/app.ts @@ -264,7 +264,7 @@ function sortMiddleware (middleware: NuxtMiddleware[]) { ...sortOrderedMiddleware(namedMiddleware) ] function sortOrderedMiddleware (middleware: NuxtMiddleware[]) { - const reg = /^\d/ + const reg = /^\d+\./ const orderedMiddleware = middleware.filter(m => reg.test(m.name)).sort((l, r) => l.name > r.name ? 1 : -1) const unorderedMiddleware = middleware.filter(m => !reg.test(m.name)) return [...orderedMiddleware, ...unorderedMiddleware] From 85e9ba6aaeb9fbf6be7ddb8713acf44727ec4f92 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Fri, 15 Mar 2024 08:47:07 -0700 Subject: [PATCH 09/14] perf: hoist out function --- packages/nuxt/src/core/app.ts | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/nuxt/src/core/app.ts b/packages/nuxt/src/core/app.ts index a9ec03ed74aa..1b3efeb7ce28 100644 --- a/packages/nuxt/src/core/app.ts +++ b/packages/nuxt/src/core/app.ts @@ -150,7 +150,7 @@ export async function resolveApp (nuxt: Nuxt, app: NuxtApp) { } } - // + // hoist (and sort) middleware beginning with a number app.middleware = sortMiddleware(app.middleware) // Resolve plugins, first extended layers and then base @@ -256,6 +256,13 @@ export function checkForCircularDependencies (_plugins: Array reg.test(m.name)).sort((l, r) => l.name > r.name ? 1 : -1) + const unorderedMiddleware = middleware.filter(m => !reg.test(m.name)) + return [...orderedMiddleware, ...unorderedMiddleware] +} + function sortMiddleware (middleware: NuxtMiddleware[]) { const globalMiddleware = middleware.filter(mw => mw.global) const namedMiddleware = middleware.filter(mw => !mw.global) @@ -263,10 +270,4 @@ function sortMiddleware (middleware: NuxtMiddleware[]) { ...sortOrderedMiddleware(globalMiddleware), ...sortOrderedMiddleware(namedMiddleware) ] - function sortOrderedMiddleware (middleware: NuxtMiddleware[]) { - const reg = /^\d+\./ - const orderedMiddleware = middleware.filter(m => reg.test(m.name)).sort((l, r) => l.name > r.name ? 1 : -1) - const unorderedMiddleware = middleware.filter(m => !reg.test(m.name)) - return [...orderedMiddleware, ...unorderedMiddleware] - } } From 460daa0f5c49d22fb2588109bdb42edba38155ef Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 15:51:27 +0000 Subject: [PATCH 10/14] [autofix.ci] apply automated fixes --- packages/nuxt/test/app.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nuxt/test/app.test.ts b/packages/nuxt/test/app.test.ts index d2a9d3a43f6c..a8b6f2bdc4d8 100644 --- a/packages/nuxt/test/app.test.ts +++ b/packages/nuxt/test/app.test.ts @@ -177,10 +177,10 @@ describe('resolveApp', () => { expect(fixtureMiddleware).toMatchInlineSnapshot(` [ - "/middleware/00.order.global.ts", "/layer1/middleware/01.order.global.ts", "/layer2/middleware/02.order.global.ts", "/layer2/middleware/global.global.ts", + "/middleware/00.order.global.ts", "/layer2/middleware/named-from-layer.ts", "/middleware/named-override.ts", "/middleware/named.ts", From e60d6bde970511609abac4f0d8ea406c09d99b48 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Fri, 15 Mar 2024 13:58:12 -0700 Subject: [PATCH 11/14] fix: test path rather than middleware name --- packages/nuxt/src/core/app.ts | 5 +++-- packages/nuxt/test/app.test.ts | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/nuxt/src/core/app.ts b/packages/nuxt/src/core/app.ts index 1b3efeb7ce28..b5a9356f2afe 100644 --- a/packages/nuxt/src/core/app.ts +++ b/packages/nuxt/src/core/app.ts @@ -1,5 +1,6 @@ import { promises as fsp, mkdirSync, writeFileSync } from 'node:fs' import { dirname, join, relative, resolve } from 'pathe' +import { filename } from 'pathe/utils' import { defu } from 'defu' import { compileTemplate, findPath, logger, normalizePlugin, normalizeTemplate, resolveAlias, resolveFiles, resolvePath, templateUtils, tryResolveModule } from '@nuxt/kit' import type { Nuxt, NuxtApp, NuxtMiddleware, NuxtPlugin, NuxtTemplate, ResolvedNuxtTemplate } from 'nuxt/schema' @@ -258,8 +259,8 @@ export function checkForCircularDependencies (_plugins: Array reg.test(m.name)).sort((l, r) => l.name > r.name ? 1 : -1) - const unorderedMiddleware = middleware.filter(m => !reg.test(m.name)) + const orderedMiddleware = middleware.filter(m => reg.test(filename(m.path))).sort((l, r) => l.name > r.name ? 1 : -1) + const unorderedMiddleware = middleware.filter(m => !reg.test(filename(m.path))) return [...orderedMiddleware, ...unorderedMiddleware] } diff --git a/packages/nuxt/test/app.test.ts b/packages/nuxt/test/app.test.ts index a8b6f2bdc4d8..d2a9d3a43f6c 100644 --- a/packages/nuxt/test/app.test.ts +++ b/packages/nuxt/test/app.test.ts @@ -177,10 +177,10 @@ describe('resolveApp', () => { expect(fixtureMiddleware).toMatchInlineSnapshot(` [ + "/middleware/00.order.global.ts", "/layer1/middleware/01.order.global.ts", "/layer2/middleware/02.order.global.ts", "/layer2/middleware/global.global.ts", - "/middleware/00.order.global.ts", "/layer2/middleware/named-from-layer.ts", "/middleware/named-override.ts", "/middleware/named.ts", From 76b129c63ec61af957ba0ff1a4ed794458ef5e48 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Fri, 15 Mar 2024 14:20:40 -0700 Subject: [PATCH 12/14] fix: sort plugins and improve perf --- packages/nuxt/src/core/app.ts | 46 ++++++++++++++++++++++------------ packages/nuxt/test/app.test.ts | 4 +-- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/packages/nuxt/src/core/app.ts b/packages/nuxt/src/core/app.ts index b5a9356f2afe..85ce9718086c 100644 --- a/packages/nuxt/src/core/app.ts +++ b/packages/nuxt/src/core/app.ts @@ -151,9 +151,6 @@ export async function resolveApp (nuxt: Nuxt, app: NuxtApp) { } } - // hoist (and sort) middleware beginning with a number - app.middleware = sortMiddleware(app.middleware) - // Resolve plugins, first extended layers and then base app.plugins = [] for (const config of reversedConfigs) { @@ -177,9 +174,10 @@ export async function resolveApp (nuxt: Nuxt, app: NuxtApp) { } } - // Normalize and de-duplicate plugins and middleware - app.middleware = uniqueBy(await resolvePaths([...app.middleware].reverse(), 'path'), 'name').reverse() - app.plugins = uniqueBy(await resolvePaths(app.plugins, 'src'), 'src') + // Normalize and de-duplicate plugins and middleware and hoist (and sort) + // middleware/plugin files that begin with a number + app.middleware = sortMiddleware(uniqueBy(await resolvePaths([...app.middleware].reverse(), 'path'), 'name').reverse()) + app.plugins = sortPlugins(uniqueBy(await resolvePaths(app.plugins, 'src'), 'src')) // Resolve app.config app.configs = [] @@ -257,18 +255,34 @@ export function checkForCircularDependencies (_plugins: Array reg.test(filename(m.path))).sort((l, r) => l.name > r.name ? 1 : -1) - const unorderedMiddleware = middleware.filter(m => !reg.test(filename(m.path))) - return [...orderedMiddleware, ...unorderedMiddleware] -} +const ORDERED_FILE_RE = /^\d+\./ function sortMiddleware (middleware: NuxtMiddleware[]) { - const globalMiddleware = middleware.filter(mw => mw.global) - const namedMiddleware = middleware.filter(mw => !mw.global) + const orderedMiddleware: NuxtMiddleware[] = [] + const unorderedMiddleware: NuxtMiddleware[] = [] + + for (const mw of middleware) { + const bucket = mw.global && ORDERED_FILE_RE.test(filename(mw.path)) ? orderedMiddleware : unorderedMiddleware + bucket.push(mw) + } + + return [ + ...orderedMiddleware.sort((l, r) => filename(l.path).localeCompare(filename(r.path))), + ...unorderedMiddleware + ] +} + +function sortPlugins (plugins: NuxtPlugin[]) { + const orderedPlugins: NuxtPlugin[] = [] + const unorderedPlugins: NuxtPlugin[] = [] + + for (const plugin of plugins) { + const bucket = ORDERED_FILE_RE.test(filename(plugin.src)) ? orderedPlugins : unorderedPlugins + bucket.push(plugin) + } + return [ - ...sortOrderedMiddleware(globalMiddleware), - ...sortOrderedMiddleware(namedMiddleware) + ...orderedPlugins.sort((l, r) => filename(l.src).localeCompare(filename(r.src))), + ...unorderedPlugins ] } diff --git a/packages/nuxt/test/app.test.ts b/packages/nuxt/test/app.test.ts index d2a9d3a43f6c..adfe7f279aed 100644 --- a/packages/nuxt/test/app.test.ts +++ b/packages/nuxt/test/app.test.ts @@ -137,13 +137,13 @@ describe('resolveApp', () => { // TODO: support overriding named plugins expect(fixturePlugins).toMatchInlineSnapshot(` [ + "/plugins/00.plugin.ts", + "/layer2/plugins/01.plugin.ts", "/layer1/plugins/02.plugin.ts", "/layer1/plugins/object-named.ts", "/layer1/plugins/override-test.ts", - "/layer2/plugins/01.plugin.ts", "/layer2/plugins/object-named.ts", "/layer2/plugins/override-test.ts", - "/plugins/00.plugin.ts", "/plugins/object-named.ts", ] `) From 9907f3305617a2dc0ec957e69fa25db905843a17 Mon Sep 17 00:00:00 2001 From: markthree <1801982702@qq.com> Date: Sat, 6 Apr 2024 19:26:45 +0800 Subject: [PATCH 13/14] fix: support overriding named plugins --- packages/nuxt/src/core/app.ts | 18 +++++++++++++++++- packages/nuxt/test/app.test.ts | 34 +++++++++++++++------------------- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/packages/nuxt/src/core/app.ts b/packages/nuxt/src/core/app.ts index 85ce9718086c..c99968b6db1d 100644 --- a/packages/nuxt/src/core/app.ts +++ b/packages/nuxt/src/core/app.ts @@ -177,7 +177,7 @@ export async function resolveApp (nuxt: Nuxt, app: NuxtApp) { // Normalize and de-duplicate plugins and middleware and hoist (and sort) // middleware/plugin files that begin with a number app.middleware = sortMiddleware(uniqueBy(await resolvePaths([...app.middleware].reverse(), 'path'), 'name').reverse()) - app.plugins = sortPlugins(uniqueBy(await resolvePaths(app.plugins, 'src'), 'src')) + app.plugins = sortPlugins(uniquePlugins(await resolvePaths([...app.plugins].reverse(), 'src'))) // Resolve app.config app.configs = [] @@ -286,3 +286,19 @@ function sortPlugins (plugins: NuxtPlugin[]) { ...unorderedPlugins ] } + +function uniquePlugins (plugins: NuxtPlugin[]) { + const pluginFlags = new Set() + const bucket: NuxtPlugin[] = [] + for (const plugin of plugins) { + const name = plugin.name ? plugin.name : filename(plugin.src) + const mode = plugin.mode ? plugin.mode : 'all' + const flag = `${name}.${mode}` + if (pluginFlags.has(flag)) { + continue + } + pluginFlags.add(flag) + bucket.push(plugin) + } + return bucket +} diff --git a/packages/nuxt/test/app.test.ts b/packages/nuxt/test/app.test.ts index adfe7f279aed..d8dc802a69ab 100644 --- a/packages/nuxt/test/app.test.ts +++ b/packages/nuxt/test/app.test.ts @@ -41,19 +41,15 @@ describe('resolveApp', () => { "plugins": [ { "mode": "client", - "src": "/packages/nuxt/src/app/plugins/payload.client.ts", - }, - { - "mode": "client", - "src": "/packages/nuxt/src/app/plugins/check-outdated-build.client.ts", + "src": "/packages/nuxt/src/app/plugins/chunk-reload.client.ts", }, { - "mode": "server", - "src": "/packages/nuxt/src/app/plugins/revive-payload.server.ts", + "mode": "all", + "src": "/packages/nuxt/src/app/plugins/router.ts", }, { - "mode": "client", - "src": "/packages/nuxt/src/app/plugins/revive-payload.client.ts", + "mode": "all", + "src": "/packages/nuxt/src/head/runtime/plugins/unhead.ts", }, { "filename": "components.plugin.mjs", @@ -62,16 +58,20 @@ describe('resolveApp', () => { "src": "/.nuxt/components.plugin.mjs", }, { - "mode": "all", - "src": "/packages/nuxt/src/head/runtime/plugins/unhead.ts", + "mode": "client", + "src": "/packages/nuxt/src/app/plugins/revive-payload.client.ts", }, { - "mode": "all", - "src": "/packages/nuxt/src/app/plugins/router.ts", + "mode": "server", + "src": "/packages/nuxt/src/app/plugins/revive-payload.server.ts", }, { "mode": "client", - "src": "/packages/nuxt/src/app/plugins/chunk-reload.client.ts", + "src": "/packages/nuxt/src/app/plugins/check-outdated-build.client.ts", + }, + { + "mode": "client", + "src": "/packages/nuxt/src/app/plugins/payload.client.ts", }, ], "rootComponent": "/packages/nuxt/src/app/components/nuxt-root.vue", @@ -134,17 +134,13 @@ describe('resolveApp', () => { } ]) const fixturePlugins = app.plugins.filter(p => !('getContents' in p) && p.src.includes('')).map(p => p.src) - // TODO: support overriding named plugins expect(fixturePlugins).toMatchInlineSnapshot(` [ "/plugins/00.plugin.ts", "/layer2/plugins/01.plugin.ts", "/layer1/plugins/02.plugin.ts", - "/layer1/plugins/object-named.ts", - "/layer1/plugins/override-test.ts", - "/layer2/plugins/object-named.ts", - "/layer2/plugins/override-test.ts", "/plugins/object-named.ts", + "/layer2/plugins/override-test.ts", ] `) }) From 0bd2f31ee1210c2a1cf38c0c5633c0f0a409f193 Mon Sep 17 00:00:00 2001 From: markthree <1801982702@qq.com> Date: Sat, 6 Apr 2024 19:45:12 +0800 Subject: [PATCH 14/14] fix: the layer's plugin takes precedence --- packages/nuxt/src/core/app.ts | 6 +++--- packages/nuxt/test/app.test.ts | 30 +++++++++++++++--------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/nuxt/src/core/app.ts b/packages/nuxt/src/core/app.ts index c99968b6db1d..3515b15b4591 100644 --- a/packages/nuxt/src/core/app.ts +++ b/packages/nuxt/src/core/app.ts @@ -177,7 +177,7 @@ export async function resolveApp (nuxt: Nuxt, app: NuxtApp) { // Normalize and de-duplicate plugins and middleware and hoist (and sort) // middleware/plugin files that begin with a number app.middleware = sortMiddleware(uniqueBy(await resolvePaths([...app.middleware].reverse(), 'path'), 'name').reverse()) - app.plugins = sortPlugins(uniquePlugins(await resolvePaths([...app.plugins].reverse(), 'src'))) + app.plugins = sortPlugins(uniquePlugins(await resolvePaths(app.plugins, 'src'))) // Resolve app.config app.configs = [] @@ -290,7 +290,7 @@ function sortPlugins (plugins: NuxtPlugin[]) { function uniquePlugins (plugins: NuxtPlugin[]) { const pluginFlags = new Set() const bucket: NuxtPlugin[] = [] - for (const plugin of plugins) { + for (const plugin of [...plugins].reverse()) { const name = plugin.name ? plugin.name : filename(plugin.src) const mode = plugin.mode ? plugin.mode : 'all' const flag = `${name}.${mode}` @@ -300,5 +300,5 @@ function uniquePlugins (plugins: NuxtPlugin[]) { pluginFlags.add(flag) bucket.push(plugin) } - return bucket + return bucket.reverse() } diff --git a/packages/nuxt/test/app.test.ts b/packages/nuxt/test/app.test.ts index d8dc802a69ab..888f36b03958 100644 --- a/packages/nuxt/test/app.test.ts +++ b/packages/nuxt/test/app.test.ts @@ -41,15 +41,19 @@ describe('resolveApp', () => { "plugins": [ { "mode": "client", - "src": "/packages/nuxt/src/app/plugins/chunk-reload.client.ts", + "src": "/packages/nuxt/src/app/plugins/payload.client.ts", }, { - "mode": "all", - "src": "/packages/nuxt/src/app/plugins/router.ts", + "mode": "client", + "src": "/packages/nuxt/src/app/plugins/check-outdated-build.client.ts", }, { - "mode": "all", - "src": "/packages/nuxt/src/head/runtime/plugins/unhead.ts", + "mode": "server", + "src": "/packages/nuxt/src/app/plugins/revive-payload.server.ts", + }, + { + "mode": "client", + "src": "/packages/nuxt/src/app/plugins/revive-payload.client.ts", }, { "filename": "components.plugin.mjs", @@ -58,20 +62,16 @@ describe('resolveApp', () => { "src": "/.nuxt/components.plugin.mjs", }, { - "mode": "client", - "src": "/packages/nuxt/src/app/plugins/revive-payload.client.ts", - }, - { - "mode": "server", - "src": "/packages/nuxt/src/app/plugins/revive-payload.server.ts", + "mode": "all", + "src": "/packages/nuxt/src/head/runtime/plugins/unhead.ts", }, { - "mode": "client", - "src": "/packages/nuxt/src/app/plugins/check-outdated-build.client.ts", + "mode": "all", + "src": "/packages/nuxt/src/app/plugins/router.ts", }, { "mode": "client", - "src": "/packages/nuxt/src/app/plugins/payload.client.ts", + "src": "/packages/nuxt/src/app/plugins/chunk-reload.client.ts", }, ], "rootComponent": "/packages/nuxt/src/app/components/nuxt-root.vue", @@ -139,8 +139,8 @@ describe('resolveApp', () => { "/plugins/00.plugin.ts", "/layer2/plugins/01.plugin.ts", "/layer1/plugins/02.plugin.ts", - "/plugins/object-named.ts", "/layer2/plugins/override-test.ts", + "/plugins/object-named.ts", ] `) })