UNPKG

next

Version:

The React Framework

150 lines (148 loc) • 8.24 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "TurbopackHmr", { enumerable: true, get: function() { return TurbopackHmr; } }); const _class_private_field_loose_base = require("@swc/helpers/_/_class_private_field_loose_base"); const _class_private_field_loose_key = require("@swc/helpers/_/_class_private_field_loose_key"); // How long to wait before reporting the HMR start, used to suppress irrelevant // `BUILDING` events. Does not impact reported latency. const TURBOPACK_HMR_START_DELAY_MS = 100; var _updatedModules = /*#__PURE__*/ _class_private_field_loose_key._("_updatedModules"), _startMsSinceEpoch = /*#__PURE__*/ _class_private_field_loose_key._("_startMsSinceEpoch"), _lastUpdateMsSinceEpoch = /*#__PURE__*/ _class_private_field_loose_key._("_lastUpdateMsSinceEpoch"), _deferredReportHmrStartId = /*#__PURE__*/ _class_private_field_loose_key._("_deferredReportHmrStartId"), // HACK: Turbopack tends to generate a lot of irrelevant "BUILDING" actions, // as it reports *any* compilation, including fully no-op/cached compilations // and those unrelated to HMR. Fixing this would require significant // architectural changes. // // Work around this by deferring any "rebuilding" message by 100ms. If we get // a BUILT event within that threshold and nothing has changed, just suppress // the message entirely. _runDeferredReportHmrStart = /*#__PURE__*/ _class_private_field_loose_key._("_runDeferredReportHmrStart"), _cancelDeferredReportHmrStart = /*#__PURE__*/ _class_private_field_loose_key._("_cancelDeferredReportHmrStart"), /** Helper for other `onEvent` methods. */ _onUpdate = /*#__PURE__*/ _class_private_field_loose_key._("_onUpdate"); class TurbopackHmr { onBuilding() { _class_private_field_loose_base._(this, _lastUpdateMsSinceEpoch)[_lastUpdateMsSinceEpoch] = undefined; _class_private_field_loose_base._(this, _cancelDeferredReportHmrStart)[_cancelDeferredReportHmrStart](); _class_private_field_loose_base._(this, _startMsSinceEpoch)[_startMsSinceEpoch] = Date.now(); // report the HMR start after a short delay _class_private_field_loose_base._(this, _deferredReportHmrStartId)[_deferredReportHmrStartId] = setTimeout(()=>_class_private_field_loose_base._(this, _runDeferredReportHmrStart)[_runDeferredReportHmrStart](), // debugging feature: don't defer/suppress noisy no-op HMR update messages self.__NEXT_HMR_TURBOPACK_REPORT_NOISY_NOOP_EVENTS ? 0 : TURBOPACK_HMR_START_DELAY_MS); } onTurbopackMessage(msg) { _class_private_field_loose_base._(this, _onUpdate)[_onUpdate](); const updatedModules = extractModulesFromTurbopackMessage(msg.data); for (const module of updatedModules){ _class_private_field_loose_base._(this, _updatedModules)[_updatedModules].add(module); } } onServerComponentChanges() { _class_private_field_loose_base._(this, _onUpdate)[_onUpdate](); } onReloadPage() { _class_private_field_loose_base._(this, _onUpdate)[_onUpdate](); } onPageAddRemove() { _class_private_field_loose_base._(this, _onUpdate)[_onUpdate](); } /** * @returns `null` if the caller should ignore the update entirely. Returns an * object with `hasUpdates: false` if the caller should report the end of * the HMR in the browser console, but the HMR was a no-op. */ onBuilt() { // Check that we got *any* `TurbopackMessageAction`, even if // `updatedModules` is empty (not everything gets recorded there). // // There's also a case where `onBuilt` gets called before `onBuilding`, // which can happen during initial page load. Ignore that too! const hasUpdates = _class_private_field_loose_base._(this, _lastUpdateMsSinceEpoch)[_lastUpdateMsSinceEpoch] != null && _class_private_field_loose_base._(this, _startMsSinceEpoch)[_startMsSinceEpoch] != null; if (!hasUpdates && _class_private_field_loose_base._(this, _deferredReportHmrStartId)[_deferredReportHmrStartId] != null) { // suppress the update entirely _class_private_field_loose_base._(this, _cancelDeferredReportHmrStart)[_cancelDeferredReportHmrStart](); return null; } _class_private_field_loose_base._(this, _runDeferredReportHmrStart)[_runDeferredReportHmrStart](); var _class_private_field_loose_base__lastUpdateMsSinceEpoch; const result = { hasUpdates, updatedModules: _class_private_field_loose_base._(this, _updatedModules)[_updatedModules], startMsSinceEpoch: _class_private_field_loose_base._(this, _startMsSinceEpoch)[_startMsSinceEpoch], endMsSinceEpoch: (_class_private_field_loose_base__lastUpdateMsSinceEpoch = _class_private_field_loose_base._(this, _lastUpdateMsSinceEpoch)[_lastUpdateMsSinceEpoch]) != null ? _class_private_field_loose_base__lastUpdateMsSinceEpoch : Date.now() }; _class_private_field_loose_base._(this, _updatedModules)[_updatedModules] = new Set(); return result; } constructor(){ Object.defineProperty(this, _runDeferredReportHmrStart, { value: runDeferredReportHmrStart }); Object.defineProperty(this, _cancelDeferredReportHmrStart, { value: cancelDeferredReportHmrStart }); Object.defineProperty(this, _onUpdate, { value: onUpdate }); Object.defineProperty(this, _updatedModules, { writable: true, value: void 0 }); Object.defineProperty(this, _startMsSinceEpoch, { writable: true, value: void 0 }); Object.defineProperty(this, _lastUpdateMsSinceEpoch, { writable: true, value: void 0 }); Object.defineProperty(this, _deferredReportHmrStartId, { writable: true, value: void 0 }); _class_private_field_loose_base._(this, _updatedModules)[_updatedModules] = new Set(); } } function runDeferredReportHmrStart() { if (_class_private_field_loose_base._(this, _deferredReportHmrStartId)[_deferredReportHmrStartId] != null) { console.log('[Fast Refresh] rebuilding'); _class_private_field_loose_base._(this, _cancelDeferredReportHmrStart)[_cancelDeferredReportHmrStart](); } } function cancelDeferredReportHmrStart() { clearTimeout(_class_private_field_loose_base._(this, _deferredReportHmrStartId)[_deferredReportHmrStartId]); _class_private_field_loose_base._(this, _deferredReportHmrStartId)[_deferredReportHmrStartId] = undefined; } function onUpdate() { _class_private_field_loose_base._(this, _runDeferredReportHmrStart)[_runDeferredReportHmrStart](); _class_private_field_loose_base._(this, _lastUpdateMsSinceEpoch)[_lastUpdateMsSinceEpoch] = Date.now(); } function extractModulesFromTurbopackMessage(data) { const updatedModules = new Set(); const updates = Array.isArray(data) ? data : [ data ]; for (const update of updates){ // TODO this won't capture changes to CSS since they don't result in a "merged" update if (update.type !== 'partial' || update.instruction.type !== 'ChunkListUpdate' || update.instruction.merged === undefined) { continue; } for (const mergedUpdate of update.instruction.merged){ for (const name of Object.keys(mergedUpdate.entries)){ const res = /(.*)\s+\[.*/.exec(name); if (res === null) { console.error('[Turbopack HMR] Expected module to match pattern: ' + name); continue; } updatedModules.add(res[1]); } } } return updatedModules; } if ((typeof exports.default === 'function' || (typeof exports.default === 'object' && exports.default !== null)) && typeof exports.default.__esModule === 'undefined') { Object.defineProperty(exports.default, '__esModule', { value: true }); Object.assign(exports.default, exports); module.exports = exports.default; } //# sourceMappingURL=turbopack-hot-reloader-common.js.map