objectmodel 4.3.1 → 4.4.0

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 (53) hide show
  1. package/.eslintignore +8 -8
  2. package/.eslintrc.json +25 -25
  3. package/.travis.yml +2 -2
  4. package/LICENSE +22 -22
  5. package/README.md +67 -67
  6. package/build/add-banner.js +13 -13
  7. package/build/bundle-entry.dev.js +2 -2
  8. package/build/bundle-entry.js +11 -11
  9. package/dist/object-model.cjs +462 -469
  10. package/dist/object-model.js +462 -469
  11. package/dist/object-model.js.map +1 -1
  12. package/dist/object-model.min.js +2 -2
  13. package/dist/object-model.min.js.map +1 -1
  14. package/index.html +4 -4
  15. package/package.json +9 -3
  16. package/rollup.config.js +13 -13
  17. package/src/array-model.d.ts +16 -0
  18. package/src/array-model.js +68 -68
  19. package/src/devtool-formatter.js +198 -198
  20. package/src/function-model.d.ts +24 -0
  21. package/src/function-model.js +58 -65
  22. package/src/helpers.js +43 -43
  23. package/src/index.js +4 -4
  24. package/src/list-model.js +43 -43
  25. package/src/map-model.d.ts +18 -0
  26. package/src/map-model.js +48 -48
  27. package/src/object-model.d.ts +74 -0
  28. package/src/set-model.d.ts +16 -0
  29. package/src/set-model.js +41 -41
  30. package/test/array-model.spec.cjs +291 -291
  31. package/test/array-model.test-d.ts +24 -0
  32. package/test/basic-model.spec.cjs +263 -263
  33. package/test/basic-model.test-d.ts +30 -0
  34. package/test/bench/array.html +51 -51
  35. package/test/bench/bench-lib.js +49 -49
  36. package/test/bench/map-no-cast.html +53 -53
  37. package/test/bench/map-set.html +52 -52
  38. package/test/bench/map.html +51 -51
  39. package/test/bench/object-models.html +87 -87
  40. package/test/function-model.spec.cjs +161 -162
  41. package/test/function-model.test-d.ts +18 -0
  42. package/test/index.cjs +13 -13
  43. package/test/map-model.spec.cjs +224 -224
  44. package/test/map-model.test-d.ts +21 -0
  45. package/test/model.spec.cjs +30 -30
  46. package/test/object-model.spec.cjs +1345 -1346
  47. package/test/object-model.test-d.ts +53 -0
  48. package/test/set-model.spec.cjs +213 -213
  49. package/test/set-model.test-d.ts +17 -0
  50. package/test/umd.html +25 -25
  51. package/types/definitions.d.ts +43 -0
  52. package/types/helpers.d.ts +4 -0
  53. package/types/index.d.ts +6 -128
