resolve = {
const metas = new Map();
const origin = "https://cdn.jsdelivr.net/npm/";
const identifierRe = /^((?:@[^/@]+\/)?[^/@]+)(?:@([^/]+))?(?:\/(.*))?$/;
const versionRe = /^\d+\.\d+\.\d+(-[\w-.+]+)?$/;
const extensionRe = /\.[^/]*$/;
const mains = ["unpkg", "jsdelivr", "browser", "module", "main"];
function main(meta) {
for (const key of mains) {
const value = meta[key];
if (typeof value === "string") {
return extensionRe.test(value) ? value : `${value}.js`;
}
}
}
function parseIdentifier(identifier) {
const match = identifierRe.exec(identifier);
return (
match && {
name: match[1],
version: match[2],
path: match[3]
}
);
}
function resolveMeta(target) {
const url = `${origin}${target.name}${
target.version ? `@${target.version}` : ""
}/package.json`;
let meta = metas.get(url);
if (!meta)
metas.set(
url,
(meta = fetch(url).then(response => {
if (!response.ok) throw new Error("unable to load package.json");
if (response.redirected && !metas.has(response.url))
metas.set(response.url, meta);
return response.json();
}))
);
return meta;
}
return async function resolve(name, base) {
if (name.startsWith(origin)) name = name.substring(origin.length);
if (/^(\w+:)|\/\//i.test(name)) return name;
if (/^[.]{0,2}\//i.test(name))
return new URL(name, base == null ? location : base).href;
if (!name.length || /^[\s._]/.test(name) || /\s$/.test(name))
throw new Error("illegal name");
const target = parseIdentifier(name);
if (!target.version && base != null && base.startsWith(origin)) {
const meta = await resolveMeta(
parseIdentifier(base.substring(origin.length))
);
target.version =
(meta.dependencies && meta.dependencies[target.name]) ||
(meta.peerDependencies && meta.peerDependencies[target.name]);
}
if (target.path && !extensionRe.test(target.path)) target.path += ".js";
const meta = await resolveMeta(target);
return `${origin}${meta.name}@${meta.version}/${target.path ||
main(meta) ||
"index.js"}`;
};
}