-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
/
Copy pathReactRefreshWrapTransformer.js
72 lines (62 loc) · 1.76 KB
/
ReactRefreshWrapTransformer.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// @flow
import path from 'path';
import {Transformer} from '@parcel/plugin';
function shouldExclude(asset, options) {
return (
!asset.isSource ||
!options.hmrOptions ||
!asset.env.isBrowser() ||
asset.env.isLibrary ||
asset.env.isWorker() ||
asset.env.isWorklet() ||
options.mode !== 'development' ||
!asset
.getDependencies()
.find(
v =>
v.specifier === 'react' ||
v.specifier === 'react/jsx-runtime' ||
v.specifier === 'react/jsx-dev-runtime' ||
v.specifier === '@emotion/react' ||
v.specifier === '@emotion/react/jsx-runtime' ||
v.specifier === '@emotion/react/jsx-dev-runtime',
)
);
}
export default (new Transformer({
async transform({asset, options}) {
if (shouldExclude(asset, options)) {
return [asset];
}
let wrapperPath = `@parcel/transformer-react-refresh-wrap/${path.basename(
__dirname,
)}/helpers/helpers.js`;
let code = await asset.getCode();
let map = await asset.getMap();
let name = `$parcel$ReactRefreshHelpers$${asset.id.slice(-4)}`;
code = `var ${name} = require(${JSON.stringify(wrapperPath)});
${name}.init();
var prevRefreshReg = globalThis.$RefreshReg$;
var prevRefreshSig = globalThis.$RefreshSig$;
${name}.prelude(module);
try {
${code}
${name}.postlude(module);
} finally {
globalThis.$RefreshReg$ = prevRefreshReg;
globalThis.$RefreshSig$ = prevRefreshSig;
}`;
asset.setCode(code);
if (map) {
map.offsetLines(1, 6);
asset.setMap(map);
}
// The JSTransformer has already run, do it manually
asset.addDependency({
specifier: wrapperPath,
specifierType: 'esm',
resolveFrom: __filename,
});
return [asset];
},
}): Transformer);