babel-plugin-import-separation
Version:
a plugin for babel to load on demand from import.
84 lines (66 loc) • 2.98 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = _default;
var _helperModuleImports = require("@babel/helper-module-imports");
var _utils = require("./utils.js");
var _path = require("path");
var _assert = _interopRequireDefault(require("assert"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var tipMessage = "\n for separation should't use ImportDefaultSpecifier or ImportNamespaceSpecifier to load resource,\n error for --> (import all from 'xxx') / (import * as other from 'xxx'),\n should for --> (import { child1, child2 } from 'xxx')\n";
function _default(_ref) {
var t = _ref.types;
var pluginsUtil = null; // Program visitor
var Program = function Program(path, _ref2) {
var _ref2$opts = _ref2.opts,
opts = _ref2$opts === void 0 ? {} : _ref2$opts;
// Init plugin instances once.
if (!pluginsUtil) {
(0, _assert.default)(opts.libraryName, 'libraryName should be provided');
(0, _assert.default)(!(!opts.style && opts.onlyStyle), 'in onlyStyle mode must provided style');
pluginsUtil = new _utils.Configuration(opts.libraryName, opts.libraryDirectory, opts.style, opts.camelSymbol, opts.fileName, opts.onlyStyle);
}
}; // ImportDeclaration visitor
var ImportDeclaration = function ImportDeclaration(path, state) {
var _pluginsUtil = pluginsUtil,
libraryName = _pluginsUtil.libraryName,
libraryDirectory = _pluginsUtil.libraryDirectory,
style = _pluginsUtil.style,
fileName = _pluginsUtil.fileName,
formatHandler = _pluginsUtil.formatHandler,
onlyStyle = _pluginsUtil.onlyStyle;
if (path.get('source').isLiteral({
value: libraryName
})) {
var node = path.node;
var specifiers = node.specifiers;
(0, _assert.default)(specifiers.every(function (spec) {
return t.isImportSpecifier(spec);
}), tipMessage);
specifiers.forEach(function (spec) {
var transformedMethodName = formatHandler(spec.imported.name);
var localName = spec.local.name;
var filePath = (0, _utils.winPath)((0, _path.join)(libraryName, libraryDirectory, transformedMethodName, fileName)); // if has style add style file
if (style === true) {
(0, _helperModuleImports.addSideEffect)(path, "".concat(filePath, "/style"));
} else if (style === 'css') {
(0, _helperModuleImports.addSideEffect)(path, "".concat(filePath, "/style/css"));
} // if not onlyStyle add separation file
if (onlyStyle !== true) {
path.insertAfter(t.ImportDeclaration([t.ImportDefaultSpecifier(t.Identifier(localName))], t.stringLiteral("".concat(filePath))));
}
});
if (onlyStyle !== true) {
path.remove();
}
}
};
var ret = {
visitor: {
Program: Program,
ImportDeclaration: ImportDeclaration
}
};
return ret;
}