@flowgram-vue/core 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/LICENSE +22 -0
  2. package/dist/index.cjs +0 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.d.ts +1 -0
  5. package/dist/index.js +0 -0
  6. package/dist/index.js.map +1 -0
  7. package/package.json +63 -0
  8. package/src/common/config-entity.ts +80 -0
  9. package/src/common/entity-data.ts +171 -0
  10. package/src/common/entity-manager-contribution.ts +12 -0
  11. package/src/common/entity-manager.ts +475 -0
  12. package/src/common/entity.ts +482 -0
  13. package/src/common/index.ts +22 -0
  14. package/src/common/playground-context.ts +35 -0
  15. package/src/common/playground-decorator-helper.ts +113 -0
  16. package/src/common/playground-decorators.ts +85 -0
  17. package/src/common/playground-schedule.ts +30 -0
  18. package/src/common/protect-wheel-area.ts +11 -0
  19. package/src/common/schema/index.ts +14 -0
  20. package/src/common/schema/node.ts +15 -0
  21. package/src/common/schema/opacity-schema.ts +19 -0
  22. package/src/common/schema/origin-schema.ts +35 -0
  23. package/src/common/schema/position-schema.ts +35 -0
  24. package/src/common/schema/rotation-schema.ts +19 -0
  25. package/src/common/schema/scale-schema.ts +35 -0
  26. package/src/common/schema/size-schema.ts +42 -0
  27. package/src/common/schema/skew-schema.ts +35 -0
  28. package/src/common/schema/transform-schema.ts +613 -0
  29. package/src/common/utils/bounds.spec.ts +229 -0
  30. package/src/common/utils/bounds.ts +176 -0
  31. package/src/common/utils/index.ts +6 -0
  32. package/src/composables/index.ts +16 -0
  33. package/src/composables/use-config-entity.ts +31 -0
  34. package/src/composables/use-entities.ts +26 -0
  35. package/src/composables/use-entity-data-from-context.ts +34 -0
  36. package/src/composables/use-entity-from-context.ts +31 -0
  37. package/src/composables/use-listen-events.ts +22 -0
  38. package/src/composables/use-playground-container.ts +16 -0
  39. package/src/composables/use-playground-context.ts +15 -0
  40. package/src/composables/use-playground-drag.ts +31 -0
  41. package/src/composables/use-playground.ts +16 -0
  42. package/src/composables/use-refresh.ts +6 -0
  43. package/src/composables/use-service.ts +17 -0
  44. package/src/core/index.ts +8 -0
  45. package/src/core/layer/config/editor-state-config-entity.ts +180 -0
  46. package/src/core/layer/config/index.ts +7 -0
  47. package/src/core/layer/config/playground-config-entity.ts +604 -0
  48. package/src/core/layer/index.ts +8 -0
  49. package/src/core/layer/layer.ts +248 -0
  50. package/src/core/layer/playground-layer.ts +547 -0
  51. package/src/core/pipeline/index.ts +10 -0
  52. package/src/core/pipeline/pipeline-entities-selector.ts +200 -0
  53. package/src/core/pipeline/pipeline-entities.ts +230 -0
  54. package/src/core/pipeline/pipeline-registry.ts +344 -0
  55. package/src/core/pipeline/pipeline-renderer.ts +248 -0
  56. package/src/core/pipeline/pipeline-vue-utils.ts +96 -0
  57. package/src/core/pipeline/pipeline.ts +28 -0
  58. package/src/core/utils/index.ts +12 -0
  59. package/src/core/utils/inject-provider-decorators.ts +27 -0
  60. package/src/core/utils/lazy-inject-decorators.ts +38 -0
  61. package/src/core/utils/mouse-touch-event.ts +120 -0
  62. package/src/core/utils/playground-drag.ts +511 -0
  63. package/src/core/utils/playground-gesture.spec.ts +135 -0
  64. package/src/core/utils/playground-gesture.ts +118 -0
  65. package/src/core/utils/tween.ts +156 -0
  66. package/src/core/utils/use-gesture/core/Controller.ts +212 -0
  67. package/src/core/utils/use-gesture/core/EventStore.ts +46 -0
  68. package/src/core/utils/use-gesture/core/TimeoutStore.ts +28 -0
  69. package/src/core/utils/use-gesture/core/actions.ts +63 -0
  70. package/src/core/utils/use-gesture/core/config/commonConfigResolver.ts +86 -0
  71. package/src/core/utils/use-gesture/core/config/coordinatesConfigResolver.ts +48 -0
  72. package/src/core/utils/use-gesture/core/config/dragConfigResolver.ts +140 -0
  73. package/src/core/utils/use-gesture/core/config/hoverConfigResolver.ts +11 -0
  74. package/src/core/utils/use-gesture/core/config/moveConfigResolver.ts +11 -0
  75. package/src/core/utils/use-gesture/core/config/pinchConfigResolver.ts +59 -0
  76. package/src/core/utils/use-gesture/core/config/resolver.ts +70 -0
  77. package/src/core/utils/use-gesture/core/config/scrollConfigResolver.ts +8 -0
  78. package/src/core/utils/use-gesture/core/config/sharedConfigResolver.ts +28 -0
  79. package/src/core/utils/use-gesture/core/config/support.ts +52 -0
  80. package/src/core/utils/use-gesture/core/config/wheelConfigResolver.ts +8 -0
  81. package/src/core/utils/use-gesture/core/engines/CoordinatesEngine.ts +78 -0
  82. package/src/core/utils/use-gesture/core/engines/DragEngine.ts +403 -0
  83. package/src/core/utils/use-gesture/core/engines/Engine.ts +406 -0
  84. package/src/core/utils/use-gesture/core/engines/HoverEngine.ts +43 -0
  85. package/src/core/utils/use-gesture/core/engines/MoveEngine.ts +52 -0
  86. package/src/core/utils/use-gesture/core/engines/PinchEngine.ts +345 -0
  87. package/src/core/utils/use-gesture/core/engines/ScrollEngine.ts +42 -0
  88. package/src/core/utils/use-gesture/core/engines/WheelEngine.ts +48 -0
  89. package/src/core/utils/use-gesture/core/index.ts +7 -0
  90. package/src/core/utils/use-gesture/core/parser.ts +92 -0
  91. package/src/core/utils/use-gesture/core/types/action.ts +19 -0
  92. package/src/core/utils/use-gesture/core/types/config.ts +255 -0
  93. package/src/core/utils/use-gesture/core/types/handlers.ts +73 -0
  94. package/src/core/utils/use-gesture/core/types/index.ts +11 -0
  95. package/src/core/utils/use-gesture/core/types/internalConfig.ts +80 -0
  96. package/src/core/utils/use-gesture/core/types/state.ts +275 -0
  97. package/src/core/utils/use-gesture/core/types/utils.ts +204 -0
  98. package/src/core/utils/use-gesture/core/types.ts +8 -0
  99. package/src/core/utils/use-gesture/core/utils/events.ts +158 -0
  100. package/src/core/utils/use-gesture/core/utils/fn.ts +32 -0
  101. package/src/core/utils/use-gesture/core/utils/maths.ts +63 -0
  102. package/src/core/utils/use-gesture/core/utils/state.ts +24 -0
  103. package/src/core/utils/use-gesture/core/utils.ts +8 -0
  104. package/src/core/utils/use-gesture/index.ts +6 -0
  105. package/src/core/utils/use-gesture/vanilla/DragGesture.ts +27 -0
  106. package/src/core/utils/use-gesture/vanilla/Gesture.ts +45 -0
  107. package/src/core/utils/use-gesture/vanilla/HoverGesture.ts +27 -0
  108. package/src/core/utils/use-gesture/vanilla/MoveGesture.ts +27 -0
  109. package/src/core/utils/use-gesture/vanilla/PinchGesture.ts +27 -0
  110. package/src/core/utils/use-gesture/vanilla/Recognizer.ts +43 -0
  111. package/src/core/utils/use-gesture/vanilla/ScrollGesture.ts +27 -0
  112. package/src/core/utils/use-gesture/vanilla/WheelGesture.ts +27 -0
  113. package/src/core/utils/use-gesture/vanilla/createGesture.ts +18 -0
  114. package/src/core/utils/use-gesture/vanilla/index.ts +18 -0
  115. package/src/env.d.ts +10 -0
  116. package/src/index.ts +17 -0
  117. package/src/playground-config.ts +70 -0
  118. package/src/playground-container.ts +129 -0
  119. package/src/playground-contribution.ts +81 -0
  120. package/src/playground-mock-tools.ts +143 -0
  121. package/src/playground.ts +401 -0
  122. package/src/plugin/index.ts +6 -0
  123. package/src/plugin/plugin.ts +226 -0
  124. package/src/services/clipboard-service.ts +40 -0
  125. package/src/services/context-menu-service.ts +25 -0
  126. package/src/services/index.ts +10 -0
  127. package/src/services/logger-service.ts +49 -0
  128. package/src/services/selection-service.ts +54 -0
  129. package/src/services/storage-service.ts +65 -0
  130. package/src/vue/index.ts +8 -0
  131. package/src/vue/playground-vue-context.ts +22 -0
  132. package/src/vue/playground-vue-provider.ts +115 -0
  133. package/src/vue/playground-vue-renderer.vue +44 -0
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ */
5
+
6
+ import { inject, injectable } from 'inversify';
7
+
8
+ import { type Layer } from '../layer';
9
+ import {
10
+ // AbleManager,
11
+ // type AbleRegistry,
12
+ type Entity,
13
+ type EntityData,
14
+ type EntityDataRegistry,
15
+ EntityManager,
16
+ type EntityRegistry,
17
+ } from '../../common';
18
+
19
+ type SelectorVersion = Map<string, number>;
20
+
21
+ export interface LayerEntitiesSelector {
22
+ // lastAbleVersion?: SelectorVersion;
23
+ lastEntityVersion?: SelectorVersion;
24
+ lastDataVersion?: SelectorVersion;
25
+ entities: EntityRegistry[];
26
+ // ables: AbleRegistry[];
27
+ datas: [EntityRegistry, EntityDataRegistry][]; // entity-data
28
+ }
29
+
30
+ /**
31
+ * 选择器用来在 pipeline 绘制之前,筛选并注入 entities
32
+ */
33
+ @injectable()
34
+ export class PipelineEntitiesSelector {
35
+ protected layerEntitiesSelectorMap: WeakMap<Layer, LayerEntitiesSelector> = new WeakMap();
36
+
37
+ readonly entityLayerMap: Map<string, Set<Layer>> = new Map();
38
+
39
+ readonly ableLayerMap: Map<string, Set<Layer>> = new Map();
40
+
41
+ // @inject(AbleManager) ableManager: AbleManager;
42
+
43
+ @inject(EntityManager) entityManager: EntityManager;
44
+
45
+ /**
46
+ * 订阅关联的 entity,会影响 autorun
47
+ */
48
+ subscribeEntities(layer: Layer, entities: EntityRegistry[]): void {
49
+ const selector = this.getSelector(layer);
50
+ entities.forEach(e => {
51
+ if (!selector.entities.includes(e)) selector.entities.push(e);
52
+ let layers = this.entityLayerMap.get(e.type);
53
+ if (!layers) {
54
+ layers = new Set();
55
+ this.entityLayerMap.set(e.type, layers);
56
+ }
57
+ layers.add(layer);
58
+ });
59
+ }
60
+
61
+ // /**
62
+ // * 订阅关联的 able, 会影响 autorun
63
+ // */
64
+ // subscribeAbles(layer: Layer, ables: AbleRegistry[]): void {
65
+ // const selector = this.getSelector(layer);
66
+ // ables.forEach(able => {
67
+ // if (!selector.ables.includes(able)) selector.ables.push(able);
68
+ // let layers = this.ableLayerMap.get(able.type);
69
+ // if (!layers) {
70
+ // layers = new Set();
71
+ // this.ableLayerMap.set(able.type, layers);
72
+ // }
73
+ // layers.add(layer);
74
+ // });
75
+ // }
76
+
77
+ /**
78
+ * 订阅 data 数据
79
+ * @param layer
80
+ * @param entity
81
+ * @param data
82
+ */
83
+ subscribleEntityByData(layer: Layer, entity: EntityRegistry, data: EntityDataRegistry): void {
84
+ const selector = this.getSelector(layer);
85
+ // Entity 和 layer 做关联
86
+ let layers = this.entityLayerMap.get(entity.type);
87
+ if (!layers) {
88
+ layers = new Set();
89
+ this.entityLayerMap.set(entity.type, layers);
90
+ }
91
+ layers.add(layer);
92
+ const item: [EntityRegistry, EntityDataRegistry] = [entity, data];
93
+ if (!selector.datas.find(i => i[0] === entity && i[1] === data)) selector.datas.push(item);
94
+ }
95
+
96
+ protected getSelector(layer: Layer): LayerEntitiesSelector {
97
+ let selector = this.layerEntitiesSelectorMap.get(layer);
98
+ if (!selector) {
99
+ selector = { entities: [], datas: [] };
100
+ this.layerEntitiesSelectorMap.set(layer, selector);
101
+ }
102
+ return selector;
103
+ }
104
+
105
+ /**
106
+ * 查询 layer 关联的实体
107
+ */
108
+ getLayerEntities(layer: Layer): { entities: Entity[]; changed: boolean } {
109
+ const selector = this.layerEntitiesSelectorMap.get(layer);
110
+ /* v8 ignore next 1 */
111
+ if (!selector) return { entities: [], changed: false };
112
+ const allEntities: Set<Entity> = new Set();
113
+ const entityVersion: SelectorVersion = new Map();
114
+ let entityChanged = false;
115
+ selector.entities.forEach(registry => {
116
+ const entities = this.entityManager.getEntities(registry);
117
+ const version = this.entityManager.getEntityVersion(registry);
118
+ entityVersion.set(registry.type, version);
119
+ for (const item of entities) {
120
+ allEntities.add(item);
121
+ }
122
+ });
123
+ // selector.ables.forEach(registry => {
124
+ // const entities = this.ableManager.getEntitiesByAble(registry);
125
+ // for (const item of entities) {
126
+ // if (!entityVersion.has(item.type)) {
127
+ // const version = this.entityManager.getEntityVersion(item.type);
128
+ // entityVersion.set(item.type, version);
129
+ // }
130
+ // allEntities.add(item);
131
+ // }
132
+ // });
133
+ // To array
134
+ const result: Entity[] = [];
135
+ for (const item of allEntities.values()) {
136
+ result.push(item);
137
+ }
138
+ /**
139
+ * 检查版本变化
140
+ */
141
+ if (checkChanged(entityVersion, selector.lastEntityVersion)) {
142
+ selector.lastEntityVersion = entityVersion;
143
+ entityChanged = true;
144
+ }
145
+ return {
146
+ entities: result,
147
+ changed: entityChanged,
148
+ };
149
+ }
150
+
151
+ getLayerEntityDatas(layer: Layer): { datas: EntityData[]; changed: boolean } {
152
+ const selector = this.layerEntitiesSelectorMap.get(layer);
153
+ /* v8 ignore next 1 */
154
+ if (!selector) return { datas: [], changed: false };
155
+ const allDatas: EntityData[] = [];
156
+ const dataVersion: SelectorVersion = new Map();
157
+ let dataChanged = false;
158
+ selector.datas.forEach(registries => {
159
+ const [entityRegistry, entityDataRegistry] = registries;
160
+ const entityDatas = this.entityManager.getEntityDatas(entityRegistry, entityDataRegistry);
161
+ const version = this.entityManager.getEntityDataVersion(entityDataRegistry);
162
+ dataVersion.set(entityDataRegistry.type, version);
163
+ /* v8 ignore next 3 */
164
+ for (const item of entityDatas) {
165
+ allDatas.push(item);
166
+ }
167
+ });
168
+ if (checkChanged(dataVersion, selector.lastDataVersion)) {
169
+ selector.lastDataVersion = dataVersion;
170
+ dataChanged = true;
171
+ }
172
+ return {
173
+ datas: allDatas,
174
+ changed: dataChanged,
175
+ };
176
+ }
177
+
178
+ getLayerData(layer: Layer): {
179
+ observeEntities: Entity[];
180
+ observeDatas: EntityData[];
181
+ changed: boolean;
182
+ } {
183
+ const entitiesSelector = this.getLayerEntities(layer);
184
+ const datasSelector = this.getLayerEntityDatas(layer);
185
+ return {
186
+ observeEntities: entitiesSelector.entities,
187
+ observeDatas: datasSelector.datas,
188
+ changed: datasSelector.changed || entitiesSelector.changed,
189
+ };
190
+ }
191
+ }
192
+
193
+ function checkChanged(v1: SelectorVersion = new Map(), v2: SelectorVersion = new Map()): boolean {
194
+ if (v1.size !== v2.size) return true;
195
+ for (const key of v1.keys()) {
196
+ /* v8 ignore next 1 */
197
+ if (v1.get(key) !== v2.get(key)) return true;
198
+ }
199
+ return false;
200
+ }
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ */
5
+
6
+ import {
7
+ // type AbleRegistry,
8
+ type ConfigEntity,
9
+ type Entity,
10
+ type EntityData,
11
+ type EntityManager,
12
+ type EntityRegistry,
13
+ } from '../../common';
14
+
15
+ /**
16
+ * 注入到 Layer 中的实体选择器
17
+ */
18
+ export interface PipelineEntities extends Iterable<Entity> {
19
+ /**
20
+ * 获取单个实体,如果该实体是单例且被注册过,则会自动创建
21
+ * @param registry
22
+ */
23
+ get<T extends Entity>(registry: EntityRegistry, id?: string): T | undefined;
24
+ /**
25
+ * 获取多个实体
26
+ * @param registry
27
+ */
28
+ getEntities<T extends Entity>(registry: EntityRegistry): T[];
29
+
30
+ // /**
31
+ // * 通过 Able 获取多个实体
32
+ // * @param registry
33
+ // */
34
+ // getEntitiesByAble<T extends Entity>(registry: AbleRegistry): T[];
35
+ // /**
36
+ // * 通过多个 Ables 获取多个实体
37
+ // * @param andAbles - 多个 able,条件且
38
+ // * @param orAbles - 多个 able,条件或
39
+ // */
40
+ // getEntitiesByAbles<T extends Entity>(andAbles: AbleRegistry[], orAbles?: AbleRegistry[]): T[];
41
+
42
+ /**
43
+ * 获取 entity
44
+ * @param entityRegistry
45
+ * @param dataRegistry
46
+ */
47
+ getEntityDatas<T extends EntityData>(entityRegistry: EntityRegistry, dataRegistry: T): T[];
48
+ /**
49
+ * 是否存在
50
+ * @param registry
51
+ */
52
+ has(registry: EntityRegistry): boolean;
53
+ /**
54
+ * 获取配置信息
55
+ * @param registry
56
+ */
57
+ getConfig<E extends ConfigEntity>(registry: EntityRegistry): E['config'] | undefined;
58
+ /**
59
+ * 更新配置数据
60
+ */
61
+ updateConfig<E extends ConfigEntity>(registry: EntityRegistry, props: Partial<E['config']>): void;
62
+
63
+ /**
64
+ * 创建实体
65
+ */
66
+ createEntity: <E extends Entity>(
67
+ registry: EntityRegistry,
68
+ opts?: Omit<E['__opts_type__'], 'entityManager'>,
69
+ ) => E;
70
+ /**
71
+ * 批量删除实体
72
+ */
73
+ removeEntities: (registry: EntityRegistry) => void;
74
+ /**
75
+ * 当前画布订阅的实体数目
76
+ */
77
+ readonly size: number;
78
+ }
79
+
80
+ export class PipelineEntitiesImpl implements PipelineEntities {
81
+ protected observeEntities: Entity[] = [];
82
+
83
+ protected observeDatas: EntityData[] = [];
84
+
85
+ // @Action 这里要加多个缓存的原因是,每次 decorator 触发都会频繁调用获取方法,"this.xxx" 也会触发 decorator 方法
86
+ protected entitiesTypeCache: Map<EntityRegistry, Entity[]> = new Map();
87
+
88
+ protected entitiesAbleCache: Map<string, Entity[]> = new Map();
89
+
90
+ protected entitiyDataCache: Map<string, EntityData[]> = new Map();
91
+
92
+ constructor(protected readonly entityManager: EntityManager) {}
93
+
94
+ get size(): number {
95
+ return this.observeEntities.length;
96
+ }
97
+
98
+ /**
99
+ * 加载订阅数据,会缓存到 layer 内部,layer 只能拿到订阅数据的子集
100
+ * @param observeEntites
101
+ * @param observeDatas
102
+ */
103
+ load(observeEntites: Entity[], observeDatas: EntityData[]): void {
104
+ this.observeEntities = observeEntites;
105
+ this.observeDatas = observeDatas;
106
+ // clear cache
107
+ this.entitiesTypeCache.clear();
108
+ this.entitiesAbleCache.clear();
109
+ this.entitiyDataCache.clear();
110
+ }
111
+
112
+ get<T extends Entity>(registry: EntityRegistry, id?: string): T | undefined {
113
+ const entities = this.getEntities(registry) as T[];
114
+ if (id !== undefined) {
115
+ return entities.find(e => e.id === id);
116
+ }
117
+ return entities[0];
118
+ }
119
+
120
+ has(registy: EntityRegistry): boolean {
121
+ return !!this.get(registy);
122
+ }
123
+
124
+ getEntities<T extends Entity>(registry: EntityRegistry): T[] {
125
+ let result = this.entitiesTypeCache.get(registry) as T[];
126
+ // 缓存查询结果
127
+ if (!result) {
128
+ result = [];
129
+ this.observeEntities.forEach(e => {
130
+ if (e.type === registry.type) result!.push(e as T);
131
+ });
132
+ this.entitiesTypeCache.set(registry, result);
133
+ }
134
+ // 可能会出现延迟更新
135
+ return result.filter(r => !r.disposed);
136
+ }
137
+
138
+ getEntityDatas<T extends EntityData = EntityData>(
139
+ entityRegistry: EntityRegistry,
140
+ dataRegistry: T,
141
+ ): T[] {
142
+ const dataKey = `${entityRegistry.type}:${dataRegistry.type}`;
143
+ let result = this.entitiyDataCache.get(dataKey) as T[];
144
+ if (result) {
145
+ return result;
146
+ }
147
+ result = this.observeDatas.filter(
148
+ data => data.type === dataRegistry.type && data.entity.type === entityRegistry.type,
149
+ ) as T[];
150
+ this.entitiyDataCache.set(dataKey, result);
151
+ return result;
152
+ }
153
+
154
+ // getEntitiesByAble<T extends Entity = Entity>(able: AbleRegistry): T[] {
155
+ // return this.getEntitiesByAbles([able]);
156
+ // }
157
+
158
+ // getEntitiesByAbles<T extends Entity = Entity>(
159
+ // andAbles: AbleRegistry[] = [],
160
+ // orAbles: AbleRegistry[] = [],
161
+ // ): T[] {
162
+ // const ableKey = `${andAbles.map(a => a.type).join(':')}_${orAbles.map(a => a.type).join(':')}`;
163
+ // let result = this.entitiesAbleCache.get(ableKey) as T[];
164
+ // // 缓存查询结果
165
+ // if (!result) {
166
+ // result = [];
167
+ // this.observeEntities.forEach(entity => {
168
+ // const checkAnd = andAbles.length === 0 || !andAbles.find(able => !entity.ables.has(able));
169
+ // const checkOr = orAbles.length === 0 || orAbles.find(able => entity.ables.has(able));
170
+ // if (checkAnd && checkOr) {
171
+ // result.push(entity as T);
172
+ // }
173
+ // });
174
+ // this.entitiesAbleCache.set(ableKey, result);
175
+ // }
176
+ // // 可能会出现延迟更新
177
+ // return result.filter(r => !r.disposed);
178
+ // }
179
+
180
+ updateConfig<E extends ConfigEntity>(
181
+ registry: EntityRegistry,
182
+ props: Partial<E['config']>,
183
+ ): void {
184
+ const entity = this.get(registry) as ConfigEntity;
185
+ /* v8 ignore next 3 */
186
+ if (entity && entity.updateConfig) {
187
+ entity.updateConfig(props);
188
+ }
189
+ }
190
+
191
+ getConfig<E extends ConfigEntity>(registry: EntityRegistry): E['config'] | undefined {
192
+ const entity = this.get(registry) as ConfigEntity;
193
+ /* v8 ignore next 3 */
194
+ if (entity) {
195
+ return entity.config;
196
+ }
197
+ }
198
+
199
+ /**
200
+ * 创建实体
201
+ */
202
+ createEntity<E extends Entity>(
203
+ registry: EntityRegistry,
204
+ opts?: Omit<E['__opts_type__'], 'entityManager'>,
205
+ ): E {
206
+ return this.entityManager.createEntity<E>(registry, opts);
207
+ }
208
+
209
+ /**
210
+ * 批量删除实体
211
+ */
212
+ removeEntities(registry: EntityRegistry): void {
213
+ this.entityManager.removeEntities(registry);
214
+ }
215
+
216
+ [Symbol.iterator](): Iterator<Entity> {
217
+ let index = 0;
218
+ const len = this.observeEntities.length;
219
+ return {
220
+ next: () => {
221
+ const current = index++;
222
+ const done = current === len;
223
+ return {
224
+ value: this.observeEntities[current],
225
+ done,
226
+ };
227
+ },
228
+ };
229
+ }
230
+ }