49 lines
1.2 KiB
TypeScript
49 lines
1.2 KiB
TypeScript
declare global {
|
|
interface Window {
|
|
lockedGlobals?: Record<string, boolean>;
|
|
}
|
|
}
|
|
|
|
export const cleanUpGlobals = (globals: string[]): void =>
|
|
globals.forEach((globalKey) => {
|
|
const resetKey = (): void => {
|
|
Object.assign(window, { [globalKey]: undefined });
|
|
};
|
|
|
|
if (globalKey in window) {
|
|
try {
|
|
delete (window as never)[globalKey];
|
|
} finally {
|
|
resetKey();
|
|
}
|
|
}
|
|
});
|
|
|
|
const addGlobalLock = (key: string): void => {
|
|
let currentValue: unknown;
|
|
|
|
Object.defineProperty(window, key, <PropertyDescriptor>{
|
|
get() {
|
|
return window.lockedGlobals?.[key] ? undefined : currentValue;
|
|
},
|
|
set(value: unknown) {
|
|
if (!window.lockedGlobals?.[key]) currentValue = value;
|
|
},
|
|
});
|
|
};
|
|
|
|
const setGlobalLock = (key: string, locked: boolean): void => {
|
|
window.lockedGlobals = {
|
|
...window.lockedGlobals,
|
|
[key]: locked,
|
|
};
|
|
};
|
|
|
|
export const lockGlobal = (key: string): void => setGlobalLock(key, true);
|
|
|
|
export const unlockGlobal = (key: string): void => {
|
|
if (!Object.getOwnPropertyDescriptor(window, key)) addGlobalLock(key);
|
|
|
|
setGlobalLock(key, false);
|
|
};
|