@antelopejs/interface-database-decorators 0.1.12 → 0.2.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/README.md +11 -9
- package/dist/antelope.test.js +1 -1
- package/dist/common.d.ts +48 -2
- package/dist/common.js +51 -5
- package/dist/common.js.map +1 -1
- package/dist/database.js +1 -2
- package/dist/database.js.map +1 -1
- package/dist/internal/bound-schema.d.ts +8 -0
- package/dist/internal/bound-schema.js +14 -0
- package/dist/internal/bound-schema.js.map +1 -0
- package/dist/model.d.ts +21 -8
- package/dist/model.js +10 -7
- package/dist/model.js.map +1 -1
- package/dist/modifiers/autodate.d.ts +2 -2
- package/dist/modifiers/autodate.js.map +1 -1
- package/dist/modifiers/common.d.ts +37 -20
- package/dist/modifiers/common.js +77 -60
- package/dist/modifiers/common.js.map +1 -1
- package/dist/modifiers/encryption.js +26 -14
- package/dist/modifiers/encryption.js.map +1 -1
- package/dist/modifiers/hash.js +4 -1
- package/dist/modifiers/hash.js.map +1 -1
- package/dist/modifiers/internal/kinds.d.ts +14 -1
- package/dist/modifiers/internal/kinds.js +31 -0
- package/dist/modifiers/internal/kinds.js.map +1 -1
- package/dist/modifiers/internal/records.d.ts +40 -7
- package/dist/modifiers/internal/records.js +69 -14
- package/dist/modifiers/internal/records.js.map +1 -1
- package/dist/modifiers/localization.js +9 -2
- package/dist/modifiers/localization.js.map +1 -1
- package/dist/relation.d.ts +5 -0
- package/dist/relation.js +11 -0
- package/dist/relation.js.map +1 -1
- package/dist/schema.js +5 -6
- package/dist/schema.js.map +1 -1
- package/dist/table.d.ts +3 -2
- package/dist/table.js +27 -12
- package/dist/table.js.map +1 -1
- package/dist/tests/cross_instance.test.js +5 -2
- package/dist/tests/cross_instance.test.js.map +1 -1
- package/dist/tests/database.test.js +42 -34
- package/dist/tests/database.test.js.map +1 -1
- package/dist/tests/helpers/other-instance.js.map +1 -1
- package/dist/tests/integration.test.js +15 -4
- package/dist/tests/integration.test.js.map +1 -1
- package/dist/tests/metadata_inheritance.test.d.ts +1 -0
- package/dist/tests/metadata_inheritance.test.js +212 -0
- package/dist/tests/metadata_inheritance.test.js.map +1 -0
- package/dist/tests/modifiers/encryption_date_marker.test.d.ts +1 -0
- package/dist/tests/modifiers/encryption_date_marker.test.js +78 -0
- package/dist/tests/modifiers/encryption_date_marker.test.js.map +1 -0
- package/dist/tests/modifiers/inherited_names.test.d.ts +1 -0
- package/dist/tests/modifiers/inherited_names.test.js +96 -0
- package/dist/tests/modifiers/inherited_names.test.js.map +1 -0
- package/dist/tests/own_key_lookups.test.d.ts +1 -0
- package/dist/tests/own_key_lookups.test.js +49 -0
- package/dist/tests/own_key_lookups.test.js.map +1 -0
- package/dist/tests/row_forms.test.d.ts +1 -0
- package/dist/tests/row_forms.test.js +59 -0
- package/dist/tests/row_forms.test.js.map +1 -0
- package/dist/tests/stored_metadata.test.d.ts +1 -0
- package/dist/tests/stored_metadata.test.js +91 -0
- package/dist/tests/stored_metadata.test.js.map +1 -0
- package/dist/tests/subclass_schema_binding.test.d.ts +1 -0
- package/dist/tests/subclass_schema_binding.test.js +115 -0
- package/dist/tests/subclass_schema_binding.test.js.map +1 -0
- package/dist/tests/table.test.js +16 -0
- package/dist/tests/table.test.js.map +1 -1
- package/docs/1.introduction.md +24 -20
- package/docs/2.table-definitions.md +63 -41
- package/docs/3.table-modifiers.md +113 -104
- package/docs/4.data-models.md +63 -52
- package/docs/5.parameter-decoration.md +28 -24
- package/docs/tsconfig.json +3 -0
- package/package.json +10 -9
- package/skills/database-decorators-interface/SKILL.md +3 -2
package/README.md
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
#
|
|
1
|
+
# `@antelopejs/interface-database-decorators`
|
|
2
2
|
|
|
3
3
|
<div align="center">
|
|
4
|
-
<a href="https://www.npmjs.com/package/@antelopejs/interface-database-decorators"><img alt="npm" src="https://img.shields.io/npm/v/@antelopejs/interface-database-decorators?style=for-the-badge&labelColor=000000&color=000000"></a>
|
|
5
|
-
<a href="./LICENSE"><img alt="License" src="https://img.shields.io/npm/l/@antelopejs/interface-database-decorators?style=for-the-badge&labelColor=000000&color=000000"></a>
|
|
6
|
-
<a href="https://discord.gg/g4pFt6eXqu"><img alt="Discord" src="https://img.shields.io/badge/Discord-18181B?logo=discord&style=for-the-badge&color=000000"></a>
|
|
7
|
-
<a href="https://interfaces.antelopejs.com/docs/database-decorators"><img alt="Docs" src="https://img.shields.io/badge/Docs-18181B?style=for-the-badge&color=000000"></a>
|
|
4
|
+
<a href="https://www.npmjs.com/package/@antelopejs/interface-database-decorators"><img data-illustration alt="npm" src="https://img.shields.io/npm/v/@antelopejs/interface-database-decorators?style=for-the-badge&labelColor=000000&color=000000"></a>
|
|
5
|
+
<a href="./LICENSE"><img data-illustration alt="License" src="https://img.shields.io/npm/l/@antelopejs/interface-database-decorators?style=for-the-badge&labelColor=000000&color=000000"></a>
|
|
6
|
+
<a href="https://discord.gg/g4pFt6eXqu"><img data-illustration alt="Discord" src="https://img.shields.io/badge/Discord-18181B?logo=discord&style=for-the-badge&color=000000"></a>
|
|
7
|
+
<a href="https://interfaces.antelopejs.com/docs/database-decorators"><img data-illustration alt="Docs" src="https://img.shields.io/badge/Docs-18181B?style=for-the-badge&color=000000"></a>
|
|
8
8
|
</div>
|
|
9
9
|
|
|
10
|
-
Database tables and data models as TypeScript classes, on top of [`@antelopejs/interface-database`](https://github.com/AntelopeJS/interface-database)
|
|
10
|
+
Database tables and data models as TypeScript classes, on top of [`@antelopejs/interface-database`](https://github.com/AntelopeJS/interface-database). Declare fields and indexes with decorators, then read and write rows through a typed model.
|
|
11
|
+
|
|
12
|
+
Part of [AntelopeJS](https://github.com/AntelopeJS/antelopejs). Used by [AntelopeJS DMS](https://github.com/AntelopeJS/dms), the open-source back office for your PostgreSQL, MongoDB or RethinkDB database.
|
|
11
13
|
|
|
12
14
|
## What it offers
|
|
13
15
|
|
|
@@ -88,15 +90,15 @@ export async function start() {
|
|
|
88
90
|
|
|
89
91
|
## Compatibility
|
|
90
92
|
|
|
91
|
-
|
|
93
|
+
The package declares these `@antelopejs/*` peer dependencies:
|
|
92
94
|
|
|
93
95
|
<!-- antelopejs-docs-compat:start -->
|
|
94
96
|
|
|
95
97
|
| Package | Supported | Tested with |
|
|
96
98
|
| -------------------------------- | ----------------- | ----------- |
|
|
97
99
|
| `@antelopejs/interface-api` | `>=0.0.15 <1.0.0` | `0.0.15` |
|
|
98
|
-
| `@antelopejs/interface-core` | `>=0.2.4 <1.0.0` | `0.
|
|
99
|
-
| `@antelopejs/interface-database` | `>=0.1.11 <1.0.0` | `0.
|
|
100
|
+
| `@antelopejs/interface-core` | `>=0.2.4 <1.0.0` | `0.4.0` |
|
|
101
|
+
| `@antelopejs/interface-database` | `>=0.1.11 <1.0.0` | `0.3.0` |
|
|
100
102
|
|
|
101
103
|
<!-- antelopejs-docs-compat:end -->
|
|
102
104
|
|
package/dist/antelope.test.js
CHANGED
package/dist/common.d.ts
CHANGED
|
@@ -4,23 +4,69 @@ export type Constructible<T = object, A extends unknown[] = unknown[]> = new (..
|
|
|
4
4
|
export type DeepPartial<T> = {
|
|
5
5
|
[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];
|
|
6
6
|
};
|
|
7
|
-
|
|
7
|
+
/**
|
|
8
|
+
* A table row as `toPlainData` gives it: the fields of `T` that are set, by
|
|
9
|
+
* name, without the row's prototype.
|
|
10
|
+
*/
|
|
11
|
+
export type PlainRow<T> = {
|
|
12
|
+
[K in Extract<keyof T, string>]?: T[K];
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* A table row as `fromPlainData` reads it: every field is optional and may be
|
|
16
|
+
* partial, and a field under a container modifier, such as a localized one, may
|
|
17
|
+
* hold its value per key.
|
|
18
|
+
*/
|
|
19
|
+
export type PlainData<T> = {
|
|
20
|
+
[K in Extract<keyof T, string>]?: T[K] | DeepPartial<T>[K] | Record<string, DeepPartial<T>[K]>;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* The rows a fixture generator gives for its table: one, several or none.
|
|
24
|
+
*/
|
|
25
|
+
export type DatumGeneratorOutput<Row extends object = object> = Row | Row[] | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* A fixture generator of a table class, called with the class registered into
|
|
28
|
+
* the schema: the decorated class or a subclass of it.
|
|
29
|
+
*/
|
|
8
30
|
export type DatumGenerator = (tableClass: Constructible) => DatumGeneratorOutput | Promise<DatumGeneratorOutput>;
|
|
9
31
|
export interface MetadataClass<TMetadata> extends Constructible<TMetadata> {
|
|
10
32
|
key: symbol;
|
|
33
|
+
/**
|
|
34
|
+
* Builds the metadata a subclass starts from out of its parent's, copying
|
|
35
|
+
* whatever a decorator on the subclass would write to. Without it, the
|
|
36
|
+
* subclass shares its parent's metadata object.
|
|
37
|
+
*/
|
|
38
|
+
inherit?: (parent: TMetadata) => TMetadata;
|
|
39
|
+
/**
|
|
40
|
+
* Brings metadata stored under the shared key by an older copy of the
|
|
41
|
+
* package to this copy's shape. Returns `stored` itself when it is already
|
|
42
|
+
* current.
|
|
43
|
+
*/
|
|
44
|
+
upgrade?: (stored: TMetadata) => TMetadata;
|
|
11
45
|
}
|
|
12
46
|
/**
|
|
13
47
|
* Table class Metadata.
|
|
14
48
|
*/
|
|
15
49
|
export declare class DatumStaticMetadata {
|
|
16
50
|
static key: symbol;
|
|
51
|
+
/**
|
|
52
|
+
* The metadata of a subclass of a table: a copy of its parent's, so that
|
|
53
|
+
* decorators on the subclass never write into the parent or its siblings.
|
|
54
|
+
* The bound schema is not copied: `RegisterSchema` binds the parent after a
|
|
55
|
+
* subclass may have been read, so the subclass looks the schema up by name.
|
|
56
|
+
*/
|
|
57
|
+
static inherit(parent: DatumStaticMetadata): DatumStaticMetadata;
|
|
58
|
+
/**
|
|
59
|
+
* Copies 0.1.8 and 0.1.9 of the package store the metadata without
|
|
60
|
+
* `uniqueIndexes`, under the same key and class shape as this copy.
|
|
61
|
+
*/
|
|
62
|
+
static upgrade(stored: DatumStaticMetadata): DatumStaticMetadata;
|
|
17
63
|
tableName?: string;
|
|
18
64
|
schemaName?: string;
|
|
19
65
|
readonly indexes: Record<string, Array<string>>;
|
|
20
66
|
readonly crossInstanceIndexes: Set<string>;
|
|
21
67
|
readonly uniqueIndexes: Set<string>;
|
|
22
68
|
readonly fields: Record<string, FieldType>;
|
|
23
|
-
primary:
|
|
69
|
+
primary: "_id";
|
|
24
70
|
generator?: DatumGenerator;
|
|
25
71
|
/**
|
|
26
72
|
* Schema the table was registered into by `RegisterSchema`.
|
package/dist/common.js
CHANGED
|
@@ -2,11 +2,47 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DatumStaticMetadata = void 0;
|
|
4
4
|
exports.getMetadata = getMetadata;
|
|
5
|
+
const kinds_1 = require("./modifiers/internal/kinds");
|
|
5
6
|
/**
|
|
6
7
|
* Table class Metadata.
|
|
7
8
|
*/
|
|
8
9
|
class DatumStaticMetadata {
|
|
9
10
|
static key = Symbol.for("@antelopejs/interface-database-decorators/DatumStaticMetadata@1");
|
|
11
|
+
/**
|
|
12
|
+
* The metadata of a subclass of a table: a copy of its parent's, so that
|
|
13
|
+
* decorators on the subclass never write into the parent or its siblings.
|
|
14
|
+
* The bound schema is not copied: `RegisterSchema` binds the parent after a
|
|
15
|
+
* subclass may have been read, so the subclass looks the schema up by name.
|
|
16
|
+
*/
|
|
17
|
+
static inherit(parent) {
|
|
18
|
+
const copy = new DatumStaticMetadata();
|
|
19
|
+
copy.tableName = parent.tableName;
|
|
20
|
+
copy.schemaName = parent.schemaName;
|
|
21
|
+
for (const [group, keys] of Object.entries(parent.indexes)) {
|
|
22
|
+
copy.indexes[group] = [...keys];
|
|
23
|
+
}
|
|
24
|
+
for (const group of parent.crossInstanceIndexes) {
|
|
25
|
+
copy.crossInstanceIndexes.add(group);
|
|
26
|
+
}
|
|
27
|
+
for (const group of parent.uniqueIndexes) {
|
|
28
|
+
copy.uniqueIndexes.add(group);
|
|
29
|
+
}
|
|
30
|
+
for (const [name, type] of Object.entries(parent.fields)) {
|
|
31
|
+
copy.fields[name] = type;
|
|
32
|
+
}
|
|
33
|
+
copy.primary = parent.primary;
|
|
34
|
+
copy.generator = parent.generator;
|
|
35
|
+
return copy;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Copies 0.1.8 and 0.1.9 of the package store the metadata without
|
|
39
|
+
* `uniqueIndexes`, under the same key and class shape as this copy.
|
|
40
|
+
*/
|
|
41
|
+
static upgrade(stored) {
|
|
42
|
+
return Object.hasOwn(stored, "uniqueIndexes")
|
|
43
|
+
? stored
|
|
44
|
+
: Object.assign(new DatumStaticMetadata(), stored);
|
|
45
|
+
}
|
|
10
46
|
tableName;
|
|
11
47
|
schemaName;
|
|
12
48
|
indexes = {};
|
|
@@ -20,7 +56,7 @@ class DatumStaticMetadata {
|
|
|
20
56
|
*/
|
|
21
57
|
schema;
|
|
22
58
|
addIndex(key, group, isCrossInstance = false, isUnique = false) {
|
|
23
|
-
if (!(
|
|
59
|
+
if (!Object.hasOwn(this.indexes, group)) {
|
|
24
60
|
this.indexes[group] = [];
|
|
25
61
|
}
|
|
26
62
|
this.indexes[group].push(key);
|
|
@@ -33,16 +69,26 @@ class DatumStaticMetadata {
|
|
|
33
69
|
}
|
|
34
70
|
}
|
|
35
71
|
exports.DatumStaticMetadata = DatumStaticMetadata;
|
|
72
|
+
// oxlint-disable-next-line typescript/no-unnecessary-type-parameters -- exported; replacing TTarget with `object` clears this row and adds 6 (1 no-object-parameters, 5 no-unsafe-argument for the any-typed constructor callers pass)
|
|
36
73
|
function getMetadata(target, metadataClass, inherit = true) {
|
|
74
|
+
// SAFETY: getMetadata alone defines metadata under metadataClass.key, always a TMetadata (new metadataClass, its inherit or its upgrade), so the read is a TMetadata or undefined; reflect-metadata types it any.
|
|
37
75
|
const existingMetadata = Reflect.getOwnMetadata(metadataClass.key, target);
|
|
38
76
|
if (existingMetadata) {
|
|
39
|
-
|
|
77
|
+
const upgraded = metadataClass.upgrade?.(existingMetadata);
|
|
78
|
+
if (upgraded && upgraded !== existingMetadata) {
|
|
79
|
+
Reflect.defineMetadata(metadataClass.key, upgraded, target);
|
|
80
|
+
}
|
|
81
|
+
return upgraded ?? existingMetadata;
|
|
40
82
|
}
|
|
41
83
|
const prototype = Object.getPrototypeOf(target);
|
|
42
|
-
const inheritedMetadata = inherit &&
|
|
43
|
-
|
|
84
|
+
const inheritedMetadata = inherit &&
|
|
85
|
+
(0, kinds_1.isObjectLike)(prototype) &&
|
|
86
|
+
Reflect.hasOwnMetadata(metadataClass.key, prototype)
|
|
87
|
+
? getMetadata(prototype, metadataClass, false)
|
|
44
88
|
: undefined;
|
|
45
|
-
const metadata = inheritedMetadata
|
|
89
|
+
const metadata = inheritedMetadata && metadataClass.inherit
|
|
90
|
+
? metadataClass.inherit(inheritedMetadata)
|
|
91
|
+
: (inheritedMetadata ?? new metadataClass(target));
|
|
46
92
|
Reflect.defineMetadata(metadataClass.key, metadata, target);
|
|
47
93
|
return metadata;
|
|
48
94
|
}
|
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":"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"}
|
package/dist/database.js
CHANGED
|
@@ -73,10 +73,9 @@ async function insertFixtureData(schema, tableName, tableClass, generator) {
|
|
|
73
73
|
if (rows.length === 0) {
|
|
74
74
|
return;
|
|
75
75
|
}
|
|
76
|
-
const payload = rows.length === 1 ? rows[0] : rows;
|
|
77
76
|
const table = schema.instance().table(tableName);
|
|
78
77
|
try {
|
|
79
|
-
await table.insert(
|
|
78
|
+
await table.insert(rows.length === 1 ? rows[0] : rows);
|
|
80
79
|
}
|
|
81
80
|
catch (error) {
|
|
82
81
|
if ((await table.count()) === 0)
|
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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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** @internal @packageDocumentation */
|
|
2
|
+
import type { DatumStaticMetadata } from "../common";
|
|
3
|
+
/**
|
|
4
|
+
* The schema a table is bound to: the one `RegisterSchema` bound it to, else
|
|
5
|
+
* the one registered under its schema name. A subclass starts without a bound
|
|
6
|
+
* schema, so it follows its parent's schema whenever `RegisterSchema` binds it.
|
|
7
|
+
*/
|
|
8
|
+
export declare function boundSchema({ schema, schemaName }: DatumStaticMetadata): import("@antelopejs/interface-database/dist/staged-query/schema").Schema<any, import("@antelopejs/interface-database").SchemaDefinition> | undefined;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** @internal @packageDocumentation */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.boundSchema = boundSchema;
|
|
5
|
+
const interface_database_1 = require("@antelopejs/interface-database");
|
|
6
|
+
/**
|
|
7
|
+
* The schema a table is bound to: the one `RegisterSchema` bound it to, else
|
|
8
|
+
* the one registered under its schema name. A subclass starts without a bound
|
|
9
|
+
* schema, so it follows its parent's schema whenever `RegisterSchema` binds it.
|
|
10
|
+
*/
|
|
11
|
+
function boundSchema({ schema, schemaName }) {
|
|
12
|
+
return (schema ?? (schemaName === undefined ? undefined : interface_database_1.Schema.get(schemaName)));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=bound-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bound-schema.js","sourceRoot":"","sources":["../../src/internal/bound-schema.ts"],"names":[],"mappings":";AAAA,sCAAsC;;AAWtC,kCAIC;AAbD,uEAAwD;AAIxD;;;;GAIG;AACH,SAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAuB;IACrE,OAAO,CACL,MAAM,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,2BAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAC1E,CAAC;AACJ,CAAC"}
|
package/dist/model.d.ts
CHANGED
|
@@ -2,16 +2,21 @@ import type * as DatabaseDev from "@antelopejs/interface-database";
|
|
|
2
2
|
import { type InstanceId } from "@antelopejs/interface-database";
|
|
3
3
|
import { type RequestContext } from "@antelopejs/interface-api";
|
|
4
4
|
import { type Class } from "@antelopejs/interface-core/decorators";
|
|
5
|
-
import { type
|
|
5
|
+
import { type StoredRow } from "./modifiers/common";
|
|
6
|
+
import { type Constructible, DatumStaticMetadata, type DeepPartial, type PlainData } from "./common";
|
|
6
7
|
export type DataModel<T = any> = {
|
|
7
|
-
|
|
8
|
+
/**
|
|
9
|
+
* Schema the table class registers into with `@RegisterTable`; `undefined`
|
|
10
|
+
* for a table class that does not.
|
|
11
|
+
*/
|
|
12
|
+
readonly schemaName: string | undefined;
|
|
8
13
|
readonly tableClass?: Constructible;
|
|
9
14
|
new (database: DatabaseDev.SchemaInstance<any>): {
|
|
10
15
|
readonly database: DatabaseDev.SchemaInstance<any>;
|
|
11
16
|
readonly table: DatabaseDev.Table<T>;
|
|
12
17
|
};
|
|
13
18
|
fromDatabase(obj: any): T | undefined;
|
|
14
|
-
fromPlainData(obj:
|
|
19
|
+
fromPlainData(obj: PlainData<T> | T): T;
|
|
15
20
|
};
|
|
16
21
|
export type FieldError = {
|
|
17
22
|
field: string;
|
|
@@ -26,6 +31,11 @@ export type ValidationResult = {
|
|
|
26
31
|
export type ValidateInputOptions = {
|
|
27
32
|
partial?: boolean;
|
|
28
33
|
};
|
|
34
|
+
/**
|
|
35
|
+
* One key {@link BasicDataModel}'s `getBy` matches against an index: a value,
|
|
36
|
+
* or a value proxy, as `Table.getAll` takes it.
|
|
37
|
+
*/
|
|
38
|
+
export type IndexKey = Exclude<Parameters<DatabaseDev.Table<object>["getAll"]>[0], unknown[]>;
|
|
29
39
|
/**
|
|
30
40
|
* Utility Class factory to create a basic Data Model with 1 table.
|
|
31
41
|
*
|
|
@@ -53,7 +63,7 @@ export declare function BasicDataModel<T extends object>(dataType: Constructible
|
|
|
53
63
|
* @param keys Index value(s)
|
|
54
64
|
* @returns Array of Table class instances.
|
|
55
65
|
*/
|
|
56
|
-
getBy(index: keyof T, ...keys:
|
|
66
|
+
getBy(index: Extract<keyof T, string>, ...keys: IndexKey[]): PromiseLike<T[]>;
|
|
57
67
|
/**
|
|
58
68
|
* Get all the elements from the table.
|
|
59
69
|
*
|
|
@@ -77,7 +87,7 @@ export declare function BasicDataModel<T extends object>(dataType: Constructible
|
|
|
77
87
|
* @returns Update result
|
|
78
88
|
*/
|
|
79
89
|
update(id: string, obj: DeepPartial<T>, options?: ValidateOptions): Promise<number>;
|
|
80
|
-
update(obj: DeepPartial<T
|
|
90
|
+
update(obj: DeepPartial<T> & KeyedRow, options?: ValidateOptions): Promise<number>;
|
|
81
91
|
/**
|
|
82
92
|
* Delete an element from the table.
|
|
83
93
|
*
|
|
@@ -86,7 +96,7 @@ export declare function BasicDataModel<T extends object>(dataType: Constructible
|
|
|
86
96
|
*/
|
|
87
97
|
delete(id: string): Promise<number>;
|
|
88
98
|
};
|
|
89
|
-
readonly schemaName: string;
|
|
99
|
+
readonly schemaName: string | undefined;
|
|
90
100
|
/**
|
|
91
101
|
* Table class this model was built from.
|
|
92
102
|
*/
|
|
@@ -97,7 +107,7 @@ export declare function BasicDataModel<T extends object>(dataType: Constructible
|
|
|
97
107
|
* @param obj Plain data object containing the table fields
|
|
98
108
|
* @returns Table class instance
|
|
99
109
|
*/
|
|
100
|
-
fromPlainData(obj:
|
|
110
|
+
fromPlainData(obj: PlainData<T> | T): T;
|
|
101
111
|
/**
|
|
102
112
|
* Converts an object acquired from the database into a Table class instance.
|
|
103
113
|
*
|
|
@@ -111,7 +121,7 @@ export declare function BasicDataModel<T extends object>(dataType: Constructible
|
|
|
111
121
|
* @param obj Table class instance
|
|
112
122
|
* @returns Database-ready data
|
|
113
123
|
*/
|
|
114
|
-
toDatabase(obj:
|
|
124
|
+
toDatabase(obj: PlainData<T> | T): StoredRow<T>;
|
|
115
125
|
/**
|
|
116
126
|
* Validates a plain object against every io-ts codec attached via `@Field`.
|
|
117
127
|
* Pass `{ partial: true }` to skip fields not present on `obj` (patch semantics).
|
|
@@ -121,8 +131,11 @@ export declare function BasicDataModel<T extends object>(dataType: Constructible
|
|
|
121
131
|
export type ValidateOptions = {
|
|
122
132
|
validate?: boolean;
|
|
123
133
|
};
|
|
134
|
+
/** The part of a row an update without an id finds the row by. */
|
|
135
|
+
type KeyedRow = Record<DatumStaticMetadata["primary"], string>;
|
|
124
136
|
export declare function GetModel<M extends InstanceType<DataModel>>(cl: DataModel & Class<M>, instanceId?: InstanceId): M;
|
|
125
137
|
export declare const Model: (cl: DataModel<any> & Class<{
|
|
126
138
|
readonly database: DatabaseDev.SchemaInstance<any>;
|
|
127
139
|
readonly table: DatabaseDev.Table<any>;
|
|
128
140
|
}>, instanceIdOrCallback?: DatabaseDev.InstanceId | ((ctx: RequestContext) => InstanceId | undefined) | undefined) => import("@antelopejs/interface-core/decorators").PropertyDecorator & import("@antelopejs/interface-core/decorators").ParameterDecorator;
|
|
141
|
+
export {};
|
package/dist/model.js
CHANGED
|
@@ -12,6 +12,7 @@ const interface_api_1 = require("@antelopejs/interface-api");
|
|
|
12
12
|
const decorators_1 = require("@antelopejs/interface-core/decorators");
|
|
13
13
|
const common_1 = require("./modifiers/common");
|
|
14
14
|
const kinds_1 = require("./modifiers/internal/kinds");
|
|
15
|
+
const bound_schema_1 = require("./internal/bound-schema");
|
|
15
16
|
const records_1 = require("./modifiers/internal/records");
|
|
16
17
|
const common_2 = require("./common");
|
|
17
18
|
function isCodec(type) {
|
|
@@ -83,7 +84,9 @@ function BasicDataModel(dataType, tableName) {
|
|
|
83
84
|
* Validates a plain object against every io-ts codec attached via `@Field`.
|
|
84
85
|
* Pass `{ partial: true }` to skip fields not present on `obj` (patch semantics).
|
|
85
86
|
*/
|
|
86
|
-
static validate(
|
|
87
|
+
static validate(
|
|
88
|
+
// oxlint-disable-next-line anti-slop/no-unknown-parameters -- validate is the parser: it narrows obj with isRecord and decodes every field with its codec before reading it
|
|
89
|
+
obj, options) {
|
|
87
90
|
const fields = metadata.fields;
|
|
88
91
|
const errors = [];
|
|
89
92
|
const partial = options?.partial === true;
|
|
@@ -106,6 +109,7 @@ function BasicDataModel(dataType, tableName) {
|
|
|
106
109
|
table;
|
|
107
110
|
constructor(database) {
|
|
108
111
|
this.database = database;
|
|
112
|
+
// oxlint-disable-next-line typescript/no-unsafe-assignment -- database is a SchemaInstance<any>, so its table is a Table<any>; a schema instance covers every table of its schema, so no type parameter of it states that this class's table holds this class's rows
|
|
109
113
|
this.table = database.table(name);
|
|
110
114
|
}
|
|
111
115
|
/**
|
|
@@ -159,7 +163,7 @@ function BasicDataModel(dataType, tableName) {
|
|
|
159
163
|
const converter = (entry) => {
|
|
160
164
|
const instance = Model.fromPlainData(entry);
|
|
161
165
|
(0, common_1.triggerEvent)(instance, "insert");
|
|
162
|
-
return
|
|
166
|
+
return (0, common_1.toDatabase)(instance);
|
|
163
167
|
};
|
|
164
168
|
return this.table
|
|
165
169
|
.insert(Array.isArray(obj) ? obj.map(converter) : converter(obj))
|
|
@@ -177,17 +181,16 @@ function BasicDataModel(dataType, tableName) {
|
|
|
177
181
|
(0, common_1.triggerEvent)(instance, "update");
|
|
178
182
|
return this.table
|
|
179
183
|
.get(parsed.id)
|
|
180
|
-
.update(withoutEmptyInternal(
|
|
184
|
+
.update(withoutEmptyInternal((0, common_1.toDatabase)(instance)))
|
|
181
185
|
.run();
|
|
182
186
|
}
|
|
183
187
|
const instance = Model.fromPlainData(parsed.data);
|
|
184
188
|
(0, common_1.triggerEvent)(instance, "update");
|
|
185
|
-
// SAFETY: parsed.data is the DeepPartial<T> object the caller passed as the first argument (the id form was handled above), so reading the property named by the table's primary key is defined and gives undefined when absent; the next line asserts it is present.
|
|
186
189
|
const id = parsed.data[primaryKey];
|
|
187
190
|
(0, node_assert_1.default)(id !== undefined, "Missing primary key in object update.");
|
|
188
191
|
return this.table
|
|
189
192
|
.get(id)
|
|
190
|
-
.update(withoutEmptyInternal(
|
|
193
|
+
.update(withoutEmptyInternal((0, common_1.toDatabase)(instance)))
|
|
191
194
|
.run();
|
|
192
195
|
}
|
|
193
196
|
/**
|
|
@@ -237,11 +240,11 @@ function parseUpdateArgs(args) {
|
|
|
237
240
|
}
|
|
238
241
|
function schemaOf(cl) {
|
|
239
242
|
if (!cl.tableClass) {
|
|
240
|
-
const schema = interface_database_1.Schema.get(cl.schemaName);
|
|
243
|
+
const schema = cl.schemaName === undefined ? undefined : interface_database_1.Schema.get(cl.schemaName);
|
|
241
244
|
(0, node_assert_1.default)(schema, `Schema not found for '${cl.schemaName}'`);
|
|
242
245
|
return schema;
|
|
243
246
|
}
|
|
244
|
-
const schema = (0, common_2.getMetadata)(cl.tableClass, common_2.DatumStaticMetadata)
|
|
247
|
+
const schema = (0, bound_schema_1.boundSchema)((0, common_2.getMetadata)(cl.tableClass, common_2.DatumStaticMetadata));
|
|
245
248
|
(0, node_assert_1.default)(schema, `${cl.tableClass.name} is not bound to a schema: call RegisterSchema("${cl.schemaName}") in the module that declares it`);
|
|
246
249
|
return schema;
|
|
247
250
|
}
|
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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"}
|
|
@@ -12,8 +12,8 @@ type Options = {
|
|
|
12
12
|
* does not require the Table class to incorporate a mixin.
|
|
13
13
|
*/
|
|
14
14
|
export declare class AutoDateModifier extends Modifier<object, Options> {
|
|
15
|
-
insert(object: Record<
|
|
16
|
-
update(object: Record<
|
|
15
|
+
insert<F extends string>(object: Partial<Record<F, Date>>, field: F): void;
|
|
16
|
+
update<F extends string>(object: Partial<Record<F, Date>>, field: F): void;
|
|
17
17
|
}
|
|
18
18
|
/**
|
|
19
19
|
* Mark a Database Table class field as an automatic creation timestamp.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autodate.js","sourceRoot":"","sources":["../../src/modifiers/autodate.ts"],"names":[],"mappings":";;;AAAA,sEAA8E;AAE9E,qCAAoD;AASpD;;;;;;GAMG;AACH,MAAa,gBAAiB,SAAQ,iBAAyB;IACtD,MAAM,
|
|
1
|
+
{"version":3,"file":"autodate.js","sourceRoot":"","sources":["../../src/modifiers/autodate.ts"],"names":[],"mappings":";;;AAAA,sEAA8E;AAE9E,qCAAoD;AASpD;;;;;;GAMG;AACH,MAAa,gBAAiB,SAAQ,iBAAyB;IACtD,MAAM,CAAmB,MAAgC,EAAE,KAAQ;QACxE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;IAC7B,CAAC;IAEM,MAAM,CAAmB,MAAgC,EAAE,KAAQ;QACxE,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;CACF;AAZD,4CAYC;AAED;;;;;GAKG;AACU,QAAA,YAAY,GAAG,IAAA,kCAAqB,EAAC,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE;IACxE,IAAA,uBAAc,EAAC,MAAM,CAAC,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE;QAChE,IAAI,EAAE,SAAS;KAChB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH;;;;;GAKG;AACU,QAAA,UAAU,GAAG,IAAA,kCAAqB,EAAC,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE;IACtE,IAAA,uBAAc,EAAC,MAAM,CAAC,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE;QAChE,IAAI,EAAE,SAAS;KAChB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type * as DatabaseDev from "@antelopejs/interface-database";
|
|
2
|
-
import { type Constructible } from "../common";
|
|
2
|
+
import { type Constructible, type PlainData, type PlainRow } from "../common";
|
|
3
|
+
import { type InternalHolder, type InternalRecord, type ModifierState } from "./internal/records";
|
|
3
4
|
export declare const MixinSymbol: unique symbol;
|
|
4
5
|
export type MixinType<T> = T extends {
|
|
5
6
|
[MixinSymbol]: infer A;
|
|
@@ -26,21 +27,35 @@ export declare class ContainerModifier<Meta extends object = object, Options ext
|
|
|
26
27
|
unlock(locked_value: Record<string, unknown>, key: string): unknown;
|
|
27
28
|
unlockrequest(data: DatabaseDev.ValueProxy<Record<string, unknown>>, _meta: DatabaseDev.ValueProxy<Meta>, key: DatabaseDev.ValueProxyOrValue<string>): DatabaseDev.ValueProxy<unknown>;
|
|
28
29
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
/**
|
|
31
|
+
* A table row as the database stores it: the fields of `T` that are set, with
|
|
32
|
+
* no prototype, and its modified fields locked in `_internal` instead of at the
|
|
33
|
+
* top level.
|
|
34
|
+
*/
|
|
35
|
+
export type StoredRow<T> = Partial<T> & InternalHolder;
|
|
36
|
+
/**
|
|
37
|
+
* A modifier method run for an event of the table instance (`insert`,
|
|
38
|
+
* `toDatabase`, ...), with the modifier as `this`.
|
|
39
|
+
*/
|
|
40
|
+
export type ModifierEvent = (this: Modifier, object: {
|
|
41
|
+
constructor: any;
|
|
42
|
+
}, field: PropertyKey, ...args: unknown[]) => void;
|
|
33
43
|
interface ModifiedField {
|
|
34
44
|
id: string;
|
|
35
45
|
modifier: Modifier;
|
|
36
46
|
metaRef: {
|
|
37
|
-
_ref:
|
|
47
|
+
_ref: ModifierState | undefined;
|
|
38
48
|
};
|
|
39
49
|
}
|
|
40
50
|
export declare class ModifiersStaticMetadata {
|
|
41
51
|
static key: symbol;
|
|
52
|
+
/**
|
|
53
|
+
* The metadata of a subclass of a table: a copy of its parent's lists, so
|
|
54
|
+
* modifiers attached on the subclass never reach the parent or its siblings.
|
|
55
|
+
*/
|
|
56
|
+
static inherit(parent: ModifiersStaticMetadata): ModifiersStaticMetadata;
|
|
42
57
|
fields: Record<string, Array<ModifiedField>>;
|
|
43
|
-
events: Map<string, [field: string, modified: ModifiedField][]>;
|
|
58
|
+
events: Map<string, [field: string, modified: ModifiedField, handler: ModifierEvent][]>;
|
|
44
59
|
}
|
|
45
60
|
export declare class ModifiersDynamicMetadata {
|
|
46
61
|
static key: symbol;
|
|
@@ -49,26 +64,30 @@ export declare class ModifiersDynamicMetadata {
|
|
|
49
64
|
* Values assigned to a field before its modifiers could lock them, by field
|
|
50
65
|
* name. Reads return them; `unlock` and `lock` assign them again.
|
|
51
66
|
*/
|
|
52
|
-
floating: Record<string,
|
|
53
|
-
|
|
67
|
+
floating: Record<string, unknown>;
|
|
68
|
+
/**
|
|
69
|
+
* The arguments each modifier of a field was unlocked or locked with, by
|
|
70
|
+
* field name, then by modifier name.
|
|
71
|
+
*/
|
|
72
|
+
fields: Record<string, Record<string, unknown[]>>;
|
|
54
73
|
constructor(target: any);
|
|
55
74
|
canGet(field: PropertyKey): boolean;
|
|
56
|
-
get(field: PropertyKey, internal:
|
|
75
|
+
get(field: PropertyKey, internal: InternalRecord): unknown;
|
|
57
76
|
canSet(field: PropertyKey): boolean;
|
|
58
|
-
set(field: PropertyKey, internal:
|
|
77
|
+
set(field: PropertyKey, internal: InternalRecord, value: unknown): void;
|
|
59
78
|
}
|
|
60
79
|
/**
|
|
61
80
|
* Builds a table instance from unlocked plain data: each key is assigned, so
|
|
62
81
|
* modifiers lock the fields they can. Then runs the `fromPlainData` event.
|
|
63
82
|
*/
|
|
64
|
-
export declare function fromPlainData<T extends
|
|
83
|
+
export declare function fromPlainData<T extends object>(rawObject: PlainData<T>, TableClass: Constructible<T>): T;
|
|
65
84
|
/**
|
|
66
85
|
* Converts a table instance to unlocked plain data, without `_internal`. A
|
|
67
86
|
* field still locked comes out `undefined`. Then runs the `toPlainData` event.
|
|
68
87
|
*/
|
|
69
88
|
export declare function toPlainData<T extends {
|
|
70
89
|
constructor: any;
|
|
71
|
-
}>(object: T):
|
|
90
|
+
}>(object: T): PlainRow<T>;
|
|
72
91
|
/**
|
|
73
92
|
* Builds a table instance from a stored record, its modified fields still
|
|
74
93
|
* locked in `_internal`. Then runs the `fromDatabase` event.
|
|
@@ -78,23 +97,21 @@ export declare function fromDatabase<T extends Constructible>(rawObject: any, Ta
|
|
|
78
97
|
* Converts a table instance to the locked record to store, `_internal`
|
|
79
98
|
* included and floating values left out. Then runs the `toDatabase` event.
|
|
80
99
|
*/
|
|
81
|
-
export declare function toDatabase<T extends
|
|
82
|
-
constructor: any;
|
|
83
|
-
}>(object: T): Record<string, any>;
|
|
100
|
+
export declare function toDatabase<T extends InternalHolder>(object: T): T & InternalHolder;
|
|
84
101
|
type ExtractModifierOptions<T> = T extends Modifier<any, infer Options> ? Options : undefined;
|
|
85
102
|
type ExtractModifierArgs<T> = T extends OneWayModifier<any, infer Args> ? Args : [];
|
|
86
|
-
export declare function attachModifier<
|
|
103
|
+
export declare function attachModifier<M extends Constructible<Modifier>>(TableClass: Function, Modifier: M, field: PropertyKey, options: ExtractModifierOptions<InstanceType<M>>): void;
|
|
87
104
|
export declare function getModifiedFields<T extends {
|
|
88
105
|
constructor: any;
|
|
89
|
-
}
|
|
106
|
+
}>(object: T, Modifier: Constructible<Modifier>): (keyof T)[];
|
|
90
107
|
export declare function unlock<T extends {
|
|
91
108
|
constructor: any;
|
|
92
109
|
}, M extends Constructible<Modifier>>(object: T, Modifier: M, fields: Array<keyof T> | undefined, ...args: ExtractModifierArgs<InstanceType<M>>): void;
|
|
93
110
|
type ModifierWithProxyArgs = {
|
|
94
111
|
modifier: Constructible<TwoWayModifier<any, any[], any, any>>;
|
|
95
|
-
args:
|
|
112
|
+
args: unknown[];
|
|
96
113
|
};
|
|
97
|
-
export declare function unlockrequest<T extends {}, K extends keyof T>(table: Constructible
|
|
114
|
+
export declare function unlockrequest<T extends {}, K extends keyof T>(table: Constructible, object: DatabaseDev.ValueProxy<T>, field: K, modifiers: ModifierWithProxyArgs[]): DatabaseDev.ValueProxy<T[K]>;
|
|
98
115
|
export declare function lock<T extends {
|
|
99
116
|
constructor: any;
|
|
100
117
|
}, M extends Constructible<Modifier>>(object: T, Modifier: M, fields: Array<keyof T> | undefined, ...args: ExtractModifierArgs<InstanceType<M>> | []): void;
|