diff --git a/examples/showcase/enterprise-erp/package.json b/examples/showcase/enterprise-erp/package.json index 71f061d6..0b6b384b 100644 --- a/examples/showcase/enterprise-erp/package.json +++ b/examples/showcase/enterprise-erp/package.json @@ -43,7 +43,7 @@ "@objectql/cli": "workspace:*", "@objectql/driver-sql": "workspace:*", "@objectql/platform-node": "workspace:*", - "@objectstack/spec": "^0.2.0", + "@objectstack/spec": "^0.3.1", "@types/jest": "^30.0.0", "@types/node": "^20.0.0", "jest": "^30.2.0", diff --git a/packages/drivers/excel/package.json b/packages/drivers/excel/package.json index c18fb497..4be0e0d0 100644 --- a/packages/drivers/excel/package.json +++ b/packages/drivers/excel/package.json @@ -21,7 +21,7 @@ }, "dependencies": { "@objectql/types": "workspace:*", - "@objectstack/spec": "^0.2.0", + "@objectstack/spec": "^0.3.1", "exceljs": "^4.4.0" }, "devDependencies": { diff --git a/packages/drivers/excel/src/index.ts b/packages/drivers/excel/src/index.ts index 171e1f26..78d052b2 100644 --- a/packages/drivers/excel/src/index.ts +++ b/packages/drivers/excel/src/index.ts @@ -1,3 +1,8 @@ +import { Data, System } from '@objectstack/spec'; +type QueryAST = Data.QueryAST; +type FilterNode = Data.FilterNode; +type SortNode = Data.SortNode; +type DriverInterface = System.DriverInterface; /** * ObjectQL * Copyright (c) 2026-present ObjectStack Inc. @@ -30,7 +35,6 @@ */ import { Driver, ObjectQLError } from '@objectql/types'; -import { DriverInterface, QueryAST, FilterNode, SortNode } from '@objectstack/spec'; import * as ExcelJS from 'exceljs'; import * as fs from 'fs'; import * as path from 'path'; @@ -102,7 +106,7 @@ export interface ExcelDriverConfig { * the standard DriverInterface from @objectstack/spec for compatibility * with the new kernel-based plugin system. */ -export class ExcelDriver implements Driver, DriverInterface { +export class ExcelDriver implements Driver { // Driver metadata (ObjectStack-compatible) public readonly name = 'ExcelDriver'; public readonly version = '4.0.0'; @@ -111,7 +115,13 @@ export class ExcelDriver implements Driver, DriverInterface { joins: false, fullTextSearch: false, jsonFields: true, - arrayFields: true + arrayFields: true, + queryFilters: true, + queryAggregations: false, + querySorting: true, + queryPagination: true, + queryWindowFunctions: false, + querySubqueries: false }; private config: ExcelDriverConfig; diff --git a/packages/drivers/fs/package.json b/packages/drivers/fs/package.json index 1265942e..2e56941a 100644 --- a/packages/drivers/fs/package.json +++ b/packages/drivers/fs/package.json @@ -26,7 +26,7 @@ }, "dependencies": { "@objectql/types": "workspace:*", - "@objectstack/spec": "^0.2.0" + "@objectstack/spec": "^0.3.1" }, "devDependencies": { "@types/jest": "^29.0.0", diff --git a/packages/drivers/fs/src/index.ts b/packages/drivers/fs/src/index.ts index 714b79bf..1692b64a 100644 --- a/packages/drivers/fs/src/index.ts +++ b/packages/drivers/fs/src/index.ts @@ -1,3 +1,8 @@ +import { Data, System } from '@objectstack/spec'; +type QueryAST = Data.QueryAST; +type FilterNode = Data.FilterNode; +type SortNode = Data.SortNode; +type DriverInterface = System.DriverInterface; /** * ObjectQL * Copyright (c) 2026-present ObjectStack Inc. @@ -35,7 +40,6 @@ import * as fs from 'fs'; import * as path from 'path'; import { Driver, ObjectQLError } from '@objectql/types'; -import { DriverInterface, QueryAST, FilterNode, SortNode } from '@objectstack/spec'; /** * Command interface for executeCommand method @@ -84,7 +88,7 @@ export interface FileSystemDriverConfig { * - File: `{dataDir}/{objectName}.json` * - Content: Array of records `[{id: "1", ...}, {id: "2", ...}]` */ -export class FileSystemDriver implements Driver, DriverInterface { +export class FileSystemDriver implements Driver { // Driver metadata (ObjectStack-compatible) public readonly name = 'FileSystemDriver'; public readonly version = '4.0.0'; @@ -93,7 +97,13 @@ export class FileSystemDriver implements Driver, DriverInterface { joins: false, fullTextSearch: false, jsonFields: true, - arrayFields: true + arrayFields: true, + queryFilters: true, + queryAggregations: false, + querySorting: true, + queryPagination: true, + queryWindowFunctions: false, + querySubqueries: false }; private config: FileSystemDriverConfig; diff --git a/packages/drivers/localstorage/package.json b/packages/drivers/localstorage/package.json index 7bac8609..189ef616 100644 --- a/packages/drivers/localstorage/package.json +++ b/packages/drivers/localstorage/package.json @@ -21,7 +21,7 @@ }, "dependencies": { "@objectql/types": "workspace:*", - "@objectstack/spec": "^0.2.0" + "@objectstack/spec": "^0.3.1" }, "devDependencies": { "@types/jest": "^29.0.0", diff --git a/packages/drivers/localstorage/src/index.ts b/packages/drivers/localstorage/src/index.ts index 35a35f5f..72deb682 100644 --- a/packages/drivers/localstorage/src/index.ts +++ b/packages/drivers/localstorage/src/index.ts @@ -1,3 +1,8 @@ +import { Data, System } from '@objectstack/spec'; +type QueryAST = Data.QueryAST; +type FilterNode = Data.FilterNode; +type SortNode = Data.SortNode; +type DriverInterface = System.DriverInterface; /** * ObjectQL * Copyright (c) 2026-present ObjectStack Inc. @@ -32,7 +37,6 @@ */ import { Driver, ObjectQLError } from '@objectql/types'; -import { DriverInterface, QueryAST, FilterNode, SortNode } from '@objectstack/spec'; /** * Command interface for executeCommand method @@ -80,7 +84,7 @@ export interface LocalStorageDriverConfig { * * Example: `objectql:users:user-123` → `{"id":"user-123","name":"Alice",...}` */ -export class LocalStorageDriver implements Driver, DriverInterface { +export class LocalStorageDriver implements Driver { // Driver metadata (ObjectStack-compatible) public readonly name = 'LocalStorageDriver'; public readonly version = '4.0.0'; @@ -89,7 +93,13 @@ export class LocalStorageDriver implements Driver, DriverInterface { joins: false, fullTextSearch: false, jsonFields: true, - arrayFields: true + arrayFields: true, + queryFilters: true, + queryAggregations: false, + querySorting: true, + queryPagination: true, + queryWindowFunctions: false, + querySubqueries: false }; private config: LocalStorageDriverConfig; diff --git a/packages/drivers/memory/package.json b/packages/drivers/memory/package.json index 428f5cb1..d65de904 100644 --- a/packages/drivers/memory/package.json +++ b/packages/drivers/memory/package.json @@ -21,7 +21,7 @@ }, "dependencies": { "@objectql/types": "workspace:*", - "@objectstack/spec": "^0.2.0", + "@objectstack/spec": "^0.3.1", "mingo": "^7.1.1" }, "devDependencies": { diff --git a/packages/drivers/memory/src/index.ts b/packages/drivers/memory/src/index.ts index 7fc14072..b12dcd61 100644 --- a/packages/drivers/memory/src/index.ts +++ b/packages/drivers/memory/src/index.ts @@ -1,3 +1,8 @@ +import { Data, System } from '@objectstack/spec'; +type QueryAST = Data.QueryAST; +type FilterNode = Data.FilterNode; +type SortNode = Data.SortNode; +type DriverInterface = System.DriverInterface; /** * ObjectQL * Copyright (c) 2026-present ObjectStack Inc. @@ -34,7 +39,6 @@ */ import { Driver, ObjectQLError } from '@objectql/types'; -import { DriverInterface, QueryAST, FilterNode, SortNode } from '@objectstack/spec'; import { Query } from 'mingo'; /** diff --git a/packages/drivers/mongo/package.json b/packages/drivers/mongo/package.json index d02f9c1b..19769ffd 100644 --- a/packages/drivers/mongo/package.json +++ b/packages/drivers/mongo/package.json @@ -21,7 +21,7 @@ }, "dependencies": { "@objectql/types": "workspace:*", - "@objectstack/spec": "^0.2.0", + "@objectstack/spec": "^0.3.1", "mongodb": "^5.9.2" }, "devDependencies": { diff --git a/packages/drivers/mongo/src/index.ts b/packages/drivers/mongo/src/index.ts index 8b1b463e..a3365493 100644 --- a/packages/drivers/mongo/src/index.ts +++ b/packages/drivers/mongo/src/index.ts @@ -1,3 +1,8 @@ +import { Data, System } from '@objectstack/spec'; +type QueryAST = Data.QueryAST; +type FilterNode = Data.FilterNode; +type SortNode = Data.SortNode; +type DriverInterface = System.DriverInterface; /** * ObjectQL * Copyright (c) 2026-present ObjectStack Inc. @@ -7,7 +12,6 @@ */ import { Driver } from '@objectql/types'; -import { DriverInterface, QueryAST, FilterNode, SortNode } from '@objectstack/spec'; import { MongoClient, Db, Filter, ObjectId, FindOptions } from 'mongodb'; /** diff --git a/packages/drivers/redis/package.json b/packages/drivers/redis/package.json index 8ec9cef4..12c49d85 100644 --- a/packages/drivers/redis/package.json +++ b/packages/drivers/redis/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "@objectql/types": "workspace:*", - "@objectstack/spec": "^0.2.0", + "@objectstack/spec": "^0.3.1", "redis": "^4.6.0" }, "devDependencies": { diff --git a/packages/drivers/redis/src/index.ts b/packages/drivers/redis/src/index.ts index 45442547..a6bf9745 100644 --- a/packages/drivers/redis/src/index.ts +++ b/packages/drivers/redis/src/index.ts @@ -1,3 +1,8 @@ +import { Data, System } from '@objectstack/spec'; +type QueryAST = Data.QueryAST; +type FilterNode = Data.FilterNode; +type SortNode = Data.SortNode; +type DriverInterface = System.DriverInterface; /** * ObjectQL * Copyright (c) 2026-present ObjectStack Inc. @@ -31,7 +36,6 @@ */ import { Driver } from '@objectql/types'; -import { DriverInterface, QueryAST, FilterNode, SortNode } from '@objectstack/spec'; import { createClient, RedisClientType } from 'redis'; /** @@ -117,7 +121,7 @@ export interface RedisDriverConfig { * * Example: `users:user-123` → `{"id":"user-123","name":"Alice",...}` */ -export class RedisDriver implements Driver, DriverInterface { +export class RedisDriver implements Driver { // Driver metadata (ObjectStack-compatible) public readonly name = 'RedisDriver'; public readonly version = '4.0.0'; @@ -126,7 +130,13 @@ export class RedisDriver implements Driver, DriverInterface { joins: false, fullTextSearch: false, jsonFields: true, - arrayFields: true + arrayFields: true, + queryFilters: true, + queryAggregations: false, + querySorting: true, + queryPagination: true, + queryWindowFunctions: false, + querySubqueries: false }; private client: RedisClientType; diff --git a/packages/drivers/sdk/package.json b/packages/drivers/sdk/package.json index 2ebaed7e..ab03a9b2 100644 --- a/packages/drivers/sdk/package.json +++ b/packages/drivers/sdk/package.json @@ -32,7 +32,7 @@ }, "dependencies": { "@objectql/types": "workspace:*", - "@objectstack/spec": "^0.2.0" + "@objectstack/spec": "^0.3.1" }, "devDependencies": { "typescript": "^5.3.0" diff --git a/packages/drivers/sdk/src/index.ts b/packages/drivers/sdk/src/index.ts index 166b8378..652c13f6 100644 --- a/packages/drivers/sdk/src/index.ts +++ b/packages/drivers/sdk/src/index.ts @@ -1,3 +1,8 @@ +import { Data, System } from '@objectstack/spec'; +type QueryAST = Data.QueryAST; +type FilterNode = Data.FilterNode; +type SortNode = Data.SortNode; +type DriverInterface = System.DriverInterface; /** * ObjectQL * Copyright (c) 2026-present ObjectStack Inc. @@ -50,7 +55,6 @@ import { ApiErrorCode, Filter } from '@objectql/types'; -import { DriverInterface, QueryAST } from '@objectstack/spec'; /** * Command interface for executeCommand method diff --git a/packages/drivers/sql/package.json b/packages/drivers/sql/package.json index ede61730..a099e5a6 100644 --- a/packages/drivers/sql/package.json +++ b/packages/drivers/sql/package.json @@ -23,7 +23,7 @@ }, "dependencies": { "@objectql/types": "workspace:*", - "@objectstack/spec": "^0.2.0", + "@objectstack/spec": "^0.3.1", "knex": "^3.1.0" }, "devDependencies": { diff --git a/packages/drivers/sql/src/index.ts b/packages/drivers/sql/src/index.ts index 26328f55..f9582025 100644 --- a/packages/drivers/sql/src/index.ts +++ b/packages/drivers/sql/src/index.ts @@ -1,3 +1,8 @@ +import { Data, System } from '@objectstack/spec'; +type QueryAST = Data.QueryAST; +type FilterNode = Data.FilterNode; +type SortNode = Data.SortNode; +type DriverInterface = System.DriverInterface; /** * ObjectQL * Copyright (c) 2026-present ObjectStack Inc. @@ -7,7 +12,6 @@ */ import { Driver, IntrospectedSchema, IntrospectedTable, IntrospectedColumn, IntrospectedForeignKey } from '@objectql/types'; -import { DriverInterface, QueryAST, FilterNode, SortNode } from '@objectstack/spec'; import knex, { Knex } from 'knex'; /** diff --git a/packages/foundation/core/package.json b/packages/foundation/core/package.json index 514e632f..ef9fcea6 100644 --- a/packages/foundation/core/package.json +++ b/packages/foundation/core/package.json @@ -23,7 +23,7 @@ }, "dependencies": { "@objectql/types": "workspace:*", - "@objectstack/spec": "workspace:*", + "@objectstack/spec": "^0.3.1", "@objectql/runtime": "workspace:*", "js-yaml": "^4.1.0", "openai": "^4.28.0" diff --git a/packages/foundation/core/src/index.ts b/packages/foundation/core/src/index.ts index d378b8a4..f70857ee 100644 --- a/packages/foundation/core/src/index.ts +++ b/packages/foundation/core/src/index.ts @@ -13,7 +13,10 @@ export type { ObjectStackKernel, ObjectStackRuntimeProtocol } from '@objectql/ru // export type { ObjectQL as ObjectQLEngine, SchemaRegistry } from '@objectstack/objectql'; // Export ObjectStack spec types for driver development -export type { DriverInterface, DriverOptions, QueryAST } from '@objectstack/spec'; +import { Data, System } from '@objectstack/spec'; +export type QueryAST = Data.QueryAST; +export type DriverInterface = System.DriverInterface; +export type DriverOptions = System.DriverOptions; // Export our enhanced runtime components (actual implementations) export * from './repository'; diff --git a/packages/foundation/core/src/query/filter-translator.ts b/packages/foundation/core/src/query/filter-translator.ts index b382977d..d95171bc 100644 --- a/packages/foundation/core/src/query/filter-translator.ts +++ b/packages/foundation/core/src/query/filter-translator.ts @@ -7,7 +7,8 @@ */ import type { Filter } from '@objectql/types'; -import type { FilterNode } from '@objectstack/spec'; +import { Data } from '@objectstack/spec'; +type FilterNode = Data.FilterNode; import { ObjectQLError } from '@objectql/types'; /** diff --git a/packages/foundation/core/src/query/query-analyzer.ts b/packages/foundation/core/src/query/query-analyzer.ts index 1514317f..5262db55 100644 --- a/packages/foundation/core/src/query/query-analyzer.ts +++ b/packages/foundation/core/src/query/query-analyzer.ts @@ -7,7 +7,9 @@ */ import type { UnifiedQuery, ObjectConfig, MetadataRegistry } from '@objectql/types'; -import type { QueryAST, FilterNode } from '@objectstack/spec'; +import { Data } from '@objectstack/spec'; +type QueryAST = Data.QueryAST; +type FilterNode = Data.FilterNode; import { QueryService, QueryOptions } from './query-service'; /** diff --git a/packages/foundation/core/src/query/query-builder.ts b/packages/foundation/core/src/query/query-builder.ts index 3de2b67a..340445d6 100644 --- a/packages/foundation/core/src/query/query-builder.ts +++ b/packages/foundation/core/src/query/query-builder.ts @@ -7,7 +7,8 @@ */ import type { UnifiedQuery } from '@objectql/types'; -import type { QueryAST } from '@objectstack/spec'; +import { Data } from '@objectstack/spec'; +type QueryAST = Data.QueryAST; import { FilterTranslator } from './filter-translator'; /** diff --git a/packages/foundation/core/src/query/query-service.ts b/packages/foundation/core/src/query/query-service.ts index 1e540c8d..5b12ac31 100644 --- a/packages/foundation/core/src/query/query-service.ts +++ b/packages/foundation/core/src/query/query-service.ts @@ -13,7 +13,8 @@ import type { Filter, MetadataRegistry } from '@objectql/types'; -import type { QueryAST } from '@objectstack/spec'; +import { Data } from '@objectstack/spec'; +type QueryAST = Data.QueryAST; import { QueryBuilder } from './query-builder'; /** diff --git a/packages/foundation/core/src/repository.ts b/packages/foundation/core/src/repository.ts index 3e13c042..8ad633dd 100644 --- a/packages/foundation/core/src/repository.ts +++ b/packages/foundation/core/src/repository.ts @@ -8,7 +8,10 @@ import { ObjectQLContext, IObjectQL, ObjectConfig, Driver, UnifiedQuery, ActionContext, HookAPI, RetrievalHookContext, MutationHookContext, UpdateHookContext, ValidationContext, ValidationError, ValidationRuleResult, FormulaContext, Filter } from '@objectql/types'; import type { ObjectStackKernel } from '@objectql/runtime'; -import type { QueryAST, FilterNode, SortNode } from '@objectstack/spec'; +import { Data } from '@objectstack/spec'; +type QueryAST = Data.QueryAST; +type FilterNode = Data.FilterNode; +type SortNode = Data.SortNode; import { Validator } from './validator'; import { FormulaEngine } from './formula-engine'; import { QueryBuilder } from './query'; diff --git a/packages/foundation/core/tsconfig.json b/packages/foundation/core/tsconfig.json index 492c8c30..56f18fa3 100644 --- a/packages/foundation/core/tsconfig.json +++ b/packages/foundation/core/tsconfig.json @@ -13,7 +13,6 @@ "../../../node_modules/@objectstack+objectql" ], "references": [ - { "path": "../../objectstack/spec" }, { "path": "../../objectstack/runtime" }, { "path": "../types" } ] diff --git a/packages/foundation/platform-node/package.json b/packages/foundation/platform-node/package.json index 77d78bfb..792aaea7 100644 --- a/packages/foundation/platform-node/package.json +++ b/packages/foundation/platform-node/package.json @@ -22,7 +22,7 @@ "dependencies": { "@objectql/types": "workspace:*", "@objectql/core": "workspace:*", - "@objectstack/spec": "^0.2.0", + "@objectstack/spec": "^0.3.1", "fast-glob": "^3.3.2", "js-yaml": "^4.1.1" }, diff --git a/packages/foundation/platform-node/src/plugin.ts b/packages/foundation/platform-node/src/plugin.ts index 6abd7a3a..cab8f44c 100644 --- a/packages/foundation/platform-node/src/plugin.ts +++ b/packages/foundation/platform-node/src/plugin.ts @@ -6,7 +6,8 @@ * LICENSE file in the root directory of this source tree. */ -import type { PluginDefinition } from '@objectstack/spec'; +import { System } from '@objectstack/spec'; +type PluginDefinition = System.PluginDefinition; export function loadPlugin(packageName: string): PluginDefinition { let mod: any; diff --git a/packages/foundation/types/package.json b/packages/foundation/types/package.json index 52d44952..7b841154 100644 --- a/packages/foundation/types/package.json +++ b/packages/foundation/types/package.json @@ -27,11 +27,11 @@ "test": "jest --passWithNoTests" }, "peerDependencies": { - "@objectstack/spec": "^0.2.0", + "@objectstack/spec": "^0.3.1", "@objectql/runtime": "^0.2.0" }, "devDependencies": { - "@objectstack/spec": "workspace:*", + "@objectstack/spec": "^0.3.1", "@objectql/runtime": "workspace:*", "ts-json-schema-generator": "^2.4.0" } diff --git a/packages/foundation/types/src/action.ts b/packages/foundation/types/src/action.ts index 012afac4..e629f15e 100644 --- a/packages/foundation/types/src/action.ts +++ b/packages/foundation/types/src/action.ts @@ -7,7 +7,8 @@ */ // Import protocol types from @objectstack/spec -import type { Action } from '@objectstack/spec'; +import { UI } from '@objectstack/spec'; +type Action = UI.Action; import { FieldConfig } from "./field"; import { HookAPI } from "./hook"; // Reuse the restricted API interface diff --git a/packages/foundation/types/src/field.ts b/packages/foundation/types/src/field.ts index 5afa654a..d03ae5a3 100644 --- a/packages/foundation/types/src/field.ts +++ b/packages/foundation/types/src/field.ts @@ -7,11 +7,10 @@ */ // Import protocol types from @objectstack/spec -import type { - FieldType as ProtocolFieldType, - Field, - SelectOption as SpecSelectOption -} from '@objectstack/spec'; +import { Data } from '@objectstack/spec'; +type ProtocolFieldType = Data.FieldType; +type Field = Data.Field; +type SpecSelectOption = Data.SelectOption; /** * Re-export Protocol Types from the Constitution diff --git a/packages/foundation/types/src/object.ts b/packages/foundation/types/src/object.ts index b9501eed..a066bd5b 100644 --- a/packages/foundation/types/src/object.ts +++ b/packages/foundation/types/src/object.ts @@ -7,7 +7,11 @@ */ // Import protocol types from @objectstack/spec -import type { ServiceObject, IndexSchema } from '@objectstack/spec'; +import { Data } from '@objectstack/spec'; +type ServiceObject = Data.ServiceObject; + +// Extract IndexSchema type from ServiceObject +type IndexSchema = NonNullable[number]; import { FieldConfig } from './field'; import { ActionConfig } from './action'; import { AnyValidationRule } from './validation'; diff --git a/packages/foundation/types/src/query.ts b/packages/foundation/types/src/query.ts index 99ac0579..b654bc4e 100644 --- a/packages/foundation/types/src/query.ts +++ b/packages/foundation/types/src/query.ts @@ -6,7 +6,8 @@ * LICENSE file in the root directory of this source tree. */ -import type { FilterCondition } from '@objectstack/spec'; +import { Data } from '@objectstack/spec'; +type FilterCondition = Data.FilterCondition; /** * Modern Query Filter using @objectstack/spec FilterCondition diff --git a/packages/foundation/types/tsconfig.json b/packages/foundation/types/tsconfig.json index 04f77347..456da1ae 100644 --- a/packages/foundation/types/tsconfig.json +++ b/packages/foundation/types/tsconfig.json @@ -6,7 +6,6 @@ }, "include": ["src/**/*"], "references": [ - { "path": "../../objectstack/spec" }, { "path": "../../objectstack/runtime" } ] } diff --git a/packages/objectstack/spec/README.md b/packages/objectstack/spec/README.md deleted file mode 100644 index 60047be0..00000000 --- a/packages/objectstack/spec/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# @objectstack/spec - -ObjectStack Protocol Specification - Type Definitions - -This package contains the canonical wire-protocol type definitions for the ObjectStack ecosystem. - -## Purpose - -This stub package is part of the ObjectQL v4.0 migration to the @objectstack ecosystem. It provides: -- Protocol field types (FieldType, Field, SelectOption) -- Protocol object types (ServiceObject, IndexSchema) -- Protocol action types (Action) -- Protocol query types (FilterCondition) - -## Migration Notes - -This is a workspace stub package created during the ObjectQL type system cleanup phase. The real `@objectstack/spec` package will be published separately to npm. diff --git a/packages/objectstack/spec/package.json b/packages/objectstack/spec/package.json deleted file mode 100644 index ad4082a2..00000000 --- a/packages/objectstack/spec/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "@objectql/spec", - "version": "0.2.0", - "description": "ObjectStack Protocol Specification - Type Definitions", - "keywords": [ - "objectstack", - "protocol", - "spec", - "types" - ], - "license": "MIT", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "files": [ - "dist" - ], - "scripts": { - "build": "tsc", - "test": "echo 'No tests for stub package'" - } -} diff --git a/packages/objectstack/spec/src/index.ts b/packages/objectstack/spec/src/index.ts deleted file mode 100644 index 2a87d55d..00000000 --- a/packages/objectstack/spec/src/index.ts +++ /dev/null @@ -1,359 +0,0 @@ -/** - * @objectstack/spec - * ObjectStack Protocol Specification - * - * This package defines the wire protocol types for the ObjectStack ecosystem. - * These are the canonical type definitions that all implementations must follow. - */ - -/** - * Filter Condition - Modern object-based query syntax - * - * Supports MongoDB/Prisma-style filtering: - * - Implicit equality: { field: value } - * - Explicit operators: { field: { $eq: value, $gt: 10 } } - * - Logical operators: { $and: [...], $or: [...] } - */ -export interface FilterCondition { - [key: string]: any; - $and?: FilterCondition[]; - $or?: FilterCondition[]; - $not?: FilterCondition; -} - -/** - * Filter Node - AST representation of a filter condition - */ -export interface FilterNode { - type: 'and' | 'or' | 'not' | 'comparison'; - operator?: string; - field?: string; - value?: string | number | boolean | null | Date; - children?: FilterNode[]; -} - -/** - * Sort Node - AST representation of sort order - */ -export interface SortNode { - field: string; - order: 'asc' | 'desc'; -} - -/** - * Query AST - Abstract Syntax Tree for queries - */ -export interface QueryAST { - /** Target object name */ - object?: string; - /** Fields to select */ - fields?: string[]; - /** Filter conditions */ - filters?: FilterNode; - /** Sort order */ - sort?: SortNode[]; - /** Number of records to skip */ - skip?: number; - /** Maximum number of records to return */ - top?: number; - /** Group by fields */ - groupBy?: string[]; - /** Aggregations to perform */ - aggregations?: Array<{ - function: string; - field: string; - alias?: string; - }>; -} - -/** - * Protocol Field Types - * Core field types defined in the ObjectStack specification - */ -export type FieldType = - | 'text' - | 'textarea' - | 'number' - | 'boolean' - | 'date' - | 'datetime' - | 'time' - | 'select' - | 'lookup' - | 'master_detail' - | 'formula' - | 'summary' - | 'autonumber' - | 'url' - | 'email' - | 'phone' - | 'currency' - | 'percent' - | 'markdown' - | 'html' - | 'password' - | 'file' - | 'image'; - -/** - * Select Option - Protocol definition for select field options - */ -export interface SelectOption { - /** The display label for the option */ - label: string; - /** The actual value stored in the database */ - value: string; - /** Optional color for visual representation */ - color?: string; - /** Whether this is the default option */ - default?: boolean; -} - -/** - * Field - Protocol definition for object fields - * - * This is the canonical wire-protocol definition. - * Implementations may extend this with runtime-specific properties. - */ -export interface Field { - /** Field name */ - name: string; - /** Display label */ - label: string; - /** Field type */ - type: string; - /** Description */ - description?: string; - /** Options for select fields */ - options?: SelectOption[]; - /** Whether the field is mandatory */ - required?: boolean; - /** Whether the field allows multiple values */ - multiple?: boolean; - /** Whether the field is unique */ - unique?: boolean; - /** Delete behavior for relationships */ - deleteBehavior?: 'set_null' | 'cascade' | 'restrict'; - /** Whether the field is hidden */ - hidden?: boolean; - /** Whether the field is read-only */ - readonly?: boolean; - /** Whether the field is encrypted */ - encryption?: boolean; - /** Whether to create a database index */ - index?: boolean; - /** Whether this is an external ID field */ - externalId?: boolean; - /** Whether the field is searchable */ - searchable?: boolean; - /** Default value */ - defaultValue?: string | number | boolean | null; - /** Maximum length for strings */ - maxLength?: number; - /** Minimum length for strings */ - minLength?: number; - /** Minimum value for numbers */ - min?: number; - /** Maximum value for numbers */ - max?: number; - /** Decimal precision */ - precision?: number; - /** Decimal scale */ - scale?: number; - /** Formula expression */ - formula?: string; - /** Reference to another object (for lookup/master_detail) */ - reference?: string; - /** Filters for reference field */ - referenceFilters?: FilterCondition; - /** Whether write requires master read permission */ - writeRequiresMasterRead?: boolean; - /** Summary expression */ - expression?: string; - /** Summary operations */ - summaryOperations?: string[]; -} - -/** - * Index Schema - Protocol definition for database indexes - */ -export interface IndexSchema { - /** Index name */ - name?: string; - /** List of fields in the index */ - fields: string[]; - /** Whether the index enforces uniqueness */ - unique?: boolean; -} - -/** - * Service Object - Protocol definition for data objects - * - * This is the canonical wire-protocol definition for objects/entities. - */ -export interface ServiceObject { - /** Object name (unique identifier) */ - name: string; - /** Display label */ - label?: string; - /** Plural label */ - pluralLabel?: string; - /** Description */ - description?: string; - /** Icon identifier */ - icon?: string; - /** Datasource name */ - datasource?: string; - /** Custom table name */ - tableName?: string; - /** Whether this is a system object */ - isSystem?: boolean; - /** Field definitions */ - fields: Record; - /** Index definitions */ - indexes?: Record; - /** Primary display field */ - nameField?: string; - /** Object capabilities */ - enable?: { - trackHistory?: boolean; - searchable?: boolean; - apiEnabled?: boolean; - files?: boolean; - feedEnabled?: boolean; - trash?: boolean; - }; -} - -/** - * Action - Protocol definition for custom actions - */ -export interface Action { - /** Display label */ - label?: string; - /** Description */ - description?: string; - /** Icon name */ - icon?: string; - /** Action type (record or global) */ - type?: 'record' | 'global'; - /** Confirmation message */ - confirm_text?: string; - /** Whether this action is internal only */ - internal?: boolean; -} - -/** - * Application Manifest - */ -export interface App { - /** App name */ - name: string; - /** App version */ - version?: string; - /** App description */ - description?: string; -} - -/** - * ObjectStack Manifest - * Configuration manifest for ObjectStack applications - */ -export interface ObjectStackManifest { - /** Manifest version */ - version: string; - /** Unique identifier for the manifest (optional) */ - id?: string; - /** Application info */ - app?: App; - /** List of objects */ - objects?: ServiceObject[]; -} - -/** - * Driver Interface - * - * Base interface for database drivers - */ -export interface DriverInterface { - /** Driver name */ - name?: string; - /** Driver version */ - version?: string; - /** Driver capabilities */ - supports?: { - transactions?: boolean; - joins?: boolean; - fullTextSearch?: boolean; - jsonFields?: boolean; - arrayFields?: boolean; - queryFilters?: boolean; - queryAggregations?: boolean; - querySorting?: boolean; - queryPagination?: boolean; - queryWindowFunctions?: boolean; - querySubqueries?: boolean; - }; - /** Connect to the database */ - connect?(): Promise; - /** Disconnect from the database */ - disconnect?(): Promise; - /** Find records */ - find?(objectName: string, query: any, options?: any): Promise; - /** Find a single record */ - findOne?(objectName: string, id: string | number, query?: any, options?: any): Promise; - /** Create a record */ - create?(objectName: string, data: any, options?: any): Promise; - /** Update a record */ - update?(objectName: string, id: string | number, data: any, options?: any): Promise; - /** Delete a record */ - delete?(objectName: string, id: string | number, options?: any): Promise; - /** Count records */ - count?(objectName: string, filters: any, options?: any): Promise; - /** Execute a command */ - execute?(command: any, parameters?: any[], options?: any): Promise; - /** Bulk operations */ - bulkCreate?(objectName: string, data: any[], options?: any): Promise; - bulkUpdate?(objectName: string, updates: Array<{id: string | number, data: any}>, options?: any): Promise; - bulkDelete?(objectName: string, ids: Array, options?: any): Promise; - /** Aggregation */ - distinct?(objectName: string, field: string, filters?: any, options?: any): Promise; - aggregate?(objectName: string, aggregations: any[], filters?: any, options?: any): Promise; - /** Transaction support */ - beginTransaction?(): Promise; - commitTransaction?(transaction: any): Promise; - rollbackTransaction?(transaction: any): Promise; - /** Schema initialization */ - init?(objects: any[]): Promise; - /** Schema introspection */ - introspectSchema?(): Promise; - /** Health check */ - checkHealth?(): Promise; -} - -/** - * Driver Options - * - * Configuration options for database drivers - */ -export interface DriverOptions { - /** Connection string or configuration */ - connection?: string | Record; - /** Additional driver-specific options */ - [key: string]: unknown; -} - -/** - * Plugin Definition - * - * Base interface for plugins - */ -export interface PluginDefinition { - /** Plugin name */ - name: string; - /** Plugin version */ - version?: string; - /** Plugin description */ - description?: string; -} - diff --git a/packages/objectstack/spec/tsconfig.json b/packages/objectstack/spec/tsconfig.json deleted file mode 100644 index 5dedf59d..00000000 --- a/packages/objectstack/spec/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../../tsconfig.base.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src", - "declaration": true - }, - "include": ["src/**/*"] -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fac9e02f..7db0d18d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -268,8 +268,8 @@ importers: specifier: workspace:* version: link:../../../packages/foundation/types '@objectstack/spec': - specifier: ^0.2.0 - version: 0.2.0 + specifier: ^0.3.1 + version: 0.3.1 '@types/jest': specifier: ^30.0.0 version: 30.0.0 @@ -325,8 +325,8 @@ importers: specifier: workspace:* version: link:../../foundation/types '@objectstack/spec': - specifier: ^0.2.0 - version: 0.2.0 + specifier: ^0.3.1 + version: 0.3.1 exceljs: specifier: ^4.4.0 version: 4.4.0 @@ -350,8 +350,8 @@ importers: specifier: workspace:* version: link:../../foundation/types '@objectstack/spec': - specifier: ^0.2.0 - version: 0.2.0 + specifier: ^0.3.1 + version: 0.3.1 devDependencies: '@types/jest': specifier: ^29.0.0 @@ -372,8 +372,8 @@ importers: specifier: workspace:* version: link:../../foundation/types '@objectstack/spec': - specifier: ^0.2.0 - version: 0.2.0 + specifier: ^0.3.1 + version: 0.3.1 devDependencies: '@types/jest': specifier: ^29.0.0 @@ -394,8 +394,8 @@ importers: specifier: workspace:* version: link:../../foundation/types '@objectstack/spec': - specifier: ^0.2.0 - version: 0.2.0 + specifier: ^0.3.1 + version: 0.3.1 mingo: specifier: ^7.1.1 version: 7.1.1 @@ -416,8 +416,8 @@ importers: specifier: workspace:* version: link:../../foundation/types '@objectstack/spec': - specifier: ^0.2.0 - version: 0.2.0 + specifier: ^0.3.1 + version: 0.3.1 mongodb: specifier: ^5.9.2 version: 5.9.2 @@ -432,8 +432,8 @@ importers: specifier: workspace:* version: link:../../foundation/types '@objectstack/spec': - specifier: ^0.2.0 - version: 0.2.0 + specifier: ^0.3.1 + version: 0.3.1 redis: specifier: ^4.6.0 version: 4.7.1 @@ -454,8 +454,8 @@ importers: specifier: workspace:* version: link:../../foundation/types '@objectstack/spec': - specifier: ^0.2.0 - version: 0.2.0 + specifier: ^0.3.1 + version: 0.3.1 devDependencies: typescript: specifier: ^5.3.0 @@ -467,8 +467,8 @@ importers: specifier: workspace:* version: link:../../foundation/types '@objectstack/spec': - specifier: ^0.2.0 - version: 0.2.0 + specifier: ^0.3.1 + version: 0.3.1 knex: specifier: ^3.1.0 version: 3.1.0(sqlite3@5.1.7) @@ -486,8 +486,8 @@ importers: specifier: workspace:* version: link:../types '@objectstack/spec': - specifier: workspace:* - version: link:../../objectstack/spec + specifier: ^0.3.1 + version: 0.3.1 js-yaml: specifier: ^4.1.0 version: 4.1.1 @@ -511,8 +511,8 @@ importers: specifier: workspace:* version: link:../types '@objectstack/spec': - specifier: ^0.2.0 - version: 0.2.0 + specifier: ^0.3.1 + version: 0.3.1 fast-glob: specifier: ^3.3.2 version: 3.3.3 @@ -530,16 +530,14 @@ importers: specifier: workspace:* version: link:../../objectstack/runtime '@objectstack/spec': - specifier: workspace:* - version: link:../../objectstack/spec + specifier: ^0.3.1 + version: 0.3.1 ts-json-schema-generator: specifier: ^2.4.0 version: 2.4.0 packages/objectstack/runtime: {} - packages/objectstack/spec: {} - packages/runtime/server: dependencies: '@graphql-tools/schema': @@ -1925,8 +1923,8 @@ packages: engines: {node: '>=10'} deprecated: This functionality has been moved to @npmcli/fs - '@objectstack/spec@0.2.0': - resolution: {integrity: sha512-y4JALcsTgOeEE0xRJ7Co16beQTIO42c6KngFFcy7QQH0BeN4gKgMoqWGkRxPfOKZnnlUzYo/1hSLxmmUtJMisA==} + '@objectstack/spec@0.3.1': + resolution: {integrity: sha512-MK/8x2jpdS6PllxadVALK7cKqa6nfwtjzZ1WRKpZwdbJnAUTKZlt6P3h/LSif8gxq78KiYLdWmHjtjoTXPruJQ==} engines: {node: '>=18.0.0'} '@orama/orama@3.1.18': @@ -9469,7 +9467,7 @@ snapshots: rimraf: 3.0.2 optional: true - '@objectstack/spec@0.2.0': + '@objectstack/spec@0.3.1': dependencies: zod: 3.25.76 diff --git a/tsconfig.json b/tsconfig.json index ef120d47..78862457 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,6 @@ { "files": [], "references": [ - { "path": "./packages/objectstack/spec" }, { "path": "./packages/objectstack/runtime" }, { "path": "./packages/foundation/types" }, { "path": "./packages/foundation/core" },