objectmodel 4.3.0 → 4.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "objectmodel",
3
- "version": "4.3.0",
3
+ "version": "4.3.1",
4
4
  "description": "Strong Dynamically Typed Object Modeling for JavaScript",
5
5
  "author": "Sylvain Pollet-Villard",
6
6
  "license": "MIT",
@@ -18,20 +18,20 @@
18
18
  "watch:js": "npm run build:js -- --watch",
19
19
  "watch:min": "npm run build:min -- --watch",
20
20
  "info": "npm-run-all info:*",
21
- "info:banner": "node build/add-banner.cjs",
22
- "info:docs": "node build/update-docs.cjs",
21
+ "info:banner": "node build/add-banner.js",
22
+ "info:docs": "node build/update-docs.js",
23
23
  "lint": "eslint . --fix",
24
24
  "test": "qunit test/index.cjs"
25
25
  },
26
26
  "devDependencies": {
27
27
  "cjyes": "^0.3.1",
28
- "eslint": "^7.28.0",
28
+ "eslint": "^8.18.0",
29
29
  "esm": "^3.2.25",
30
- "filesize": "^6.3.0",
31
- "gzip-size": "^6.0.0",
30
+ "gzip-size": "^7.0.0",
32
31
  "npm-run-all": "^4.1.5",
33
- "qunit": "^2.16.0",
34
- "rollup": "^2.51.2",
32
+ "pretty-bytes": "^6.0.0",
33
+ "qunit": "^2.19.1",
34
+ "rollup": "^2.75.6",
35
35
  "rollup-plugin-terser": "^7.0.2"
36
36
  },
37
37
  "type": "module",
@@ -41,6 +41,10 @@
41
41
  "require": "./dist/object-model.cjs"
42
42
  },
43
43
  "types": "types/index.d.ts",
44
+ "engines": {
45
+ "npm": ">=7.0.0",
46
+ "node": ">=17.5.0"
47
+ },
44
48
  "keywords": [
45
49
  "typed",
46
50
  "types",
@@ -33,7 +33,8 @@ export const
33
33
  if (is(model, obj)) return obj
34
34
 
35
35
  if (!isObject(obj) && !isFunction(obj) && obj !== undefined) {
36
- stackError(model.errors, Object, obj)
36
+ // short circuit validation if not receiving an object as expected
37
+ return obj
37
38
  }
38
39
 
39
40
  merge(_this, model.default)
@@ -325,8 +326,8 @@ export const
325
326
  }
326
327
 
327
328
 
