import-injector.js 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. "use strict";
  2. exports.__esModule = true;
  3. exports.default = void 0;
  4. var _assert = _interopRequireDefault(require("assert"));
  5. var t = _interopRequireWildcard(require("@babel/types"));
  6. var _importBuilder = _interopRequireDefault(require("./import-builder"));
  7. var _isModule = _interopRequireDefault(require("./is-module"));
  8. function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
  9. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  10. var ImportInjector = function () {
  11. function ImportInjector(path, importedSource, opts) {
  12. this._programPath = void 0;
  13. this._programScope = void 0;
  14. this._file = void 0;
  15. this._defaultOpts = {
  16. importedSource: null,
  17. importedType: "commonjs",
  18. importedInterop: "babel",
  19. importingInterop: "babel",
  20. ensureLiveReference: false,
  21. ensureNoContext: false
  22. };
  23. var programPath = path.find(function (p) {
  24. return p.isProgram();
  25. });
  26. this._programPath = programPath;
  27. this._programScope = programPath.scope;
  28. this._file = programPath.hub.file;
  29. this._defaultOpts = this._applyDefaults(importedSource, opts, true);
  30. }
  31. var _proto = ImportInjector.prototype;
  32. _proto.addDefault = function addDefault(importedSourceIn, opts) {
  33. return this.addNamed("default", importedSourceIn, opts);
  34. };
  35. _proto.addNamed = function addNamed(importName, importedSourceIn, opts) {
  36. (0, _assert.default)(typeof importName === "string");
  37. return this._generateImport(this._applyDefaults(importedSourceIn, opts), importName);
  38. };
  39. _proto.addNamespace = function addNamespace(importedSourceIn, opts) {
  40. return this._generateImport(this._applyDefaults(importedSourceIn, opts), null);
  41. };
  42. _proto.addSideEffect = function addSideEffect(importedSourceIn, opts) {
  43. return this._generateImport(this._applyDefaults(importedSourceIn, opts), false);
  44. };
  45. _proto._applyDefaults = function _applyDefaults(importedSource, opts, isInit) {
  46. if (isInit === void 0) {
  47. isInit = false;
  48. }
  49. var optsList = [];
  50. if (typeof importedSource === "string") {
  51. optsList.push({
  52. importedSource: importedSource
  53. });
  54. optsList.push(opts);
  55. } else {
  56. (0, _assert.default)(!opts, "Unexpected secondary arguments.");
  57. optsList.push(importedSource);
  58. }
  59. var newOpts = Object.assign({}, this._defaultOpts);
  60. var _loop = function _loop(_opts) {
  61. if (!_opts) return "continue";
  62. Object.keys(newOpts).forEach(function (key) {
  63. if (_opts[key] !== undefined) newOpts[key] = _opts[key];
  64. });
  65. if (!isInit) {
  66. if (_opts.nameHint !== undefined) newOpts.nameHint = _opts.nameHint;
  67. if (_opts.blockHoist !== undefined) newOpts.blockHoist = _opts.blockHoist;
  68. }
  69. };
  70. for (var _i = 0; _i < optsList.length; _i++) {
  71. var _opts = optsList[_i];
  72. var _ret = _loop(_opts);
  73. if (_ret === "continue") continue;
  74. }
  75. return newOpts;
  76. };
  77. _proto._generateImport = function _generateImport(opts, importName) {
  78. var isDefault = importName === "default";
  79. var isNamed = !!importName && !isDefault;
  80. var isNamespace = importName === null;
  81. var importedSource = opts.importedSource,
  82. importedType = opts.importedType,
  83. importedInterop = opts.importedInterop,
  84. importingInterop = opts.importingInterop,
  85. ensureLiveReference = opts.ensureLiveReference,
  86. ensureNoContext = opts.ensureNoContext,
  87. nameHint = opts.nameHint,
  88. blockHoist = opts.blockHoist;
  89. var name = nameHint || importName;
  90. var isMod = (0, _isModule.default)(this._programPath, true);
  91. var isModuleForNode = isMod && importingInterop === "node";
  92. var isModuleForBabel = isMod && importingInterop === "babel";
  93. var builder = new _importBuilder.default(importedSource, this._programScope, this._file);
  94. if (importedType === "es6") {
  95. if (!isModuleForNode && !isModuleForBabel) {
  96. throw new Error("Cannot import an ES6 module from CommonJS");
  97. }
  98. builder.import();
  99. if (isNamespace) {
  100. builder.namespace(nameHint || importedSource);
  101. } else if (isDefault || isNamed) {
  102. builder.named(name, importName);
  103. }
  104. } else if (importedType !== "commonjs") {
  105. throw new Error("Unexpected interopType \"" + importedType + "\"");
  106. } else if (importedInterop === "babel") {
  107. if (isModuleForNode) {
  108. name = name !== "default" ? name : importedSource;
  109. var es6Default = importedSource + "$es6Default";
  110. builder.import();
  111. if (isNamespace) {
  112. builder.default(es6Default).var(name || importedSource).wildcardInterop();
  113. } else if (isDefault) {
  114. if (ensureLiveReference) {
  115. builder.default(es6Default).var(name || importedSource).defaultInterop().read("default");
  116. } else {
  117. builder.default(es6Default).var(name).defaultInterop().prop(importName);
  118. }
  119. } else if (isNamed) {
  120. builder.default(es6Default).read(importName);
  121. }
  122. } else if (isModuleForBabel) {
  123. builder.import();
  124. if (isNamespace) {
  125. builder.namespace(name || importedSource);
  126. } else if (isDefault || isNamed) {
  127. builder.named(name, importName);
  128. }
  129. } else {
  130. builder.require();
  131. if (isNamespace) {
  132. builder.var(name || importedSource).wildcardInterop();
  133. } else if ((isDefault || isNamed) && ensureLiveReference) {
  134. if (isDefault) {
  135. name = name !== "default" ? name : importedSource;
  136. builder.var(name).read(importName);
  137. builder.defaultInterop();
  138. } else {
  139. builder.var(importedSource).read(importName);
  140. }
  141. } else if (isDefault) {
  142. builder.var(name).defaultInterop().prop(importName);
  143. } else if (isNamed) {
  144. builder.var(name).prop(importName);
  145. }
  146. }
  147. } else if (importedInterop === "compiled") {
  148. if (isModuleForNode) {
  149. builder.import();
  150. if (isNamespace) {
  151. builder.default(name || importedSource);
  152. } else if (isDefault || isNamed) {
  153. builder.default(importedSource).read(name);
  154. }
  155. } else if (isModuleForBabel) {
  156. builder.import();
  157. if (isNamespace) {
  158. builder.namespace(name || importedSource);
  159. } else if (isDefault || isNamed) {
  160. builder.named(name, importName);
  161. }
  162. } else {
  163. builder.require();
  164. if (isNamespace) {
  165. builder.var(name || importedSource);
  166. } else if (isDefault || isNamed) {
  167. if (ensureLiveReference) {
  168. builder.var(importedSource).read(name);
  169. } else {
  170. builder.prop(importName).var(name);
  171. }
  172. }
  173. }
  174. } else if (importedInterop === "uncompiled") {
  175. if (isDefault && ensureLiveReference) {
  176. throw new Error("No live reference for commonjs default");
  177. }
  178. if (isModuleForNode) {
  179. builder.import();
  180. if (isNamespace) {
  181. builder.default(name || importedSource);
  182. } else if (isDefault) {
  183. builder.default(name);
  184. } else if (isNamed) {
  185. builder.default(importedSource).read(name);
  186. }
  187. } else if (isModuleForBabel) {
  188. builder.import();
  189. if (isNamespace) {
  190. builder.default(name || importedSource);
  191. } else if (isDefault) {
  192. builder.default(name);
  193. } else if (isNamed) {
  194. builder.named(name, importName);
  195. }
  196. } else {
  197. builder.require();
  198. if (isNamespace) {
  199. builder.var(name || importedSource);
  200. } else if (isDefault) {
  201. builder.var(name);
  202. } else if (isNamed) {
  203. if (ensureLiveReference) {
  204. builder.var(importedSource).read(name);
  205. } else {
  206. builder.var(name).prop(importName);
  207. }
  208. }
  209. }
  210. } else {
  211. throw new Error("Unknown importedInterop \"" + importedInterop + "\".");
  212. }
  213. var _builder$done = builder.done(),
  214. statements = _builder$done.statements,
  215. resultName = _builder$done.resultName;
  216. this._insertStatements(statements, blockHoist);
  217. if ((isDefault || isNamed) && ensureNoContext && resultName.type !== "Identifier") {
  218. return t.sequenceExpression([t.numericLiteral(0), resultName]);
  219. }
  220. return resultName;
  221. };
  222. _proto._insertStatements = function _insertStatements(statements, blockHoist) {
  223. if (blockHoist === void 0) {
  224. blockHoist = 3;
  225. }
  226. statements.forEach(function (node) {
  227. node._blockHoist = blockHoist;
  228. });
  229. var targetPath = this._programPath.get("body").filter(function (p) {
  230. var val = p.node._blockHoist;
  231. return Number.isFinite(val) && val < 4;
  232. })[0];
  233. if (targetPath) {
  234. targetPath.insertBefore(statements);
  235. } else {
  236. this._programPath.unshiftContainer("body", statements);
  237. }
  238. };
  239. return ImportInjector;
  240. }();
  241. exports.default = ImportInjector;