๐Ÿ“ฆ hediet / node-reload

๐Ÿ“„ hotReloadExportedItem.ts ยท 32 lines
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();
        }
    };
}