babel-plugin-buildo-react-components
Version:
Babel plugin to avoid cherry-pick imports from buildo-react-components
141 lines (121 loc) • 4.92 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var defaultImports = {
BackgroundDimmer: 'background-dimmer/BackgroundDimmer',
Badge: 'badge/Badge',
BasicModal: 'modal-manager/BasicModal',
Button: 'button/Button',
ConfirmationInput: 'confirmation-input/ConfirmationInput',
Divider: 'Divider/Divider',
Dropdown: 'dropdown/Dropdown',
DropdownMenu: 'DropdownMenu/DropdownMenu',
FlexView: 'flex/FlexView',
FlexCell: 'flex/FlexCell',
Icon: 'Icon/Icon',
LoadingSpinner: 'loading-spinner/LoadingSpinner',
Menu: 'DropdownMenu/Menu',
MobileDetector: 'mobile-detector/MobileDetector',
ModalManager: 'modal-manager/ModalManager',
MoreOrLess: 'more-or-less/MoreOrLess',
NavBar: 'nav-bar/NavBar',
Panel: 'Panel/Panel',
PanelHeader: 'Panel/PanelHeader',
PanelMenu: 'Panel/PanelMenu',
Popover: 'popover/Popover',
ScrollView: 'scroll/ScrollView',
TabbedPanel: 'Panel/TabbedPanel',
TextOverflow: 'text-overflow/TextOverflow',
TimerToast: 'toaster/TimerToast',
Toaster: 'toaster/Toaster',
Toggle: 'toggle/Toggle',
Tooltip: 'Tooltip/Tooltip',
TransitionWrapper: 'transition-wrapper/TransitionWrapper'
};
var utils = {
linkState: 'link-state',
getValueLink: 'link-state',
LinkedStateMixin: 'link-state',
ValueLinkMixin: 'link-state'
};
var imports = undefined;
exports['default'] = function (_ref) {
var Plugin = _ref.Plugin;
var t = _ref.types;
function addImport(file, source, imported, name, isDefaultImport) {
var _source = file.resolveModuleSource(source);
var specifiers = undefined;
if (isDefaultImport) {
specifiers = [t.importDefaultSpecifier(t.identifier(name))];
} else {
specifiers = [t.importSpecifier(t.identifier(name), t.identifier(imported))];
}
var declar = t.importDeclaration(specifiers, t.literal(_source));
declar._blockHoist = 3;
// prepend import to file body
file.path.unshiftContainer('body', declar);
}
return new Plugin('buildo-react-components', {
visitor: {
Program: {
enter: function enter() {
// clear global state
imports = [];
},
exit: function exit(node, parent, scope, file) {
if (!t.isProgram(node)) {
return;
}
imports.forEach(function (_ref2) {
var local = _ref2.local;
var imported = _ref2.imported;
if (!defaultImports[imported] && !utils[imported]) {
throw new Error(imported + ' is not a valid export of buildo-react-components');
}
var isDefaultImport = !!defaultImports[imported];
var folder = isDefaultImport ? defaultImports[imported] : utils[imported];
var path = ['buildo-react-components', 'src', folder].join('/');
addImport(file, path, imported, local, isDefaultImport);
});
}
},
ImportDeclaration: {
exit: function exit(node) {
var value = node.source.value;
if (value.indexOf('buildo-react-components') === -1) {
return;
}
var _imports = node.specifiers.reduce(function (acc, s) {
return _extends({}, acc, {
importDefaultSpecifiers: acc.importDefaultSpecifiers.concat(t.isImportDefaultSpecifier(s) ? s : []),
importSpecifiers: acc.importSpecifiers.concat(t.isImportSpecifier(s) ? s : [])
});
}, { importDefaultSpecifiers: [], importSpecifiers: [] });
var importDefaultSpecifiers = _imports.importDefaultSpecifiers;
var importSpecifiers = _imports.importSpecifiers;
if (importDefaultSpecifiers.length && (value === 'buildo-react-components' || value === 'buildo-react-components/lib' || value === 'buildo-react-components/src')) {
throw new Error('the import of whole buildo-react-components is forbidden');
}
if (importSpecifiers.length) {
importSpecifiers.forEach(function (s) {
return imports.unshift({ local: s.local.name, imported: s.imported.name });
});
}
// return
if (importSpecifiers.length && importDefaultSpecifiers.length) {
// remove non-default imports -> we'll replace them on Program.exit
return _extends({}, node, {
specifiers: importDefaultSpecifiers
});
} else if (!importDefaultSpecifiers.length) {
// remove node -> we'll replace it on Program.exit
this.dangerouslyRemove();
}
}
}
}
});
};
module.exports = exports['default'];