Path: blob/main/src/vs/base/common/hotReloadHelpers.ts
3291 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}3738const id = (clazz as any).name;3940let existing = classes.get(id);41if (!existing) {42existing = observableValue(id, clazz);43classes.set(id, existing);44} else {45setTimeout(() => {46existing!.set(clazz, undefined);47}, 0);48}49return existing as IObservable<T>;50}515253