@objectstack/objectql 1.0.6 → 1.0.7
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/.turbo/turbo-build.log +8 -8
- package/CHANGELOG.md +8 -0
- package/dist/index.d.mts +7 -7
- package/dist/index.d.ts +7 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
- package/src/plugin.ts +1 -1
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @objectstack/objectql@1.0.
|
|
2
|
+
> @objectstack/objectql@1.0.7 build /home/runner/work/spec/spec/packages/objectql
|
|
3
3
|
> tsup --config ../../tsup.config.ts
|
|
4
4
|
|
|
5
5
|
[34mCLI[39m Building entry: src/index.ts
|
|
@@ -11,12 +11,12 @@
|
|
|
11
11
|
[34mESM[39m Build start
|
|
12
12
|
[34mCJS[39m Build start
|
|
13
13
|
[32mESM[39m [1mdist/index.mjs [22m[32m23.51 KB[39m
|
|
14
|
-
[32mESM[39m [1mdist/index.mjs.map [22m[32m49.
|
|
15
|
-
[32mESM[39m ⚡️ Build success in
|
|
14
|
+
[32mESM[39m [1mdist/index.mjs.map [22m[32m49.70 KB[39m
|
|
15
|
+
[32mESM[39m ⚡️ Build success in 75ms
|
|
16
16
|
[32mCJS[39m [1mdist/index.js [22m[32m24.72 KB[39m
|
|
17
|
-
[32mCJS[39m [1mdist/index.js.map [22m[32m50.
|
|
18
|
-
[32mCJS[39m ⚡️ Build success in
|
|
17
|
+
[32mCJS[39m [1mdist/index.js.map [22m[32m50.16 KB[39m
|
|
18
|
+
[32mCJS[39m ⚡️ Build success in 75ms
|
|
19
19
|
[34mDTS[39m Build start
|
|
20
|
-
[32mDTS[39m ⚡️ Build success in
|
|
21
|
-
[32mDTS[39m [1mdist/index.d.mts [22m[32m37.
|
|
22
|
-
[32mDTS[39m [1mdist/index.d.ts [22m[32m37.
|
|
20
|
+
[32mDTS[39m ⚡️ Build success in 7110ms
|
|
21
|
+
[32mDTS[39m [1mdist/index.d.mts [22m[32m37.76 KB[39m
|
|
22
|
+
[32mDTS[39m [1mdist/index.d.ts [22m[32m37.76 KB[39m
|
package/CHANGELOG.md
CHANGED
package/dist/index.d.mts
CHANGED
|
@@ -257,7 +257,7 @@ declare class SchemaRegistry {
|
|
|
257
257
|
requiredPermissions?: string[] | undefined;
|
|
258
258
|
apis?: any[] | undefined;
|
|
259
259
|
} | {
|
|
260
|
-
type: "driver" | "app" | "
|
|
260
|
+
type: "theme" | "driver" | "app" | "server" | "ui" | "agent" | "objectql" | "plugin" | "module" | "gateway" | "adapter";
|
|
261
261
|
name: string;
|
|
262
262
|
version: string;
|
|
263
263
|
id: string;
|
|
@@ -498,6 +498,11 @@ declare class SchemaRegistry {
|
|
|
498
498
|
input?: any;
|
|
499
499
|
output?: any;
|
|
500
500
|
}[] | undefined;
|
|
501
|
+
drivers?: {
|
|
502
|
+
label: string;
|
|
503
|
+
id: string;
|
|
504
|
+
description?: string | undefined;
|
|
505
|
+
}[] | undefined;
|
|
501
506
|
kinds?: {
|
|
502
507
|
id: string;
|
|
503
508
|
globs: string[];
|
|
@@ -517,11 +522,6 @@ declare class SchemaRegistry {
|
|
|
517
522
|
path: string;
|
|
518
523
|
locale: string;
|
|
519
524
|
}[] | undefined;
|
|
520
|
-
drivers?: {
|
|
521
|
-
label: string;
|
|
522
|
-
id: string;
|
|
523
|
-
description?: string | undefined;
|
|
524
|
-
}[] | undefined;
|
|
525
525
|
functions?: {
|
|
526
526
|
name: string;
|
|
527
527
|
description?: string | undefined;
|
|
@@ -987,7 +987,7 @@ declare class ObjectQL implements IDataEngine {
|
|
|
987
987
|
|
|
988
988
|
declare class ObjectQLPlugin implements Plugin {
|
|
989
989
|
name: string;
|
|
990
|
-
type:
|
|
990
|
+
type: string;
|
|
991
991
|
version: string;
|
|
992
992
|
private ql;
|
|
993
993
|
private hostContext?;
|
package/dist/index.d.ts
CHANGED
|
@@ -257,7 +257,7 @@ declare class SchemaRegistry {
|
|
|
257
257
|
requiredPermissions?: string[] | undefined;
|
|
258
258
|
apis?: any[] | undefined;
|
|
259
259
|
} | {
|
|
260
|
-
type: "driver" | "app" | "
|
|
260
|
+
type: "theme" | "driver" | "app" | "server" | "ui" | "agent" | "objectql" | "plugin" | "module" | "gateway" | "adapter";
|
|
261
261
|
name: string;
|
|
262
262
|
version: string;
|
|
263
263
|
id: string;
|
|
@@ -498,6 +498,11 @@ declare class SchemaRegistry {
|
|
|
498
498
|
input?: any;
|
|
499
499
|
output?: any;
|
|
500
500
|
}[] | undefined;
|
|
501
|
+
drivers?: {
|
|
502
|
+
label: string;
|
|
503
|
+
id: string;
|
|
504
|
+
description?: string | undefined;
|
|
505
|
+
}[] | undefined;
|
|
501
506
|
kinds?: {
|
|
502
507
|
id: string;
|
|
503
508
|
globs: string[];
|
|
@@ -517,11 +522,6 @@ declare class SchemaRegistry {
|
|
|
517
522
|
path: string;
|
|
518
523
|
locale: string;
|
|
519
524
|
}[] | undefined;
|
|
520
|
-
drivers?: {
|
|
521
|
-
label: string;
|
|
522
|
-
id: string;
|
|
523
|
-
description?: string | undefined;
|
|
524
|
-
}[] | undefined;
|
|
525
525
|
functions?: {
|
|
526
526
|
name: string;
|
|
527
527
|
description?: string | undefined;
|
|
@@ -987,7 +987,7 @@ declare class ObjectQL implements IDataEngine {
|
|
|
987
987
|
|
|
988
988
|
declare class ObjectQLPlugin implements Plugin {
|
|
989
989
|
name: string;
|
|
990
|
-
type:
|
|
990
|
+
type: string;
|
|
991
991
|
version: string;
|
|
992
992
|
private ql;
|
|
993
993
|
private hostContext?;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/registry.ts","../src/protocol.ts","../src/engine.ts","../src/plugin.ts"],"sourcesContent":["// Export Registry\nexport { SchemaRegistry } from './registry.js';\n\n// Export Protocol Implementation\nexport { ObjectStackProtocolImplementation } from './protocol.js';\n\n// Export Engine\nexport { ObjectQL } from './engine.js';\nexport type { ObjectQLHostContext, HookHandler } from './engine.js';\n\n// Export Plugin Shim\nexport { ObjectQLPlugin } from './plugin.js';\n\n// Moved logic to engine.ts\n","import { ServiceObject, ObjectSchema } from '@objectstack/spec/data';\nimport { ObjectStackManifest, ManifestSchema } from '@objectstack/spec/kernel';\nimport { AppSchema } from '@objectstack/spec/ui';\n\n/**\n * Global Schema Registry\n * Unified storage for all metadata types (Objects, Apps, Flows, Layouts, etc.)\n */\nexport class SchemaRegistry {\n // Nested Map: Type -> Name/ID -> MetadataItem\n private static metadata = new Map<string, Map<string, any>>();\n\n /**\n * Universal Register Method\n * @param type The category of metadata (e.g., 'object', 'app', 'plugin')\n * @param item The metadata item itself\n * @param keyField The property to use as the unique key (default: 'name')\n */\n static registerItem<T>(type: string, item: T, keyField: keyof T = 'name' as keyof T) {\n if (!this.metadata.has(type)) {\n this.metadata.set(type, new Map());\n }\n const collection = this.metadata.get(type)!;\n const key = String(item[keyField]);\n\n // Validation Hook\n try {\n this.validate(type, item);\n } catch (e: any) {\n console.error(`[Registry] Validation failed for ${type} ${key}: ${e.message}`);\n // For now, warn but don't crash, allowing partial/legacy loads\n // throw e; \n }\n\n if (collection.has(key)) {\n console.warn(`[Registry] Overwriting ${type}: ${key}`);\n }\n collection.set(key, item);\n console.log(`[Registry] Registered ${type}: ${key}`);\n }\n\n /**\n * Validate Metadata against Spec Zod Schemas\n */\n static validate(type: string, item: any) {\n if (type === 'object') {\n return ObjectSchema.parse(item);\n }\n if (type === 'app') {\n // AppSchema might rely on Zod, imported via UI protocol\n return AppSchema.parse(item);\n }\n if (type === 'plugin') {\n return ManifestSchema.parse(item);\n }\n // Add more validations as needed\n return true;\n }\n\n /**\n * Universal Unregister Method\n */\n static unregisterItem(type: string, name: string) {\n const collection = this.metadata.get(type);\n if (collection && collection.has(name)) {\n collection.delete(name);\n console.log(`[Registry] Unregistered ${type}: ${name}`);\n } else {\n console.warn(`[Registry] Attempted to unregister non-existent ${type}: ${name}`);\n }\n }\n\n /**\n * Universal Get Method\n */\n static getItem<T>(type: string, name: string): T | undefined {\n return this.metadata.get(type)?.get(name) as T;\n }\n\n /**\n * Universal List Method\n */\n static listItems<T>(type: string): T[] {\n return Array.from(this.metadata.get(type)?.values() || []) as T[];\n }\n\n /**\n * Get all registered metadata types (Kinds)\n */\n static getRegisteredTypes(): string[] {\n return Array.from(this.metadata.keys());\n }\n\n // ==========================================\n // Typed Helper Methods (Shortcuts)\n // ==========================================\n\n /**\n * Object Helpers\n */\n static registerObject(schema: ServiceObject) {\n this.registerItem('object', schema, 'name');\n }\n\n static getObject(name: string): ServiceObject | undefined {\n return this.getItem<ServiceObject>('object', name);\n }\n\n static getAllObjects(): ServiceObject[] {\n return this.listItems<ServiceObject>('object');\n }\n\n /**\n * Plugin Helpers\n */\n static registerPlugin(manifest: ObjectStackManifest) {\n this.registerItem('plugin', manifest, 'id');\n }\n\n static getAllPlugins(): ObjectStackManifest[] {\n return this.listItems<ObjectStackManifest>('plugin');\n }\n\n /**\n * Kind (Metadata Type) Helpers\n */\n static registerKind(kind: { id: string, globs: string[] }) {\n this.registerItem('kind', kind, 'id');\n }\n \n static getAllKinds(): { id: string, globs: string[] }[] {\n return this.listItems('kind');\n }\n}\n","import { ObjectStackProtocol } from '@objectstack/spec/api';\nimport { IDataEngine } from '@objectstack/core';\nimport type { \n BatchUpdateRequest, \n BatchUpdateResponse, \n UpdateManyDataRequest,\n DeleteManyDataRequest\n} from '@objectstack/spec/api';\nimport type { MetadataCacheRequest, MetadataCacheResponse } from '@objectstack/spec/api';\n\n// We import SchemaRegistry directly since this class lives in the same package\nimport { SchemaRegistry } from './registry.js';\n\n/**\n * Simple hash function for ETag generation (browser-compatible)\n * Uses a basic hash algorithm instead of crypto.createHash\n */\nfunction simpleHash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return Math.abs(hash).toString(16);\n}\n\nexport class ObjectStackProtocolImplementation implements ObjectStackProtocol {\n private engine: IDataEngine;\n\n constructor(engine: IDataEngine) {\n this.engine = engine;\n }\n\n async getDiscovery(_request: {}) {\n return {\n version: '1.0',\n apiName: 'ObjectStack API',\n capabilities: {\n graphql: false,\n search: false,\n websockets: false,\n files: true,\n analytics: false,\n hub: false\n },\n endpoints: {\n data: '/api/data',\n metadata: '/api/meta',\n auth: '/api/auth'\n }\n };\n }\n\n async getMetaTypes(_request: {}) {\n return {\n types: SchemaRegistry.getRegisteredTypes()\n };\n }\n\n async getMetaItems(request: { type: string }) {\n return {\n type: request.type,\n items: SchemaRegistry.listItems(request.type)\n };\n }\n\n async getMetaItem(request: { type: string, name: string }) {\n return {\n type: request.type,\n name: request.name,\n item: SchemaRegistry.getItem(request.type, request.name)\n };\n }\n\n async getUiView(request: { object: string, type: 'list' | 'form' }) {\n const schema = SchemaRegistry.getObject(request.object);\n if (!schema) throw new Error(`Object ${request.object} not found`);\n\n let view: any;\n if (request.type === 'list') {\n view = {\n type: 'list',\n object: request.object,\n columns: Object.keys(schema.fields || {}).slice(0, 5).map(f => ({\n field: f,\n label: schema.fields[f].label || f\n }))\n };\n } else {\n view = {\n type: 'form',\n object: request.object,\n sections: [\n {\n label: 'General',\n fields: Object.keys(schema.fields || {}).map(f => ({\n field: f\n }))\n }\n ]\n };\n }\n return view;\n }\n\n async findData(request: { object: string, query?: any }) {\n // TODO: Normalize query from HTTP Query params (string values) to DataEngineQueryOptions (typed)\n // For now, we assume query is partially compatible or simple enough.\n // We should parse 'top', 'skip', 'limit' to numbers if they are strings.\n const options: any = { ...request.query };\n if (options.top) options.top = Number(options.top);\n if (options.skip) options.skip = Number(options.skip);\n if (options.limit) options.limit = Number(options.limit);\n \n // Handle OData style $filter if present, or flat filters\n // This is a naive implementation, a real OData parser is needed for complex scenarios.\n \n const records = await this.engine.find(request.object, options);\n return {\n object: request.object,\n value: records, // OData compaibility\n records, // Legacy\n total: records.length,\n hasMore: false\n };\n }\n\n async getData(request: { object: string, id: string }) {\n const result = await this.engine.findOne(request.object, {\n filter: { _id: request.id }\n });\n if (result) {\n return {\n object: request.object,\n id: request.id,\n record: result\n };\n }\n throw new Error(`Record ${request.id} not found in ${request.object}`);\n }\n\n async createData(request: { object: string, data: any }) {\n const result = await this.engine.insert(request.object, request.data);\n return {\n object: request.object,\n id: result._id || result.id,\n record: result\n };\n }\n\n async updateData(request: { object: string, id: string, data: any }) {\n // Adapt: update(obj, id, data) -> update(obj, data, options)\n const result = await this.engine.update(request.object, request.data, { filter: { _id: request.id } });\n return {\n object: request.object,\n id: request.id,\n record: result\n };\n }\n\n async deleteData(request: { object: string, id: string }) {\n // Adapt: delete(obj, id) -> delete(obj, options)\n await this.engine.delete(request.object, { filter: { _id: request.id } });\n return {\n object: request.object,\n id: request.id,\n success: true\n };\n }\n\n // ==========================================\n // Metadata Caching\n // ==========================================\n\n async getMetaItemCached(request: { type: string, name: string, cacheRequest?: MetadataCacheRequest }): Promise<MetadataCacheResponse> {\n try {\n const item = SchemaRegistry.getItem(request.type, request.name);\n if (!item) {\n throw new Error(`Metadata item ${request.type}/${request.name} not found`);\n }\n\n // Calculate ETag (simple hash of the stringified metadata)\n const content = JSON.stringify(item);\n const hash = simpleHash(content);\n const etag = { value: hash, weak: false };\n\n // Check If-None-Match header\n if (request.cacheRequest?.ifNoneMatch) {\n const clientEtag = request.cacheRequest.ifNoneMatch.replace(/^\"(.*)\"$/, '$1').replace(/^W\\/\"(.*)\"$/, '$1');\n if (clientEtag === hash) {\n // Return 304 Not Modified\n return {\n notModified: true,\n etag,\n };\n }\n }\n\n // Return full metadata with cache headers\n return {\n data: item,\n etag,\n lastModified: new Date().toISOString(),\n cacheControl: {\n directives: ['public', 'max-age'],\n maxAge: 3600, // 1 hour\n },\n notModified: false,\n };\n } catch (error: any) {\n throw error;\n }\n }\n\n // ==========================================\n // Batch Operations\n // ==========================================\n\n async batchData(_request: { object: string, request: BatchUpdateRequest }): Promise<BatchUpdateResponse> {\n // Map high-level batch request to DataEngine batch if available\n // Or implement loop here.\n // For now, let's just fail or implement basic loop to satisfying interface\n // since full batch mapping requires careful type handling.\n throw new Error('Batch operations not yet fully implemented in protocol adapter');\n }\n \n async createManyData(request: { object: string, records: any[] }): Promise<any> {\n const records = await this.engine.insert(request.object, request.records);\n return {\n object: request.object,\n records,\n count: records.length\n };\n }\n \n async updateManyData(_request: UpdateManyDataRequest): Promise<any> {\n // TODO: Implement proper updateMany in DataEngine\n throw new Error('updateManyData not implemented');\n }\n\n async analyticsQuery(_request: any): Promise<any> {\n throw new Error('analyticsQuery not implemented');\n }\n\n async getAnalyticsMeta(_request: any): Promise<any> {\n throw new Error('getAnalyticsMeta not implemented');\n }\n\n async triggerAutomation(_request: any): Promise<any> {\n throw new Error('triggerAutomation not implemented');\n }\n\n async listSpaces(_request: any): Promise<any> {\n throw new Error('listSpaces not implemented');\n }\n\n async createSpace(_request: any): Promise<any> {\n throw new Error('createSpace not implemented');\n }\n\n async installPlugin(_request: any): Promise<any> {\n throw new Error('installPlugin not implemented');\n }\n\n async deleteManyData(request: DeleteManyDataRequest): Promise<any> {\n // This expects deleting by IDs.\n return this.engine.delete(request.object, {\n filter: { _id: { $in: request.ids } },\n ...request.options\n });\n }\n\n async saveMetaItem(request: { type: string, name: string, item?: any }) {\n if (!request.item) {\n throw new Error('Item data is required');\n }\n // Default implementation saves to Memory Registry\n SchemaRegistry.registerItem(request.type, request.item, 'name');\n return {\n success: true,\n message: 'Saved to memory registry'\n };\n }\n}\n","import { QueryAST, HookContext } from '@objectstack/spec/data';\nimport { \n DataEngineQueryOptions, \n DataEngineInsertOptions, \n DataEngineUpdateOptions, \n DataEngineDeleteOptions,\n DataEngineAggregateOptions,\n DataEngineCountOptions \n} from '@objectstack/spec/data';\nimport { DriverInterface, IDataEngine, Logger, createLogger } from '@objectstack/core';\nimport { CoreServiceName } from '@objectstack/spec/system';\nimport { SchemaRegistry } from './registry.js';\n\nexport type HookHandler = (context: HookContext) => Promise<void> | void;\n\n/**\n * Host Context provided to plugins (Internal ObjectQL Plugin System)\n */\nexport interface ObjectQLHostContext {\n ql: ObjectQL;\n logger: Logger;\n // Extensible map for host-specific globals (like HTTP Router, etc.)\n [key: string]: any;\n}\n\n/**\n * ObjectQL Engine\n * \n * Implements the IDataEngine interface for data persistence.\n * Acts as the reference implementation for:\n * - CoreServiceName.data (CRUD)\n * - CoreServiceName.metadata (Schema Registry)\n */\nexport class ObjectQL implements IDataEngine {\n private drivers = new Map<string, DriverInterface>();\n private defaultDriver: string | null = null;\n private logger: Logger;\n \n // Hooks Registry\n private hooks: Record<string, HookHandler[]> = {\n 'beforeFind': [], 'afterFind': [],\n 'beforeInsert': [], 'afterInsert': [],\n 'beforeUpdate': [], 'afterUpdate': [],\n 'beforeDelete': [], 'afterDelete': [],\n };\n \n // Host provided context additions (e.g. Server router)\n private hostContext: Record<string, any> = {};\n\n constructor(hostContext: Record<string, any> = {}) {\n this.hostContext = hostContext;\n // Use provided logger or create a new one\n this.logger = hostContext.logger || createLogger({ level: 'info', format: 'pretty' });\n this.logger.info('ObjectQL Engine Instance Created');\n }\n\n /**\n * Service Status Report\n * Used by Kernel to verify health and capabilities.\n */\n getStatus() {\n return {\n name: CoreServiceName.enum.data,\n status: 'running',\n version: '0.9.0',\n features: ['crud', 'query', 'aggregate', 'transactions', 'metadata']\n };\n }\n\n /**\n * Expose the SchemaRegistry for plugins to register metadata\n */\n get registry() {\n return SchemaRegistry;\n }\n\n /**\n * Load and Register a Plugin\n */\n async use(manifestPart: any, runtimePart?: any) {\n this.logger.debug('Loading plugin', { \n hasManifest: !!manifestPart, \n hasRuntime: !!runtimePart \n });\n\n // 1. Validate / Register Manifest\n if (manifestPart) {\n this.registerApp(manifestPart);\n }\n\n // 2. Execute Runtime\n if (runtimePart) {\n const pluginDef = (runtimePart as any).default || runtimePart;\n if (pluginDef.onEnable) {\n this.logger.debug('Executing plugin runtime onEnable');\n \n const context: ObjectQLHostContext = {\n ql: this,\n logger: this.logger,\n // Expose the driver registry helper explicitly if needed\n drivers: {\n register: (driver: DriverInterface) => this.registerDriver(driver)\n },\n ...this.hostContext\n };\n \n await pluginDef.onEnable(context);\n this.logger.debug('Plugin runtime onEnable completed');\n }\n }\n }\n\n /**\n * Register a hook\n * @param event The event name (e.g. 'beforeFind', 'afterInsert')\n * @param handler The handler function\n */\n registerHook(event: string, handler: HookHandler) {\n if (!this.hooks[event]) {\n this.hooks[event] = [];\n }\n this.hooks[event].push(handler);\n this.logger.debug('Registered hook', { event, totalHandlers: this.hooks[event].length });\n }\n\n public async triggerHooks(event: string, context: HookContext) {\n const handlers = this.hooks[event] || [];\n \n if (handlers.length === 0) {\n this.logger.debug('No hooks registered for event', { event });\n return;\n }\n\n this.logger.debug('Triggering hooks', { event, count: handlers.length });\n \n for (const handler of handlers) {\n await handler(context);\n }\n }\n\n /**\n * Register contribution (Manifest)\n */\n registerApp(manifest: any) {\n const id = manifest.id;\n this.logger.debug('Registering app manifest', { id });\n\n // Register objects\n if (manifest.objects) {\n if (Array.isArray(manifest.objects)) {\n this.logger.debug('Registering objects from manifest (Array)', { id, objectCount: manifest.objects.length });\n for (const objDef of manifest.objects) {\n SchemaRegistry.registerObject(objDef);\n this.logger.debug('Registered Object', { object: objDef.name, from: id });\n }\n } else {\n this.logger.debug('Registering objects from manifest (Map)', { id, objectCount: Object.keys(manifest.objects).length });\n for (const [name, objDef] of Object.entries(manifest.objects)) {\n // Ensure name in definition matches key\n (objDef as any).name = name;\n SchemaRegistry.registerObject(objDef as any);\n this.logger.debug('Registered Object', { object: name, from: id });\n }\n }\n }\n\n // Register contributions\n if (manifest.contributes?.kinds) {\n this.logger.debug('Registering kinds from manifest', { id, kindCount: manifest.contributes.kinds.length });\n for (const kind of manifest.contributes.kinds) {\n SchemaRegistry.registerKind(kind);\n this.logger.debug('Registered Kind', { kind: kind.name || kind.type, from: id });\n }\n }\n }\n\n /**\n * Register a new storage driver\n */\n registerDriver(driver: DriverInterface, isDefault: boolean = false) {\n if (this.drivers.has(driver.name)) {\n this.logger.warn('Driver already registered, skipping', { driverName: driver.name });\n return;\n }\n\n this.drivers.set(driver.name, driver);\n this.logger.info('Registered driver', { \n driverName: driver.name, \n version: driver.version\n });\n\n if (isDefault || this.drivers.size === 1) {\n this.defaultDriver = driver.name;\n this.logger.info('Set default driver', { driverName: driver.name });\n }\n }\n\n /**\n * Helper to get object definition\n */\n getSchema(objectName: string) {\n return SchemaRegistry.getObject(objectName);\n }\n\n /**\n * Helper to get the target driver\n */\n private getDriver(objectName: string): DriverInterface {\n const object = SchemaRegistry.getObject(objectName);\n \n // 1. If object definition exists, check for explicit datasource\n if (object) {\n const datasourceName = object.datasource || 'default';\n \n // If configured for 'default', try to find the default driver\n if (datasourceName === 'default') {\n if (this.defaultDriver && this.drivers.has(this.defaultDriver)) {\n return this.drivers.get(this.defaultDriver)!;\n }\n } else {\n // Specific datasource requested\n if (this.drivers.has(datasourceName)) {\n return this.drivers.get(datasourceName)!;\n }\n throw new Error(`[ObjectQL] Datasource '${datasourceName}' configured for object '${objectName}' is not registered.`);\n }\n }\n\n // 2. Fallback for ad-hoc objects or missing definitions\n if (this.defaultDriver) {\n return this.drivers.get(this.defaultDriver)!;\n }\n\n throw new Error(`[ObjectQL] No driver available for object '${objectName}'`);\n }\n\n /**\n * Initialize the engine and all registered drivers\n */\n async init() {\n this.logger.info('Initializing ObjectQL engine', { \n driverCount: this.drivers.size,\n drivers: Array.from(this.drivers.keys())\n });\n \n for (const [name, driver] of this.drivers) {\n try {\n await driver.connect();\n this.logger.info('Driver connected successfully', { driverName: name });\n } catch (e) {\n this.logger.error('Failed to connect driver', e as Error, { driverName: name });\n }\n }\n \n this.logger.info('ObjectQL engine initialization complete');\n }\n\n async destroy() {\n this.logger.info('Destroying ObjectQL engine', { driverCount: this.drivers.size });\n \n for (const [name, driver] of this.drivers.entries()) {\n try {\n await driver.disconnect();\n } catch (e) {\n this.logger.error('Error disconnecting driver', e as Error, { driverName: name });\n }\n }\n \n this.logger.info('ObjectQL engine destroyed');\n }\n\n // ============================================\n // Helper: Query Conversion\n // ============================================\n\n private toQueryAST(object: string, options?: DataEngineQueryOptions): QueryAST {\n const ast: QueryAST = { object };\n if (!options) return ast;\n\n if (options.filter) {\n ast.where = options.filter;\n }\n if (options.select) {\n ast.fields = options.select;\n }\n if (options.sort) {\n // Support DataEngineSortSchema variant\n if (Array.isArray(options.sort)) {\n // [{ field: 'a', order: 'asc' }]\n ast.orderBy = options.sort; \n } else {\n // Record<string, 'asc' | 'desc' | 1 | -1>\n ast.orderBy = Object.entries(options.sort).map(([field, order]) => ({\n field,\n order: (order === -1 || order === 'desc') ? 'desc' : 'asc'\n }));\n }\n }\n \n if (options.top !== undefined) ast.limit = options.top;\n else if (options.limit !== undefined) ast.limit = options.limit;\n \n if (options.skip !== undefined) ast.offset = options.skip;\n\n // TODO: Handle populate/joins mapping if Driver supports it in QueryAST\n return ast;\n }\n\n // ============================================\n // Data Access Methods (IDataEngine Interface)\n // ============================================\n\n async find(object: string, query?: DataEngineQueryOptions): Promise<any[]> {\n this.logger.debug('Find operation starting', { object, query });\n const driver = this.getDriver(object);\n const ast = this.toQueryAST(object, query);\n\n const hookContext: HookContext = {\n object,\n event: 'beforeFind',\n input: { ast, options: undefined }, // Should map options?\n ql: this\n };\n await this.triggerHooks('beforeFind', hookContext);\n\n try {\n const result = await driver.find(object, hookContext.input.ast, hookContext.input.options);\n \n hookContext.event = 'afterFind';\n hookContext.result = result;\n await this.triggerHooks('afterFind', hookContext);\n \n return hookContext.result;\n } catch (e) {\n this.logger.error('Find operation failed', e as Error, { object });\n throw e;\n }\n }\n\n async findOne(objectName: string, query?: DataEngineQueryOptions): Promise<any> {\n this.logger.debug('FindOne operation', { objectName });\n const driver = this.getDriver(objectName);\n const ast = this.toQueryAST(objectName, query);\n ast.limit = 1;\n\n // Reuse find logic or call generic driver.findOne if available\n // Assuming driver has findOne\n return driver.findOne(objectName, ast);\n }\n\n async insert(object: string, data: any | any[], options?: DataEngineInsertOptions): Promise<any> {\n this.logger.debug('Insert operation starting', { object, isBatch: Array.isArray(data) });\n const driver = this.getDriver(object);\n\n const hookContext: HookContext = {\n object,\n event: 'beforeInsert',\n input: { data, options },\n ql: this\n };\n await this.triggerHooks('beforeInsert', hookContext);\n\n try {\n let result;\n if (Array.isArray(hookContext.input.data)) {\n // Bulk Create\n if (driver.bulkCreate) {\n result = await driver.bulkCreate(object, hookContext.input.data, hookContext.input.options);\n } else {\n // Fallback loop\n result = await Promise.all(hookContext.input.data.map((item: any) => driver.create(object, item, hookContext.input.options)));\n }\n } else {\n result = await driver.create(object, hookContext.input.data, hookContext.input.options);\n }\n\n hookContext.event = 'afterInsert';\n hookContext.result = result;\n await this.triggerHooks('afterInsert', hookContext);\n\n return hookContext.result;\n } catch (e) {\n this.logger.error('Insert operation failed', e as Error, { object });\n throw e;\n }\n }\n\n async update(object: string, data: any, options?: DataEngineUpdateOptions): Promise<any> {\n // NOTE: This signature is tricky because Driver expects (obj, id, data) usually.\n // DataEngine protocol puts filter in options.\n this.logger.debug('Update operation starting', { object });\n const driver = this.getDriver(object);\n \n // 1. Extract ID from data or filter if it's a single update by ID\n // This is a simplification. Real implementation needs robust filter handling.\n let id = data.id || data._id;\n if (!id && options?.filter) {\n // Optimization: If filter is simple ID check, extract it\n if (typeof options.filter === 'string') id = options.filter;\n else if (options.filter._id) id = options.filter._id;\n else if (options.filter.id) id = options.filter.id;\n }\n\n const hookContext: HookContext = {\n object,\n event: 'beforeUpdate',\n input: { id, data, options },\n ql: this\n };\n await this.triggerHooks('beforeUpdate', hookContext);\n\n try {\n let result;\n if (hookContext.input.id) {\n // Single update by ID\n result = await driver.update(object, hookContext.input.id, hookContext.input.data, hookContext.input.options);\n } else if (options?.multi && driver.updateMany) {\n // Bulk update by Query\n const ast = this.toQueryAST(object, { filter: options.filter });\n result = await driver.updateMany(object, ast, hookContext.input.data, hookContext.input.options);\n } else {\n throw new Error('Update requires an ID or options.multi=true');\n }\n\n hookContext.event = 'afterUpdate';\n hookContext.result = result;\n await this.triggerHooks('afterUpdate', hookContext);\n return hookContext.result;\n } catch (e) {\n this.logger.error('Update operation failed', e as Error, { object });\n throw e;\n }\n }\n\n async delete(object: string, options?: DataEngineDeleteOptions): Promise<any> {\n this.logger.debug('Delete operation starting', { object });\n const driver = this.getDriver(object);\n\n // Extract ID logic similar to update\n let id: any = undefined;\n if (options?.filter) {\n if (typeof options.filter === 'string') id = options.filter;\n else if (options.filter._id) id = options.filter._id;\n else if (options.filter.id) id = options.filter.id;\n }\n\n const hookContext: HookContext = {\n object,\n event: 'beforeDelete',\n input: { id, options },\n ql: this\n };\n await this.triggerHooks('beforeDelete', hookContext);\n\n try {\n let result;\n if (hookContext.input.id) {\n result = await driver.delete(object, hookContext.input.id, hookContext.input.options);\n } else if (options?.multi && driver.deleteMany) {\n const ast = this.toQueryAST(object, { filter: options.filter });\n result = await driver.deleteMany(object, ast, hookContext.input.options);\n } else {\n throw new Error('Delete requires an ID or options.multi=true');\n }\n\n hookContext.event = 'afterDelete';\n hookContext.result = result;\n await this.triggerHooks('afterDelete', hookContext);\n return hookContext.result;\n } catch (e) {\n this.logger.error('Delete operation failed', e as Error, { object });\n throw e;\n }\n }\n\n async count(object: string, query?: DataEngineCountOptions): Promise<number> {\n const driver = this.getDriver(object);\n if (driver.count) {\n const ast = this.toQueryAST(object, { filter: query?.filter });\n return driver.count(object, ast);\n }\n // Fallback to find().length\n const res = await this.find(object, { filter: query?.filter, select: ['_id'] });\n return res.length;\n }\n\n async aggregate(object: string, query: DataEngineAggregateOptions): Promise<any[]> {\n const driver = this.getDriver(object);\n this.logger.debug(`Aggregate on ${object} using ${driver.name}`, query);\n // Driver needs support for raw aggregation or mapped aggregation\n // For now, if driver supports 'execute', we might pass it down, or we need to add 'aggregate' to DriverInterface\n // In this version, we'll assume driver might handle it via special 'find' or throw not implemented\n throw new Error('Aggregate not yet fully implemented in ObjectQL->Driver mapping');\n }\n \n async execute(command: any, options?: Record<string, any>): Promise<any> {\n // Direct pass-through implies we know which driver to use?\n // Usually execute is tied to a specific object context OR we need a way to select driver.\n // If command has 'object', we use that.\n if (options?.object) {\n const driver = this.getDriver(options.object);\n if (driver.execute) {\n return driver.execute(command, undefined, options);\n }\n }\n throw new Error('Execute requires options.object to select driver');\n }\n}\n","import { ObjectQL } from './engine.js';\nimport { ObjectStackProtocolImplementation } from './protocol.js';\nimport { Plugin, PluginContext } from '@objectstack/core';\n\nexport type { Plugin, PluginContext };\n\nexport class ObjectQLPlugin implements Plugin {\n name = 'com.objectstack.engine.objectql';\n type = 'objectql' as const;\n version = '1.0.0';\n \n private ql: ObjectQL | undefined;\n private hostContext?: Record<string, any>;\n\n constructor(ql?: ObjectQL, hostContext?: Record<string, any>) {\n if (ql) {\n this.ql = ql;\n } else {\n this.hostContext = hostContext;\n // Lazily created in init\n }\n }\n\n init = async (ctx: PluginContext) => {\n if (!this.ql) {\n this.ql = new ObjectQL(this.hostContext);\n }\n \n // Register as provider for Core Kernel Services\n ctx.registerService('objectql', this.ql);\n ctx.registerService('metadata', this.ql);\n ctx.registerService('data', this.ql); // ObjectQL implements IDataEngine\n ctx.registerService('auth', this.ql);\n \n ctx.logger.info('ObjectQL engine registered as service', { \n provides: ['objectql', 'metadata', 'data', 'auth'] \n });\n\n // Register Protocol Implementation\n const protocolShim = new ObjectStackProtocolImplementation(this.ql);\n\n ctx.registerService('protocol', protocolShim);\n ctx.logger.info('Protocol service registered');\n }\n\n start = async (ctx: PluginContext) => {\n ctx.logger.info('ObjectQL engine initialized');\n \n // Discover features from Kernel Services\n if (ctx.getServices && this.ql) {\n const services = ctx.getServices();\n for (const [name, service] of services.entries()) {\n if (name.startsWith('driver.')) {\n // Register Driver\n this.ql.registerDriver(service);\n ctx.logger.debug('Discovered and registered driver service', { serviceName: name });\n }\n if (name.startsWith('app.')) {\n // Register App\n this.ql.registerApp(service); // service is Manifest\n ctx.logger.debug('Discovered and registered app service', { serviceName: name });\n }\n }\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/registry.ts","../src/protocol.ts","../src/engine.ts","../src/plugin.ts"],"sourcesContent":["// Export Registry\nexport { SchemaRegistry } from './registry.js';\n\n// Export Protocol Implementation\nexport { ObjectStackProtocolImplementation } from './protocol.js';\n\n// Export Engine\nexport { ObjectQL } from './engine.js';\nexport type { ObjectQLHostContext, HookHandler } from './engine.js';\n\n// Export Plugin Shim\nexport { ObjectQLPlugin } from './plugin.js';\n\n// Moved logic to engine.ts\n","import { ServiceObject, ObjectSchema } from '@objectstack/spec/data';\nimport { ObjectStackManifest, ManifestSchema } from '@objectstack/spec/kernel';\nimport { AppSchema } from '@objectstack/spec/ui';\n\n/**\n * Global Schema Registry\n * Unified storage for all metadata types (Objects, Apps, Flows, Layouts, etc.)\n */\nexport class SchemaRegistry {\n // Nested Map: Type -> Name/ID -> MetadataItem\n private static metadata = new Map<string, Map<string, any>>();\n\n /**\n * Universal Register Method\n * @param type The category of metadata (e.g., 'object', 'app', 'plugin')\n * @param item The metadata item itself\n * @param keyField The property to use as the unique key (default: 'name')\n */\n static registerItem<T>(type: string, item: T, keyField: keyof T = 'name' as keyof T) {\n if (!this.metadata.has(type)) {\n this.metadata.set(type, new Map());\n }\n const collection = this.metadata.get(type)!;\n const key = String(item[keyField]);\n\n // Validation Hook\n try {\n this.validate(type, item);\n } catch (e: any) {\n console.error(`[Registry] Validation failed for ${type} ${key}: ${e.message}`);\n // For now, warn but don't crash, allowing partial/legacy loads\n // throw e; \n }\n\n if (collection.has(key)) {\n console.warn(`[Registry] Overwriting ${type}: ${key}`);\n }\n collection.set(key, item);\n console.log(`[Registry] Registered ${type}: ${key}`);\n }\n\n /**\n * Validate Metadata against Spec Zod Schemas\n */\n static validate(type: string, item: any) {\n if (type === 'object') {\n return ObjectSchema.parse(item);\n }\n if (type === 'app') {\n // AppSchema might rely on Zod, imported via UI protocol\n return AppSchema.parse(item);\n }\n if (type === 'plugin') {\n return ManifestSchema.parse(item);\n }\n // Add more validations as needed\n return true;\n }\n\n /**\n * Universal Unregister Method\n */\n static unregisterItem(type: string, name: string) {\n const collection = this.metadata.get(type);\n if (collection && collection.has(name)) {\n collection.delete(name);\n console.log(`[Registry] Unregistered ${type}: ${name}`);\n } else {\n console.warn(`[Registry] Attempted to unregister non-existent ${type}: ${name}`);\n }\n }\n\n /**\n * Universal Get Method\n */\n static getItem<T>(type: string, name: string): T | undefined {\n return this.metadata.get(type)?.get(name) as T;\n }\n\n /**\n * Universal List Method\n */\n static listItems<T>(type: string): T[] {\n return Array.from(this.metadata.get(type)?.values() || []) as T[];\n }\n\n /**\n * Get all registered metadata types (Kinds)\n */\n static getRegisteredTypes(): string[] {\n return Array.from(this.metadata.keys());\n }\n\n // ==========================================\n // Typed Helper Methods (Shortcuts)\n // ==========================================\n\n /**\n * Object Helpers\n */\n static registerObject(schema: ServiceObject) {\n this.registerItem('object', schema, 'name');\n }\n\n static getObject(name: string): ServiceObject | undefined {\n return this.getItem<ServiceObject>('object', name);\n }\n\n static getAllObjects(): ServiceObject[] {\n return this.listItems<ServiceObject>('object');\n }\n\n /**\n * Plugin Helpers\n */\n static registerPlugin(manifest: ObjectStackManifest) {\n this.registerItem('plugin', manifest, 'id');\n }\n\n static getAllPlugins(): ObjectStackManifest[] {\n return this.listItems<ObjectStackManifest>('plugin');\n }\n\n /**\n * Kind (Metadata Type) Helpers\n */\n static registerKind(kind: { id: string, globs: string[] }) {\n this.registerItem('kind', kind, 'id');\n }\n \n static getAllKinds(): { id: string, globs: string[] }[] {\n return this.listItems('kind');\n }\n}\n","import { ObjectStackProtocol } from '@objectstack/spec/api';\nimport { IDataEngine } from '@objectstack/core';\nimport type { \n BatchUpdateRequest, \n BatchUpdateResponse, \n UpdateManyDataRequest,\n DeleteManyDataRequest\n} from '@objectstack/spec/api';\nimport type { MetadataCacheRequest, MetadataCacheResponse } from '@objectstack/spec/api';\n\n// We import SchemaRegistry directly since this class lives in the same package\nimport { SchemaRegistry } from './registry.js';\n\n/**\n * Simple hash function for ETag generation (browser-compatible)\n * Uses a basic hash algorithm instead of crypto.createHash\n */\nfunction simpleHash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return Math.abs(hash).toString(16);\n}\n\nexport class ObjectStackProtocolImplementation implements ObjectStackProtocol {\n private engine: IDataEngine;\n\n constructor(engine: IDataEngine) {\n this.engine = engine;\n }\n\n async getDiscovery(_request: {}) {\n return {\n version: '1.0',\n apiName: 'ObjectStack API',\n capabilities: {\n graphql: false,\n search: false,\n websockets: false,\n files: true,\n analytics: false,\n hub: false\n },\n endpoints: {\n data: '/api/data',\n metadata: '/api/meta',\n auth: '/api/auth'\n }\n };\n }\n\n async getMetaTypes(_request: {}) {\n return {\n types: SchemaRegistry.getRegisteredTypes()\n };\n }\n\n async getMetaItems(request: { type: string }) {\n return {\n type: request.type,\n items: SchemaRegistry.listItems(request.type)\n };\n }\n\n async getMetaItem(request: { type: string, name: string }) {\n return {\n type: request.type,\n name: request.name,\n item: SchemaRegistry.getItem(request.type, request.name)\n };\n }\n\n async getUiView(request: { object: string, type: 'list' | 'form' }) {\n const schema = SchemaRegistry.getObject(request.object);\n if (!schema) throw new Error(`Object ${request.object} not found`);\n\n let view: any;\n if (request.type === 'list') {\n view = {\n type: 'list',\n object: request.object,\n columns: Object.keys(schema.fields || {}).slice(0, 5).map(f => ({\n field: f,\n label: schema.fields[f].label || f\n }))\n };\n } else {\n view = {\n type: 'form',\n object: request.object,\n sections: [\n {\n label: 'General',\n fields: Object.keys(schema.fields || {}).map(f => ({\n field: f\n }))\n }\n ]\n };\n }\n return view;\n }\n\n async findData(request: { object: string, query?: any }) {\n // TODO: Normalize query from HTTP Query params (string values) to DataEngineQueryOptions (typed)\n // For now, we assume query is partially compatible or simple enough.\n // We should parse 'top', 'skip', 'limit' to numbers if they are strings.\n const options: any = { ...request.query };\n if (options.top) options.top = Number(options.top);\n if (options.skip) options.skip = Number(options.skip);\n if (options.limit) options.limit = Number(options.limit);\n \n // Handle OData style $filter if present, or flat filters\n // This is a naive implementation, a real OData parser is needed for complex scenarios.\n \n const records = await this.engine.find(request.object, options);\n return {\n object: request.object,\n value: records, // OData compaibility\n records, // Legacy\n total: records.length,\n hasMore: false\n };\n }\n\n async getData(request: { object: string, id: string }) {\n const result = await this.engine.findOne(request.object, {\n filter: { _id: request.id }\n });\n if (result) {\n return {\n object: request.object,\n id: request.id,\n record: result\n };\n }\n throw new Error(`Record ${request.id} not found in ${request.object}`);\n }\n\n async createData(request: { object: string, data: any }) {\n const result = await this.engine.insert(request.object, request.data);\n return {\n object: request.object,\n id: result._id || result.id,\n record: result\n };\n }\n\n async updateData(request: { object: string, id: string, data: any }) {\n // Adapt: update(obj, id, data) -> update(obj, data, options)\n const result = await this.engine.update(request.object, request.data, { filter: { _id: request.id } });\n return {\n object: request.object,\n id: request.id,\n record: result\n };\n }\n\n async deleteData(request: { object: string, id: string }) {\n // Adapt: delete(obj, id) -> delete(obj, options)\n await this.engine.delete(request.object, { filter: { _id: request.id } });\n return {\n object: request.object,\n id: request.id,\n success: true\n };\n }\n\n // ==========================================\n // Metadata Caching\n // ==========================================\n\n async getMetaItemCached(request: { type: string, name: string, cacheRequest?: MetadataCacheRequest }): Promise<MetadataCacheResponse> {\n try {\n const item = SchemaRegistry.getItem(request.type, request.name);\n if (!item) {\n throw new Error(`Metadata item ${request.type}/${request.name} not found`);\n }\n\n // Calculate ETag (simple hash of the stringified metadata)\n const content = JSON.stringify(item);\n const hash = simpleHash(content);\n const etag = { value: hash, weak: false };\n\n // Check If-None-Match header\n if (request.cacheRequest?.ifNoneMatch) {\n const clientEtag = request.cacheRequest.ifNoneMatch.replace(/^\"(.*)\"$/, '$1').replace(/^W\\/\"(.*)\"$/, '$1');\n if (clientEtag === hash) {\n // Return 304 Not Modified\n return {\n notModified: true,\n etag,\n };\n }\n }\n\n // Return full metadata with cache headers\n return {\n data: item,\n etag,\n lastModified: new Date().toISOString(),\n cacheControl: {\n directives: ['public', 'max-age'],\n maxAge: 3600, // 1 hour\n },\n notModified: false,\n };\n } catch (error: any) {\n throw error;\n }\n }\n\n // ==========================================\n // Batch Operations\n // ==========================================\n\n async batchData(_request: { object: string, request: BatchUpdateRequest }): Promise<BatchUpdateResponse> {\n // Map high-level batch request to DataEngine batch if available\n // Or implement loop here.\n // For now, let's just fail or implement basic loop to satisfying interface\n // since full batch mapping requires careful type handling.\n throw new Error('Batch operations not yet fully implemented in protocol adapter');\n }\n \n async createManyData(request: { object: string, records: any[] }): Promise<any> {\n const records = await this.engine.insert(request.object, request.records);\n return {\n object: request.object,\n records,\n count: records.length\n };\n }\n \n async updateManyData(_request: UpdateManyDataRequest): Promise<any> {\n // TODO: Implement proper updateMany in DataEngine\n throw new Error('updateManyData not implemented');\n }\n\n async analyticsQuery(_request: any): Promise<any> {\n throw new Error('analyticsQuery not implemented');\n }\n\n async getAnalyticsMeta(_request: any): Promise<any> {\n throw new Error('getAnalyticsMeta not implemented');\n }\n\n async triggerAutomation(_request: any): Promise<any> {\n throw new Error('triggerAutomation not implemented');\n }\n\n async listSpaces(_request: any): Promise<any> {\n throw new Error('listSpaces not implemented');\n }\n\n async createSpace(_request: any): Promise<any> {\n throw new Error('createSpace not implemented');\n }\n\n async installPlugin(_request: any): Promise<any> {\n throw new Error('installPlugin not implemented');\n }\n\n async deleteManyData(request: DeleteManyDataRequest): Promise<any> {\n // This expects deleting by IDs.\n return this.engine.delete(request.object, {\n filter: { _id: { $in: request.ids } },\n ...request.options\n });\n }\n\n async saveMetaItem(request: { type: string, name: string, item?: any }) {\n if (!request.item) {\n throw new Error('Item data is required');\n }\n // Default implementation saves to Memory Registry\n SchemaRegistry.registerItem(request.type, request.item, 'name');\n return {\n success: true,\n message: 'Saved to memory registry'\n };\n }\n}\n","import { QueryAST, HookContext } from '@objectstack/spec/data';\nimport { \n DataEngineQueryOptions, \n DataEngineInsertOptions, \n DataEngineUpdateOptions, \n DataEngineDeleteOptions,\n DataEngineAggregateOptions,\n DataEngineCountOptions \n} from '@objectstack/spec/data';\nimport { DriverInterface, IDataEngine, Logger, createLogger } from '@objectstack/core';\nimport { CoreServiceName } from '@objectstack/spec/system';\nimport { SchemaRegistry } from './registry.js';\n\nexport type HookHandler = (context: HookContext) => Promise<void> | void;\n\n/**\n * Host Context provided to plugins (Internal ObjectQL Plugin System)\n */\nexport interface ObjectQLHostContext {\n ql: ObjectQL;\n logger: Logger;\n // Extensible map for host-specific globals (like HTTP Router, etc.)\n [key: string]: any;\n}\n\n/**\n * ObjectQL Engine\n * \n * Implements the IDataEngine interface for data persistence.\n * Acts as the reference implementation for:\n * - CoreServiceName.data (CRUD)\n * - CoreServiceName.metadata (Schema Registry)\n */\nexport class ObjectQL implements IDataEngine {\n private drivers = new Map<string, DriverInterface>();\n private defaultDriver: string | null = null;\n private logger: Logger;\n \n // Hooks Registry\n private hooks: Record<string, HookHandler[]> = {\n 'beforeFind': [], 'afterFind': [],\n 'beforeInsert': [], 'afterInsert': [],\n 'beforeUpdate': [], 'afterUpdate': [],\n 'beforeDelete': [], 'afterDelete': [],\n };\n \n // Host provided context additions (e.g. Server router)\n private hostContext: Record<string, any> = {};\n\n constructor(hostContext: Record<string, any> = {}) {\n this.hostContext = hostContext;\n // Use provided logger or create a new one\n this.logger = hostContext.logger || createLogger({ level: 'info', format: 'pretty' });\n this.logger.info('ObjectQL Engine Instance Created');\n }\n\n /**\n * Service Status Report\n * Used by Kernel to verify health and capabilities.\n */\n getStatus() {\n return {\n name: CoreServiceName.enum.data,\n status: 'running',\n version: '0.9.0',\n features: ['crud', 'query', 'aggregate', 'transactions', 'metadata']\n };\n }\n\n /**\n * Expose the SchemaRegistry for plugins to register metadata\n */\n get registry() {\n return SchemaRegistry;\n }\n\n /**\n * Load and Register a Plugin\n */\n async use(manifestPart: any, runtimePart?: any) {\n this.logger.debug('Loading plugin', { \n hasManifest: !!manifestPart, \n hasRuntime: !!runtimePart \n });\n\n // 1. Validate / Register Manifest\n if (manifestPart) {\n this.registerApp(manifestPart);\n }\n\n // 2. Execute Runtime\n if (runtimePart) {\n const pluginDef = (runtimePart as any).default || runtimePart;\n if (pluginDef.onEnable) {\n this.logger.debug('Executing plugin runtime onEnable');\n \n const context: ObjectQLHostContext = {\n ql: this,\n logger: this.logger,\n // Expose the driver registry helper explicitly if needed\n drivers: {\n register: (driver: DriverInterface) => this.registerDriver(driver)\n },\n ...this.hostContext\n };\n \n await pluginDef.onEnable(context);\n this.logger.debug('Plugin runtime onEnable completed');\n }\n }\n }\n\n /**\n * Register a hook\n * @param event The event name (e.g. 'beforeFind', 'afterInsert')\n * @param handler The handler function\n */\n registerHook(event: string, handler: HookHandler) {\n if (!this.hooks[event]) {\n this.hooks[event] = [];\n }\n this.hooks[event].push(handler);\n this.logger.debug('Registered hook', { event, totalHandlers: this.hooks[event].length });\n }\n\n public async triggerHooks(event: string, context: HookContext) {\n const handlers = this.hooks[event] || [];\n \n if (handlers.length === 0) {\n this.logger.debug('No hooks registered for event', { event });\n return;\n }\n\n this.logger.debug('Triggering hooks', { event, count: handlers.length });\n \n for (const handler of handlers) {\n await handler(context);\n }\n }\n\n /**\n * Register contribution (Manifest)\n */\n registerApp(manifest: any) {\n const id = manifest.id;\n this.logger.debug('Registering app manifest', { id });\n\n // Register objects\n if (manifest.objects) {\n if (Array.isArray(manifest.objects)) {\n this.logger.debug('Registering objects from manifest (Array)', { id, objectCount: manifest.objects.length });\n for (const objDef of manifest.objects) {\n SchemaRegistry.registerObject(objDef);\n this.logger.debug('Registered Object', { object: objDef.name, from: id });\n }\n } else {\n this.logger.debug('Registering objects from manifest (Map)', { id, objectCount: Object.keys(manifest.objects).length });\n for (const [name, objDef] of Object.entries(manifest.objects)) {\n // Ensure name in definition matches key\n (objDef as any).name = name;\n SchemaRegistry.registerObject(objDef as any);\n this.logger.debug('Registered Object', { object: name, from: id });\n }\n }\n }\n\n // Register contributions\n if (manifest.contributes?.kinds) {\n this.logger.debug('Registering kinds from manifest', { id, kindCount: manifest.contributes.kinds.length });\n for (const kind of manifest.contributes.kinds) {\n SchemaRegistry.registerKind(kind);\n this.logger.debug('Registered Kind', { kind: kind.name || kind.type, from: id });\n }\n }\n }\n\n /**\n * Register a new storage driver\n */\n registerDriver(driver: DriverInterface, isDefault: boolean = false) {\n if (this.drivers.has(driver.name)) {\n this.logger.warn('Driver already registered, skipping', { driverName: driver.name });\n return;\n }\n\n this.drivers.set(driver.name, driver);\n this.logger.info('Registered driver', { \n driverName: driver.name, \n version: driver.version\n });\n\n if (isDefault || this.drivers.size === 1) {\n this.defaultDriver = driver.name;\n this.logger.info('Set default driver', { driverName: driver.name });\n }\n }\n\n /**\n * Helper to get object definition\n */\n getSchema(objectName: string) {\n return SchemaRegistry.getObject(objectName);\n }\n\n /**\n * Helper to get the target driver\n */\n private getDriver(objectName: string): DriverInterface {\n const object = SchemaRegistry.getObject(objectName);\n \n // 1. If object definition exists, check for explicit datasource\n if (object) {\n const datasourceName = object.datasource || 'default';\n \n // If configured for 'default', try to find the default driver\n if (datasourceName === 'default') {\n if (this.defaultDriver && this.drivers.has(this.defaultDriver)) {\n return this.drivers.get(this.defaultDriver)!;\n }\n } else {\n // Specific datasource requested\n if (this.drivers.has(datasourceName)) {\n return this.drivers.get(datasourceName)!;\n }\n throw new Error(`[ObjectQL] Datasource '${datasourceName}' configured for object '${objectName}' is not registered.`);\n }\n }\n\n // 2. Fallback for ad-hoc objects or missing definitions\n if (this.defaultDriver) {\n return this.drivers.get(this.defaultDriver)!;\n }\n\n throw new Error(`[ObjectQL] No driver available for object '${objectName}'`);\n }\n\n /**\n * Initialize the engine and all registered drivers\n */\n async init() {\n this.logger.info('Initializing ObjectQL engine', { \n driverCount: this.drivers.size,\n drivers: Array.from(this.drivers.keys())\n });\n \n for (const [name, driver] of this.drivers) {\n try {\n await driver.connect();\n this.logger.info('Driver connected successfully', { driverName: name });\n } catch (e) {\n this.logger.error('Failed to connect driver', e as Error, { driverName: name });\n }\n }\n \n this.logger.info('ObjectQL engine initialization complete');\n }\n\n async destroy() {\n this.logger.info('Destroying ObjectQL engine', { driverCount: this.drivers.size });\n \n for (const [name, driver] of this.drivers.entries()) {\n try {\n await driver.disconnect();\n } catch (e) {\n this.logger.error('Error disconnecting driver', e as Error, { driverName: name });\n }\n }\n \n this.logger.info('ObjectQL engine destroyed');\n }\n\n // ============================================\n // Helper: Query Conversion\n // ============================================\n\n private toQueryAST(object: string, options?: DataEngineQueryOptions): QueryAST {\n const ast: QueryAST = { object };\n if (!options) return ast;\n\n if (options.filter) {\n ast.where = options.filter;\n }\n if (options.select) {\n ast.fields = options.select;\n }\n if (options.sort) {\n // Support DataEngineSortSchema variant\n if (Array.isArray(options.sort)) {\n // [{ field: 'a', order: 'asc' }]\n ast.orderBy = options.sort; \n } else {\n // Record<string, 'asc' | 'desc' | 1 | -1>\n ast.orderBy = Object.entries(options.sort).map(([field, order]) => ({\n field,\n order: (order === -1 || order === 'desc') ? 'desc' : 'asc'\n }));\n }\n }\n \n if (options.top !== undefined) ast.limit = options.top;\n else if (options.limit !== undefined) ast.limit = options.limit;\n \n if (options.skip !== undefined) ast.offset = options.skip;\n\n // TODO: Handle populate/joins mapping if Driver supports it in QueryAST\n return ast;\n }\n\n // ============================================\n // Data Access Methods (IDataEngine Interface)\n // ============================================\n\n async find(object: string, query?: DataEngineQueryOptions): Promise<any[]> {\n this.logger.debug('Find operation starting', { object, query });\n const driver = this.getDriver(object);\n const ast = this.toQueryAST(object, query);\n\n const hookContext: HookContext = {\n object,\n event: 'beforeFind',\n input: { ast, options: undefined }, // Should map options?\n ql: this\n };\n await this.triggerHooks('beforeFind', hookContext);\n\n try {\n const result = await driver.find(object, hookContext.input.ast, hookContext.input.options);\n \n hookContext.event = 'afterFind';\n hookContext.result = result;\n await this.triggerHooks('afterFind', hookContext);\n \n return hookContext.result;\n } catch (e) {\n this.logger.error('Find operation failed', e as Error, { object });\n throw e;\n }\n }\n\n async findOne(objectName: string, query?: DataEngineQueryOptions): Promise<any> {\n this.logger.debug('FindOne operation', { objectName });\n const driver = this.getDriver(objectName);\n const ast = this.toQueryAST(objectName, query);\n ast.limit = 1;\n\n // Reuse find logic or call generic driver.findOne if available\n // Assuming driver has findOne\n return driver.findOne(objectName, ast);\n }\n\n async insert(object: string, data: any | any[], options?: DataEngineInsertOptions): Promise<any> {\n this.logger.debug('Insert operation starting', { object, isBatch: Array.isArray(data) });\n const driver = this.getDriver(object);\n\n const hookContext: HookContext = {\n object,\n event: 'beforeInsert',\n input: { data, options },\n ql: this\n };\n await this.triggerHooks('beforeInsert', hookContext);\n\n try {\n let result;\n if (Array.isArray(hookContext.input.data)) {\n // Bulk Create\n if (driver.bulkCreate) {\n result = await driver.bulkCreate(object, hookContext.input.data, hookContext.input.options);\n } else {\n // Fallback loop\n result = await Promise.all(hookContext.input.data.map((item: any) => driver.create(object, item, hookContext.input.options)));\n }\n } else {\n result = await driver.create(object, hookContext.input.data, hookContext.input.options);\n }\n\n hookContext.event = 'afterInsert';\n hookContext.result = result;\n await this.triggerHooks('afterInsert', hookContext);\n\n return hookContext.result;\n } catch (e) {\n this.logger.error('Insert operation failed', e as Error, { object });\n throw e;\n }\n }\n\n async update(object: string, data: any, options?: DataEngineUpdateOptions): Promise<any> {\n // NOTE: This signature is tricky because Driver expects (obj, id, data) usually.\n // DataEngine protocol puts filter in options.\n this.logger.debug('Update operation starting', { object });\n const driver = this.getDriver(object);\n \n // 1. Extract ID from data or filter if it's a single update by ID\n // This is a simplification. Real implementation needs robust filter handling.\n let id = data.id || data._id;\n if (!id && options?.filter) {\n // Optimization: If filter is simple ID check, extract it\n if (typeof options.filter === 'string') id = options.filter;\n else if (options.filter._id) id = options.filter._id;\n else if (options.filter.id) id = options.filter.id;\n }\n\n const hookContext: HookContext = {\n object,\n event: 'beforeUpdate',\n input: { id, data, options },\n ql: this\n };\n await this.triggerHooks('beforeUpdate', hookContext);\n\n try {\n let result;\n if (hookContext.input.id) {\n // Single update by ID\n result = await driver.update(object, hookContext.input.id, hookContext.input.data, hookContext.input.options);\n } else if (options?.multi && driver.updateMany) {\n // Bulk update by Query\n const ast = this.toQueryAST(object, { filter: options.filter });\n result = await driver.updateMany(object, ast, hookContext.input.data, hookContext.input.options);\n } else {\n throw new Error('Update requires an ID or options.multi=true');\n }\n\n hookContext.event = 'afterUpdate';\n hookContext.result = result;\n await this.triggerHooks('afterUpdate', hookContext);\n return hookContext.result;\n } catch (e) {\n this.logger.error('Update operation failed', e as Error, { object });\n throw e;\n }\n }\n\n async delete(object: string, options?: DataEngineDeleteOptions): Promise<any> {\n this.logger.debug('Delete operation starting', { object });\n const driver = this.getDriver(object);\n\n // Extract ID logic similar to update\n let id: any = undefined;\n if (options?.filter) {\n if (typeof options.filter === 'string') id = options.filter;\n else if (options.filter._id) id = options.filter._id;\n else if (options.filter.id) id = options.filter.id;\n }\n\n const hookContext: HookContext = {\n object,\n event: 'beforeDelete',\n input: { id, options },\n ql: this\n };\n await this.triggerHooks('beforeDelete', hookContext);\n\n try {\n let result;\n if (hookContext.input.id) {\n result = await driver.delete(object, hookContext.input.id, hookContext.input.options);\n } else if (options?.multi && driver.deleteMany) {\n const ast = this.toQueryAST(object, { filter: options.filter });\n result = await driver.deleteMany(object, ast, hookContext.input.options);\n } else {\n throw new Error('Delete requires an ID or options.multi=true');\n }\n\n hookContext.event = 'afterDelete';\n hookContext.result = result;\n await this.triggerHooks('afterDelete', hookContext);\n return hookContext.result;\n } catch (e) {\n this.logger.error('Delete operation failed', e as Error, { object });\n throw e;\n }\n }\n\n async count(object: string, query?: DataEngineCountOptions): Promise<number> {\n const driver = this.getDriver(object);\n if (driver.count) {\n const ast = this.toQueryAST(object, { filter: query?.filter });\n return driver.count(object, ast);\n }\n // Fallback to find().length\n const res = await this.find(object, { filter: query?.filter, select: ['_id'] });\n return res.length;\n }\n\n async aggregate(object: string, query: DataEngineAggregateOptions): Promise<any[]> {\n const driver = this.getDriver(object);\n this.logger.debug(`Aggregate on ${object} using ${driver.name}`, query);\n // Driver needs support for raw aggregation or mapped aggregation\n // For now, if driver supports 'execute', we might pass it down, or we need to add 'aggregate' to DriverInterface\n // In this version, we'll assume driver might handle it via special 'find' or throw not implemented\n throw new Error('Aggregate not yet fully implemented in ObjectQL->Driver mapping');\n }\n \n async execute(command: any, options?: Record<string, any>): Promise<any> {\n // Direct pass-through implies we know which driver to use?\n // Usually execute is tied to a specific object context OR we need a way to select driver.\n // If command has 'object', we use that.\n if (options?.object) {\n const driver = this.getDriver(options.object);\n if (driver.execute) {\n return driver.execute(command, undefined, options);\n }\n }\n throw new Error('Execute requires options.object to select driver');\n }\n}\n","import { ObjectQL } from './engine.js';\nimport { ObjectStackProtocolImplementation } from './protocol.js';\nimport { Plugin, PluginContext } from '@objectstack/core';\n\nexport type { Plugin, PluginContext };\n\nexport class ObjectQLPlugin implements Plugin {\n name = 'com.objectstack.engine.objectql';\n type = 'objectql';\n version = '1.0.0';\n \n private ql: ObjectQL | undefined;\n private hostContext?: Record<string, any>;\n\n constructor(ql?: ObjectQL, hostContext?: Record<string, any>) {\n if (ql) {\n this.ql = ql;\n } else {\n this.hostContext = hostContext;\n // Lazily created in init\n }\n }\n\n init = async (ctx: PluginContext) => {\n if (!this.ql) {\n this.ql = new ObjectQL(this.hostContext);\n }\n \n // Register as provider for Core Kernel Services\n ctx.registerService('objectql', this.ql);\n ctx.registerService('metadata', this.ql);\n ctx.registerService('data', this.ql); // ObjectQL implements IDataEngine\n ctx.registerService('auth', this.ql);\n \n ctx.logger.info('ObjectQL engine registered as service', { \n provides: ['objectql', 'metadata', 'data', 'auth'] \n });\n\n // Register Protocol Implementation\n const protocolShim = new ObjectStackProtocolImplementation(this.ql);\n\n ctx.registerService('protocol', protocolShim);\n ctx.logger.info('Protocol service registered');\n }\n\n start = async (ctx: PluginContext) => {\n ctx.logger.info('ObjectQL engine initialized');\n \n // Discover features from Kernel Services\n if (ctx.getServices && this.ql) {\n const services = ctx.getServices();\n for (const [name, service] of services.entries()) {\n if (name.startsWith('driver.')) {\n // Register Driver\n this.ql.registerDriver(service);\n ctx.logger.debug('Discovered and registered driver service', { serviceName: name });\n }\n if (name.startsWith('app.')) {\n // Register App\n this.ql.registerApp(service); // service is Manifest\n ctx.logger.debug('Discovered and registered app service', { serviceName: name });\n }\n }\n }\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/registry.ts","../src/protocol.ts","../src/engine.ts","../src/plugin.ts"],"sourcesContent":["import { ServiceObject, ObjectSchema } from '@objectstack/spec/data';\nimport { ObjectStackManifest, ManifestSchema } from '@objectstack/spec/kernel';\nimport { AppSchema } from '@objectstack/spec/ui';\n\n/**\n * Global Schema Registry\n * Unified storage for all metadata types (Objects, Apps, Flows, Layouts, etc.)\n */\nexport class SchemaRegistry {\n // Nested Map: Type -> Name/ID -> MetadataItem\n private static metadata = new Map<string, Map<string, any>>();\n\n /**\n * Universal Register Method\n * @param type The category of metadata (e.g., 'object', 'app', 'plugin')\n * @param item The metadata item itself\n * @param keyField The property to use as the unique key (default: 'name')\n */\n static registerItem<T>(type: string, item: T, keyField: keyof T = 'name' as keyof T) {\n if (!this.metadata.has(type)) {\n this.metadata.set(type, new Map());\n }\n const collection = this.metadata.get(type)!;\n const key = String(item[keyField]);\n\n // Validation Hook\n try {\n this.validate(type, item);\n } catch (e: any) {\n console.error(`[Registry] Validation failed for ${type} ${key}: ${e.message}`);\n // For now, warn but don't crash, allowing partial/legacy loads\n // throw e; \n }\n\n if (collection.has(key)) {\n console.warn(`[Registry] Overwriting ${type}: ${key}`);\n }\n collection.set(key, item);\n console.log(`[Registry] Registered ${type}: ${key}`);\n }\n\n /**\n * Validate Metadata against Spec Zod Schemas\n */\n static validate(type: string, item: any) {\n if (type === 'object') {\n return ObjectSchema.parse(item);\n }\n if (type === 'app') {\n // AppSchema might rely on Zod, imported via UI protocol\n return AppSchema.parse(item);\n }\n if (type === 'plugin') {\n return ManifestSchema.parse(item);\n }\n // Add more validations as needed\n return true;\n }\n\n /**\n * Universal Unregister Method\n */\n static unregisterItem(type: string, name: string) {\n const collection = this.metadata.get(type);\n if (collection && collection.has(name)) {\n collection.delete(name);\n console.log(`[Registry] Unregistered ${type}: ${name}`);\n } else {\n console.warn(`[Registry] Attempted to unregister non-existent ${type}: ${name}`);\n }\n }\n\n /**\n * Universal Get Method\n */\n static getItem<T>(type: string, name: string): T | undefined {\n return this.metadata.get(type)?.get(name) as T;\n }\n\n /**\n * Universal List Method\n */\n static listItems<T>(type: string): T[] {\n return Array.from(this.metadata.get(type)?.values() || []) as T[];\n }\n\n /**\n * Get all registered metadata types (Kinds)\n */\n static getRegisteredTypes(): string[] {\n return Array.from(this.metadata.keys());\n }\n\n // ==========================================\n // Typed Helper Methods (Shortcuts)\n // ==========================================\n\n /**\n * Object Helpers\n */\n static registerObject(schema: ServiceObject) {\n this.registerItem('object', schema, 'name');\n }\n\n static getObject(name: string): ServiceObject | undefined {\n return this.getItem<ServiceObject>('object', name);\n }\n\n static getAllObjects(): ServiceObject[] {\n return this.listItems<ServiceObject>('object');\n }\n\n /**\n * Plugin Helpers\n */\n static registerPlugin(manifest: ObjectStackManifest) {\n this.registerItem('plugin', manifest, 'id');\n }\n\n static getAllPlugins(): ObjectStackManifest[] {\n return this.listItems<ObjectStackManifest>('plugin');\n }\n\n /**\n * Kind (Metadata Type) Helpers\n */\n static registerKind(kind: { id: string, globs: string[] }) {\n this.registerItem('kind', kind, 'id');\n }\n \n static getAllKinds(): { id: string, globs: string[] }[] {\n return this.listItems('kind');\n }\n}\n","import { ObjectStackProtocol } from '@objectstack/spec/api';\nimport { IDataEngine } from '@objectstack/core';\nimport type { \n BatchUpdateRequest, \n BatchUpdateResponse, \n UpdateManyDataRequest,\n DeleteManyDataRequest\n} from '@objectstack/spec/api';\nimport type { MetadataCacheRequest, MetadataCacheResponse } from '@objectstack/spec/api';\n\n// We import SchemaRegistry directly since this class lives in the same package\nimport { SchemaRegistry } from './registry.js';\n\n/**\n * Simple hash function for ETag generation (browser-compatible)\n * Uses a basic hash algorithm instead of crypto.createHash\n */\nfunction simpleHash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return Math.abs(hash).toString(16);\n}\n\nexport class ObjectStackProtocolImplementation implements ObjectStackProtocol {\n private engine: IDataEngine;\n\n constructor(engine: IDataEngine) {\n this.engine = engine;\n }\n\n async getDiscovery(_request: {}) {\n return {\n version: '1.0',\n apiName: 'ObjectStack API',\n capabilities: {\n graphql: false,\n search: false,\n websockets: false,\n files: true,\n analytics: false,\n hub: false\n },\n endpoints: {\n data: '/api/data',\n metadata: '/api/meta',\n auth: '/api/auth'\n }\n };\n }\n\n async getMetaTypes(_request: {}) {\n return {\n types: SchemaRegistry.getRegisteredTypes()\n };\n }\n\n async getMetaItems(request: { type: string }) {\n return {\n type: request.type,\n items: SchemaRegistry.listItems(request.type)\n };\n }\n\n async getMetaItem(request: { type: string, name: string }) {\n return {\n type: request.type,\n name: request.name,\n item: SchemaRegistry.getItem(request.type, request.name)\n };\n }\n\n async getUiView(request: { object: string, type: 'list' | 'form' }) {\n const schema = SchemaRegistry.getObject(request.object);\n if (!schema) throw new Error(`Object ${request.object} not found`);\n\n let view: any;\n if (request.type === 'list') {\n view = {\n type: 'list',\n object: request.object,\n columns: Object.keys(schema.fields || {}).slice(0, 5).map(f => ({\n field: f,\n label: schema.fields[f].label || f\n }))\n };\n } else {\n view = {\n type: 'form',\n object: request.object,\n sections: [\n {\n label: 'General',\n fields: Object.keys(schema.fields || {}).map(f => ({\n field: f\n }))\n }\n ]\n };\n }\n return view;\n }\n\n async findData(request: { object: string, query?: any }) {\n // TODO: Normalize query from HTTP Query params (string values) to DataEngineQueryOptions (typed)\n // For now, we assume query is partially compatible or simple enough.\n // We should parse 'top', 'skip', 'limit' to numbers if they are strings.\n const options: any = { ...request.query };\n if (options.top) options.top = Number(options.top);\n if (options.skip) options.skip = Number(options.skip);\n if (options.limit) options.limit = Number(options.limit);\n \n // Handle OData style $filter if present, or flat filters\n // This is a naive implementation, a real OData parser is needed for complex scenarios.\n \n const records = await this.engine.find(request.object, options);\n return {\n object: request.object,\n value: records, // OData compaibility\n records, // Legacy\n total: records.length,\n hasMore: false\n };\n }\n\n async getData(request: { object: string, id: string }) {\n const result = await this.engine.findOne(request.object, {\n filter: { _id: request.id }\n });\n if (result) {\n return {\n object: request.object,\n id: request.id,\n record: result\n };\n }\n throw new Error(`Record ${request.id} not found in ${request.object}`);\n }\n\n async createData(request: { object: string, data: any }) {\n const result = await this.engine.insert(request.object, request.data);\n return {\n object: request.object,\n id: result._id || result.id,\n record: result\n };\n }\n\n async updateData(request: { object: string, id: string, data: any }) {\n // Adapt: update(obj, id, data) -> update(obj, data, options)\n const result = await this.engine.update(request.object, request.data, { filter: { _id: request.id } });\n return {\n object: request.object,\n id: request.id,\n record: result\n };\n }\n\n async deleteData(request: { object: string, id: string }) {\n // Adapt: delete(obj, id) -> delete(obj, options)\n await this.engine.delete(request.object, { filter: { _id: request.id } });\n return {\n object: request.object,\n id: request.id,\n success: true\n };\n }\n\n // ==========================================\n // Metadata Caching\n // ==========================================\n\n async getMetaItemCached(request: { type: string, name: string, cacheRequest?: MetadataCacheRequest }): Promise<MetadataCacheResponse> {\n try {\n const item = SchemaRegistry.getItem(request.type, request.name);\n if (!item) {\n throw new Error(`Metadata item ${request.type}/${request.name} not found`);\n }\n\n // Calculate ETag (simple hash of the stringified metadata)\n const content = JSON.stringify(item);\n const hash = simpleHash(content);\n const etag = { value: hash, weak: false };\n\n // Check If-None-Match header\n if (request.cacheRequest?.ifNoneMatch) {\n const clientEtag = request.cacheRequest.ifNoneMatch.replace(/^\"(.*)\"$/, '$1').replace(/^W\\/\"(.*)\"$/, '$1');\n if (clientEtag === hash) {\n // Return 304 Not Modified\n return {\n notModified: true,\n etag,\n };\n }\n }\n\n // Return full metadata with cache headers\n return {\n data: item,\n etag,\n lastModified: new Date().toISOString(),\n cacheControl: {\n directives: ['public', 'max-age'],\n maxAge: 3600, // 1 hour\n },\n notModified: false,\n };\n } catch (error: any) {\n throw error;\n }\n }\n\n // ==========================================\n // Batch Operations\n // ==========================================\n\n async batchData(_request: { object: string, request: BatchUpdateRequest }): Promise<BatchUpdateResponse> {\n // Map high-level batch request to DataEngine batch if available\n // Or implement loop here.\n // For now, let's just fail or implement basic loop to satisfying interface\n // since full batch mapping requires careful type handling.\n throw new Error('Batch operations not yet fully implemented in protocol adapter');\n }\n \n async createManyData(request: { object: string, records: any[] }): Promise<any> {\n const records = await this.engine.insert(request.object, request.records);\n return {\n object: request.object,\n records,\n count: records.length\n };\n }\n \n async updateManyData(_request: UpdateManyDataRequest): Promise<any> {\n // TODO: Implement proper updateMany in DataEngine\n throw new Error('updateManyData not implemented');\n }\n\n async analyticsQuery(_request: any): Promise<any> {\n throw new Error('analyticsQuery not implemented');\n }\n\n async getAnalyticsMeta(_request: any): Promise<any> {\n throw new Error('getAnalyticsMeta not implemented');\n }\n\n async triggerAutomation(_request: any): Promise<any> {\n throw new Error('triggerAutomation not implemented');\n }\n\n async listSpaces(_request: any): Promise<any> {\n throw new Error('listSpaces not implemented');\n }\n\n async createSpace(_request: any): Promise<any> {\n throw new Error('createSpace not implemented');\n }\n\n async installPlugin(_request: any): Promise<any> {\n throw new Error('installPlugin not implemented');\n }\n\n async deleteManyData(request: DeleteManyDataRequest): Promise<any> {\n // This expects deleting by IDs.\n return this.engine.delete(request.object, {\n filter: { _id: { $in: request.ids } },\n ...request.options\n });\n }\n\n async saveMetaItem(request: { type: string, name: string, item?: any }) {\n if (!request.item) {\n throw new Error('Item data is required');\n }\n // Default implementation saves to Memory Registry\n SchemaRegistry.registerItem(request.type, request.item, 'name');\n return {\n success: true,\n message: 'Saved to memory registry'\n };\n }\n}\n","import { QueryAST, HookContext } from '@objectstack/spec/data';\nimport { \n DataEngineQueryOptions, \n DataEngineInsertOptions, \n DataEngineUpdateOptions, \n DataEngineDeleteOptions,\n DataEngineAggregateOptions,\n DataEngineCountOptions \n} from '@objectstack/spec/data';\nimport { DriverInterface, IDataEngine, Logger, createLogger } from '@objectstack/core';\nimport { CoreServiceName } from '@objectstack/spec/system';\nimport { SchemaRegistry } from './registry.js';\n\nexport type HookHandler = (context: HookContext) => Promise<void> | void;\n\n/**\n * Host Context provided to plugins (Internal ObjectQL Plugin System)\n */\nexport interface ObjectQLHostContext {\n ql: ObjectQL;\n logger: Logger;\n // Extensible map for host-specific globals (like HTTP Router, etc.)\n [key: string]: any;\n}\n\n/**\n * ObjectQL Engine\n * \n * Implements the IDataEngine interface for data persistence.\n * Acts as the reference implementation for:\n * - CoreServiceName.data (CRUD)\n * - CoreServiceName.metadata (Schema Registry)\n */\nexport class ObjectQL implements IDataEngine {\n private drivers = new Map<string, DriverInterface>();\n private defaultDriver: string | null = null;\n private logger: Logger;\n \n // Hooks Registry\n private hooks: Record<string, HookHandler[]> = {\n 'beforeFind': [], 'afterFind': [],\n 'beforeInsert': [], 'afterInsert': [],\n 'beforeUpdate': [], 'afterUpdate': [],\n 'beforeDelete': [], 'afterDelete': [],\n };\n \n // Host provided context additions (e.g. Server router)\n private hostContext: Record<string, any> = {};\n\n constructor(hostContext: Record<string, any> = {}) {\n this.hostContext = hostContext;\n // Use provided logger or create a new one\n this.logger = hostContext.logger || createLogger({ level: 'info', format: 'pretty' });\n this.logger.info('ObjectQL Engine Instance Created');\n }\n\n /**\n * Service Status Report\n * Used by Kernel to verify health and capabilities.\n */\n getStatus() {\n return {\n name: CoreServiceName.enum.data,\n status: 'running',\n version: '0.9.0',\n features: ['crud', 'query', 'aggregate', 'transactions', 'metadata']\n };\n }\n\n /**\n * Expose the SchemaRegistry for plugins to register metadata\n */\n get registry() {\n return SchemaRegistry;\n }\n\n /**\n * Load and Register a Plugin\n */\n async use(manifestPart: any, runtimePart?: any) {\n this.logger.debug('Loading plugin', { \n hasManifest: !!manifestPart, \n hasRuntime: !!runtimePart \n });\n\n // 1. Validate / Register Manifest\n if (manifestPart) {\n this.registerApp(manifestPart);\n }\n\n // 2. Execute Runtime\n if (runtimePart) {\n const pluginDef = (runtimePart as any).default || runtimePart;\n if (pluginDef.onEnable) {\n this.logger.debug('Executing plugin runtime onEnable');\n \n const context: ObjectQLHostContext = {\n ql: this,\n logger: this.logger,\n // Expose the driver registry helper explicitly if needed\n drivers: {\n register: (driver: DriverInterface) => this.registerDriver(driver)\n },\n ...this.hostContext\n };\n \n await pluginDef.onEnable(context);\n this.logger.debug('Plugin runtime onEnable completed');\n }\n }\n }\n\n /**\n * Register a hook\n * @param event The event name (e.g. 'beforeFind', 'afterInsert')\n * @param handler The handler function\n */\n registerHook(event: string, handler: HookHandler) {\n if (!this.hooks[event]) {\n this.hooks[event] = [];\n }\n this.hooks[event].push(handler);\n this.logger.debug('Registered hook', { event, totalHandlers: this.hooks[event].length });\n }\n\n public async triggerHooks(event: string, context: HookContext) {\n const handlers = this.hooks[event] || [];\n \n if (handlers.length === 0) {\n this.logger.debug('No hooks registered for event', { event });\n return;\n }\n\n this.logger.debug('Triggering hooks', { event, count: handlers.length });\n \n for (const handler of handlers) {\n await handler(context);\n }\n }\n\n /**\n * Register contribution (Manifest)\n */\n registerApp(manifest: any) {\n const id = manifest.id;\n this.logger.debug('Registering app manifest', { id });\n\n // Register objects\n if (manifest.objects) {\n if (Array.isArray(manifest.objects)) {\n this.logger.debug('Registering objects from manifest (Array)', { id, objectCount: manifest.objects.length });\n for (const objDef of manifest.objects) {\n SchemaRegistry.registerObject(objDef);\n this.logger.debug('Registered Object', { object: objDef.name, from: id });\n }\n } else {\n this.logger.debug('Registering objects from manifest (Map)', { id, objectCount: Object.keys(manifest.objects).length });\n for (const [name, objDef] of Object.entries(manifest.objects)) {\n // Ensure name in definition matches key\n (objDef as any).name = name;\n SchemaRegistry.registerObject(objDef as any);\n this.logger.debug('Registered Object', { object: name, from: id });\n }\n }\n }\n\n // Register contributions\n if (manifest.contributes?.kinds) {\n this.logger.debug('Registering kinds from manifest', { id, kindCount: manifest.contributes.kinds.length });\n for (const kind of manifest.contributes.kinds) {\n SchemaRegistry.registerKind(kind);\n this.logger.debug('Registered Kind', { kind: kind.name || kind.type, from: id });\n }\n }\n }\n\n /**\n * Register a new storage driver\n */\n registerDriver(driver: DriverInterface, isDefault: boolean = false) {\n if (this.drivers.has(driver.name)) {\n this.logger.warn('Driver already registered, skipping', { driverName: driver.name });\n return;\n }\n\n this.drivers.set(driver.name, driver);\n this.logger.info('Registered driver', { \n driverName: driver.name, \n version: driver.version\n });\n\n if (isDefault || this.drivers.size === 1) {\n this.defaultDriver = driver.name;\n this.logger.info('Set default driver', { driverName: driver.name });\n }\n }\n\n /**\n * Helper to get object definition\n */\n getSchema(objectName: string) {\n return SchemaRegistry.getObject(objectName);\n }\n\n /**\n * Helper to get the target driver\n */\n private getDriver(objectName: string): DriverInterface {\n const object = SchemaRegistry.getObject(objectName);\n \n // 1. If object definition exists, check for explicit datasource\n if (object) {\n const datasourceName = object.datasource || 'default';\n \n // If configured for 'default', try to find the default driver\n if (datasourceName === 'default') {\n if (this.defaultDriver && this.drivers.has(this.defaultDriver)) {\n return this.drivers.get(this.defaultDriver)!;\n }\n } else {\n // Specific datasource requested\n if (this.drivers.has(datasourceName)) {\n return this.drivers.get(datasourceName)!;\n }\n throw new Error(`[ObjectQL] Datasource '${datasourceName}' configured for object '${objectName}' is not registered.`);\n }\n }\n\n // 2. Fallback for ad-hoc objects or missing definitions\n if (this.defaultDriver) {\n return this.drivers.get(this.defaultDriver)!;\n }\n\n throw new Error(`[ObjectQL] No driver available for object '${objectName}'`);\n }\n\n /**\n * Initialize the engine and all registered drivers\n */\n async init() {\n this.logger.info('Initializing ObjectQL engine', { \n driverCount: this.drivers.size,\n drivers: Array.from(this.drivers.keys())\n });\n \n for (const [name, driver] of this.drivers) {\n try {\n await driver.connect();\n this.logger.info('Driver connected successfully', { driverName: name });\n } catch (e) {\n this.logger.error('Failed to connect driver', e as Error, { driverName: name });\n }\n }\n \n this.logger.info('ObjectQL engine initialization complete');\n }\n\n async destroy() {\n this.logger.info('Destroying ObjectQL engine', { driverCount: this.drivers.size });\n \n for (const [name, driver] of this.drivers.entries()) {\n try {\n await driver.disconnect();\n } catch (e) {\n this.logger.error('Error disconnecting driver', e as Error, { driverName: name });\n }\n }\n \n this.logger.info('ObjectQL engine destroyed');\n }\n\n // ============================================\n // Helper: Query Conversion\n // ============================================\n\n private toQueryAST(object: string, options?: DataEngineQueryOptions): QueryAST {\n const ast: QueryAST = { object };\n if (!options) return ast;\n\n if (options.filter) {\n ast.where = options.filter;\n }\n if (options.select) {\n ast.fields = options.select;\n }\n if (options.sort) {\n // Support DataEngineSortSchema variant\n if (Array.isArray(options.sort)) {\n // [{ field: 'a', order: 'asc' }]\n ast.orderBy = options.sort; \n } else {\n // Record<string, 'asc' | 'desc' | 1 | -1>\n ast.orderBy = Object.entries(options.sort).map(([field, order]) => ({\n field,\n order: (order === -1 || order === 'desc') ? 'desc' : 'asc'\n }));\n }\n }\n \n if (options.top !== undefined) ast.limit = options.top;\n else if (options.limit !== undefined) ast.limit = options.limit;\n \n if (options.skip !== undefined) ast.offset = options.skip;\n\n // TODO: Handle populate/joins mapping if Driver supports it in QueryAST\n return ast;\n }\n\n // ============================================\n // Data Access Methods (IDataEngine Interface)\n // ============================================\n\n async find(object: string, query?: DataEngineQueryOptions): Promise<any[]> {\n this.logger.debug('Find operation starting', { object, query });\n const driver = this.getDriver(object);\n const ast = this.toQueryAST(object, query);\n\n const hookContext: HookContext = {\n object,\n event: 'beforeFind',\n input: { ast, options: undefined }, // Should map options?\n ql: this\n };\n await this.triggerHooks('beforeFind', hookContext);\n\n try {\n const result = await driver.find(object, hookContext.input.ast, hookContext.input.options);\n \n hookContext.event = 'afterFind';\n hookContext.result = result;\n await this.triggerHooks('afterFind', hookContext);\n \n return hookContext.result;\n } catch (e) {\n this.logger.error('Find operation failed', e as Error, { object });\n throw e;\n }\n }\n\n async findOne(objectName: string, query?: DataEngineQueryOptions): Promise<any> {\n this.logger.debug('FindOne operation', { objectName });\n const driver = this.getDriver(objectName);\n const ast = this.toQueryAST(objectName, query);\n ast.limit = 1;\n\n // Reuse find logic or call generic driver.findOne if available\n // Assuming driver has findOne\n return driver.findOne(objectName, ast);\n }\n\n async insert(object: string, data: any | any[], options?: DataEngineInsertOptions): Promise<any> {\n this.logger.debug('Insert operation starting', { object, isBatch: Array.isArray(data) });\n const driver = this.getDriver(object);\n\n const hookContext: HookContext = {\n object,\n event: 'beforeInsert',\n input: { data, options },\n ql: this\n };\n await this.triggerHooks('beforeInsert', hookContext);\n\n try {\n let result;\n if (Array.isArray(hookContext.input.data)) {\n // Bulk Create\n if (driver.bulkCreate) {\n result = await driver.bulkCreate(object, hookContext.input.data, hookContext.input.options);\n } else {\n // Fallback loop\n result = await Promise.all(hookContext.input.data.map((item: any) => driver.create(object, item, hookContext.input.options)));\n }\n } else {\n result = await driver.create(object, hookContext.input.data, hookContext.input.options);\n }\n\n hookContext.event = 'afterInsert';\n hookContext.result = result;\n await this.triggerHooks('afterInsert', hookContext);\n\n return hookContext.result;\n } catch (e) {\n this.logger.error('Insert operation failed', e as Error, { object });\n throw e;\n }\n }\n\n async update(object: string, data: any, options?: DataEngineUpdateOptions): Promise<any> {\n // NOTE: This signature is tricky because Driver expects (obj, id, data) usually.\n // DataEngine protocol puts filter in options.\n this.logger.debug('Update operation starting', { object });\n const driver = this.getDriver(object);\n \n // 1. Extract ID from data or filter if it's a single update by ID\n // This is a simplification. Real implementation needs robust filter handling.\n let id = data.id || data._id;\n if (!id && options?.filter) {\n // Optimization: If filter is simple ID check, extract it\n if (typeof options.filter === 'string') id = options.filter;\n else if (options.filter._id) id = options.filter._id;\n else if (options.filter.id) id = options.filter.id;\n }\n\n const hookContext: HookContext = {\n object,\n event: 'beforeUpdate',\n input: { id, data, options },\n ql: this\n };\n await this.triggerHooks('beforeUpdate', hookContext);\n\n try {\n let result;\n if (hookContext.input.id) {\n // Single update by ID\n result = await driver.update(object, hookContext.input.id, hookContext.input.data, hookContext.input.options);\n } else if (options?.multi && driver.updateMany) {\n // Bulk update by Query\n const ast = this.toQueryAST(object, { filter: options.filter });\n result = await driver.updateMany(object, ast, hookContext.input.data, hookContext.input.options);\n } else {\n throw new Error('Update requires an ID or options.multi=true');\n }\n\n hookContext.event = 'afterUpdate';\n hookContext.result = result;\n await this.triggerHooks('afterUpdate', hookContext);\n return hookContext.result;\n } catch (e) {\n this.logger.error('Update operation failed', e as Error, { object });\n throw e;\n }\n }\n\n async delete(object: string, options?: DataEngineDeleteOptions): Promise<any> {\n this.logger.debug('Delete operation starting', { object });\n const driver = this.getDriver(object);\n\n // Extract ID logic similar to update\n let id: any = undefined;\n if (options?.filter) {\n if (typeof options.filter === 'string') id = options.filter;\n else if (options.filter._id) id = options.filter._id;\n else if (options.filter.id) id = options.filter.id;\n }\n\n const hookContext: HookContext = {\n object,\n event: 'beforeDelete',\n input: { id, options },\n ql: this\n };\n await this.triggerHooks('beforeDelete', hookContext);\n\n try {\n let result;\n if (hookContext.input.id) {\n result = await driver.delete(object, hookContext.input.id, hookContext.input.options);\n } else if (options?.multi && driver.deleteMany) {\n const ast = this.toQueryAST(object, { filter: options.filter });\n result = await driver.deleteMany(object, ast, hookContext.input.options);\n } else {\n throw new Error('Delete requires an ID or options.multi=true');\n }\n\n hookContext.event = 'afterDelete';\n hookContext.result = result;\n await this.triggerHooks('afterDelete', hookContext);\n return hookContext.result;\n } catch (e) {\n this.logger.error('Delete operation failed', e as Error, { object });\n throw e;\n }\n }\n\n async count(object: string, query?: DataEngineCountOptions): Promise<number> {\n const driver = this.getDriver(object);\n if (driver.count) {\n const ast = this.toQueryAST(object, { filter: query?.filter });\n return driver.count(object, ast);\n }\n // Fallback to find().length\n const res = await this.find(object, { filter: query?.filter, select: ['_id'] });\n return res.length;\n }\n\n async aggregate(object: string, query: DataEngineAggregateOptions): Promise<any[]> {\n const driver = this.getDriver(object);\n this.logger.debug(`Aggregate on ${object} using ${driver.name}`, query);\n // Driver needs support for raw aggregation or mapped aggregation\n // For now, if driver supports 'execute', we might pass it down, or we need to add 'aggregate' to DriverInterface\n // In this version, we'll assume driver might handle it via special 'find' or throw not implemented\n throw new Error('Aggregate not yet fully implemented in ObjectQL->Driver mapping');\n }\n \n async execute(command: any, options?: Record<string, any>): Promise<any> {\n // Direct pass-through implies we know which driver to use?\n // Usually execute is tied to a specific object context OR we need a way to select driver.\n // If command has 'object', we use that.\n if (options?.object) {\n const driver = this.getDriver(options.object);\n if (driver.execute) {\n return driver.execute(command, undefined, options);\n }\n }\n throw new Error('Execute requires options.object to select driver');\n }\n}\n","import { ObjectQL } from './engine.js';\nimport { ObjectStackProtocolImplementation } from './protocol.js';\nimport { Plugin, PluginContext } from '@objectstack/core';\n\nexport type { Plugin, PluginContext };\n\nexport class ObjectQLPlugin implements Plugin {\n name = 'com.objectstack.engine.objectql';\n type = 'objectql' as const;\n version = '1.0.0';\n \n private ql: ObjectQL | undefined;\n private hostContext?: Record<string, any>;\n\n constructor(ql?: ObjectQL, hostContext?: Record<string, any>) {\n if (ql) {\n this.ql = ql;\n } else {\n this.hostContext = hostContext;\n // Lazily created in init\n }\n }\n\n init = async (ctx: PluginContext) => {\n if (!this.ql) {\n this.ql = new ObjectQL(this.hostContext);\n }\n \n // Register as provider for Core Kernel Services\n ctx.registerService('objectql', this.ql);\n ctx.registerService('metadata', this.ql);\n ctx.registerService('data', this.ql); // ObjectQL implements IDataEngine\n ctx.registerService('auth', this.ql);\n \n ctx.logger.info('ObjectQL engine registered as service', { \n provides: ['objectql', 'metadata', 'data', 'auth'] \n });\n\n // Register Protocol Implementation\n const protocolShim = new ObjectStackProtocolImplementation(this.ql);\n\n ctx.registerService('protocol', protocolShim);\n ctx.logger.info('Protocol service registered');\n }\n\n start = async (ctx: PluginContext) => {\n ctx.logger.info('ObjectQL engine initialized');\n \n // Discover features from Kernel Services\n if (ctx.getServices && this.ql) {\n const services = ctx.getServices();\n for (const [name, service] of services.entries()) {\n if (name.startsWith('driver.')) {\n // Register Driver\n this.ql.registerDriver(service);\n ctx.logger.debug('Discovered and registered driver service', { serviceName: name });\n }\n if (name.startsWith('app.')) {\n // Register App\n this.ql.registerApp(service); // service is Manifest\n ctx.logger.debug('Discovered and registered app service', { serviceName: name });\n }\n }\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/registry.ts","../src/protocol.ts","../src/engine.ts","../src/plugin.ts"],"sourcesContent":["import { ServiceObject, ObjectSchema } from '@objectstack/spec/data';\nimport { ObjectStackManifest, ManifestSchema } from '@objectstack/spec/kernel';\nimport { AppSchema } from '@objectstack/spec/ui';\n\n/**\n * Global Schema Registry\n * Unified storage for all metadata types (Objects, Apps, Flows, Layouts, etc.)\n */\nexport class SchemaRegistry {\n // Nested Map: Type -> Name/ID -> MetadataItem\n private static metadata = new Map<string, Map<string, any>>();\n\n /**\n * Universal Register Method\n * @param type The category of metadata (e.g., 'object', 'app', 'plugin')\n * @param item The metadata item itself\n * @param keyField The property to use as the unique key (default: 'name')\n */\n static registerItem<T>(type: string, item: T, keyField: keyof T = 'name' as keyof T) {\n if (!this.metadata.has(type)) {\n this.metadata.set(type, new Map());\n }\n const collection = this.metadata.get(type)!;\n const key = String(item[keyField]);\n\n // Validation Hook\n try {\n this.validate(type, item);\n } catch (e: any) {\n console.error(`[Registry] Validation failed for ${type} ${key}: ${e.message}`);\n // For now, warn but don't crash, allowing partial/legacy loads\n // throw e; \n }\n\n if (collection.has(key)) {\n console.warn(`[Registry] Overwriting ${type}: ${key}`);\n }\n collection.set(key, item);\n console.log(`[Registry] Registered ${type}: ${key}`);\n }\n\n /**\n * Validate Metadata against Spec Zod Schemas\n */\n static validate(type: string, item: any) {\n if (type === 'object') {\n return ObjectSchema.parse(item);\n }\n if (type === 'app') {\n // AppSchema might rely on Zod, imported via UI protocol\n return AppSchema.parse(item);\n }\n if (type === 'plugin') {\n return ManifestSchema.parse(item);\n }\n // Add more validations as needed\n return true;\n }\n\n /**\n * Universal Unregister Method\n */\n static unregisterItem(type: string, name: string) {\n const collection = this.metadata.get(type);\n if (collection && collection.has(name)) {\n collection.delete(name);\n console.log(`[Registry] Unregistered ${type}: ${name}`);\n } else {\n console.warn(`[Registry] Attempted to unregister non-existent ${type}: ${name}`);\n }\n }\n\n /**\n * Universal Get Method\n */\n static getItem<T>(type: string, name: string): T | undefined {\n return this.metadata.get(type)?.get(name) as T;\n }\n\n /**\n * Universal List Method\n */\n static listItems<T>(type: string): T[] {\n return Array.from(this.metadata.get(type)?.values() || []) as T[];\n }\n\n /**\n * Get all registered metadata types (Kinds)\n */\n static getRegisteredTypes(): string[] {\n return Array.from(this.metadata.keys());\n }\n\n // ==========================================\n // Typed Helper Methods (Shortcuts)\n // ==========================================\n\n /**\n * Object Helpers\n */\n static registerObject(schema: ServiceObject) {\n this.registerItem('object', schema, 'name');\n }\n\n static getObject(name: string): ServiceObject | undefined {\n return this.getItem<ServiceObject>('object', name);\n }\n\n static getAllObjects(): ServiceObject[] {\n return this.listItems<ServiceObject>('object');\n }\n\n /**\n * Plugin Helpers\n */\n static registerPlugin(manifest: ObjectStackManifest) {\n this.registerItem('plugin', manifest, 'id');\n }\n\n static getAllPlugins(): ObjectStackManifest[] {\n return this.listItems<ObjectStackManifest>('plugin');\n }\n\n /**\n * Kind (Metadata Type) Helpers\n */\n static registerKind(kind: { id: string, globs: string[] }) {\n this.registerItem('kind', kind, 'id');\n }\n \n static getAllKinds(): { id: string, globs: string[] }[] {\n return this.listItems('kind');\n }\n}\n","import { ObjectStackProtocol } from '@objectstack/spec/api';\nimport { IDataEngine } from '@objectstack/core';\nimport type { \n BatchUpdateRequest, \n BatchUpdateResponse, \n UpdateManyDataRequest,\n DeleteManyDataRequest\n} from '@objectstack/spec/api';\nimport type { MetadataCacheRequest, MetadataCacheResponse } from '@objectstack/spec/api';\n\n// We import SchemaRegistry directly since this class lives in the same package\nimport { SchemaRegistry } from './registry.js';\n\n/**\n * Simple hash function for ETag generation (browser-compatible)\n * Uses a basic hash algorithm instead of crypto.createHash\n */\nfunction simpleHash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return Math.abs(hash).toString(16);\n}\n\nexport class ObjectStackProtocolImplementation implements ObjectStackProtocol {\n private engine: IDataEngine;\n\n constructor(engine: IDataEngine) {\n this.engine = engine;\n }\n\n async getDiscovery(_request: {}) {\n return {\n version: '1.0',\n apiName: 'ObjectStack API',\n capabilities: {\n graphql: false,\n search: false,\n websockets: false,\n files: true,\n analytics: false,\n hub: false\n },\n endpoints: {\n data: '/api/data',\n metadata: '/api/meta',\n auth: '/api/auth'\n }\n };\n }\n\n async getMetaTypes(_request: {}) {\n return {\n types: SchemaRegistry.getRegisteredTypes()\n };\n }\n\n async getMetaItems(request: { type: string }) {\n return {\n type: request.type,\n items: SchemaRegistry.listItems(request.type)\n };\n }\n\n async getMetaItem(request: { type: string, name: string }) {\n return {\n type: request.type,\n name: request.name,\n item: SchemaRegistry.getItem(request.type, request.name)\n };\n }\n\n async getUiView(request: { object: string, type: 'list' | 'form' }) {\n const schema = SchemaRegistry.getObject(request.object);\n if (!schema) throw new Error(`Object ${request.object} not found`);\n\n let view: any;\n if (request.type === 'list') {\n view = {\n type: 'list',\n object: request.object,\n columns: Object.keys(schema.fields || {}).slice(0, 5).map(f => ({\n field: f,\n label: schema.fields[f].label || f\n }))\n };\n } else {\n view = {\n type: 'form',\n object: request.object,\n sections: [\n {\n label: 'General',\n fields: Object.keys(schema.fields || {}).map(f => ({\n field: f\n }))\n }\n ]\n };\n }\n return view;\n }\n\n async findData(request: { object: string, query?: any }) {\n // TODO: Normalize query from HTTP Query params (string values) to DataEngineQueryOptions (typed)\n // For now, we assume query is partially compatible or simple enough.\n // We should parse 'top', 'skip', 'limit' to numbers if they are strings.\n const options: any = { ...request.query };\n if (options.top) options.top = Number(options.top);\n if (options.skip) options.skip = Number(options.skip);\n if (options.limit) options.limit = Number(options.limit);\n \n // Handle OData style $filter if present, or flat filters\n // This is a naive implementation, a real OData parser is needed for complex scenarios.\n \n const records = await this.engine.find(request.object, options);\n return {\n object: request.object,\n value: records, // OData compaibility\n records, // Legacy\n total: records.length,\n hasMore: false\n };\n }\n\n async getData(request: { object: string, id: string }) {\n const result = await this.engine.findOne(request.object, {\n filter: { _id: request.id }\n });\n if (result) {\n return {\n object: request.object,\n id: request.id,\n record: result\n };\n }\n throw new Error(`Record ${request.id} not found in ${request.object}`);\n }\n\n async createData(request: { object: string, data: any }) {\n const result = await this.engine.insert(request.object, request.data);\n return {\n object: request.object,\n id: result._id || result.id,\n record: result\n };\n }\n\n async updateData(request: { object: string, id: string, data: any }) {\n // Adapt: update(obj, id, data) -> update(obj, data, options)\n const result = await this.engine.update(request.object, request.data, { filter: { _id: request.id } });\n return {\n object: request.object,\n id: request.id,\n record: result\n };\n }\n\n async deleteData(request: { object: string, id: string }) {\n // Adapt: delete(obj, id) -> delete(obj, options)\n await this.engine.delete(request.object, { filter: { _id: request.id } });\n return {\n object: request.object,\n id: request.id,\n success: true\n };\n }\n\n // ==========================================\n // Metadata Caching\n // ==========================================\n\n async getMetaItemCached(request: { type: string, name: string, cacheRequest?: MetadataCacheRequest }): Promise<MetadataCacheResponse> {\n try {\n const item = SchemaRegistry.getItem(request.type, request.name);\n if (!item) {\n throw new Error(`Metadata item ${request.type}/${request.name} not found`);\n }\n\n // Calculate ETag (simple hash of the stringified metadata)\n const content = JSON.stringify(item);\n const hash = simpleHash(content);\n const etag = { value: hash, weak: false };\n\n // Check If-None-Match header\n if (request.cacheRequest?.ifNoneMatch) {\n const clientEtag = request.cacheRequest.ifNoneMatch.replace(/^\"(.*)\"$/, '$1').replace(/^W\\/\"(.*)\"$/, '$1');\n if (clientEtag === hash) {\n // Return 304 Not Modified\n return {\n notModified: true,\n etag,\n };\n }\n }\n\n // Return full metadata with cache headers\n return {\n data: item,\n etag,\n lastModified: new Date().toISOString(),\n cacheControl: {\n directives: ['public', 'max-age'],\n maxAge: 3600, // 1 hour\n },\n notModified: false,\n };\n } catch (error: any) {\n throw error;\n }\n }\n\n // ==========================================\n // Batch Operations\n // ==========================================\n\n async batchData(_request: { object: string, request: BatchUpdateRequest }): Promise<BatchUpdateResponse> {\n // Map high-level batch request to DataEngine batch if available\n // Or implement loop here.\n // For now, let's just fail or implement basic loop to satisfying interface\n // since full batch mapping requires careful type handling.\n throw new Error('Batch operations not yet fully implemented in protocol adapter');\n }\n \n async createManyData(request: { object: string, records: any[] }): Promise<any> {\n const records = await this.engine.insert(request.object, request.records);\n return {\n object: request.object,\n records,\n count: records.length\n };\n }\n \n async updateManyData(_request: UpdateManyDataRequest): Promise<any> {\n // TODO: Implement proper updateMany in DataEngine\n throw new Error('updateManyData not implemented');\n }\n\n async analyticsQuery(_request: any): Promise<any> {\n throw new Error('analyticsQuery not implemented');\n }\n\n async getAnalyticsMeta(_request: any): Promise<any> {\n throw new Error('getAnalyticsMeta not implemented');\n }\n\n async triggerAutomation(_request: any): Promise<any> {\n throw new Error('triggerAutomation not implemented');\n }\n\n async listSpaces(_request: any): Promise<any> {\n throw new Error('listSpaces not implemented');\n }\n\n async createSpace(_request: any): Promise<any> {\n throw new Error('createSpace not implemented');\n }\n\n async installPlugin(_request: any): Promise<any> {\n throw new Error('installPlugin not implemented');\n }\n\n async deleteManyData(request: DeleteManyDataRequest): Promise<any> {\n // This expects deleting by IDs.\n return this.engine.delete(request.object, {\n filter: { _id: { $in: request.ids } },\n ...request.options\n });\n }\n\n async saveMetaItem(request: { type: string, name: string, item?: any }) {\n if (!request.item) {\n throw new Error('Item data is required');\n }\n // Default implementation saves to Memory Registry\n SchemaRegistry.registerItem(request.type, request.item, 'name');\n return {\n success: true,\n message: 'Saved to memory registry'\n };\n }\n}\n","import { QueryAST, HookContext } from '@objectstack/spec/data';\nimport { \n DataEngineQueryOptions, \n DataEngineInsertOptions, \n DataEngineUpdateOptions, \n DataEngineDeleteOptions,\n DataEngineAggregateOptions,\n DataEngineCountOptions \n} from '@objectstack/spec/data';\nimport { DriverInterface, IDataEngine, Logger, createLogger } from '@objectstack/core';\nimport { CoreServiceName } from '@objectstack/spec/system';\nimport { SchemaRegistry } from './registry.js';\n\nexport type HookHandler = (context: HookContext) => Promise<void> | void;\n\n/**\n * Host Context provided to plugins (Internal ObjectQL Plugin System)\n */\nexport interface ObjectQLHostContext {\n ql: ObjectQL;\n logger: Logger;\n // Extensible map for host-specific globals (like HTTP Router, etc.)\n [key: string]: any;\n}\n\n/**\n * ObjectQL Engine\n * \n * Implements the IDataEngine interface for data persistence.\n * Acts as the reference implementation for:\n * - CoreServiceName.data (CRUD)\n * - CoreServiceName.metadata (Schema Registry)\n */\nexport class ObjectQL implements IDataEngine {\n private drivers = new Map<string, DriverInterface>();\n private defaultDriver: string | null = null;\n private logger: Logger;\n \n // Hooks Registry\n private hooks: Record<string, HookHandler[]> = {\n 'beforeFind': [], 'afterFind': [],\n 'beforeInsert': [], 'afterInsert': [],\n 'beforeUpdate': [], 'afterUpdate': [],\n 'beforeDelete': [], 'afterDelete': [],\n };\n \n // Host provided context additions (e.g. Server router)\n private hostContext: Record<string, any> = {};\n\n constructor(hostContext: Record<string, any> = {}) {\n this.hostContext = hostContext;\n // Use provided logger or create a new one\n this.logger = hostContext.logger || createLogger({ level: 'info', format: 'pretty' });\n this.logger.info('ObjectQL Engine Instance Created');\n }\n\n /**\n * Service Status Report\n * Used by Kernel to verify health and capabilities.\n */\n getStatus() {\n return {\n name: CoreServiceName.enum.data,\n status: 'running',\n version: '0.9.0',\n features: ['crud', 'query', 'aggregate', 'transactions', 'metadata']\n };\n }\n\n /**\n * Expose the SchemaRegistry for plugins to register metadata\n */\n get registry() {\n return SchemaRegistry;\n }\n\n /**\n * Load and Register a Plugin\n */\n async use(manifestPart: any, runtimePart?: any) {\n this.logger.debug('Loading plugin', { \n hasManifest: !!manifestPart, \n hasRuntime: !!runtimePart \n });\n\n // 1. Validate / Register Manifest\n if (manifestPart) {\n this.registerApp(manifestPart);\n }\n\n // 2. Execute Runtime\n if (runtimePart) {\n const pluginDef = (runtimePart as any).default || runtimePart;\n if (pluginDef.onEnable) {\n this.logger.debug('Executing plugin runtime onEnable');\n \n const context: ObjectQLHostContext = {\n ql: this,\n logger: this.logger,\n // Expose the driver registry helper explicitly if needed\n drivers: {\n register: (driver: DriverInterface) => this.registerDriver(driver)\n },\n ...this.hostContext\n };\n \n await pluginDef.onEnable(context);\n this.logger.debug('Plugin runtime onEnable completed');\n }\n }\n }\n\n /**\n * Register a hook\n * @param event The event name (e.g. 'beforeFind', 'afterInsert')\n * @param handler The handler function\n */\n registerHook(event: string, handler: HookHandler) {\n if (!this.hooks[event]) {\n this.hooks[event] = [];\n }\n this.hooks[event].push(handler);\n this.logger.debug('Registered hook', { event, totalHandlers: this.hooks[event].length });\n }\n\n public async triggerHooks(event: string, context: HookContext) {\n const handlers = this.hooks[event] || [];\n \n if (handlers.length === 0) {\n this.logger.debug('No hooks registered for event', { event });\n return;\n }\n\n this.logger.debug('Triggering hooks', { event, count: handlers.length });\n \n for (const handler of handlers) {\n await handler(context);\n }\n }\n\n /**\n * Register contribution (Manifest)\n */\n registerApp(manifest: any) {\n const id = manifest.id;\n this.logger.debug('Registering app manifest', { id });\n\n // Register objects\n if (manifest.objects) {\n if (Array.isArray(manifest.objects)) {\n this.logger.debug('Registering objects from manifest (Array)', { id, objectCount: manifest.objects.length });\n for (const objDef of manifest.objects) {\n SchemaRegistry.registerObject(objDef);\n this.logger.debug('Registered Object', { object: objDef.name, from: id });\n }\n } else {\n this.logger.debug('Registering objects from manifest (Map)', { id, objectCount: Object.keys(manifest.objects).length });\n for (const [name, objDef] of Object.entries(manifest.objects)) {\n // Ensure name in definition matches key\n (objDef as any).name = name;\n SchemaRegistry.registerObject(objDef as any);\n this.logger.debug('Registered Object', { object: name, from: id });\n }\n }\n }\n\n // Register contributions\n if (manifest.contributes?.kinds) {\n this.logger.debug('Registering kinds from manifest', { id, kindCount: manifest.contributes.kinds.length });\n for (const kind of manifest.contributes.kinds) {\n SchemaRegistry.registerKind(kind);\n this.logger.debug('Registered Kind', { kind: kind.name || kind.type, from: id });\n }\n }\n }\n\n /**\n * Register a new storage driver\n */\n registerDriver(driver: DriverInterface, isDefault: boolean = false) {\n if (this.drivers.has(driver.name)) {\n this.logger.warn('Driver already registered, skipping', { driverName: driver.name });\n return;\n }\n\n this.drivers.set(driver.name, driver);\n this.logger.info('Registered driver', { \n driverName: driver.name, \n version: driver.version\n });\n\n if (isDefault || this.drivers.size === 1) {\n this.defaultDriver = driver.name;\n this.logger.info('Set default driver', { driverName: driver.name });\n }\n }\n\n /**\n * Helper to get object definition\n */\n getSchema(objectName: string) {\n return SchemaRegistry.getObject(objectName);\n }\n\n /**\n * Helper to get the target driver\n */\n private getDriver(objectName: string): DriverInterface {\n const object = SchemaRegistry.getObject(objectName);\n \n // 1. If object definition exists, check for explicit datasource\n if (object) {\n const datasourceName = object.datasource || 'default';\n \n // If configured for 'default', try to find the default driver\n if (datasourceName === 'default') {\n if (this.defaultDriver && this.drivers.has(this.defaultDriver)) {\n return this.drivers.get(this.defaultDriver)!;\n }\n } else {\n // Specific datasource requested\n if (this.drivers.has(datasourceName)) {\n return this.drivers.get(datasourceName)!;\n }\n throw new Error(`[ObjectQL] Datasource '${datasourceName}' configured for object '${objectName}' is not registered.`);\n }\n }\n\n // 2. Fallback for ad-hoc objects or missing definitions\n if (this.defaultDriver) {\n return this.drivers.get(this.defaultDriver)!;\n }\n\n throw new Error(`[ObjectQL] No driver available for object '${objectName}'`);\n }\n\n /**\n * Initialize the engine and all registered drivers\n */\n async init() {\n this.logger.info('Initializing ObjectQL engine', { \n driverCount: this.drivers.size,\n drivers: Array.from(this.drivers.keys())\n });\n \n for (const [name, driver] of this.drivers) {\n try {\n await driver.connect();\n this.logger.info('Driver connected successfully', { driverName: name });\n } catch (e) {\n this.logger.error('Failed to connect driver', e as Error, { driverName: name });\n }\n }\n \n this.logger.info('ObjectQL engine initialization complete');\n }\n\n async destroy() {\n this.logger.info('Destroying ObjectQL engine', { driverCount: this.drivers.size });\n \n for (const [name, driver] of this.drivers.entries()) {\n try {\n await driver.disconnect();\n } catch (e) {\n this.logger.error('Error disconnecting driver', e as Error, { driverName: name });\n }\n }\n \n this.logger.info('ObjectQL engine destroyed');\n }\n\n // ============================================\n // Helper: Query Conversion\n // ============================================\n\n private toQueryAST(object: string, options?: DataEngineQueryOptions): QueryAST {\n const ast: QueryAST = { object };\n if (!options) return ast;\n\n if (options.filter) {\n ast.where = options.filter;\n }\n if (options.select) {\n ast.fields = options.select;\n }\n if (options.sort) {\n // Support DataEngineSortSchema variant\n if (Array.isArray(options.sort)) {\n // [{ field: 'a', order: 'asc' }]\n ast.orderBy = options.sort; \n } else {\n // Record<string, 'asc' | 'desc' | 1 | -1>\n ast.orderBy = Object.entries(options.sort).map(([field, order]) => ({\n field,\n order: (order === -1 || order === 'desc') ? 'desc' : 'asc'\n }));\n }\n }\n \n if (options.top !== undefined) ast.limit = options.top;\n else if (options.limit !== undefined) ast.limit = options.limit;\n \n if (options.skip !== undefined) ast.offset = options.skip;\n\n // TODO: Handle populate/joins mapping if Driver supports it in QueryAST\n return ast;\n }\n\n // ============================================\n // Data Access Methods (IDataEngine Interface)\n // ============================================\n\n async find(object: string, query?: DataEngineQueryOptions): Promise<any[]> {\n this.logger.debug('Find operation starting', { object, query });\n const driver = this.getDriver(object);\n const ast = this.toQueryAST(object, query);\n\n const hookContext: HookContext = {\n object,\n event: 'beforeFind',\n input: { ast, options: undefined }, // Should map options?\n ql: this\n };\n await this.triggerHooks('beforeFind', hookContext);\n\n try {\n const result = await driver.find(object, hookContext.input.ast, hookContext.input.options);\n \n hookContext.event = 'afterFind';\n hookContext.result = result;\n await this.triggerHooks('afterFind', hookContext);\n \n return hookContext.result;\n } catch (e) {\n this.logger.error('Find operation failed', e as Error, { object });\n throw e;\n }\n }\n\n async findOne(objectName: string, query?: DataEngineQueryOptions): Promise<any> {\n this.logger.debug('FindOne operation', { objectName });\n const driver = this.getDriver(objectName);\n const ast = this.toQueryAST(objectName, query);\n ast.limit = 1;\n\n // Reuse find logic or call generic driver.findOne if available\n // Assuming driver has findOne\n return driver.findOne(objectName, ast);\n }\n\n async insert(object: string, data: any | any[], options?: DataEngineInsertOptions): Promise<any> {\n this.logger.debug('Insert operation starting', { object, isBatch: Array.isArray(data) });\n const driver = this.getDriver(object);\n\n const hookContext: HookContext = {\n object,\n event: 'beforeInsert',\n input: { data, options },\n ql: this\n };\n await this.triggerHooks('beforeInsert', hookContext);\n\n try {\n let result;\n if (Array.isArray(hookContext.input.data)) {\n // Bulk Create\n if (driver.bulkCreate) {\n result = await driver.bulkCreate(object, hookContext.input.data, hookContext.input.options);\n } else {\n // Fallback loop\n result = await Promise.all(hookContext.input.data.map((item: any) => driver.create(object, item, hookContext.input.options)));\n }\n } else {\n result = await driver.create(object, hookContext.input.data, hookContext.input.options);\n }\n\n hookContext.event = 'afterInsert';\n hookContext.result = result;\n await this.triggerHooks('afterInsert', hookContext);\n\n return hookContext.result;\n } catch (e) {\n this.logger.error('Insert operation failed', e as Error, { object });\n throw e;\n }\n }\n\n async update(object: string, data: any, options?: DataEngineUpdateOptions): Promise<any> {\n // NOTE: This signature is tricky because Driver expects (obj, id, data) usually.\n // DataEngine protocol puts filter in options.\n this.logger.debug('Update operation starting', { object });\n const driver = this.getDriver(object);\n \n // 1. Extract ID from data or filter if it's a single update by ID\n // This is a simplification. Real implementation needs robust filter handling.\n let id = data.id || data._id;\n if (!id && options?.filter) {\n // Optimization: If filter is simple ID check, extract it\n if (typeof options.filter === 'string') id = options.filter;\n else if (options.filter._id) id = options.filter._id;\n else if (options.filter.id) id = options.filter.id;\n }\n\n const hookContext: HookContext = {\n object,\n event: 'beforeUpdate',\n input: { id, data, options },\n ql: this\n };\n await this.triggerHooks('beforeUpdate', hookContext);\n\n try {\n let result;\n if (hookContext.input.id) {\n // Single update by ID\n result = await driver.update(object, hookContext.input.id, hookContext.input.data, hookContext.input.options);\n } else if (options?.multi && driver.updateMany) {\n // Bulk update by Query\n const ast = this.toQueryAST(object, { filter: options.filter });\n result = await driver.updateMany(object, ast, hookContext.input.data, hookContext.input.options);\n } else {\n throw new Error('Update requires an ID or options.multi=true');\n }\n\n hookContext.event = 'afterUpdate';\n hookContext.result = result;\n await this.triggerHooks('afterUpdate', hookContext);\n return hookContext.result;\n } catch (e) {\n this.logger.error('Update operation failed', e as Error, { object });\n throw e;\n }\n }\n\n async delete(object: string, options?: DataEngineDeleteOptions): Promise<any> {\n this.logger.debug('Delete operation starting', { object });\n const driver = this.getDriver(object);\n\n // Extract ID logic similar to update\n let id: any = undefined;\n if (options?.filter) {\n if (typeof options.filter === 'string') id = options.filter;\n else if (options.filter._id) id = options.filter._id;\n else if (options.filter.id) id = options.filter.id;\n }\n\n const hookContext: HookContext = {\n object,\n event: 'beforeDelete',\n input: { id, options },\n ql: this\n };\n await this.triggerHooks('beforeDelete', hookContext);\n\n try {\n let result;\n if (hookContext.input.id) {\n result = await driver.delete(object, hookContext.input.id, hookContext.input.options);\n } else if (options?.multi && driver.deleteMany) {\n const ast = this.toQueryAST(object, { filter: options.filter });\n result = await driver.deleteMany(object, ast, hookContext.input.options);\n } else {\n throw new Error('Delete requires an ID or options.multi=true');\n }\n\n hookContext.event = 'afterDelete';\n hookContext.result = result;\n await this.triggerHooks('afterDelete', hookContext);\n return hookContext.result;\n } catch (e) {\n this.logger.error('Delete operation failed', e as Error, { object });\n throw e;\n }\n }\n\n async count(object: string, query?: DataEngineCountOptions): Promise<number> {\n const driver = this.getDriver(object);\n if (driver.count) {\n const ast = this.toQueryAST(object, { filter: query?.filter });\n return driver.count(object, ast);\n }\n // Fallback to find().length\n const res = await this.find(object, { filter: query?.filter, select: ['_id'] });\n return res.length;\n }\n\n async aggregate(object: string, query: DataEngineAggregateOptions): Promise<any[]> {\n const driver = this.getDriver(object);\n this.logger.debug(`Aggregate on ${object} using ${driver.name}`, query);\n // Driver needs support for raw aggregation or mapped aggregation\n // For now, if driver supports 'execute', we might pass it down, or we need to add 'aggregate' to DriverInterface\n // In this version, we'll assume driver might handle it via special 'find' or throw not implemented\n throw new Error('Aggregate not yet fully implemented in ObjectQL->Driver mapping');\n }\n \n async execute(command: any, options?: Record<string, any>): Promise<any> {\n // Direct pass-through implies we know which driver to use?\n // Usually execute is tied to a specific object context OR we need a way to select driver.\n // If command has 'object', we use that.\n if (options?.object) {\n const driver = this.getDriver(options.object);\n if (driver.execute) {\n return driver.execute(command, undefined, options);\n }\n }\n throw new Error('Execute requires options.object to select driver');\n }\n}\n","import { ObjectQL } from './engine.js';\nimport { ObjectStackProtocolImplementation } from './protocol.js';\nimport { Plugin, PluginContext } from '@objectstack/core';\n\nexport type { Plugin, PluginContext };\n\nexport class ObjectQLPlugin implements Plugin {\n name = 'com.objectstack.engine.objectql';\n type = 'objectql';\n version = '1.0.0';\n \n private ql: ObjectQL | undefined;\n private hostContext?: Record<string, any>;\n\n constructor(ql?: ObjectQL, hostContext?: Record<string, any>) {\n if (ql) {\n this.ql = ql;\n } else {\n this.hostContext = hostContext;\n // Lazily created in init\n }\n }\n\n init = async (ctx: PluginContext) => {\n if (!this.ql) {\n this.ql = new ObjectQL(this.hostContext);\n }\n \n // Register as provider for Core Kernel Services\n ctx.registerService('objectql', this.ql);\n ctx.registerService('metadata', this.ql);\n ctx.registerService('data', this.ql); // ObjectQL implements IDataEngine\n ctx.registerService('auth', this.ql);\n \n ctx.logger.info('ObjectQL engine registered as service', { \n provides: ['objectql', 'metadata', 'data', 'auth'] \n });\n\n // Register Protocol Implementation\n const protocolShim = new ObjectStackProtocolImplementation(this.ql);\n\n ctx.registerService('protocol', protocolShim);\n ctx.logger.info('Protocol service registered');\n }\n\n start = async (ctx: PluginContext) => {\n ctx.logger.info('ObjectQL engine initialized');\n \n // Discover features from Kernel Services\n if (ctx.getServices && this.ql) {\n const services = ctx.getServices();\n for (const [name, service] of services.entries()) {\n if (name.startsWith('driver.')) {\n // Register Driver\n this.ql.registerDriver(service);\n ctx.logger.debug('Discovered and registered driver service', { serviceName: name });\n }\n if (name.startsWith('app.')) {\n // Register App\n this.ql.registerApp(service); // service is Manifest\n ctx.logger.debug('Discovered and registered app service', { serviceName: name });\n }\n }\n }\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@objectstack/objectql",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"description": "Isomorphic ObjectQL Engine for ObjectStack",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
8
|
"dependencies": {
|
|
9
|
-
"@objectstack/core": "1.0.
|
|
10
|
-
"@objectstack/spec": "1.0.
|
|
11
|
-
"@objectstack/types": "1.0.
|
|
9
|
+
"@objectstack/core": "1.0.7",
|
|
10
|
+
"@objectstack/spec": "1.0.7",
|
|
11
|
+
"@objectstack/types": "1.0.7"
|
|
12
12
|
},
|
|
13
13
|
"devDependencies": {
|
|
14
14
|
"typescript": "^5.0.0",
|
package/src/plugin.ts
CHANGED