1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 |
|
4 | var babel_plugin_macros_1 = require("babel-plugin-macros");
|
5 | var babel_1 = require("../babel/babel");
|
6 | var assignImportedComponents_1 = require("../loadable/assignImportedComponents");
|
7 | exports.assignImportedComponents = assignImportedComponents_1.assignImportedComponents;
|
8 | function 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 | }
|
23 | function 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 | }
|
47 | function 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 |
|
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 | }
|
71 | var neverCallMe = function () {
|
72 | throw new Error('you have used `react-imported-component/macro` without `babel-plugin-macro` or `react-hot-loader/babel` installed');
|
73 | };
|
74 | var lazy = neverCallMe;
|
75 | exports.lazy = lazy;
|
76 | var imported = neverCallMe;
|
77 | exports.imported = imported;
|
78 | var importedModule = neverCallMe;
|
79 | exports.importedModule = importedModule;
|
80 | var useImported = neverCallMe;
|
81 | exports.useImported = useImported;
|
82 | var ImportedModule = neverCallMe;
|
83 | exports.ImportedModule = ImportedModule;
|
84 | var ImportedComponent = neverCallMe;
|
85 | exports.ImportedComponent = ImportedComponent;
|
86 | exports.default = babel_plugin_macros_1.createMacro(macro);
|