getDepReExportContent.js 5.74 KB
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getDepReExportContent = getDepReExportContent;
exports.cjsModeEsmParser = void 0;

function _react() {
  const data = _interopRequireDefault(require("react"));

  _react = function _react() {
    return data;
  };

  return data;
}

function _esModuleLexer() {
  const data = require("es-module-lexer");

  _esModuleLexer = function _esModuleLexer() {
    return data;
  };

  return data;
}

var _utils = require("./utils");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }

function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }

function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }

function _iterableToArrayLimit(arr, i) { var _i = arr && (typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]); if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

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); } }

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); }); }; }

function getDepReExportContent(_x) {
  return _getDepReExportContent.apply(this, arguments);
}

function _getDepReExportContent() {
  _getDepReExportContent = _asyncToGenerator(function* (opts) {
    if (opts.filePath && /\.(css|less|scss|sass)$/.test(opts.filePath)) {
      return `import '${opts.importFrom}';`;
    }

    try {
      if (opts.filePath && !/\.(js|jsx|mjs|ts|tsx)$/.test(opts.filePath)) {
        const matchResult = opts.filePath.match(/\.([a-zA-Z]+)$/);
        throw new Error(`${matchResult ? matchResult[0] : 'file type'} not support!`);
      }

      const _yield$parseWithCJSSu = yield parseWithCJSSupport(opts.content),
            exports = _yield$parseWithCJSSu.exports,
            isCJS = _yield$parseWithCJSSu.isCJS; // cjs


      if (isCJS) {
        return [`import _ from '${opts.importFrom}';`, `export default _;`, `export * from '${opts.importFrom}';`].join('\n');
      } // esm
      else {
          const ret = [];
          let hasExports = false;

          if (exports.includes('default')) {
            ret.push(`import _ from '${opts.importFrom}';`);
            ret.push(`export default _;`);
            hasExports = true;
          }

          if (hasNonDefaultExports(exports) || // export * from 不会有 exports,只会有 imports
          /export\s+\*\s+from/.test(opts.content)) {
            ret.push(`export * from '${opts.importFrom}';`);
            hasExports = true;
          }

          if (!hasExports) {
            ret.push(`import '${opts.importFrom}';`);
          }

          return ret.join('\n');
        }
    } catch (e) {
      throw new Error(`Parse file ${opts.filePath || ''} failed, ${e.message}`);
    }
  });
  return _getDepReExportContent.apply(this, arguments);
}

const cjsModeEsmParser = code => {
  return (0, _utils.matchAll)(/Object\.defineProperty\(\s*exports\s*\,\s*[\"|\'](\w+)[\"|\']/g, code).concat( // Support export['default']
  // ref: https://unpkg.alibaba-inc.com/browse/echarts-for-react@2.0.16/lib/core.js
  (0, _utils.matchAll)(/exports(?:\.|\[(?:\'|\"))(\w+)(?:\s*|(?:\'|\")\])\s*\=/g, code)).map(result => result[1]);
};

exports.cjsModeEsmParser = cjsModeEsmParser;

function parseWithCJSSupport(_x2) {
  return _parseWithCJSSupport.apply(this, arguments);
}

function _parseWithCJSSupport() {
  _parseWithCJSSupport = _asyncToGenerator(function* (content) {
    yield _esModuleLexer().init;

    const _parse = (0, _esModuleLexer().parse)(content),
          _parse2 = _slicedToArray(_parse, 2),
          imports = _parse2[0],
          exports = _parse2[1];

    let isCJS = !imports.length && !exports.length;
    let cjsEsmExports = null;

    if (isCJS) {
      cjsEsmExports = cjsModeEsmParser(content);

      if (cjsEsmExports.includes('__esModule')) {
        isCJS = false;
      }
    }

    return {
      exports: cjsEsmExports || exports,
      isCJS
    };
  });
  return _parseWithCJSSupport.apply(this, arguments);
}

function hasNonDefaultExports(exports) {
  return exports.filter(exp => !['__esModule', 'default'].includes(exp)).length > 0;
}