summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.changeset/young-schools-refuse.md5
-rw-r--r--packages/astro/src/assets/vite-plugin-assets.ts10
-rw-r--r--packages/astro/test/core-image.test.js25
-rw-r--r--packages/astro/test/fixtures/core-image-ssr/src/pages/api.ts11
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;