@antelopejs/interface-database-decorators 0.1.9 → 0.1.11
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 +1 -1
- package/dist/antelope.test.js +1 -1
- package/dist/common.d.ts +2 -1
- package/dist/common.js +5 -1
- package/dist/common.js.map +1 -1
- package/dist/database.js +1 -0
- package/dist/database.js.map +1 -1
- package/dist/model.js +29 -26
- package/dist/model.js.map +1 -1
- package/dist/modifiers/common.d.ts +24 -4
- package/dist/modifiers/common.js +92 -114
- package/dist/modifiers/common.js.map +1 -1
- package/dist/modifiers/encryption.js +14 -9
- package/dist/modifiers/encryption.js.map +1 -1
- package/dist/modifiers/internal/kinds.d.ts +12 -0
- package/dist/modifiers/internal/kinds.js +29 -0
- package/dist/modifiers/internal/kinds.js.map +1 -0
- package/dist/modifiers/internal/records.d.ts +29 -0
- package/dist/modifiers/internal/records.js +42 -0
- package/dist/modifiers/internal/records.js.map +1 -0
- package/dist/modifiers/localization.d.ts +19 -1
- package/dist/modifiers/localization.js +41 -6
- package/dist/modifiers/localization.js.map +1 -1
- package/dist/schema.js +1 -2
- package/dist/schema.js.map +1 -1
- package/dist/table.d.ts +8 -0
- package/dist/table.js +21 -6
- package/dist/table.js.map +1 -1
- package/dist/tests/codec_helpers.d.ts +6 -2
- package/dist/tests/codec_helpers.js +18 -14
- package/dist/tests/codec_helpers.js.map +1 -1
- package/dist/tests/common.test.js +38 -46
- package/dist/tests/common.test.js.map +1 -1
- package/dist/tests/cross_instance.test.js +27 -2
- package/dist/tests/cross_instance.test.js.map +1 -1
- package/dist/tests/database.test.js +247 -226
- package/dist/tests/database.test.js.map +1 -1
- package/dist/tests/helpers/other-instance.d.ts +1 -1
- package/dist/tests/helpers/other-instance.js +41 -9
- package/dist/tests/helpers/other-instance.js.map +1 -1
- package/dist/tests/integration.test.js +485 -469
- package/dist/tests/integration.test.js.map +1 -1
- package/dist/tests/model.test.js +293 -308
- package/dist/tests/model.test.js.map +1 -1
- package/dist/tests/modifiers/autodate.test.js +80 -86
- package/dist/tests/modifiers/autodate.test.js.map +1 -1
- package/dist/tests/modifiers/common.test.js +181 -195
- package/dist/tests/modifiers/common.test.js.map +1 -1
- package/dist/tests/modifiers/encryption.test.js +149 -155
- package/dist/tests/modifiers/encryption.test.js.map +1 -1
- package/dist/tests/modifiers/hash.test.js +91 -99
- package/dist/tests/modifiers/hash.test.js.map +1 -1
- package/dist/tests/modifiers/localization.test.js +186 -159
- package/dist/tests/modifiers/localization.test.js.map +1 -1
- package/dist/tests/relation.test.js +92 -97
- package/dist/tests/relation.test.js.map +1 -1
- package/dist/tests/schema.test.js +101 -106
- package/dist/tests/schema.test.js.map +1 -1
- package/dist/tests/table.test.js +124 -132
- package/dist/tests/table.test.js.map +1 -1
- package/docs/1.introduction.md +56 -2
- package/docs/2.table-definitions.md +15 -0
- package/docs/3.table-modifiers.md +10 -4
- package/docs/4.data-models.md +12 -0
- package/docs/5.parameter-decoration.md +4 -0
- package/docs/assets/model-conversion.svg +21 -0
- package/package.json +16 -5
- package/skills/database-decorators-interface/SKILL.md +4 -0
- package/skills/database-decorators-interface/cases.json +71 -0
|
@@ -10,112 +10,107 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
const chai_1 = require("chai");
|
|
13
|
-
const table_1 = require("
|
|
14
|
-
const common_1 = require("
|
|
15
|
-
const schema_1 = require("
|
|
13
|
+
const table_1 = require("../table");
|
|
14
|
+
const common_1 = require("../common");
|
|
15
|
+
const schema_1 = require("../schema");
|
|
16
16
|
describe("Schema - RegisterTable decorator", () => {
|
|
17
|
-
it("stores tableName and schemaName in metadata", async () =>
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
it("stores tableName and schemaName in metadata", async () => {
|
|
18
|
+
let TestTable = class TestTable extends table_1.Table {
|
|
19
|
+
name;
|
|
20
|
+
};
|
|
21
|
+
__decorate([
|
|
22
|
+
(0, table_1.Field)("string"),
|
|
23
|
+
__metadata("design:type", String)
|
|
24
|
+
], TestTable.prototype, "name", void 0);
|
|
25
|
+
TestTable = __decorate([
|
|
26
|
+
(0, schema_1.RegisterTable)("test_table", "test-schema")
|
|
27
|
+
], TestTable);
|
|
28
|
+
const metadata = (0, common_1.getMetadata)(TestTable, common_1.DatumStaticMetadata);
|
|
29
|
+
(0, chai_1.expect)(metadata.tableName).to.equal("test_table");
|
|
30
|
+
(0, chai_1.expect)(metadata.schemaName).to.equal("test-schema");
|
|
31
|
+
});
|
|
32
|
+
it("stores tableName for multiple classes", async () => {
|
|
33
|
+
let UserTable = class UserTable extends table_1.Table {
|
|
34
|
+
email;
|
|
35
|
+
name;
|
|
36
|
+
};
|
|
37
|
+
__decorate([
|
|
38
|
+
(0, table_1.Index)(),
|
|
39
|
+
(0, table_1.Field)("string"),
|
|
40
|
+
__metadata("design:type", String)
|
|
41
|
+
], UserTable.prototype, "email", void 0);
|
|
42
|
+
__decorate([
|
|
43
|
+
(0, table_1.Field)("string"),
|
|
44
|
+
__metadata("design:type", String)
|
|
45
|
+
], UserTable.prototype, "name", void 0);
|
|
46
|
+
UserTable = __decorate([
|
|
47
|
+
(0, schema_1.RegisterTable)("user_table", "multi-schema")
|
|
48
|
+
], UserTable);
|
|
49
|
+
let ProductTable = class ProductTable extends table_1.Table {
|
|
50
|
+
name;
|
|
51
|
+
price;
|
|
52
|
+
};
|
|
53
|
+
__decorate([
|
|
54
|
+
(0, table_1.Index)(),
|
|
55
|
+
(0, table_1.Field)("string"),
|
|
56
|
+
__metadata("design:type", String)
|
|
57
|
+
], ProductTable.prototype, "name", void 0);
|
|
58
|
+
__decorate([
|
|
59
|
+
(0, table_1.Field)("number"),
|
|
60
|
+
__metadata("design:type", Number)
|
|
61
|
+
], ProductTable.prototype, "price", void 0);
|
|
62
|
+
ProductTable = __decorate([
|
|
63
|
+
(0, schema_1.RegisterTable)("product_table", "multi-schema")
|
|
64
|
+
], ProductTable);
|
|
65
|
+
const userMetadata = (0, common_1.getMetadata)(UserTable, common_1.DatumStaticMetadata);
|
|
66
|
+
const productMetadata = (0, common_1.getMetadata)(ProductTable, common_1.DatumStaticMetadata);
|
|
67
|
+
(0, chai_1.expect)(userMetadata.tableName).to.equal("user_table");
|
|
68
|
+
(0, chai_1.expect)(userMetadata.schemaName).to.equal("multi-schema");
|
|
69
|
+
(0, chai_1.expect)(productMetadata.tableName).to.equal("product_table");
|
|
70
|
+
(0, chai_1.expect)(productMetadata.schemaName).to.equal("multi-schema");
|
|
71
|
+
});
|
|
72
|
+
it("preserves existing metadata", async () => {
|
|
73
|
+
let IndexedTable = class IndexedTable extends table_1.Table {
|
|
74
|
+
email;
|
|
75
|
+
name;
|
|
76
|
+
};
|
|
77
|
+
__decorate([
|
|
78
|
+
(0, table_1.Index)(),
|
|
79
|
+
(0, table_1.Field)("string"),
|
|
80
|
+
__metadata("design:type", String)
|
|
81
|
+
], IndexedTable.prototype, "email", void 0);
|
|
82
|
+
__decorate([
|
|
83
|
+
(0, table_1.Field)("string"),
|
|
84
|
+
__metadata("design:type", String)
|
|
85
|
+
], IndexedTable.prototype, "name", void 0);
|
|
86
|
+
IndexedTable = __decorate([
|
|
87
|
+
(0, schema_1.RegisterTable)("indexed_table", "preserve-schema")
|
|
88
|
+
], IndexedTable);
|
|
89
|
+
const metadata = (0, common_1.getMetadata)(IndexedTable, common_1.DatumStaticMetadata);
|
|
90
|
+
(0, chai_1.expect)(metadata.tableName).to.equal("indexed_table");
|
|
91
|
+
(0, chai_1.expect)(metadata.schemaName).to.equal("preserve-schema");
|
|
92
|
+
(0, chai_1.expect)(metadata.primary).to.equal("_id");
|
|
93
|
+
(0, chai_1.expect)(metadata.indexes).to.have.property("email");
|
|
94
|
+
});
|
|
95
|
+
it("registers tables in schema registry", async () => {
|
|
96
|
+
let _RegUser = class _RegUser extends table_1.Table {
|
|
97
|
+
};
|
|
98
|
+
_RegUser = __decorate([
|
|
99
|
+
(0, schema_1.RegisterTable)("reg_users", "registry-schema")
|
|
100
|
+
], _RegUser);
|
|
101
|
+
let _RegProduct = class _RegProduct extends table_1.Table {
|
|
102
|
+
};
|
|
103
|
+
_RegProduct = __decorate([
|
|
104
|
+
(0, schema_1.RegisterTable)("reg_products", "registry-schema")
|
|
105
|
+
], _RegProduct);
|
|
106
|
+
const tables = (0, schema_1.getTablesForSchema)("registry-schema");
|
|
107
|
+
(0, chai_1.expect)(tables).to.not.equal(undefined);
|
|
108
|
+
(0, chai_1.expect)(tables).to.have.property("reg_users");
|
|
109
|
+
(0, chai_1.expect)(tables).to.have.property("reg_products");
|
|
110
|
+
});
|
|
111
|
+
it("returns undefined for unknown schema", async () => {
|
|
112
|
+
const tables = (0, schema_1.getTablesForSchema)("nonexistent-schema");
|
|
113
|
+
(0, chai_1.expect)(tables).to.equal(undefined);
|
|
114
|
+
});
|
|
22
115
|
});
|
|
23
|
-
async function StoreTableNameAndSchemaNameInMetadataTest() {
|
|
24
|
-
let TestTable = class TestTable extends table_1.Table {
|
|
25
|
-
name;
|
|
26
|
-
};
|
|
27
|
-
__decorate([
|
|
28
|
-
(0, table_1.Field)("string"),
|
|
29
|
-
__metadata("design:type", String)
|
|
30
|
-
], TestTable.prototype, "name", void 0);
|
|
31
|
-
TestTable = __decorate([
|
|
32
|
-
(0, schema_1.RegisterTable)("test_table", "test-schema")
|
|
33
|
-
], TestTable);
|
|
34
|
-
const metadata = (0, common_1.getMetadata)(TestTable, common_1.DatumStaticMetadata);
|
|
35
|
-
(0, chai_1.expect)(metadata.tableName).to.equal("test_table");
|
|
36
|
-
(0, chai_1.expect)(metadata.schemaName).to.equal("test-schema");
|
|
37
|
-
}
|
|
38
|
-
async function StoreTableNameForMultipleClassesTest() {
|
|
39
|
-
let UserTable = class UserTable extends table_1.Table {
|
|
40
|
-
email;
|
|
41
|
-
name;
|
|
42
|
-
};
|
|
43
|
-
__decorate([
|
|
44
|
-
(0, table_1.Index)(),
|
|
45
|
-
(0, table_1.Field)("string"),
|
|
46
|
-
__metadata("design:type", String)
|
|
47
|
-
], UserTable.prototype, "email", void 0);
|
|
48
|
-
__decorate([
|
|
49
|
-
(0, table_1.Field)("string"),
|
|
50
|
-
__metadata("design:type", String)
|
|
51
|
-
], UserTable.prototype, "name", void 0);
|
|
52
|
-
UserTable = __decorate([
|
|
53
|
-
(0, schema_1.RegisterTable)("user_table", "multi-schema")
|
|
54
|
-
], UserTable);
|
|
55
|
-
let ProductTable = class ProductTable extends table_1.Table {
|
|
56
|
-
name;
|
|
57
|
-
price;
|
|
58
|
-
};
|
|
59
|
-
__decorate([
|
|
60
|
-
(0, table_1.Index)(),
|
|
61
|
-
(0, table_1.Field)("string"),
|
|
62
|
-
__metadata("design:type", String)
|
|
63
|
-
], ProductTable.prototype, "name", void 0);
|
|
64
|
-
__decorate([
|
|
65
|
-
(0, table_1.Field)("number"),
|
|
66
|
-
__metadata("design:type", Number)
|
|
67
|
-
], ProductTable.prototype, "price", void 0);
|
|
68
|
-
ProductTable = __decorate([
|
|
69
|
-
(0, schema_1.RegisterTable)("product_table", "multi-schema")
|
|
70
|
-
], ProductTable);
|
|
71
|
-
const userMetadata = (0, common_1.getMetadata)(UserTable, common_1.DatumStaticMetadata);
|
|
72
|
-
const productMetadata = (0, common_1.getMetadata)(ProductTable, common_1.DatumStaticMetadata);
|
|
73
|
-
(0, chai_1.expect)(userMetadata.tableName).to.equal("user_table");
|
|
74
|
-
(0, chai_1.expect)(userMetadata.schemaName).to.equal("multi-schema");
|
|
75
|
-
(0, chai_1.expect)(productMetadata.tableName).to.equal("product_table");
|
|
76
|
-
(0, chai_1.expect)(productMetadata.schemaName).to.equal("multi-schema");
|
|
77
|
-
}
|
|
78
|
-
async function PreserveExistingMetadataTest() {
|
|
79
|
-
let IndexedTable = class IndexedTable extends table_1.Table {
|
|
80
|
-
email;
|
|
81
|
-
name;
|
|
82
|
-
};
|
|
83
|
-
__decorate([
|
|
84
|
-
(0, table_1.Index)(),
|
|
85
|
-
(0, table_1.Field)("string"),
|
|
86
|
-
__metadata("design:type", String)
|
|
87
|
-
], IndexedTable.prototype, "email", void 0);
|
|
88
|
-
__decorate([
|
|
89
|
-
(0, table_1.Field)("string"),
|
|
90
|
-
__metadata("design:type", String)
|
|
91
|
-
], IndexedTable.prototype, "name", void 0);
|
|
92
|
-
IndexedTable = __decorate([
|
|
93
|
-
(0, schema_1.RegisterTable)("indexed_table", "preserve-schema")
|
|
94
|
-
], IndexedTable);
|
|
95
|
-
const metadata = (0, common_1.getMetadata)(IndexedTable, common_1.DatumStaticMetadata);
|
|
96
|
-
(0, chai_1.expect)(metadata.tableName).to.equal("indexed_table");
|
|
97
|
-
(0, chai_1.expect)(metadata.schemaName).to.equal("preserve-schema");
|
|
98
|
-
(0, chai_1.expect)(metadata.primary).to.equal("_id");
|
|
99
|
-
(0, chai_1.expect)(metadata.indexes).to.have.property("email");
|
|
100
|
-
}
|
|
101
|
-
async function RegisterTablesInSchemaRegistryTest() {
|
|
102
|
-
let _RegUser = class _RegUser extends table_1.Table {
|
|
103
|
-
};
|
|
104
|
-
_RegUser = __decorate([
|
|
105
|
-
(0, schema_1.RegisterTable)("reg_users", "registry-schema")
|
|
106
|
-
], _RegUser);
|
|
107
|
-
let _RegProduct = class _RegProduct extends table_1.Table {
|
|
108
|
-
};
|
|
109
|
-
_RegProduct = __decorate([
|
|
110
|
-
(0, schema_1.RegisterTable)("reg_products", "registry-schema")
|
|
111
|
-
], _RegProduct);
|
|
112
|
-
const tables = (0, schema_1.getTablesForSchema)("registry-schema");
|
|
113
|
-
(0, chai_1.expect)(tables).to.not.equal(undefined);
|
|
114
|
-
(0, chai_1.expect)(tables).to.have.property("reg_users");
|
|
115
|
-
(0, chai_1.expect)(tables).to.have.property("reg_products");
|
|
116
|
-
}
|
|
117
|
-
async function ReturnUndefinedForUnknownSchemaTest() {
|
|
118
|
-
const tables = (0, schema_1.getTablesForSchema)("nonexistent-schema");
|
|
119
|
-
(0, chai_1.expect)(tables).to.equal(undefined);
|
|
120
|
-
}
|
|
121
116
|
//# sourceMappingURL=schema.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.test.js","sourceRoot":"","sources":["../../src/tests/schema.test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,+BAA8B;AAC9B,
|
|
1
|
+
{"version":3,"file":"schema.test.js","sourceRoot":"","sources":["../../src/tests/schema.test.ts"],"names":[],"mappings":"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"}
|
package/dist/tests/table.test.js
CHANGED
|
@@ -10,141 +10,133 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
const chai_1 = require("chai");
|
|
13
|
-
const common_1 = require("
|
|
14
|
-
const table_1 = require("
|
|
15
|
-
const common_2 = require("
|
|
13
|
+
const common_1 = require("../modifiers/common");
|
|
14
|
+
const table_1 = require("../table");
|
|
15
|
+
const common_2 = require("../common");
|
|
16
16
|
const codec_helpers_1 = require("./codec_helpers");
|
|
17
17
|
describe("Table - decorators", () => {
|
|
18
|
-
it("creates table with default primary key", async () =>
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
it("creates table with default primary key", async () => {
|
|
19
|
+
class TestTable extends table_1.Table {
|
|
20
|
+
name;
|
|
21
|
+
}
|
|
22
|
+
__decorate([
|
|
23
|
+
(0, table_1.Index)(),
|
|
24
|
+
__metadata("design:type", String)
|
|
25
|
+
], TestTable.prototype, "name", void 0);
|
|
26
|
+
const metadata = (0, common_2.getMetadata)(TestTable, common_2.DatumStaticMetadata);
|
|
27
|
+
(0, chai_1.expect)(metadata.primary).to.equal("_id");
|
|
28
|
+
(0, chai_1.expect)(metadata.indexes.name).to.deep.equal(["name"]);
|
|
29
|
+
});
|
|
30
|
+
it("creates table with multiple indexes", async () => {
|
|
31
|
+
class TestTable extends table_1.Table {
|
|
32
|
+
email;
|
|
33
|
+
age;
|
|
34
|
+
}
|
|
35
|
+
__decorate([
|
|
36
|
+
(0, table_1.Index)(),
|
|
37
|
+
__metadata("design:type", String)
|
|
38
|
+
], TestTable.prototype, "email", void 0);
|
|
39
|
+
__decorate([
|
|
40
|
+
(0, table_1.Index)(),
|
|
41
|
+
__metadata("design:type", Number)
|
|
42
|
+
], TestTable.prototype, "age", void 0);
|
|
43
|
+
const metadata = (0, common_2.getMetadata)(TestTable, common_2.DatumStaticMetadata);
|
|
44
|
+
(0, chai_1.expect)(metadata.primary).to.equal("_id");
|
|
45
|
+
(0, chai_1.expect)(metadata.indexes.email).to.deep.equal(["email"]);
|
|
46
|
+
(0, chai_1.expect)(metadata.indexes.age).to.deep.equal(["age"]);
|
|
47
|
+
});
|
|
48
|
+
it("creates table with grouped indexes", async () => {
|
|
49
|
+
class TestTable extends table_1.Table {
|
|
50
|
+
name;
|
|
51
|
+
email;
|
|
52
|
+
age;
|
|
53
|
+
}
|
|
54
|
+
__decorate([
|
|
55
|
+
(0, table_1.Index)({ group: "user_search" }),
|
|
56
|
+
__metadata("design:type", String)
|
|
57
|
+
], TestTable.prototype, "name", void 0);
|
|
58
|
+
__decorate([
|
|
59
|
+
(0, table_1.Index)({ group: "user_search" }),
|
|
60
|
+
__metadata("design:type", String)
|
|
61
|
+
], TestTable.prototype, "email", void 0);
|
|
62
|
+
__decorate([
|
|
63
|
+
(0, table_1.Index)({ group: "age_range" }),
|
|
64
|
+
__metadata("design:type", Number)
|
|
65
|
+
], TestTable.prototype, "age", void 0);
|
|
66
|
+
const metadata = (0, common_2.getMetadata)(TestTable, common_2.DatumStaticMetadata);
|
|
67
|
+
(0, chai_1.expect)(metadata.primary).to.equal("_id");
|
|
68
|
+
(0, chai_1.expect)(metadata.indexes.user_search).to.deep.equal(["name", "email"]);
|
|
69
|
+
(0, chai_1.expect)(metadata.indexes.age_range).to.deep.equal(["age"]);
|
|
70
|
+
});
|
|
71
|
+
it("creates table with fixture data", async () => {
|
|
72
|
+
const testData = [
|
|
73
|
+
{ id: "1", name: "Test User 1" },
|
|
74
|
+
{ id: "2", name: "Test User 2" },
|
|
75
|
+
];
|
|
76
|
+
let TestTable = class TestTable extends table_1.Table {
|
|
77
|
+
name;
|
|
78
|
+
};
|
|
79
|
+
TestTable = __decorate([
|
|
80
|
+
(0, table_1.Fixture)(() => testData)
|
|
81
|
+
], TestTable);
|
|
82
|
+
const metadata = (0, common_2.getMetadata)(TestTable, common_2.DatumStaticMetadata);
|
|
83
|
+
(0, chai_1.expect)(metadata.generator).to.be.a("function");
|
|
84
|
+
(0, chai_1.expect)(metadata.primary).to.equal("_id");
|
|
85
|
+
});
|
|
86
|
+
it("combines table with mixins", async () => {
|
|
87
|
+
class TestMixin {
|
|
88
|
+
testMethodUnunvailable() {
|
|
89
|
+
return "This method should be undefined";
|
|
90
|
+
}
|
|
91
|
+
[common_1.MixinSymbol] = class {
|
|
92
|
+
testMethod() {
|
|
93
|
+
return "mixin method ok";
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
class TestTable extends table_1.Table.with(TestMixin) {
|
|
98
|
+
name;
|
|
99
|
+
}
|
|
100
|
+
const instance = new TestTable();
|
|
101
|
+
(0, chai_1.expect)(instance).to.have.property("testMethod");
|
|
102
|
+
(0, chai_1.expect)(instance.testMethod()).to.equal("mixin method ok");
|
|
103
|
+
(0, chai_1.expect)(instance).to.not.have.property("testMethodUnunvailable");
|
|
104
|
+
(0, chai_1.expect)(instance).to.have.property("name");
|
|
105
|
+
(0, chai_1.expect)(instance).to.be.instanceOf(TestTable);
|
|
106
|
+
});
|
|
23
107
|
});
|
|
24
|
-
async function CreateTableWithDefaultPrimaryKeyTest() {
|
|
25
|
-
class TestTable extends table_1.Table {
|
|
26
|
-
name;
|
|
27
|
-
}
|
|
28
|
-
__decorate([
|
|
29
|
-
(0, table_1.Index)(),
|
|
30
|
-
__metadata("design:type", String)
|
|
31
|
-
], TestTable.prototype, "name", void 0);
|
|
32
|
-
const metadata = (0, common_2.getMetadata)(TestTable, common_2.DatumStaticMetadata);
|
|
33
|
-
(0, chai_1.expect)(metadata.primary).to.equal("_id");
|
|
34
|
-
(0, chai_1.expect)(metadata.indexes.name).to.deep.equal(["name"]);
|
|
35
|
-
}
|
|
36
|
-
async function CreateTableWithMultipleIndexesTest() {
|
|
37
|
-
class TestTable extends table_1.Table {
|
|
38
|
-
email;
|
|
39
|
-
age;
|
|
40
|
-
}
|
|
41
|
-
__decorate([
|
|
42
|
-
(0, table_1.Index)(),
|
|
43
|
-
__metadata("design:type", String)
|
|
44
|
-
], TestTable.prototype, "email", void 0);
|
|
45
|
-
__decorate([
|
|
46
|
-
(0, table_1.Index)(),
|
|
47
|
-
__metadata("design:type", Number)
|
|
48
|
-
], TestTable.prototype, "age", void 0);
|
|
49
|
-
const metadata = (0, common_2.getMetadata)(TestTable, common_2.DatumStaticMetadata);
|
|
50
|
-
(0, chai_1.expect)(metadata.primary).to.equal("_id");
|
|
51
|
-
(0, chai_1.expect)(metadata.indexes.email).to.deep.equal(["email"]);
|
|
52
|
-
(0, chai_1.expect)(metadata.indexes.age).to.deep.equal(["age"]);
|
|
53
|
-
}
|
|
54
|
-
async function CreateTableWithGroupedIndexesTest() {
|
|
55
|
-
class TestTable extends table_1.Table {
|
|
56
|
-
name;
|
|
57
|
-
email;
|
|
58
|
-
age;
|
|
59
|
-
}
|
|
60
|
-
__decorate([
|
|
61
|
-
(0, table_1.Index)({ group: "user_search" }),
|
|
62
|
-
__metadata("design:type", String)
|
|
63
|
-
], TestTable.prototype, "name", void 0);
|
|
64
|
-
__decorate([
|
|
65
|
-
(0, table_1.Index)({ group: "user_search" }),
|
|
66
|
-
__metadata("design:type", String)
|
|
67
|
-
], TestTable.prototype, "email", void 0);
|
|
68
|
-
__decorate([
|
|
69
|
-
(0, table_1.Index)({ group: "age_range" }),
|
|
70
|
-
__metadata("design:type", Number)
|
|
71
|
-
], TestTable.prototype, "age", void 0);
|
|
72
|
-
const metadata = (0, common_2.getMetadata)(TestTable, common_2.DatumStaticMetadata);
|
|
73
|
-
(0, chai_1.expect)(metadata.primary).to.equal("_id");
|
|
74
|
-
(0, chai_1.expect)(metadata.indexes.user_search).to.deep.equal(["name", "email"]);
|
|
75
|
-
(0, chai_1.expect)(metadata.indexes.age_range).to.deep.equal(["age"]);
|
|
76
|
-
}
|
|
77
|
-
async function CreateTableWithFixtureDataTest() {
|
|
78
|
-
const testData = [
|
|
79
|
-
{ id: "1", name: "Test User 1" },
|
|
80
|
-
{ id: "2", name: "Test User 2" },
|
|
81
|
-
];
|
|
82
|
-
let TestTable = class TestTable extends table_1.Table {
|
|
83
|
-
name;
|
|
84
|
-
};
|
|
85
|
-
TestTable = __decorate([
|
|
86
|
-
(0, table_1.Fixture)(() => testData)
|
|
87
|
-
], TestTable);
|
|
88
|
-
const metadata = (0, common_2.getMetadata)(TestTable, common_2.DatumStaticMetadata);
|
|
89
|
-
(0, chai_1.expect)(metadata.generator).to.be.a("function");
|
|
90
|
-
(0, chai_1.expect)(metadata.primary).to.equal("_id");
|
|
91
|
-
}
|
|
92
108
|
describe("Table - @Field decorator", () => {
|
|
93
|
-
it("stores a string-token type on metadata.fields", () =>
|
|
94
|
-
|
|
95
|
-
it("stacks with @Index", () => StacksWithIndexTest());
|
|
96
|
-
});
|
|
97
|
-
function StoresStringTokenFieldTest() {
|
|
98
|
-
class _T extends table_1.Table {
|
|
99
|
-
}
|
|
100
|
-
__decorate([
|
|
101
|
-
(0, table_1.Field)("string"),
|
|
102
|
-
__metadata("design:type", String)
|
|
103
|
-
], _T.prototype, "name", void 0);
|
|
104
|
-
const metadata = (0, common_2.getMetadata)(_T, common_2.DatumStaticMetadata);
|
|
105
|
-
(0, chai_1.expect)(metadata.fields.name).to.equal("string");
|
|
106
|
-
}
|
|
107
|
-
function StoresCodecFieldTest() {
|
|
108
|
-
class _T extends table_1.Table {
|
|
109
|
-
}
|
|
110
|
-
__decorate([
|
|
111
|
-
(0, table_1.Field)((0, codec_helpers_1.asFieldType)(codec_helpers_1.stringCodec)),
|
|
112
|
-
__metadata("design:type", String)
|
|
113
|
-
], _T.prototype, "name", void 0);
|
|
114
|
-
const metadata = (0, common_2.getMetadata)(_T, common_2.DatumStaticMetadata);
|
|
115
|
-
(0, chai_1.expect)(metadata.fields.name).to.equal(codec_helpers_1.stringCodec);
|
|
116
|
-
}
|
|
117
|
-
function StacksWithIndexTest() {
|
|
118
|
-
class _T extends table_1.Table {
|
|
119
|
-
}
|
|
120
|
-
__decorate([
|
|
121
|
-
(0, table_1.Index)(),
|
|
122
|
-
(0, table_1.Field)("string"),
|
|
123
|
-
__metadata("design:type", String)
|
|
124
|
-
], _T.prototype, "email", void 0);
|
|
125
|
-
const metadata = (0, common_2.getMetadata)(_T, common_2.DatumStaticMetadata);
|
|
126
|
-
(0, chai_1.expect)(metadata.fields.email).to.equal("string");
|
|
127
|
-
(0, chai_1.expect)(metadata.indexes.email).to.deep.equal(["email"]);
|
|
128
|
-
}
|
|
129
|
-
async function CombineTableWithMixinsTest() {
|
|
130
|
-
class TestMixin {
|
|
131
|
-
testMethodUnunvailable() {
|
|
132
|
-
return "This method should be undefined";
|
|
109
|
+
it("stores a string-token type on metadata.fields", () => {
|
|
110
|
+
class _T extends table_1.Table {
|
|
133
111
|
}
|
|
134
|
-
[
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
112
|
+
__decorate([
|
|
113
|
+
(0, table_1.Field)("string"),
|
|
114
|
+
__metadata("design:type", String)
|
|
115
|
+
], _T.prototype, "name", void 0);
|
|
116
|
+
const metadata = (0, common_2.getMetadata)(_T, common_2.DatumStaticMetadata);
|
|
117
|
+
(0, chai_1.expect)(metadata.fields.name).to.equal("string");
|
|
118
|
+
});
|
|
119
|
+
it("stores an io-ts codec on metadata.fields", () => {
|
|
120
|
+
class _T extends table_1.Table {
|
|
121
|
+
}
|
|
122
|
+
__decorate([
|
|
123
|
+
(0, table_1.Field)((0, codec_helpers_1.asFieldType)(codec_helpers_1.stringCodec)),
|
|
124
|
+
__metadata("design:type", String)
|
|
125
|
+
], _T.prototype, "name", void 0);
|
|
126
|
+
const metadata = (0, common_2.getMetadata)(_T, common_2.DatumStaticMetadata);
|
|
127
|
+
(0, chai_1.expect)(metadata.fields.name).to.equal(codec_helpers_1.stringCodec);
|
|
128
|
+
});
|
|
129
|
+
it("stacks with @Index", () => {
|
|
130
|
+
class _T extends table_1.Table {
|
|
131
|
+
}
|
|
132
|
+
__decorate([
|
|
133
|
+
(0, table_1.Index)(),
|
|
134
|
+
(0, table_1.Field)("string"),
|
|
135
|
+
__metadata("design:type", String)
|
|
136
|
+
], _T.prototype, "email", void 0);
|
|
137
|
+
const metadata = (0, common_2.getMetadata)(_T, common_2.DatumStaticMetadata);
|
|
138
|
+
(0, chai_1.expect)(metadata.fields.email).to.equal("string");
|
|
139
|
+
(0, chai_1.expect)(metadata.indexes.email).to.deep.equal(["email"]);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
150
142
|
//# sourceMappingURL=table.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.test.js","sourceRoot":"","sources":["../../src/tests/table.test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,+BAA8B;AAC9B,
|
|
1
|
+
{"version":3,"file":"table.test.js","sourceRoot":"","sources":["../../src/tests/table.test.ts"],"names":[],"mappings":"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"}
|
package/docs/1.introduction.md
CHANGED
|
@@ -1,8 +1,62 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Define tables and work with models
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Use `@antelopejs/interface-database-decorators` to describe tables with TypeScript classes and work with converted records through models. It builds on AQL (`@antelopejs/interface-database`) and adds field modifiers and API model injection.
|
|
6
|
+
|
|
7
|
+
## From a table class to a stored record
|
|
8
|
+
|
|
9
|
+
1. **Describe the table.** Extend `Table`, declare fields and indexes, and register the class with `@RegisterTable("users", "myapp")`. See [table definitions](./2.table-definitions.md).
|
|
10
|
+
2. **Bind the schema.** Import the table declarations, then call `await RegisterSchema("myapp")` from their declaring module. This requires a configured database provider and can provision tables and insert fixtures; it is not a read-only metadata operation.
|
|
11
|
+
3. **Create the model.** Use `BasicDataModel(User)` and a `SchemaInstance`, or `GetModel` after the table has been bound. See [data models](./4.data-models.md).
|
|
12
|
+
4. **Write and read through the model.** Model operations apply conversion and modifier events. Use `model.table` when you need to compose an AQL query yourself.
|
|
13
|
+
|
|
14
|
+
Keep schema IDs and instance IDs distinct: `myapp` identifies the table definitions; an instance ID selects the database instance used by a model. A table class without a schema binding cannot be resolved by `GetModel`.
|
|
15
|
+
|
|
16
|
+
### Save and retrieve a note
|
|
17
|
+
|
|
18
|
+
In a module with a configured database provider, import this declaration before calling `tryNote()` during initialization. Use a disposable development database: `RegisterSchema` provisions the schema, and `insert` writes data.
|
|
19
|
+
|
|
20
|
+
```ts docs-check
|
|
21
|
+
import {
|
|
22
|
+
BasicDataModel,
|
|
23
|
+
Field,
|
|
24
|
+
GetModel,
|
|
25
|
+
RegisterSchema,
|
|
26
|
+
RegisterTable,
|
|
27
|
+
Table,
|
|
28
|
+
} from "@antelopejs/interface-database-decorators";
|
|
29
|
+
|
|
30
|
+
@RegisterTable("notes", "notes-demo")
|
|
31
|
+
class Note extends Table {
|
|
32
|
+
@Field("string")
|
|
33
|
+
declare title: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
class NoteModel extends BasicDataModel(Note) {}
|
|
37
|
+
|
|
38
|
+
export async function tryNote() {
|
|
39
|
+
await RegisterSchema("notes-demo");
|
|
40
|
+
const notes = GetModel(NoteModel);
|
|
41
|
+
const [id] = await notes.insert({ title: "Learn models" });
|
|
42
|
+
const saved = await notes.get(id);
|
|
43
|
+
if (!saved) throw new Error("The inserted note was not found");
|
|
44
|
+
return saved.title; // "Learn models"
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
The model uses the default instance of the schema bound to `Note`. Keep the inserted ID when extending this exercise with `update` or `delete`; each successful run inserts a new note. In an application, register the schema once during initialization rather than on each request.
|
|
49
|
+
|
|
50
|
+
## Choose the layer for your task
|
|
51
|
+
|
|
52
|
+
| Task | Layer | Important boundary |
|
|
53
|
+
| ----------------------------------- | --------------------------------------------------- | ---------------------------------------------------------------- |
|
|
54
|
+
| Describe storage fields and indexes | [Table definitions](./2.table-definitions.md) | Declaring a class is separate from registering its schema. |
|
|
55
|
+
| Encrypt, hash, or localize fields | [Table modifiers](./3.table-modifiers.md) | Conversion events determine when transformations run. |
|
|
56
|
+
| Read or write converted records | [Data models](./4.data-models.md) | Reads return converted records, not chainable queries. |
|
|
57
|
+
| Select a model in an HTTP request | [Parameter decoration](./5.parameter-decoration.md) | The instance ID selects a binding; it does not authorize access. |
|
|
58
|
+
|
|
59
|
+
Start without modifiers until the schema and model work together. Add validation explicitly: string-token `@Field` declarations describe storage, while codec validation requires codecs and the model's validation options.
|
|
6
60
|
|
|
7
61
|
## Dependencies
|
|
8
62
|
|
|
@@ -70,6 +70,7 @@ class User extends Table {
|
|
|
70
70
|
| --------------- | --------- | ------------------------------------------------------------------- |
|
|
71
71
|
| `group` | `string` | Assign the field to a named compound index group. |
|
|
72
72
|
| `crossInstance` | `boolean` | Also keep the index fast for queries that run across all instances. |
|
|
73
|
+
| `unique` | `boolean` | Refuse two rows of the instance with the same key. |
|
|
73
74
|
|
|
74
75
|
### Cross-Instance Indexes
|
|
75
76
|
|
|
@@ -87,6 +88,20 @@ class User extends Table {
|
|
|
87
88
|
|
|
88
89
|
For a compound index, setting `crossInstance: true` on any field of the group applies it to the whole group.
|
|
89
90
|
|
|
91
|
+
### Unique Indexes
|
|
92
|
+
|
|
93
|
+
Set `unique: true` to refuse a second row with the same key in one instance. The write that would store it throws `DuplicateKeyError` from `@antelopejs/interface-database`, naming the index and its fields; test it with `IsDuplicateKeyError`. Rows of different instances may share a key.
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
class Template extends Table {
|
|
97
|
+
@Index({ unique: true })
|
|
98
|
+
@Field("string")
|
|
99
|
+
declare slug: string;
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
For a compound index, setting `unique: true` on any field of the group makes the whole group's key unique. Not every database module can enforce unique secondary indexes: one that cannot refuses the schema rather than ignoring the option.
|
|
104
|
+
|
|
90
105
|
### Compound Indexes
|
|
91
106
|
|
|
92
107
|
Assign multiple fields to the same index group to create a compound index:
|