@parcel/transformer-react-refresh-wrap 2.0.0-nightly.150 → 2.0.0-nightly.1501
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/ReactRefreshWrapTransformer.js +41 -122
- package/lib/helpers/helpers.js +41 -57
- package/package.json +11 -13
- package/src/ReactRefreshWrapTransformer.js +44 -111
- package/src/helpers/helpers.js +38 -21
|
@@ -4,141 +4,60 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
var _utils = require("@parcel/utils");
|
|
15
|
-
|
|
16
|
-
var _sourceMap = _interopRequireDefault(require("@parcel/source-map"));
|
|
17
|
-
|
|
18
|
-
var _generator = _interopRequireDefault(require("@babel/generator"));
|
|
19
|
-
|
|
20
|
-
var _parser = require("@babel/parser");
|
|
21
|
-
|
|
22
|
-
var _template = _interopRequireDefault(require("@babel/template"));
|
|
23
|
-
|
|
24
|
-
var t = _interopRequireWildcard(require("@babel/types"));
|
|
25
|
-
|
|
26
|
-
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
|
|
27
|
-
|
|
28
|
-
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
29
|
-
|
|
30
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
31
|
-
|
|
32
|
-
const WRAPPER = _path.default.join(__dirname, 'helpers', 'helpers.js');
|
|
33
|
-
|
|
34
|
-
const wrapper = _template.default.statements(`
|
|
35
|
-
var helpers = require(%%helper%%);
|
|
36
|
-
var prevRefreshReg = window.$RefreshReg$;
|
|
37
|
-
var prevRefreshSig = window.$RefreshSig$;
|
|
38
|
-
helpers.prelude(module);
|
|
39
|
-
|
|
40
|
-
try {
|
|
41
|
-
%%module%%
|
|
42
|
-
helpers.postlude(module);
|
|
43
|
-
} finally {
|
|
44
|
-
window.$RefreshReg$ = prevRefreshReg;
|
|
45
|
-
window.$RefreshSig$ = prevRefreshSig;
|
|
7
|
+
function _path() {
|
|
8
|
+
const data = _interopRequireDefault(require("path"));
|
|
9
|
+
_path = function () {
|
|
10
|
+
return data;
|
|
11
|
+
};
|
|
12
|
+
return data;
|
|
46
13
|
}
|
|
47
|
-
|
|
48
|
-
|
|
14
|
+
function _plugin() {
|
|
15
|
+
const data = require("@parcel/plugin");
|
|
16
|
+
_plugin = function () {
|
|
17
|
+
return data;
|
|
18
|
+
};
|
|
19
|
+
return data;
|
|
20
|
+
}
|
|
21
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
49
22
|
function shouldExclude(asset, options) {
|
|
50
|
-
return !asset.isSource || !options.
|
|
23
|
+
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');
|
|
51
24
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
canReuseAST({
|
|
55
|
-
ast
|
|
56
|
-
}) {
|
|
57
|
-
return ast.type === 'babel' && _semver.default.satisfies(ast.version, '^7.0.0');
|
|
58
|
-
},
|
|
59
|
-
|
|
60
|
-
async parse({
|
|
25
|
+
var _default = exports.default = new (_plugin().Transformer)({
|
|
26
|
+
async transform({
|
|
61
27
|
asset,
|
|
62
28
|
options
|
|
63
29
|
}) {
|
|
64
30
|
if (shouldExclude(asset, options)) {
|
|
65
|
-
return null;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
let code = await asset.getCode();
|
|
69
|
-
return {
|
|
70
|
-
type: 'babel',
|
|
71
|
-
version: '7.0.0',
|
|
72
|
-
isDirty: false,
|
|
73
|
-
program: (0, _parser.parse)(code, {
|
|
74
|
-
sourceFilename: this.name,
|
|
75
|
-
allowReturnOutsideFunction: true,
|
|
76
|
-
strictMode: false,
|
|
77
|
-
sourceType: 'module',
|
|
78
|
-
plugins: ['exportDefaultFrom', 'exportNamespaceFrom', 'dynamicImport']
|
|
79
|
-
})
|
|
80
|
-
};
|
|
81
|
-
},
|
|
82
|
-
|
|
83
|
-
transform({
|
|
84
|
-
asset,
|
|
85
|
-
options
|
|
86
|
-
}) {
|
|
87
|
-
let ast = asset.ast;
|
|
88
|
-
|
|
89
|
-
if (!ast || shouldExclude(asset, options)) {
|
|
90
31
|
return [asset];
|
|
91
32
|
}
|
|
33
|
+
let wrapperPath = `@parcel/transformer-react-refresh-wrap/${_path().default.basename(__dirname)}/helpers/helpers.js`;
|
|
34
|
+
let code = await asset.getCode();
|
|
35
|
+
let map = await asset.getMap();
|
|
36
|
+
let name = `$parcel$ReactRefreshHelpers$${asset.id.slice(-4)}`;
|
|
37
|
+
code = `var ${name} = require(${JSON.stringify(wrapperPath)});
|
|
38
|
+
var prevRefreshReg = window.$RefreshReg$;
|
|
39
|
+
var prevRefreshSig = window.$RefreshSig$;
|
|
40
|
+
${name}.prelude(module);
|
|
92
41
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
42
|
+
try {
|
|
43
|
+
${code}
|
|
44
|
+
${name}.postlude(module);
|
|
45
|
+
} finally {
|
|
46
|
+
window.$RefreshReg$ = prevRefreshReg;
|
|
47
|
+
window.$RefreshSig$ = prevRefreshSig;
|
|
48
|
+
}`;
|
|
49
|
+
asset.setCode(code);
|
|
50
|
+
if (map) {
|
|
51
|
+
map.offsetLines(1, 6);
|
|
52
|
+
asset.setMap(map);
|
|
97
53
|
}
|
|
98
54
|
|
|
99
|
-
|
|
100
|
-
helper: t.stringLiteral(wrapperPath),
|
|
101
|
-
module: ast.program.program.body
|
|
102
|
-
});
|
|
103
|
-
ast.isDirty = true; // The JSTransformer has already run, do it manually
|
|
104
|
-
|
|
55
|
+
// The JSTransformer has already run, do it manually
|
|
105
56
|
asset.addDependency({
|
|
106
|
-
|
|
57
|
+
specifier: wrapperPath,
|
|
58
|
+
specifierType: 'esm',
|
|
59
|
+
resolveFrom: __filename
|
|
107
60
|
});
|
|
108
61
|
return [asset];
|
|
109
|
-
},
|
|
110
|
-
|
|
111
|
-
async generate({
|
|
112
|
-
asset,
|
|
113
|
-
options
|
|
114
|
-
}) {
|
|
115
|
-
let code = await asset.getCode();
|
|
116
|
-
let res = {
|
|
117
|
-
code
|
|
118
|
-
};
|
|
119
|
-
let ast = asset.ast;
|
|
120
|
-
|
|
121
|
-
if (ast && ast.isDirty !== false) {
|
|
122
|
-
let sourceFileName = (0, _utils.relativeUrl)(options.projectRoot, asset.filePath);
|
|
123
|
-
let generated = (0, _generator.default)(ast.program, {
|
|
124
|
-
sourceMaps: options.sourceMaps,
|
|
125
|
-
sourceFileName: sourceFileName
|
|
126
|
-
}, code);
|
|
127
|
-
res.code = generated.code; // $FlowFixMe...
|
|
128
|
-
|
|
129
|
-
res.map = new _sourceMap.default(generated.rawMappings, {
|
|
130
|
-
[sourceFileName]: null
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
if (asset.meta.globals && asset.meta.globals.size > 0) {
|
|
135
|
-
res.code = Array.from(asset.meta.globals.values()).map(g => g ? g.code : '').join('\n') + '\n' + res.code;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
delete asset.meta.globals;
|
|
139
|
-
return res;
|
|
140
62
|
}
|
|
141
|
-
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
exports.default = _default;
|
|
63
|
+
});
|
package/lib/helpers/helpers.js
CHANGED
|
@@ -1,27 +1,39 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var Refresh = require('react-refresh/runtime');
|
|
4
|
-
|
|
5
4
|
function debounce(func, delay) {
|
|
6
5
|
if (process.env.NODE_ENV === 'test') {
|
|
7
6
|
return function (args) {
|
|
8
7
|
func.call(null, args);
|
|
9
8
|
};
|
|
10
9
|
} else {
|
|
11
|
-
|
|
10
|
+
let timeout = undefined;
|
|
11
|
+
let lastTime = 0;
|
|
12
12
|
return function (args) {
|
|
13
|
-
|
|
14
|
-
timeout
|
|
15
|
-
|
|
13
|
+
// Call immediately if last call was more than the delay ago.
|
|
14
|
+
// Otherwise, set a timeout. This means the first call is fast
|
|
15
|
+
// (for the common case of a single update), and subsequent updates
|
|
16
|
+
// are batched.
|
|
17
|
+
let now = Date.now();
|
|
18
|
+
if (now - lastTime > delay) {
|
|
19
|
+
lastTime = now;
|
|
16
20
|
func.call(null, args);
|
|
17
|
-
}
|
|
21
|
+
} else {
|
|
22
|
+
clearTimeout(timeout);
|
|
23
|
+
timeout = setTimeout(function () {
|
|
24
|
+
timeout = undefined;
|
|
25
|
+
lastTime = Date.now();
|
|
26
|
+
func.call(null, args);
|
|
27
|
+
}, delay);
|
|
28
|
+
}
|
|
18
29
|
};
|
|
19
30
|
}
|
|
20
31
|
}
|
|
21
|
-
|
|
22
32
|
var enqueueUpdate = debounce(function () {
|
|
23
33
|
Refresh.performReactRefresh();
|
|
24
|
-
}, 30);
|
|
34
|
+
}, 30);
|
|
35
|
+
|
|
36
|
+
// Everthing below is either adapted or copied from
|
|
25
37
|
// https://github.com/facebook/metro/blob/61de16bd1edd7e738dd0311c89555a644023ab2d/packages/metro/src/lib/polyfills/require.js
|
|
26
38
|
// MIT License - Copyright (c) Facebook, Inc. and its affiliates.
|
|
27
39
|
|
|
@@ -29,161 +41,133 @@ module.exports.prelude = function (module) {
|
|
|
29
41
|
window.$RefreshReg$ = function (type, id) {
|
|
30
42
|
Refresh.register(type, module.id + ' ' + id);
|
|
31
43
|
};
|
|
32
|
-
|
|
33
44
|
window.$RefreshSig$ = Refresh.createSignatureFunctionForTransform;
|
|
34
45
|
};
|
|
35
|
-
|
|
36
46
|
module.exports.postlude = function (module) {
|
|
37
47
|
if (isReactRefreshBoundary(module.exports)) {
|
|
38
48
|
registerExportsForReactRefresh(module);
|
|
39
|
-
|
|
40
49
|
if (module.hot) {
|
|
41
50
|
module.hot.dispose(function (data) {
|
|
51
|
+
if (Refresh.hasUnrecoverableErrors()) {
|
|
52
|
+
window.location.reload();
|
|
53
|
+
}
|
|
42
54
|
data.prevExports = module.exports;
|
|
43
55
|
});
|
|
44
56
|
module.hot.accept(function (getParents) {
|
|
45
57
|
var prevExports = module.hot.data.prevExports;
|
|
46
|
-
var nextExports = module.exports;
|
|
58
|
+
var nextExports = module.exports;
|
|
59
|
+
// Since we just executed the code for it, it's possible
|
|
47
60
|
// that the new exports make it ineligible for being a boundary.
|
|
48
|
-
|
|
49
|
-
|
|
61
|
+
var isNoLongerABoundary = !isReactRefreshBoundary(nextExports);
|
|
62
|
+
// It can also become ineligible if its exports are incompatible
|
|
50
63
|
// with the previous exports.
|
|
51
64
|
// For example, if you add/remove/change exports, we'll want
|
|
52
65
|
// to re-execute the importing modules, and force those components
|
|
53
66
|
// to re-render. Similarly, if you convert a class component
|
|
54
67
|
// to a function, we want to invalidate the boundary.
|
|
55
|
-
|
|
56
68
|
var didInvalidate = shouldInvalidateReactRefreshBoundary(prevExports, nextExports);
|
|
57
|
-
|
|
58
69
|
if (isNoLongerABoundary || didInvalidate) {
|
|
59
70
|
// We'll be conservative. The only case in which we won't do a full
|
|
60
71
|
// reload is if all parent modules are also refresh boundaries.
|
|
61
72
|
// In that case we'll add them to the current queue.
|
|
62
73
|
var parents = getParents();
|
|
63
|
-
|
|
64
74
|
if (parents.length === 0) {
|
|
65
75
|
// Looks like we bubbled to the root. Can't recover from that.
|
|
66
76
|
window.location.reload();
|
|
67
77
|
return;
|
|
68
78
|
}
|
|
69
|
-
|
|
70
79
|
return parents;
|
|
71
80
|
}
|
|
72
|
-
|
|
73
81
|
enqueueUpdate();
|
|
74
82
|
});
|
|
75
83
|
}
|
|
76
|
-
|
|
77
|
-
if (Refresh.hasUnrecoverableErrors()) {
|
|
78
|
-
window.location.reload();
|
|
79
|
-
}
|
|
80
84
|
}
|
|
81
85
|
};
|
|
82
|
-
|
|
83
86
|
function isReactRefreshBoundary(exports) {
|
|
84
87
|
if (Refresh.isLikelyComponentType(exports)) {
|
|
85
88
|
return true;
|
|
86
89
|
}
|
|
87
|
-
|
|
88
90
|
if (exports == null || typeof exports !== 'object') {
|
|
89
91
|
// Exit if we can't iterate over exports.
|
|
90
92
|
return false;
|
|
91
93
|
}
|
|
92
|
-
|
|
93
94
|
var hasExports = false;
|
|
94
95
|
var areAllExportsComponents = true;
|
|
95
|
-
|
|
96
|
+
let isESM = ('__esModule' in exports);
|
|
96
97
|
for (var key in exports) {
|
|
97
98
|
hasExports = true;
|
|
98
|
-
|
|
99
99
|
if (key === '__esModule') {
|
|
100
100
|
continue;
|
|
101
101
|
}
|
|
102
|
-
|
|
103
102
|
var desc = Object.getOwnPropertyDescriptor(exports, key);
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
// Don't invoke getters as they may have side effects.
|
|
103
|
+
if (desc && desc.get && !isESM) {
|
|
104
|
+
// Don't invoke getters for CJS as they may have side effects.
|
|
107
105
|
return false;
|
|
108
106
|
}
|
|
109
|
-
|
|
110
107
|
var exportValue = exports[key];
|
|
111
|
-
|
|
112
108
|
if (!Refresh.isLikelyComponentType(exportValue)) {
|
|
113
109
|
areAllExportsComponents = false;
|
|
114
110
|
}
|
|
115
111
|
}
|
|
116
|
-
|
|
117
112
|
return hasExports && areAllExportsComponents;
|
|
118
113
|
}
|
|
119
|
-
|
|
120
114
|
function shouldInvalidateReactRefreshBoundary(prevExports, nextExports) {
|
|
121
115
|
var prevSignature = getRefreshBoundarySignature(prevExports);
|
|
122
116
|
var nextSignature = getRefreshBoundarySignature(nextExports);
|
|
123
|
-
|
|
124
117
|
if (prevSignature.length !== nextSignature.length) {
|
|
125
118
|
return true;
|
|
126
119
|
}
|
|
127
|
-
|
|
128
120
|
for (var i = 0; i < nextSignature.length; i++) {
|
|
129
121
|
if (prevSignature[i] !== nextSignature[i]) {
|
|
130
122
|
return true;
|
|
131
123
|
}
|
|
132
124
|
}
|
|
133
|
-
|
|
134
125
|
return false;
|
|
135
|
-
}
|
|
136
|
-
|
|
126
|
+
}
|
|
137
127
|
|
|
128
|
+
// When this signature changes, it's unsafe to stop at this refresh boundary.
|
|
138
129
|
function getRefreshBoundarySignature(exports) {
|
|
139
130
|
var signature = [];
|
|
140
131
|
signature.push(Refresh.getFamilyByType(exports));
|
|
141
|
-
|
|
142
132
|
if (exports == null || typeof exports !== 'object') {
|
|
143
133
|
// Exit if we can't iterate over exports.
|
|
144
134
|
// (This is important for legacy environments.)
|
|
145
135
|
return signature;
|
|
146
136
|
}
|
|
147
|
-
|
|
137
|
+
let isESM = ('__esModule' in exports);
|
|
148
138
|
for (var key in exports) {
|
|
149
139
|
if (key === '__esModule') {
|
|
150
140
|
continue;
|
|
151
141
|
}
|
|
152
|
-
|
|
153
142
|
var desc = Object.getOwnPropertyDescriptor(exports, key);
|
|
154
|
-
|
|
155
|
-
|
|
143
|
+
if (desc && desc.get && !isESM) {
|
|
144
|
+
// Don't invoke getters for CJS as they may have side effects.
|
|
156
145
|
continue;
|
|
157
146
|
}
|
|
158
|
-
|
|
159
147
|
var exportValue = exports[key];
|
|
160
148
|
signature.push(key);
|
|
161
149
|
signature.push(Refresh.getFamilyByType(exportValue));
|
|
162
150
|
}
|
|
163
|
-
|
|
164
151
|
return signature;
|
|
165
152
|
}
|
|
166
|
-
|
|
167
153
|
function registerExportsForReactRefresh(module) {
|
|
168
154
|
var exports = module.exports,
|
|
169
|
-
|
|
155
|
+
id = module.id;
|
|
170
156
|
Refresh.register(exports, id + ' %exports%');
|
|
171
|
-
|
|
172
157
|
if (exports == null || typeof exports !== 'object') {
|
|
173
158
|
// Exit if we can't iterate over exports.
|
|
174
159
|
// (This is important for legacy environments.)
|
|
175
160
|
return;
|
|
176
161
|
}
|
|
177
|
-
|
|
162
|
+
let isESM = ('__esModule' in exports);
|
|
178
163
|
for (var key in exports) {
|
|
179
164
|
var desc = Object.getOwnPropertyDescriptor(exports, key);
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
// Don't invoke getters as they may have side effects.
|
|
165
|
+
if (desc && desc.get && !isESM) {
|
|
166
|
+
// Don't invoke getters for CJS as they may have side effects.
|
|
183
167
|
continue;
|
|
184
168
|
}
|
|
185
|
-
|
|
186
169
|
var exportValue = exports[key];
|
|
187
|
-
|
|
170
|
+
var typeID = id + ' %exports% ' + key;
|
|
171
|
+
Refresh.register(exportValue, typeID);
|
|
188
172
|
}
|
|
189
173
|
}
|
package/package.json
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@parcel/transformer-react-refresh-wrap",
|
|
3
|
-
"version": "2.0.0-nightly.
|
|
3
|
+
"version": "2.0.0-nightly.1501+2215d360d",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
8
|
+
"funding": {
|
|
9
|
+
"type": "opencollective",
|
|
10
|
+
"url": "https://opencollective.com/parcel"
|
|
11
|
+
},
|
|
8
12
|
"repository": {
|
|
9
13
|
"type": "git",
|
|
10
14
|
"url": "https://github.com/parcel-bundler/parcel.git"
|
|
@@ -12,19 +16,13 @@
|
|
|
12
16
|
"main": "lib/ReactRefreshWrapTransformer.js",
|
|
13
17
|
"source": "src/ReactRefreshWrapTransformer.js",
|
|
14
18
|
"engines": {
|
|
15
|
-
"node": ">=
|
|
16
|
-
"parcel": "
|
|
19
|
+
"node": ">= 12.0.0",
|
|
20
|
+
"parcel": "2.0.0-nightly.1499+2215d360d"
|
|
17
21
|
},
|
|
18
22
|
"dependencies": {
|
|
19
|
-
"@
|
|
20
|
-
"@
|
|
21
|
-
"
|
|
22
|
-
"@babel/types": "^7.0.0",
|
|
23
|
-
"@parcel/plugin": "2.0.0-nightly.150+2dc32a8b",
|
|
24
|
-
"@parcel/source-map": "2.0.0-nightly.150+2dc32a8b",
|
|
25
|
-
"@parcel/utils": "2.0.0-nightly.150+2dc32a8b",
|
|
26
|
-
"react-refresh": "^0.6.0",
|
|
27
|
-
"semver": "^5.4.1"
|
|
23
|
+
"@parcel/plugin": "2.0.0-nightly.1501+2215d360d",
|
|
24
|
+
"@parcel/utils": "2.0.0-nightly.1501+2215d360d",
|
|
25
|
+
"react-refresh": "^0.9.0"
|
|
28
26
|
},
|
|
29
|
-
"gitHead": "
|
|
27
|
+
"gitHead": "2215d360dc531ec46c112223763404650b0a8be1"
|
|
30
28
|
}
|
|
@@ -1,138 +1,71 @@
|
|
|
1
1
|
// @flow
|
|
2
2
|
|
|
3
|
-
import type {StringLiteral, Statement} from '@babel/types';
|
|
4
|
-
|
|
5
|
-
import semver from 'semver';
|
|
6
3
|
import path from 'path';
|
|
7
4
|
import {Transformer} from '@parcel/plugin';
|
|
8
|
-
import {relativeUrl} from '@parcel/utils';
|
|
9
|
-
import SourceMap from '@parcel/source-map';
|
|
10
|
-
import generate from '@babel/generator';
|
|
11
|
-
import {parse} from '@babel/parser';
|
|
12
|
-
import template from '@babel/template';
|
|
13
|
-
import * as t from '@babel/types';
|
|
14
|
-
|
|
15
|
-
const WRAPPER = path.join(__dirname, 'helpers', 'helpers.js');
|
|
16
|
-
|
|
17
|
-
const wrapper = template.statements<{|
|
|
18
|
-
helper: StringLiteral,
|
|
19
|
-
module: Array<Statement>,
|
|
20
|
-
|}>(`
|
|
21
|
-
var helpers = require(%%helper%%);
|
|
22
|
-
var prevRefreshReg = window.$RefreshReg$;
|
|
23
|
-
var prevRefreshSig = window.$RefreshSig$;
|
|
24
|
-
helpers.prelude(module);
|
|
25
|
-
|
|
26
|
-
try {
|
|
27
|
-
%%module%%
|
|
28
|
-
helpers.postlude(module);
|
|
29
|
-
} finally {
|
|
30
|
-
window.$RefreshReg$ = prevRefreshReg;
|
|
31
|
-
window.$RefreshSig$ = prevRefreshSig;
|
|
32
|
-
}
|
|
33
|
-
`);
|
|
34
5
|
|
|
35
6
|
function shouldExclude(asset, options) {
|
|
36
7
|
return (
|
|
37
8
|
!asset.isSource ||
|
|
38
|
-
!options.
|
|
9
|
+
!options.hmrOptions ||
|
|
39
10
|
!asset.env.isBrowser() ||
|
|
11
|
+
asset.env.isLibrary ||
|
|
12
|
+
asset.env.isWorker() ||
|
|
13
|
+
asset.env.isWorklet() ||
|
|
40
14
|
options.mode !== 'development' ||
|
|
41
|
-
!asset
|
|
15
|
+
!asset
|
|
16
|
+
.getDependencies()
|
|
17
|
+
.find(
|
|
18
|
+
v =>
|
|
19
|
+
v.specifier === 'react' ||
|
|
20
|
+
v.specifier === 'react/jsx-runtime' ||
|
|
21
|
+
v.specifier === 'react/jsx-dev-runtime' ||
|
|
22
|
+
v.specifier === '@emotion/react' ||
|
|
23
|
+
v.specifier === '@emotion/react/jsx-runtime' ||
|
|
24
|
+
v.specifier === '@emotion/react/jsx-dev-runtime',
|
|
25
|
+
)
|
|
42
26
|
);
|
|
43
27
|
}
|
|
44
28
|
|
|
45
|
-
export default new Transformer({
|
|
46
|
-
|
|
47
|
-
return ast.type === 'babel' && semver.satisfies(ast.version, '^7.0.0');
|
|
48
|
-
},
|
|
49
|
-
|
|
50
|
-
async parse({asset, options}) {
|
|
29
|
+
export default (new Transformer({
|
|
30
|
+
async transform({asset, options}) {
|
|
51
31
|
if (shouldExclude(asset, options)) {
|
|
52
|
-
return
|
|
32
|
+
return [asset];
|
|
53
33
|
}
|
|
54
34
|
|
|
35
|
+
let wrapperPath = `@parcel/transformer-react-refresh-wrap/${path.basename(
|
|
36
|
+
__dirname,
|
|
37
|
+
)}/helpers/helpers.js`;
|
|
38
|
+
|
|
55
39
|
let code = await asset.getCode();
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
version: '7.0.0',
|
|
59
|
-
isDirty: false,
|
|
60
|
-
program: parse(code, {
|
|
61
|
-
sourceFilename: this.name,
|
|
62
|
-
allowReturnOutsideFunction: true,
|
|
63
|
-
strictMode: false,
|
|
64
|
-
sourceType: 'module',
|
|
65
|
-
plugins: ['exportDefaultFrom', 'exportNamespaceFrom', 'dynamicImport'],
|
|
66
|
-
}),
|
|
67
|
-
};
|
|
68
|
-
},
|
|
40
|
+
let map = await asset.getMap();
|
|
41
|
+
let name = `$parcel$ReactRefreshHelpers$${asset.id.slice(-4)}`;
|
|
69
42
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
43
|
+
code = `var ${name} = require(${JSON.stringify(wrapperPath)});
|
|
44
|
+
var prevRefreshReg = window.$RefreshReg$;
|
|
45
|
+
var prevRefreshSig = window.$RefreshSig$;
|
|
46
|
+
${name}.prelude(module);
|
|
75
47
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
48
|
+
try {
|
|
49
|
+
${code}
|
|
50
|
+
${name}.postlude(module);
|
|
51
|
+
} finally {
|
|
52
|
+
window.$RefreshReg$ = prevRefreshReg;
|
|
53
|
+
window.$RefreshSig$ = prevRefreshSig;
|
|
54
|
+
}`;
|
|
82
55
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
56
|
+
asset.setCode(code);
|
|
57
|
+
if (map) {
|
|
58
|
+
map.offsetLines(1, 6);
|
|
59
|
+
asset.setMap(map);
|
|
60
|
+
}
|
|
88
61
|
|
|
89
62
|
// The JSTransformer has already run, do it manually
|
|
90
63
|
asset.addDependency({
|
|
91
|
-
|
|
64
|
+
specifier: wrapperPath,
|
|
65
|
+
specifierType: 'esm',
|
|
66
|
+
resolveFrom: __filename,
|
|
92
67
|
});
|
|
93
68
|
|
|
94
69
|
return [asset];
|
|
95
70
|
},
|
|
96
|
-
|
|
97
|
-
async generate({asset, options}) {
|
|
98
|
-
let code = await asset.getCode();
|
|
99
|
-
let res = {
|
|
100
|
-
code,
|
|
101
|
-
};
|
|
102
|
-
|
|
103
|
-
let ast = asset.ast;
|
|
104
|
-
if (ast && ast.isDirty !== false) {
|
|
105
|
-
let sourceFileName: string = relativeUrl(
|
|
106
|
-
options.projectRoot,
|
|
107
|
-
asset.filePath,
|
|
108
|
-
);
|
|
109
|
-
|
|
110
|
-
let generated = generate(
|
|
111
|
-
ast.program,
|
|
112
|
-
{
|
|
113
|
-
sourceMaps: options.sourceMaps,
|
|
114
|
-
sourceFileName: sourceFileName,
|
|
115
|
-
},
|
|
116
|
-
code,
|
|
117
|
-
);
|
|
118
|
-
|
|
119
|
-
res.code = generated.code;
|
|
120
|
-
// $FlowFixMe...
|
|
121
|
-
res.map = new SourceMap(generated.rawMappings, {
|
|
122
|
-
[sourceFileName]: null,
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
if (asset.meta.globals && asset.meta.globals.size > 0) {
|
|
127
|
-
res.code =
|
|
128
|
-
Array.from(asset.meta.globals.values())
|
|
129
|
-
.map(g => (g ? g.code : ''))
|
|
130
|
-
.join('\n') +
|
|
131
|
-
'\n' +
|
|
132
|
-
res.code;
|
|
133
|
-
}
|
|
134
|
-
delete asset.meta.globals;
|
|
135
|
-
|
|
136
|
-
return res;
|
|
137
|
-
},
|
|
138
|
-
});
|
|
71
|
+
}): Transformer);
|
package/src/helpers/helpers.js
CHANGED
|
@@ -2,21 +2,33 @@ var Refresh = require('react-refresh/runtime');
|
|
|
2
2
|
|
|
3
3
|
function debounce(func, delay) {
|
|
4
4
|
if (process.env.NODE_ENV === 'test') {
|
|
5
|
-
return function(args) {
|
|
5
|
+
return function (args) {
|
|
6
6
|
func.call(null, args);
|
|
7
7
|
};
|
|
8
8
|
} else {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
let timeout = undefined;
|
|
10
|
+
let lastTime = 0;
|
|
11
|
+
return function (args) {
|
|
12
|
+
// Call immediately if last call was more than the delay ago.
|
|
13
|
+
// Otherwise, set a timeout. This means the first call is fast
|
|
14
|
+
// (for the common case of a single update), and subsequent updates
|
|
15
|
+
// are batched.
|
|
16
|
+
let now = Date.now();
|
|
17
|
+
if (now - lastTime > delay) {
|
|
18
|
+
lastTime = now;
|
|
14
19
|
func.call(null, args);
|
|
15
|
-
}
|
|
20
|
+
} else {
|
|
21
|
+
clearTimeout(timeout);
|
|
22
|
+
timeout = setTimeout(function () {
|
|
23
|
+
timeout = undefined;
|
|
24
|
+
lastTime = Date.now();
|
|
25
|
+
func.call(null, args);
|
|
26
|
+
}, delay);
|
|
27
|
+
}
|
|
16
28
|
};
|
|
17
29
|
}
|
|
18
30
|
}
|
|
19
|
-
var enqueueUpdate = debounce(function() {
|
|
31
|
+
var enqueueUpdate = debounce(function () {
|
|
20
32
|
Refresh.performReactRefresh();
|
|
21
33
|
}, 30);
|
|
22
34
|
|
|
@@ -24,23 +36,27 @@ var enqueueUpdate = debounce(function() {
|
|
|
24
36
|
// https://github.com/facebook/metro/blob/61de16bd1edd7e738dd0311c89555a644023ab2d/packages/metro/src/lib/polyfills/require.js
|
|
25
37
|
// MIT License - Copyright (c) Facebook, Inc. and its affiliates.
|
|
26
38
|
|
|
27
|
-
module.exports.prelude = function(module) {
|
|
28
|
-
window.$RefreshReg$ = function(type, id) {
|
|
39
|
+
module.exports.prelude = function (module) {
|
|
40
|
+
window.$RefreshReg$ = function (type, id) {
|
|
29
41
|
Refresh.register(type, module.id + ' ' + id);
|
|
30
42
|
};
|
|
31
43
|
window.$RefreshSig$ = Refresh.createSignatureFunctionForTransform;
|
|
32
44
|
};
|
|
33
45
|
|
|
34
|
-
module.exports.postlude = function(module) {
|
|
46
|
+
module.exports.postlude = function (module) {
|
|
35
47
|
if (isReactRefreshBoundary(module.exports)) {
|
|
36
48
|
registerExportsForReactRefresh(module);
|
|
37
49
|
|
|
38
50
|
if (module.hot) {
|
|
39
|
-
module.hot.dispose(function(data) {
|
|
51
|
+
module.hot.dispose(function (data) {
|
|
52
|
+
if (Refresh.hasUnrecoverableErrors()) {
|
|
53
|
+
window.location.reload();
|
|
54
|
+
}
|
|
55
|
+
|
|
40
56
|
data.prevExports = module.exports;
|
|
41
57
|
});
|
|
42
58
|
|
|
43
|
-
module.hot.accept(function(getParents) {
|
|
59
|
+
module.hot.accept(function (getParents) {
|
|
44
60
|
var prevExports = module.hot.data.prevExports;
|
|
45
61
|
var nextExports = module.exports;
|
|
46
62
|
// Since we just executed the code for it, it's possible
|
|
@@ -71,9 +87,6 @@ module.exports.postlude = function(module) {
|
|
|
71
87
|
enqueueUpdate();
|
|
72
88
|
});
|
|
73
89
|
}
|
|
74
|
-
if (Refresh.hasUnrecoverableErrors()) {
|
|
75
|
-
window.location.reload();
|
|
76
|
-
}
|
|
77
90
|
}
|
|
78
91
|
};
|
|
79
92
|
|
|
@@ -87,14 +100,15 @@ function isReactRefreshBoundary(exports) {
|
|
|
87
100
|
}
|
|
88
101
|
var hasExports = false;
|
|
89
102
|
var areAllExportsComponents = true;
|
|
103
|
+
let isESM = '__esModule' in exports;
|
|
90
104
|
for (var key in exports) {
|
|
91
105
|
hasExports = true;
|
|
92
106
|
if (key === '__esModule') {
|
|
93
107
|
continue;
|
|
94
108
|
}
|
|
95
109
|
var desc = Object.getOwnPropertyDescriptor(exports, key);
|
|
96
|
-
if (desc && desc.get) {
|
|
97
|
-
// Don't invoke getters as they may have side effects.
|
|
110
|
+
if (desc && desc.get && !isESM) {
|
|
111
|
+
// Don't invoke getters for CJS as they may have side effects.
|
|
98
112
|
return false;
|
|
99
113
|
}
|
|
100
114
|
var exportValue = exports[key];
|
|
@@ -128,12 +142,14 @@ function getRefreshBoundarySignature(exports) {
|
|
|
128
142
|
// (This is important for legacy environments.)
|
|
129
143
|
return signature;
|
|
130
144
|
}
|
|
145
|
+
let isESM = '__esModule' in exports;
|
|
131
146
|
for (var key in exports) {
|
|
132
147
|
if (key === '__esModule') {
|
|
133
148
|
continue;
|
|
134
149
|
}
|
|
135
150
|
var desc = Object.getOwnPropertyDescriptor(exports, key);
|
|
136
|
-
if (desc && desc.get) {
|
|
151
|
+
if (desc && desc.get && !isESM) {
|
|
152
|
+
// Don't invoke getters for CJS as they may have side effects.
|
|
137
153
|
continue;
|
|
138
154
|
}
|
|
139
155
|
var exportValue = exports[key];
|
|
@@ -152,10 +168,11 @@ function registerExportsForReactRefresh(module) {
|
|
|
152
168
|
// (This is important for legacy environments.)
|
|
153
169
|
return;
|
|
154
170
|
}
|
|
171
|
+
let isESM = '__esModule' in exports;
|
|
155
172
|
for (var key in exports) {
|
|
156
173
|
var desc = Object.getOwnPropertyDescriptor(exports, key);
|
|
157
|
-
if (desc && desc.get) {
|
|
158
|
-
// Don't invoke getters as they may have side effects.
|
|
174
|
+
if (desc && desc.get && !isESM) {
|
|
175
|
+
// Don't invoke getters for CJS as they may have side effects.
|
|
159
176
|
continue;
|
|
160
177
|
}
|
|
161
178
|
var exportValue = exports[key];
|