@cfcs/core
Version:
Write once, create framework components that supports React, Vue, Svelte, and more.
56 lines (45 loc) • 1.44 kB
text/typescript
/**
* cfcs
* Copyright (c) 2022-present NAVER Corp.
* MIT license
*/
import {
CFCS_DETECTED_DEPENDENCIES,
CFCS_DETECTED_DEPENDENCIES_VERSION,
} from "./const";
import { Observer } from "./Observer";
export interface Detected {
host: Observer<any>;
observers: Array<Observer<any>>;
push(observer: Observer<any>): void;
}
export function getDetectedStack(): Array<Detected> {
// Version issues do not occur when you access the native object in the global.
(Object as any)[CFCS_DETECTED_DEPENDENCIES] = (Object as any)[CFCS_DETECTED_DEPENDENCIES] || {};
const versionList = (Object as any)[CFCS_DETECTED_DEPENDENCIES];
versionList[CFCS_DETECTED_DEPENDENCIES_VERSION] = versionList[CFCS_DETECTED_DEPENDENCIES_VERSION] || [];
return versionList[CFCS_DETECTED_DEPENDENCIES_VERSION];
}
export function getCurrentDetected(): Detected | undefined {
const stack = getDetectedStack();
return stack[stack.length - 1];
}
export function detectDependencies(host: Observer<any>) {
const stack = getDetectedStack();
const observers: Array<Observer> = [];
const detected: Detected = {
host,
observers,
push(observer: Observer<any>) {
if (host !== observer && observers.indexOf(observer) === -1) {
observers.push(observer);
}
},
};
stack.push(detected);
return detected;
}
export function endDetectDependencies() {
const stack = getDetectedStack();
return stack.pop();
}