From 58ec4de1118744f49a1360815382745cf3df30d7 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Sun, 29 Sep 2024 14:35:48 -0700 Subject: [PATCH 1/4] fix trailing path traces --- src/trace/tracemap.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/trace/tracemap.ts b/src/trace/tracemap.ts index 15ecdc5..6c81871 100644 --- a/src/trace/tracemap.ts +++ b/src/trace/tracemap.ts @@ -74,6 +74,8 @@ function combineSubpaths( installSubpath: "." | `./${string}` | null, traceSubpath: "." | `./${string}` ): `./${string}` | "." { + if (traceSubpath.endsWith('/')) + throw new Error('Trailing slash subpaths unsupported'); return installSubpath === null || installSubpath === "." || traceSubpath === "." @@ -561,7 +563,7 @@ export default class TraceMap { const resolved = await this.resolver.realPath( await this.resolver.resolveExport( installUrl, - combineSubpaths(installSubpath, subpath), + combineSubpaths(installSubpath, parentIsCjs && subpath.endsWith('/') ? subpath.slice(0, -1) as `./${string}` : subpath), cjsEnv, parentIsCjs, specifier, From 67c8d66930842d9a10b2ae39a2511f7ae0d4c036 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Mon, 30 Sep 2024 20:23:22 -0700 Subject: [PATCH 2/4] wip --- src/trace/resolver.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/trace/resolver.ts b/src/trace/resolver.ts index 1c22f60..43c7d34 100644 --- a/src/trace/resolver.ts +++ b/src/trace/resolver.ts @@ -471,10 +471,7 @@ export class Resolver { const subpath = "./" + url.slice(pkgUrl.length); if (subpath in pcfg.browser) { const target = pcfg.browser[subpath]; - if (target === false) - throw new Error( - `TODO: Empty browser map for ${subpath} in ${url}` - ); + if (target === false) return 'node:@empty'; if (!target.startsWith("./")) throw new Error( `TODO: External browser map for ${subpath} to ${target} in ${url}` From 8e32ab39c0f4f5575a7c194285a9899d2ddc8917 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Sun, 6 Oct 2024 15:27:42 -0700 Subject: [PATCH 3/4] fixup empty resolve --- src/install/installer.ts | 1 + src/trace/resolver.ts | 49 ++++++++++++---------- src/trace/tracemap.ts | 2 - test/resolve/cjspkg/browser-dep-exclude.js | 1 + test/resolve/cjspkg/browser-dep-include.js | 1 + test/resolve/cjspkg/browser.js | 2 + test/resolve/cjspkg/package.json | 3 ++ test/resolve/unused-cjs.test.js | 13 ++++++ 8 files changed, 47 insertions(+), 25 deletions(-) create mode 100644 test/resolve/cjspkg/browser-dep-exclude.js create mode 100644 test/resolve/cjspkg/browser-dep-include.js create mode 100644 test/resolve/cjspkg/browser.js diff --git a/src/install/installer.ts b/src/install/installer.ts index 4416977..a1db0ba 100644 --- a/src/install/installer.ts +++ b/src/install/installer.ts @@ -119,6 +119,7 @@ export class Installer { ) { this.log = log; this.resolver = resolver; + this.resolver.installer = this; this.resolutions = opts.resolutions || {}; this.installBaseUrl = baseUrl; this.opts = opts; diff --git a/src/trace/resolver.ts b/src/trace/resolver.ts index 43c7d34..293540d 100644 --- a/src/trace/resolver.ts +++ b/src/trace/resolver.ts @@ -105,6 +105,7 @@ export class Resolver { traceTs: boolean; traceSystem: boolean; context: Record; + installer: Installer; constructor({ env, log, @@ -471,7 +472,7 @@ export class Resolver { const subpath = "./" + url.slice(pkgUrl.length); if (subpath in pcfg.browser) { const target = pcfg.browser[subpath]; - if (target === false) return 'node:@empty'; + if (target === false) return this.resolveEmpty(parentIsCjs, url); if (!target.startsWith("./")) throw new Error( `TODO: External browser map for ${subpath} to ${target} in ${url}` @@ -717,6 +718,29 @@ export class Resolver { return null; } + async resolveEmpty(cjsEnv: boolean, originalSpecifier: string, parentUrl?: URL) { + const stdlibTarget = { + registry: "npm", + name: "@jspm/core", + ranges: [new SemverRange("*")], + unstable: true, + }; + const provider = this.installer.getProvider(stdlibTarget); + const pkg = await this.resolveLatestTarget( + stdlibTarget, + provider, + parentUrl?.href + ); + return this.resolveExport( + await this.pkgToUrl(pkg, provider), + "./nodelibs/@empty", + cjsEnv, + false, + originalSpecifier, + parentUrl + ); + } + // Note: updates here must be tracked in function above async resolveExport( pkgUrl: `${string}/`, @@ -724,7 +748,6 @@ export class Resolver { cjsEnv: boolean, parentIsCjs: boolean, originalSpecifier: string, - installer: Installer, parentUrl?: URL ): Promise { const env = cjsEnv ? this.cjsEnv : this.env; @@ -736,27 +759,7 @@ export class Resolver { pcfg.exports !== null && Object.keys(pcfg.exports).length === 0 ) { - const stdlibTarget = { - registry: "npm", - name: "@jspm/core", - ranges: [new SemverRange("*")], - unstable: true, - }; - const provider = installer.getProvider(stdlibTarget); - const pkg = await this.resolveLatestTarget( - stdlibTarget, - provider, - parentUrl.href - ); - return this.resolveExport( - await this.pkgToUrl(pkg, provider), - "./nodelibs/@empty", - cjsEnv, - parentIsCjs, - originalSpecifier, - installer, - parentUrl - ); + return this.resolveEmpty(cjsEnv, originalSpecifier, parentUrl); } function throwExportNotDefined() { diff --git a/src/trace/tracemap.ts b/src/trace/tracemap.ts index 6c81871..991a56d 100644 --- a/src/trace/tracemap.ts +++ b/src/trace/tracemap.ts @@ -510,7 +510,6 @@ export default class TraceMap { cjsEnv, parentIsCjs, specifier, - this.installer, new URL(parentUrl) ) ); @@ -567,7 +566,6 @@ export default class TraceMap { cjsEnv, parentIsCjs, specifier, - this.installer, new URL(parentUrl) ) ); diff --git a/test/resolve/cjspkg/browser-dep-exclude.js b/test/resolve/cjspkg/browser-dep-exclude.js new file mode 100644 index 0000000..80739cb --- /dev/null +++ b/test/resolve/cjspkg/browser-dep-exclude.js @@ -0,0 +1 @@ +import 'excluded'; diff --git a/test/resolve/cjspkg/browser-dep-include.js b/test/resolve/cjspkg/browser-dep-include.js new file mode 100644 index 0000000..fdde7ca --- /dev/null +++ b/test/resolve/cjspkg/browser-dep-include.js @@ -0,0 +1 @@ +import 'jquery'; diff --git a/test/resolve/cjspkg/browser.js b/test/resolve/cjspkg/browser.js new file mode 100644 index 0000000..93c417c --- /dev/null +++ b/test/resolve/cjspkg/browser.js @@ -0,0 +1,2 @@ +require('./browser-dep-exclude.js'); +require('./browser-dep-include.js'); diff --git a/test/resolve/cjspkg/package.json b/test/resolve/cjspkg/package.json index 34e19c8..e492204 100644 --- a/test/resolve/cjspkg/package.json +++ b/test/resolve/cjspkg/package.json @@ -1,5 +1,8 @@ { "dependencies": { "process": "^0.11.10" + }, + "browser": { + "./browser-dep-exclude.js": false } } diff --git a/test/resolve/unused-cjs.test.js b/test/resolve/unused-cjs.test.js index 32eff43..fc32131 100644 --- a/test/resolve/unused-cjs.test.js +++ b/test/resolve/unused-cjs.test.js @@ -3,6 +3,7 @@ import assert from "assert"; const generator = new Generator({ mapUrl: import.meta.url, + commonJS: true }); // Should not throw, index file doesn't use CJS: @@ -15,3 +16,15 @@ await (async () => { assert(false); } catch {} })(); + +await generator.install({ target: './cjspkg', subpath: './browser.js' }); +assert.deepStrictEqual(generator.getMap(), { + imports: { + './cjspkg/browser-dep-exclude.js': 'https://ga.jspm.io/npm:@jspm/core@2.0.1/nodelibs/@empty.js', + 'cjspkg/browser.js': './cjspkg/browser.js', + unusedcjspkg: './unusedcjspkg/index.js' + }, + scopes: { + './cjspkg/': { jquery: 'https://ga.jspm.io/npm:jquery@3.7.1/dist/jquery.js' } + } +}); From 07490d5bc3e29db2538e007b9a0b60bc2cf3bbc2 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Sun, 6 Oct 2024 15:32:22 -0700 Subject: [PATCH 4/4] fixup --- test/resolve/cjspkg/browser.js | 4 ++-- test/test.html | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/test/resolve/cjspkg/browser.js b/test/resolve/cjspkg/browser.js index 93c417c..c4612cd 100644 --- a/test/resolve/cjspkg/browser.js +++ b/test/resolve/cjspkg/browser.js @@ -1,2 +1,2 @@ -require('./browser-dep-exclude.js'); -require('./browser-dep-include.js'); +import './browser-dep-exclude.js'; +import './browser-dep-include.js'; diff --git a/test/test.html b/test/test.html index 2e76078..0f358d3 100644 --- a/test/test.html +++ b/test/test.html @@ -26,7 +26,7 @@ "#lib/config/files/index.js": "https://ga.jspm.io/npm:@babel/core@7.25.2/lib/config/files/index-browser.js", "#lib/config/resolve-targets.js": "https://ga.jspm.io/npm:@babel/core@7.25.2/lib/config/resolve-targets-browser.js", "#lib/transform-file.js": "https://ga.jspm.io/npm:@babel/core@7.25.2/lib/transform-file-browser.js", - "#node.js": "https://ga.jspm.io/npm:browserslist@4.23.3/browser.js", + "#node.js": "https://ga.jspm.io/npm:browserslist@4.24.0/browser.js", "@ampproject/remapping": "https://ga.jspm.io/npm:@ampproject/remapping@2.3.0/dist/remapping.umd.js", "@babel/code-frame": "https://ga.jspm.io/npm:@babel/code-frame@7.24.7/lib/index.js", "@babel/compat-data/native-modules": "https://ga.jspm.io/npm:@babel/compat-data@7.25.4/native-modules.js", @@ -63,15 +63,15 @@ "@jridgewell/sourcemap-codec": "https://ga.jspm.io/npm:@jridgewell/sourcemap-codec@1.5.0/dist/sourcemap-codec.umd.js", "@jridgewell/trace-mapping": "https://ga.jspm.io/npm:@jridgewell/trace-mapping@0.3.25/dist/trace-mapping.umd.js", "ansi-styles": "https://ga.jspm.io/npm:ansi-styles@3.2.1/index.js", - "browserslist": "https://ga.jspm.io/npm:browserslist@4.23.3/index.js", + "browserslist": "https://ga.jspm.io/npm:browserslist@4.24.0/index.js", "buffer": "https://ga.jspm.io/npm:@jspm/core@2.0.1/nodelibs/browser/buffer.js", - "caniuse-lite/dist/unpacker/agents": "https://ga.jspm.io/npm:caniuse-lite@1.0.30001658/dist/unpacker/agents.js", + "caniuse-lite/dist/unpacker/agents": "https://ga.jspm.io/npm:caniuse-lite@1.0.30001664/dist/unpacker/agents.js", "chalk": "https://ga.jspm.io/npm:chalk@2.4.2/index.js", "color-convert": "https://ga.jspm.io/npm:color-convert@1.9.3/index.js", "color-name": "https://ga.jspm.io/npm:color-name@1.1.3/index.js", "convert-source-map": "https://ga.jspm.io/npm:convert-source-map@2.0.0/index.js", "debug": "https://ga.jspm.io/npm:debug@4.3.7/src/browser.js", - "electron-to-chromium/versions": "https://ga.jspm.io/npm:electron-to-chromium@1.5.18/versions.js", + "electron-to-chromium/versions": "https://ga.jspm.io/npm:electron-to-chromium@1.5.29/versions.js", "escape-string-regexp": "https://ga.jspm.io/npm:escape-string-regexp@1.0.5/index.js", "fs": "https://ga.jspm.io/npm:@jspm/core@2.0.1/nodelibs/browser/fs.js", "gensync": "https://ga.jspm.io/npm:gensync@1.0.0-beta.2/index.js",