@zenithcore/sdk
Version:
Developer-friendly SDK for ZenithKernel applications
169 lines (142 loc) • 4.47 kB
text/typescript
/**
* AppManager
*
* Provides a clean abstraction over ZenithKernel's ECS system
* with developer-friendly methods for component registration and entity management.
*/
import type { ECSManager } from '@zenithkernel/core/core/ECSManager';
import type { Entity } from '@zenithkernel/core/core/Entity';
/**
* Component registration options
*/
export interface ComponentOptions {
/**
* Serializable properties that should be included in saved state
*/
serializable?: string[];
/**
* Default values for the component
*/
defaults?: Record<string, any>;
/**
* Whether component updates should trigger reactivity
*/
reactive?: boolean;
}
/**
* AppManager provides a simplified interface to the ECS manager
*/
export class AppManager {
private ecs: ECSManager;
private componentRegistry: Map<string, any> = new Map();
/**
* Create a new AppManager instance
*/
constructor(ecsManager: ECSManager) {
this.ecs = ecsManager;
}
/**
* Register a component type with the system
*/
registerComponent(componentType: any, componentName: string, options: ComponentOptions = {}): void {
// Store in our local registry
this.componentRegistry.set(componentName, {
type: componentType,
options
});
// Register with the ECS system
// Note: This abstraction handles potential API differences in the underlying ECS system
if (typeof this.ecs.registerComponentType === 'function') {
this.ecs.registerComponentType(componentType, componentName);
} else if (typeof this.ecs.registerComponent === 'function') {
this.ecs.registerComponent(componentName, componentType);
} else {
console.error(`[AppManager] Could not register component: ${componentName} - missing registration method`);
}
}
/**
* Create a new entity
*/
createEntity(components: Record<string, any> = {}): string {
const entity = this.ecs.createEntity();
// Add any initial components
for (const [componentName, componentData] of Object.entries(components)) {
this.addComponent(entity.id, componentName, componentData);
}
return entity.id;
}
/**
* Add a component to an entity
*/
addComponent(entityId: string, componentName: string, data: any = {}): void {
const entity = this.getEntityById(entityId);
if (!entity) return;
// Get registered component info
const registration = this.componentRegistry.get(componentName);
if (!registration) {
console.error(`[AppManager] Component type not registered: ${componentName}`);
return;
}
// Merge with defaults if available
const mergedData = {
...(registration.options.defaults || {}),
...data
};
// Add component to entity
this.ecs.addComponent(entity, componentName, mergedData);
}
/**
* Get a component from an entity
*/
getComponent(entityId: string, componentName: string): any | null {
const entity = this.getEntityById(entityId);
if (!entity) return null;
return this.ecs.getComponent(entity, componentName);
}
/**
* Update a component's data
*/
updateComponent(entityId: string, componentName: string, data: any): void {
const component = this.getComponent(entityId, componentName);
if (!component) return;
// Apply updates to the component
Object.assign(component, data);
}
/**
* Remove a component from an entity
*/
removeComponent(entityId: string, componentName: string): void {
const entity = this.getEntityById(entityId);
if (!entity) return;
this.ecs.removeComponent(entity, componentName);
}
/**
* Get an entity by ID
*/
getEntityById(entityId: string | Entity): Entity | null {
if (typeof entityId === 'object') {
return entityId;
}
return this.ecs.getEntityById(entityId);
}
/**
* Delete an entity
*/
deleteEntity(entityId: string): void {
const entity = this.getEntityById(entityId);
if (!entity) return;
this.ecs.removeEntity(entity);
}
/**
* Get all entities with a specific component
*/
getEntitiesWith(componentName: string): Entity[] {
return this.ecs.getEntitiesWith(componentName);
}
/**
* Query entities based on component requirements
*/
queryEntities(required: string[] = [], exclude: string[] = []): Entity[] {
return this.ecs.query(required, exclude);
}
}