@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
@@ -11,318 +11,303 @@ var __metadata = (this && this.__metadata) || function (k, v) {
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  const chai_1 = require("chai");
13
13
  const interface_database_1 = require("@antelopejs/interface-database");
14
- const table_1 = require("@antelopejs/interface-database-decorators/table");
15
- const schema_1 = require("@antelopejs/interface-database-decorators/schema");
16
- const database_1 = require("@antelopejs/interface-database-decorators/database");
14
+ const table_1 = require("../table");
15
+ const schema_1 = require("../schema");
16
+ const database_1 = require("../database");
17
17
  const interface_api_1 = require("@antelopejs/interface-api");
18
- const model_1 = require("@antelopejs/interface-database-decorators/model");
18
+ const model_1 = require("../model");
19
19
  const codec_helpers_1 = require("./codec_helpers");
20
20
  describe("Model - data operations", () => {
21
- it("creates basic data model", async () => CreateBasicDataModelTest());
22
- it("creates basic data model from metadata", async () => CreateBasicDataModelFromMetadataTest());
23
- it("converts plain data to table instance", async () => ConvertPlainDataToTableTest());
24
- it("converts database data to table instance", async () => ConvertDatabaseDataToTableTest());
25
- it("converts table instance to database data", async () => ConvertTableToDatabaseDataTest());
26
- it("handles null database data", async () => HandleNullDatabaseDataTest());
27
- it("gets model from cache", async () => GetModelFromCacheTest());
28
- it("creates new model when not cached", async () => CreateNewModelWhenNotCachedTest());
29
- it("handles model with string instance id", async () => HandleModelWithStringInstanceIdTest());
30
- it("handles model with callback instance id", async () => HandleModelWithCallbackInstanceIdTest());
31
- });
32
- describe("Model - validate", () => {
33
- it("returns ok for valid input", () => ValidateOkTest());
34
- it("returns errors for invalid input", () => ValidateErrorsTest());
35
- it("returns ok for unannotated tables", () => ValidateUnannotatedTest());
36
- it("skips string-token fields", () => ValidateSkipsStringTokensTest());
37
- it("rejects partial input by default", () => ValidatePartialDefaultsToStrictTest());
38
- it("accepts partial input with partial:true", () => ValidatePartialModeAcceptsAbsentTest());
39
- it("still rejects present-but-invalid fields in partial mode", () => ValidatePartialModeChecksPresentFieldsTest());
21
+ it("creates basic data model", async () => {
22
+ class TestTable extends table_1.Table {
23
+ name;
24
+ age;
25
+ }
26
+ const TestModel = (0, model_1.BasicDataModel)(TestTable, "test_table");
27
+ (0, chai_1.expect)(TestModel).to.be.a("function");
28
+ (0, chai_1.expect)(TestModel.name).to.equal("Model");
29
+ });
30
+ it("creates basic data model from metadata", async () => {
31
+ let TestTable = class TestTable extends table_1.Table {
32
+ name;
33
+ };
34
+ TestTable = __decorate([
35
+ (0, schema_1.RegisterTable)("meta_table", "model-meta-schema")
36
+ ], TestTable);
37
+ const TestModel = (0, model_1.BasicDataModel)(TestTable);
38
+ (0, chai_1.expect)(TestModel).to.be.a("function");
39
+ (0, chai_1.expect)(TestModel.name).to.equal("Model");
40
+ });
41
+ it("converts plain data to table instance", async () => {
42
+ class TestTable extends table_1.Table {
43
+ name;
44
+ age;
45
+ }
46
+ const TestModel = (0, model_1.BasicDataModel)(TestTable, "test_table");
47
+ const plainData = { _id: "1", name: "John", age: 30 };
48
+ const instance = TestModel.fromPlainData(plainData);
49
+ (0, chai_1.expect)(instance).to.be.instanceOf(TestTable);
50
+ (0, chai_1.expect)(instance._id).to.equal("1");
51
+ (0, chai_1.expect)(instance.name).to.equal("John");
52
+ (0, chai_1.expect)(instance.age).to.equal(30);
53
+ });
54
+ it("converts database data to table instance", async () => {
55
+ class TestTable extends table_1.Table {
56
+ name;
57
+ age;
58
+ }
59
+ const TestModel = (0, model_1.BasicDataModel)(TestTable, "test_table");
60
+ const dbData = { _id: "123", name: "John", age: 30 };
61
+ const instance = TestModel.fromDatabase(dbData);
62
+ (0, chai_1.expect)(instance).to.be.instanceOf(TestTable);
63
+ (0, chai_1.expect)(instance?.name).to.equal("John");
64
+ (0, chai_1.expect)(instance?.age).to.equal(30);
65
+ });
66
+ it("converts table instance to database data", async () => {
67
+ class TestTable extends table_1.Table {
68
+ name;
69
+ age;
70
+ }
71
+ const TestModel = (0, model_1.BasicDataModel)(TestTable, "test_table");
72
+ const instance = new TestTable();
73
+ instance._id = "1";
74
+ instance.name = "John";
75
+ instance.age = 30;
76
+ const dbData = TestModel.toDatabase(instance);
77
+ (0, chai_1.expect)(dbData._id).to.equal("1");
78
+ (0, chai_1.expect)(dbData.name).to.equal("John");
79
+ (0, chai_1.expect)(dbData.age).to.equal(30);
80
+ });
81
+ it("handles null database data", async () => {
82
+ class TestTable extends table_1.Table {
83
+ name;
84
+ }
85
+ const TestModel = (0, model_1.BasicDataModel)(TestTable, "test_table");
86
+ const instance = TestModel.fromDatabase(null);
87
+ (0, chai_1.expect)(instance).to.equal(undefined);
88
+ });
40
89
  });
41
- function ValidateOkTest() {
42
- let _T = class _T extends table_1.Table {
43
- };
44
- __decorate([
45
- (0, table_1.Field)((0, codec_helpers_1.asFieldType)(codec_helpers_1.stringCodec)),
46
- __metadata("design:type", String)
47
- ], _T.prototype, "name", void 0);
48
- __decorate([
49
- (0, table_1.Field)((0, codec_helpers_1.asFieldType)(codec_helpers_1.numberCodec)),
50
- __metadata("design:type", Number)
51
- ], _T.prototype, "age", void 0);
52
- _T = __decorate([
53
- (0, schema_1.RegisterTable)("v_ok", "model-validate-schema")
54
- ], _T);
55
- const TM = (0, model_1.BasicDataModel)(_T, "v_ok");
56
- const result = TM.validate({ name: "Alice", age: 30 });
57
- (0, chai_1.expect)(result.ok).to.equal(true);
58
- }
59
- function ValidateErrorsTest() {
60
- let _T = class _T extends table_1.Table {
61
- };
62
- __decorate([
63
- (0, table_1.Field)((0, codec_helpers_1.asFieldType)(codec_helpers_1.stringCodec)),
64
- __metadata("design:type", String)
65
- ], _T.prototype, "name", void 0);
66
- __decorate([
67
- (0, table_1.Field)((0, codec_helpers_1.asFieldType)(codec_helpers_1.numberCodec)),
68
- __metadata("design:type", Number)
69
- ], _T.prototype, "age", void 0);
70
- _T = __decorate([
71
- (0, schema_1.RegisterTable)("v_err", "model-validate-schema")
72
- ], _T);
73
- const TM = (0, model_1.BasicDataModel)(_T, "v_err");
74
- const result = TM.validate({ name: 42, age: "old" });
75
- (0, chai_1.expect)(result.ok).to.equal(false);
76
- if (result.ok)
77
- throw new Error("expected failure branch");
78
- const fields = result.errors.map((e) => e.field).sort();
79
- (0, chai_1.expect)(fields).to.deep.equal(["age", "name"]);
80
- }
81
- function ValidateUnannotatedTest() {
82
- let _T = class _T extends table_1.Table {
83
- };
84
- _T = __decorate([
85
- (0, schema_1.RegisterTable)("v_un", "model-validate-schema")
86
- ], _T);
87
- const TM = (0, model_1.BasicDataModel)(_T, "v_un");
88
- (0, chai_1.expect)(TM.validate({ name: "anything" }).ok).to.equal(true);
89
- (0, chai_1.expect)(TM.validate({}).ok).to.equal(true);
90
- }
91
- function ValidateSkipsStringTokensTest() {
92
- let _T = class _T extends table_1.Table {
93
- };
94
- __decorate([
95
- (0, table_1.Field)("string"),
96
- __metadata("design:type", String)
97
- ], _T.prototype, "name", void 0);
98
- __decorate([
99
- (0, table_1.Field)((0, codec_helpers_1.asFieldType)(codec_helpers_1.numberCodec)),
100
- __metadata("design:type", Number)
101
- ], _T.prototype, "age", void 0);
102
- _T = __decorate([
103
- (0, schema_1.RegisterTable)("v_skip", "model-validate-schema")
104
- ], _T);
105
- const TM = (0, model_1.BasicDataModel)(_T, "v_skip");
106
- (0, chai_1.expect)(TM.validate({ name: 123, age: 4 }).ok).to.equal(true);
107
- (0, chai_1.expect)(TM.validate({ name: "n", age: "bad" }).ok).to.equal(false);
108
- }
109
- function ValidatePartialDefaultsToStrictTest() {
110
- let _T = class _T extends table_1.Table {
111
- };
112
- __decorate([
113
- (0, table_1.Field)((0, codec_helpers_1.asFieldType)(codec_helpers_1.stringCodec)),
114
- __metadata("design:type", String)
115
- ], _T.prototype, "name", void 0);
116
- __decorate([
117
- (0, table_1.Field)((0, codec_helpers_1.asFieldType)(codec_helpers_1.numberCodec)),
118
- __metadata("design:type", Number)
119
- ], _T.prototype, "age", void 0);
120
- _T = __decorate([
121
- (0, schema_1.RegisterTable)("v_partial_strict", "model-validate-schema")
122
- ], _T);
123
- const TM = (0, model_1.BasicDataModel)(_T, "v_partial_strict");
124
- const result = TM.validate({ name: "Alice" });
125
- (0, chai_1.expect)(result.ok).to.equal(false);
126
- if (result.ok)
127
- throw new Error("expected failure branch");
128
- (0, chai_1.expect)(result.errors.map((e) => e.field)).to.deep.equal(["age"]);
129
- }
130
- function ValidatePartialModeAcceptsAbsentTest() {
131
- let _T = class _T extends table_1.Table {
132
- };
133
- __decorate([
134
- (0, table_1.Field)((0, codec_helpers_1.asFieldType)(codec_helpers_1.stringCodec)),
135
- __metadata("design:type", String)
136
- ], _T.prototype, "name", void 0);
137
- __decorate([
138
- (0, table_1.Field)((0, codec_helpers_1.asFieldType)(codec_helpers_1.numberCodec)),
139
- __metadata("design:type", Number)
140
- ], _T.prototype, "age", void 0);
141
- _T = __decorate([
142
- (0, schema_1.RegisterTable)("v_partial_accept", "model-validate-schema")
143
- ], _T);
144
- const TM = (0, model_1.BasicDataModel)(_T, "v_partial_accept");
145
- (0, chai_1.expect)(TM.validate({ name: "Alice" }, { partial: true }).ok).to.equal(true);
146
- (0, chai_1.expect)(TM.validate({}, { partial: true }).ok).to.equal(true);
147
- }
148
- function ValidatePartialModeChecksPresentFieldsTest() {
149
- let _T = class _T extends table_1.Table {
150
- };
151
- __decorate([
152
- (0, table_1.Field)((0, codec_helpers_1.asFieldType)(codec_helpers_1.stringCodec)),
153
- __metadata("design:type", String)
154
- ], _T.prototype, "name", void 0);
155
- __decorate([
156
- (0, table_1.Field)((0, codec_helpers_1.asFieldType)(codec_helpers_1.numberCodec)),
157
- __metadata("design:type", Number)
158
- ], _T.prototype, "age", void 0);
159
- _T = __decorate([
160
- (0, schema_1.RegisterTable)("v_partial_check", "model-validate-schema")
161
- ], _T);
162
- const TM = (0, model_1.BasicDataModel)(_T, "v_partial_check");
163
- const result = TM.validate({ age: "old" }, { partial: true });
164
- (0, chai_1.expect)(result.ok).to.equal(false);
165
- if (result.ok)
166
- throw new Error("expected failure branch");
167
- (0, chai_1.expect)(result.errors.map((e) => e.field)).to.deep.equal(["age"]);
168
- }
169
- async function CreateBasicDataModelTest() {
170
- class TestTable extends table_1.Table {
171
- name;
172
- age;
173
- }
174
- const TestModel = (0, model_1.BasicDataModel)(TestTable, "test_table");
175
- (0, chai_1.expect)(TestModel).to.be.a("function");
176
- (0, chai_1.expect)(TestModel.name).to.equal("Model");
177
- }
178
- async function CreateBasicDataModelFromMetadataTest() {
179
- let TestTable = class TestTable extends table_1.Table {
180
- name;
181
- };
182
- TestTable = __decorate([
183
- (0, schema_1.RegisterTable)("meta_table", "model-meta-schema")
184
- ], TestTable);
185
- const TestModel = (0, model_1.BasicDataModel)(TestTable);
186
- (0, chai_1.expect)(TestModel).to.be.a("function");
187
- (0, chai_1.expect)(TestModel.name).to.equal("Model");
188
- }
189
- async function ConvertPlainDataToTableTest() {
190
- class TestTable extends table_1.Table {
191
- name;
192
- age;
193
- }
194
- const TestModel = (0, model_1.BasicDataModel)(TestTable, "test_table");
195
- const plainData = { _id: "1", name: "John", age: 30 };
196
- const instance = TestModel.fromPlainData(plainData);
197
- (0, chai_1.expect)(instance).to.be.instanceOf(TestTable);
198
- (0, chai_1.expect)(instance._id).to.equal("1");
199
- (0, chai_1.expect)(instance.name).to.equal("John");
200
- (0, chai_1.expect)(instance.age).to.equal(30);
201
- }
202
- async function ConvertDatabaseDataToTableTest() {
203
- class TestTable extends table_1.Table {
204
- name;
205
- age;
206
- }
207
- const TestModel = (0, model_1.BasicDataModel)(TestTable, "test_table");
208
- const dbData = { _id: "123", name: "John", age: 30 };
209
- const instance = TestModel.fromDatabase(dbData);
210
- (0, chai_1.expect)(instance).to.be.instanceOf(TestTable);
211
- (0, chai_1.expect)(instance?.name).to.equal("John");
212
- (0, chai_1.expect)(instance?.age).to.equal(30);
213
- }
214
- async function ConvertTableToDatabaseDataTest() {
215
- class TestTable extends table_1.Table {
216
- name;
217
- age;
218
- }
219
- const TestModel = (0, model_1.BasicDataModel)(TestTable, "test_table");
220
- const instance = new TestTable();
221
- instance._id = "1";
222
- instance.name = "John";
223
- instance.age = 30;
224
- const dbData = TestModel.toDatabase(instance);
225
- (0, chai_1.expect)(dbData._id).to.equal("1");
226
- (0, chai_1.expect)(dbData.name).to.equal("John");
227
- (0, chai_1.expect)(dbData.age).to.equal(30);
228
- }
229
- async function HandleNullDatabaseDataTest() {
230
- class TestTable extends table_1.Table {
231
- name;
232
- }
233
- const TestModel = (0, model_1.BasicDataModel)(TestTable, "test_table");
234
- const instance = TestModel.fromDatabase(null);
235
- (0, chai_1.expect)(instance).to.equal(undefined);
236
- }
237
- async function GetModelFromCacheTest() {
238
- let TestTable = class TestTable extends table_1.Table {
239
- name;
240
- };
241
- TestTable = __decorate([
242
- (0, schema_1.RegisterTable)("cache_table", "model-cache-schema")
243
- ], TestTable);
244
- const TestModel = (0, model_1.BasicDataModel)(TestTable, "cache_table");
245
- await (0, database_1.RegisterSchema)("model-cache-schema");
246
- const model1 = (0, model_1.GetModel)(TestModel, "test-model-cache-db");
247
- const model2 = (0, model_1.GetModel)(TestModel, "test-model-cache-db");
248
- (0, chai_1.expect)(model1).to.equal(model2);
249
- (0, chai_1.expect)(model1).to.be.instanceOf(TestModel);
250
- }
251
- async function CreateNewModelWhenNotCachedTest() {
252
- let TestTable = class TestTable extends table_1.Table {
253
- name;
254
- };
255
- TestTable = __decorate([
256
- (0, schema_1.RegisterTable)("nocache_instances", "model-nocache-schema")
257
- ], TestTable);
258
- const TestModel = (0, model_1.BasicDataModel)(TestTable, "nocache_instances");
259
- await (0, database_1.RegisterSchema)("model-nocache-schema");
260
- const instance1 = (0, model_1.GetModel)(TestModel, "instance-1");
261
- const instance2 = (0, model_1.GetModel)(TestModel, "instance-2");
262
- const cross = (0, model_1.GetModel)(TestModel, interface_database_1.CROSS_INSTANCE);
263
- (0, chai_1.expect)(instance1).to.not.equal(instance2);
264
- (0, chai_1.expect)(instance1).to.not.equal(cross);
265
- (0, chai_1.expect)(instance2).to.not.equal(cross);
266
- (0, chai_1.expect)(instance1).to.be.instanceOf(TestModel);
267
- (0, chai_1.expect)(instance2).to.be.instanceOf(TestModel);
268
- (0, chai_1.expect)(cross).to.be.instanceOf(TestModel);
269
- }
270
- async function HandleModelWithStringInstanceIdTest() {
271
- let TestTable = class TestTable extends table_1.Table {
272
- name;
273
- };
274
- TestTable = __decorate([
275
- (0, schema_1.RegisterTable)("static_table", "model-static-schema")
276
- ], TestTable);
277
- const TestModel = (0, model_1.BasicDataModel)(TestTable, "static_table");
278
- await (0, database_1.RegisterSchema)("model-static-schema");
279
- class _TestService extends (0, interface_api_1.Controller)("/staticmodel") {
280
- model;
281
- callback() {
282
- (0, chai_1.expect)("model" in this).to.equal(true);
283
- (0, chai_1.expect)(this.model).to.be.instanceOf(TestModel);
90
+ describe("Model - data operations", () => {
91
+ it("gets model from cache", async () => {
92
+ let TestTable = class TestTable extends table_1.Table {
93
+ name;
94
+ };
95
+ TestTable = __decorate([
96
+ (0, schema_1.RegisterTable)("cache_table", "model-cache-schema")
97
+ ], TestTable);
98
+ const TestModel = (0, model_1.BasicDataModel)(TestTable, "cache_table");
99
+ await (0, database_1.RegisterSchema)("model-cache-schema");
100
+ const model1 = (0, model_1.GetModel)(TestModel, "test-model-cache-db");
101
+ const model2 = (0, model_1.GetModel)(TestModel, "test-model-cache-db");
102
+ (0, chai_1.expect)(model1).to.equal(model2);
103
+ (0, chai_1.expect)(model1).to.be.instanceOf(TestModel);
104
+ });
105
+ it("creates new model when not cached", async () => {
106
+ let TestTable = class TestTable extends table_1.Table {
107
+ name;
108
+ };
109
+ TestTable = __decorate([
110
+ (0, schema_1.RegisterTable)("nocache_instances", "model-nocache-schema")
111
+ ], TestTable);
112
+ const TestModel = (0, model_1.BasicDataModel)(TestTable, "nocache_instances");
113
+ await (0, database_1.RegisterSchema)("model-nocache-schema");
114
+ const instance1 = (0, model_1.GetModel)(TestModel, "instance-1");
115
+ const instance2 = (0, model_1.GetModel)(TestModel, "instance-2");
116
+ const cross = (0, model_1.GetModel)(TestModel, interface_database_1.CROSS_INSTANCE);
117
+ (0, chai_1.expect)(instance1).to.not.equal(instance2);
118
+ (0, chai_1.expect)(instance1).to.not.equal(cross);
119
+ (0, chai_1.expect)(instance2).to.not.equal(cross);
120
+ (0, chai_1.expect)(instance1).to.be.instanceOf(TestModel);
121
+ (0, chai_1.expect)(instance2).to.be.instanceOf(TestModel);
122
+ (0, chai_1.expect)(cross).to.be.instanceOf(TestModel);
123
+ });
124
+ it("handles model with string instance id", async () => {
125
+ let TestTable = class TestTable extends table_1.Table {
126
+ name;
127
+ };
128
+ TestTable = __decorate([
129
+ (0, schema_1.RegisterTable)("static_table", "model-static-schema")
130
+ ], TestTable);
131
+ const TestModel = (0, model_1.BasicDataModel)(TestTable, "static_table");
132
+ await (0, database_1.RegisterSchema)("model-static-schema");
133
+ class _TestService extends (0, interface_api_1.Controller)("/staticmodel") {
134
+ model;
135
+ callback() {
136
+ (0, chai_1.expect)("model" in this).to.equal(true);
137
+ (0, chai_1.expect)(this.model).to.be.instanceOf(TestModel);
138
+ }
284
139
  }
285
- }
286
- __decorate([
287
- (0, model_1.Model)(TestModel, "test-static-model-db"),
288
- __metadata("design:type", void 0)
289
- ], _TestService.prototype, "model", void 0);
290
- __decorate([
291
- (0, interface_api_1.Get)("/"),
292
- __metadata("design:type", Function),
293
- __metadata("design:paramtypes", []),
294
- __metadata("design:returntype", void 0)
295
- ], _TestService.prototype, "callback", null);
296
- const res = await fetch("http://localhost:5010/staticmodel");
297
- (0, chai_1.expect)(res.status, res.statusText).to.equal(200);
298
- }
299
- async function HandleModelWithCallbackInstanceIdTest() {
300
- let TestTable = class TestTable extends table_1.Table {
301
- name;
302
- };
303
- TestTable = __decorate([
304
- (0, schema_1.RegisterTable)("dynamic_table", "model-dynamic-schema")
305
- ], TestTable);
306
- const TestModel = (0, model_1.BasicDataModel)(TestTable, "dynamic_table");
307
- await (0, database_1.RegisterSchema)("model-dynamic-schema");
308
- class _TestService extends (0, interface_api_1.Controller)("/dynamicmodel/:database") {
309
- model;
310
- callback() {
311
- (0, chai_1.expect)("model" in this).to.equal(true);
312
- (0, chai_1.expect)(this.model).to.be.instanceOf(TestModel);
140
+ __decorate([
141
+ (0, model_1.Model)(TestModel, "test-static-model-db"),
142
+ __metadata("design:type", void 0)
143
+ ], _TestService.prototype, "model", void 0);
144
+ __decorate([
145
+ (0, interface_api_1.Get)("/"),
146
+ __metadata("design:type", Function),
147
+ __metadata("design:paramtypes", []),
148
+ __metadata("design:returntype", void 0)
149
+ ], _TestService.prototype, "callback", null);
150
+ const res = await fetch("http://localhost:5010/staticmodel");
151
+ (0, chai_1.expect)(res.status, res.statusText).to.equal(200);
152
+ });
153
+ it("handles model with callback instance id", async () => {
154
+ let TestTable = class TestTable extends table_1.Table {
155
+ name;
156
+ };
157
+ TestTable = __decorate([
158
+ (0, schema_1.RegisterTable)("dynamic_table", "model-dynamic-schema")
159
+ ], TestTable);
160
+ const TestModel = (0, model_1.BasicDataModel)(TestTable, "dynamic_table");
161
+ await (0, database_1.RegisterSchema)("model-dynamic-schema");
162
+ class _TestService extends (0, interface_api_1.Controller)("/dynamicmodel/:database") {
163
+ model;
164
+ callback() {
165
+ (0, chai_1.expect)("model" in this).to.equal(true);
166
+ (0, chai_1.expect)(this.model).to.be.instanceOf(TestModel);
167
+ }
313
168
  }
314
- }
315
- __decorate([
316
- (0, model_1.Model)(TestModel, (ctx) => ctx.routeParameters.database),
317
- __metadata("design:type", void 0)
318
- ], _TestService.prototype, "model", void 0);
319
- __decorate([
320
- (0, interface_api_1.Get)("/"),
321
- __metadata("design:type", Function),
322
- __metadata("design:paramtypes", []),
323
- __metadata("design:returntype", void 0)
324
- ], _TestService.prototype, "callback", null);
325
- const res = await fetch("http://localhost:5010/dynamicmodel/test-dynamic-model-db");
326
- (0, chai_1.expect)(res.status, res.statusText).to.equal(200);
327
- }
169
+ __decorate([
170
+ (0, model_1.Model)(TestModel, (ctx) => ctx.routeParameters.database),
171
+ __metadata("design:type", void 0)
172
+ ], _TestService.prototype, "model", void 0);
173
+ __decorate([
174
+ (0, interface_api_1.Get)("/"),
175
+ __metadata("design:type", Function),
176
+ __metadata("design:paramtypes", []),
177
+ __metadata("design:returntype", void 0)
178
+ ], _TestService.prototype, "callback", null);
179
+ const res = await fetch("http://localhost:5010/dynamicmodel/test-dynamic-model-db");
180
+ (0, chai_1.expect)(res.status, res.statusText).to.equal(200);
181
+ });
182
+ });
183
+ describe("Model - validate", () => {
184
+ it("returns ok for valid input", () => {
185
+ let _T = class _T extends table_1.Table {
186
+ };
187
+ __decorate([
188
+ (0, table_1.Field)((0, codec_helpers_1.asFieldType)(codec_helpers_1.stringCodec)),
189
+ __metadata("design:type", String)
190
+ ], _T.prototype, "name", void 0);
191
+ __decorate([
192
+ (0, table_1.Field)((0, codec_helpers_1.asFieldType)(codec_helpers_1.numberCodec)),
193
+ __metadata("design:type", Number)
194
+ ], _T.prototype, "age", void 0);
195
+ _T = __decorate([
196
+ (0, schema_1.RegisterTable)("v_ok", "model-validate-schema")
197
+ ], _T);
198
+ const TM = (0, model_1.BasicDataModel)(_T, "v_ok");
199
+ const result = TM.validate({ name: "Alice", age: 30 });
200
+ (0, chai_1.expect)(result.ok).to.equal(true);
201
+ });
202
+ it("returns errors for invalid input", () => {
203
+ let _T = class _T extends table_1.Table {
204
+ };
205
+ __decorate([
206
+ (0, table_1.Field)((0, codec_helpers_1.asFieldType)(codec_helpers_1.stringCodec)),
207
+ __metadata("design:type", String)
208
+ ], _T.prototype, "name", void 0);
209
+ __decorate([
210
+ (0, table_1.Field)((0, codec_helpers_1.asFieldType)(codec_helpers_1.numberCodec)),
211
+ __metadata("design:type", Number)
212
+ ], _T.prototype, "age", void 0);
213
+ _T = __decorate([
214
+ (0, schema_1.RegisterTable)("v_err", "model-validate-schema")
215
+ ], _T);
216
+ const TM = (0, model_1.BasicDataModel)(_T, "v_err");
217
+ const result = TM.validate({ name: 42, age: "old" });
218
+ (0, chai_1.expect)(result.ok).to.equal(false);
219
+ if (result.ok)
220
+ throw new Error("expected failure branch");
221
+ const fields = result.errors.map((e) => e.field).sort();
222
+ (0, chai_1.expect)(fields).to.deep.equal(["age", "name"]);
223
+ });
224
+ it("returns ok for unannotated tables", () => {
225
+ let _T = class _T extends table_1.Table {
226
+ };
227
+ _T = __decorate([
228
+ (0, schema_1.RegisterTable)("v_un", "model-validate-schema")
229
+ ], _T);
230
+ const TM = (0, model_1.BasicDataModel)(_T, "v_un");
231
+ (0, chai_1.expect)(TM.validate({ name: "anything" }).ok).to.equal(true);
232
+ (0, chai_1.expect)(TM.validate({}).ok).to.equal(true);
233
+ });
234
+ it("skips string-token fields", () => {
235
+ let _T = class _T extends table_1.Table {
236
+ };
237
+ __decorate([
238
+ (0, table_1.Field)("string"),
239
+ __metadata("design:type", String)
240
+ ], _T.prototype, "name", void 0);
241
+ __decorate([
242
+ (0, table_1.Field)((0, codec_helpers_1.asFieldType)(codec_helpers_1.numberCodec)),
243
+ __metadata("design:type", Number)
244
+ ], _T.prototype, "age", void 0);
245
+ _T = __decorate([
246
+ (0, schema_1.RegisterTable)("v_skip", "model-validate-schema")
247
+ ], _T);
248
+ const TM = (0, model_1.BasicDataModel)(_T, "v_skip");
249
+ (0, chai_1.expect)(TM.validate({ name: 123, age: 4 }).ok).to.equal(true);
250
+ (0, chai_1.expect)(TM.validate({ name: "n", age: "bad" }).ok).to.equal(false);
251
+ });
252
+ it("rejects partial input by default", () => {
253
+ let _T = class _T extends table_1.Table {
254
+ };
255
+ __decorate([
256
+ (0, table_1.Field)((0, codec_helpers_1.asFieldType)(codec_helpers_1.stringCodec)),
257
+ __metadata("design:type", String)
258
+ ], _T.prototype, "name", void 0);
259
+ __decorate([
260
+ (0, table_1.Field)((0, codec_helpers_1.asFieldType)(codec_helpers_1.numberCodec)),
261
+ __metadata("design:type", Number)
262
+ ], _T.prototype, "age", void 0);
263
+ _T = __decorate([
264
+ (0, schema_1.RegisterTable)("v_partial_strict", "model-validate-schema")
265
+ ], _T);
266
+ const TM = (0, model_1.BasicDataModel)(_T, "v_partial_strict");
267
+ const result = TM.validate({ name: "Alice" });
268
+ (0, chai_1.expect)(result.ok).to.equal(false);
269
+ if (result.ok)
270
+ throw new Error("expected failure branch");
271
+ (0, chai_1.expect)(result.errors.map((e) => e.field)).to.deep.equal(["age"]);
272
+ });
273
+ it("accepts partial input with partial:true", () => {
274
+ let _T = class _T extends table_1.Table {
275
+ };
276
+ __decorate([
277
+ (0, table_1.Field)((0, codec_helpers_1.asFieldType)(codec_helpers_1.stringCodec)),
278
+ __metadata("design:type", String)
279
+ ], _T.prototype, "name", void 0);
280
+ __decorate([
281
+ (0, table_1.Field)((0, codec_helpers_1.asFieldType)(codec_helpers_1.numberCodec)),
282
+ __metadata("design:type", Number)
283
+ ], _T.prototype, "age", void 0);
284
+ _T = __decorate([
285
+ (0, schema_1.RegisterTable)("v_partial_accept", "model-validate-schema")
286
+ ], _T);
287
+ const TM = (0, model_1.BasicDataModel)(_T, "v_partial_accept");
288
+ (0, chai_1.expect)(TM.validate({ name: "Alice" }, { partial: true }).ok).to.equal(true);
289
+ (0, chai_1.expect)(TM.validate({}, { partial: true }).ok).to.equal(true);
290
+ });
291
+ it("still rejects present-but-invalid fields in partial mode", () => {
292
+ let _T = class _T extends table_1.Table {
293
+ };
294
+ __decorate([
295
+ (0, table_1.Field)((0, codec_helpers_1.asFieldType)(codec_helpers_1.stringCodec)),
296
+ __metadata("design:type", String)
297
+ ], _T.prototype, "name", void 0);
298
+ __decorate([
299
+ (0, table_1.Field)((0, codec_helpers_1.asFieldType)(codec_helpers_1.numberCodec)),
300
+ __metadata("design:type", Number)
301
+ ], _T.prototype, "age", void 0);
302
+ _T = __decorate([
303
+ (0, schema_1.RegisterTable)("v_partial_check", "model-validate-schema")
304
+ ], _T);
305
+ const TM = (0, model_1.BasicDataModel)(_T, "v_partial_check");
306
+ const result = TM.validate({ age: "old" }, { partial: true });
307
+ (0, chai_1.expect)(result.ok).to.equal(false);
308
+ if (result.ok)
309
+ throw new Error("expected failure branch");
310
+ (0, chai_1.expect)(result.errors.map((e) => e.field)).to.deep.equal(["age"]);
311
+ });
312
+ });
328
313
  //# sourceMappingURL=model.test.js.map