index.js 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _helperPluginUtils = require("@babel/helper-plugin-utils");
  7. var _helperModuleTransforms = require("@babel/helper-module-transforms");
  8. var _helperSimpleAccess = require("@babel/helper-simple-access");
  9. var _core = require("@babel/core");
  10. var _dynamicImport = require("./dynamic-import");
  11. var _default = (0, _helperPluginUtils.declare)((api, options) => {
  12. var _api$assumption, _api$assumption2, _api$assumption3;
  13. api.assertVersion(7);
  14. const {
  15. strictNamespace = false,
  16. mjsStrictNamespace = strictNamespace,
  17. allowTopLevelThis,
  18. strict,
  19. strictMode,
  20. noInterop,
  21. importInterop,
  22. lazy = false,
  23. allowCommonJSExports = true,
  24. loose = false
  25. } = options;
  26. const constantReexports = (_api$assumption = api.assumption("constantReexports")) != null ? _api$assumption : loose;
  27. const enumerableModuleMeta = (_api$assumption2 = api.assumption("enumerableModuleMeta")) != null ? _api$assumption2 : loose;
  28. const noIncompleteNsImportDetection = (_api$assumption3 = api.assumption("noIncompleteNsImportDetection")) != null ? _api$assumption3 : false;
  29. if (typeof lazy !== "boolean" && typeof lazy !== "function" && (!Array.isArray(lazy) || !lazy.every(item => typeof item === "string"))) {
  30. throw new Error(`.lazy must be a boolean, array of strings, or a function`);
  31. }
  32. if (typeof strictNamespace !== "boolean") {
  33. throw new Error(`.strictNamespace must be a boolean, or undefined`);
  34. }
  35. if (typeof mjsStrictNamespace !== "boolean") {
  36. throw new Error(`.mjsStrictNamespace must be a boolean, or undefined`);
  37. }
  38. const getAssertion = localName => _core.template.expression.ast`
  39. (function(){
  40. throw new Error(
  41. "The CommonJS '" + "${localName}" + "' variable is not available in ES6 modules." +
  42. "Consider setting setting sourceType:script or sourceType:unambiguous in your " +
  43. "Babel config for this file.");
  44. })()
  45. `;
  46. const moduleExportsVisitor = {
  47. ReferencedIdentifier(path) {
  48. const localName = path.node.name;
  49. if (localName !== "module" && localName !== "exports") return;
  50. const localBinding = path.scope.getBinding(localName);
  51. const rootBinding = this.scope.getBinding(localName);
  52. if (rootBinding !== localBinding || path.parentPath.isObjectProperty({
  53. value: path.node
  54. }) && path.parentPath.parentPath.isObjectPattern() || path.parentPath.isAssignmentExpression({
  55. left: path.node
  56. }) || path.isAssignmentExpression({
  57. left: path.node
  58. })) {
  59. return;
  60. }
  61. path.replaceWith(getAssertion(localName));
  62. },
  63. UpdateExpression(path) {
  64. const arg = path.get("argument");
  65. if (!arg.isIdentifier()) return;
  66. const localName = arg.node.name;
  67. if (localName !== "module" && localName !== "exports") return;
  68. const localBinding = path.scope.getBinding(localName);
  69. const rootBinding = this.scope.getBinding(localName);
  70. if (rootBinding !== localBinding) return;
  71. path.replaceWith(_core.types.assignmentExpression(path.node.operator[0] + "=", arg.node, getAssertion(localName)));
  72. },
  73. AssignmentExpression(path) {
  74. const left = path.get("left");
  75. if (left.isIdentifier()) {
  76. const localName = left.node.name;
  77. if (localName !== "module" && localName !== "exports") return;
  78. const localBinding = path.scope.getBinding(localName);
  79. const rootBinding = this.scope.getBinding(localName);
  80. if (rootBinding !== localBinding) return;
  81. const right = path.get("right");
  82. right.replaceWith(_core.types.sequenceExpression([right.node, getAssertion(localName)]));
  83. } else if (left.isPattern()) {
  84. const ids = left.getOuterBindingIdentifiers();
  85. const localName = Object.keys(ids).filter(localName => {
  86. if (localName !== "module" && localName !== "exports") return false;
  87. return this.scope.getBinding(localName) === path.scope.getBinding(localName);
  88. })[0];
  89. if (localName) {
  90. const right = path.get("right");
  91. right.replaceWith(_core.types.sequenceExpression([right.node, getAssertion(localName)]));
  92. }
  93. }
  94. }
  95. };
  96. return {
  97. name: "transform-modules-commonjs",
  98. pre() {
  99. this.file.set("@babel/plugin-transform-modules-*", "commonjs");
  100. },
  101. visitor: {
  102. CallExpression(path) {
  103. if (!this.file.has("@babel/plugin-proposal-dynamic-import")) return;
  104. if (!_core.types.isImport(path.node.callee)) return;
  105. let {
  106. scope
  107. } = path;
  108. do {
  109. scope.rename("require");
  110. } while (scope = scope.parent);
  111. (0, _dynamicImport.transformDynamicImport)(path, noInterop, this.file);
  112. },
  113. Program: {
  114. exit(path, state) {
  115. if (!(0, _helperModuleTransforms.isModule)(path)) return;
  116. path.scope.rename("exports");
  117. path.scope.rename("module");
  118. path.scope.rename("require");
  119. path.scope.rename("__filename");
  120. path.scope.rename("__dirname");
  121. if (!allowCommonJSExports) {
  122. {
  123. (0, _helperSimpleAccess.default)(path, new Set(["module", "exports"]), false);
  124. }
  125. path.traverse(moduleExportsVisitor, {
  126. scope: path.scope
  127. });
  128. }
  129. let moduleName = (0, _helperModuleTransforms.getModuleName)(this.file.opts, options);
  130. if (moduleName) moduleName = _core.types.stringLiteral(moduleName);
  131. const {
  132. meta,
  133. headers
  134. } = (0, _helperModuleTransforms.rewriteModuleStatementsAndPrepareHeader)(path, {
  135. exportName: "exports",
  136. constantReexports,
  137. enumerableModuleMeta,
  138. strict,
  139. strictMode,
  140. allowTopLevelThis,
  141. noInterop,
  142. importInterop,
  143. lazy,
  144. esNamespaceOnly: typeof state.filename === "string" && /\.mjs$/.test(state.filename) ? mjsStrictNamespace : strictNamespace,
  145. noIncompleteNsImportDetection,
  146. filename: this.file.opts.filename
  147. });
  148. for (const [source, metadata] of meta.source) {
  149. const loadExpr = _core.types.callExpression(_core.types.identifier("require"), [_core.types.stringLiteral(source)]);
  150. let header;
  151. if ((0, _helperModuleTransforms.isSideEffectImport)(metadata)) {
  152. if (metadata.lazy) throw new Error("Assertion failure");
  153. header = _core.types.expressionStatement(loadExpr);
  154. } else {
  155. if (metadata.lazy && !metadata.referenced) {
  156. continue;
  157. }
  158. const init = (0, _helperModuleTransforms.wrapInterop)(path, loadExpr, metadata.interop) || loadExpr;
  159. if (metadata.lazy) {
  160. header = _core.template.statement.ast`
  161. function ${metadata.name}() {
  162. const data = ${init};
  163. ${metadata.name} = function(){ return data; };
  164. return data;
  165. }
  166. `;
  167. } else {
  168. header = _core.template.statement.ast`
  169. var ${metadata.name} = ${init};
  170. `;
  171. }
  172. }
  173. header.loc = metadata.loc;
  174. headers.push(header);
  175. headers.push(...(0, _helperModuleTransforms.buildNamespaceInitStatements)(meta, metadata, constantReexports));
  176. }
  177. (0, _helperModuleTransforms.ensureStatementsHoisted)(headers);
  178. path.unshiftContainer("body", headers);
  179. path.get("body").forEach(path => {
  180. if (headers.indexOf(path.node) === -1) return;
  181. if (path.isVariableDeclaration()) {
  182. path.scope.registerDeclaration(path);
  183. }
  184. });
  185. }
  186. }
  187. }
  188. };
  189. });
  190. exports.default = _default;
  191. //# sourceMappingURL=index.js.map