/
createRefreshTemplate.js
50 lines (42 loc) · 1.3 KB
/
createRefreshTemplate.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
const { Template } = require('webpack');
/**
* Code to run before each module, sets up react-refresh.
*
* `module.i` is injected by Webpack and should always exist.
*
* [Ref](https://github.com/webpack/webpack/blob/master/lib/MainTemplate.js#L233)
*/
const beforeModule = `
let cleanup = function NoOp() {};
if (window && window.$RefreshSetup$) {
cleanup = window.$RefreshSetup$(module.i);
}
try {
`;
/** Code to run after each module, sets up react-refresh */
const afterModule = `
} finally {
cleanup();
}
`;
/**
* Creates a module wrapped by a refresh template.
* @param {string} source The source code of a module.
* @param {import('webpack').compilation.Chunk} chunk A Webpack chunk.
* @returns {string} A refresh-wrapped module.
*/
function createRefreshTemplate(source, chunk) {
const lines = source.split('\n');
// Webpack generates this line whenever the mainTemplate is called
const moduleInitializationLineNumber = lines.findIndex(line =>
line.startsWith('modules[moduleId].call')
);
return Template.asString([
...lines.slice(0, moduleInitializationLineNumber),
beforeModule,
Template.indent(lines[moduleInitializationLineNumber]),
afterModule,
...lines.slice(moduleInitializationLineNumber + 1, lines.length),
]);
}
module.exports = createRefreshTemplate;