fix(javascript): resolve bare source-map and worker URLs next to the script (#890)
* fix(javascript): resolve bare source-map and worker URLs next to the script
A sourceMappingURL like `main.js.map` (the default of webpack, esbuild,
rollup, Vite and rolldown) and `new Worker("worker.js")` were resolved as
module specifiers, so the bare name was looked up as an npm package and the
map or worker script was never linked. Resolve them as URLs relative to the
declaring script.
* fix(javascript): tighten url-reference resolution edge cases
Use looksExternal for non-module contexts so protocol-relative URLs
cannot be misread as root-absolute paths, cover url-reference unit
cases, and assert bare service-worker script resolution.
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
This commit is contained in:
1 parent
aa8082ea6c
commit
45fcd28b40
4 files changed
+143
-20
No files matched your search
@@ -562,6 +562,61 @@ describe("contextual JavaScript module identity", () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe("url-reference JavaScript artifact path resolution", () => {
|
||||
it("resolves sibling paths and rejects external URL forms", () => {
|
||||
const files = fileMap([
|
||||
file("dist/app.js", "root"),
|
||||
file("dist/app.js.map", "root"),
|
||||
file("dist/worker.js", "root"),
|
||||
]);
|
||||
|
||||
expect(
|
||||
resolve({
|
||||
declaredPath: "app.js.map",
|
||||
sourcePath: "dist/app.js",
|
||||
context: "url-reference",
|
||||
files,
|
||||
}),
|
||||
).toMatchObject({
|
||||
resolution_status: "resolved",
|
||||
resolved_path: "dist/app.js.map",
|
||||
});
|
||||
expect(
|
||||
resolve({
|
||||
declaredPath: "app.js.map?v=1#section",
|
||||
sourcePath: "dist/app.js",
|
||||
context: "url-reference",
|
||||
files,
|
||||
}),
|
||||
).toMatchObject({
|
||||
resolution_status: "resolved",
|
||||
resolved_path: "dist/app.js.map",
|
||||
});
|
||||
expect(
|
||||
resolve({
|
||||
declaredPath: "//cdn.example.com/app.js.map",
|
||||
sourcePath: "dist/app.js",
|
||||
context: "url-reference",
|
||||
files,
|
||||
}),
|
||||
).toMatchObject({
|
||||
resolution_status: "external",
|
||||
resolved_path: null,
|
||||
});
|
||||
expect(
|
||||
resolve({
|
||||
declaredPath: "https://cdn.example.com/app.js.map",
|
||||
sourcePath: "dist/app.js",
|
||||
context: "url-reference",
|
||||
files,
|
||||
}),
|
||||
).toMatchObject({
|
||||
resolution_status: "external",
|
||||
resolved_path: null,
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
const resolve = (input: ResolveArtifactPathInput) =>
|
||||
resolveArtifactPathByContext(input);
|
||||
|
||||
|
||||
Reference in new issue
Block a user