123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- /**
- * @typedef ModuleRuntimeOptions {Object}
- * @property {boolean} const Use ES6 `const` and `let` in generated runtime code.
- * @property {'cjs' | 'esm'} moduleSystem The module system to be used.
- */
- /**
- * Generates code appended to each JS-like module for react-refresh capabilities.
- *
- * `__react_refresh_utils__` will be replaced with actual utils during source parsing by `webpack.ProvidePlugin`.
- *
- * [Reference for Runtime Injection](https://github.com/webpack/webpack/blob/b07d3b67d2252f08e4bb65d354a11c9b69f8b434/lib/HotModuleReplacementPlugin.js#L419)
- * [Reference for HMR Error Recovery](https://github.com/webpack/webpack/issues/418#issuecomment-490296365)
- *
- * @param {import('webpack').Template} Webpack's templating helpers.
- * @param {ModuleRuntimeOptions} options The refresh module runtime options.
- * @returns {string} The refresh module runtime template.
- */
- function getRefreshModuleRuntime(Template, options) {
- const constDeclaration = options.const ? 'const' : 'var';
- const letDeclaration = options.const ? 'let' : 'var';
- const webpackHot = options.moduleSystem === 'esm' ? 'import.meta.webpackHot' : 'module.hot';
- return Template.asString([
- `${constDeclaration} $ReactRefreshModuleId$ = __webpack_require__.$Refresh$.moduleId;`,
- `${constDeclaration} $ReactRefreshCurrentExports$ = __react_refresh_utils__.getModuleExports(`,
- Template.indent('$ReactRefreshModuleId$'),
- ');',
- '',
- 'function $ReactRefreshModuleRuntime$(exports) {',
- Template.indent([
- `if (${webpackHot}) {`,
- Template.indent([
- `${letDeclaration} errorOverlay;`,
- "if (typeof __react_refresh_error_overlay__ !== 'undefined') {",
- Template.indent('errorOverlay = __react_refresh_error_overlay__;'),
- '}',
- `${letDeclaration} testMode;`,
- "if (typeof __react_refresh_test__ !== 'undefined') {",
- Template.indent('testMode = __react_refresh_test__;'),
- '}',
- 'return __react_refresh_utils__.executeRuntime(',
- Template.indent([
- 'exports,',
- '$ReactRefreshModuleId$,',
- `${webpackHot},`,
- 'errorOverlay,',
- 'testMode',
- ]),
- ');',
- ]),
- '}',
- ]),
- '}',
- '',
- "if (typeof Promise !== 'undefined' && $ReactRefreshCurrentExports$ instanceof Promise) {",
- Template.indent('$ReactRefreshCurrentExports$.then($ReactRefreshModuleRuntime$);'),
- '} else {',
- Template.indent('$ReactRefreshModuleRuntime$($ReactRefreshCurrentExports$);'),
- '}',
- ]);
- }
- module.exports = getRefreshModuleRuntime;
|