transform.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. "use strict";
  2. function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
  3. function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
  4. const cloneDeep = require("clone-deep");
  5. const path = require("path");
  6. const fs = require("fs");
  7. const babel = require("./babel-core.js");
  8. const registerCache = require("../cache.js");
  9. const nmRE = escapeRegExp(path.sep + "node_modules" + path.sep);
  10. function escapeRegExp(string) {
  11. return string.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&");
  12. }
  13. let cache;
  14. let transformOpts;
  15. exports.setOptions = function (opts) {
  16. if (opts.cache === false && cache) {
  17. registerCache.clear();
  18. cache = null;
  19. } else if (opts.cache !== false && !cache) {
  20. registerCache.load();
  21. cache = registerCache.get();
  22. }
  23. delete opts.cache;
  24. delete opts.extensions;
  25. transformOpts = Object.assign({}, opts, {
  26. caller: Object.assign({
  27. name: "@babel/register"
  28. }, opts.caller || {})
  29. });
  30. let {
  31. cwd = "."
  32. } = transformOpts;
  33. cwd = transformOpts.cwd = path.resolve(cwd);
  34. if (transformOpts.ignore === undefined && transformOpts.only === undefined) {
  35. const cwdRE = escapeRegExp(cwd);
  36. transformOpts.only = [new RegExp("^" + cwdRE, "i")];
  37. transformOpts.ignore = [new RegExp(`^${cwdRE}(?:${path.sep}.*)?${nmRE}`, "i")];
  38. }
  39. };
  40. exports.transform = _asyncToGenerator(function* (input, filename) {
  41. const opts = yield babel.loadOptionsAsync(Object.assign({
  42. sourceRoot: path.dirname(filename) + path.sep
  43. }, cloneDeep(transformOpts), {
  44. filename
  45. }));
  46. if (opts === null) return null;
  47. const {
  48. cached,
  49. store
  50. } = cacheLookup(opts, filename);
  51. if (cached) return cached;
  52. const {
  53. code,
  54. map
  55. } = yield babel.transformAsync(input, Object.assign({}, opts, {
  56. sourceMaps: opts.sourceMaps === undefined ? "both" : opts.sourceMaps,
  57. ast: false
  58. }));
  59. return store({
  60. code,
  61. map
  62. });
  63. });
  64. {
  65. exports.transformSync = function (input, filename) {
  66. const opts = new babel.OptionManager().init(Object.assign({
  67. sourceRoot: path.dirname(filename) + path.sep
  68. }, cloneDeep(transformOpts), {
  69. filename
  70. }));
  71. if (opts === null) return null;
  72. const {
  73. cached,
  74. store
  75. } = cacheLookup(opts, filename);
  76. if (cached) return cached;
  77. const {
  78. code,
  79. map
  80. } = babel.transformSync(input, Object.assign({}, opts, {
  81. sourceMaps: opts.sourceMaps === undefined ? "both" : opts.sourceMaps,
  82. ast: false
  83. }));
  84. return store({
  85. code,
  86. map
  87. });
  88. };
  89. }
  90. const id = value => value;
  91. function cacheLookup(opts, filename) {
  92. if (!cache) return {
  93. cached: null,
  94. store: id
  95. };
  96. let cacheKey = `${JSON.stringify(opts)}:${babel.version}`;
  97. const env = babel.getEnv();
  98. if (env) cacheKey += `:${env}`;
  99. const cached = cache[cacheKey];
  100. const fileMtime = +fs.statSync(filename).mtime;
  101. if (cached && cached.mtime === fileMtime) {
  102. return {
  103. cached: cached.value,
  104. store: id
  105. };
  106. }
  107. return {
  108. cached: null,
  109. store(value) {
  110. cache[cacheKey] = {
  111. value,
  112. mtime: fileMtime
  113. };
  114. registerCache.setDirty();
  115. return value;
  116. }
  117. };
  118. }
  119. //# sourceMappingURL=transform.js.map