Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/base/common/hotReloadHelpers.ts
5241 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
// eslint-disable-next-line local/code-no-any-casts
40
const id = (clazz as any).name;
41
42
let existing = classes.get(id);
43
if (!existing) {
44
existing = observableValue(id, clazz);
45
classes.set(id, existing);
46
} else {
47
setTimeout(() => {
48
existing!.set(clazz, undefined);
49
}, 0);
50
}
51
return existing as IObservable<T>;
52
}
53
54