Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/base/common/hotReloadHelpers.ts
3291 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { isHotReloadEnabled, registerHotReloadHandler } from './hotReload.js';
7
import { constObservable, IObservable, IReader, ISettableObservable, observableSignalFromEvent, observableValue } from './observable.js';
8
9
export function readHotReloadableExport<T>(value: T, reader: IReader | undefined): T {
10
observeHotReloadableExports([value], reader);
11
return value;
12
}
13
14
export function observeHotReloadableExports(values: any[], reader: IReader | undefined): void {
15
if (isHotReloadEnabled()) {
16
const o = observableSignalFromEvent(
17
'reload',
18
event => registerHotReloadHandler(({ oldExports }) => {
19
if (![...Object.values(oldExports)].some(v => values.includes(v))) {
20
return undefined;
21
}
22
return (_newExports) => {
23
event(undefined);
24
return true;
25
};
26
})
27
);
28
o.read(reader);
29
}
30
}
31
32
const classes = new Map<string, ISettableObservable<unknown>>();
33
34
export function createHotClass<T>(clazz: T): IObservable<T> {
35
if (!isHotReloadEnabled()) {
36
return constObservable(clazz);
37
}
38
39
const id = (clazz as any).name;
40
41
let existing = classes.get(id);
42
if (!existing) {
43
existing = observableValue(id, clazz);
44
classes.set(id, existing);
45
} else {
46
setTimeout(() => {
47
existing!.set(clazz, undefined);
48
}, 0);
49
}
50
return existing as IObservable<T>;
51
}
52
53