@antelopejs/interface-database-decorators 0.0.4 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/antelope.test.js +5 -9
- package/dist/antelope.test.js.map +1 -1
- package/dist/common.d.ts +2 -0
- package/dist/common.js +1 -0
- package/dist/common.js.map +1 -1
- package/dist/database.d.ts +10 -2
- package/dist/database.js +22 -11
- package/dist/database.js.map +1 -1
- package/dist/model.d.ts +27 -5
- package/dist/model.js +95 -13
- package/dist/model.js.map +1 -1
- package/dist/table.d.ts +5 -0
- package/dist/table.js +8 -1
- package/dist/table.js.map +1 -1
- package/dist/tests/codec_helpers.d.ts +27 -0
- package/dist/tests/codec_helpers.js +27 -0
- package/dist/tests/codec_helpers.js.map +1 -0
- package/dist/tests/database.test.js +35 -63
- package/dist/tests/database.test.js.map +1 -1
- package/dist/tests/integration.test.js +118 -21
- package/dist/tests/integration.test.js.map +1 -1
- package/dist/tests/model.test.js +154 -12
- package/dist/tests/model.test.js.map +1 -1
- package/dist/tests/table.test.js +38 -0
- package/dist/tests/table.test.js.map +1 -1
- package/package.json +38 -2
package/dist/antelope.test.js
CHANGED
|
@@ -7,18 +7,14 @@ exports.default = (0, config_1.defineConfig)({
|
|
|
7
7
|
name: "interface-database-decorators-test",
|
|
8
8
|
cacheFolder: ".antelope/cache",
|
|
9
9
|
modules: {
|
|
10
|
+
local: {
|
|
11
|
+
source: { type: "local", path: "." },
|
|
12
|
+
},
|
|
10
13
|
mongodb: {
|
|
11
14
|
source: {
|
|
12
15
|
type: "package",
|
|
13
16
|
package: "@antelopejs/mongodb",
|
|
14
|
-
version: "1.
|
|
15
|
-
},
|
|
16
|
-
},
|
|
17
|
-
database_decorators: {
|
|
18
|
-
source: {
|
|
19
|
-
type: "package",
|
|
20
|
-
package: "@antelopejs/database-decorators",
|
|
21
|
-
version: "1.0.0",
|
|
17
|
+
version: "1.2.1",
|
|
22
18
|
},
|
|
23
19
|
},
|
|
24
20
|
api: {
|
|
@@ -39,7 +35,7 @@ exports.default = (0, config_1.defineConfig)({
|
|
|
39
35
|
return {
|
|
40
36
|
modules: {
|
|
41
37
|
mongodb: {
|
|
42
|
-
config: { url: mongod.getUri() },
|
|
38
|
+
config: { url: mongod.getUri(), database: "antelopejs_test" },
|
|
43
39
|
},
|
|
44
40
|
},
|
|
45
41
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"antelope.test.js","sourceRoot":"","sources":["../src/antelope.test.ts"],"names":[],"mappings":";;AAAA,8DAAiE;AACjE,2EAA+D;AAE/D,IAAI,MAAyB,CAAC;AAE9B,kBAAe,IAAA,qBAAY,EAAC;IAC1B,IAAI,EAAE,oCAAoC;IAC1C,WAAW,EAAE,iBAAiB;IAC9B,OAAO,EAAE;QACP,
|
|
1
|
+
{"version":3,"file":"antelope.test.js","sourceRoot":"","sources":["../src/antelope.test.ts"],"names":[],"mappings":";;AAAA,8DAAiE;AACjE,2EAA+D;AAE/D,IAAI,MAAyB,CAAC;AAE9B,kBAAe,IAAA,qBAAY,EAAC;IAC1B,IAAI,EAAE,oCAAoC;IAC1C,WAAW,EAAE,iBAAiB;IAC9B,OAAO,EAAE;QACP,KAAK,EAAE;YACL,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE;SACrC;QACD,OAAO,EAAE;YACP,MAAM,EAAE;gBACN,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,qBAAqB;gBAC9B,OAAO,EAAE,OAAO;aACjB;SACF;QACD,GAAG,EAAE;YACH,MAAM,EAAE;gBACN,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,iBAAiB;gBAC1B,OAAO,EAAE,OAAO;aACjB;YACD,MAAM,EAAE;gBACN,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;aAC/D;SACF;KACF;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,YAAY;QACpB,KAAK,CAAC,KAAK;YACT,MAAM,GAAG,MAAM,8CAAiB,CAAC,MAAM,EAAE,CAAC;YAC1C,OAAO;gBACL,OAAO,EAAE;oBACP,OAAO,EAAE;wBACP,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,iBAAiB,EAAE;qBAC9D;iBACF;aACF,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,OAAO;YACX,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC;KACF;CACF,CAAC,CAAC"}
|
package/dist/common.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { FieldType } from "@antelopejs/interface-database/schema";
|
|
1
2
|
export type Constructible<T = object, A extends unknown[] = unknown[]> = new (...args: A) => T;
|
|
2
3
|
export type DeepPartial<T> = {
|
|
3
4
|
[K in keyof T]?: T[K] extends Array<infer U1> ? Array<DeepPartial<U1>> : T[K] extends ReadonlyArray<infer U2> ? ReadonlyArray<DeepPartial<U2>> : T[K] extends object ? DeepPartial<T[K]> : T[K];
|
|
@@ -15,6 +16,7 @@ export declare class DatumStaticMetadata {
|
|
|
15
16
|
tableName?: string;
|
|
16
17
|
schemaName?: string;
|
|
17
18
|
readonly indexes: Record<string, Array<string>>;
|
|
19
|
+
readonly fields: Record<string, FieldType>;
|
|
18
20
|
primary: string;
|
|
19
21
|
generator?: DatumGenerator;
|
|
20
22
|
addIndex(key: string, group: string): void;
|
package/dist/common.js
CHANGED
package/dist/common.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":";;;AAiDA,kCAsBC;AA3CD;;GAEG;AACH,MAAa,mBAAmB;IACvB,MAAM,CAAC,GAAG,GAAG,MAAM,EAAE,CAAC;IAEtB,SAAS,CAAU;IACnB,UAAU,CAAU;IACX,OAAO,GAAkC,EAAE,CAAC;IAC5C,MAAM,GAA8B,EAAE,CAAC;IAChD,OAAO,GAAW,KAAK,CAAC;IACxB,SAAS,CAAkB;IAElC,QAAQ,CAAC,GAAW,EAAE,KAAa;QACjC,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;;AAfH,kDAgBC;AAED,SAAgB,WAAW,CACzB,MAAe,EACf,aAAuC,EACvC,UAAmB,IAAI;IAEvB,MAAM,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,CAE5D,CAAC;IACd,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,CAAmB,CAAC;IAClE,MAAM,iBAAiB,GACrB,OAAO,IAAI,SAAS;QAClB,CAAC,CAAE,OAAO,CAAC,cAAc,CAAC,aAAa,CAAC,GAAG,EAAE,SAAS,CAEtC;QAChB,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,QAAQ,GAAG,iBAAiB,IAAI,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IAChE,OAAO,CAAC,cAAc,CAAC,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5D,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
package/dist/database.d.ts
CHANGED
|
@@ -1,2 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Registers a schema with the database adapter and runs any fixtures.
|
|
3
|
+
*
|
|
4
|
+
* Reads the table classes registered for `schemaId` via `@RegisterTable`,
|
|
5
|
+
* builds a `SchemaDefinition`, constructs the `Schema` (which the adapter
|
|
6
|
+
* provisions), then inserts fixtures for any table that declares one.
|
|
7
|
+
*
|
|
8
|
+
* @param schemaId Schema id matching the `@RegisterTable(_, schemaId)` calls
|
|
9
|
+
*/
|
|
10
|
+
export declare function RegisterSchema(schemaId: string): Promise<void>;
|
package/dist/database.js
CHANGED
|
@@ -3,19 +3,27 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.RegisterSchema = RegisterSchema;
|
|
7
7
|
const node_assert_1 = __importDefault(require("node:assert"));
|
|
8
8
|
const interface_database_1 = require("@antelopejs/interface-database");
|
|
9
9
|
const common_1 = require("./common");
|
|
10
10
|
const common_2 = require("./modifiers/common");
|
|
11
11
|
const schema_1 = require("./schema");
|
|
12
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Registers a schema with the database adapter and runs any fixtures.
|
|
14
|
+
*
|
|
15
|
+
* Reads the table classes registered for `schemaId` via `@RegisterTable`,
|
|
16
|
+
* builds a `SchemaDefinition`, constructs the `Schema` (which the adapter
|
|
17
|
+
* provisions), then inserts fixtures for any table that declares one.
|
|
18
|
+
*
|
|
19
|
+
* @param schemaId Schema id matching the `@RegisterTable(_, schemaId)` calls
|
|
20
|
+
*/
|
|
21
|
+
async function RegisterSchema(schemaId) {
|
|
13
22
|
const tables = (0, schema_1.getTablesForSchema)(schemaId);
|
|
14
23
|
(0, node_assert_1.default)(tables, `No tables registered for schema '${schemaId}'`);
|
|
15
24
|
const definition = buildSchemaDefinition(tables);
|
|
16
|
-
const schema = new interface_database_1.Schema(schemaId, definition
|
|
17
|
-
await schema
|
|
18
|
-
await insertAllFixtureData(schema, instanceId, tables);
|
|
25
|
+
const schema = new interface_database_1.Schema(schemaId, definition);
|
|
26
|
+
await insertAllFixtureData(schema, tables);
|
|
19
27
|
}
|
|
20
28
|
function buildSchemaDefinition(tables) {
|
|
21
29
|
const definition = {};
|
|
@@ -27,21 +35,24 @@ function buildSchemaDefinition(tables) {
|
|
|
27
35
|
fields: fields.length === 1 && fields[0] === group ? undefined : fields,
|
|
28
36
|
};
|
|
29
37
|
}
|
|
30
|
-
definition[tableName] = {
|
|
38
|
+
definition[tableName] = {
|
|
39
|
+
fields: metadata.fields,
|
|
40
|
+
indexes,
|
|
41
|
+
};
|
|
31
42
|
}
|
|
32
43
|
return definition;
|
|
33
44
|
}
|
|
34
|
-
async function insertAllFixtureData(schema,
|
|
45
|
+
async function insertAllFixtureData(schema, tables) {
|
|
35
46
|
await Promise.all(Object.entries(tables).map(([tableName, tableClass]) => {
|
|
36
47
|
const metadata = (0, common_1.getMetadata)(tableClass, common_1.DatumStaticMetadata);
|
|
37
|
-
return insertFixtureData(schema,
|
|
48
|
+
return insertFixtureData(schema, tableName, tableClass, metadata.generator);
|
|
38
49
|
}));
|
|
39
50
|
}
|
|
40
|
-
async function insertFixtureData(schema,
|
|
51
|
+
async function insertFixtureData(schema, tableName, tableClass, generator) {
|
|
41
52
|
if (!generator) {
|
|
42
53
|
return;
|
|
43
54
|
}
|
|
44
|
-
const count = await schema.instance(
|
|
55
|
+
const count = await schema.instance().table(tableName).count();
|
|
45
56
|
if (count > 0) {
|
|
46
57
|
return;
|
|
47
58
|
}
|
|
@@ -51,7 +62,7 @@ async function insertFixtureData(schema, instanceId, tableName, tableClass, gene
|
|
|
51
62
|
return;
|
|
52
63
|
}
|
|
53
64
|
const payload = rows.length === 1 ? rows[0] : rows;
|
|
54
|
-
await schema.instance(
|
|
65
|
+
await schema.instance().table(tableName).insert(payload);
|
|
55
66
|
}
|
|
56
67
|
function toFixtureRows(fixtureData, tableClass) {
|
|
57
68
|
const entries = fixtureData
|
package/dist/database.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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"}
|
package/dist/model.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type RequestContext } from "@antelopejs/interface-api";
|
|
2
2
|
import { type Class } from "@antelopejs/interface-core/decorators";
|
|
3
3
|
import type * as DatabaseDev from "@antelopejs/interface-database";
|
|
4
|
+
import { type InstanceId } from "@antelopejs/interface-database";
|
|
4
5
|
import { type Constructible, type DeepPartial } from "./common";
|
|
5
6
|
export type DataModel<T = any> = {
|
|
6
7
|
readonly schemaName: string;
|
|
@@ -11,6 +12,19 @@ export type DataModel<T = any> = {
|
|
|
11
12
|
fromDatabase(obj: any): T | undefined;
|
|
12
13
|
fromPlainData(obj: any): T;
|
|
13
14
|
};
|
|
15
|
+
export type FieldError = {
|
|
16
|
+
field: string;
|
|
17
|
+
message: string;
|
|
18
|
+
};
|
|
19
|
+
export type ValidationResult = {
|
|
20
|
+
ok: true;
|
|
21
|
+
} | {
|
|
22
|
+
ok: false;
|
|
23
|
+
errors: FieldError[];
|
|
24
|
+
};
|
|
25
|
+
export type ValidateInputOptions = {
|
|
26
|
+
partial?: boolean;
|
|
27
|
+
};
|
|
14
28
|
/**
|
|
15
29
|
* Utility Class factory to create a basic Data Model with 1 table.
|
|
16
30
|
*
|
|
@@ -52,7 +66,7 @@ export declare function BasicDataModel<T extends object>(dataType: Constructible
|
|
|
52
66
|
* @param options Insert options
|
|
53
67
|
* @returns Insert result
|
|
54
68
|
*/
|
|
55
|
-
insert(obj: DeepPartial<T> | Array<DeepPartial<T
|
|
69
|
+
insert(obj: DeepPartial<T> | Array<DeepPartial<T>>, options?: ValidateOptions): Promise<string[]>;
|
|
56
70
|
/**
|
|
57
71
|
* Updates a single element in the table.
|
|
58
72
|
*
|
|
@@ -61,8 +75,8 @@ export declare function BasicDataModel<T extends object>(dataType: Constructible
|
|
|
61
75
|
* @param options Update options
|
|
62
76
|
* @returns Update result
|
|
63
77
|
*/
|
|
64
|
-
update(id: string, obj: DeepPartial<T
|
|
65
|
-
update(obj: DeepPartial<T
|
|
78
|
+
update(id: string, obj: DeepPartial<T>, options?: ValidateOptions): Promise<number>;
|
|
79
|
+
update(obj: DeepPartial<T>, options?: ValidateOptions): Promise<number>;
|
|
66
80
|
/**
|
|
67
81
|
* Delete an element from the table.
|
|
68
82
|
*
|
|
@@ -93,9 +107,17 @@ export declare function BasicDataModel<T extends object>(dataType: Constructible
|
|
|
93
107
|
* @returns Database-ready data
|
|
94
108
|
*/
|
|
95
109
|
toDatabase(obj: any): Record<string, any>;
|
|
110
|
+
/**
|
|
111
|
+
* Validates a plain object against every io-ts codec attached via `@Field`.
|
|
112
|
+
* Pass `{ partial: true }` to skip fields not present on `obj` (patch semantics).
|
|
113
|
+
*/
|
|
114
|
+
validate(obj: unknown, options?: ValidateInputOptions): ValidationResult;
|
|
115
|
+
};
|
|
116
|
+
export type ValidateOptions = {
|
|
117
|
+
validate?: boolean;
|
|
96
118
|
};
|
|
97
|
-
export declare function GetModel<M extends InstanceType<DataModel>>(cl: DataModel & Class<M>, instanceId?:
|
|
119
|
+
export declare function GetModel<M extends InstanceType<DataModel>>(cl: DataModel & Class<M>, instanceId?: InstanceId): M;
|
|
98
120
|
export declare const Model: (cl: DataModel<any> & Class<{
|
|
99
121
|
readonly database: DatabaseDev.SchemaInstance<any>;
|
|
100
122
|
readonly table: DatabaseDev.Table<any>;
|
|
101
|
-
}>, instanceIdOrCallback?:
|
|
123
|
+
}>, instanceIdOrCallback?: DatabaseDev.InstanceId | ((ctx: RequestContext) => InstanceId | undefined) | undefined) => import("@antelopejs/interface-core/decorators").PropertyDecorator & import("@antelopejs/interface-core/decorators").ParameterDecorator;
|
package/dist/model.js
CHANGED
|
@@ -12,6 +12,16 @@ const decorators_1 = require("@antelopejs/interface-core/decorators");
|
|
|
12
12
|
const interface_database_1 = require("@antelopejs/interface-database");
|
|
13
13
|
const common_1 = require("./common");
|
|
14
14
|
const common_2 = require("./modifiers/common");
|
|
15
|
+
function isCodec(type) {
|
|
16
|
+
return (typeof type === "object" &&
|
|
17
|
+
type !== null &&
|
|
18
|
+
!Array.isArray(type) &&
|
|
19
|
+
typeof type.decode === "function");
|
|
20
|
+
}
|
|
21
|
+
function decodeFieldError(field, result) {
|
|
22
|
+
const message = result.left.map((e) => e.message).find(Boolean) ?? `invalid ${field}`;
|
|
23
|
+
return { field, message };
|
|
24
|
+
}
|
|
15
25
|
/**
|
|
16
26
|
* Utility Class factory to create a basic Data Model with 1 table.
|
|
17
27
|
*
|
|
@@ -56,6 +66,29 @@ function BasicDataModel(dataType, tableName) {
|
|
|
56
66
|
const instance = obj instanceof dataType ? obj : Model.fromPlainData(obj);
|
|
57
67
|
return (0, common_2.toDatabase)(instance);
|
|
58
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Validates a plain object against every io-ts codec attached via `@Field`.
|
|
71
|
+
* Pass `{ partial: true }` to skip fields not present on `obj` (patch semantics).
|
|
72
|
+
*/
|
|
73
|
+
static validate(obj, options) {
|
|
74
|
+
const fields = metadata.fields;
|
|
75
|
+
const errors = [];
|
|
76
|
+
const partial = options?.partial === true;
|
|
77
|
+
const record = typeof obj === "object" && obj !== null
|
|
78
|
+
? obj
|
|
79
|
+
: undefined;
|
|
80
|
+
for (const [field, type] of Object.entries(fields)) {
|
|
81
|
+
if (!isCodec(type))
|
|
82
|
+
continue;
|
|
83
|
+
if (partial && (!record || !(field in record)))
|
|
84
|
+
continue;
|
|
85
|
+
const result = type.decode(record?.[field]);
|
|
86
|
+
if (result._tag === "Left") {
|
|
87
|
+
errors.push(decodeFieldError(field, result));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return errors.length === 0 ? { ok: true } : { ok: false, errors };
|
|
91
|
+
}
|
|
59
92
|
/**
|
|
60
93
|
* AQL Table reference.
|
|
61
94
|
*/
|
|
@@ -100,7 +133,18 @@ function BasicDataModel(dataType, tableName) {
|
|
|
100
133
|
* @param options Insert options
|
|
101
134
|
* @returns Insert result
|
|
102
135
|
*/
|
|
103
|
-
insert(obj) {
|
|
136
|
+
async insert(obj, options) {
|
|
137
|
+
if (options?.validate) {
|
|
138
|
+
const entries = Array.isArray(obj) ? obj : [obj];
|
|
139
|
+
const allErrors = [];
|
|
140
|
+
for (const entry of entries) {
|
|
141
|
+
const result = Model.validate(entry);
|
|
142
|
+
if (!result.ok)
|
|
143
|
+
allErrors.push(...result.errors);
|
|
144
|
+
}
|
|
145
|
+
if (allErrors.length > 0)
|
|
146
|
+
throw makeValidationError(allErrors);
|
|
147
|
+
}
|
|
104
148
|
const converter = (entry) => {
|
|
105
149
|
const instance = Model.fromPlainData(entry);
|
|
106
150
|
(0, common_2.triggerEvent)(instance, "insert");
|
|
@@ -110,15 +154,24 @@ function BasicDataModel(dataType, tableName) {
|
|
|
110
154
|
.insert(Array.isArray(obj) ? obj.map(converter) : converter(obj))
|
|
111
155
|
.run();
|
|
112
156
|
}
|
|
113
|
-
update(
|
|
114
|
-
|
|
115
|
-
|
|
157
|
+
async update(idOrObj, objOrOptions, options) {
|
|
158
|
+
const parsed = parseUpdateArgs(idOrObj, objOrOptions, options);
|
|
159
|
+
if (parsed.options?.validate) {
|
|
160
|
+
const result = Model.validate(parsed.data, { partial: true });
|
|
161
|
+
if (!result.ok)
|
|
162
|
+
throw makeValidationError(result.errors);
|
|
163
|
+
}
|
|
164
|
+
if (parsed.id !== undefined) {
|
|
165
|
+
const instance = Model.fromPlainData(parsed.data);
|
|
116
166
|
(0, common_2.triggerEvent)(instance, "update");
|
|
117
|
-
return this.table
|
|
167
|
+
return this.table
|
|
168
|
+
.get(parsed.id)
|
|
169
|
+
.update(Model.toDatabase(instance))
|
|
170
|
+
.run();
|
|
118
171
|
}
|
|
119
|
-
const instance = Model.fromPlainData(
|
|
172
|
+
const instance = Model.fromPlainData(parsed.data);
|
|
120
173
|
(0, common_2.triggerEvent)(instance, "update");
|
|
121
|
-
const id =
|
|
174
|
+
const id = parsed.data[primaryKey];
|
|
122
175
|
(0, node_assert_1.default)(id !== undefined, "Missing primary key in object update.");
|
|
123
176
|
return this.table.get(id).update(Model.toDatabase(instance)).run();
|
|
124
177
|
}
|
|
@@ -134,18 +187,47 @@ function BasicDataModel(dataType, tableName) {
|
|
|
134
187
|
};
|
|
135
188
|
}
|
|
136
189
|
const modelCache = new Map();
|
|
190
|
+
const UNDEFINED_INSTANCE_KEY = Symbol("undefined-instance");
|
|
191
|
+
function cacheKeyOf(instanceId) {
|
|
192
|
+
if (instanceId === undefined)
|
|
193
|
+
return UNDEFINED_INSTANCE_KEY;
|
|
194
|
+
if (typeof instanceId === "symbol")
|
|
195
|
+
return instanceId;
|
|
196
|
+
return instanceId;
|
|
197
|
+
}
|
|
198
|
+
function makeValidationError(errors) {
|
|
199
|
+
const summary = errors.map((e) => `${e.field} (${e.message})`).join(", ");
|
|
200
|
+
const err = new Error(`validation failed: ${summary}`);
|
|
201
|
+
err.errors = errors;
|
|
202
|
+
return err;
|
|
203
|
+
}
|
|
204
|
+
function parseUpdateArgs(idOrObj, objOrOptions, options) {
|
|
205
|
+
if (typeof idOrObj === "string") {
|
|
206
|
+
return {
|
|
207
|
+
id: idOrObj,
|
|
208
|
+
data: objOrOptions,
|
|
209
|
+
options,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
return {
|
|
213
|
+
data: idOrObj,
|
|
214
|
+
options: objOrOptions,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
137
217
|
function GetModel(cl, instanceId) {
|
|
138
218
|
if (!modelCache.has(cl)) {
|
|
139
|
-
modelCache.set(cl,
|
|
219
|
+
modelCache.set(cl, new Map());
|
|
140
220
|
}
|
|
141
|
-
const cache = modelCache.get(cl)
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
221
|
+
const cache = modelCache.get(cl);
|
|
222
|
+
(0, node_assert_1.default)(cache);
|
|
223
|
+
const key = cacheKeyOf(instanceId);
|
|
224
|
+
const cached = cache.get(key);
|
|
225
|
+
if (cached)
|
|
226
|
+
return cached;
|
|
145
227
|
const schema = interface_database_1.Schema.get(cl.schemaName);
|
|
146
228
|
(0, node_assert_1.default)(schema, `Schema not found for '${cl.schemaName}'`);
|
|
147
229
|
const model = new cl(schema.instance(instanceId));
|
|
148
|
-
cache
|
|
230
|
+
cache.set(key, model);
|
|
149
231
|
return model;
|
|
150
232
|
}
|
|
151
233
|
exports.Model = (0, decorators_1.MakeParameterAndPropertyDecorator)((target, key, index, cl, instanceIdOrCallback) => {
|
package/dist/model.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
|
package/dist/table.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type ClassDecorator } from "@antelopejs/interface-core/decorators";
|
|
2
|
+
import type { FieldType } from "@antelopejs/interface-database/schema";
|
|
2
3
|
import { type Constructible } from "./common";
|
|
3
4
|
import { MixinSymbol, type MixinType } from "./modifiers/common";
|
|
4
5
|
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
|
|
@@ -43,6 +44,10 @@ export declare class Table {
|
|
|
43
44
|
export declare const Index: (options?: {
|
|
44
45
|
group?: string;
|
|
45
46
|
} | undefined) => import("@antelopejs/interface-core/decorators").PropertyDecorator;
|
|
47
|
+
/**
|
|
48
|
+
* Database Table Field type decorator.
|
|
49
|
+
*/
|
|
50
|
+
export declare const Field: (type: FieldType) => import("@antelopejs/interface-core/decorators").PropertyDecorator;
|
|
46
51
|
type AwaitableArray<T> = Promise<T | T[]> | T | T[];
|
|
47
52
|
/**
|
|
48
53
|
* Database Table class decorator to create default data on table creation.
|
package/dist/table.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Fixture = exports.Index = exports.Table = exports.TableRefSymbol = exports.TableMetaSymbol = void 0;
|
|
3
|
+
exports.Fixture = exports.Field = exports.Index = exports.Table = exports.TableRefSymbol = exports.TableMetaSymbol = void 0;
|
|
4
4
|
const decorators_1 = require("@antelopejs/interface-core/decorators");
|
|
5
5
|
const common_1 = require("./common");
|
|
6
6
|
const common_2 = require("./modifiers/common");
|
|
@@ -51,6 +51,13 @@ exports.Index = (0, decorators_1.MakePropertyDecorator)((target, propertyKey, op
|
|
|
51
51
|
const metadata = (0, common_1.getMetadata)(target.constructor, common_1.DatumStaticMetadata);
|
|
52
52
|
metadata.addIndex(propertyKey, options?.group || propertyKey);
|
|
53
53
|
});
|
|
54
|
+
/**
|
|
55
|
+
* Database Table Field type decorator.
|
|
56
|
+
*/
|
|
57
|
+
exports.Field = (0, decorators_1.MakePropertyDecorator)((target, propertyKey, type) => {
|
|
58
|
+
const metadata = (0, common_1.getMetadata)(target.constructor, common_1.DatumStaticMetadata);
|
|
59
|
+
metadata.fields[propertyKey] = type;
|
|
60
|
+
});
|
|
54
61
|
/**
|
|
55
62
|
* Database Table class decorator to create default data on table creation.
|
|
56
63
|
*
|
package/dist/table.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.js","sourceRoot":"","sources":["../src/table.ts"],"names":[],"mappings":";;;AAAA,sEAI+C;
|
|
1
|
+
{"version":3,"file":"table.js","sourceRoot":"","sources":["../src/table.ts"],"names":[],"mappings":";;;AAAA,sEAI+C;AAE/C,qCAAgF;AAChF,+CAAiE;AAQpD,QAAA,eAAe,GAAG,MAAM,EAAE,CAAC;AAC3B,QAAA,cAAc,GAAG,MAAM,EAAE,CAAC;AAgCvC;;GAEG;AACH,MAAa,KAAK;IAGhB;;;;;OAKG;IACI,MAAM,CAAC,IAAI,CAKhB,GAAG,MAAS;QAQZ,4GAA4G;QAC5G,MAAM,CAAC,GAAG,MAAM,eAAgB,SAAS,IAAY;SAAG,CAAC;QACzD,KAAK,MAAM,KAAK,IAAI,MAAM;aACvB,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,IAAI,IAAI,UAAU,EAAE,CAAC;aAC7D,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,oBAAW,CAAC,CAAC;aACpC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;YACvC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC9D,IAAI,GAAG,KAAK,aAAa,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC7C,CAAC,CAAC,SAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;YACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;gBAChE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;oBACpB,CAAC,CAAC,SAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAY,CAAC,CAAC;IAChB,CAAC;CACF;AAzCD,sBAyCC;AAED;;;;;;;GAOG;AACU,QAAA,KAAK,GAAG,IAAA,kCAAqB,EACxC,CAAC,MAAM,EAAE,WAAW,EAAE,OAA4B,EAAE,EAAE;IACpD,MAAM,QAAQ,GAAG,IAAA,oBAAW,EAAC,MAAM,CAAC,WAAW,EAAE,4BAAmB,CAAC,CAAC;IACtE,QAAQ,CAAC,QAAQ,CACP,WAAW,EACnB,OAAO,EAAE,KAAK,IAAY,WAAW,CACtC,CAAC;AACJ,CAAC,CACF,CAAC;AAEF;;GAEG;AACU,QAAA,KAAK,GAAG,IAAA,kCAAqB,EACxC,CAAC,MAAM,EAAE,WAAW,EAAE,IAAe,EAAE,EAAE;IACvC,MAAM,QAAQ,GAAG,IAAA,oBAAW,EAAC,MAAM,CAAC,WAAW,EAAE,4BAAmB,CAAC,CAAC;IACtE,QAAQ,CAAC,MAAM,CAAC,WAAqB,CAAC,GAAG,IAAI,CAAC;AAChD,CAAC,CACF,CAAC;AAGF;;;;GAIG;AACU,QAAA,OAAO,GAEK,IAAA,+BAAkB,EAAC,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;IAChE,MAAM,QAAQ,GAAG,IAAA,oBAAW,EAAC,MAAM,EAAE,4BAAmB,CAAC,CAAC;IAC1D,QAAQ,CAAC,SAAS,GAAG,SAAwD,CAAC;AAChF,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { FieldType } from "@antelopejs/interface-database/schema";
|
|
2
|
+
export type DecodeLeft = {
|
|
3
|
+
_tag: "Left";
|
|
4
|
+
left: Array<{
|
|
5
|
+
value: unknown;
|
|
6
|
+
context: unknown[];
|
|
7
|
+
message?: string;
|
|
8
|
+
}>;
|
|
9
|
+
};
|
|
10
|
+
export type DecodeRight<T> = {
|
|
11
|
+
_tag: "Right";
|
|
12
|
+
right: T;
|
|
13
|
+
};
|
|
14
|
+
export type DecodeResult<T> = DecodeLeft | DecodeRight<T>;
|
|
15
|
+
export type TestCodec<T> = {
|
|
16
|
+
readonly _A: T;
|
|
17
|
+
readonly _O: T;
|
|
18
|
+
readonly _I: unknown;
|
|
19
|
+
readonly name: string;
|
|
20
|
+
is(u: unknown): u is T;
|
|
21
|
+
encode(a: T): unknown;
|
|
22
|
+
decode(u: unknown): DecodeResult<T>;
|
|
23
|
+
};
|
|
24
|
+
export declare function makeCodec<T>(name: string, guard: (u: unknown) => u is T): TestCodec<T>;
|
|
25
|
+
export declare const stringCodec: TestCodec<string>;
|
|
26
|
+
export declare const numberCodec: TestCodec<number>;
|
|
27
|
+
export declare function asFieldType(codec: TestCodec<unknown>): FieldType;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.numberCodec = exports.stringCodec = void 0;
|
|
4
|
+
exports.makeCodec = makeCodec;
|
|
5
|
+
exports.asFieldType = asFieldType;
|
|
6
|
+
function makeCodec(name, guard) {
|
|
7
|
+
return {
|
|
8
|
+
_A: undefined,
|
|
9
|
+
_O: undefined,
|
|
10
|
+
_I: undefined,
|
|
11
|
+
name,
|
|
12
|
+
is: guard,
|
|
13
|
+
encode: (a) => a,
|
|
14
|
+
decode: (u) => guard(u)
|
|
15
|
+
? { _tag: "Right", right: u }
|
|
16
|
+
: {
|
|
17
|
+
_tag: "Left",
|
|
18
|
+
left: [{ value: u, context: [], message: `not ${name}` }],
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
exports.stringCodec = makeCodec("string", (u) => typeof u === "string");
|
|
23
|
+
exports.numberCodec = makeCodec("number", (u) => typeof u === "number");
|
|
24
|
+
function asFieldType(codec) {
|
|
25
|
+
return codec;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=codec_helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec_helpers.js","sourceRoot":"","sources":["../../src/tests/codec_helpers.ts"],"names":[],"mappings":";;;AAmBA,8BAmBC;AAWD,kCAEC;AAhCD,SAAgB,SAAS,CACvB,IAAY,EACZ,KAA6B;IAE7B,OAAO;QACL,EAAE,EAAE,SAAyB;QAC7B,EAAE,EAAE,SAAyB;QAC7B,EAAE,EAAE,SAAoB;QACxB,IAAI;QACJ,EAAE,EAAE,KAAK;QACT,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChB,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CACZ,KAAK,CAAC,CAAC,CAAC;YACN,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE;YAC7B,CAAC,CAAC;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC;aAC1D;KACR,CAAC;AACJ,CAAC;AAEY,QAAA,WAAW,GAAsB,SAAS,CACrD,QAAQ,EACR,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAC1C,CAAC;AACW,QAAA,WAAW,GAAsB,SAAS,CACrD,QAAQ,EACR,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAC1C,CAAC;AAEF,SAAgB,WAAW,CAAC,KAAyB;IACnD,OAAO,KAA6B,CAAC;AACvC,CAAC"}
|