From 9a18df428d54f386df9fe75022eb5ec4736546b0 Mon Sep 17 00:00:00 2001 From: Horu <73709188+HigherOrderLogic@users.noreply.github.com> Date: Sat, 17 Feb 2024 15:13:57 +0700 Subject: [PATCH 01/24] chore: last time, lukasz, /dev/urandom is not a variable name generator... --- packages/nuxt/src/core/nuxt.ts | 17 +++++++++++++++++ .../nuxt/src/pages/runtime/plugins/router.ts | 11 ++++++++++- packages/schema/src/config/nitro.ts | 2 +- test/basic.test.ts | 5 +++++ .../basic/middleware/routeRulesMiddleware.ts | 3 +++ test/fixtures/basic/nuxt.config.ts | 1 + .../basic/pages/route-rules/middleware.vue | 10 ++++++++++ 7 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 test/fixtures/basic/middleware/routeRulesMiddleware.ts create mode 100644 test/fixtures/basic/pages/route-rules/middleware.vue diff --git a/packages/nuxt/src/core/nuxt.ts b/packages/nuxt/src/core/nuxt.ts index 0b83c3885c06..38b83bb00c3a 100644 --- a/packages/nuxt/src/core/nuxt.ts +++ b/packages/nuxt/src/core/nuxt.ts @@ -515,6 +515,23 @@ export async function loadNuxt (opts: LoadNuxtOptions): Promise { } } + options.routeRules ||= {} + for(const path in options.routeRules) { + if (!options.routeRules[path].nuxtMiddleware) { + continue + } + if (typeof options.routeRules[path].nuxtMiddleware === 'string') { + options.routeRules[path].nuxtMiddleware = [options.routeRules[path].nuxtMiddleware as string] + } + if (Array.isArray(options.routeRules[path].nuxtMiddleware)) { + const middlewareObject: Record = {} + for (const middleware in options.routeRules[path].nuxtMiddleware as string[]) { + middlewareObject[middleware] = true + } + options.routeRules[path].nuxtMiddleware = middlewareObject + } + } + // Add core modules options._modules.push(pagesModule, metaModule, componentsModule) options._modules.push([importsModule, { diff --git a/packages/nuxt/src/pages/runtime/plugins/router.ts b/packages/nuxt/src/pages/runtime/plugins/router.ts index 267ea380d732..1406809d00ba 100644 --- a/packages/nuxt/src/pages/runtime/plugins/router.ts +++ b/packages/nuxt/src/pages/runtime/plugins/router.ts @@ -14,7 +14,7 @@ import { isEqual, withoutBase } from 'ufo' import type { PageMeta } from '../composables' import { toArray } from '../utils' -import type { Plugin, RouteMiddleware } from '#app' +import { type Plugin, type RouteMiddleware, getRouteRules } from '#app' import { defineNuxtPlugin, useRuntimeConfig } from '#app/nuxt' import { clearError, showError, useError } from '#app/composables/error' import { navigateTo } from '#app/composables/router' @@ -173,6 +173,15 @@ const plugin: Plugin<{ router: Router }> = defineNuxtPlugin({ } } + const routeRules = await getRouteRules(to.fullPath); + if (routeRules.nuxtMiddleware) { + for (const middleware in routeRules.nuxtMiddleware) { + if (routeRules.nuxtMiddleware[middleware] === true) { + middlewareEntries.add(middleware) + } + } + } + for (const entry of middlewareEntries) { const middleware = typeof entry === 'string' ? nuxtApp._middleware.named[entry] || await namedMiddleware[entry]?.().then((r: any) => r.default || r) : entry diff --git a/packages/schema/src/config/nitro.ts b/packages/schema/src/config/nitro.ts index c37275dda8b6..41194dc007fe 100644 --- a/packages/schema/src/config/nitro.ts +++ b/packages/schema/src/config/nitro.ts @@ -19,7 +19,7 @@ export default defineUntypedSchema({ * Global route options applied to matching server routes. * @experimental This is an experimental feature and API may change in the future. * @see https://nitro.unjs.io/config/#routerules - * @type {typeof import('nitropack')['NitroConfig']['routeRules']} + * @type {{ [path: string]: typeof import('nitropack')['NitroRouteConfig'] & { nuxtMiddleware?: string | string[] | Record }}} */ routeRules: {}, diff --git a/test/basic.test.ts b/test/basic.test.ts index e7cd7e15acbe..82dbfcbf4bab 100644 --- a/test/basic.test.ts +++ b/test/basic.test.ts @@ -82,6 +82,11 @@ describe('route rules', () => { }) }) +it('should run middleware defined in routeRules config', async () => { + const html = await fetch('/route-rules/middleware') + expect(html).toContain('Hello from routeRules!') +}) + describe('modules', () => { it('should auto-register modules in ~/modules', async () => { const result = await $fetch('/auto-registered-module') diff --git a/test/fixtures/basic/middleware/routeRulesMiddleware.ts b/test/fixtures/basic/middleware/routeRulesMiddleware.ts new file mode 100644 index 000000000000..36ecf8c9983e --- /dev/null +++ b/test/fixtures/basic/middleware/routeRulesMiddleware.ts @@ -0,0 +1,3 @@ +export default defineNuxtRouteMiddleware((to) => { + to.meta.hello = 'Hello from routeRules!' +}) diff --git a/test/fixtures/basic/nuxt.config.ts b/test/fixtures/basic/nuxt.config.ts index 7269a31f135c..d5040fe976c3 100644 --- a/test/fixtures/basic/nuxt.config.ts +++ b/test/fixtures/basic/nuxt.config.ts @@ -60,6 +60,7 @@ export default defineNuxtConfig({ }, routeRules: { '/route-rules/spa': { ssr: false }, + '/route-rules/middleware': { nuxtMiddleware: 'routeRulesMiddleware' }, '/hydration/spa-redirection/**': { ssr: false }, '/no-scripts': { experimentalNoScripts: true } }, diff --git a/test/fixtures/basic/pages/route-rules/middleware.vue b/test/fixtures/basic/pages/route-rules/middleware.vue new file mode 100644 index 000000000000..187dcddf1e9a --- /dev/null +++ b/test/fixtures/basic/pages/route-rules/middleware.vue @@ -0,0 +1,10 @@ + + + From edfa10d96569522a61d31de37febbb8c5aee54e3 Mon Sep 17 00:00:00 2001 From: Horu <73709188+HigherOrderLogic@users.noreply.github.com> Date: Sat, 17 Feb 2024 15:50:14 +0700 Subject: [PATCH 02/24] chore: weird tests fix --- test/prepare.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/prepare.ts b/test/prepare.ts index 845ec57c5f06..5d577b4d157a 100644 --- a/test/prepare.ts +++ b/test/prepare.ts @@ -18,7 +18,9 @@ async function initTesting () { ]) await Promise.all( - dirs.map(dir => execa('pnpm', ['nuxi', 'prepare'], { cwd: dir })) + dirs.map(dir => { + execa('pnpm', ['nuxi', 'prepare'], { cwd: dir }) + }) ) } From 74e8f1e87e5346223aa57597289e50daabc64378 Mon Sep 17 00:00:00 2001 From: HigherOrderLogic Date: Sat, 17 Feb 2024 23:38:09 +0700 Subject: [PATCH 03/24] chore: testing the test fix --- .../nuxt/src/pages/runtime/plugins/router.ts | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/nuxt/src/pages/runtime/plugins/router.ts b/packages/nuxt/src/pages/runtime/plugins/router.ts index 1406809d00ba..2d9f2d5ef332 100644 --- a/packages/nuxt/src/pages/runtime/plugins/router.ts +++ b/packages/nuxt/src/pages/runtime/plugins/router.ts @@ -14,7 +14,7 @@ import { isEqual, withoutBase } from 'ufo' import type { PageMeta } from '../composables' import { toArray } from '../utils' -import { type Plugin, type RouteMiddleware, getRouteRules } from '#app' +import { type Plugin, type RouteMiddleware, getRouteRules, onNuxtReady } from '#app' import { defineNuxtPlugin, useRuntimeConfig } from '#app/nuxt' import { clearError, showError, useError } from '#app/composables/error' import { navigateTo } from '#app/composables/router' @@ -173,11 +173,17 @@ const plugin: Plugin<{ router: Router }> = defineNuxtPlugin({ } } - const routeRules = await getRouteRules(to.fullPath); - if (routeRules.nuxtMiddleware) { - for (const middleware in routeRules.nuxtMiddleware) { - if (routeRules.nuxtMiddleware[middleware] === true) { - middlewareEntries.add(middleware) + let nuxtReady: boolean = false + + onNuxtReady(() => nuxtReady = true) + + if (nuxtReady) { + const routeRules = await getRouteRules(to.path); + if (routeRules.nuxtMiddleware) { + for (const middleware in routeRules.nuxtMiddleware) { + if (routeRules.nuxtMiddleware[middleware] === true) { + middlewareEntries.add(middleware) + } } } } From 24998a7844f8d7c1982e1279fa99f2ccf5716326 Mon Sep 17 00:00:00 2001 From: Horu <73709188+HigherOrderLogic@users.noreply.github.com> Date: Sun, 3 Mar 2024 22:42:44 +0700 Subject: [PATCH 04/24] fix: properly get route rules --- .../nuxt/src/pages/runtime/plugins/router.ts | 21 ++++++++++++------- .../basic/pages/route-rules/middleware.vue | 5 ----- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/packages/nuxt/src/pages/runtime/plugins/router.ts b/packages/nuxt/src/pages/runtime/plugins/router.ts index 2d9f2d5ef332..b90e86d60b48 100644 --- a/packages/nuxt/src/pages/runtime/plugins/router.ts +++ b/packages/nuxt/src/pages/runtime/plugins/router.ts @@ -14,7 +14,8 @@ import { isEqual, withoutBase } from 'ufo' import type { PageMeta } from '../composables' import { toArray } from '../utils' -import { type Plugin, type RouteMiddleware, getRouteRules, onNuxtReady } from '#app' +import { type Plugin, type RouteMiddleware } from '#app' +import { getRouteRules } from '#app/composables/manifest' import { defineNuxtPlugin, useRuntimeConfig } from '#app/nuxt' import { clearError, showError, useError } from '#app/composables/error' import { navigateTo } from '#app/composables/router' @@ -173,13 +174,15 @@ const plugin: Plugin<{ router: Router }> = defineNuxtPlugin({ } } - let nuxtReady: boolean = false - - onNuxtReady(() => nuxtReady = true) + const routeRules = await nuxtApp.runWithContext(async () => { + console.log('get route rules') + return await getRouteRules(to.path) + }) + console.log('routerules ', routeRules) - if (nuxtReady) { - const routeRules = await getRouteRules(to.path); - if (routeRules.nuxtMiddleware) { + if (routeRules.nuxtMiddleware) { + if (typeof routeRules.nuxtMiddleware === 'string') routeRules.nuxtMiddleware = [routeRules.nuxtMiddleware] + if (Array.isArray(routeRules.nuxtMiddleware)) { for (const middleware in routeRules.nuxtMiddleware) { if (routeRules.nuxtMiddleware[middleware] === true) { middlewareEntries.add(middleware) @@ -188,9 +191,13 @@ const plugin: Plugin<{ router: Router }> = defineNuxtPlugin({ } } + console.log('named', nuxtApp._middleware.named) + for (const entry of middlewareEntries) { const middleware = typeof entry === 'string' ? nuxtApp._middleware.named[entry] || await namedMiddleware[entry]?.().then((r: any) => r.default || r) : entry + console.log(entry, ' ', middleware) + if (!middleware) { if (import.meta.dev) { throw new Error(`Unknown route middleware: '${entry}'. Valid middleware: ${Object.keys(namedMiddleware).map(mw => `'${mw}'`).join(', ')}.`) diff --git a/test/fixtures/basic/pages/route-rules/middleware.vue b/test/fixtures/basic/pages/route-rules/middleware.vue index 187dcddf1e9a..c1d69e15147a 100644 --- a/test/fixtures/basic/pages/route-rules/middleware.vue +++ b/test/fixtures/basic/pages/route-rules/middleware.vue @@ -1,8 +1,3 @@ - -