@telcomdataperu/zeus-vue-model-manager
Version:
Vue 3 Model Manager for Microfrontends with OpenUI5-style API - Part of ZEUS Platform by TelcomdataPeru
107 lines (106 loc) • 3.41 kB
TypeScript
import { ComputedRef, WatchStopHandle } from 'vue';
export type ModelPath = string;
export type ModelData = Record<string, unknown>;
export interface JsonModelOptions {
enableLogging?: boolean;
enableValidation?: boolean;
immutable?: boolean;
pathSeparator?: string;
defaultValues?: ModelData;
}
export interface ModelManagerConfig {
scope: string;
security?: {
level: 'basic' | 'standard' | 'enterprise';
};
audit?: {
enabled: boolean;
};
}
export interface ModelConfig {
enableLogging?: boolean;
enableSecurity?: boolean;
namespace?: 'private' | 'shared' | 'global';
}
export interface ModelChangeEvent<T = unknown> {
path: ModelPath;
oldValue: T;
newValue: T;
timestamp: number;
source: 'user' | 'system' | 'api';
}
export interface JsonModelBinding<T = unknown> {
value: ComputedRef<T>;
setValue: (newValue: T) => void;
reset: () => void;
isValid: ComputedRef<boolean>;
errors: ComputedRef<string[]>;
}
export interface JsonModelEvents {
'property-changed': ModelChangeEvent;
'validation-error': {
path: ModelPath;
errors: string[];
};
'model-reset': {
timestamp: number;
};
'array-changed': {
path: ModelPath;
action: 'add' | 'remove' | 'update';
index?: number;
item?: unknown;
};
}
export interface ValidationRule<T = unknown> {
validate: (value: T) => boolean | string;
message?: string;
async?: boolean;
}
export interface ModelValidator {
rules: Record<ModelPath, ValidationRule[]>;
validatePath: (path: ModelPath, value: unknown) => string[];
validateAll: () => Record<ModelPath, string[]>;
}
export interface ModelMetadata {
version: string;
created: Date;
lastModified: Date;
changeCount: number;
paths: ModelPath[];
size: number;
}
export interface ModelWatchOptions {
immediate?: boolean;
deep?: boolean;
flush?: 'pre' | 'post' | 'sync';
}
export interface IJsonModel<T = ModelData> {
getData(): T;
getProperty(path: ModelPath): unknown;
setProperty(path: ModelPath, value: unknown): void;
updateProperties(updates: Record<ModelPath, unknown>): void;
createBinding<R = unknown>(path: ModelPath): ComputedRef<R>;
addToArray(path: ModelPath, item: unknown): void;
removeFromArray(path: ModelPath, index: number): void;
updateArrayItem(path: ModelPath, predicate: (item: any, index: number) => boolean, updates: Record<string, unknown>): boolean;
hasProperty(path: ModelPath): boolean;
getArrayLength(path: ModelPath): number;
getObjectKeys(path: ModelPath): string[];
toJSON(): string;
fromJSON(jsonString: string): void;
clone(): IJsonModel<T>;
watch(path: ModelPath, callback: (newValue: unknown, oldValue: unknown) => void, options?: ModelWatchOptions): WatchStopHandle;
addValidator(path: ModelPath, rule: ValidationRule): void;
removeValidator(path: ModelPath): void;
validate(path?: ModelPath): boolean;
getErrors(path?: ModelPath): string[];
getMetadata(): ModelMetadata;
reset(paths?: ModelPath[]): void;
destroy(): void;
}
export interface ModelFactory<T = ModelData> {
create(initialData: T, options?: JsonModelOptions): IJsonModel<T>;
createFromSchema(schema: any): IJsonModel<T>;
createFromUI5Model(ui5Model: any): IJsonModel<T>;
}