@objectql/core 3.0.1 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/CHANGELOG.md +17 -3
  2. package/README.md +31 -9
  3. package/dist/ai-agent.d.ts +4 -3
  4. package/dist/ai-agent.js +10 -3
  5. package/dist/ai-agent.js.map +1 -1
  6. package/dist/app.d.ts +29 -6
  7. package/dist/app.js +117 -58
  8. package/dist/app.js.map +1 -1
  9. package/dist/formula-engine.d.ts +7 -0
  10. package/dist/formula-engine.js +9 -2
  11. package/dist/formula-engine.js.map +1 -1
  12. package/dist/formula-plugin.d.ts +52 -0
  13. package/dist/formula-plugin.js +107 -0
  14. package/dist/formula-plugin.js.map +1 -0
  15. package/dist/index.d.ts +16 -3
  16. package/dist/index.js +14 -3
  17. package/dist/index.js.map +1 -1
  18. package/dist/plugin.d.ts +89 -0
  19. package/dist/plugin.js +136 -0
  20. package/dist/plugin.js.map +1 -0
  21. package/dist/query/filter-translator.d.ts +39 -0
  22. package/dist/query/filter-translator.js +135 -0
  23. package/dist/query/filter-translator.js.map +1 -0
  24. package/dist/query/index.d.ts +22 -0
  25. package/dist/query/index.js +39 -0
  26. package/dist/query/index.js.map +1 -0
  27. package/dist/query/query-analyzer.d.ts +188 -0
  28. package/dist/query/query-analyzer.js +349 -0
  29. package/dist/query/query-analyzer.js.map +1 -0
  30. package/dist/query/query-builder.d.ts +29 -0
  31. package/dist/query/query-builder.js +71 -0
  32. package/dist/query/query-builder.js.map +1 -0
  33. package/dist/query/query-service.d.ts +152 -0
  34. package/dist/query/query-service.js +268 -0
  35. package/dist/query/query-service.js.map +1 -0
  36. package/dist/repository.d.ts +23 -2
  37. package/dist/repository.js +81 -14
  38. package/dist/repository.js.map +1 -1
  39. package/dist/util.d.ts +7 -0
  40. package/dist/util.js +18 -3
  41. package/dist/util.js.map +1 -1
  42. package/dist/validator-plugin.d.ts +56 -0
  43. package/dist/validator-plugin.js +106 -0
  44. package/dist/validator-plugin.js.map +1 -0
  45. package/dist/validator.d.ts +7 -0
  46. package/dist/validator.js +10 -8
  47. package/dist/validator.js.map +1 -1
  48. package/jest.config.js +16 -0
  49. package/package.json +7 -5
  50. package/src/ai-agent.ts +8 -0
  51. package/src/app.ts +136 -72
  52. package/src/formula-engine.ts +8 -0
  53. package/src/formula-plugin.ts +141 -0
  54. package/src/index.ts +28 -3
  55. package/src/plugin.ts +224 -0
  56. package/src/query/filter-translator.ts +148 -0
  57. package/src/query/index.ts +24 -0
  58. package/src/query/query-analyzer.ts +537 -0
  59. package/src/query/query-builder.ts +81 -0
  60. package/src/query/query-service.ts +393 -0
  61. package/src/repository.ts +101 -18
  62. package/src/util.ts +19 -3
  63. package/src/validator-plugin.ts +140 -0
  64. package/src/validator.ts +12 -5
  65. package/test/__mocks__/@objectstack/runtime.ts +255 -0
  66. package/test/app.test.ts +23 -35
  67. package/test/filter-syntax.test.ts +233 -0
  68. package/test/formula-engine.test.ts +8 -0
  69. package/test/formula-integration.test.ts +8 -0
  70. package/test/formula-plugin.test.ts +197 -0
  71. package/test/introspection.test.ts +8 -0
  72. package/test/mock-driver.ts +8 -0
  73. package/test/plugin-integration.test.ts +213 -0
  74. package/test/repository-validation.test.ts +8 -0
  75. package/test/repository.test.ts +8 -0
  76. package/test/util.test.ts +9 -1
  77. package/test/utils.ts +8 -0
  78. package/test/validator-plugin.test.ts +126 -0
  79. package/test/validator.test.ts +8 -0
  80. package/tsconfig.json +8 -0
  81. package/tsconfig.tsbuildinfo +1 -1
  82. package/dist/action.d.ts +0 -7
  83. package/dist/action.js +0 -23
  84. package/dist/action.js.map +0 -1
  85. package/dist/hook.d.ts +0 -8
  86. package/dist/hook.js +0 -25
  87. package/dist/hook.js.map +0 -1
  88. package/dist/object.d.ts +0 -3
  89. package/dist/object.js +0 -28
  90. package/dist/object.js.map +0 -1
  91. package/src/action.ts +0 -40
  92. package/src/hook.ts +0 -42
  93. package/src/object.ts +0 -26
  94. package/test/action.test.ts +0 -276
  95. package/test/hook.test.ts +0 -343
  96. package/test/object.test.ts +0 -183
