Files
esengine/packages/editor-runtime/src/PluginAPI.ts

110 lines
2.5 KiB
TypeScript
Raw Normal View History

/**
* Plugin API - 访
*
* 使
* ```typescript
* import { PluginAPI } from '@esengine/editor-runtime';
*
* const scene = PluginAPI.scene;
* const entityStore = PluginAPI.entityStore;
* const messageHub = PluginAPI.messageHub;
* ```
*
* API __ESENGINE__
*
*/
import type { EntityStoreService, MessageHub } from '@esengine/editor-core';
import type { Scene, ServiceContainer } from '@esengine/ecs-framework';
// 内部 API 接口定义
interface IPluginAPIInternal {
getScene(): Scene | null;
getEntityStore(): EntityStoreService;
getMessageHub(): MessageHub;
resolveService<T>(serviceType: any): T;
getCore(): any;
}
// 声明全局类型
declare global {
interface Window {
__ESENGINE__?: {
api?: IPluginAPIInternal;
[key: string]: any;
};
}
}
/**
* API
*/
function getInternalAPI(): IPluginAPIInternal {
const api = window.__ESENGINE__?.api;
if (!api) {
throw new Error('[PluginAPI] 插件 API 未初始化,请确保编辑器已正确启动');
}
return api;
}
/**
* API
* 访
*/
export const PluginAPI = {
/**
*
* @throws
*/
get scene(): Scene {
const scene = getInternalAPI().getScene();
if (!scene) {
throw new Error('[PluginAPI] 场景未初始化,请先打开或创建一个场景');
}
return scene;
},
/**
* null
*/
get sceneOrNull(): Scene | null {
return getInternalAPI().getScene();
},
/**
* EntityStoreService
*/
get entityStore(): EntityStoreService {
return getInternalAPI().getEntityStore();
},
/**
* MessageHub
*/
get messageHub(): MessageHub {
return getInternalAPI().getMessageHub();
},
/**
*
*/
get services(): ServiceContainer {
return getInternalAPI().getCore().services;
},
/**
*
* @param serviceType
*/
resolve<T>(serviceType: any): T {
return getInternalAPI().resolveService<T>(serviceType);
},
/**
* API
*/
get isAvailable(): boolean {
return !!window.__ESENGINE__?.api;
},
};