@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.
Files changed (69) hide show
  1. package/README.md +1 -1
  2. package/dist/antelope.test.js +1 -1
  3. package/dist/common.d.ts +2 -1
  4. package/dist/common.js +5 -1
  5. package/dist/common.js.map +1 -1
  6. package/dist/database.js +1 -0
  7. package/dist/database.js.map +1 -1
  8. package/dist/model.js +29 -26
  9. package/dist/model.js.map +1 -1
  10. package/dist/modifiers/common.d.ts +24 -4
  11. package/dist/modifiers/common.js +92 -114
  12. package/dist/modifiers/common.js.map +1 -1
  13. package/dist/modifiers/encryption.js +14 -9
  14. package/dist/modifiers/encryption.js.map +1 -1
  15. package/dist/modifiers/internal/kinds.d.ts +12 -0
  16. package/dist/modifiers/internal/kinds.js +29 -0
  17. package/dist/modifiers/internal/kinds.js.map +1 -0
  18. package/dist/modifiers/internal/records.d.ts +29 -0
  19. package/dist/modifiers/internal/records.js +42 -0
  20. package/dist/modifiers/internal/records.js.map +1 -0
  21. package/dist/modifiers/localization.d.ts +19 -1
  22. package/dist/modifiers/localization.js +41 -6
  23. package/dist/modifiers/localization.js.map +1 -1
  24. package/dist/schema.js +1 -2
  25. package/dist/schema.js.map +1 -1
  26. package/dist/table.d.ts +8 -0
  27. package/dist/table.js +21 -6
  28. package/dist/table.js.map +1 -1
  29. package/dist/tests/codec_helpers.d.ts +6 -2
  30. package/dist/tests/codec_helpers.js +18 -14
  31. package/dist/tests/codec_helpers.js.map +1 -1
  32. package/dist/tests/common.test.js +38 -46
  33. package/dist/tests/common.test.js.map +1 -1
  34. package/dist/tests/cross_instance.test.js +27 -2
  35. package/dist/tests/cross_instance.test.js.map +1 -1
  36. package/dist/tests/database.test.js +247 -226
  37. package/dist/tests/database.test.js.map +1 -1
  38. package/dist/tests/helpers/other-instance.d.ts +1 -1
  39. package/dist/tests/helpers/other-instance.js +41 -9
  40. package/dist/tests/helpers/other-instance.js.map +1 -1
  41. package/dist/tests/integration.test.js +485 -469
  42. package/dist/tests/integration.test.js.map +1 -1
  43. package/dist/tests/model.test.js +293 -308
  44. package/dist/tests/model.test.js.map +1 -1
  45. package/dist/tests/modifiers/autodate.test.js +80 -86
  46. package/dist/tests/modifiers/autodate.test.js.map +1 -1
  47. package/dist/tests/modifiers/common.test.js +181 -195
  48. package/dist/tests/modifiers/common.test.js.map +1 -1
  49. package/dist/tests/modifiers/encryption.test.js +149 -155
  50. package/dist/tests/modifiers/encryption.test.js.map +1 -1
  51. package/dist/tests/modifiers/hash.test.js +91 -99
  52. package/dist/tests/modifiers/hash.test.js.map +1 -1
  53. package/dist/tests/modifiers/localization.test.js +186 -159
  54. package/dist/tests/modifiers/localization.test.js.map +1 -1
  55. package/dist/tests/relation.test.js +92 -97
  56. package/dist/tests/relation.test.js.map +1 -1
  57. package/dist/tests/schema.test.js +101 -106
  58. package/dist/tests/schema.test.js.map +1 -1
  59. package/dist/tests/table.test.js +124 -132
  60. package/dist/tests/table.test.js.map +1 -1
  61. package/docs/1.introduction.md +56 -2
  62. package/docs/2.table-definitions.md +15 -0
  63. package/docs/3.table-modifiers.md +10 -4
  64. package/docs/4.data-models.md +12 -0
  65. package/docs/5.parameter-decoration.md +4 -0
  66. package/docs/assets/model-conversion.svg +21 -0
  67. package/package.json +16 -5
  68. package/skills/database-decorators-interface/SKILL.md +4 -0
  69. 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("@antelopejs/interface-database-decorators/table");
14
- const common_1 = require("@antelopejs/interface-database-decorators/common");
15
- const schema_1 = require("@antelopejs/interface-database-decorators/schema");
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 () => StoreTableNameAndSchemaNameInMetadataTest());
18
- it("stores tableName for multiple classes", async () => StoreTableNameForMultipleClassesTest());
19
- it("preserves existing metadata", async () => PreserveExistingMetadataTest());
20
- it("registers tables in schema registry", async () => RegisterTablesInSchemaRegistryTest());
21
- it("returns undefined for unknown schema", async () => ReturnUndefinedForUnknownSchemaTest());
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":"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"}
1
+ {"version":3,"file":"schema.test.js","sourceRoot":"","sources":["../../src/tests/schema.test.ts"],"names":[],"mappings":"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"}
@@ -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("@antelopejs/interface-database-decorators/modifiers/common");
14
- const table_1 = require("@antelopejs/interface-database-decorators/table");
15
- const common_2 = require("@antelopejs/interface-database-decorators/common");
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 () => CreateTableWithDefaultPrimaryKeyTest());
19
- it("creates table with multiple indexes", async () => CreateTableWithMultipleIndexesTest());
20
- it("creates table with grouped indexes", async () => CreateTableWithGroupedIndexesTest());
21
- it("creates table with fixture data", async () => CreateTableWithFixtureDataTest());
22
- it("combines table with mixins", async () => CombineTableWithMixinsTest());
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", () => StoresStringTokenFieldTest());
94
- it("stores an io-ts codec on metadata.fields", () => StoresCodecFieldTest());
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
- [common_1.MixinSymbol] = class {
135
- testMethod() {
136
- return "mixin method ok";
137
- }
138
- };
139
- }
140
- class TestTable extends table_1.Table.with(TestMixin) {
141
- name;
142
- }
143
- const instance = new TestTable();
144
- (0, chai_1.expect)(instance).to.have.property("testMethod");
145
- (0, chai_1.expect)(instance.testMethod()).to.equal("mixin method ok");
146
- (0, chai_1.expect)(instance).to.not.have.property("testMethodUnunvailable");
147
- (0, chai_1.expect)(instance).to.have.property("name");
148
- (0, chai_1.expect)(instance).to.be.instanceOf(TestTable);
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":"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"}
1
+ {"version":3,"file":"table.test.js","sourceRoot":"","sources":["../../src/tests/table.test.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,62 @@
1
- # Interface Database Decorators
1
+ # Define tables and work with models
2
2
 
3
3
  ## Overview
4
4
 
5
- The Interface Database Decorators package provides a structured, decorator-based framework for defining database tables, applying field-level modifiers (encryption, hashing, localization), building data models with CRUD operations, and injecting models into API controllers. It builds on top of the `@antelopejs/interface-database` package and integrates with the `@antelopejs/interface-api` package for controller parameter injection.
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: