diff options
author | 2023-11-10 16:11:15 +0000 | |
---|---|---|
committer | 2023-11-10 11:11:15 -0500 | |
commit | 1bc3319686808292322ea3f7e5df3b4a37357111 (patch) | |
tree | 253702ee2da49750ad02698e60d476461eb898fd | |
parent | 1e97708cda779510d638abaefdb4abf707b697e3 (diff) | |
download | astro-1bc3319686808292322ea3f7e5df3b4a37357111.tar.gz astro-1bc3319686808292322ea3f7e5df3b4a37357111.tar.zst astro-1bc3319686808292322ea3f7e5df3b4a37357111.zip |
fix(middleware): do not import user middleware if not preset (#9057)
13 files changed, 123 insertions, 10 deletions
diff --git a/.changeset/chilled-swans-appear.md b/.changeset/chilled-swans-appear.md new file mode 100644 index 000000000..af7b37da6 --- /dev/null +++ b/.changeset/chilled-swans-appear.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Correctly infer the presence of an user middleware diff --git a/packages/astro/src/core/middleware/vite-plugin.ts b/packages/astro/src/core/middleware/vite-plugin.ts index 790c76129..044713491 100644 --- a/packages/astro/src/core/middleware/vite-plugin.ts +++ b/packages/astro/src/core/middleware/vite-plugin.ts @@ -15,6 +15,7 @@ export function vitePluginMiddleware({ settings }: { settings: AstroSettings }): let resolvedMiddlewareId: string | undefined = undefined; const hasIntegrationMiddleware = settings.middlewares.pre.length > 0 || settings.middlewares.post.length > 0; + let userMiddlewareIsPresent = false; return { name: '@astro/plugin-middleware', @@ -29,6 +30,7 @@ export function vitePluginMiddleware({ settings }: { settings: AstroSettings }): const middlewareId = await this.resolve( `${decodeURI(settings.config.srcDir.pathname)}${MIDDLEWARE_PATH_SEGMENT_NAME}` ); + userMiddlewareIsPresent = !!middlewareId; if (middlewareId) { resolvedMiddlewareId = middlewareId.id; return MIDDLEWARE_MODULE_ID; @@ -61,13 +63,17 @@ export function vitePluginMiddleware({ settings }: { settings: AstroSettings }): const postMiddleware = createMiddlewareImports(settings.middlewares.post, 'post'); const source = ` -import { onRequest as userOnRequest } from '${resolvedMiddlewareId}'; + ${ + userMiddlewareIsPresent + ? `import { onRequest as userOnRequest } from '${resolvedMiddlewareId}';` + : '' + } import { sequence } from 'astro:middleware'; ${preMiddleware.importsCode}${postMiddleware.importsCode} export const onRequest = sequence( ${preMiddleware.sequenceCode}${preMiddleware.sequenceCode ? ',' : ''} - userOnRequest${postMiddleware.sequenceCode ? ',' : ''} + ${userMiddlewareIsPresent ? `userOnRequest${postMiddleware.sequenceCode ? ',' : ''}` : ''} ${postMiddleware.sequenceCode} ); `.trim(); diff --git a/packages/astro/test/fixtures/middleware space/integration-middleware-post.js b/packages/astro/test/fixtures/middleware space/integration-middleware-post.js index 4cc63c6b7..a4e0c90ad 100644 --- a/packages/astro/test/fixtures/middleware space/integration-middleware-post.js +++ b/packages/astro/test/fixtures/middleware space/integration-middleware-post.js @@ -1,11 +1,11 @@ -import { sequence, defineMiddleware } from 'astro:middleware'; +import { defineMiddleware } from 'astro:middleware'; export const onRequest = defineMiddleware((context, next) => { - if(context.url.pathname === '/integration-post') { + if (context.url.pathname === '/integration-post') { return new Response(JSON.stringify({ post: 'works' }), { headers: { - 'content-type': 'application/json' - } + 'content-type': 'application/json', + }, }); } diff --git a/packages/astro/test/fixtures/middleware space/integration-middleware-pre.js b/packages/astro/test/fixtures/middleware space/integration-middleware-pre.js index 3bf484b2b..1ebf28066 100644 --- a/packages/astro/test/fixtures/middleware space/integration-middleware-pre.js +++ b/packages/astro/test/fixtures/middleware space/integration-middleware-pre.js @@ -1,11 +1,11 @@ -import { sequence, defineMiddleware } from 'astro:middleware'; +import { defineMiddleware } from 'astro:middleware'; export const onRequest = defineMiddleware((context, next) => { - if(context.url.pathname === '/integration-pre') { + if (context.url.pathname === '/integration-pre') { return new Response(JSON.stringify({ pre: 'works' }), { headers: { - 'content-type': 'application/json' - } + 'content-type': 'application/json', + }, }); } diff --git a/packages/astro/test/fixtures/middleware-no-user-middleware/astro.config.mjs b/packages/astro/test/fixtures/middleware-no-user-middleware/astro.config.mjs new file mode 100644 index 000000000..ffae133be --- /dev/null +++ b/packages/astro/test/fixtures/middleware-no-user-middleware/astro.config.mjs @@ -0,0 +1,23 @@ +import {defineConfig} from "astro/config"; +import {fileURLToPath} from "node:url"; + +export default defineConfig({ + integrations: [ + { + name: 'my-middleware', + hooks: { + 'astro:config:setup':({ addMiddleware }) => { + addMiddleware({ + entrypoint: fileURLToPath(new URL('./integration-middleware-pre.js', import.meta.url)), + order: 'pre' + }); + + addMiddleware({ + entrypoint: fileURLToPath(new URL('./integration-middleware-post.js', import.meta.url)), + order: 'post' + }); + } + } + } + ] +}); diff --git a/packages/astro/test/fixtures/middleware-no-user-middleware/integration-middleware-post.js b/packages/astro/test/fixtures/middleware-no-user-middleware/integration-middleware-post.js new file mode 100644 index 000000000..18c8969c3 --- /dev/null +++ b/packages/astro/test/fixtures/middleware-no-user-middleware/integration-middleware-post.js @@ -0,0 +1,13 @@ +import { defineMiddleware } from 'astro:middleware'; + +export const onRequest = defineMiddleware((context, next) => { + if (context.url.pathname === '/post') { + return new Response(JSON.stringify({ post: 'works' }), { + headers: { + 'content-type': 'application/json', + }, + }); + } + + return next(); +}); diff --git a/packages/astro/test/fixtures/middleware-no-user-middleware/integration-middleware-pre.js b/packages/astro/test/fixtures/middleware-no-user-middleware/integration-middleware-pre.js new file mode 100644 index 000000000..07bb16b46 --- /dev/null +++ b/packages/astro/test/fixtures/middleware-no-user-middleware/integration-middleware-pre.js @@ -0,0 +1,13 @@ +import { defineMiddleware } from 'astro:middleware'; + +export const onRequest = defineMiddleware((context, next) => { + if (context.url.pathname === '/pre') { + return new Response(JSON.stringify({ pre: 'works' }), { + headers: { + 'content-type': 'application/json', + }, + }); + } + + return next(); +}); diff --git a/packages/astro/test/fixtures/middleware-no-user-middleware/package.json b/packages/astro/test/fixtures/middleware-no-user-middleware/package.json new file mode 100644 index 000000000..9a2a378ed --- /dev/null +++ b/packages/astro/test/fixtures/middleware-no-user-middleware/package.json @@ -0,0 +1,8 @@ +{ + "name": "@test/middleware-no-user-middlewaqre", + "version": "0.0.0", + "private": true, + "dependencies": { + "astro": "workspace:*" + } +} diff --git a/packages/astro/test/fixtures/middleware-no-user-middleware/src/pages/index.astro b/packages/astro/test/fixtures/middleware-no-user-middleware/src/pages/index.astro new file mode 100644 index 000000000..822b15cd3 --- /dev/null +++ b/packages/astro/test/fixtures/middleware-no-user-middleware/src/pages/index.astro @@ -0,0 +1,14 @@ +--- +const data = Astro.locals; +--- + +<html> +<head> + <title>Testing</title> +</head> +<body> + +<span>Index</span> +<p>{data?.name}</p> +</body> +</html> diff --git a/packages/astro/test/fixtures/middleware-no-user-middleware/src/pages/post.astro b/packages/astro/test/fixtures/middleware-no-user-middleware/src/pages/post.astro new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/packages/astro/test/fixtures/middleware-no-user-middleware/src/pages/post.astro diff --git a/packages/astro/test/fixtures/middleware-no-user-middleware/src/pages/pre.astro b/packages/astro/test/fixtures/middleware-no-user-middleware/src/pages/pre.astro new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/packages/astro/test/fixtures/middleware-no-user-middleware/src/pages/pre.astro diff --git a/packages/astro/test/middleware.test.js b/packages/astro/test/middleware.test.js index a9487950e..8332dfe41 100644 --- a/packages/astro/test/middleware.test.js +++ b/packages/astro/test/middleware.test.js @@ -99,6 +99,31 @@ describe('Middleware in DEV mode', () => { expect(json.post).to.equal('works'); }); }); + + describe('Integration hooks with no user middleware', () => { + before(async () => { + fixture = await loadFixture({ + root: './fixtures/middleware-no-user-middleware/', + }); + devServer = await fixture.startDevServer(); + }); + + after(async () => { + await devServer.stop(); + }); + + it('Integration middleware marked as "pre" runs', async () => { + let res = await fixture.fetch('/pre'); + let json = await res.json(); + expect(json.pre).to.equal('works'); + }); + + it('Integration middleware marked as "post" runs', async () => { + let res = await fixture.fetch('/post'); + let json = await res.json(); + expect(json.post).to.equal('works'); + }); + }); }); describe('Middleware in PROD mode, SSG', () => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 322d1a4f7..d7ee1b767 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2957,6 +2957,12 @@ importers: specifier: workspace:* version: link:../../.. + packages/astro/test/fixtures/middleware-no-user-middleware: + dependencies: + astro: + specifier: workspace:* + version: link:../../.. + packages/astro/test/fixtures/middleware-ssg: dependencies: astro: |