@rws-framework/client
Version:
This package provides the core client-side framework for Realtime Web Suit (RWS), enabling modular, asynchronous web components, state management, and integration with backend services. It is located in `.dev/client`.
49 lines (38 loc) • 2.16 kB
text/typescript
import { Key } from '../_container';
import RWSViewComponent, { IWithCompose } from '../_component';
import { loadDep, getFunctionParamNames } from './_di';
import TheRWSService from '../../services/_service';
import { handleExternalChange } from '../_attrs/_external_handler';
type InjectDecoratorReturnType = (target: any, key?: string | number | undefined, parameterIndex?: number) => void;
type TargetType = any;
function addToComponentInjection(targetComponentName: string, constructor: any, depKey: string, dependencyClass: Key, isDefaultService: boolean = false){
if(isDefaultService){
targetComponentName = '_all';
}
if(!Object.keys(constructor._depKeys).includes(targetComponentName)){
constructor._depKeys = { [targetComponentName]: [] };
}
if(!constructor._depKeys[targetComponentName].includes(depKey)){
constructor._depKeys[targetComponentName].push(depKey);
}
if(!Object.keys(constructor._toInject).includes(depKey)){
const loadedDependency = loadDep<TheRWSService>(dependencyClass);
constructor._toInject[depKey] = loadedDependency;
}
}
function RWSInject<T extends RWSViewComponent>(dependencyClass: Key, defaultService: boolean = false): InjectDecoratorReturnType {
return (target: IWithCompose<T>, key?: keyof IWithCompose<T>, parameterIndex?: number) => {
if(key){
const targetConstructor = typeof target === 'function' ? target : (target as any).constructor;
addToComponentInjection(targetConstructor.name, targetConstructor, key as string, dependencyClass, defaultService);
} else{
const targetConstructor = (target as any).prototype.constructor;
const paramNames = getFunctionParamNames(targetConstructor);
const depKey = paramNames[parameterIndex];
addToComponentInjection(targetConstructor.name, targetConstructor, depKey, dependencyClass, defaultService);
}
};
}
export {
RWSInject
};