328
- export function Model(def, params) {
329
- return isPlainObject(def) ? new ObjectModel(def, params) : new BasicModel(def)
329
+ export function Model(def) {
330
+ return isPlainObject(def) ? new ObjectModel(def) : new BasicModel(def)
330
331
  }
331
332
 
332
333
  Object.assign(Model.prototype, {
package/test/index.html CHANGED
@@ -1,28 +1,28 @@
1
- <!DOCTYPE html>
2
- <html>
3
-
4
- <head>
5
- <meta charset="utf-8">
6
- <title>QUnit - ObjectModel unit tests</title>
7
- <link rel="stylesheet" href="lib/qunit.css">
8
- <script src="lib/qunit.js"></script>
9
- <script type="module">
10
- import * as globals from "../dist/object-model.min.js"
11
- Object.assign(window, globals)
12
- </script>
13
- <script src="model.spec.cjs"></script>
14
- <script src="basic-model.spec.cjs"></script>
15
- <script src="any-model.spec.cjs"></script>
16
- <script src="object-model.spec.cjs"></script>
17
- <script src="array-model.spec.cjs"></script>
18
- <script src="function-model.spec.cjs"></script>
19
- <script src="map-model.spec.cjs"></script>
20
- <script src="set-model.spec.cjs"></script>
21
- </head>
22
-
23
- <body>
24
- <div id="qunit"></div>
25
- <div id="qunit-fixture"></div>
26
- </body>
27
-
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ <meta charset="utf-8">
6
+ <title>QUnit - ObjectModel unit tests</title>
7
+ <link rel="stylesheet" href="https://code.jquery.com/qunit/qunit-2.17.2.css">
8
+ <script src="https://code.jquery.com/qunit/qunit-2.17.2.js"></script>
9
+ <script type="module">
10
+ import * as globals from "../dist/object-model.min.js"
11
+ Object.assign(window, globals)
12
+ </script>
13
+ <script src="model.spec.cjs"></script>
14
+ <script src="basic-model.spec.cjs"></script>
15
+ <script src="any-model.spec.cjs"></script>
16
+ <script src="object-model.spec.cjs"></script>
17
+ <script src="array-model.spec.cjs"></script>
18
+ <script src="function-model.spec.cjs"></script>
19
+ <script src="map-model.spec.cjs"></script>
20
+ <script src="set-model.spec.cjs"></script>
21
+ </head>
22
+
23
+ <body>
24
+ <div id="qunit"></div>
25
+ <div id="qunit-fixture"></div>
26
+ </body>
27
+
28
28
  </html>
@@ -1325,4 +1325,23 @@ QUnit.test("Check once mode", function(assert){
1325
1325
  const john = new Person({ name: "John", age: 32 })
1326
1326
  john.age = "twelve";
1327
1327
  assert.strictEqual(john.age, "twelve", "check once mode does not check future mutations for extended class-based models")
1328
+ })
1329
+
1330
+ QUnit.test("Short-circuit validation when not receiving an object as expected", function(assert){
1331
+ const PersonModel = new ObjectModel({
1332
+ FirstName: String,
1333
+ LastName: String,
1334
+ })
1335
+ const errorsCollected = []
1336
+ PersonModel.errorCollector = function(errors){
1337
+ errorsCollected.push(...errors)
1338
+ }
1339
+
1340
+ PersonModel(42)
1341
+ console.log({ errorsCollected})
1342
+ assert.equal(errorsCollected.length, 1, "should only have 1 error")
1343
+ assert.equal(errorsCollected[0].message, `expecting {
1344
+ FirstName: String,
1345
+ LastName: String
1346
+ }, got Number 42`)
1328
1347
  })
@@ -1,436 +0,0 @@
1
- /*!
2
- * QUnit 2.9.1
3
- * https://qunitjs.com/
4
- *
5
- * Copyright jQuery Foundation and other contributors
6
- * Released under the MIT license
7
- * https://jquery.org/license
8
- *
9
- * Date: 2019-01-07T16:37Z
10
- */
11
-
12
- /** Font Family and Sizes */
13
-
14
- #qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult {
15
- font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
16
- }
17
-
18
- #qunit-testrunner-toolbar, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
19
- #qunit-tests { font-size: smaller; }
20
-
21
-
22
- /** Resets */
23
-
24
- #qunit-tests, #qunit-header, #qunit-banner, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
25
- margin: 0;
26
- padding: 0;
27
- }
28
-
29
-
30
- /** Header (excluding toolbar) */
31
-
32
- #qunit-header {
33
- padding: 0.5em 0 0.5em 1em;
34
-
35
- color: #8699A4;
36
- background-color: #0D3349;
37
-
38
- font-size: 1.5em;
39
- line-height: 1em;
40
- font-weight: 400;
41
-
42
- border-radius: 5px 5px 0 0;
43
- }
44
-
45
- #qunit-header a {
46
- text-decoration: none;
47
- color: #C2CCD1;
48
- }
49
-
50
- #qunit-header a:hover,
51
- #qunit-header a:focus {
52
- color: #FFF;
53
- }
54
-
55
- #qunit-banner {
56
- height: 5px;
57
- }
58
-
59
- #qunit-filteredTest {
60
- padding: 0.5em 1em 0.5em 1em;
61
- color: #366097;
62
- background-color: #F4FF77;
63
- }
64
-
65
- #qunit-userAgent {
66
- padding: 0.5em 1em 0.5em 1em;
67
- color: #FFF;
68
- background-color: #2B81AF;
69
- text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
70
- }
71
-
72
-
73
- /** Toolbar */
74
-
75
- #qunit-testrunner-toolbar {
76
- padding: 0.5em 1em 0.5em 1em;
77
- color: #5E740B;
78
- background-color: #EEE;
79
- }
80
-
81
- #qunit-testrunner-toolbar .clearfix {
82
- height: 0;
83
- clear: both;
84
- }
85
-
86
- #qunit-testrunner-toolbar label {
87
- display: inline-block;
88
- }
89
-
90
- #qunit-testrunner-toolbar input[type=checkbox],
91
- #qunit-testrunner-toolbar input[type=radio] {
92
- margin: 3px;
93
- vertical-align: -2px;
94
- }
95
-
96
- #qunit-testrunner-toolbar input[type=text] {
97
- box-sizing: border-box;
98
- height: 1.6em;
99
- }
100
-
101
- .qunit-url-config,
102
- .qunit-filter,
103
- #qunit-modulefilter {
104
- display: inline-block;
105
- line-height: 2.1em;
106
- }
107
-
108
- .qunit-filter,
109
- #qunit-modulefilter {
110
- float: right;
111
- position: relative;
112
- margin-left: 1em;
113
- }
114
-
115
- .qunit-url-config label {
116
- margin-right: 0.5em;
117
- }
118
-
119
- #qunit-modulefilter-search {
120
- box-sizing: border-box;
121
- width: 400px;
122
- }
123
-
124
- #qunit-modulefilter-search-container:after {
125
- position: absolute;
126
- right: 0.3em;
127
- content: "\25bc";
128
- color: black;
129
- }
130
-
131
- #qunit-modulefilter-dropdown {
132
- /* align with #qunit-modulefilter-search */
133
- box-sizing: border-box;
134
- width: 400px;
135
- position: absolute;
136
- right: 0;
137
- top: 50%;
138
- margin-top: 0.8em;
139
-
140
- border: 1px solid #D3D3D3;
141
- border-top: none;
142
- border-radius: 0 0 .25em .25em;
143
- color: #000;
144
- background-color: #F5F5F5;
145
- z-index: 99;
146
- }
147
-
148
- #qunit-modulefilter-dropdown a {
149
- color: inherit;
150
- text-decoration: none;
151
- }
152
-
153
- #qunit-modulefilter-dropdown .clickable.checked {
154
- font-weight: bold;
155
- color: #000;
156
- background-color: #D2E0E6;
157
- }
158
-
159
- #qunit-modulefilter-dropdown .clickable:hover {
160
- color: #FFF;
161
- background-color: #0D3349;
162
- }
163
-
164
- #qunit-modulefilter-actions {
165
- display: block;
166
- overflow: auto;
167
-
168
- /* align with #qunit-modulefilter-dropdown-list */
169
- font: smaller/1.5em sans-serif;
170
- }
171
-
172
- #qunit-modulefilter-dropdown #qunit-modulefilter-actions > * {
173
- box-sizing: border-box;
174
- max-height: 2.8em;
175
- display: block;
176
- padding: 0.4em;
177
- }
178
-
179
- #qunit-modulefilter-dropdown #qunit-modulefilter-actions > button {
180
- float: right;
181
- font: inherit;
182
- }
183
-
184
- #qunit-modulefilter-dropdown #qunit-modulefilter-actions > :last-child {
185
- /* insert padding to align with checkbox margins */
186
- padding-left: 3px;
187
- }
188
-
189
- #qunit-modulefilter-dropdown-list {
190
- max-height: 200px;
191
- overflow-y: auto;
192
- margin: 0;
193
- border-top: 2px groove threedhighlight;
194
- padding: 0.4em 0 0;
195
- font: smaller/1.5em sans-serif;
196
- }
197
-
198
- #qunit-modulefilter-dropdown-list li {
199
- white-space: nowrap;
200
- overflow: hidden;
201
- text-overflow: ellipsis;
202
- }
203
-
204
- #qunit-modulefilter-dropdown-list .clickable {
205
- display: block;
206
- padding-left: 0.15em;
207
- }
208
-
209
-
210
- /** Tests: Pass/Fail */
211
-
212
- #qunit-tests {
213
- list-style-position: inside;
214
- }
215
-
216
- #qunit-tests li {
217
- padding: 0.4em 1em 0.4em 1em;
218
- border-bottom: 1px solid #FFF;
219
- list-style-position: inside;
220
- }
221
-
222
- #qunit-tests > li {
223
- display: none;
224
- }
225
-
226
- #qunit-tests li.running,
227
- #qunit-tests li.pass,
228
- #qunit-tests li.fail,
229
- #qunit-tests li.skipped,
230
- #qunit-tests li.aborted {
231
- display: list-item;
232
- }
233
-
234
- #qunit-tests.hidepass {
235
- position: relative;
236
- }
237
-
238
- #qunit-tests.hidepass li.running,
239
- #qunit-tests.hidepass li.pass:not(.todo) {
240
- visibility: hidden;
241
- position: absolute;
242
- width: 0;
243
- height: 0;
244
- padding: 0;
245
- border: 0;
246
- margin: 0;
247
- }
248
-
249
- #qunit-tests li strong {
250
- cursor: pointer;
251
- }
252
-
253
- #qunit-tests li.skipped strong {
254
- cursor: default;
255
- }
256
-
257
- #qunit-tests li a {
258
- padding: 0.5em;
259
- color: #C2CCD1;
260
- text-decoration: none;
261
- }
262
-
263
- #qunit-tests li p a {
264
- padding: 0.25em;
265
- color: #6B6464;
266
- }
267
- #qunit-tests li a:hover,
268
- #qunit-tests li a:focus {
269
- color: #000;
270
- }
271
-
272
- #qunit-tests li .runtime {
273
- float: right;
274
- font-size: smaller;
275
- }
276
-
277
- .qunit-assert-list {
278
- margin-top: 0.5em;
279
- padding: 0.5em;
280
-
281
- background-color: #FFF;
282
-
283
- border-radius: 5px;
284
- }
285
-
286
- .qunit-source {
287
- margin: 0.6em 0 0.3em;
288
- }
289
-
290
- .qunit-collapsed {
291
- display: none;
292
- }
293
-
294
- #qunit-tests table {
295
- border-collapse: collapse;
296
- margin-top: 0.2em;
297
- }
298
-
299
- #qunit-tests th {
300
- text-align: right;
301
- vertical-align: top;
302
- padding: 0 0.5em 0 0;
303
- }
304
-
305
- #qunit-tests td {
306
- vertical-align: top;
307
- }
308
-
309
- #qunit-tests pre {
310
- margin: 0;
311
- white-space: pre-wrap;
312
- word-wrap: break-word;
313
- }
314
-
315
- #qunit-tests del {
316
- color: #374E0C;
317
- background-color: #E0F2BE;
318
- text-decoration: none;
319
- }
320
-
321
- #qunit-tests ins {
322
- color: #500;
323
- background-color: #FFCACA;
324
- text-decoration: none;
325
- }
326
-
327
- /*** Test Counts */
328
-
329
- #qunit-tests b.counts { color: #000; }
330
- #qunit-tests b.passed { color: #5E740B; }
331
- #qunit-tests b.failed { color: #710909; }
332
-
333
- #qunit-tests li li {
334
- padding: 5px;
335
- background-color: #FFF;
336
- border-bottom: none;
337
- list-style-position: inside;
338
- }
339
-
340
- /*** Passing Styles */
341
-
342
- #qunit-tests li li.pass {
343
- color: #3C510C;
344
- background-color: #FFF;
345
- border-left: 10px solid #C6E746;
346
- }
347
-
348
- #qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; }
349
- #qunit-tests .pass .test-name { color: #366097; }
350
-
351
- #qunit-tests .pass .test-actual,
352
- #qunit-tests .pass .test-expected { color: #999; }
353
-
354
- #qunit-banner.qunit-pass { background-color: #C6E746; }
355
-
356
- /*** Failing Styles */
357
-
358
- #qunit-tests li li.fail {
359
- color: #710909;
360
- background-color: #FFF;
361
- border-left: 10px solid #EE5757;
362
- white-space: pre;
363
- }
364
-
365
- #qunit-tests > li:last-child {
366
- border-radius: 0 0 5px 5px;
367
- }
368
-
369
- #qunit-tests .fail { color: #000; background-color: #EE5757; }
370
- #qunit-tests .fail .test-name,
371
- #qunit-tests .fail .module-name { color: #000; }
372
-
373
- #qunit-tests .fail .test-actual { color: #EE5757; }
374
- #qunit-tests .fail .test-expected { color: #008000; }
375
-
376
- #qunit-banner.qunit-fail { background-color: #EE5757; }
377
-
378
-
379
- /*** Aborted tests */
380
- #qunit-tests .aborted { color: #000; background-color: orange; }
381
- /*** Skipped tests */
382
-
383
- #qunit-tests .skipped {
384
- background-color: #EBECE9;
385
- }
386
-
387
- #qunit-tests .qunit-todo-label,
388
- #qunit-tests .qunit-skipped-label {
389
- background-color: #F4FF77;
390
- display: inline-block;
391
- font-style: normal;
392
- color: #366097;
393
- line-height: 1.8em;
394
- padding: 0 0.5em;
395
- margin: -0.4em 0.4em -0.4em 0;
396
- }
397
-
398
- #qunit-tests .qunit-todo-label {
399
- background-color: #EEE;
400
- }
401
-
402
- /** Result */
403
-
404
- #qunit-testresult {
405
- color: #2B81AF;
406
- background-color: #D2E0E6;
407
-
408
- border-bottom: 1px solid #FFF;
409
- }
410
- #qunit-testresult .clearfix {
411
- height: 0;
412
- clear: both;
413
- }
414
- #qunit-testresult .module-name {
415
- font-weight: 700;
416
- }
417
- #qunit-testresult-display {
418
- padding: 0.5em 1em 0.5em 1em;
419
- width: 85%;
420
- float:left;
421
- }
422
- #qunit-testresult-controls {
423
- padding: 0.5em 1em 0.5em 1em;
424
- width: 10%;
425
- float:left;
426
- }
427
-
428
- /** Fixture */
429
-
430
- #qunit-fixture {
431
- position: absolute;
432
- top: -10000px;
433
- left: -10000px;
434
- width: 1000px;
435
- height: 1000px;
436
- }