Simulate Vite resolve id to url (#4239)

* Simulate Vite resolve id to url

* Add changeset
This commit is contained in:
Bjorn Lu 2022-08-11 04:53:52 +08:00 committed by GitHub
parent df26aa220b
commit a9baa45af3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 27 additions and 5 deletions

View file

@ -0,0 +1,5 @@
---
'astro': patch
---
Fix Astro client scripts sourcemap 404

View file

@ -1,4 +1,5 @@
import { fileURLToPath } from 'url'; import { fileURLToPath } from 'url';
import path from 'path';
import type { ViteDevServer } from 'vite'; import type { ViteDevServer } from 'vite';
import type { import type {
AstroConfig, AstroConfig,
@ -12,7 +13,7 @@ import type {
import { prependForwardSlash } from '../../../core/path.js'; import { prependForwardSlash } from '../../../core/path.js';
import { PAGE_SCRIPT_ID } from '../../../vite-plugin-scripts/index.js'; import { PAGE_SCRIPT_ID } from '../../../vite-plugin-scripts/index.js';
import { LogOptions } from '../../logger/core.js'; import { LogOptions } from '../../logger/core.js';
import { isPage } from '../../util.js'; import { isPage, resolveIdToUrl } from '../../util.js';
import { render as coreRender } from '../core.js'; import { render as coreRender } from '../core.js';
import { RouteCache } from '../route-cache.js'; import { RouteCache } from '../route-cache.js';
import { collectMdMetadata } from '../util.js'; import { collectMdMetadata } from '../util.js';
@ -116,7 +117,7 @@ export async function render(
scripts.add({ scripts.add({
props: { props: {
type: 'module', type: 'module',
src: '/@id/astro/runtime/client/hmr.js', src: await resolveIdToUrl(viteServer, 'astro/runtime/client/hmr.js'),
}, },
children: '', children: '',
}); });
@ -186,7 +187,7 @@ export async function render(
if (s.startsWith('/@fs')) { if (s.startsWith('/@fs')) {
return resolveClientDevPath(s); return resolveClientDevPath(s);
} }
return '/@id' + prependForwardSlash(s); return await resolveIdToUrl(viteServer, s);
}, },
renderers, renderers,
request, request,

View file

@ -4,9 +4,9 @@ import path from 'path';
import resolve from 'resolve'; import resolve from 'resolve';
import slash from 'slash'; import slash from 'slash';
import { fileURLToPath, pathToFileURL } from 'url'; import { fileURLToPath, pathToFileURL } from 'url';
import type { ErrorPayload } from 'vite'; import type { ErrorPayload, ViteDevServer } from 'vite';
import type { AstroConfig } from '../@types/astro'; import type { AstroConfig } from '../@types/astro';
import { removeTrailingForwardSlash } from './path.js'; import { prependForwardSlash, removeTrailingForwardSlash } from './path.js';
// process.env.PACKAGE_VERSION is injected when we build and publish the astro package. // process.env.PACKAGE_VERSION is injected when we build and publish the astro package.
export const ASTRO_VERSION = process.env.PACKAGE_VERSION ?? 'development'; export const ASTRO_VERSION = process.env.PACKAGE_VERSION ?? 'development';
@ -207,3 +207,19 @@ export function getLocalAddress(serverAddress: string, host: string | boolean):
return serverAddress; return serverAddress;
} }
} }
/**
* Simulate Vite's resolve and import analysis so we can import the id as an URL
* through a script tag or a dynamic import as-is.
*/
// NOTE: `/@id/` should only be used when the id is fully resolved
export async function resolveIdToUrl(viteServer: ViteDevServer, id: string) {
const result = await viteServer.pluginContainer.resolveId(id);
if (!result) {
return VALID_ID_PREFIX + id;
}
if (path.isAbsolute(result.id)) {
return '/@fs' + prependForwardSlash(result.id);
}
return VALID_ID_PREFIX + result.id;
}