diff options
-rw-r--r-- | .changeset/young-schools-refuse.md | 5 | ||||
-rw-r--r-- | packages/astro/src/assets/vite-plugin-assets.ts | 10 | ||||
-rw-r--r-- | packages/astro/test/core-image.test.js | 25 | ||||
-rw-r--r-- | packages/astro/test/fixtures/core-image-ssr/src/pages/api.ts | 11 |
4 files changed, 49 insertions, 2 deletions
diff --git a/.changeset/young-schools-refuse.md b/.changeset/young-schools-refuse.md new file mode 100644 index 000000000..5206e1ef8 --- /dev/null +++ b/.changeset/young-schools-refuse.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Fix astro:assets interfering with SSR query params ending with image extensions diff --git a/packages/astro/src/assets/vite-plugin-assets.ts b/packages/astro/src/assets/vite-plugin-assets.ts index 3c0a94d2a..2ea3bf817 100644 --- a/packages/astro/src/assets/vite-plugin-assets.ts +++ b/packages/astro/src/assets/vite-plugin-assets.ts @@ -8,7 +8,12 @@ import type * as vite from 'vite'; import { normalizePath } from 'vite'; import type { AstroPluginOptions, ImageTransform } from '../@types/astro'; import { error } from '../core/logger/core.js'; -import { appendForwardSlash, joinPaths, prependForwardSlash } from '../core/path.js'; +import { + appendForwardSlash, + joinPaths, + prependForwardSlash, + removeQueryString, +} from '../core/path.js'; import { VIRTUAL_MODULE_ID, VIRTUAL_SERVICE_ID } from './consts.js'; import { isESMImportedImage } from './internal.js'; import { isLocalService } from './services/service.js'; @@ -228,7 +233,8 @@ export default function assets({ resolvedConfig = viteConfig; }, async load(id) { - if (/\.(jpeg|jpg|png|tiff|webp|gif|svg)$/.test(id)) { + const cleanedUrl = removeQueryString(id); + if (/\.(jpeg|jpg|png|tiff|webp|gif|svg)$/.test(cleanedUrl)) { const meta = await emitESMImage(id, this.meta.watchMode, this.emitFile, settings); return `export default ${JSON.stringify(meta)}`; } diff --git a/packages/astro/test/core-image.test.js b/packages/astro/test/core-image.test.js index 10ec46001..69f94403e 100644 --- a/packages/astro/test/core-image.test.js +++ b/packages/astro/test/core-image.test.js @@ -630,6 +630,31 @@ describe('astro:image', () => { }); }); + describe('dev ssr', () => { + let devServer; + before(async () => { + fixture = await loadFixture({ + root: './fixtures/core-image-ssr/', + output: 'server', + adapter: testAdapter(), + experimental: { + assets: true, + }, + }); + devServer = await fixture.startDevServer(); + }); + + after(async () => { + await devServer.stop(); + }); + + it('does not interfere with query params', async () => { + let res = await fixture.fetch('/api?src=image.png'); + const html = await res.text(); + expect(html).to.equal('An image: "image.png"'); + }); + }); + describe('prod ssr', () => { before(async () => { fixture = await loadFixture({ diff --git a/packages/astro/test/fixtures/core-image-ssr/src/pages/api.ts b/packages/astro/test/fixtures/core-image-ssr/src/pages/api.ts new file mode 100644 index 000000000..9534383db --- /dev/null +++ b/packages/astro/test/fixtures/core-image-ssr/src/pages/api.ts @@ -0,0 +1,11 @@ +import { APIRoute } from "../../../../../src/@types/astro"; + +export const get = (async ({ params, request }) => { + const url = new URL(request.url); + console.log(url) + const src = url.searchParams.get("src"); + + return { + body: "An image: " + JSON.stringify(src), + }; +}) satisfies APIRoute; |