UNPKG

babel-plugin-buildo-react-components

Version:

Babel plugin to avoid cherry-pick imports from buildo-react-components

141 lines (121 loc) 4.92 kB
'use strict'; 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'];