@@ -1,264 +1,264 @@
1
- /* global QUnit, BasicModel */
2
-
3
- QUnit.module("Basic Models");
4
-
5
- QUnit.test("constructor && proto are correctly defined", function (assert) {
6
- assert.ok(BasicModel instanceof Function, "BasicModel is defined");
7
-
8
- const NumberModel = BasicModel(Number);
9
-
10
- assert.ok(typeof NumberModel.extend === "function", "test model method extend");
11
- assert.ok(typeof NumberModel.assert === "function", "test model method assert");
12
- assert.ok(typeof NumberModel.test === "function", "test model method test");
13
- assert.ok(NumberModel.definition === Number, "test model prop definition");
14
- assert.ok(typeof NumberModel.assertions === "object", "test model prop assertions");
15
-
16
- const NumberModelThroughConstructor = new BasicModel(Number);
17
-
18
- assert.ok(typeof NumberModelThroughConstructor.extend === "function", "test new model method extend");
19
- assert.ok(typeof NumberModelThroughConstructor.assert === "function", "test new model method assert");
20
- assert.ok(typeof NumberModelThroughConstructor.test === "function", "test new model method test");
21
- assert.ok(NumberModelThroughConstructor.definition === Number, "test new model prop definition");
22
- assert.ok(typeof NumberModelThroughConstructor.assertions === "object", "test new model prop assertions");
23
- });
24
-
25
- QUnit.test("undefined definition", function (assert) {
26
- const UndefinedModel = BasicModel(undefined);
27
- assert.ok(UndefinedModel instanceof BasicModel, "Model can receive undefined as argument");
28
- });
29
-
30
- QUnit.test("basic type behaviour", function (assert) {
31
-
32
- const NumberModel = BasicModel(Number);
33
- NumberModel(0); // should not throw
34
- assert.ok(typeof NumberModel(42) === "number", "should return the original type");
35
- assert.ok(NumberModel(17) === 17, "should return the original value");
36
- assert.throws(function () {
37
- NumberModel("12")
38
- }, /TypeError/, "test invalid type");
39
- assert.throws(function () {
40
- NumberModel(NaN)
41
- }, /TypeError/, "test NaN is invalid");
42
-
43
- })
44
-
45
- QUnit.test("Optional type", function (assert) {
46
-
47
- const NumberModel = BasicModel(Number);
48
- const OptionalNumberModel = BasicModel([Number]);
49
-
50
- assert.throws(function () {
51
- NumberModel()
52
- }, /TypeError/, "test undefined value for optional model");
53
-
54
- OptionalNumberModel(); // should not throw
55
-
56
- const OptionalExtendedNumberModel = NumberModel.extend(undefined);
57
-
58
- OptionalExtendedNumberModel(); // should not throw
59
-
60
- assert.throws(function () {
61
- NumberModel()
62
- }, /TypeError/, "test undefined value on mandatory prop");
63
-
64
- });
65
-
66
- QUnit.test("Union type", function (assert) {
67
-
68
- const myModel = BasicModel([String, Boolean, Date]);
69
- myModel("test"); // should not throw
70
- myModel(true); // should not throw
71
- myModel(new Date()); // should not throw
72
- assert.throws(function () {
73
- myModel()
74
- }, /TypeError/, "test undefined value");
75
- assert.throws(function () {
76
- myModel(0)
77
- }, /TypeError/, "test invalid type");
78
- assert.throws(function () {
79
- myModel(new Date("x"))
80
- }, /TypeError/, "test invalid date");
81
-
82
- assert.ok(myModel.test("666") === true, "model.test 1/2");
83
- assert.ok(myModel.test(666) === false, "model.test 2/2");
84
-
85
- });
86
-
87
- QUnit.test("default values", function (assert) {
88
-
89
- const myModel = BasicModel([String, Boolean, Date]);
90
- myModel.defaultTo("blob");
91
- assert.strictEqual(myModel.default, "blob", "basic model default store the value as default property")
92
- assert.strictEqual(myModel(), "blob", "basic model default property is applied when undefined is passed");
93
- myModel.default = 42;
94
- assert.throws(function () {
95
- myModel()
96
- }, /TypeError.*got Number 42/, "basic model invalid default property still throws TypeError");
97
-
98
- });
99
-
100
- QUnit.test("Assertions", function (assert) {
101
-
102
- function isOdd(n) {
103
- return n % 2 === 1;
104
- }
105
-
106
- const OddNumber = BasicModel(Number).assert(isOdd);
107
- assert.strictEqual(OddNumber(17), 17, "passing assertion on basic model 1/2");
108
- assert.throws(function () {
109
- OddNumber(18)
110
- }, /TypeError[\s\S]*isOdd/, "failing assertion on basic model 1/2");
111
-
112
- const RealNumber = BasicModel(Number).assert(isFinite);
113
-
114
- assert.equal(RealNumber(Math.sqrt(1)), 1, "passing assertion on basic model 2/2");
115
- assert.throws(function () {
116
- RealNumber(Math.sqrt(-1))
117
- }, /TypeError[\s\S]*isFinite/, "failing assertion on basic model 2/2");
118
-
119
- function isPrime(n) {
120
- for (var i = 2, m = Math.sqrt(n); i <= m; i++) {
121
- if (n % i === 0) return false;
122
- }
123
- return true;
124
- }
125
-
126
- const PrimeNumber = RealNumber
127
- .extend() // to not add next assertions to RealNumber model
128
- .assert(Number.isInteger)
129
- .assert(isPrime);
130
-
131
- PrimeNumber(83);
132
- assert.throws(function () {
133
- PrimeNumber(87);
134
- }, /TypeError[\s\S]*isPrime/, "test multiple assertions 1");
135
- assert.throws(function () {
136
- PrimeNumber(7.77);
137
- }, /TypeError[\s\S]*isInteger/, "test multiple assertions 2");
138
-
139
- const AssertBasic = BasicModel(Number).assert(function (v) {
140
- return +v.toString() === v
141
- }, "may throw exception")
142
-
143
- new AssertBasic(0);
144
-
145
- assert.throws(
146
- function () {
147
- new AssertBasic();
148
- },
149
- /assertion "may throw exception" returned TypeError.*for value undefined/,
150
- "assertions catch exceptions on Basic models"
151
- );
152
-
153
- assert.equal(PrimeNumber.toString(), "Number(isFinite,isInteger,isPrime)", "test assertions format for named functions")
154
- PrimeNumber.as("PrimeNumber");
155
- assert.equal(PrimeNumber.toString(), "PrimeNumber", "test named model format with assertions")
156
-
157
- assert.equal(AssertBasic.toString(), "Number(may throw exception)", "test format anonymous assertions with descriptions")
158
- const NonNullNumber = BasicModel(Number).assert(n => !!n)
159
- assert.equal(NonNullNumber.toString(), "Number(n => !!n)", "test format anonymous assertions without descriptions")
160
-
161
- });
162
-
163
- QUnit.test("Custom error collectors", function (assert) {
164
-
165
- assert.expect(13);
166
-
167
- const defaultErrorCollector = BasicModel.prototype.errorCollector;
168
- assert.equal(typeof defaultErrorCollector, "function", "BasicModel has default errorCollector");
169
-
170
- BasicModel.prototype.errorCollector = function (errors) {
171
- assert.ok(errors.length === 1, "check errors.length global collector");
172
- const err = errors[0];
173
- assert.equal(err.expected, Number, "check error.expected global collector");
174
- assert.equal(err.received, "nope", "check error.received global collector");
175
- assert.equal(err.message, 'expecting Number, got String "nope"', "check error.message global collector");
176
- }
177
-
178
- BasicModel(Number)("nope");
179
-
180
- BasicModel.prototype.errorCollector = function (errors) {
181
- assert.ok(errors.length === 1, 'global custom collector assertion error catch 1/2');
182
- assert.equal(errors[0].message,
183
- 'assertion "shouldnt be nope" returned false for value "nope"',
184
- 'global custom collector assertion error catch 2/2');
185
- }
186
-
187
- BasicModel(String).assert(function (s) {
188
- return s !== "nope"
189
- }, "shouldnt be nope")("nope");
190
-
191
- BasicModel(Number).test("nope", function (errors) {
192
- assert.ok(errors.length === 1, "check errors.length custom collector");
193
- var err = errors[0];
194
- assert.equal(err.expected, Number, "check error.expected custom collector");
195
- assert.equal(err.received, "nope", "check error.received custom collector");
196
- assert.equal(err.message, 'expecting Number, got String "nope"', "check error.message custom collector");
197
- });
198
-
199
- BasicModel(String).assert(function (s) { return s !== "nope" }, "shouldnt be nope")
200
- .test("nope", function (errors) {
201
- assert.ok(errors.length === 1, 'local custom collector assertion error catch 1/2');
202
- assert.equal(errors[0].message,
203
- 'assertion "shouldnt be nope" returned false for value "nope"',
204
- 'local custom collector assertion error catch 2/2');
205
- });
206
-
207
- BasicModel.prototype.errorCollector = defaultErrorCollector;
208
-
209
- });
210
-
211
- QUnit.test("Extensions", function (assert) {
212
-
213
- const PositiveInteger = BasicModel(Number)
214
- .assert(Number.isInteger)
215
- .assert(n => n >= 0, "should be greater or equal to zero")
216
-
217
- function isPrime(n) {
218
- for (var i = 2, m = Math.sqrt(n); i <= m; i++) {
219
- if (n % i === 0) return false;
220
- }
221
- return n > 1;
222
- }
223
-
224
- const PrimeNumber = PositiveInteger.extend().assert(isPrime);
225
-
226
- assert.equal(PrimeNumber.definition, Number, "Extension retrieve original definition");
227
- assert.equal(PrimeNumber.assertions.length, 3, "Extension can add assertions");
228
- assert.equal(PositiveInteger.assertions.length, 2, "Extension assertions are not added to original model");
229
-
230
- })
231
-
232
- QUnit.test("Object definitions behaviour", function (assert) {
233
- const foo = BasicModel({ foo: String })
234
- assert.equal(typeof foo.definition, "object", "Object definition can be passed to BasicModel")
235
- assert.equal(foo({ foo: "bar" }).foo, "bar", "BasicModel with object definition is valid")
236
- assert.throws(
237
- function () {
238
- foo({ foo: 123 })
239
- },
240
- /TypeError.*expecting foo to be String, got Number 123/,
241
- "BasicModel with object definition has invalid prop value"
242
- );
243
- assert.throws(
244
- function () {
245
- foo("bar")
246
- },
247
- /TypeError.*expecting foo to be String, got undefined/,
248
- "BasicModel with object definition has invalid type"
249
- );
250
- assert.throws(
251
- function () {
252
- BasicModel({ foo: String })("bar")
253
- },
254
- /TypeError.*expecting foo to be String, got undefined/,
255
- "BasicModel with object definition has invalid type"
256
- );
257
- assert.throws(
258
- function () {
259
- foo(123)
260
- },
261
- /TypeError.*expecting foo to be String, got undefined/,
262
- "BasicModel with object definition has invalid type"
263
- );
1
+ /* global QUnit, BasicModel */
2
+
3
+ QUnit.module("Basic Models");
4
+
5
+ QUnit.test("constructor && proto are correctly defined", function (assert) {
6
+ assert.ok(BasicModel instanceof Function, "BasicModel is defined");
7
+
8
+ const NumberModel = BasicModel(Number);
9
+
10
+ assert.ok(typeof NumberModel.extend === "function", "test model method extend");
11
+ assert.ok(typeof NumberModel.assert === "function", "test model method assert");
12
+ assert.ok(typeof NumberModel.test === "function", "test model method test");
13
+ assert.ok(NumberModel.definition === Number, "test model prop definition");
14
+ assert.ok(typeof NumberModel.assertions === "object", "test model prop assertions");
15
+
16
+ const NumberModelThroughConstructor = new BasicModel(Number);
17
+
18
+ assert.ok(typeof NumberModelThroughConstructor.extend === "function", "test new model method extend");
19
+ assert.ok(typeof NumberModelThroughConstructor.assert === "function", "test new model method assert");
20
+ assert.ok(typeof NumberModelThroughConstructor.test === "function", "test new model method test");
21
+ assert.ok(NumberModelThroughConstructor.definition === Number, "test new model prop definition");
22
+ assert.ok(typeof NumberModelThroughConstructor.assertions === "object", "test new model prop assertions");
23
+ });
24
+
25
+ QUnit.test("undefined definition", function (assert) {
26
+ const UndefinedModel = BasicModel(undefined);
27
+ assert.ok(UndefinedModel instanceof BasicModel, "Model can receive undefined as argument");
28
+ });
29
+
30
+ QUnit.test("basic type behaviour", function (assert) {
31
+
32
+ const NumberModel = BasicModel(Number);
33
+ NumberModel(0); // should not throw
34
+ assert.ok(typeof NumberModel(42) === "number", "should return the original type");
35
+ assert.ok(NumberModel(17) === 17, "should return the original value");
36
+ assert.throws(function () {
37
+ NumberModel("12")
38
+ }, /TypeError/, "test invalid type");
39
+ assert.throws(function () {
40
+ NumberModel(NaN)
41
+ }, /TypeError/, "test NaN is invalid");
42
+
43
+ })
44
+
45
+ QUnit.test("Optional type", function (assert) {
46
+
47
+ const NumberModel = BasicModel(Number);
48
+ const OptionalNumberModel = BasicModel([Number]);
49
+
50
+ assert.throws(function () {
51
+ NumberModel()
52
+ }, /TypeError/, "test undefined value for optional model");
53
+
54
+ OptionalNumberModel(); // should not throw
55
+
56
+ const OptionalExtendedNumberModel = NumberModel.extend(undefined);
57
+
58
+ OptionalExtendedNumberModel(); // should not throw
59
+
60
+ assert.throws(function () {
61
+ NumberModel()
62
+ }, /TypeError/, "test undefined value on mandatory prop");
63
+
64
+ });
65
+
66
+ QUnit.test("Union type", function (assert) {
67
+
68
+ const myModel = BasicModel([String, Boolean, Date]);
69
+ myModel("test"); // should not throw
70
+ myModel(true); // should not throw
71
+ myModel(new Date()); // should not throw
72
+ assert.throws(function () {
73
+ myModel()
74
+ }, /TypeError/, "test undefined value");
75
+ assert.throws(function () {
76
+ myModel(0)
77
+ }, /TypeError/, "test invalid type");
78
+ assert.throws(function () {
79
+ myModel(new Date("x"))
80
+ }, /TypeError/, "test invalid date");
81
+
82
+ assert.ok(myModel.test("666") === true, "model.test 1/2");
83
+ assert.ok(myModel.test(666) === false, "model.test 2/2");
84
+
85
+ });
86
+
87
+ QUnit.test("default values", function (assert) {
88
+
89
+ const myModel = BasicModel([String, Boolean, Date]);
90
+ myModel.defaultTo("blob");
91
+ assert.strictEqual(myModel.default, "blob", "basic model default store the value as default property")
92
+ assert.strictEqual(myModel(), "blob", "basic model default property is applied when undefined is passed");
93
+ myModel.default = 42;
94
+ assert.throws(function () {
95
+ myModel()
96
+ }, /TypeError.*got Number 42/, "basic model invalid default property still throws TypeError");
97
+
98
+ });
99
+
100
+ QUnit.test("Assertions", function (assert) {
101
+
102
+ function isOdd(n) {
103
+ return n % 2 === 1;
104
+ }
105
+
106
+ const OddNumber = BasicModel(Number).assert(isOdd);
107
+ assert.strictEqual(OddNumber(17), 17, "passing assertion on basic model 1/2");
108
+ assert.throws(function () {
109
+ OddNumber(18)
110
+ }, /TypeError[\s\S]*isOdd/, "failing assertion on basic model 1/2");
111
+
112
+ const RealNumber = BasicModel(Number).assert(isFinite);
113
+
114
+ assert.equal(RealNumber(Math.sqrt(1)), 1, "passing assertion on basic model 2/2");
115
+ assert.throws(function () {
116
+ RealNumber(Math.sqrt(-1))
117
+ }, /TypeError[\s\S]*isFinite/, "failing assertion on basic model 2/2");
118
+
119
+ function isPrime(n) {
120
+ for (var i = 2, m = Math.sqrt(n); i <= m; i++) {
121
+ if (n % i === 0) return false;
122
+ }
123
+ return true;
124
+ }
125
+
126
+ const PrimeNumber = RealNumber
127
+ .extend() // to not add next assertions to RealNumber model
128
+ .assert(Number.isInteger)
129
+ .assert(isPrime);
130
+
131
+ PrimeNumber(83);
132
+ assert.throws(function () {
133
+ PrimeNumber(87);
134
+ }, /TypeError[\s\S]*isPrime/, "test multiple assertions 1");
135
+ assert.throws(function () {
136
+ PrimeNumber(7.77);
137
+ }, /TypeError[\s\S]*isInteger/, "test multiple assertions 2");
138
+
139
+ const AssertBasic = BasicModel(Number).assert(function (v) {
140
+ return +v.toString() === v
141
+ }, "may throw exception")
142
+
143
+ new AssertBasic(0);
144
+
145
+ assert.throws(
146
+ function () {
147
+ new AssertBasic();
148
+ },
149
+ /assertion "may throw exception" returned TypeError.*for value undefined/,
150
+ "assertions catch exceptions on Basic models"
151
+ );
152
+
153
+ assert.equal(PrimeNumber.toString(), "Number(isFinite,isInteger,isPrime)", "test assertions format for named functions")
154
+ PrimeNumber.as("PrimeNumber");
155
+ assert.equal(PrimeNumber.toString(), "PrimeNumber", "test named model format with assertions")
156
+
157
+ assert.equal(AssertBasic.toString(), "Number(may throw exception)", "test format anonymous assertions with descriptions")
158
+ const NonNullNumber = BasicModel(Number).assert(n => !!n)
159
+ assert.equal(NonNullNumber.toString(), "Number(n => !!n)", "test format anonymous assertions without descriptions")
160
+
161
+ });
162
+
163
+ QUnit.test("Custom error collectors", function (assert) {
164
+
165
+ assert.expect(13);
166
+
167
+ const defaultErrorCollector = BasicModel.prototype.errorCollector;
168
+ assert.equal(typeof defaultErrorCollector, "function", "BasicModel has default errorCollector");
169
+
170
+ BasicModel.prototype.errorCollector = function (errors) {
171
+ assert.ok(errors.length === 1, "check errors.length global collector");
172
+ const err = errors[0];
173
+ assert.equal(err.expected, Number, "check error.expected global collector");
174
+ assert.equal(err.received, "nope", "check error.received global collector");
175
+ assert.equal(err.message, 'expecting Number, got String "nope"', "check error.message global collector");
176
+ }
177
+
178
+ BasicModel(Number)("nope");
179
+
180
+ BasicModel.prototype.errorCollector = function (errors) {
181
+ assert.ok(errors.length === 1, 'global custom collector assertion error catch 1/2');
182
+ assert.equal(errors[0].message,
183
+ 'assertion "shouldnt be nope" returned false for value "nope"',
184
+ 'global custom collector assertion error catch 2/2');
185
+ }
186
+
187
+ BasicModel(String).assert(function (s) {
188
+ return s !== "nope"
189
+ }, "shouldnt be nope")("nope");
190
+
191
+ BasicModel(Number).test("nope", function (errors) {
192
+ assert.ok(errors.length === 1, "check errors.length custom collector");
193
+ var err = errors[0];
194
+ assert.equal(err.expected, Number, "check error.expected custom collector");
195
+ assert.equal(err.received, "nope", "check error.received custom collector");
196
+ assert.equal(err.message, 'expecting Number, got String "nope"', "check error.message custom collector");
197
+ });
198
+
199
+ BasicModel(String).assert(function (s) { return s !== "nope" }, "shouldnt be nope")
200
+ .test("nope", function (errors) {
201
+ assert.ok(errors.length === 1, 'local custom collector assertion error catch 1/2');
202
+ assert.equal(errors[0].message,
203
+ 'assertion "shouldnt be nope" returned false for value "nope"',
204
+ 'local custom collector assertion error catch 2/2');
205
+ });
206
+
207
+ BasicModel.prototype.errorCollector = defaultErrorCollector;
208
+
209
+ });
210
+
211
+ QUnit.test("Extensions", function (assert) {
212
+
213
+ const PositiveInteger = BasicModel(Number)
214
+ .assert(Number.isInteger)
215
+ .assert(n => n >= 0, "should be greater or equal to zero")
216
+
217
+ function isPrime(n) {
218
+ for (var i = 2, m = Math.sqrt(n); i <= m; i++) {
219
+ if (n % i === 0) return false;
220
+ }
221
+ return n > 1;
222
+ }
223
+
224
+ const PrimeNumber = PositiveInteger.extend().assert(isPrime);
225
+
226
+ assert.equal(PrimeNumber.definition, Number, "Extension retrieve original definition");
227
+ assert.equal(PrimeNumber.assertions.length, 3, "Extension can add assertions");
228
+ assert.equal(PositiveInteger.assertions.length, 2, "Extension assertions are not added to original model");
229
+
230
+ })
231
+
232
+ QUnit.test("Object definitions behaviour", function (assert) {
233
+ const foo = BasicModel({ foo: String })
234
+ assert.equal(typeof foo.definition, "object", "Object definition can be passed to BasicModel")
235
+ assert.equal(foo({ foo: "bar" }).foo, "bar", "BasicModel with object definition is valid")
236
+ assert.throws(
237
+ function () {
238
+ foo({ foo: 123 })
239
+ },
240
+ /TypeError.*expecting foo to be String, got Number 123/,
241
+ "BasicModel with object definition has invalid prop value"
242
+ );
243
+ assert.throws(
244
+ function () {
245
+ foo("bar")
246
+ },
247
+ /TypeError.*expecting foo to be String, got undefined/,
248
+ "BasicModel with object definition has invalid type"
249
+ );
250
+ assert.throws(
251
+ function () {
252
+ BasicModel({ foo: String })("bar")
253
+ },
254
+ /TypeError.*expecting foo to be String, got undefined/,
255
+ "BasicModel with object definition has invalid type"
256
+ );
257
+ assert.throws(
258
+ function () {
259
+ foo(123)
260
+ },
261
+ /TypeError.*expecting foo to be String, got undefined/,
262
+ "BasicModel with object definition has invalid type"
263
+ );
264
264
  })
@@ -0,0 +1,30 @@
1
+ import {expectError, expectType} from 'tsd';
2
+ import { Model, BasicModel } from "../src/object-model"
3
+
4
+ expectType<number>(BasicModel(Number)(0))
5
+ expectType<number>(new Model(Number)(Infinity))
6
+ expectError(BasicModel(Number)("0"))
7
+
8
+ expectType<string>(new BasicModel(String)(""))
9
+ expectType<string>(Model(String)("test"))
10
+ expectError(Model(String)(null))
11
+
12
+ expectType<boolean>(BasicModel(Boolean)(true))
13
+ expectType<boolean>(new Model(Boolean)(false))
14
+ expectError(new Model(Boolean)(""))
15
+
16
+ expectType<string>(BasicModel(/A-Z/)("TEST"))
17
+
18
+ expectType<"optional" | undefined | null>(BasicModel(<const>["optional"])(undefined))
19
+ expectType<number | undefined | null>(new BasicModel(<const>[Number])(null))
20
+
21
+ expectType<"one" | "two">(BasicModel(<const>["one","two"])("one"))
22
+ expectType<number | string>(BasicModel(<const>[Number, String])(2))
23
+ expectType<boolean | null>(new BasicModel(<const>[Boolean, null])(false))
24
+ expectType<Date | "never">(new BasicModel(<const>["never", Date])("never"))
25
+
26
+ const M = new BasicModel(Date)
27
+ const M2 = M.extend()
28
+ expectType<Date>(M2(new Date()))
29
+ const M3 = M2.extend(String)
30
+ expectType<Date | string>(M3(new Date()))
@@ -1,52 +1,52 @@
1
- <html>
2
-
3
- <head>
4
- <title>Benchmark: Array Models</title>
5
- </head>
6
-
7
- <body>
8
- <h1>Benchmark: Array Models</h1>
9
- </body>
10
-
11
- <script src="bench-lib.js"></script>
12
-
13
- <script type="module">
14
- import { Model, BasicModel, ObjectModel, ArrayModel } from "../../src/index.js"
15
-
16
- const Integer = BasicModel(Number).assert(Number.isInteger).as("Integer");
17
- const PositiveNumber = BasicModel(Number).assert(function isPositive(n) { return n >= 0 }).as("PositiveNumber")
18
- const PositiveInteger = PositiveNumber.extend().assert(Number.isInteger).as("PositiveInteger");
19
-
20
- let mockId = () => Math.ceil(Math.random() * 100)
21
- let mockOM = () => Object.assign({}, ...Array(10).fill().map((x, i) => ({ ["id" + i]: mockId() })))
22
- let mockAMData = n => (new Array(n)).fill(0).map(x => mockOM())
23
-
24
- const Id = PositiveInteger.extend().as('Id');
25
-
26
- class OM extends ObjectModel({
27
- id0: [Id],
28
- id1: [Id],
29
- id2: [Id],
30
- id3: [Id],
31
- id4: [Id],
32
- id5: [Id],
33
- id6: [Id],
34
- id7: [Id],
35
- id8: [Id],
36
- id9: [Id]
37
- }) { };
38
-
39
- const AM = ArrayModel(OM)
40
-
41
- bench([100, 1000, 10000].map(n => ({
42
- description: `Init ArrayModel with ${n} elements`,
43
- nbIter: 3,
44
- run() {
45
- const data = mockAMData(n);
46
- new AM(data)
47
- }
48
- })))
49
-
50
- </script>
51
-
1
+ <html>
2
+
3
+ <head>
4
+ <title>Benchmark: Array Models</title>
5
+ </head>
6
+
7
+ <body>
8
+ <h1>Benchmark: Array Models</h1>
9
+ </body>
10
+
11
+ <script src="bench-lib.js"></script>
12
+
13
+ <script type="module">
14
+ import { Model, BasicModel, ObjectModel, ArrayModel } from "../../src/index.js"
15
+
16
+ const Integer = BasicModel(Number).assert(Number.isInteger).as("Integer");
17
+ const PositiveNumber = BasicModel(Number).assert(function isPositive(n) { return n >= 0 }).as("PositiveNumber")
18
+ const PositiveInteger = PositiveNumber.extend().assert(Number.isInteger).as("PositiveInteger");
19
+
20
+ let mockId = () => Math.ceil(Math.random() * 100)
21
+ let mockOM = () => Object.assign({}, ...Array(10).fill().map((x, i) => ({ ["id" + i]: mockId() })))
22
+ let mockAMData = n => (new Array(n)).fill(0).map(x => mockOM())
23
+
24
+ const Id = PositiveInteger.extend().as('Id');
25
+
26
+ class OM extends ObjectModel({
27
+ id0: [Id],
28
+ id1: [Id],
29
+ id2: [Id],
30
+ id3: [Id],
31
+ id4: [Id],
32
+ id5: [Id],
33
+ id6: [Id],
34
+ id7: [Id],
35
+ id8: [Id],
36
+ id9: [Id]
37
+ }) { };
38
+
39
+ const AM = ArrayModel(OM)
40
+
41
+ bench([100, 1000, 10000].map(n => ({
42
+ description: `Init ArrayModel with ${n} elements`,
43
+ nbIter: 3,
44
+ run() {
45
+ const data = mockAMData(n);
46
+ new AM(data)
47
+ }
48
+ })))
49
+
50
+ </script>
51
+
52
52
  </html>