package/src/app.ts CHANGED
@@ -1,12 +1,20 @@
1
+ /**
2
+ * ObjectQL
3
+ * Copyright (c) 2026-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
1
9
  import {
2
- MetadataRegistry,
10
+ MetadataRegistry,
11
+ MetadataItem,
3
12
  Driver,
4
13
  ObjectConfig,
5
14
  ObjectQLContext,
6
15
  ObjectQLContextOptions,
7
16
  IObjectQL,
8
17
  ObjectQLConfig,
9
- ObjectQLPlugin,
10
18
  HookName,
11
19
  HookHandler,
12
20
  HookContext,
@@ -14,37 +22,47 @@ import {
14
22
  ActionContext,
15
23
  LoaderPlugin
16
24
  } from '@objectql/types';
25
+ import { ObjectStackKernel, type RuntimePlugin } from '@objectql/runtime';
17
26
  import { ObjectRepository } from './repository';
18
- // import { createDriverFromConnection } from './driver'; // REMOVE THIS
19
-
20
- // import { loadRemoteFromUrl } from './remote';
21
- import { executeActionHelper, registerActionHelper, ActionEntry } from './action';
22
- import { registerHookHelper, triggerHookHelper, HookEntry } from './hook';
23
- import { registerObjectHelper, getConfigsHelper } from './object';
27
+ import { ObjectQLPlugin } from './plugin';
24
28
  import { convertIntrospectedSchemaToObjects } from './util';
25
29
 
30
+ /**
31
+ * ObjectQL
32
+ *
33
+ * ObjectQL implementation that wraps ObjectStackKernel
34
+ * to provide the plugin architecture.
35
+ */
26
36
  export class ObjectQL implements IObjectQL {
27
- public metadata: MetadataRegistry;
37
+ // Delegate to kernel for metadata, hooks, and actions
38
+ public get metadata(): MetadataRegistry {
39
+ return this.kernel.metadata;
40
+ }
41
+
28
42
  private datasources: Record<string, Driver> = {};
29
43
  private remotes: string[] = [];
30
- private hooks: Record<string, HookEntry[]> = {};
31
- private actions: Record<string, ActionEntry> = {};
32
- private pluginsList: ObjectQLPlugin[] = [];
44
+
45
+ // ObjectStack Kernel Integration
46
+ private kernel!: ObjectStackKernel;
47
+ private kernelPlugins: RuntimePlugin[] = [];
33
48
 
34
49
  // Store config for lazy loading in init()
35
50
  private config: ObjectQLConfig;
36
51
 
37
52
  constructor(config: ObjectQLConfig) {
38
53
  this.config = config;
39
- this.metadata = config.registry || new MetadataRegistry();
40
54
  this.datasources = config.datasources || {};
41
- // this.remotes = config.remotes || [];
42
55
 
43
56
  if (config.connection) {
44
57
  throw new Error("Connection strings are not supported in core directly. Use @objectql/platform-node's createDriverFromConnection or pass a driver instance to 'datasources'.");
45
58
  }
46
59
 
47
- // Initialize Plugin List (but don't setup yet)
60
+ // Add the ObjectQL plugin to provide enhanced features
61
+ this.kernelPlugins.push(new ObjectQLPlugin({
62
+ datasources: this.datasources
63
+ }));
64
+
65
+ // Add runtime plugins from config
48
66
  if (config.plugins) {
49
67
  for (const plugin of config.plugins) {
50
68
  if (typeof plugin === 'string') {
@@ -54,41 +72,68 @@ export class ObjectQL implements IObjectQL {
54
72
  }
55
73
  }
56
74
  }
57
- }
58
- use(plugin: ObjectQLPlugin) {
59
- this.pluginsList.push(plugin);
60
- }
61
-
62
- removePackage(name: string) {
63
- this.metadata.unregisterPackage(name);
64
75
 
65
- // Remove hooks
66
- for (const event of Object.keys(this.hooks)) {
67
- this.hooks[event] = this.hooks[event].filter(h => h.packageName !== name);
68
- }
76
+ // Create the kernel
77
+ this.kernel = new ObjectStackKernel(this.kernelPlugins);
69
78
 
70
- // Remove actions
71
- for (const key of Object.keys(this.actions)) {
72
- if (this.actions[key].packageName === name) {
73
- delete this.actions[key];
79
+ // Register initial metadata if provided
80
+ if (config.registry) {
81
+ // Copy metadata from provided registry to kernel's registry
82
+ for (const type of config.registry.getTypes()) {
83
+ const items = config.registry.list(type);
84
+ for (const item of items) {
85
+ // Safely extract the item's id/name
86
+ const itemId = typeof item === 'object' && item !== null
87
+ ? (item as { name?: string; id?: string }).name || (item as { name?: string; id?: string }).id || 'unknown'
88
+ : 'unknown';
89
+
90
+ this.kernel.metadata.register(type, {
91
+ type,
92
+ id: itemId,
93
+ content: item
94
+ });
95
+ }
74
96
  }
75
97
  }
76
98
  }
99
+
100
+ use(plugin: RuntimePlugin) {
101
+ this.kernelPlugins.push(plugin);
102
+ }
103
+
104
+ removePackage(name: string) {
105
+ // Delegate to kernel managers
106
+ this.kernel.metadata.unregisterPackage(name);
107
+ this.kernel.hooks.removePackage(name);
108
+ this.kernel.actions.removePackage(name);
109
+ }
77
110
 
78
111
  on(event: HookName, objectName: string, handler: HookHandler, packageName?: string) {
79
- registerHookHelper(this.hooks, event, objectName, handler, packageName);
112
+ // Delegate to kernel hook manager
113
+ // We wrap the handler to bridge ObjectQL's rich context types with runtime's base types
114
+ // The runtime HookContext supports all fields via index signature, so this is safe
115
+ const wrappedHandler = handler as unknown as import('../../../objectstack/runtime/dist').HookHandler;
116
+ this.kernel.hooks.register(event, objectName, wrappedHandler, packageName);
80
117
  }
81
118
 
82
119
  async triggerHook(event: HookName, objectName: string, ctx: HookContext) {
83
- await triggerHookHelper(this.metadata, this.hooks, event, objectName, ctx);
120
+ // Delegate to kernel hook manager
121
+ // Runtime HookContext supports ObjectQL-specific fields via index signature
122
+ await this.kernel.hooks.trigger(event, objectName, ctx);
84
123
  }
85
124
 
86
125
  registerAction(objectName: string, actionName: string, handler: ActionHandler, packageName?: string) {
87
- registerActionHelper(this.actions, objectName, actionName, handler, packageName);
126
+ // Delegate to kernel action manager
127
+ // We wrap the handler to bridge ObjectQL's rich context types with runtime's base types
128
+ // The runtime ActionContext supports all fields via index signature, so this is safe
129
+ const wrappedHandler = handler as unknown as import('../../../objectstack/runtime/dist').ActionHandler;
130
+ this.kernel.actions.register(objectName, actionName, wrappedHandler, packageName);
88
131
  }
89
132
 
90
133
  async executeAction(objectName: string, actionName: string, ctx: ActionContext) {
91
- return await executeActionHelper(this.metadata, this.actions, objectName, actionName, ctx);
134
+ // Delegate to kernel action manager
135
+ // Runtime ActionContext supports ObjectQL-specific fields via index signature
136
+ return await this.kernel.actions.execute(objectName, actionName, ctx);
92
137
  }
93
138
 
94
139
  createContext(options: ObjectQLContextOptions): ObjectQLContext {
@@ -100,7 +145,7 @@ export class ObjectQL implements IObjectQL {
100
145
  object: (name: string) => {
101
146
  return new ObjectRepository(name, ctx, this);
102
147
  },
103
- transaction: async (callback) => {
148
+ transaction: async (callback: (ctx: ObjectQLContext) => Promise<any>) => {
104
149
  const driver = this.datasources['default'];
105
150
  if (!driver || !driver.beginTransaction) {
106
151
  return callback(ctx);
@@ -116,7 +161,7 @@ export class ObjectQL implements IObjectQL {
116
161
  const trxCtx: ObjectQLContext = {
117
162
  ...ctx,
118
163
  transactionHandle: trx,
119
- transaction: async (cb) => cb(trxCtx)
164
+ transaction: async (cb: (ctx: ObjectQLContext) => Promise<any>) => cb(trxCtx)
120
165
  };
121
166
 
122
167
  try {
@@ -135,20 +180,53 @@ export class ObjectQL implements IObjectQL {
135
180
  return ctx;
136
181
  }
137
182
 
183
+ /**
184
+ * Get the underlying ObjectStackKernel instance
185
+ *
186
+ * This provides access to the kernel for advanced usage scenarios
187
+ * where you need direct access to the plugin architecture.
188
+ *
189
+ * @returns The ObjectStackKernel instance
190
+ * @throws Error if called before init()
191
+ */
192
+ getKernel(): ObjectStackKernel {
193
+ if (!this.kernel) {
194
+ throw new Error('Kernel not initialized. Call init() first.');
195
+ }
196
+ return this.kernel;
197
+ }
198
+
138
199
  registerObject(object: ObjectConfig) {
139
- registerObjectHelper(this.metadata, object);
200
+ // Normalize fields
201
+ if (object.fields) {
202
+ for (const [key, field] of Object.entries(object.fields)) {
203
+ if (field && !field.name) {
204
+ field.name = key;
205
+ }
206
+ }
207
+ }
208
+ this.kernel.metadata.register('object', {
209
+ type: 'object',
210
+ id: object.name,
211
+ content: object
212
+ });
140
213
  }
141
214
 
142
215
  unregisterObject(name: string) {
143
- this.metadata.unregister('object', name);
216
+ this.kernel.metadata.unregister('object', name);
144
217
  }
145
218
 
146
219
  getObject(name: string): ObjectConfig | undefined {
147
- return this.metadata.get<ObjectConfig>('object', name);
220
+ return this.kernel.metadata.get<ObjectConfig>('object', name);
148
221
  }
149
222
 
150
223
  getConfigs(): Record<string, ObjectConfig> {
151
- return getConfigsHelper(this.metadata);
224
+ const result: Record<string, ObjectConfig> = {};
225
+ const items = this.kernel.metadata.list<ObjectConfig>('object');
226
+ for (const item of items) {
227
+ result[item.name] = item;
228
+ }
229
+ return result;
152
230
  }
153
231
 
154
232
  datasource(name: string): Driver {
@@ -207,46 +285,30 @@ export class ObjectQL implements IObjectQL {
207
285
  }
208
286
 
209
287
  async init() {
210
- // 0. Init Plugins (This allows plugins to register custom loaders)
211
- for (const plugin of this.pluginsList) {
212
- console.log(`Initializing plugin '${plugin.name}'...`);
213
-
214
- let app: IObjectQL = this;
215
- const pkgName = (plugin as any)._packageName;
216
-
217
- if (pkgName) {
218
- app = new Proxy(this, {
219
- get(target, prop) {
220
- if (prop === 'on') {
221
- return (event: HookName, obj: string, handler: HookHandler) =>
222
- target.on(event, obj, handler, pkgName);
223
- }
224
- if (prop === 'registerAction') {
225
- return (obj: string, act: string, handler: ActionHandler) =>
226
- target.registerAction(obj, act, handler, pkgName);
227
- }
228
- const value = (target as any)[prop];
229
- return typeof value === 'function' ? value.bind(target) : value;
230
- }
231
- });
288
+ console.log('[ObjectQL] Initializing with ObjectStackKernel...');
289
+
290
+ // Start the kernel - this will install and start all plugins
291
+ await this.kernel.start();
292
+
293
+ // TEMPORARY: Set driver for backward compatibility during migration
294
+ // This allows the kernel mock to delegate to the driver
295
+ if (typeof (this.kernel as any).setDriver === 'function') {
296
+ const defaultDriver = this.datasources['default'];
297
+ if (defaultDriver) {
298
+ (this.kernel as any).setDriver(defaultDriver);
232
299
  }
233
-
234
- await plugin.setup(app);
235
300
  }
236
301
 
237
- // Packages, Presets, Source, Objects loading logic removed from Core.
238
- // Use @objectql/platform-node's ObjectLoader or platform-specific loaders.
239
-
240
- // 3. Load In-Memory Objects (Dynamic Layer)
302
+ // Load In-Memory Objects (Dynamic Layer)
241
303
  if (this.config.objects) {
242
304
  for (const [key, obj] of Object.entries(this.config.objects)) {
243
305
  this.registerObject(obj);
244
306
  }
245
307
  }
246
308
 
247
- const objects = this.metadata.list<ObjectConfig>('object');
309
+ const objects = this.kernel.metadata.list<ObjectConfig>('object');
248
310
 
249
- // 5. Init Datasources
311
+ // Init Datasources
250
312
  // Let's pass all objects to all configured drivers.
251
313
  for (const [name, driver] of Object.entries(this.datasources)) {
252
314
  if (driver.init) {
@@ -255,12 +317,14 @@ export class ObjectQL implements IObjectQL {
255
317
  }
256
318
  }
257
319
 
258
- // 6. Process Initial Data
320
+ // Process Initial Data
259
321
  await this.processInitialData();
322
+
323
+ console.log('[ObjectQL] Initialization complete');
260
324
  }
261
325
 
262
326
  private async processInitialData() {
263
- const dataEntries = this.metadata.list<any>('data');
327
+ const dataEntries = this.kernel.metadata.list<any>('data');
264
328
  if (dataEntries.length === 0) return;
265
329
 
266
330
  console.log(`Processing ${dataEntries.length} initial data files...`);
@@ -1,3 +1,11 @@
1
+ /**
2
+ * ObjectQL
3
+ * Copyright (c) 2026-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
1
9
  /**
2
10
  * Formula Engine Implementation
3
11
  *
@@ -0,0 +1,141 @@
1
+ /**
2
+ * ObjectQL Formula Plugin
3
+ * Copyright (c) 2026-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
9
+ import type { RuntimePlugin, RuntimeContext, ObjectStackKernel } from '@objectql/runtime';
10
+ import { FormulaEngine } from './formula-engine';
11
+ import type { FormulaEngineConfig } from '@objectql/types';
12
+
13
+ /**
14
+ * Extended ObjectStack Kernel with formula engine capability
15
+ */
16
+ interface KernelWithFormulas extends ObjectStackKernel {
17
+ formulaEngine?: FormulaEngine;
18
+ }
19
+
20
+ /**
21
+ * Configuration for the Formula Plugin
22
+ */
23
+ export interface FormulaPluginConfig extends FormulaEngineConfig {
24
+ /**
25
+ * Enable automatic formula evaluation on queries
26
+ * @default true
27
+ */
28
+ autoEvaluateOnQuery?: boolean;
29
+ }
30
+
31
+ /**
32
+ * Formula Plugin
33
+ *
34
+ * Wraps the ObjectQL Formula Engine as an ObjectStack plugin.
35
+ * Registers formula evaluation capabilities into the kernel.
36
+ */
37
+ export class FormulaPlugin implements RuntimePlugin {
38
+ name = '@objectql/formulas';
39
+ version = '4.0.0';
40
+
41
+ private engine: FormulaEngine;
42
+ private config: FormulaPluginConfig;
43
+
44
+ constructor(config: FormulaPluginConfig = {}) {
45
+ this.config = {
46
+ autoEvaluateOnQuery: true,
47
+ ...config
48
+ };
49
+
50
+ // Initialize the formula engine with configuration
51
+ this.engine = new FormulaEngine(config);
52
+ }
53
+
54
+ /**
55
+ * Install the plugin into the kernel
56
+ * Registers formula evaluation capabilities
57
+ */
58
+ async install(ctx: RuntimeContext): Promise<void> {
59
+ const kernel = ctx.engine as KernelWithFormulas;
60
+
61
+ console.log(`[${this.name}] Installing formula plugin...`);
62
+
63
+ // Make formula engine accessible from the kernel for direct usage
64
+ kernel.formulaEngine = this.engine;
65
+
66
+ // Register formula provider if the kernel supports it
67
+ this.registerFormulaProvider(kernel);
68
+
69
+ // Register formula evaluation middleware if auto-evaluation is enabled
70
+ if (this.config.autoEvaluateOnQuery !== false) {
71
+ this.registerFormulaMiddleware(kernel);
72
+ }
73
+
74
+ console.log(`[${this.name}] Formula plugin installed`);
75
+ }
76
+
77
+ /**
78
+ * Register the formula provider with the kernel
79
+ * @private
80
+ */
81
+ private registerFormulaProvider(kernel: KernelWithFormulas): void {
82
+ // Check if kernel supports formula provider registration
83
+ if (typeof (kernel as any).registerFormulaProvider === 'function') {
84
+ (kernel as any).registerFormulaProvider({
85
+ evaluate: (formula: string, context: any) => {
86
+ // Delegate to the formula engine
87
+ // Note: In a real implementation, we would need to properly construct
88
+ // the FormulaContext from the provided context
89
+ return this.engine.evaluate(
90
+ formula,
91
+ context,
92
+ 'text', // default data type
93
+ {}
94
+ );
95
+ },
96
+ validate: (expression: string) => {
97
+ return this.engine.validate(expression);
98
+ },
99
+ extractMetadata: (fieldName: string, expression: string, dataType: any) => {
100
+ return this.engine.extractMetadata(fieldName, expression, dataType);
101
+ }
102
+ });
103
+ }
104
+ // Note: formulaEngine is already registered in install() method above
105
+ }
106
+
107
+ /**
108
+ * Register formula evaluation middleware
109
+ * @private
110
+ */
111
+ private registerFormulaMiddleware(kernel: KernelWithFormulas): void {
112
+ // Check if kernel supports middleware hooks
113
+ if (typeof (kernel as any).use === 'function') {
114
+ // Register middleware to evaluate formulas after queries
115
+ (kernel as any).use('afterQuery', async (context: any) => {
116
+ // Formula evaluation logic would go here
117
+ // This would automatically compute formula fields after data is retrieved
118
+ if (context.results && context.metadata?.fields) {
119
+ // Iterate through fields and evaluate formulas
120
+ // const formulaFields = Object.entries(context.metadata.fields)
121
+ // .filter(([_, fieldConfig]) => (fieldConfig as any).formula);
122
+ //
123
+ // for (const record of context.results) {
124
+ // for (const [fieldName, fieldConfig] of formulaFields) {
125
+ // const formula = (fieldConfig as any).formula;
126
+ // const result = this.engine.evaluate(formula, /* context */, /* dataType */);
127
+ // record[fieldName] = result.value;
128
+ // }
129
+ // }
130
+ }
131
+ });
132
+ }
133
+ }
134
+
135
+ /**
136
+ * Get the formula engine instance for direct access
137
+ */
138
+ getEngine(): FormulaEngine {
139
+ return this.engine;
140
+ }
141
+ }
package/src/index.ts CHANGED
@@ -1,9 +1,34 @@
1
+ /**
2
+ * ObjectQL
3
+ * Copyright (c) 2026-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
9
+ // Re-export types from @objectstack packages for API compatibility
10
+ export type { ObjectStackKernel, ObjectStackRuntimeProtocol } from '@objectql/runtime';
11
+ // Note: @objectstack/objectql types temporarily commented out due to type incompatibilities
12
+ // in the published package. Will be re-enabled when package is updated.
13
+ // export type { ObjectQL as ObjectQLEngine, SchemaRegistry } from '@objectstack/objectql';
14
+
15
+ // Export ObjectStack spec types for driver development
16
+ import { Data, System } from '@objectstack/spec';
17
+ export type QueryAST = Data.QueryAST;
18
+ export type DriverInterface = System.DriverInterface;
19
+ export type DriverOptions = System.DriverOptions;
20
+
21
+ // Export our enhanced runtime components (actual implementations)
1
22
  export * from './repository';
2
23
  export * from './app';
24
+ export * from './plugin';
25
+ export * from './validator-plugin';
26
+ export * from './formula-plugin';
27
+
28
+ // Export query-specific modules (ObjectQL core competency)
29
+ export * from './query';
3
30
 
4
- export * from './action';
5
- export * from './hook';
6
- export * from './object';
31
+ // Export utilities
7
32
  export * from './validator';
8
33
  export * from './util';
9
34
  export * from './ai-agent';