diff --git a/src/common/wrapper.ts b/src/common/wrapper.ts new file mode 100644 index 0000000..4ea7a49 --- /dev/null +++ b/src/common/wrapper.ts @@ -0,0 +1,15 @@ +//@ts-ignore +import { fetch } from '#fetch'; +import { parse, init } from 'es-module-lexer'; + +export async function getMaybeWrapperUrl (moduleUrl, fetchOpts) { + await init; + const source = await (await fetch(moduleUrl, fetchOpts)).text(); + const [imports,, facade] = parse(source); + if (facade && imports.length) { + try { + return new URL(imports[0].n, moduleUrl).href; + } catch {} + } + return moduleUrl; +} diff --git a/src/generator.ts b/src/generator.ts index 1c77af9..49d316d 100644 --- a/src/generator.ts +++ b/src/generator.ts @@ -43,6 +43,7 @@ import { LockResolutions } from "./install/lock.js"; import { getDefaultProviderStrings, type Provider } from "./providers/index.js"; import * as nodemodules from "./providers/nodemodules.js"; import { Resolver } from "./trace/resolver.js"; +import { getMaybeWrapperUrl } from './common/wrapper.js'; // Utility exports for users: export { analyzeHtml }; @@ -729,6 +730,10 @@ export class Generator { esmsPkg, this.traceMap.installer.defaultProvider )) + "dist/es-module-shims.js"; + + // detect esmsUrl as a wrapper URL + esmsUrl = await getMaybeWrapperUrl(esmsUrl, this.traceMap.resolver.fetchOpts); + if (htmlUrl || rootUrl) esmsUrl = relativeUrl( new URL(esmsUrl), diff --git a/test/html/esmsh.test.js b/test/html/esmsh.test.js new file mode 100644 index 0000000..d1ea0c1 --- /dev/null +++ b/test/html/esmsh.test.js @@ -0,0 +1,25 @@ +import { Generator } from "@jspm/generator"; +import assert from "assert"; +import { SemverRange } from "sver"; + +const generator = new Generator({ + mapUrl: new URL("./local/page.html", import.meta.url), + env: ["production", "browser"], + defaultProvider: 'esm.sh' +}); + +const esmsPkg = await generator.traceMap.resolver.resolveLatestTarget( + { name: "es-module-shims", registry: "npm", ranges: [new SemverRange("*")] }, + generator.traceMap.installer.defaultProvider +); +let pins, html + +html = ` + + +`; +pins = await generator.addMappings(html); + +assert((await generator.htmlInject(html, { pins })).includes('https://esm.sh/v'));