bunsane 0.1.4 → 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.
- package/.claude/settings.local.json +47 -0
- package/.claude/skills/update-memory.md +74 -0
- package/.prettierrc +4 -0
- package/.serena/memories/architectural-decision-no-dependency-injection.md +76 -0
- package/.serena/memories/architecture.md +154 -0
- package/.serena/memories/cache-interface-refactoring-2026-01-24.md +165 -0
- package/.serena/memories/code_style_and_conventions.md +76 -0
- package/.serena/memories/project_overview.md +43 -0
- package/.serena/memories/schema-dsl-plan.md +107 -0
- package/.serena/memories/suggested_commands.md +80 -0
- package/.serena/memories/typescript-compilation-status.md +54 -0
- package/.serena/project.yml +114 -0
- package/TODO.md +1 -7
- package/bun.lock +150 -4
- package/bunfig.toml +10 -0
- package/config/cache.config.ts +77 -0
- package/config/upload.config.ts +4 -5
- package/core/App.ts +870 -123
- package/core/ArcheType.ts +2268 -377
- package/core/BatchLoader.ts +181 -71
- package/core/Config.ts +153 -0
- package/core/Decorators.ts +4 -1
- package/core/Entity.ts +621 -92
- package/core/EntityHookManager.ts +1 -1
- package/core/EntityInterface.ts +3 -1
- package/core/EntityManager.ts +1 -13
- package/core/ErrorHandler.ts +8 -2
- package/core/Logger.ts +9 -0
- package/core/Middleware.ts +34 -0
- package/core/RequestContext.ts +5 -1
- package/core/RequestLoaders.ts +227 -93
- package/core/SchedulerManager.ts +193 -52
- package/core/cache/CacheAnalytics.ts +399 -0
- package/core/cache/CacheFactory.ts +145 -0
- package/core/cache/CacheManager.ts +520 -0
- package/core/cache/CacheProvider.ts +34 -0
- package/core/cache/CacheWarmer.ts +157 -0
- package/core/cache/CompressionUtils.ts +110 -0
- package/core/cache/MemoryCache.ts +251 -0
- package/core/cache/MultiLevelCache.ts +180 -0
- package/core/cache/NoOpCache.ts +53 -0
- package/core/cache/RedisCache.ts +464 -0
- package/core/cache/TTLStrategy.ts +254 -0
- package/core/cache/index.ts +6 -0
- package/core/components/BaseComponent.ts +120 -0
- package/core/{ComponentRegistry.ts → components/ComponentRegistry.ts} +148 -54
- package/core/components/Decorators.ts +88 -0
- package/core/components/Interfaces.ts +7 -0
- package/core/components/index.ts +5 -0
- package/core/decorators/EntityHooks.ts +0 -3
- package/core/decorators/IndexedField.ts +26 -0
- package/core/decorators/ScheduledTask.ts +0 -47
- package/core/events/EntityLifecycleEvents.ts +1 -1
- package/core/health.ts +112 -0
- package/core/metadata/definitions/ArcheType.ts +14 -0
- package/core/metadata/definitions/Component.ts +9 -0
- package/core/metadata/definitions/gqlObject.ts +1 -1
- package/core/metadata/index.ts +42 -1
- package/core/metadata/metadata-storage.ts +28 -2
- package/core/middleware/AccessLog.ts +59 -0
- package/core/middleware/RequestId.ts +38 -0
- package/core/middleware/SecurityHeaders.ts +62 -0
- package/core/middleware/index.ts +3 -0
- package/core/scheduler/DistributedLock.ts +266 -0
- package/core/scheduler/index.ts +15 -0
- package/core/validateEnv.ts +92 -0
- package/database/DatabaseHelper.ts +416 -40
- package/database/IndexingStrategy.ts +342 -0
- package/database/PreparedStatementCache.ts +226 -0
- package/database/index.ts +32 -7
- package/database/sqlHelpers.ts +14 -2
- package/endpoints/archetypes.ts +362 -0
- package/endpoints/components.ts +58 -0
- package/endpoints/entity.ts +80 -0
- package/endpoints/index.ts +27 -0
- package/endpoints/query.ts +93 -0
- package/endpoints/stats.ts +76 -0
- package/endpoints/tables.ts +212 -0
- package/endpoints/types.ts +155 -0
- package/gql/ArchetypeOperations.ts +32 -86
- package/gql/Generator.ts +27 -315
- package/gql/GeneratorV2.ts +37 -0
- package/gql/builders/InputTypeBuilder.ts +99 -0
- package/gql/builders/ResolverBuilder.ts +234 -0
- package/gql/builders/TypeDefBuilder.ts +105 -0
- package/gql/builders/index.ts +3 -0
- package/gql/decorators/Upload.ts +1 -1
- package/gql/depthLimit.ts +85 -0
- package/gql/graph/GraphNode.ts +224 -0
- package/gql/graph/SchemaGraph.ts +278 -0
- package/gql/helpers.ts +8 -2
- package/gql/index.ts +56 -4
- package/gql/middleware.ts +79 -0
- package/gql/orchestration/GraphQLSchemaOrchestrator.ts +241 -0
- package/gql/orchestration/index.ts +1 -0
- package/gql/scanner/ServiceScanner.ts +347 -0
- package/gql/schema/index.ts +458 -0
- package/gql/strategies/TypeGenerationStrategy.ts +329 -0
- package/gql/types.ts +1 -0
- package/gql/utils/TypeSignature.ts +220 -0
- package/gql/utils/index.ts +1 -0
- package/gql/visitors/ArchetypePreprocessorVisitor.ts +80 -0
- package/gql/visitors/DeduplicationVisitor.ts +82 -0
- package/gql/visitors/GraphVisitor.ts +78 -0
- package/gql/visitors/ResolverGeneratorVisitor.ts +122 -0
- package/gql/visitors/SchemaGeneratorVisitor.ts +851 -0
- package/gql/visitors/TypeCollectorVisitor.ts +79 -0
- package/gql/visitors/VisitorComposer.ts +96 -0
- package/gql/visitors/index.ts +7 -0
- package/package.json +59 -37
- package/plugins/index.ts +2 -2
- package/query/CTENode.ts +97 -0
- package/query/ComponentInclusionNode.ts +689 -0
- package/query/FilterBuilder.ts +127 -0
- package/query/FilterBuilderRegistry.ts +202 -0
- package/query/OrNode.ts +517 -0
- package/query/OrQuery.ts +42 -0
- package/query/Query.ts +1022 -0
- package/query/QueryContext.ts +170 -0
- package/query/QueryDAG.ts +122 -0
- package/query/QueryNode.ts +65 -0
- package/query/SourceNode.ts +53 -0
- package/query/builders/FullTextSearchBuilder.ts +236 -0
- package/query/index.ts +21 -0
- package/scheduler/index.ts +40 -8
- package/service/Service.ts +2 -1
- package/service/ServiceRegistry.ts +6 -5
- package/{core/storage → storage}/LocalStorageProvider.ts +2 -2
- package/storage/S3StorageProvider.ts +316 -0
- package/{core/storage → storage}/StorageProvider.ts +7 -3
- package/studio/bun.lock +482 -0
- package/studio/index.html +13 -0
- package/studio/package.json +39 -0
- package/studio/postcss.config.js +6 -0
- package/studio/src/components/DataTable.tsx +211 -0
- package/studio/src/components/Layout.tsx +13 -0
- package/studio/src/components/PageContainer.tsx +9 -0
- package/studio/src/components/PageHeader.tsx +13 -0
- package/studio/src/components/SearchBar.tsx +57 -0
- package/studio/src/components/Sidebar.tsx +294 -0
- package/studio/src/components/ui/button.tsx +56 -0
- package/studio/src/components/ui/checkbox.tsx +26 -0
- package/studio/src/components/ui/input.tsx +25 -0
- package/studio/src/hooks/useDataTable.ts +131 -0
- package/studio/src/index.css +36 -0
- package/studio/src/lib/api.ts +186 -0
- package/studio/src/lib/utils.ts +13 -0
- package/studio/src/main.tsx +17 -0
- package/studio/src/pages/ArcheType.tsx +239 -0
- package/studio/src/pages/Components.tsx +124 -0
- package/studio/src/pages/EntityInspector.tsx +302 -0
- package/studio/src/pages/QueryRunner.tsx +246 -0
- package/studio/src/pages/Table.tsx +94 -0
- package/studio/src/pages/Welcome.tsx +241 -0
- package/studio/src/routes.tsx +45 -0
- package/studio/src/store/archeTypeSettings.ts +30 -0
- package/studio/src/store/studio.ts +65 -0
- package/studio/src/utils/columnHelpers.tsx +114 -0
- package/studio/studio-instructions.md +81 -0
- package/studio/tailwind.config.js +77 -0
- package/studio/tsconfig.json +24 -0
- package/studio/utils.ts +54 -0
- package/studio/vite.config.js +19 -0
- package/swagger/generator.ts +1 -1
- package/tests/e2e/http.test.ts +126 -0
- package/tests/fixtures/archetypes/TestUserArchetype.ts +21 -0
- package/tests/fixtures/components/TestOrder.ts +23 -0
- package/tests/fixtures/components/TestProduct.ts +23 -0
- package/tests/fixtures/components/TestUser.ts +20 -0
- package/tests/fixtures/components/index.ts +6 -0
- package/tests/graphql/SchemaGeneration.test.ts +90 -0
- package/tests/graphql/builders/ResolverBuilder.test.ts +223 -0
- package/tests/graphql/builders/TypeDefBuilder.test.ts +153 -0
- package/tests/integration/archetype/ArcheType.persistence.test.ts +241 -0
- package/tests/integration/cache/CacheInvalidation.test.ts +259 -0
- package/tests/integration/entity/Entity.persistence.test.ts +333 -0
- package/tests/integration/query/Query.exec.test.ts +523 -0
- package/tests/pglite-setup.ts +61 -0
- package/tests/setup.ts +164 -0
- package/tests/stress/BenchmarkRunner.ts +203 -0
- package/tests/stress/DataSeeder.ts +190 -0
- package/tests/stress/StressTestReporter.ts +229 -0
- package/tests/stress/cursor-perf-test.ts +171 -0
- package/tests/stress/fixtures/StressTestComponents.ts +58 -0
- package/tests/stress/index.ts +7 -0
- package/tests/stress/scenarios/query-benchmarks.test.ts +285 -0
- package/tests/unit/BatchLoader.test.ts +82 -0
- package/tests/unit/archetype/ArcheType.test.ts +107 -0
- package/tests/unit/cache/CacheManager.test.ts +347 -0
- package/tests/unit/cache/MemoryCache.test.ts +260 -0
- package/tests/unit/cache/RedisCache.test.ts +411 -0
- package/tests/unit/entity/Entity.components.test.ts +244 -0
- package/tests/unit/entity/Entity.test.ts +345 -0
- package/tests/unit/gql/depthLimit.test.ts +203 -0
- package/tests/unit/gql/operationMiddleware.test.ts +293 -0
- package/tests/unit/health/Health.test.ts +129 -0
- package/tests/unit/middleware/AccessLog.test.ts +37 -0
- package/tests/unit/middleware/Middleware.test.ts +98 -0
- package/tests/unit/middleware/RequestId.test.ts +54 -0
- package/tests/unit/middleware/SecurityHeaders.test.ts +66 -0
- package/tests/unit/query/FilterBuilder.test.ts +111 -0
- package/tests/unit/query/Query.test.ts +308 -0
- package/tests/unit/scheduler/DistributedLock.test.ts +274 -0
- package/tests/unit/schema/schema-integration.test.ts +426 -0
- package/tests/unit/schema/schema.test.ts +580 -0
- package/tests/unit/storage/S3StorageProvider.test.ts +571 -0
- package/tests/unit/upload/RestUpload.test.ts +267 -0
- package/tests/unit/validateEnv.test.ts +82 -0
- package/tests/utils/entity-tracker.ts +57 -0
- package/tests/utils/index.ts +13 -0
- package/tests/utils/test-context.ts +149 -0
- package/tsconfig.json +5 -1
- package/types/archetype.types.ts +6 -0
- package/types/hooks.types.ts +1 -1
- package/types/query.types.ts +110 -0
- package/types/scheduler.types.ts +68 -7
- package/types/upload.types.ts +1 -0
- package/{core → upload}/FileValidator.ts +10 -1
- package/upload/RestUpload.ts +130 -0
- package/{core/components → upload}/UploadComponent.ts +11 -11
- package/{core → upload}/UploadManager.ts +3 -3
- package/upload/index.ts +23 -7
- package/utils/UploadHelper.ts +27 -6
- package/utils/cronParser.ts +16 -6
- package/.github/workflows/deploy-docs.yml +0 -57
- package/core/Components.ts +0 -202
- package/core/EntityCache.ts +0 -15
- package/core/Query.ts +0 -880
- package/docs/README.md +0 -149
- package/docs/_coverpage.md +0 -36
- package/docs/_sidebar.md +0 -23
- package/docs/api/core.md +0 -568
- package/docs/api/hooks.md +0 -554
- package/docs/api/index.md +0 -222
- package/docs/api/query.md +0 -678
- package/docs/api/service.md +0 -744
- package/docs/core-concepts/archetypes.md +0 -512
- package/docs/core-concepts/components.md +0 -498
- package/docs/core-concepts/entity.md +0 -314
- package/docs/core-concepts/hooks.md +0 -683
- package/docs/core-concepts/query.md +0 -588
- package/docs/core-concepts/services.md +0 -647
- package/docs/examples/code-examples.md +0 -425
- package/docs/getting-started.md +0 -337
- package/docs/index.html +0 -97
- package/tests/bench/insert.bench.ts +0 -60
- package/tests/bench/relations.bench.ts +0 -270
- package/tests/bench/sorting.bench.ts +0 -416
- package/tests/component-hooks-simple.test.ts +0 -117
- package/tests/component-hooks.test.ts +0 -1461
- package/tests/component.test.ts +0 -339
- package/tests/errorHandling.test.ts +0 -155
- package/tests/hooks.test.ts +0 -667
- package/tests/query-sorting.test.ts +0 -101
- package/tests/query.test.ts +0 -81
- package/tests/relations.test.ts +0 -170
- package/tests/scheduler.test.ts +0 -724
package/core/Components.ts
DELETED
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
import { createHash } from 'crypto';
|
|
2
|
-
import "reflect-metadata";
|
|
3
|
-
import { logger as MainLogger } from "./Logger";
|
|
4
|
-
import ComponentRegistry from "./ComponentRegistry";
|
|
5
|
-
import { uuidv7 } from 'utils/uuid';
|
|
6
|
-
import { getMetadataStorage } from './metadata';
|
|
7
|
-
const logger = MainLogger.child({ scope: "Components" });
|
|
8
|
-
|
|
9
|
-
export function generateTypeId(name: string): string {
|
|
10
|
-
return createHash('sha256').update(name).digest('hex');
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
const primitiveTypes = [String, Number, Boolean, Symbol, BigInt];
|
|
14
|
-
|
|
15
|
-
//TODO: Continue here
|
|
16
|
-
export function CompData(options?: { indexed?: boolean }) {
|
|
17
|
-
return (target: any, propertyKey: string) => {
|
|
18
|
-
const storage = getMetadataStorage();
|
|
19
|
-
const typeId = storage.getComponentId(target.constructor.name);
|
|
20
|
-
const propType = Reflect.getMetadata("design:type", target, propertyKey);
|
|
21
|
-
let isEnum = !!(Reflect.getMetadata("isEnum", propType));
|
|
22
|
-
if (propType.name === 'ServiceType') isEnum = true;
|
|
23
|
-
// console.log(`Property ${propertyKey} type:`, propType?.name);
|
|
24
|
-
// console.log(`Is Enum:`, isEnum);
|
|
25
|
-
let enumValues: string[] | undefined = undefined;
|
|
26
|
-
let enumKeys: string[] | undefined = undefined;
|
|
27
|
-
if(isEnum) {
|
|
28
|
-
const metaEnumValues = Reflect.getMetadata("__enumValues", propType);
|
|
29
|
-
const metaEnumKeys = Reflect.getMetadata("__enumKeys", propType);
|
|
30
|
-
|
|
31
|
-
if (metaEnumValues && metaEnumKeys) {
|
|
32
|
-
enumValues = metaEnumValues;
|
|
33
|
-
enumKeys = metaEnumKeys;
|
|
34
|
-
} else {
|
|
35
|
-
const staticKeys = Object.getOwnPropertyNames(propType).filter(key =>
|
|
36
|
-
key !== 'prototype' &&
|
|
37
|
-
key !== 'length' &&
|
|
38
|
-
key !== 'name' &&
|
|
39
|
-
key !== 'isEnum' &&
|
|
40
|
-
key !== '__enumValues' &&
|
|
41
|
-
key !== '__enumKeys' &&
|
|
42
|
-
typeof propType[key] !== 'function' &&
|
|
43
|
-
typeof propType[key] !== 'boolean'
|
|
44
|
-
);
|
|
45
|
-
if (staticKeys.length > 0) {
|
|
46
|
-
enumValues = staticKeys.map(key => propType[key]);
|
|
47
|
-
enumKeys = staticKeys;
|
|
48
|
-
} else {
|
|
49
|
-
// Fallback for numeric enums
|
|
50
|
-
enumValues = Object.keys(propType).filter(key => !isNaN(Number(key))).map(key => propType[key]);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
if (propType.name === 'ServiceType' && (!enumValues || enumValues.length === 0)) {
|
|
55
|
-
enumValues = ["jek", "car", "food", "package"];
|
|
56
|
-
enumKeys = ["BIKE", "CAR", "FOOD", "PACKAGE"];
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
}
|
|
60
|
-
storage.collectComponentPropertyMetadata({
|
|
61
|
-
component_id: typeId,
|
|
62
|
-
propertyKey: propertyKey,
|
|
63
|
-
propertyType: propType,
|
|
64
|
-
indexed: options?.indexed ?? false,
|
|
65
|
-
isPrimitive: primitiveTypes.includes(propType),
|
|
66
|
-
isEnum: isEnum,
|
|
67
|
-
enumValues: enumValues,
|
|
68
|
-
enumKeys: enumKeys,
|
|
69
|
-
})
|
|
70
|
-
// Reflect.metadata("compData", { isData: true, indexed: options?.indexed ?? false })(target, propertyKey);
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// TODO: Component Property Casting
|
|
75
|
-
// export enum CompCastingType {
|
|
76
|
-
// STRING = "string",
|
|
77
|
-
// NUMBER = "number",
|
|
78
|
-
// BOOLEAN = "boolean",
|
|
79
|
-
// DATE = "date",
|
|
80
|
-
// }
|
|
81
|
-
// /**
|
|
82
|
-
// * Cast property to specific type when loading from database
|
|
83
|
-
// * @param type Casting type for the property
|
|
84
|
-
// * @returns
|
|
85
|
-
// */
|
|
86
|
-
// export function Cast(type: CompCastingType) {
|
|
87
|
-
// return Reflect.metadata("compCast", { type });
|
|
88
|
-
// }
|
|
89
|
-
|
|
90
|
-
// Type helper to extract only data properties (excludes methods and private properties)
|
|
91
|
-
export type ComponentDataType<T extends BaseComponent> = {
|
|
92
|
-
[K in keyof T as T[K] extends Function ? never :
|
|
93
|
-
K extends `_${string}` ? never :
|
|
94
|
-
K extends 'id' | 'getTypeID' | 'properties' | 'data' | 'save' | 'insert' | 'update' ? never :
|
|
95
|
-
K]: T[K];
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
export function Component<T extends new () => BaseComponent>(target: T): T {
|
|
99
|
-
const storage = getMetadataStorage();
|
|
100
|
-
const typeId = storage.getComponentId(target.name);
|
|
101
|
-
const properties = storage.getComponentProperties(typeId);
|
|
102
|
-
// console.log(`Component decorator applied to ${target.name} with typeId ${typeId} and properties:`, properties);
|
|
103
|
-
storage.collectComponentMetadata({
|
|
104
|
-
name: target.name,
|
|
105
|
-
typeId: typeId,
|
|
106
|
-
target: target,
|
|
107
|
-
});
|
|
108
|
-
// ComponentRegistry.define(target.name, target);
|
|
109
|
-
return target;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
export class BaseComponent {
|
|
113
|
-
public id: string = "";
|
|
114
|
-
protected _comp_name: string = "";
|
|
115
|
-
protected _typeId: string = "";
|
|
116
|
-
protected _persisted: boolean = false;
|
|
117
|
-
protected _dirty: boolean = false;
|
|
118
|
-
|
|
119
|
-
constructor() {
|
|
120
|
-
this._comp_name = this.constructor.name;
|
|
121
|
-
const storage = getMetadataStorage();
|
|
122
|
-
this._typeId = storage.getComponentId(this._comp_name);
|
|
123
|
-
this._dirty = false;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
getTypeID(): string {
|
|
127
|
-
return this._typeId;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
properties(): string[] {
|
|
131
|
-
const storage = getMetadataStorage();
|
|
132
|
-
const props = storage.componentProperties.get(this._typeId);
|
|
133
|
-
if(!props) return [];
|
|
134
|
-
return props.map(p => p.propertyKey);
|
|
135
|
-
//
|
|
136
|
-
// return Object.keys(this).filter(prop => {
|
|
137
|
-
// const meta = Reflect.getMetadata("compData", Object.getPrototypeOf(this), prop);
|
|
138
|
-
// return meta && meta.isData;
|
|
139
|
-
// });
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Get data for this component
|
|
144
|
-
* @returns Object containing only properties marked with @CompData decorator
|
|
145
|
-
*/
|
|
146
|
-
data<T extends this>(): ComponentDataType<T> {
|
|
147
|
-
const data: Record<string, any> = {};
|
|
148
|
-
this.properties().forEach((prop: string) => {
|
|
149
|
-
data[prop] = (this as any)[prop];
|
|
150
|
-
});
|
|
151
|
-
return data as ComponentDataType<T>;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
async save(trx: Bun.SQL, entity_id: string) {
|
|
155
|
-
logger.trace(`Saving component ${this._comp_name} for entity ${entity_id}`);
|
|
156
|
-
logger.trace(`Checking is Component can be saved (is registered)`);
|
|
157
|
-
await ComponentRegistry.getReadyPromise(this._comp_name);
|
|
158
|
-
logger.trace(`Component Registered`);
|
|
159
|
-
if(this._persisted) {
|
|
160
|
-
await this.update(trx);
|
|
161
|
-
} else {
|
|
162
|
-
await this.insert(trx, entity_id);
|
|
163
|
-
this._persisted = true;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
async insert(trx: Bun.SQL, entity_id: string) {
|
|
168
|
-
if(this.id === "") {
|
|
169
|
-
this.id = uuidv7();
|
|
170
|
-
}
|
|
171
|
-
await trx`INSERT INTO components
|
|
172
|
-
(id, entity_id, name, type_id, data)
|
|
173
|
-
VALUES (${this.id}, ${entity_id}, ${this._comp_name}, ${this._typeId}, ${this.data()})`
|
|
174
|
-
await trx`INSERT INTO entity_components (entity_id, type_id) VALUES (${entity_id}, ${this._typeId}) ON CONFLICT DO NOTHING`
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
async update(trx: Bun.SQL) {
|
|
178
|
-
if(this.id === "") {
|
|
179
|
-
throw new Error("Component must have an ID to be updated");
|
|
180
|
-
}
|
|
181
|
-
await trx`UPDATE components SET data = ${this.data()} WHERE id = ${this.id}`
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
public setPersisted(persisted: boolean) {
|
|
185
|
-
this._persisted = persisted;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
public setDirty(dirty: boolean) {
|
|
189
|
-
this._dirty = dirty;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
indexedProperties(): string[] {
|
|
193
|
-
const storage = getMetadataStorage();
|
|
194
|
-
const props = storage.componentProperties.get(this._typeId);
|
|
195
|
-
if(!props) return [];
|
|
196
|
-
return props.filter(p => p.indexed).map(p => p.propertyKey);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
export type ComponentGetter<T extends BaseComponent> = Pick<T, "properties" | "id"> & {
|
|
201
|
-
data(): ComponentDataType<T>;
|
|
202
|
-
};
|
package/core/EntityCache.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { RequestLoaders, ComponentData } from './RequestLoaders';
|
|
2
|
-
import { Entity } from './Entity';
|
|
3
|
-
|
|
4
|
-
export async function getEntityById(ctx: { locals: { loaders: RequestLoaders } }, id: string): Promise<Entity | null> {
|
|
5
|
-
return ctx.locals.loaders.entityById.load(id);
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export async function getComponent(ctx: { locals: { loaders: RequestLoaders } }, entityId: string, typeId: number): Promise<ComponentData | null> {
|
|
9
|
-
return ctx.locals.loaders.componentsByEntityType.load({ entityId, typeId });
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export async function preloadComponents(ctx: { locals: { loaders: RequestLoaders } }, entityIds: string[], typeId: number): Promise<void> {
|
|
13
|
-
const keys = entityIds.map(entityId => ({ entityId, typeId }));
|
|
14
|
-
await ctx.locals.loaders.componentsByEntityType.loadMany(keys);
|
|
15
|
-
}
|