diff --git a/.changeset/seven-donuts-happen.md b/.changeset/seven-donuts-happen.md new file mode 100644 index 0000000000..cf6b85b5b9 --- /dev/null +++ b/.changeset/seven-donuts-happen.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Supports importing Astro components with Vite queries, like `?url`, `?raw`, and `?direct` diff --git a/packages/astro/src/vite-plugin-astro/index.ts b/packages/astro/src/vite-plugin-astro/index.ts index 6c0f76b0ff..cedf49e95b 100644 --- a/packages/astro/src/vite-plugin-astro/index.ts +++ b/packages/astro/src/vite-plugin-astro/index.ts @@ -9,7 +9,7 @@ import type { } from './types.js'; import { normalizePath } from 'vite'; -import { normalizeFilename } from '../vite-plugin-utils/index.js'; +import { hasSpecialQueries, normalizeFilename } from '../vite-plugin-utils/index.js'; import { type CompileAstroResult, compileAstro } from './compile.js'; import { handleHotUpdate } from './hmr.js'; import { parseAstroRequest } from './query.js'; @@ -200,6 +200,8 @@ export default function astro({ settings, logger }: AstroPluginOptions): vite.Pl } }, async transform(source, id) { + if (hasSpecialQueries(id)) return; + const parsedId = parseAstroRequest(id); // ignore astro file sub-requests, e.g. Foo.astro?astro&type=script&index=0&lang.ts if (!parsedId.filename.endsWith('.astro') || parsedId.query.astro) { diff --git a/packages/astro/src/vite-plugin-utils/index.ts b/packages/astro/src/vite-plugin-utils/index.ts index 74f60305d5..74167a36a9 100644 --- a/packages/astro/src/vite-plugin-utils/index.ts +++ b/packages/astro/src/vite-plugin-utils/index.ts @@ -50,3 +50,12 @@ const postfixRE = /[?#].*$/s; export function cleanUrl(url: string): string { return url.replace(postfixRE, ''); } + +const specialQueriesRE = /(?:\?|&)(?:url|raw|direct)(?:&|$)/; +/** + * Detect `?url`, `?raw`, and `?direct`, in which case we usually want to skip + * transforming any code with this queries as Vite will handle it directly. + */ +export function hasSpecialQueries(id: string): boolean { + return specialQueriesRE.test(id); +} diff --git a/packages/astro/test/astro-basic.test.js b/packages/astro/test/astro-basic.test.js index cb7c06ce0e..957be04fb6 100644 --- a/packages/astro/test/astro-basic.test.js +++ b/packages/astro/test/astro-basic.test.js @@ -159,6 +159,12 @@ describe('Astro basic build', () => { assert.equal($('h1').text(), 'WORKS'); }); + it('Handles importing .astro?raw correctly', async () => { + const html = await fixture.readFile('/import-queries/raw/index.html'); + const $ = cheerio.load(html); + assert.equal($('.raw-value').text(), '