UNPKG

react-imported-component

Version:
79 lines (78 loc) 3.19 kB
// @ts-ignore import { createMacro } from 'babel-plugin-macros'; import { createTransformer } from '../babel/babel'; import { assignImportedComponents } from '../loadable/assignImportedComponents'; function getMacroType(tagName) { switch (tagName) { case 'importedModule': case 'imported': case 'lazy': case 'useImported': case 'ImportedModule': case 'ImportedComponent': return 'react-imported-component'; case 'assignImportedComponents': return 'react-imported-component/boot'; default: return false; } } function macro(_a) { var references = _a.references, state = _a.state, babel = _a.babel; var t = babel.types; var fileName = state.file.opts.filename; var imports = {}; var transformer = createTransformer(babel, true); Object.keys(references).forEach(function (tagName) { var origin = getMacroType(tagName); if (origin) { imports[origin] = imports[origin] || []; imports[origin].push(tagName); var tags = references[tagName]; tags.forEach(function (tag) { var expression = tag.parentPath; if (t.isCallExpression(expression)) { transformer.traverse(expression, fileName); } }); } }); addReactImports(babel, state, imports); transformer.traverse(state.file.path, fileName); transformer.finish(state.file.path.node, fileName); } function addReactImports(babel, state, importsGroups) { var t = babel.types; return Object.keys(importsGroups) .map(function (origin) { var imports = importsGroups[origin]; if (!imports.length) { return false; } var importedImport = state.file.path.node.body.find(function (importNode) { return t.isImportDeclaration(importNode) && importNode.source.value === origin; }); // Handle adding the import or altering the existing import if (importedImport) { imports.forEach(function (name) { if (!importedImport.specifiers.find(function (specifier) { return specifier.imported && specifier.imported.name === name; })) { importedImport.specifiers.push(t.importSpecifier(t.identifier(name), t.identifier(name))); } }); } else { state.file.path.node.body.unshift(t.importDeclaration(imports.map(function (name) { return t.importSpecifier(t.identifier(name), t.identifier(name)); }), t.stringLiteral(origin))); } return true; }) .some(Boolean); } var neverCallMe = function () { throw new Error('you have used `react-imported-component/macro` without `babel-plugin-macro` or `react-hot-loader/babel` installed'); }; var lazy = neverCallMe; var imported = neverCallMe; var importedModule = neverCallMe; var useImported = neverCallMe; var ImportedModule = neverCallMe; var ImportedComponent = neverCallMe; export { lazy, imported, importedModule, ImportedModule, ImportedComponent, useImported, assignImportedComponents }; export default createMacro(macro);