Path: blob/main/src/vs/base/common/hotReloadHelpers.ts
5241 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { isHotReloadEnabled, registerHotReloadHandler } from './hotReload.js';6import { constObservable, IObservable, IReader, ISettableObservable, observableSignalFromEvent, observableValue } from './observable.js';78export function readHotReloadableExport<T>(value: T, reader: IReader | undefined): T {9observeHotReloadableExports([value], reader);10return value;11}1213export function observeHotReloadableExports(values: any[], reader: IReader | undefined): void {14if (isHotReloadEnabled()) {15const o = observableSignalFromEvent(16'reload',17event => registerHotReloadHandler(({ oldExports }) => {18if (![...Object.values(oldExports)].some(v => values.includes(v))) {19return undefined;20}21return (_newExports) => {22event(undefined);23return true;24};25})26);27o.read(reader);28}29}3031const classes = new Map<string, ISettableObservable<unknown>>();3233export function createHotClass<T>(clazz: T): IObservable<T> {34if (!isHotReloadEnabled()) {35return constObservable(clazz);36}3738// eslint-disable-next-line local/code-no-any-casts39const id = (clazz as any).name;4041let existing = classes.get(id);42if (!existing) {43existing = observableValue(id, clazz);44classes.set(id, existing);45} else {46setTimeout(() => {47existing!.set(clazz, undefined);48}, 0);49}50return existing as IObservable<T>;51}525354