moduloze
Version:
Convert CommonJS (CJS) modules to UMD and ESM formats
5 lines • 10.1 kB
JavaScript
/*! Moduloze: analysis.js
v0.9.1 (c) 2022 Kyle Simpson
MIT License: http://getify.mit-license.org
*/
!function UMD(e,t,r,i){"function"==typeof define&&define.amd?(r=Object.values(r),define(e,r,i)):"undefined"!=typeof module&&module.exports?(r=Object.keys(r).map((e=>require(e))),module.exports=i(...r)):(r=Object.values(r).map((e=>t[e])),t[e]=i(...r))}("Analysis","undefined"!=typeof globalThis?globalThis:"undefined"!=typeof global?global:"undefined"!=typeof window?window:"undefined"!=typeof self?self:new Function("return this")(),{"@babel/traverse":"BabelTraverse","@babel/types":"BabelTypes","@babel/parser":"BableParser","./helpers.js":"Helpers"},(function DEF(e,t,r,i){"use strict";var{default:n}=e,s=t,{parse:o}=r,{findParentStatement:a,isFunction:p,isAssignmentTarget:d}=i;let u={};function analyzeRequires(e,t){var r=[];for(let i of e){if(!s.isProgram(i.parent))throw new Error("Require statements must be at the top-level of the program");let e=[...t.get(i)];if(s.isExpressionStatement(i.node)&&s.isCallExpression(i.node.expression)&&1==e.length&&e[0].node==i.node.expression){e[0]=!1;let t=i.node.expression.arguments[0].extra.rawValue;r.push({esmType:"bare-import",umdType:"remove-require-unique",specifier:t,context:{statement:i}})}else if(s.isVariableDeclaration(i.node))for(let[t,n]of i.node.declarations.entries()){if(!hasRequireCalls(i,n.init,e))continue;let o=i.get(`declarations.${t}`);if(s.isIdentifier(n.id)){if(s.isCallExpression(n.init)&&e.find((e=>e.node==n.init))){e[e.findIndex((e=>e.node==n.init))]=!1;let s=o.get("init"),a=s.node.arguments[0].extra.rawValue;r.push({esmType:"default-import",umdType:"default-require",binding:{target:n.id.name},specifier:a,context:{statement:i,declarator:o,declarationIdx:t,requireCall:s}})}else if(isSimpleMemberExpression(n.init,n)&&e.find((e=>e.node==n.init.object))){e[e.findIndex((e=>e.node==n.init.object))]=!1;let a=o.get("init.object"),p=a.node.arguments[0].extra.rawValue,d=n.id.name,u=s.isIdentifier(n.init.property)?n.init.property.name:s.isStringLiteral(n.init.property)?n.init.property.value:void 0;r.push({esmType:"named-import",umdType:"named-dependency",binding:{source:u,target:d},specifier:p,context:{statement:i,declarator:o,declarationIdx:t,requireCall:a}})}}else if(s.isObjectPattern(n.id)&&s.isCallExpression(n.init)&&e.find((e=>e.node==n.init))){e[e.findIndex((e=>e.node==n.init))]=!1;let a=o.get("init"),p=a.node.arguments[0].extra.rawValue,d=n.id,u=[];for(let e of d.properties){if(e.computed||!s.isIdentifier(e.value))throw new Error("Unsupported: destructuring pattern not ESM import-compatible");{let t=s.isIdentifier(e.key)?e.key.name:s.isStringLiteral(e.key)?e.key.value:void 0;u.push({source:t,target:e.value.name})}}r.push({esmType:"named-import",umdType:"destructured-dependency",binding:u,specifier:p,context:{statement:i,declarator:o,declarationIdx:t,requireCall:a}})}}else if(s.isExpressionStatement(i.node)&&s.isAssignmentExpression(i.node.expression)){let t=i.node.expression;if(s.isIdentifier(t.left)){if(e.find((e=>e.node==t.right))){e[e.findIndex((e=>e.node==t.right))]=!1;let n=i.get("expression.right"),s=n.node.arguments[0].extra.rawValue,o=t.left.name;r.push({esmType:"default-import-indirect",umdType:"indirect-target",binding:{source:"default",target:o,uniqueTarget:i.scope.generateUidIdentifier("imp").name},specifier:s,context:{statement:i,requireCall:n}})}else if(isSimpleMemberExpression(t.right,t)&&e.find((e=>e.node==t.right.object))){e[e.findIndex((e=>e.node==t.right.object))]=!1;let n=i.get("expression.right.object"),o=n.node.arguments[0].extra.rawValue,a=t.left.name,p=s.isIdentifier(t.right.property)?t.right.property.name:s.isStringLiteral(t.right.property)?t.right.property.value:void 0;r.push({esmType:"named-import-indirect",umdType:"indirect-source-target",binding:{source:p,target:a,uniqueTarget:i.scope.generateUidIdentifier("imp").name},specifier:o,context:{statement:i,requireCall:n}})}}else if(s.isObjectPattern(t.left)&&e.find((e=>e.node==t.right))){e[e.findIndex((e=>e.node==t.right))]=!1;let n=i.get("expression.right"),o=n.node.arguments[0].extra.rawValue,a=t.left,p=[];for(let e of a.properties){if(e.computed||!s.isIdentifier(e.value))throw new Error("Unsupported: destructuring pattern not ESM import-compatible");{let t=s.isIdentifier(e.key)?e.key.name:s.isStringLiteral(e.key)?e.key.value:void 0;p.push({source:t,target:e.value.name,uniqueTarget:i.scope.generateUidIdentifier("imp").name})}}p.length>0&&r.push({esmType:"named-import-indirect",umdType:"indirect-source-target",binding:p,specifier:o,context:{statement:i,requireCall:n}})}else if(isModuleExports(t.left)||isSimpleMemberExpression(t.left,t)&&isModuleExports(t.left.object)){let n=t.left;if(e.find((e=>e.node==t.right))){e[e.findIndex((e=>e.node==t.right))]=!1;let s=i.get("expression.right"),o=s.node.arguments[0].extra.rawValue;r.push({esmType:"default-import-indirect",umdType:"indirect-target",binding:{source:"default",target:n,uniqueTarget:i.scope.generateUidIdentifier("imp").name},specifier:o,context:{statement:i,requireCall:s}})}else if(isSimpleMemberExpression(t.right,t)&&e.find((e=>e.node==t.right.object))){e[e.findIndex((e=>e.node==t.right.object))]=!1;let o=i.get("expression.right.object"),a=o.node.arguments[0].extra.rawValue,p=s.isIdentifier(t.right.property)?t.right.property.name:s.isStringLiteral(t.right.property)?t.right.property.value:void 0;r.push({esmType:"named-import-indirect",umdType:"indirect-source-target",binding:{source:p,target:n,uniqueTarget:i.scope.generateUidIdentifier("imp").name},specifier:a,context:{statement:i,requireCall:o}})}}}e=e.filter(Boolean),e.length>0&&(r=[...r,...e.map((function handleReqCall(e){return analyzeRequireSubstitutions(i,e)}))])}return r}function analyzeRequireSubstitutions(e,t){var r=t.node.arguments[0].extra.rawValue;if(isSimpleMemberExpression(t.parent,t.parentPath.parent)){return{esmType:"substitute-named-import-indirect",umdType:"substitute-indirect-source-target",binding:{source:s.isIdentifier(t.parent.property)?t.parent.property.name:s.isStringLiteral(t.parent.property)?t.parent.property.value:void 0,uniqueTarget:e.scope.generateUidIdentifier("imp").name},specifier:r,context:{statement:e,requireCall:t,expression:t.parentPath}}}return{esmType:"substitute-default-import-indirect",umdType:"substitute-indirect-target",binding:{source:"default",uniqueTarget:e.scope.generateUidIdentifier("imp").name},specifier:r,context:{statement:e,requireCall:t}}}function analyzeExports(e,t){var r=[];for(let i of e){if(!s.isProgram(i.parent))throw new Error("Exports expressions must be at the top-level of the program");let e=t.get(i),n=e.refs;if("assignment"==e.type){if(s.isExpressionStatement(i.node)&&s.isAssignmentExpression(i.node.expression)&&1==n.length){let e=i.node.expression,t=e.left,o=e.right;if(t==n[0].node){if(s.isIdentifier(o)&&"undefined"!=o.name){r.push({esmType:"default-export",umdType:"default-assignment",binding:{source:o},context:{statement:i,exportsExpression:i.get("expression.left")}});continue}r.push({esmType:"default-export",umdType:"default-assignment",binding:{source:o},context:{statement:i,exportsExpression:i.get("expression.left")}});continue}if(s.isMemberExpression(t,{object:n[0].node})&&isSimpleMemberExpression(t,e)){let n=s.isIdentifier(t.property)?t.property.name:s.isStringLiteral(t.property)?t.property.value:void 0;if(s.isIdentifier(o)&&"undefined"!=o.name){r.push({esmType:"named-export",umdType:"named-export",binding:{source:o.name,target:n},context:{statement:i,exportsExpression:i.get("expression.left.object")}});continue}if(isSimpleMemberExpression(o,e)){let e=s.isIdentifier(o.property)?o.property.name:s.isStringLiteral(o.property)?o.property.value:void 0;r.push({esmType:"destructured-declaration-export",umdType:"named-export",binding:{sourceName:e,source:o.object,target:n},context:{statement:i,exportsExpression:i.get("expression.left.object")}});continue}r.push({esmType:"named-declaration-export",umdType:"named-export",binding:{source:o,target:n,uniqueTarget:i.scope.generateUidIdentifier("exp").name},context:{statement:i,exportsExpression:i.get("expression.left.object")}});continue}}}else if("expression"==e.type){for(let e of n)r.push({esmType:"substitute-module-exports-reference",umdType:"substitute-module-exports-reference",context:{statement:i,exportsExpression:e}});continue}throw new Error("Unsupported: exports expression not ESM export-compatible")}return r}function hasRequireCalls(e,t,r){for(let i of r){let r=i;for(;r&&r!=e;){if(r.node==t)return!0;r=r.parentPath}}return!1}function isModuleExports(e){return s.isIdentifier(e,{name:"exports"})||s.isMemberExpression(e)&&s.isIdentifier(e.object,{name:"module"})&&(!e.computed&&s.isIdentifier(e.property,{name:"exports"})||e.computed&&s.isStringLiteral(e.property,{value:"exports"}))}function isSimpleMemberExpression(e,t){return s.isMemberExpression(e)&&(!e.computed&&s.isIdentifier(e.property)||e.computed&&s.isStringLiteral(e.property))&&!s.isCallExpression(t)}return u.identifyRequiresAndExports=function identifyRequiresAndExports(e,t){var r,i=new Set,u=new Set,l=new WeakMap,m=new WeakMap,f={Program:{exit(e){r=e}},CallExpression:{exit(e){if(s.isIdentifier(e.node.callee,{name:"require"})){if(1!=e.node.arguments.length||!s.isStringLiteral(e.node.arguments[0]))throw new Error("Unsupported: require(..) statement without a single string-literal argument");{let t=a(e.parentPath);t&&(i.add(t),l.has(t)||l.set(t,[]),l.get(t).push(e))}}}},MemberExpression:{exit(e){if(isModuleExports(e.node)){let t=a(e.parentPath);t&&(u.add(t),m.has(t)||m.set(t,{type:d(e)?"assignment":"expression",refs:[]}),m.get(t).refs.push(e))}}},Identifier:{exit(e){if("exports"==e.node.name&&!s.isMemberExpression(e.parent,{property:e.node})&&(d(e)||!p(e.parentPath)&&!s.isObjectProperty(e.parent,{key:e.node}))){let t=a(e.parentPath);t&&(u.add(t),m.has(t)||m.set(t,{type:d(e)?"assignment":"expression",refs:[]}),m.get(t).refs.push(e))}}}},g=o(t,{sourceFilename:e});n(g,f);var c=analyzeRequires(i,l),x=analyzeExports(u,m);return{programAST:g,programPath:r,convertRequires:c,convertExports:x}},u.analyzeRequires=analyzeRequires,u.analyzeExports=analyzeExports,u}));