From 2ac48a98670b2ae68ee91144f2e9e5ad8be46d67 Mon Sep 17 00:00:00 2001 From: Antony Rizzitelli Date: Thu, 26 Feb 2026 15:06:35 +0100 Subject: [PATCH 1/5] fix: test --- package.json | 10 +++- playground/antelope.json | 14 +++-- src/interfaces/data-api/beta/components.ts | 51 ++++++++-------- src/interfaces/data-api/beta/index.ts | 10 ++-- src/interfaces/data-api/beta/metadata.ts | 20 +++---- src/test/antelope.test.js | 4 +- .../beta/components/access_control.test.ts | 17 +++--- .../data-api/beta/components/listable.test.ts | 20 ++++--- .../beta/components/mandatory.test.ts | 20 ++++--- .../beta/components/per_action_access.test.ts | 15 ++--- .../beta/components/validator.test.ts | 15 ++--- .../data-api/beta/index/routes.test.ts | 15 ++--- .../data-api/beta/integration.test.ts | 58 +++++++++++-------- 13 files changed, 147 insertions(+), 122 deletions(-) diff --git a/package.json b/package.json index ddc6096..8727ad9 100644 --- a/package.json +++ b/package.json @@ -40,8 +40,14 @@ "exportsPath": "dist/interfaces", "imports": [ "api@beta", - "database@beta", - "database-decorators@beta", + { + "name": "database@beta", + "git": "git@github.com:AntelopeJS/interfaces-private.git" + }, + { + "name": "database-decorators@beta", + "git": "git@github.com:AntelopeJS/interfaces-private.git" + }, "core@beta", "api-util@beta" ], diff --git a/playground/antelope.json b/playground/antelope.json index 79dd806..3da686b 100644 --- a/playground/antelope.json +++ b/playground/antelope.json @@ -35,9 +35,10 @@ }, "@antelopejs/mongodb": { "source": { - "type": "package", - "package": "@antelopejs/mongodb", - "version": "0.0.1" + "type": "git", + "remote": "https://github.com/AntelopeJS/mongodb.git", + "branch": "feat/aql2", + "installCommand": ["pnpm i", "npx tsc"] }, "config": { "url": "mongodb://localhost:27017" @@ -45,9 +46,10 @@ }, "@antelopejs/database-decorators": { "source": { - "type": "package", - "package": "@antelopejs/database-decorators", - "version": "0.0.1" + "type": "git", + "remote": "https://github.com/AntelopeJS/database-decorators.git", + "branch": "feat/aql2", + "installCommand": ["pnpm i", "npx tsc"] } } }, diff --git a/src/interfaces/data-api/beta/components.ts b/src/interfaces/data-api/beta/components.ts index 35a4e6d..d643b3e 100644 --- a/src/interfaces/data-api/beta/components.ts +++ b/src/interfaces/data-api/beta/components.ts @@ -1,6 +1,6 @@ import { MakeParameterAndPropertyDecorator } from '@ajs/core/beta/decorators'; import { RequestContext, SetParameterProvider } from '@ajs/api/beta'; -import { Database, Datum, Stream, Table, ValueProxy } from '@ajs/database/beta'; +import { Datum, Stream, Table, ValueProxy, ValueProxyOrValue, SchemaInstance } from '@ajs/database/beta'; import { DataModel } from '@ajs/database-decorators/beta/model'; import { assert } from '@ajs/api-util/beta'; import { DataAPIMeta, FilterValue } from './metadata'; @@ -171,25 +171,26 @@ export namespace Query { return obj[meta.modelKey]; } - export function Foreign(db: Database, meta: DataAPIMeta, query: Stream, pluck?: Set): Stream; - export function Foreign(db: Database, meta: DataAPIMeta, query: Datum, pluck?: Set): Datum; - export function Foreign(db: Database, meta: DataAPIMeta, query: Stream | Datum, pluck?: Set): Stream | Datum { + export function Foreign(db: SchemaInstance, meta: DataAPIMeta, query: Stream, pluck?: Set): Stream; + export function Foreign(db: SchemaInstance, meta: DataAPIMeta, query: Datum, pluck?: Set): Datum; + export function Foreign(db: SchemaInstance, meta: DataAPIMeta, query: Stream | Datum, pluck?: Set): Stream | Datum { /**/ - if (query.lookup) { + if (query instanceof Stream) { for (const [name, field] of Object.entries(meta.fields)) { if (!field.foreign || (pluck && !pluck.has(name))) { continue; } const [table, _tableClass, index, _multi, pluckField] = field.foreign; - let other: Stream = db.table(table); + let other = db.table(table); if (pluckField) { - other = other.pluck('_internal', ...pluckField); + query = (query as Stream).lookup(other.pluck('_internal', ...pluckField) as Table, name, index || '_id'); + } else { + query = (query as Stream).lookup(other, name, index || '_id'); } - query = query.lookup(other, name, index || '_id'); } return query; } else { - const oldForeign = (obj: ValueProxy.Proxy>) => { + const oldForeign = (obj: ValueProxy>) => { const changedFields: Record = {}; for (const [name, field] of Object.entries(meta.fields)) { if (!field.foreign || (pluck && !pluck.has(name))) { @@ -197,24 +198,20 @@ export namespace Query { } const [table, _tableClass, index, multi, pluckField] = field.foreign; if (multi) { - changedFields[name] = (obj(name) as ValueProxy.Proxy).default([]).map((val) => { - let foreignObject: Datum = Get(db.table(table), val, index); + changedFields[name] = (obj.key(name) as ValueProxy).default([]).map((val) => { + let foreignObject: Datum = Get(db.table(table), val, index); if (pluckField) { foreignObject = foreignObject.pluck('_internal', ...pluckField); } return foreignObject.default(null); }); } else { - changedFields[name] = Get(db.table(table), obj(name) as ValueProxy.Proxy, index).default(null); + changedFields[name] = Get(db.table(table), obj.key(name) as ValueProxy, index).default(null); } } return obj.merge(changedFields); }; - if ('map' in query) { - return query.map(oldForeign as ValueProxy.Proxy>); - } else { - return query.do(oldForeign as ValueProxy.Proxy>); - } + return (query as Datum).do(oldForeign); } } @@ -274,8 +271,8 @@ export namespace Query { return dbData; } - export function Get(table: Table, id: string | ValueProxy.Proxy, index?: string) { - return index ? table.getAll(index, id).nth(0) : table.get(id); + export function Get(table: Table, id: string | ValueProxy, index?: string) { + return index ? table.getAll(id as string, index).nth(0) : table.get(id as string); } export function List>( @@ -290,11 +287,11 @@ export namespace Query { const indexFilter = filterList.find(([name]) => filters![name][1] === 'eq' && meta.fields[name]?.indexable)?.[0]; const index = indexFilter ? meta.fields[indexFilter].dbName || indexFilter : undefined; - let tmpRequest = index ? request.getAll(index, filters![indexFilter!][0]) : request; + let tmpRequest = index ? request.getAll(filters![indexFilter!][0], index) : request; const shouldSort = sorting && meta.fields[sorting[0]]?.sortable; if (shouldSort && shouldSort.indexed) { - tmpRequest = tmpRequest.orderBy(sorting[0] as keyof T, sorting[1] ?? 'asc', false); + tmpRequest = tmpRequest.orderBy(sorting[0] as string, sorting[1] ?? 'asc'); } if (filterList.length > 0) { // TODO: rework for modifier-affected fields (unlockrequest) @@ -309,20 +306,20 @@ export namespace Query { name, filters![name][0], filters![name][1], - row as ValueProxy.Proxy>, + row as ValueProxy>, ), ), tmpRequest, ); } if (shouldSort && !shouldSort.indexed) { - tmpRequest = tmpRequest.orderBy(sorting[0] as keyof T, sorting[1] ?? 'asc', true); + tmpRequest = tmpRequest.orderBy(sorting[0] as string, sorting[1] ?? 'asc'); } return [tmpRequest, tmpRequest.count()]; } - export function Delete(table: Table, id: string | string[]) { - return Array.isArray(id) ? table.getAll(undefined!, ...id).delete() : table.get(id).delete(); + export function Delete(table: Table, id: string | string[]) { + return Array.isArray(id) ? table.getAll(id).delete() : table.get(id).delete(); } } @@ -373,9 +370,9 @@ export namespace Validation { export function UnlockRequest( obj: any, meta: DataAPIMeta, - row: ValueProxy.Proxy, + row: ValueProxy, field: K, - ): ValueProxy.Proxy { + ): ValueProxy { const modifiers = Array.from(meta.modifierKeys.entries()).map(([modifier, field]) => ({ modifier, args: [obj[field]], diff --git a/src/interfaces/data-api/beta/index.ts b/src/interfaces/data-api/beta/index.ts index 0d5573d..f4a1754 100644 --- a/src/interfaces/data-api/beta/index.ts +++ b/src/interfaces/data-api/beta/index.ts @@ -2,7 +2,7 @@ import { GetMetadata } from '@ajs/core/beta'; import { Class, MakeClassDecorator, ParameterDecorator } from '@ajs/core/beta/decorators'; import { Route, RawBody, RequestContext, Context, ControllerClass, RegisterRoute, ControllerMeta } from '@ajs/api/beta'; import { Datum } from '@ajs/database/beta'; -import { DEFAULT_SCHEMA, GetTablesFromSchema } from '@ajs/database-decorators/beta/schema'; +import { getTablesForSchema } from '@ajs/database-decorators/beta/schema'; import { assert } from '@ajs/api-util/beta'; import { DataAPIMeta } from './metadata'; import { Parameters, Query, Validation } from './components'; @@ -48,9 +48,9 @@ export function DataController< table!: InstanceType; }; const meta = GetMetadata(c, DataAPIMeta); - meta.schemaName = schemaName || String(DEFAULT_SCHEMA); + meta.schemaName = schemaName || 'default'; - const databaseSchema = GetTablesFromSchema(meta.schemaName); + const databaseSchema = getTablesForSchema(meta.schemaName); assert_(databaseSchema, 'Non-existent Database Schema'); const tableName = Object.entries(databaseSchema).find(([, table]) => table === tableClass)?.[0]; @@ -108,7 +108,7 @@ export namespace DefaultRoutes { const meta = GetDataControllerMeta(this); const model = Query.GetModel(this, meta); - let query = Query.Get(model.table, params.id, params.index) as Datum; + let query = Query.Get(model.table, params.id, params.index) as Datum; if (!params.noForeign) { query = Query.Foreign(model.database, meta, query); @@ -185,7 +185,7 @@ export namespace DefaultRoutes { triggerEvent(dbData, 'insert'); const dbResult = await model.table.insert(dbData); - return dbResult.generated_keys; + return dbResult; } async edit(reqCtx: RequestContext, params: Parameters.EditParameters, body: Buffer) { diff --git a/src/interfaces/data-api/beta/metadata.ts b/src/interfaces/data-api/beta/metadata.ts index 94885c7..dfc37d9 100644 --- a/src/interfaces/data-api/beta/metadata.ts +++ b/src/interfaces/data-api/beta/metadata.ts @@ -1,10 +1,10 @@ import { GetMetadata } from '@ajs/core/beta'; import { Class, MakeMethodAndPropertyDecorator, MakePropertyDecorator } from '@ajs/core/beta/decorators'; import { RequestContext } from '@ajs/api/beta'; -import { ValueProxy } from '@ajs/database/beta'; +import { ValueProxy, ValueProxyOrValue } from '@ajs/database/beta'; import { DataControllerCallbackWithOptions } from '.'; import { ContainerModifier } from '@ajs/database-decorators/beta/modifiers/common'; -import { GetTablesFromSchema, Table, DatumStaticMetadata, getMetadata } from '@ajs/database-decorators/beta'; +import { getTablesForSchema, Table, DatumStaticMetadata, getMetadata } from '@ajs/database-decorators/beta'; /** * Field access mode enum. @@ -80,12 +80,12 @@ export type FilterValue = [value: string, mode: Comparison]; */ export type FilterFunction, U extends Record = Record> = ( context: RequestContext & { this: T }, - proxy: ValueProxy.Proxy, + proxy: ValueProxy, key: string, value: FilterValue[0], mode: FilterValue[1], - row: ValueProxy.Proxy, -) => ValueProxy.ProxyOrVal; + row: ValueProxy, +) => ValueProxyOrValue; export interface ReadableAccessFields { getters: [string, FieldData][]; @@ -317,7 +317,7 @@ export class DataAPIMeta { * @param multi Index is a multi index */ public setForeign(name: string, table: string | Class, index?: string, multi?: boolean, pluck?: string[]) { - const databaseSchema = GetTablesFromSchema(this.schemaName); + const databaseSchema = getTablesForSchema(this.schemaName)!; if (typeof table === 'string') { this.field(name).foreign = [table, databaseSchema[table], index, multi || undefined, pluck || undefined]; } else { @@ -499,7 +499,7 @@ export const Validator = MakeMethodAndPropertyDecorator( }, ); -type ProxyFilterOperator = (proxy: ValueProxy.Proxy, value: string) => ValueProxy.ProxyOrVal; +type ProxyFilterOperator = (proxy: ValueProxy, value: string) => ValueProxyOrValue; type DefaultFilterOperators = Record; type DefaultFilterFunction = FilterFunction, Record>; @@ -513,15 +513,15 @@ const DEFAULT_FILTER_OPERATORS: DefaultFilterOperators = { }; function applyDefaultFilterMode( - proxy: ValueProxy.Proxy, + proxy: ValueProxy, value: string, mode: FilterValue[1], -): ValueProxy.ProxyOrVal { +): ValueProxyOrValue { return DEFAULT_FILTER_OPERATORS[mode](proxy, value); } function createDefaultFilter(): DefaultFilterFunction { - return (_context, proxy, _key, value, mode) => applyDefaultFilterMode(proxy as ValueProxy.Proxy, value, mode); + return (_context, proxy, _key, value, mode) => applyDefaultFilterMode(proxy as ValueProxy, value, mode); } const FilterDecoratorFactory = MakePropertyDecorator( diff --git a/src/test/antelope.test.js b/src/test/antelope.test.js index 0a400d6..ae1c7d3 100644 --- a/src/test/antelope.test.js +++ b/src/test/antelope.test.js @@ -18,7 +18,7 @@ module.exports.setup = async function () { source: { type: 'git', remote: 'https://github.com/AntelopeJS/mongodb.git', - branch: 'main', + branch: 'feat/aql2', installCommand: ['pnpm i', 'npx tsc'], }, config: { @@ -29,7 +29,7 @@ module.exports.setup = async function () { source: { type: 'git', remote: 'https://github.com/AntelopeJS/database-decorators.git', - branch: 'main', + branch: 'feat/aql2', installCommand: ['pnpm i', 'npx tsc'], }, }, diff --git a/src/test/interfaces/data-api/beta/components/access_control.test.ts b/src/test/interfaces/data-api/beta/components/access_control.test.ts index 1b0a5e8..8bca308 100644 --- a/src/test/interfaces/data-api/beta/components/access_control.test.ts +++ b/src/test/interfaces/data-api/beta/components/access_control.test.ts @@ -1,10 +1,10 @@ import { expect } from 'chai'; -import { Database, DeleteDatabase } from '@ajs/database/beta'; +import { Schema, SchemaInstance } from '@ajs/database/beta'; import { Table, Index, RegisterTable, - InitializeDatabase, + CreateDatabaseSchemaInstance, BasicDataModel, StaticModel, } from '@ajs/database-decorators/beta'; @@ -17,8 +17,9 @@ import path from 'node:path'; const currentTestName = path.basename(__filename).replace(/\.test\.(ts|js)$/, ''); const userTableName = `users-${currentTestName}`; const database_name = `test-data-api-${currentTestName}`; +const schemaName = 'default'; -@RegisterTable(userTableName) +@RegisterTable(userTableName, schemaName) class User extends Table { @Index({ primary: true }) declare id: string; @@ -31,7 +32,7 @@ class User extends Table { declare age: number; } class UserModel extends BasicDataModel(User, userTableName) {} -let database: Database; +let database: SchemaInstance; const defaultUserDataset: Partial = { name: 'Jean Test', @@ -48,7 +49,7 @@ describe('Field Access Control', () => { it('read in a read only field', async () => await readInReadOnlyField()); it('write in a write only field', async () => await writeInWriteOnlyField()); - after(async () => await DeleteDatabase(database_name)); + after(async () => {}); }); async function _createDataController(testName: string, user: Partial) { @@ -74,11 +75,11 @@ async function _createDataController(testName: string, user: Partial) { @Access(AccessMode.ReadWrite) declare email: string; } - database = Database(database_name); + await CreateDatabaseSchemaInstance(schemaName, database_name); + database = Schema.get(schemaName)!.instance(database_name); const userModel = new UserModel(database); - await InitializeDatabase(database_name, { [userTableName]: UserModel }); const insertResult = await userModel.insert(user); - return { id: insertResult.generated_keys![0], userModel }; + return { id: insertResult[0], userModel }; } async function readInReadWriteField() { diff --git a/src/test/interfaces/data-api/beta/components/listable.test.ts b/src/test/interfaces/data-api/beta/components/listable.test.ts index 28e9046..c0816f7 100644 --- a/src/test/interfaces/data-api/beta/components/listable.test.ts +++ b/src/test/interfaces/data-api/beta/components/listable.test.ts @@ -1,10 +1,10 @@ import { expect } from 'chai'; -import { Database, DeleteDatabase } from '@ajs/database/beta'; +import { Schema } from '@ajs/database/beta'; import { Table, Index, RegisterTable, - InitializeDatabase, + CreateDatabaseSchemaInstance, BasicDataModel, StaticModel, } from '@ajs/database-decorators/beta'; @@ -17,8 +17,9 @@ import path from 'node:path'; const currentTestName = path.basename(__filename).replace(/\.test\.(ts|js)$/, ''); const productTableName = `products-${currentTestName}`; const database_name = `test-data-api-${currentTestName}`; +const schemaName = 'default'; -@RegisterTable(productTableName) +@RegisterTable(productTableName, schemaName) class Product extends Table { @Index({ primary: true }) declare _id: string; @@ -80,7 +81,7 @@ describe('Field Listable', () => { it('sorting by date (addedAt), ascending', async () => await sortByAddedAtAscending()); it('sorting by date (addedAt), descending', async () => await sortByAddedAtDescending()); - after(async () => await DeleteDatabase(database_name)); + after(async () => {}); }); async function _createDataController(testName: string, route: any, product: Partial[]) { @@ -127,14 +128,17 @@ async function _createDataController(testName: string, route: any, product: Part @Access(AccessMode.ReadOnly) declare description: string; } - const productModel = new ProductModel(Database(database_name)); - await InitializeDatabase(database_name, { [productTableName]: ProductModel }); + await CreateDatabaseSchemaInstance(schemaName, database_name); + const productModel = new ProductModel(Schema.get(schemaName)!.instance(database_name)); const insertResults = await productModel.insert(product); - return { ids: insertResults.generated_keys!, productModel }; + return { ids: insertResults, productModel }; } async function _dropProductTable() { - await Database(database_name).table(productTableName).delete(); + const schema = Schema.get(schemaName); + if (schema) { + await schema.instance(database_name).table(productTableName).delete(); + } } async function _getDatabaseProducts(ids: string[], productModel: ProductModel) { diff --git a/src/test/interfaces/data-api/beta/components/mandatory.test.ts b/src/test/interfaces/data-api/beta/components/mandatory.test.ts index 36c2f00..34f966f 100644 --- a/src/test/interfaces/data-api/beta/components/mandatory.test.ts +++ b/src/test/interfaces/data-api/beta/components/mandatory.test.ts @@ -1,10 +1,10 @@ import { expect } from 'chai'; -import { Database, DeleteDatabase } from '@ajs/database/beta'; +import { Schema } from '@ajs/database/beta'; import { Table, Index, RegisterTable, - InitializeDatabase, + CreateDatabaseSchemaInstance, BasicDataModel, StaticModel, } from '@ajs/database-decorators/beta'; @@ -17,8 +17,9 @@ import path from 'node:path'; const currentTestName = path.basename(__filename).replace(/\.test\.(ts|js)$/, ''); const orderTableName = `orders-${currentTestName}`; const database_name = `test-data-api-${currentTestName}`; +const schemaName = 'default'; -@RegisterTable(orderTableName) +@RegisterTable(orderTableName, schemaName) class Order extends Table { @Index({ primary: true }) declare _id: string; @@ -60,11 +61,14 @@ describe('Field Mandatory', () => { it('edit row with missing mandatory fields', async () => await editWithMissingMandatoryFields()); it('skip mandatory validation when noMandatory is true', async () => await skipMandatoryValidationWhenNoMandatory()); - after(async () => await DeleteDatabase(database_name)); + after(async () => {}); }); async function _dropOrderTable() { - await Database(database_name).table(orderTableName).delete(); + const schema = Schema.get(schemaName); + if (schema) { + await schema.instance(database_name).table(orderTableName).delete(); + } } async function _createDataController(testName: string, route: any, order?: Partial) { @@ -99,12 +103,12 @@ async function _createDataController(testName: string, route: any, order?: Parti @Access(AccessMode.ReadWrite) declare internalReference: string; } - const orderModel = new OrderModel(Database(database_name)); - await InitializeDatabase(database_name, { [orderTableName]: OrderModel }); + await CreateDatabaseSchemaInstance(schemaName, database_name); + const orderModel = new OrderModel(Schema.get(schemaName)!.instance(database_name)); if (order) { const insertResult = await orderModel.insert(order); - return { id: insertResult.generated_keys![0], orderModel }; + return { id: insertResult[0], orderModel }; } return { orderModel }; } diff --git a/src/test/interfaces/data-api/beta/components/per_action_access.test.ts b/src/test/interfaces/data-api/beta/components/per_action_access.test.ts index fb1da42..1770a51 100644 --- a/src/test/interfaces/data-api/beta/components/per_action_access.test.ts +++ b/src/test/interfaces/data-api/beta/components/per_action_access.test.ts @@ -1,10 +1,10 @@ import { expect } from 'chai'; -import { Database, DeleteDatabase } from '@ajs/database/beta'; +import { Schema } from '@ajs/database/beta'; import { Table, Index, RegisterTable, - InitializeDatabase, + CreateDatabaseSchemaInstance, BasicDataModel, StaticModel, } from '@ajs/database-decorators/beta'; @@ -17,8 +17,9 @@ import path from 'node:path'; const currentTestName = path.basename(__filename).replace(/\.test\.(ts|js)$/, ''); const userTableName = `users-${currentTestName}`; const database_name = `test-data-api-${currentTestName}`; +const schemaName = 'default'; -@RegisterTable(userTableName) +@RegisterTable(userTableName, schemaName) class User extends Table { @Index({ primary: true }) declare id: string; @@ -43,7 +44,7 @@ describe('Per-Action Access Control', () => { it('writable in new but read-only in edit', async () => await writableInNewReadOnlyInEdit()); it('read-only globally but read-write in new', async () => await readOnlyGloballyReadWriteInNew()); - after(async () => await DeleteDatabase(database_name)); + after(async () => {}); }); async function _createDataController(testName: string, user: Partial) { @@ -73,11 +74,11 @@ async function _createDataController(testName: string, user: Partial) { @Access(AccessMode.ReadOnly, { new: AccessMode.ReadWrite }) declare age: number; } - const database = Database(database_name); + await CreateDatabaseSchemaInstance(schemaName, database_name); + const database = Schema.get(schemaName)!.instance(database_name); const userModel = new UserModel(database); - await InitializeDatabase(database_name, { [userTableName]: UserModel }); const insertResult = await userModel.insert(user); - return { id: insertResult.generated_keys![0], userModel }; + return { id: insertResult[0], userModel }; } async function writableInNewReadOnlyInEdit() { diff --git a/src/test/interfaces/data-api/beta/components/validator.test.ts b/src/test/interfaces/data-api/beta/components/validator.test.ts index a93bb79..8d6c9ce 100644 --- a/src/test/interfaces/data-api/beta/components/validator.test.ts +++ b/src/test/interfaces/data-api/beta/components/validator.test.ts @@ -1,10 +1,10 @@ import { expect } from 'chai'; -import { Database, DeleteDatabase } from '@ajs/database/beta'; +import { Schema } from '@ajs/database/beta'; import { Table, Index, RegisterTable, - InitializeDatabase, + CreateDatabaseSchemaInstance, BasicDataModel, StaticModel, } from '@ajs/database-decorators/beta'; @@ -17,8 +17,9 @@ import path from 'node:path'; const currentTestName = path.basename(__filename).replace(/\.test\.(ts|js)$/, ''); const productTableName = `products-${currentTestName}`; const database_name = `test-data-api-${currentTestName}`; +const schemaName = 'default'; -@RegisterTable(productTableName) +@RegisterTable(productTableName, schemaName) class Product extends Table { @Index({ primary: true }) declare _id: string; @@ -66,7 +67,7 @@ describe('Field Validator', () => { it('validate incorrect string parameter on edit', async () => await validateIncorrectStringParameterOnEdit()); it('validate incorrect number parameter on edit', async () => await validateIncorrectNumberParameterOnEdit()); - after(async () => await DeleteDatabase(database_name)); + after(async () => {}); }); async function _createDataController(testName: string, route: any, product?: Partial) { @@ -106,12 +107,12 @@ async function _createDataController(testName: string, route: any, product?: Par @Validator((value) => Array.isArray(value) && value.every((tag) => typeof tag === 'string' && tag.length > 0)) declare tags: string[]; } - const productModel = new ProductModel(Database(database_name)); - await InitializeDatabase(database_name, { [productTableName]: ProductModel }); + await CreateDatabaseSchemaInstance(schemaName, database_name); + const productModel = new ProductModel(Schema.get(schemaName)!.instance(database_name)); if (product) { const insertResult = await productModel.insert(product); - return { id: insertResult.generated_keys![0], productModel }; + return { id: insertResult[0], productModel }; } return { productModel }; } diff --git a/src/test/interfaces/data-api/beta/index/routes.test.ts b/src/test/interfaces/data-api/beta/index/routes.test.ts index a59f4d8..0c7f6fa 100644 --- a/src/test/interfaces/data-api/beta/index/routes.test.ts +++ b/src/test/interfaces/data-api/beta/index/routes.test.ts @@ -1,10 +1,10 @@ import { expect } from 'chai'; -import { Database, DeleteDatabase } from '@ajs/database/beta'; +import { Schema } from '@ajs/database/beta'; import { Table, Index, RegisterTable, - InitializeDatabase, + CreateDatabaseSchemaInstance, BasicDataModel, StaticModel, } from '@ajs/database-decorators/beta'; @@ -17,8 +17,9 @@ import path from 'node:path'; const currentTestName = path.basename(__filename).replace(/\.test\.(ts|js)$/, ''); const userTableName = `users-${currentTestName}`; const database_name = `test-data-api-${currentTestName}`; +const schemaName = 'default'; -@RegisterTable(userTableName) +@RegisterTable(userTableName, schemaName) class User extends Table { @Index({ primary: true }) declare _id: string; @@ -56,7 +57,7 @@ describe('Routes', () => { it('using route edit', async () => await usingRouteEdit()); it('using route delete', async () => await usingRouteDelete()); - after(async () => await DeleteDatabase(database_name)); + after(async () => {}); }); async function _createDataController(testName: string, user: Partial, routes?: any) { @@ -87,10 +88,10 @@ async function _createDataController(testName: string, user: Partial, rout @Access(AccessMode.ReadWrite) declare email: string; } - const userModel = new UserModel(Database(database_name)); - await InitializeDatabase(database_name, { [userTableName]: UserModel }); + await CreateDatabaseSchemaInstance(schemaName, database_name); + const userModel = new UserModel(Schema.get(schemaName)!.instance(database_name)); const insertResult = await userModel.insert(user); - return { id: insertResult.generated_keys![0], userModel }; + return { id: insertResult[0], userModel }; } async function requestingDefaultRoutes() { diff --git a/src/test/interfaces/data-api/beta/integration.test.ts b/src/test/interfaces/data-api/beta/integration.test.ts index b1482c8..63c1d0a 100644 --- a/src/test/interfaces/data-api/beta/integration.test.ts +++ b/src/test/interfaces/data-api/beta/integration.test.ts @@ -1,10 +1,10 @@ import { expect } from 'chai'; -import { Database, DeleteDatabase } from '@ajs/database/beta'; +import { Schema } from '@ajs/database/beta'; import { Table, Index, RegisterTable, - InitializeDatabase, + CreateDatabaseSchemaInstance, BasicDataModel, StaticModel, } from '@ajs/database-decorators/beta'; @@ -28,8 +28,9 @@ const productTableName = `products-${currentTestName}`; const orderTableName = `orders-${currentTestName}`; const orderItemTableName = `order_items-${currentTestName}`; const database_name = `test-data-api-${currentTestName}`; +const schemaName = 'default'; -@RegisterTable(customerTableName) +@RegisterTable(customerTableName, schemaName) class Customer extends Table { @Index({ primary: true }) declare _id: string; @@ -50,7 +51,7 @@ class Customer extends Table { declare preferences: string[]; } -@RegisterTable(productTableName) +@RegisterTable(productTableName, schemaName) class Product extends Table { @Index({ primary: true }) declare _id: string; @@ -72,7 +73,7 @@ class Product extends Table { declare updatedAt: Date; } -@RegisterTable(orderTableName) +@RegisterTable(orderTableName, schemaName) class Order extends Table { @Index({ primary: true }) declare _id: string; @@ -97,7 +98,7 @@ class Order extends Table { declare updatedAt: Date; } -@RegisterTable(orderItemTableName) +@RegisterTable(orderItemTableName, schemaName) class OrderItem extends Table { @Index({ primary: true }) declare _id: string; @@ -229,6 +230,14 @@ const testProducts: Partial[] = [ ]; describe('Integration tests', () => { + before(async () => { + await initializeDatabase(); + }); + + beforeEach(async () => { + await cleanTables(); + }); + it('workflow complete of customer management', async () => await workflowCustomerManagement()); it('workflow complete of product management', async () => await workflowProductManagement()); it('workflow complete of order management', async () => await workflowOrderManagement()); @@ -237,7 +246,7 @@ describe('Integration tests', () => { it('client preferences management and recommendations', async () => await clientPreferencesManagement()); it('error management and complex validation', async () => await errorManagementAndComplexValidation()); - after(async () => await DeleteDatabase(database_name)); + after(async () => {}); }); @RegisterDataController() @@ -496,24 +505,30 @@ class _OrderItemAPI extends DataController(OrderItem, DefaultRoutes.All, Control } async function initializeDatabase() { - await InitializeDatabase(database_name, { - [customerTableName]: CustomerModel, - [productTableName]: ProductModel, - [orderTableName]: OrderModel, - [orderItemTableName]: OrderItemModel, - }); + await CreateDatabaseSchemaInstance(schemaName, database_name); +} + +async function cleanTables() { + const db = Schema.get(schemaName)!.instance(database_name); + await Promise.all([ + db.table(customerTableName).delete(), + db.table(productTableName).delete(), + db.table(orderTableName).delete(), + db.table(orderItemTableName).delete(), + ]); } async function createTestData() { - const customerModel = new CustomerModel(Database(database_name)); - const productModel = new ProductModel(Database(database_name)); - const orderModel = new OrderModel(Database(database_name)); + const db = Schema.get(schemaName)!.instance(database_name); + const customerModel = new CustomerModel(db); + const productModel = new ProductModel(db); + const orderModel = new OrderModel(db); const customerResults = await customerModel.insert(testCustomers); const productResults = await productModel.insert(testProducts); return { - customerIds: customerResults.generated_keys!, - productIds: productResults.generated_keys!, + customerIds: customerResults, + productIds: productResults, customerModel, productModel, orderModel, @@ -521,7 +536,6 @@ async function createTestData() { } async function workflowCustomerManagement() { - await initializeDatabase(); const { customerModel } = await createTestData(); const newCustomer = { @@ -572,7 +586,6 @@ async function workflowCustomerManagement() { } async function workflowProductManagement() { - await initializeDatabase(); const { productModel } = await createTestData(); const newProduct = { @@ -617,7 +630,6 @@ async function workflowProductManagement() { } async function workflowOrderManagement() { - await initializeDatabase(); const { customerIds, productIds, orderModel } = await createTestData(); const orderData = { @@ -690,7 +702,6 @@ async function workflowOrderManagement() { } async function stockManagementAndAutomaticUpdate() { - await initializeDatabase(); const { productIds, productModel } = await createTestData(); const initialProduct = await productModel.get(productIds[0]); @@ -716,7 +727,6 @@ async function stockManagementAndAutomaticUpdate() { } async function advancedSearchAndFiltering() { - await initializeDatabase(); await createTestData(); const categoryResponse = await listRequest('products', { @@ -755,7 +765,6 @@ async function advancedSearchAndFiltering() { } async function clientPreferencesManagement() { - await initializeDatabase(); const { customerIds, customerModel } = await createTestData(); const customer = await customerModel.get(customerIds[0]); @@ -785,7 +794,6 @@ async function clientPreferencesManagement() { } async function errorManagementAndComplexValidation() { - await initializeDatabase(); const invalidCustomer = { firstName: 'Test', From 91b273f0039d00cfdd33525cb5b56a2114cf829a Mon Sep 17 00:00:00 2001 From: Antony Rizzitelli Date: Thu, 26 Feb 2026 16:00:22 +0100 Subject: [PATCH 2/5] fix: test --- src/test/interfaces/data-api/beta/index/routes.test.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/test/interfaces/data-api/beta/index/routes.test.ts b/src/test/interfaces/data-api/beta/index/routes.test.ts index 0c7f6fa..22add03 100644 --- a/src/test/interfaces/data-api/beta/index/routes.test.ts +++ b/src/test/interfaces/data-api/beta/index/routes.test.ts @@ -49,6 +49,11 @@ const validUserDataset: Record> = { }; describe('Routes', () => { + beforeEach(async () => { + const db = Schema.get(schemaName)!.instance(database_name); + await db.table(userTableName).delete(); + }); + it('accessing default routes', async () => requestingDefaultRoutes()); it('accessing undefined route', async () => await requestingUndefinedRoute()); it('using route get', async () => await usingRouteGet()); From 9bd7f5dbb144698bcc86038a9c91d0cb07737f9f Mon Sep 17 00:00:00 2001 From: Antony Rizzitelli Date: Thu, 26 Feb 2026 16:53:04 +0100 Subject: [PATCH 3/5] chore: exports generate --- output/data-api/beta/components.d.ts | 12 ++++++------ output/data-api/beta/index.d.ts | 8 ++++---- output/data-api/beta/metadata.d.ts | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/output/data-api/beta/components.d.ts b/output/data-api/beta/components.d.ts index fe22ba5..ee801ac 100644 --- a/output/data-api/beta/components.d.ts +++ b/output/data-api/beta/components.d.ts @@ -1,5 +1,5 @@ import { RequestContext } from '@ajs/api/beta'; -import { Database, Datum, Stream, Table, ValueProxy } from '@ajs/database/beta'; +import { Datum, Stream, Table, ValueProxy, SchemaInstance } from '@ajs/database/beta'; import { DataModel } from '@ajs/database-decorators/beta/model'; import { DataAPIMeta, FilterValue } from './metadata'; export declare namespace Parameters { @@ -54,19 +54,19 @@ export declare namespace Query { function GetModel(obj: any, meta: DataAPIMeta): InstanceType & { constructor: DataModel; }; - function Foreign(db: Database, meta: DataAPIMeta, query: Stream, pluck?: Set): Stream; - function Foreign(db: Database, meta: DataAPIMeta, query: Datum, pluck?: Set): Datum; + function Foreign(db: SchemaInstance, meta: DataAPIMeta, query: Stream, pluck?: Set): Stream; + function Foreign(db: SchemaInstance, meta: DataAPIMeta, query: Datum, pluck?: Set): Datum; function ReadProperties(obj: any, meta: DataAPIMeta, dbData: any, action?: string, onlyList?: boolean): Promise>; function WriteProperties(obj: any, meta: DataAPIMeta, bodyData: Record, action?: string, existingDBData?: Record): Promise>; - function Get(table: Table, id: string | ValueProxy.Proxy, index?: string): import("@ajs/database/beta").SingleSelection; + function Get(table: Table, id: string | ValueProxy, index?: string): Datum; function List>(obj: any, meta: DataAPIMeta, request: Table, reqCtx: RequestContext, sorting?: [string, 'asc' | 'desc' | undefined], filters?: Record): [sorted: Stream, total: Datum]; - function Delete(table: Table, id: string | string[]): import("@ajs/database/beta").Query>; + function Delete(table: Table, id: string | string[]): import("@ajs/database/beta").Query; } export declare namespace Validation { function MandatoryFields(meta: DataAPIMeta, obj: any, type: string): void; function ValidateTypes(meta: DataAPIMeta, obj: Record): Promise; function Lock(obj: any, meta: DataAPIMeta, data: any): void; function Unlock(obj: any, meta: DataAPIMeta, dbData: any): void; - function UnlockRequest(obj: any, meta: DataAPIMeta, row: ValueProxy.Proxy, field: K): ValueProxy.Proxy; + function UnlockRequest(obj: any, meta: DataAPIMeta, row: ValueProxy, field: K): ValueProxy; function ClearInternal(meta: DataAPIMeta, obj: Record | Array>): void; } diff --git a/output/data-api/beta/index.d.ts b/output/data-api/beta/index.d.ts index 78ae405..e457b75 100644 --- a/output/data-api/beta/index.d.ts +++ b/output/data-api/beta/index.d.ts @@ -42,7 +42,7 @@ export declare namespace DefaultRoutes { method: string; }; const New: { - func: (reqCtx: RequestContext, params: Parameters.NewParameters, body: Buffer) => Promise; + func: (reqCtx: RequestContext, params: Parameters.NewParameters, body: Buffer) => Promise; args: (import("@ajs/core/beta/decorators").PropertyDecorator & ParameterDecorator)[]; method: string; }; @@ -52,7 +52,7 @@ export declare namespace DefaultRoutes { method: string; }; const Delete: { - func: (reqCtx: RequestContext, params: Parameters.DeleteParameters) => Promise>; + func: (reqCtx: RequestContext, params: Parameters.DeleteParameters) => Promise; args: (import("@ajs/core/beta/decorators").PropertyDecorator & ParameterDecorator)[]; method: string; }; @@ -73,7 +73,7 @@ export declare namespace DefaultRoutes { method: string; }; readonly new: { - func: (reqCtx: RequestContext, params: Parameters.NewParameters, body: Buffer) => Promise; + func: (reqCtx: RequestContext, params: Parameters.NewParameters, body: Buffer) => Promise; args: (import("@ajs/core/beta/decorators").PropertyDecorator & ParameterDecorator)[]; method: string; }; @@ -83,7 +83,7 @@ export declare namespace DefaultRoutes { method: string; }; readonly delete: { - func: (reqCtx: RequestContext, params: Parameters.DeleteParameters) => Promise>; + func: (reqCtx: RequestContext, params: Parameters.DeleteParameters) => Promise; args: (import("@ajs/core/beta/decorators").PropertyDecorator & ParameterDecorator)[]; method: string; }; diff --git a/output/data-api/beta/metadata.d.ts b/output/data-api/beta/metadata.d.ts index eaf43b9..df861e1 100644 --- a/output/data-api/beta/metadata.d.ts +++ b/output/data-api/beta/metadata.d.ts @@ -1,6 +1,6 @@ import { Class } from '@ajs/core/beta/decorators'; import { RequestContext } from '@ajs/api/beta'; -import { ValueProxy } from '@ajs/database/beta'; +import { ValueProxy, ValueProxyOrValue } from '@ajs/database/beta'; import { DataControllerCallbackWithOptions } from '.'; import { ContainerModifier } from '@ajs/database-decorators/beta/modifiers/common'; import { Table } from '@ajs/database-decorators/beta'; @@ -68,7 +68,7 @@ export type FilterValue = [value: string, mode: Comparison]; */ export type FilterFunction, U extends Record = Record> = (context: RequestContext & { this: T; -}, proxy: ValueProxy.Proxy, key: string, value: FilterValue[0], mode: FilterValue[1], row: ValueProxy.Proxy) => ValueProxy.ProxyOrVal; +}, proxy: ValueProxy, key: string, value: FilterValue[0], mode: FilterValue[1], row: ValueProxy) => ValueProxyOrValue; export interface ReadableAccessFields { getters: [string, FieldData][]; props: [string, FieldData][]; From f714144076a44d1e932ded9e8845964ccfe97212 Mon Sep 17 00:00:00 2001 From: Antony Rizzitelli Date: Thu, 26 Feb 2026 20:11:07 +0100 Subject: [PATCH 4/5] fix: simplify schema name --- AGENTS.md | 2 +- README.md | 7 ++-- output/data-api/beta/index.d.ts | 2 +- playground/antelope.json | 7 ++-- playground/src/data-api/user.ts | 6 ++-- playground/src/db/user.ts | 5 +-- playground/src/index.ts | 16 ++++----- playground/src/utils.ts | 2 +- src/interfaces/data-api/beta/components.ts | 33 ++++++++++++++----- src/interfaces/data-api/beta/index.ts | 6 ++-- .../data-api/beta/integration.test.ts | 1 - 11 files changed, 49 insertions(+), 38 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 7d6ce44..62b3707 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -8,7 +8,7 @@ | --------------------- | --------------------------------------------------------------------------------------- | | English only | All code must be in English: variable names, function names, comments | | PNPM only | Always use pnpm, never npm or yarn | -| NO COMMENTS | Code must be self-documenting through clear naming. TSDoc is allowed for public APIs | +| NO COMMENTS | Code must be self-documenting through clear naming. TSDoc is allowed for public APIs | | NO switch/case | Use objects, maps, or arrays instead | | NO inline types | Define proper interfaces/types, never use anonymous types like `{a: string, b: number}` | | Functions ≤ 40 lines | Split into subfunctions if longer | diff --git a/README.md b/README.md index 404594d..046e170 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,6 @@ A module that provides data-api interfaces only, without implementation code. - ## Installation ```bash @@ -22,9 +21,9 @@ ajs project modules add @antelopejs/data-api This module implements the Data API interface it provides a standardized way to interact with data sources in your application. The interface is installed separately to maintain modularity and minimize dependencies. -| Name | Install command | | -| ------------- | --------------------------------------- | ----------------------------------------------------------------- | -| Data API | `ajs module imports add data-api` | [Documentation](https://github.com/AntelopeJS/interface-data-api) | +| Name | Install command | | +| -------- | --------------------------------- | ----------------------------------------------------------------- | +| Data API | `ajs module imports add data-api` | [Documentation](https://github.com/AntelopeJS/interface-data-api) | ## License diff --git a/output/data-api/beta/index.d.ts b/output/data-api/beta/index.d.ts index e457b75..9b68f88 100644 --- a/output/data-api/beta/index.d.ts +++ b/output/data-api/beta/index.d.ts @@ -22,7 +22,7 @@ export type ExtractDefCallbacks = { declare abstract class TableHolder { table: InstanceType; } -export declare function DataController(tableClass: C, def: P, base: Base, schemaName?: string): Class & TableHolder> & Base; +export declare function DataController(tableClass: C, def: P, base: Base): Class & TableHolder> & Base; export declare const RegisterDataController: () => import("@ajs/core/beta/decorators").ClassDecorator>; export declare function GetDataControllerMeta(thisObj: any): DataAPIMeta; export declare namespace DefaultRoutes { diff --git a/playground/antelope.json b/playground/antelope.json index 3da686b..5a60918 100644 --- a/playground/antelope.json +++ b/playground/antelope.json @@ -20,9 +20,10 @@ }, "@antelopejs/api": { "source": { - "type": "package", - "package": "@antelopejs/api", - "version": "0.0.1" + "type": "git", + "remote": "https://github.com/AntelopeJS/api.git", + "branch": "main", + "installCommand": ["pnpm i", "npx tsc"] }, "config": { "servers": [ diff --git a/playground/src/data-api/user.ts b/playground/src/data-api/user.ts index 96429cd..5af695f 100644 --- a/playground/src/data-api/user.ts +++ b/playground/src/data-api/user.ts @@ -3,8 +3,6 @@ import { User, UserModel } from '../db/user'; import { Controller } from '@ajs/api/beta'; import { StaticModel } from '@ajs/database-decorators/beta'; import { Access, AccessMode, Listable, Mandatory, ModelReference, Sortable } from '@ajs/data-api/beta/metadata'; -import { databaseName } from '../utils'; - const routes = { get: DefaultRoutes.Get, list: DefaultRoutes.List, @@ -14,9 +12,9 @@ const routes = { }; @RegisterDataController() -export class UserDataAPI extends DataController(User, routes, Controller('/users'), 'default') { +export class UserDataAPI extends DataController(User, routes, Controller('/users')) { @ModelReference() - @StaticModel(UserModel, databaseName) + @StaticModel(UserModel, 'default') declare userModel: UserModel; @Listable() diff --git a/playground/src/db/user.ts b/playground/src/db/user.ts index b423c4f..4933b0a 100644 --- a/playground/src/db/user.ts +++ b/playground/src/db/user.ts @@ -1,4 +1,5 @@ import { BasicDataModel, Index, Table, RegisterTable, Fixture } from '@ajs/database-decorators/beta'; +import { schemaName } from '../utils'; const tableName = 'users'; @@ -27,7 +28,7 @@ const tableName = 'users'; { _id: 'user19', email: 'user19@example.com', firstName: 'Andrew', lastName: 'Harris' }, { _id: 'user20', email: 'user20@example.com', firstName: 'Stephanie', lastName: 'Clark' }, ]) -@RegisterTable(tableName, 'default') +@RegisterTable(tableName, schemaName) export class User extends Table { @Index({ primary: true }) declare _id: string; @@ -39,4 +40,4 @@ export class User extends Table { declare lastName: string; } -export class UserModel extends BasicDataModel(User, tableName) {} +export class UserModel extends BasicDataModel(User, tableName) { } diff --git a/playground/src/index.ts b/playground/src/index.ts index ab20658..161f1c0 100644 --- a/playground/src/index.ts +++ b/playground/src/index.ts @@ -1,18 +1,14 @@ -import { Logging } from '@ajs/logging/beta'; -import { InitializeDatabaseFromSchema } from '@ajs/database-decorators/beta'; -import { databaseName } from './utils'; +import { CreateDatabaseSchemaInstance } from '@ajs/database-decorators/beta'; +import { schemaName } from './utils'; import './db/user'; import './data-api/user'; -export function construct(config: unknown): void { - // Set things up when module is loaded - Logging.Debug('DATA-API module playground initialized with config:' + JSON.stringify(config)); -} +export function construct(): void { } export async function start(): Promise { - await InitializeDatabaseFromSchema(databaseName, 'default'); + await CreateDatabaseSchemaInstance(schemaName, 'default'); } -export function destroy(): void {} +export function destroy(): void { } -export function stop(): void {} +export function stop(): void { } diff --git a/playground/src/utils.ts b/playground/src/utils.ts index 885b06b..02b5015 100644 --- a/playground/src/utils.ts +++ b/playground/src/utils.ts @@ -1 +1 @@ -export const databaseName = 'data-api-playground'; +export const schemaName = 'data-api-playground'; diff --git a/src/interfaces/data-api/beta/components.ts b/src/interfaces/data-api/beta/components.ts index d643b3e..e1f4806 100644 --- a/src/interfaces/data-api/beta/components.ts +++ b/src/interfaces/data-api/beta/components.ts @@ -1,6 +1,6 @@ import { MakeParameterAndPropertyDecorator } from '@ajs/core/beta/decorators'; import { RequestContext, SetParameterProvider } from '@ajs/api/beta'; -import { Datum, Stream, Table, ValueProxy, ValueProxyOrValue, SchemaInstance } from '@ajs/database/beta'; +import { Datum, Stream, Table, ValueProxy, SchemaInstance } from '@ajs/database/beta'; import { DataModel } from '@ajs/database-decorators/beta/model'; import { assert } from '@ajs/api-util/beta'; import { DataAPIMeta, FilterValue } from './metadata'; @@ -171,9 +171,24 @@ export namespace Query { return obj[meta.modelKey]; } - export function Foreign(db: SchemaInstance, meta: DataAPIMeta, query: Stream, pluck?: Set): Stream; - export function Foreign(db: SchemaInstance, meta: DataAPIMeta, query: Datum, pluck?: Set): Datum; - export function Foreign(db: SchemaInstance, meta: DataAPIMeta, query: Stream | Datum, pluck?: Set): Stream | Datum { + export function Foreign( + db: SchemaInstance, + meta: DataAPIMeta, + query: Stream, + pluck?: Set, + ): Stream; + export function Foreign( + db: SchemaInstance, + meta: DataAPIMeta, + query: Datum, + pluck?: Set, + ): Datum; + export function Foreign( + db: SchemaInstance, + meta: DataAPIMeta, + query: Stream | Datum, + pluck?: Set, + ): Stream | Datum { /**/ if (query instanceof Stream) { for (const [name, field] of Object.entries(meta.fields)) { @@ -183,9 +198,9 @@ export namespace Query { const [table, _tableClass, index, _multi, pluckField] = field.foreign; let other = db.table(table); if (pluckField) { - query = (query as Stream).lookup(other.pluck('_internal', ...pluckField) as Table, name, index || '_id'); + query = query.lookup(other.pluck('_internal', ...pluckField) as Table, name, index || '_id'); } else { - query = (query as Stream).lookup(other, name, index || '_id'); + query = query.lookup(other, name, index || '_id'); } } return query; @@ -211,7 +226,7 @@ export namespace Query { } return obj.merge(changedFields); }; - return (query as Datum).do(oldForeign); + return query.do(oldForeign); } } @@ -291,7 +306,7 @@ export namespace Query { const shouldSort = sorting && meta.fields[sorting[0]]?.sortable; if (shouldSort && shouldSort.indexed) { - tmpRequest = tmpRequest.orderBy(sorting[0] as string, sorting[1] ?? 'asc'); + tmpRequest = tmpRequest.orderBy(sorting[0], sorting[1] ?? 'asc'); } if (filterList.length > 0) { // TODO: rework for modifier-affected fields (unlockrequest) @@ -313,7 +328,7 @@ export namespace Query { ); } if (shouldSort && !shouldSort.indexed) { - tmpRequest = tmpRequest.orderBy(sorting[0] as string, sorting[1] ?? 'asc'); + tmpRequest = tmpRequest.orderBy(sorting[0], sorting[1] ?? 'asc'); } return [tmpRequest, tmpRequest.count()]; } diff --git a/src/interfaces/data-api/beta/index.ts b/src/interfaces/data-api/beta/index.ts index f4a1754..c7a8049 100644 --- a/src/interfaces/data-api/beta/index.ts +++ b/src/interfaces/data-api/beta/index.ts @@ -3,6 +3,7 @@ import { Class, MakeClassDecorator, ParameterDecorator } from '@ajs/core/beta/de import { Route, RawBody, RequestContext, Context, ControllerClass, RegisterRoute, ControllerMeta } from '@ajs/api/beta'; import { Datum } from '@ajs/database/beta'; import { getTablesForSchema } from '@ajs/database-decorators/beta/schema'; +import { getMetadata, DatumStaticMetadata } from '@ajs/database-decorators/beta'; import { assert } from '@ajs/api-util/beta'; import { DataAPIMeta } from './metadata'; import { Parameters, Query, Validation } from './components'; @@ -43,12 +44,13 @@ export function DataController< C extends Class, P extends DataControllerDef = DataControllerDef, Base extends ControllerClass = ControllerClass, ->(tableClass: C, def: P, base: Base, schemaName?: string): Class & TableHolder> & Base { +>(tableClass: C, def: P, base: Base): Class & TableHolder> & Base { const c = class extends base { table!: InstanceType; }; const meta = GetMetadata(c, DataAPIMeta); - meta.schemaName = schemaName || 'default'; + const tableMetadata = getMetadata(tableClass, DatumStaticMetadata); + meta.schemaName = tableMetadata.schemaName || 'default'; const databaseSchema = getTablesForSchema(meta.schemaName); assert_(databaseSchema, 'Non-existent Database Schema'); diff --git a/src/test/interfaces/data-api/beta/integration.test.ts b/src/test/interfaces/data-api/beta/integration.test.ts index 63c1d0a..55e83e0 100644 --- a/src/test/interfaces/data-api/beta/integration.test.ts +++ b/src/test/interfaces/data-api/beta/integration.test.ts @@ -794,7 +794,6 @@ async function clientPreferencesManagement() { } async function errorManagementAndComplexValidation() { - const invalidCustomer = { firstName: 'Test', lastName: 'User', From 12ab3b2a79dc67144920b0458ad2e5bc872e58b6 Mon Sep 17 00:00:00 2001 From: Antony Rizzitelli Date: Sun, 1 Mar 2026 00:39:01 +0100 Subject: [PATCH 5/5] chore: cleanup and lint --- package.json | 10 ++-------- playground/antelope.json | 4 ++-- playground/src/db/user.ts | 2 +- playground/src/index.ts | 6 +++--- src/test/antelope.test.js | 4 ++-- 5 files changed, 10 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index 8727ad9..ddc6096 100644 --- a/package.json +++ b/package.json @@ -40,14 +40,8 @@ "exportsPath": "dist/interfaces", "imports": [ "api@beta", - { - "name": "database@beta", - "git": "git@github.com:AntelopeJS/interfaces-private.git" - }, - { - "name": "database-decorators@beta", - "git": "git@github.com:AntelopeJS/interfaces-private.git" - }, + "database@beta", + "database-decorators@beta", "core@beta", "api-util@beta" ], diff --git a/playground/antelope.json b/playground/antelope.json index 5a60918..fcadd73 100644 --- a/playground/antelope.json +++ b/playground/antelope.json @@ -38,7 +38,7 @@ "source": { "type": "git", "remote": "https://github.com/AntelopeJS/mongodb.git", - "branch": "feat/aql2", + "branch": "main", "installCommand": ["pnpm i", "npx tsc"] }, "config": { @@ -49,7 +49,7 @@ "source": { "type": "git", "remote": "https://github.com/AntelopeJS/database-decorators.git", - "branch": "feat/aql2", + "branch": "main", "installCommand": ["pnpm i", "npx tsc"] } } diff --git a/playground/src/db/user.ts b/playground/src/db/user.ts index 4933b0a..0ade2fc 100644 --- a/playground/src/db/user.ts +++ b/playground/src/db/user.ts @@ -40,4 +40,4 @@ export class User extends Table { declare lastName: string; } -export class UserModel extends BasicDataModel(User, tableName) { } +export class UserModel extends BasicDataModel(User, tableName) {} diff --git a/playground/src/index.ts b/playground/src/index.ts index 161f1c0..8ecc0f4 100644 --- a/playground/src/index.ts +++ b/playground/src/index.ts @@ -3,12 +3,12 @@ import { schemaName } from './utils'; import './db/user'; import './data-api/user'; -export function construct(): void { } +export function construct(): void {} export async function start(): Promise { await CreateDatabaseSchemaInstance(schemaName, 'default'); } -export function destroy(): void { } +export function destroy(): void {} -export function stop(): void { } +export function stop(): void {} diff --git a/src/test/antelope.test.js b/src/test/antelope.test.js index ae1c7d3..0a400d6 100644 --- a/src/test/antelope.test.js +++ b/src/test/antelope.test.js @@ -18,7 +18,7 @@ module.exports.setup = async function () { source: { type: 'git', remote: 'https://github.com/AntelopeJS/mongodb.git', - branch: 'feat/aql2', + branch: 'main', installCommand: ['pnpm i', 'npx tsc'], }, config: { @@ -29,7 +29,7 @@ module.exports.setup = async function () { source: { type: 'git', remote: 'https://github.com/AntelopeJS/database-decorators.git', - branch: 'feat/aql2', + branch: 'main', installCommand: ['pnpm i', 'npx tsc'], }, },