Skip to content

Commit 6142a15

Browse files
committed
fix: macro should patch the whole file, fixes #142
1 parent 132b31e commit 6142a15

File tree

5 files changed

+69
-21
lines changed

5 files changed

+69
-21
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,10 @@ import {imported, lazy, useImported} from "react-imported-component/macro";
181181
// notice - there is no default import here
182182
```
183183

184+
### Indirect usage
185+
Just importing `react-imported-component/macro` would enable babel transformation for the current file.
186+
If you have `imported` definition in one file, and use it from another - just `import "react-imported-component/macro"` in that another file. See [#142](https://github.com/theKashey/react-imported-component/issues/142)
187+
184188
<a name="api"/>
185189

186190
# API

__tests__/__snapshots__/macro.spec.ts.snap

Lines changed: 48 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,54 @@ lazy(() =>
6060
"
6161
`;
6262

63+
exports[`babel macro macros flat import: flat import 1`] = `
64+
"
65+
import \\"../macro\\";
66+
import('./a.js')
67+
68+
↓ ↓ ↓ ↓ ↓ ↓
69+
70+
function _interopRequireWildcard(obj) {
71+
if (obj && obj.__esModule) {
72+
return obj;
73+
} else {
74+
var newObj = {};
75+
if (obj != null) {
76+
for (var key in obj) {
77+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
78+
var desc =
79+
Object.defineProperty && Object.getOwnPropertyDescriptor
80+
? Object.getOwnPropertyDescriptor(obj, key)
81+
: {};
82+
if (desc.get || desc.set) {
83+
Object.defineProperty(newObj, key, desc);
84+
} else {
85+
newObj[key] = obj[key];
86+
}
87+
}
88+
}
89+
}
90+
newObj.default = obj;
91+
return newObj;
92+
}
93+
}
94+
95+
var importedWrapper = function(marker, realImport) {
96+
if (typeof __deoptimization_sideEffect__ !== \\"undefined\\") {
97+
__deoptimization_sideEffect__(marker, realImport);
98+
}
99+
100+
return realImport;
101+
};
102+
103+
importedWrapper(
104+
\\"imported_-1ko6oiq_component\\",
105+
Promise.resolve().then(() => _interopRequireWildcard(require(\\"./a.js\\")))
106+
);
107+
108+
"
109+
`;
110+
63111
exports[`babel macro macros lazy: lazy 1`] = `
64112
"
65113
import {lazy} from \\"../macro\\";
@@ -177,14 +225,6 @@ import {lazy} from \\"../macro\\";
177225
178226
↓ ↓ ↓ ↓ ↓ ↓
179227
180-
var importedWrapper = function(marker, realImport) {
181-
if (typeof __deoptimization_sideEffect__ !== \\"undefined\\") {
182-
__deoptimization_sideEffect__(marker, realImport);
183-
}
184-
185-
return realImport;
186-
};
187-
188228
import { lazy } from \\"react-imported-component\\";
189229
190230
"

__tests__/macro.spec.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ describe('babel macro', () => {
1616
tests: {
1717
"nothing": "const a = 42;",
1818
"no usage": `import {lazy} from "../macro";`,
19+
"flat import": `import "../macro";
20+
import('./a.js')
21+
`,
1922
"boot": `
2023
import {assignImportedComponents, lazy} from "../macro";
2124
assignImportedComponents([() => import('./a')]);

src/babel.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export const createTransformer = ({types: t, template}: any) => {
4747
const visitedNodes = new Map();
4848

4949
return {
50-
traverse(programPath: any, file: any) {
50+
traverse(programPath: any, fileName: string) {
5151
programPath.traverse({
5252
ImportDeclaration(path: any) {
5353
const source = path.node.source.value;
@@ -80,14 +80,13 @@ export const createTransformer = ({types: t, template}: any) => {
8080
return;
8181
}
8282

83-
const localFile = file.opts.filename;
8483
const newImport = parentPath.node;
8584
const importName = parentPath.get('arguments')[0].node.value;
8685

8786
if (!importName) {
8887
return;
8988
}
90-
const requiredFileHash = encipherImport(resolveImport(importName, localFile));
89+
const requiredFileHash = encipherImport(resolveImport(importName, fileName));
9190

9291
let replace = null;
9392

@@ -96,15 +95,16 @@ export const createTransformer = ({types: t, template}: any) => {
9695
IMPORT: newImport
9796
});
9897

99-
hasImports.add(localFile);
98+
hasImports.add(fileName);
10099
visitedNodes.set(newImport, true);
101100

102101
parentPath.replaceWith(replace);
103102
}
104103
});
105104
},
106105

107-
finish(node: any) {
106+
finish(node: any, filename: string) {
107+
if (!hasImports.has(filename)) return;
108108
node.body.unshift(headerTemplate());
109109
},
110110

@@ -121,13 +121,11 @@ export default function (babel: any) {
121121
visitor: {
122122
Program: {
123123
enter(programPath: any, {file}: any) {
124-
transformer.traverse(programPath, file);
124+
transformer.traverse(programPath, file.opts.filename);
125125
},
126126

127127
exit({node}: any, {file}: any) {
128-
if (!transformer.hasImports.has(file.opts.filename)) return;
129-
130-
transformer.finish(node);
128+
transformer.finish(node, file.opts.filename);
131129
}
132130
},
133131
}

src/macro.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ function getMacroType(tagName: string) {
1919

2020
function macro({references, state, babel}: any) {
2121
const {types: t} = babel;
22+
const fileName = state.file.opts.filename;
2223

2324
const imports: Record<string, string[]> = {};
2425
const transformer = createTransformer(babel);
@@ -35,15 +36,17 @@ function macro({references, state, babel}: any) {
3536
let expression = tag.parentPath;
3637

3738
if (t.isCallExpression(expression)) {
38-
transformer.traverse(expression, state.file)
39+
transformer.traverse(expression, fileName);
3940
}
4041
});
4142
}
4243
});
4344

44-
if (addReactImports(babel, state, imports)) {
45-
transformer.finish(state.file.path.node);
46-
}
45+
transformer.traverse(state.file.path, fileName);
46+
47+
addReactImports(babel, state, imports);
48+
49+
transformer.finish(state.file.path.node, fileName);
4750
}
4851

4952
function addReactImports(babel: any, state: any, importsGroups: Record<string, string[]>) {

0 commit comments

Comments
 (0)