@superfunctions/db 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +341 -0
- package/dist/adapter/capabilities.d.ts +51 -0
- package/dist/adapter/capabilities.d.ts.map +1 -0
- package/dist/adapter/capabilities.js +56 -0
- package/dist/adapter/capabilities.js.map +1 -0
- package/dist/adapter/errors.d.ts +111 -0
- package/dist/adapter/errors.d.ts.map +1 -0
- package/dist/adapter/errors.js +172 -0
- package/dist/adapter/errors.js.map +1 -0
- package/dist/adapter/factory.d.ts +10 -0
- package/dist/adapter/factory.d.ts.map +1 -0
- package/dist/adapter/factory.js +232 -0
- package/dist/adapter/factory.js.map +1 -0
- package/dist/adapter/types.d.ts +255 -0
- package/dist/adapter/types.d.ts.map +1 -0
- package/dist/adapter/types.js +5 -0
- package/dist/adapter/types.js.map +1 -0
- package/dist/adapters/drizzle/index.d.ts +20 -0
- package/dist/adapters/drizzle/index.d.ts.map +1 -0
- package/dist/adapters/drizzle/index.js +346 -0
- package/dist/adapters/drizzle/index.js.map +1 -0
- package/dist/adapters/index.d.ts +12 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +12 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/kysely/index.d.ts +18 -0
- package/dist/adapters/kysely/index.d.ts.map +1 -0
- package/dist/adapters/kysely/index.js +305 -0
- package/dist/adapters/kysely/index.js.map +1 -0
- package/dist/adapters/memory/index.d.ts +17 -0
- package/dist/adapters/memory/index.d.ts.map +1 -0
- package/dist/adapters/memory/index.js +362 -0
- package/dist/adapters/memory/index.js.map +1 -0
- package/dist/adapters/prisma/index.d.ts +16 -0
- package/dist/adapters/prisma/index.d.ts.map +1 -0
- package/dist/adapters/prisma/index.js +247 -0
- package/dist/adapters/prisma/index.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/migrations/runtime-validation.d.ts +7 -0
- package/dist/migrations/runtime-validation.d.ts.map +1 -0
- package/dist/migrations/runtime-validation.js +40 -0
- package/dist/migrations/runtime-validation.js.map +1 -0
- package/dist/migrations/schema-tracker.d.ts +56 -0
- package/dist/migrations/schema-tracker.d.ts.map +1 -0
- package/dist/migrations/schema-tracker.js +121 -0
- package/dist/migrations/schema-tracker.js.map +1 -0
- package/dist/testing/contract-tests.d.ts +64 -0
- package/dist/testing/contract-tests.d.ts.map +1 -0
- package/dist/testing/contract-tests.js +391 -0
- package/dist/testing/contract-tests.js.map +1 -0
- package/dist/testing/index.d.ts +10 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +10 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/mocks.d.ts +92 -0
- package/dist/testing/mocks.d.ts.map +1 -0
- package/dist/testing/mocks.js +197 -0
- package/dist/testing/mocks.js.map +1 -0
- package/dist/utils/namespace.d.ts +49 -0
- package/dist/utils/namespace.d.ts.map +1 -0
- package/dist/utils/namespace.js +85 -0
- package/dist/utils/namespace.js.map +1 -0
- package/package.json +87 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @superfunctions/db - Shared database adapter system
|
|
3
|
+
*/
|
|
4
|
+
export { createAdapterFactory } from './adapter/factory.js';
|
|
5
|
+
export type { Adapter, TransactionAdapter, AdapterFactoryConfig, AdapterFactoryOptions, AdapterContext, HealthStatus, CreateParams, FindOneParams, FindManyParams, UpdateParams, DeleteParams, CreateManyParams, UpdateManyParams, DeleteManyParams, UpsertParams, CountParams, WhereClause, OrderBy, JoinConfig, TableSchema, FieldSchema, IndexSchema, ConstraintSchema, TableSchemaMap, ValidationResult, CreateSchemaParams, SchemaCreation, TransactionIsolation, LibraryOptions, Logger, AdapterImplementation, } from './adapter/types.js';
|
|
6
|
+
export { DEFAULT_CAPABILITIES, mergeCapabilities } from './adapter/capabilities.js';
|
|
7
|
+
export type { AdapterCapabilities } from './adapter/capabilities.js';
|
|
8
|
+
export { AdapterError, AdapterErrorCode, ConnectionError, ConstraintViolationError, NotFoundError, DuplicateKeyError, QueryFailedError, TransactionError, SchemaValidationError, OperationNotSupportedError, } from './adapter/errors.js';
|
|
9
|
+
export type { AdapterErrorOptions } from './adapter/errors.js';
|
|
10
|
+
export { NamespaceManager, createDefaultNamespaceManager, createNamespaceManager, } from './utils/namespace.js';
|
|
11
|
+
export type { NamespaceConfig } from './utils/namespace.js';
|
|
12
|
+
export { SchemaTracker, createSchemaTracker } from './migrations/schema-tracker.js';
|
|
13
|
+
export type { SchemaVersion } from './migrations/schema-tracker.js';
|
|
14
|
+
export { validateRecordAgainstSchema } from './migrations/runtime-validation.js';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAG5D,YAAY,EACV,OAAO,EACP,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,WAAW,EACX,OAAO,EACP,UAAU,EACV,WAAW,EACX,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,MAAM,EACN,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACpF,YAAY,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAGrE,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,wBAAwB,EACxB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG/D,OAAO,EACL,gBAAgB,EAChB,6BAA6B,EAC7B,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5D,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACpF,YAAY,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @superfunctions/db - Shared database adapter system
|
|
3
|
+
*/
|
|
4
|
+
// Core factory
|
|
5
|
+
export { createAdapterFactory } from './adapter/factory.js';
|
|
6
|
+
// Capabilities
|
|
7
|
+
export { DEFAULT_CAPABILITIES, mergeCapabilities } from './adapter/capabilities.js';
|
|
8
|
+
// Errors
|
|
9
|
+
export { AdapterError, AdapterErrorCode, ConnectionError, ConstraintViolationError, NotFoundError, DuplicateKeyError, QueryFailedError, TransactionError, SchemaValidationError, OperationNotSupportedError, } from './adapter/errors.js';
|
|
10
|
+
// Utils
|
|
11
|
+
export { NamespaceManager, createDefaultNamespaceManager, createNamespaceManager, } from './utils/namespace.js';
|
|
12
|
+
// Schema Management
|
|
13
|
+
export { SchemaTracker, createSchemaTracker } from './migrations/schema-tracker.js';
|
|
14
|
+
export { validateRecordAgainstSchema } from './migrations/runtime-validation.js';
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAe;AACf,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAqC5D,eAAe;AACf,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAGpF,SAAS;AACT,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,wBAAwB,EACxB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC;AAG7B,QAAQ;AACR,OAAO,EACL,gBAAgB,EAChB,6BAA6B,EAC7B,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAG9B,oBAAoB;AACpB,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAEpF,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple runtime validation helpers for records against a TableSchema.
|
|
3
|
+
* These are intentionally lightweight and not a replacement for Zod/Valibot.
|
|
4
|
+
*/
|
|
5
|
+
import type { TableSchema, ValidationResult } from '../adapter/types.js';
|
|
6
|
+
export declare function validateRecordAgainstSchema(schema: TableSchema, record: Record<string, unknown>): ValidationResult;
|
|
7
|
+
//# sourceMappingURL=runtime-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-validation.d.ts","sourceRoot":"","sources":["../../src/migrations/runtime-validation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAyBzE,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,gBAAgB,CAQlH"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
function validateField(fieldKey, field, value) {
|
|
2
|
+
if (value == null) {
|
|
3
|
+
if (field.required)
|
|
4
|
+
return `Field ${fieldKey} is required`;
|
|
5
|
+
return null;
|
|
6
|
+
}
|
|
7
|
+
switch (field.type) {
|
|
8
|
+
case 'string':
|
|
9
|
+
return typeof value === 'string' ? null : `Field ${fieldKey} must be a string`;
|
|
10
|
+
case 'number':
|
|
11
|
+
return typeof value === 'number' ? null : `Field ${fieldKey} must be a number`;
|
|
12
|
+
case 'boolean':
|
|
13
|
+
return typeof value === 'boolean' ? null : `Field ${fieldKey} must be a boolean`;
|
|
14
|
+
case 'date':
|
|
15
|
+
return value instanceof Date || typeof value === 'string' ? null : `Field ${fieldKey} must be a date or ISO string`;
|
|
16
|
+
case 'json':
|
|
17
|
+
try {
|
|
18
|
+
JSON.stringify(value);
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return `Field ${fieldKey} must be JSON-serializable`;
|
|
23
|
+
}
|
|
24
|
+
case 'bigint':
|
|
25
|
+
return typeof value === 'bigint' || typeof value === 'number' ? null : `Field ${fieldKey} must be bigint or number`;
|
|
26
|
+
default:
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function validateRecordAgainstSchema(schema, record) {
|
|
31
|
+
const errors = [];
|
|
32
|
+
for (const [key, field] of Object.entries(schema.fields)) {
|
|
33
|
+
const v = record[key];
|
|
34
|
+
const err = validateField(key, field, v);
|
|
35
|
+
if (err)
|
|
36
|
+
errors.push(err);
|
|
37
|
+
}
|
|
38
|
+
return errors.length === 0 ? { valid: true } : { valid: false, errors };
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=runtime-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-validation.js","sourceRoot":"","sources":["../../src/migrations/runtime-validation.ts"],"names":[],"mappings":"AAMA,SAAS,aAAa,CAAC,QAAgB,EAAE,KAAU,EAAE,KAAc;IACjE,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,IAAI,KAAK,CAAC,QAAQ;YAAE,OAAO,SAAS,QAAQ,cAAc,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,QAAQ;YACX,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,QAAQ,mBAAmB,CAAC;QACjF,KAAK,QAAQ;YACX,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,QAAQ,mBAAmB,CAAC;QACjF,KAAK,SAAS;YACZ,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,QAAQ,oBAAoB,CAAC;QACnF,KAAK,MAAM;YACT,OAAO,KAAK,YAAY,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,QAAQ,+BAA+B,CAAC;QACtH,KAAK,MAAM;YACT,IAAI,CAAC;gBAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBAAC,OAAO,IAAI,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,OAAO,SAAS,QAAQ,4BAA4B,CAAC;YAAC,CAAC;QAC7G,KAAK,QAAQ;YACX,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,QAAQ,2BAA2B,CAAC;QACtH;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,MAAmB,EAAE,MAA+B;IAC9F,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACzD,MAAM,CAAC,GAAI,MAAc,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACzC,IAAI,GAAG;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema version tracking for Superfunctions libraries
|
|
3
|
+
*/
|
|
4
|
+
import type { Adapter } from '../adapter/types.js';
|
|
5
|
+
export interface SchemaVersion {
|
|
6
|
+
namespace: string;
|
|
7
|
+
version: number;
|
|
8
|
+
appliedAt: Date;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Schema tracker manages schema versions for libraries
|
|
12
|
+
*/
|
|
13
|
+
export declare class SchemaTracker {
|
|
14
|
+
private adapter;
|
|
15
|
+
private readonly TRACKING_TABLE;
|
|
16
|
+
constructor(adapter: Adapter);
|
|
17
|
+
/**
|
|
18
|
+
* Get current schema version for a library
|
|
19
|
+
*/
|
|
20
|
+
getVersion(namespace: string): Promise<number>;
|
|
21
|
+
/**
|
|
22
|
+
* Set schema version for a library
|
|
23
|
+
*/
|
|
24
|
+
setVersion(namespace: string, version: number): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Get all schema versions
|
|
27
|
+
*/
|
|
28
|
+
getAllVersions(): Promise<SchemaVersion[]>;
|
|
29
|
+
/**
|
|
30
|
+
* Initialize tracking table
|
|
31
|
+
* This should be called once during setup
|
|
32
|
+
*/
|
|
33
|
+
initialize(): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Check if a library's schema is up to date
|
|
36
|
+
*/
|
|
37
|
+
isUpToDate(namespace: string, requiredVersion: number): Promise<boolean>;
|
|
38
|
+
/**
|
|
39
|
+
* Check if a library's schema needs migration
|
|
40
|
+
*/
|
|
41
|
+
needsMigration(namespace: string, requiredVersion: number): Promise<boolean>;
|
|
42
|
+
/**
|
|
43
|
+
* Get version status for a library
|
|
44
|
+
*/
|
|
45
|
+
getVersionStatus(namespace: string, requiredVersion: number): Promise<{
|
|
46
|
+
namespace: string;
|
|
47
|
+
current: number;
|
|
48
|
+
required: number;
|
|
49
|
+
status: 'up-to-date' | 'outdated' | 'not-installed' | 'newer';
|
|
50
|
+
}>;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Create a schema tracker instance
|
|
54
|
+
*/
|
|
55
|
+
export declare function createSchemaTracker(adapter: Adapter): SchemaTracker;
|
|
56
|
+
//# sourceMappingURL=schema-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-tracker.d.ts","sourceRoot":"","sources":["../../src/migrations/schema-tracker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,qBAAa,aAAa;IAGZ,OAAO,CAAC,OAAO;IAF3B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAsC;gBAEjD,OAAO,EAAE,OAAO;IAEpC;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAapD;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBnE;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAYhD;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAKjC;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK9E;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKlF;;OAEG;IACG,gBAAgB,CACpB,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC;QACT,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,YAAY,GAAG,UAAU,GAAG,eAAe,GAAG,OAAO,CAAC;KAC/D,CAAC;CAqBH;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,aAAa,CAEnE"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema version tracking for Superfunctions libraries
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Schema tracker manages schema versions for libraries
|
|
6
|
+
*/
|
|
7
|
+
export class SchemaTracker {
|
|
8
|
+
adapter;
|
|
9
|
+
TRACKING_TABLE = '__superfunctions_schema_versions';
|
|
10
|
+
constructor(adapter) {
|
|
11
|
+
this.adapter = adapter;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Get current schema version for a library
|
|
15
|
+
*/
|
|
16
|
+
async getVersion(namespace) {
|
|
17
|
+
try {
|
|
18
|
+
const result = await this.adapter.findOne({
|
|
19
|
+
model: this.TRACKING_TABLE,
|
|
20
|
+
where: [{ field: 'namespace', operator: 'eq', value: namespace }],
|
|
21
|
+
});
|
|
22
|
+
return result?.version ?? 0;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// Table doesn't exist yet or other error
|
|
26
|
+
return 0;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Set schema version for a library
|
|
31
|
+
*/
|
|
32
|
+
async setVersion(namespace, version) {
|
|
33
|
+
try {
|
|
34
|
+
await this.adapter.upsert({
|
|
35
|
+
model: this.TRACKING_TABLE,
|
|
36
|
+
where: [{ field: 'namespace', operator: 'eq', value: namespace }],
|
|
37
|
+
create: {
|
|
38
|
+
namespace,
|
|
39
|
+
version,
|
|
40
|
+
appliedAt: new Date(),
|
|
41
|
+
},
|
|
42
|
+
update: {
|
|
43
|
+
version,
|
|
44
|
+
appliedAt: new Date(),
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
throw new Error(`Failed to set schema version: ${error}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get all schema versions
|
|
54
|
+
*/
|
|
55
|
+
async getAllVersions() {
|
|
56
|
+
try {
|
|
57
|
+
return await this.adapter.findMany({
|
|
58
|
+
model: this.TRACKING_TABLE,
|
|
59
|
+
where: [],
|
|
60
|
+
orderBy: [{ field: 'namespace', direction: 'asc' }],
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Initialize tracking table
|
|
69
|
+
* This should be called once during setup
|
|
70
|
+
*/
|
|
71
|
+
async initialize() {
|
|
72
|
+
// The tracking table needs to be created manually or via migrations
|
|
73
|
+
// This is a no-op for now, as table creation is ORM-specific
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Check if a library's schema is up to date
|
|
77
|
+
*/
|
|
78
|
+
async isUpToDate(namespace, requiredVersion) {
|
|
79
|
+
const currentVersion = await this.getVersion(namespace);
|
|
80
|
+
return currentVersion >= requiredVersion;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Check if a library's schema needs migration
|
|
84
|
+
*/
|
|
85
|
+
async needsMigration(namespace, requiredVersion) {
|
|
86
|
+
const currentVersion = await this.getVersion(namespace);
|
|
87
|
+
return currentVersion < requiredVersion;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get version status for a library
|
|
91
|
+
*/
|
|
92
|
+
async getVersionStatus(namespace, requiredVersion) {
|
|
93
|
+
const current = await this.getVersion(namespace);
|
|
94
|
+
let status;
|
|
95
|
+
if (current === 0) {
|
|
96
|
+
status = 'not-installed';
|
|
97
|
+
}
|
|
98
|
+
else if (current < requiredVersion) {
|
|
99
|
+
status = 'outdated';
|
|
100
|
+
}
|
|
101
|
+
else if (current > requiredVersion) {
|
|
102
|
+
status = 'newer';
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
status = 'up-to-date';
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
namespace,
|
|
109
|
+
current,
|
|
110
|
+
required: requiredVersion,
|
|
111
|
+
status,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Create a schema tracker instance
|
|
117
|
+
*/
|
|
118
|
+
export function createSchemaTracker(adapter) {
|
|
119
|
+
return new SchemaTracker(adapter);
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=schema-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-tracker.js","sourceRoot":"","sources":["../../src/migrations/schema-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contract tests for adapter compliance
|
|
3
|
+
*/
|
|
4
|
+
import type { Adapter, TableSchemaMap } from '../adapter/types.js';
|
|
5
|
+
export interface AdapterTestConfig {
|
|
6
|
+
adapter: Adapter;
|
|
7
|
+
namespace: string;
|
|
8
|
+
testSchema: TableSchemaMap;
|
|
9
|
+
capabilities?: string[];
|
|
10
|
+
beforeEach?: () => Promise<void>;
|
|
11
|
+
afterEach?: () => Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Test adapter contract compliance
|
|
15
|
+
* Use with your test framework (vitest, jest, etc.)
|
|
16
|
+
*/
|
|
17
|
+
export declare function testAdapterContract(config: AdapterTestConfig): {
|
|
18
|
+
/**
|
|
19
|
+
* Test CRUD operations
|
|
20
|
+
*/
|
|
21
|
+
testCRUD(): Promise<{
|
|
22
|
+
name: string;
|
|
23
|
+
test: () => Promise<void>;
|
|
24
|
+
}[]>;
|
|
25
|
+
/**
|
|
26
|
+
* Test batch operations
|
|
27
|
+
*/
|
|
28
|
+
testBatch(): Promise<{
|
|
29
|
+
name: string;
|
|
30
|
+
test: () => Promise<void>;
|
|
31
|
+
}[]>;
|
|
32
|
+
/**
|
|
33
|
+
* Test advanced operations
|
|
34
|
+
*/
|
|
35
|
+
testAdvanced(): Promise<{
|
|
36
|
+
name: string;
|
|
37
|
+
test: () => Promise<void>;
|
|
38
|
+
}[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Test lifecycle operations
|
|
41
|
+
*/
|
|
42
|
+
testLifecycle(): Promise<{
|
|
43
|
+
name: string;
|
|
44
|
+
test: () => Promise<void>;
|
|
45
|
+
}[]>;
|
|
46
|
+
/**
|
|
47
|
+
* Run all contract tests
|
|
48
|
+
*/
|
|
49
|
+
runAll(): Promise<{
|
|
50
|
+
total: number;
|
|
51
|
+
passed: number;
|
|
52
|
+
failed: number;
|
|
53
|
+
errors: Array<{
|
|
54
|
+
name: string;
|
|
55
|
+
error: Error;
|
|
56
|
+
}>;
|
|
57
|
+
}>;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Helper function to run contract tests with a test framework
|
|
61
|
+
* Pass your test framework's describe, it, beforeEach, afterEach functions
|
|
62
|
+
*/
|
|
63
|
+
export declare function describeAdapterContract(name: string, config: AdapterTestConfig, describe: any, it: any, beforeEach?: any, afterEach?: any): void;
|
|
64
|
+
//# sourceMappingURL=contract-tests.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-tests.d.ts","sourceRoot":"","sources":["../../src/testing/contract-tests.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAEnE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,cAAc,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB;IAIzD;;OAEG;;cAE0B,MAAM;cAAQ,MAAM,OAAO,CAAC,IAAI,CAAC;;IAsI9D;;OAEG;;cAM0B,MAAM;cAAQ,MAAM,OAAO,CAAC,IAAI,CAAC;;IA4B9D;;OAEG;;cAE0B,MAAM;cAAQ,MAAM,OAAO,CAAC,IAAI,CAAC;;IAmE9D;;OAEG;;cAE0B,MAAM;cAAQ,MAAM,OAAO,CAAC,IAAI,CAAC;;IAiC9D;;OAEG;;;;;gBAae,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,KAAK,CAAA;SAAE,CAAC;;EA2B1D;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE,GAAG,EACb,EAAE,EAAE,GAAG,EACP,UAAU,CAAC,EAAE,GAAG,EAChB,SAAS,CAAC,EAAE,GAAG,QAuGhB"}
|