Skip to content

Commit 3e593a7

Browse files
os-zhuangclaude
andauthored
feat(spec)!: remove deprecated DriverInterface alias — use IDataDriver (11.0, #2378) (#2384)
Scope correction: `IDataEngine` is NOT deprecated (live engine-layer contract, `ObjectQL implements IDataEngine`). The actual `@deprecated` alias was `DriverInterface` (= `IDataDriver`) in spec/contracts + core. - spec/contracts/data-engine.ts: drop the `DriverInterface` alias (+ now-unused IDataDriver import) - core: drop the `DriverInterface` re-export (contracts/data-engine.ts + index.ts) - objectql/engine.ts: type drivers as `IDataDriver` (type-identical rename, 11 refs) - driver-memory config / sql-driver comment / data-engine.test.ts: IDataDriver - regen spec api-surface snapshot (only `DriverInterface (type)` removed) Untouched (not deprecated): `IDataEngine`, and the separate zod `DriverInterface`/`DriverInterfaceSchema` in spec/data (runtime driver schema). Verified: spec contracts/data tests (32) + objectql (718) green; 8 build tasks green; api-surface check will pass (snapshot regenerated). Co-authored-by: Jack Zhuang <277994282+os-zhuang@users.noreply.github.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
1 parent fdb41c0 commit 3e593a7

9 files changed

Lines changed: 39 additions & 38 deletions

File tree

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
---
2+
"@objectstack/spec": major
3+
"@objectstack/core": major
4+
"@objectstack/objectql": major
5+
---
6+
7+
Remove the deprecated `DriverInterface` type alias — use `IDataDriver` (11.0).
8+
9+
`DriverInterface` was a `@deprecated` alias of `IDataDriver` (the authoritative
10+
driver contract). It is removed from `@objectstack/spec/contracts` and
11+
`@objectstack/core`; `objectql`'s engine now types drivers as `IDataDriver`
12+
directly (a type-identical change, since the alias *was* `IDataDriver`).
13+
14+
Driver authors: replace `DriverInterface` with `IDataDriver` (same shape).
15+
16+
Note: this is unrelated to the live `IDataEngine` interface (engine-layer
17+
contract, not deprecated) and to the separate zod-derived `DriverInterface` /
18+
`DriverInterfaceSchema` in `@objectstack/spec/data` (the runtime driver schema),
19+
both of which are unchanged.

packages/core/src/contracts/data-engine.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,4 @@ export interface IDataEngine {
4949
execute?(command: any, options?: Record<string, any>): Promise<any>;
5050
}
5151

52-
/**
53-
* @deprecated Use `IDataDriver` from `@objectstack/spec/contracts` instead.
54-
* This type is re-exported from `@objectstack/spec/contracts` for backward compatibility only.
55-
*/
56-
export type { DriverInterface } from '@objectstack/spec/contracts';
5752

packages/core/src/index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,4 @@ export type {
4747
Middleware,
4848
IDataEngine,
4949
IDataDriver,
50-
/** @deprecated Use `IDataDriver` instead */
51-
DriverInterface
5250
} from '@objectstack/spec/contracts';

packages/objectql/src/engine.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
} from '@objectstack/spec/data';
1313
import { parseAutonumberFormat, renderAutonumber, missingFieldValues } from '@objectstack/spec/data';
1414
import { ExecutionContext, ExecutionContextSchema } from '@objectstack/spec/kernel';
15-
import { DriverInterface, IDataEngine, Logger, createLogger } from '@objectstack/core';
15+
import { IDataDriver, IDataEngine, Logger, createLogger } from '@objectstack/core';
1616
import { CoreServiceName, StorageNameMapping } from '@objectstack/spec/system';
1717
import { IRealtimeService, RealtimeEventPayload } from '@objectstack/spec/contracts';
1818
import type { ICryptoProvider, CryptoHandle } from '@objectstack/spec/contracts';
@@ -268,7 +268,7 @@ export class ObjectQL implements IDataEngine {
268268
*/
269269
private readonly txStore = new AsyncLocalStorage<{ transaction: unknown }>();
270270

271-
private drivers = new Map<string, DriverInterface>();
271+
private drivers = new Map<string, IDataDriver>();
272272
private defaultDriver: string | null = null;
273273
private logger: Logger;
274274

@@ -399,7 +399,7 @@ export class ObjectQL implements IDataEngine {
399399
logger: this.logger,
400400
// Expose the driver registry helper explicitly if needed
401401
drivers: {
402-
register: (driver: DriverInterface) => this.registerDriver(driver)
402+
register: (driver: IDataDriver) => this.registerDriver(driver)
403403
},
404404
...this.hostContext
405405
};
@@ -1206,7 +1206,7 @@ export class ObjectQL implements IDataEngine {
12061206
/**
12071207
* Register a new storage driver
12081208
*/
1209-
registerDriver(driver: DriverInterface, isDefault: boolean = false) {
1209+
registerDriver(driver: IDataDriver, isDefault: boolean = false) {
12101210
if (this.drivers.has(driver.name)) {
12111211
this.logger.warn('Driver already registered, skipping', { driverName: driver.name });
12121212
return;
@@ -1465,7 +1465,7 @@ export class ObjectQL implements IDataEngine {
14651465
* 3. Package's `defaultDatasource` from manifest
14661466
* 4. Global default driver
14671467
*/
1468-
private getDriver(objectName: string): DriverInterface {
1468+
private getDriver(objectName: string): IDataDriver {
14691469
const object = this._registry.getObject(objectName);
14701470

14711471
// 1. Object's explicit datasource field (highest priority)
@@ -2632,7 +2632,7 @@ export class ObjectQL implements IDataEngine {
26322632
// This lets system services (e.g. PackageService, AuditService) issue raw
26332633
// SQL against the control-plane / default DB without having to know the
26342634
// object name behind every CREATE TABLE / SELECT statement.
2635-
let driver: DriverInterface | undefined;
2635+
let driver: IDataDriver | undefined;
26362636
if (options?.object) {
26372637
driver = this.getDriver(options.object);
26382638
} else if (options?.datasource && this.drivers.has(options.datasource)) {
@@ -2787,7 +2787,7 @@ export class ObjectQL implements IDataEngine {
27872787
* Unlike the private getDriver() (which resolves by object name),
27882788
* this method directly looks up a driver by its registered name.
27892789
*/
2790-
getDriverByName(name: string): DriverInterface | undefined {
2790+
getDriverByName(name: string): IDataDriver | undefined {
27912791
return this.drivers.get(name);
27922792
}
27932793

@@ -2820,9 +2820,9 @@ export class ObjectQL implements IDataEngine {
28202820
* the internal getDriver() used by CRUD operations.
28212821
*
28222822
* @param objectName - FQN or short name of the registered object.
2823-
* @returns The resolved DriverInterface, or undefined if no driver is available.
2823+
* @returns The resolved IDataDriver, or undefined if no driver is available.
28242824
*/
2825-
getDriverForObject(objectName: string): DriverInterface | undefined {
2825+
getDriverForObject(objectName: string): IDataDriver | undefined {
28262826
try {
28272827
return this.getDriver(objectName);
28282828
} catch {
@@ -2907,7 +2907,7 @@ export class ObjectQL implements IDataEngine {
29072907
*
29082908
* @throws Error if the datasource is not found
29092909
*/
2910-
datasource(name: string): DriverInterface {
2910+
datasource(name: string): IDataDriver {
29112911
const driver = this.drivers.get(name);
29122912
if (!driver) {
29132913
throw new Error(`[ObjectQL] Datasource '${name}' not found`);
@@ -2984,7 +2984,7 @@ export class ObjectQL implements IDataEngine {
29842984
* });
29852985
*/
29862986
static async create(config: {
2987-
datasources?: Record<string, DriverInterface>;
2987+
datasources?: Record<string, IDataDriver>;
29882988
objects?: Record<string, ServiceObject>;
29892989
hooks?: Array<{ event: string; object: string; handler: (ctx: HookContext) => Promise<void> | void }>;
29902990
}): Promise<ObjectQL> {

packages/plugins/driver-memory/objectstack.config.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const MemoryDriverPlugin: ObjectStackManifest = {
1414
version: '1.0.0',
1515
type: 'driver',
1616
scope: 'project',
17-
description: 'A reference specification implementation of the DriverInterface using in-memory arrays. Suitable for testing and development.',
17+
description: 'A reference specification implementation of the IDataDriver interface using in-memory arrays. Suitable for testing and development.',
1818

1919
configuration: {
2020
title: 'Memory Driver Settings',
@@ -88,7 +88,7 @@ const MemoryDriverPlugin: ObjectStackManifest = {
8888
provides: [
8989
{
9090
id: 'com.objectstack.driver.memory.interface.driver',
91-
name: 'DriverInterface',
91+
name: 'IDataDriver',
9292
description: 'Standard ObjectStack driver interface for data operations',
9393
version: { major: 1, minor: 0, patch: 0 },
9494
stability: 'stable',

packages/plugins/driver-sql/src/sql-driver.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -586,7 +586,7 @@ export class SqlDriver implements IDataDriver {
586586
}
587587

588588
// ===================================
589-
// CRUD — DriverInterface core
589+
// CRUD — IDataDriver core
590590
// ===================================
591591

592592
async find(object: string, query: QueryAST, options?: DriverOptions): Promise<any[]> {

packages/spec/api-surface.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3423,7 +3423,6 @@
34233423
"DefineSharingRuleInput (interface)",
34243424
"DeployExecutionResult (interface)",
34253425
"DriverCapabilities (interface)",
3426-
"DriverInterface (type)",
34273426
"EMBEDDER_SERVICE (const)",
34283427
"EmailAddress (type)",
34293428
"EmailAttachment (interface)",

packages/spec/src/contracts/data-engine.test.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { describe, it, expect } from 'vitest';
2-
import type { IDataEngine, DriverInterface } from './data-engine';
2+
import type { IDataEngine } from './data-engine';
33
import type { IDataDriver } from './data-driver';
44

55
/**
@@ -158,7 +158,7 @@ describe('Data Engine Contract', () => {
158158
});
159159
});
160160

161-
describe('DriverInterface (deprecated alias for IDataDriver)', () => {
161+
describe('IDataDriver (driver contract)', () => {
162162
it('should be assignable from IDataDriver (type alias check)', () => {
163163
const driver: IDataDriver = {
164164
name: 'postgres',
@@ -186,8 +186,7 @@ describe('Data Engine Contract', () => {
186186
dropTable: async () => {},
187187
};
188188

189-
// DriverInterface is now a type alias for IDataDriver
190-
const driverAsInterface: DriverInterface = driver;
189+
const driverAsInterface: IDataDriver = driver;
191190

192191
expect(driverAsInterface.name).toBe('postgres');
193192
expect(driverAsInterface.version).toBe('1.0.0');
@@ -200,7 +199,7 @@ describe('Data Engine Contract', () => {
200199
it('should support full IDataDriver lifecycle and CRUD', async () => {
201200
let connected = false;
202201

203-
const driver: DriverInterface = {
202+
const driver: IDataDriver = {
204203
name: 'mongo',
205204
version: '2.0.0',
206205
supports: minimalCapabilities,
@@ -234,7 +233,7 @@ describe('Data Engine Contract', () => {
234233
});
235234

236235
it('should support bulk, transaction, and schema operations', async () => {
237-
const driver: DriverInterface = {
236+
const driver: IDataDriver = {
238237
name: 'postgres',
239238
version: '1.0.0',
240239
supports: { ...minimalCapabilities, transactions: true, bulkCreate: true },
@@ -276,7 +275,7 @@ describe('Data Engine Contract', () => {
276275

277276
it('should support findStream with yielded values', async () => {
278277
const records = [{ id: '1', name: 'Alice' }, { id: '2', name: 'Bob' }];
279-
const driver: DriverInterface = {
278+
const driver: IDataDriver = {
280279
name: 'streamer',
281280
version: '1.0.0',
282281
supports: { ...minimalCapabilities, streaming: true },

packages/spec/src/contracts/data-engine.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import {
1010
DataEngineRequest,
1111
} from '../data/index.js';
1212

13-
import type { IDataDriver } from './data-driver.js';
1413

1514
/**
1615
* IDataEngine - Standard Data Engine Interface
@@ -51,11 +50,3 @@ export interface IDataEngine {
5150
execute?(command: any, options?: Record<string, any>): Promise<any>;
5251
}
5352

54-
/**
55-
* @deprecated Use `IDataDriver` from `@objectstack/spec/contracts` instead.
56-
* `DriverInterface` is now a type alias for `IDataDriver` — the single authoritative
57-
* driver contract. All new driver implementations should use `IDataDriver` directly.
58-
*
59-
* @see IDataDriver in data-driver.ts for the full contract specification.
60-
*/
61-
export type DriverInterface = IDataDriver;

0 commit comments

Comments
 (0)