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
32import type { IDisposable } from "./disposable";
import type { TrackedModule } from "./HotReloadService";
export const moduleSource = new WeakMap<object | Function, { module: TrackedModule, exportName: string }>();
export function hotReloadExportedItem<T>(exportedItem: T, handleExportedItem: (exportedItem: T) => IDisposable | undefined): IDisposable {
const source = moduleSource.get(exportedItem as object | Function);
if (!source) {
const v = handleExportedItem(exportedItem);
return { dispose: () => { v?.dispose(); } };
}
let curDisposable = handleExportedItem(exportedItem);
const updateStrategy = source.module.registerUpdateStrategy({
applyUpdate: _changeInfo => {
source.module.reload();
const newValue = source.module.exports[source.exportName] as any;
curDisposable?.dispose();
curDisposable = handleExportedItem(newValue);
return true;
}
});
return {
dispose: () => {
curDisposable?.dispose();
updateStrategy.dispose();
}
};
}