UNPKG

3.49 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3// @ts-ignore
4var babel_plugin_macros_1 = require("babel-plugin-macros");
5var babel_1 = require("../babel/babel");
6var assignImportedComponents_1 = require("../loadable/assignImportedComponents");
7exports.assignImportedComponents = assignImportedComponents_1.assignImportedComponents;
8function getMacroType(tagName) {
9 switch (tagName) {
10 case 'importedModule':
11 case 'imported':
12 case 'lazy':
13 case 'useImported':
14 case 'ImportedModule':
15 case 'ImportedComponent':
16 return 'react-imported-component';
17 case 'assignImportedComponents':
18 return 'react-imported-component/boot';
19 default:
20 return false;
21 }
22}
23function macro(_a) {
24 var references = _a.references, state = _a.state, babel = _a.babel;
25 var t = babel.types;
26 var fileName = state.file.opts.filename;
27 var imports = {};
28 var transformer = babel_1.createTransformer(babel, true);
29 Object.keys(references).forEach(function (tagName) {
30 var origin = getMacroType(tagName);
31 if (origin) {
32 imports[origin] = imports[origin] || [];
33 imports[origin].push(tagName);
34 var tags = references[tagName];
35 tags.forEach(function (tag) {
36 var expression = tag.parentPath;
37 if (t.isCallExpression(expression)) {
38 transformer.traverse(expression, fileName);
39 }
40 });
41 }
42 });
43 addReactImports(babel, state, imports);
44 transformer.traverse(state.file.path, fileName);
45 transformer.finish(state.file.path.node, fileName);
46}
47function addReactImports(babel, state, importsGroups) {
48 var t = babel.types;
49 return Object.keys(importsGroups)
50 .map(function (origin) {
51 var imports = importsGroups[origin];
52 if (!imports.length) {
53 return false;
54 }
55 var importedImport = state.file.path.node.body.find(function (importNode) { return t.isImportDeclaration(importNode) && importNode.source.value === origin; });
56 // Handle adding the import or altering the existing import
57 if (importedImport) {
58 imports.forEach(function (name) {
59 if (!importedImport.specifiers.find(function (specifier) { return specifier.imported && specifier.imported.name === name; })) {
60 importedImport.specifiers.push(t.importSpecifier(t.identifier(name), t.identifier(name)));
61 }
62 });
63 }
64 else {
65 state.file.path.node.body.unshift(t.importDeclaration(imports.map(function (name) { return t.importSpecifier(t.identifier(name), t.identifier(name)); }), t.stringLiteral(origin)));
66 }
67 return true;
68 })
69 .some(Boolean);
70}
71var neverCallMe = function () {
72 throw new Error('you have used `react-imported-component/macro` without `babel-plugin-macro` or `react-hot-loader/babel` installed');
73};
74var lazy = neverCallMe;
75exports.lazy = lazy;
76var imported = neverCallMe;
77exports.imported = imported;
78var importedModule = neverCallMe;
79exports.importedModule = importedModule;
80var useImported = neverCallMe;
81exports.useImported = useImported;
82var ImportedModule = neverCallMe;
83exports.ImportedModule = ImportedModule;
84var ImportedComponent = neverCallMe;
85exports.ImportedComponent = ImportedComponent;
86exports.default = babel_plugin_macros_1.createMacro(macro);