mirror of
https://github.com/neocities/neocities.git
synced 2025-05-02 04:58:01 +02:00
81 lines
3.2 KiB
JavaScript
81 lines
3.2 KiB
JavaScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
import { env } from './process.js';
|
|
export function isHotReloadEnabled() {
|
|
return env && !!env['VSCODE_DEV'];
|
|
}
|
|
export function registerHotReloadHandler(handler) {
|
|
if (!isHotReloadEnabled()) {
|
|
return { dispose() { } };
|
|
}
|
|
else {
|
|
const handlers = registerGlobalHotReloadHandler();
|
|
handlers.add(handler);
|
|
return {
|
|
dispose() { handlers.delete(handler); }
|
|
};
|
|
}
|
|
}
|
|
function registerGlobalHotReloadHandler() {
|
|
if (!hotReloadHandlers) {
|
|
hotReloadHandlers = new Set();
|
|
}
|
|
const g = globalThis;
|
|
if (!g.$hotReload_applyNewExports) {
|
|
g.$hotReload_applyNewExports = args => {
|
|
const args2 = { config: { mode: undefined }, ...args };
|
|
const results = [];
|
|
for (const h of hotReloadHandlers) {
|
|
const result = h(args2);
|
|
if (result) {
|
|
results.push(result);
|
|
}
|
|
}
|
|
if (results.length > 0) {
|
|
return newExports => {
|
|
let result = false;
|
|
for (const r of results) {
|
|
if (r(newExports)) {
|
|
result = true;
|
|
}
|
|
}
|
|
return result;
|
|
};
|
|
}
|
|
return undefined;
|
|
};
|
|
}
|
|
return hotReloadHandlers;
|
|
}
|
|
let hotReloadHandlers = undefined;
|
|
if (isHotReloadEnabled()) {
|
|
// This code does not run in production.
|
|
registerHotReloadHandler(({ oldExports, newSrc, config }) => {
|
|
if (config.mode !== 'patch-prototype') {
|
|
return undefined;
|
|
}
|
|
return newExports => {
|
|
for (const key in newExports) {
|
|
const exportedItem = newExports[key];
|
|
console.log(`[hot-reload] Patching prototype methods of '${key}'`, { exportedItem });
|
|
if (typeof exportedItem === 'function' && exportedItem.prototype) {
|
|
const oldExportedItem = oldExports[key];
|
|
if (oldExportedItem) {
|
|
for (const prop of Object.getOwnPropertyNames(exportedItem.prototype)) {
|
|
const descriptor = Object.getOwnPropertyDescriptor(exportedItem.prototype, prop);
|
|
const oldDescriptor = Object.getOwnPropertyDescriptor(oldExportedItem.prototype, prop);
|
|
if (descriptor?.value?.toString() !== oldDescriptor?.value?.toString()) {
|
|
console.log(`[hot-reload] Patching prototype method '${key}.${prop}'`);
|
|
}
|
|
Object.defineProperty(oldExportedItem.prototype, prop, descriptor);
|
|
}
|
|
newExports[key] = oldExportedItem;
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
};
|
|
});
|
|
}
|