From a76dea052c407d8635b8c3fd5902607ef9828c11 Mon Sep 17 00:00:00 2001 From: golden-fox07 Date: Mon, 31 Aug 2026 17:26:14 +0530 Subject: [PATCH 1/2] fix: prevent source map references from being resolved --- server/utils/docs/client.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/server/utils/docs/client.ts b/server/utils/docs/client.ts index ff3d56d863..e8786a474b 100644 --- a/server/utils/docs/client.ts +++ b/server/utils/docs/client.ts @@ -130,8 +130,14 @@ function createLoader(): ( * * Handles resolving relative imports and esm.sh redirects. */ -function createResolver(): (specifier: string, referrer: string) => string { +export function createResolver(): (specifier: string, referrer: string) => string { return (specifier: string, referrer: string) => { + // Source map references are not modules. Resolving bare source map + // filenames can incorrectly treat them as package specifiers + if (specifier.endsWith('.map')) { + return specifier + } + // Handle relative imports if (specifier.startsWith('.') || specifier.startsWith('/')) { return new URL(specifier, referrer).toString() From 25156819ccc88ed434c7ad25e2fc49591ebb9c3f Mon Sep 17 00:00:00 2001 From: golden-fox07 Date: Mon, 31 Aug 2026 18:35:11 +0530 Subject: [PATCH 2/2] test: cover source map references in resolver --- test/unit/server/utils/docs/client.spec.ts | 47 ++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 test/unit/server/utils/docs/client.spec.ts diff --git a/test/unit/server/utils/docs/client.spec.ts b/test/unit/server/utils/docs/client.spec.ts new file mode 100644 index 0000000000..f2cb1837f8 --- /dev/null +++ b/test/unit/server/utils/docs/client.spec.ts @@ -0,0 +1,47 @@ +import { describe, expect, it } from 'vitest' +import { createResolver } from '#server/utils/docs/client' + +// ============================================================================= +// Issue #2739: sourceMappingURL specifiers resolved as package names +// https://github.com/npmx-dev/npmx.dev/issues/2739 +// ============================================================================= + +describe('issue #2739 - source map specifiers', () => { + const resolve = createResolver() + const referrer = 'https://esm.sh/effect-web-midi@0.2.1/dist-types/index.d.ts' + + it('does not resolve source map references', () => { + expect(resolve('index.d.ts.map', referrer)).toBe('index.d.ts.map') + }) + + it('does not resolve relative source map references', () => { + expect(resolve('./index.d.ts.map', referrer)).toBe('./index.d.ts.map') + }) +}) + +describe('createResolver', () => { + const resolve = createResolver() + const referrer = 'https://esm.sh/effect-web-midi@0.2.1/dist-types/index.d.ts' + + it('resolves relative imports', () => { + expect(resolve('./src/index.d.ts', referrer)).toBe( + 'https://esm.sh/effect-web-midi@0.2.1/dist-types/src/index.d.ts', + ) + }) + + it('resolves absolute paths', () => { + expect(resolve('/foo.d.ts', referrer)).toBe('https://esm.sh/foo.d.ts') + }) + + it('resolves bare specifiers', () => { + expect(resolve('effect', referrer)).toBe('https://esm.sh/effect') + }) + + it('leaves absolute URLs unchanged', () => { + expect(resolve('https://esm.sh/effect', referrer)).toBe('https://esm.sh/effect') + }) + + it('leaves node builtins unchanged', () => { + expect(resolve('node:fs', referrer)).toBe('node:fs') + }) +})