const URL = require("whatwg-url"); const warning = require("warning"); const origin = require("../serverConfig").origin; const bareIdentifierFormat = /^((?:@[^/]+\/)?[^/]+)(\/.*)?$/; function unpkgRewrite(dependencies = {}) { return { inherits: require("babel-plugin-syntax-export-extensions"), visitor: { "ImportDeclaration|ExportNamedDeclaration|ExportAllDeclaration"(path) { if (!path.node.source) return; // probably a variable declaration if ( URL.parseURL(path.node.source.value) != null || path.node.source.value.substr(0, 2) === "//" ) return; // valid URL or URL w/o protocol, leave it alone if ([".", "/"].indexOf(path.node.source.value.charAt(0)) >= 0) { // local path path.node.source.value = `${path.node.source.value}?module`; } else { // "bare" identifier const match = bareIdentifierFormat.exec(path.node.source.value); const packageName = match[1]; const file = match[2] || ""; warning( dependencies[packageName], 'Missing version info for package "%s" in dependencies; falling back to "latest"', packageName ); const version = dependencies[packageName] || "latest"; const url = `${origin}/${packageName}@${version}${file}?module`; path.node.source.value = url; } } } }; } module.exports = unpkgRewrite;