diff --git a/.changeset/smart-colts-think.md b/.changeset/smart-colts-think.md new file mode 100644 index 000000000000..e8b2a7b8bb30 --- /dev/null +++ b/.changeset/smart-colts-think.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Allows file URLs as import specifiers diff --git a/packages/astro/src/core/create-vite.ts b/packages/astro/src/core/create-vite.ts index bd3af4e292a5..a3edff3b917c 100644 --- a/packages/astro/src/core/create-vite.ts +++ b/packages/astro/src/core/create-vite.ts @@ -33,6 +33,7 @@ import type { Logger } from './logger/core.js'; import { createViteLogger } from './logger/vite.js'; import { vitePluginMiddleware } from './middleware/vite-plugin.js'; import { joinPaths } from './path.js'; +import vitePluginFileURL from '../vite-plugin-fileurl/index.js'; interface CreateViteOptions { settings: AstroSettings; @@ -141,6 +142,7 @@ export async function createVite( astroPrefetch({ settings }), astroTransitions({ settings }), astroDevOverlay({ settings, logger }), + vitePluginFileURL({}), !!settings.config.i18n && astroInternationalization({ settings }), ], publicDir: fileURLToPath(settings.config.publicDir), diff --git a/packages/astro/src/vite-plugin-fileurl/index.ts b/packages/astro/src/vite-plugin-fileurl/index.ts new file mode 100644 index 000000000000..e046ce6a8f12 --- /dev/null +++ b/packages/astro/src/vite-plugin-fileurl/index.ts @@ -0,0 +1,13 @@ +import type { Plugin as VitePlugin } from 'vite'; + +export default function vitePluginFileURL({}): VitePlugin { + return { + name: 'astro:vite-plugin-file-url', + resolveId(source, importer) { + if(source.startsWith('file://')) { + const rest = source.slice(7); + return this.resolve(rest, importer); + } + } + } +} diff --git a/packages/astro/test/astro-basic.test.js b/packages/astro/test/astro-basic.test.js index d9e76defb9f5..96cecc730bf0 100644 --- a/packages/astro/test/astro-basic.test.js +++ b/packages/astro/test/astro-basic.test.js @@ -158,6 +158,13 @@ describe('Astro basics', () => { expect(content2).to.be.ok; }); + + it('allows file:// urls as module specifiers', async () => { + const html = await fixture.readFile('/fileurl/index.html'); + const $ = cheerio.load(html); + expect($('h1').text()).to.equal('WORKS'); + }); + describe('preview', () => { it('returns 200 for valid URLs', async () => { const result = await fixture.fetch('/'); diff --git a/packages/astro/test/fixtures/astro-basic/src/pages/fileurl.astro b/packages/astro/test/fixtures/astro-basic/src/pages/fileurl.astro new file mode 100644 index 000000000000..e85507941c5d --- /dev/null +++ b/packages/astro/test/fixtures/astro-basic/src/pages/fileurl.astro @@ -0,0 +1,10 @@ +--- +import {capitalize} from 'file://../strings.js'; +--- + + +