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.
- package/.eslintignore +8 -8
- package/.eslintrc.json +25 -25
- package/.travis.yml +2 -2
- package/LICENSE +22 -22
- package/README.md +67 -67
- package/build/add-banner.js +13 -13
- package/build/bundle-entry.dev.js +2 -2
- package/build/bundle-entry.js +11 -11
- package/dist/object-model.cjs +462 -469
- package/dist/object-model.js +462 -469
- package/dist/object-model.js.map +1 -1
- package/dist/object-model.min.js +2 -2
- package/dist/object-model.min.js.map +1 -1
- package/index.html +4 -4
- package/package.json +9 -3
- package/rollup.config.js +13 -13
- package/src/array-model.d.ts +16 -0
- package/src/array-model.js +68 -68
- package/src/devtool-formatter.js +198 -198
- package/src/function-model.d.ts +24 -0
- package/src/function-model.js +58 -65
- package/src/helpers.js +43 -43
- package/src/index.js +4 -4
- package/src/list-model.js +43 -43
- package/src/map-model.d.ts +18 -0
- package/src/map-model.js +48 -48
- package/src/object-model.d.ts +74 -0
- package/src/set-model.d.ts +16 -0
- package/src/set-model.js +41 -41
- package/test/array-model.spec.cjs +291 -291
- package/test/array-model.test-d.ts +24 -0
- package/test/basic-model.spec.cjs +263 -263
- package/test/basic-model.test-d.ts +30 -0
- package/test/bench/array.html +51 -51
- package/test/bench/bench-lib.js +49 -49
- package/test/bench/map-no-cast.html +53 -53
- package/test/bench/map-set.html +52 -52
- package/test/bench/map.html +51 -51
- package/test/bench/object-models.html +87 -87
- package/test/function-model.spec.cjs +161 -162
- package/test/function-model.test-d.ts +18 -0
- package/test/index.cjs +13 -13
- package/test/map-model.spec.cjs +224 -224
- package/test/map-model.test-d.ts +21 -0
- package/test/model.spec.cjs +30 -30
- package/test/object-model.spec.cjs +1345 -1346
- package/test/object-model.test-d.ts +53 -0
- package/test/set-model.spec.cjs +213 -213
- package/test/set-model.test-d.ts +17 -0
- package/test/umd.html +25 -25
- package/types/definitions.d.ts +43 -0
- package/types/helpers.d.ts +4 -0
- package/types/index.d.ts +6 -128
package/test/bench/bench-lib.js
CHANGED
|
@@ -1,50 +1,50 @@
|
|
|
1
|
-
let table = document.createElement("table")
|
|
2
|
-
document.body.appendChild(table)
|
|
3
|
-
|
|
4
|
-
const bench = tests => {
|
|
5
|
-
let t0 = performance.now();
|
|
6
|
-
bench1(tests, 0, () => {
|
|
7
|
-
console.log(`Finished tests in ${(performance.now() - t0).toFixed(0)} ms`)
|
|
8
|
-
console.log(tests);
|
|
9
|
-
})
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
const bench1 = (tests, i, onFinish) => {
|
|
13
|
-
let test = tests[i] = Object.assign({
|
|
14
|
-
nbIter: 10,
|
|
15
|
-
description: tests[i].run.name,
|
|
16
|
-
done: false,
|
|
17
|
-
times: [],
|
|
18
|
-
tr: table.insertRow()
|
|
19
|
-
}, tests[i]);
|
|
20
|
-
|
|
21
|
-
iter(test, 0, () => {
|
|
22
|
-
let averageTime = test.times.reduce((a, b) => a + b, 0) / test.nbIter;
|
|
23
|
-
log(test, averageTime.toFixed(3) + " ms")
|
|
24
|
-
|
|
25
|
-
if (i < tests.length - 1) {
|
|
26
|
-
setTimeout(() => bench1(tests, i + 1, onFinish), 10)
|
|
27
|
-
} else {
|
|
28
|
-
onFinish()
|
|
29
|
-
}
|
|
30
|
-
})
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const iter = (test, i, onFinish) => {
|
|
34
|
-
log(test, `test ${i + 1} / ${test.nbIter}`)
|
|
35
|
-
|
|
36
|
-
let t0 = performance.now();
|
|
37
|
-
test.run();
|
|
38
|
-
test.times.push(performance.now() - t0)
|
|
39
|
-
|
|
40
|
-
if (i < test.nbIter - 1) {
|
|
41
|
-
setTimeout(() => iter(test, i + 1, onFinish), 10);
|
|
42
|
-
} else {
|
|
43
|
-
test.done = true;
|
|
44
|
-
onFinish();
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const log = (test, msg) => { test.tr.textContent = test.description + ": " + msg }
|
|
49
|
-
|
|
1
|
+
let table = document.createElement("table")
|
|
2
|
+
document.body.appendChild(table)
|
|
3
|
+
|
|
4
|
+
const bench = tests => {
|
|
5
|
+
let t0 = performance.now();
|
|
6
|
+
bench1(tests, 0, () => {
|
|
7
|
+
console.log(`Finished tests in ${(performance.now() - t0).toFixed(0)} ms`)
|
|
8
|
+
console.log(tests);
|
|
9
|
+
})
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const bench1 = (tests, i, onFinish) => {
|
|
13
|
+
let test = tests[i] = Object.assign({
|
|
14
|
+
nbIter: 10,
|
|
15
|
+
description: tests[i].run.name,
|
|
16
|
+
done: false,
|
|
17
|
+
times: [],
|
|
18
|
+
tr: table.insertRow()
|
|
19
|
+
}, tests[i]);
|
|
20
|
+
|
|
21
|
+
iter(test, 0, () => {
|
|
22
|
+
let averageTime = test.times.reduce((a, b) => a + b, 0) / test.nbIter;
|
|
23
|
+
log(test, averageTime.toFixed(3) + " ms")
|
|
24
|
+
|
|
25
|
+
if (i < tests.length - 1) {
|
|
26
|
+
setTimeout(() => bench1(tests, i + 1, onFinish), 10)
|
|
27
|
+
} else {
|
|
28
|
+
onFinish()
|
|
29
|
+
}
|
|
30
|
+
})
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const iter = (test, i, onFinish) => {
|
|
34
|
+
log(test, `test ${i + 1} / ${test.nbIter}`)
|
|
35
|
+
|
|
36
|
+
let t0 = performance.now();
|
|
37
|
+
test.run();
|
|
38
|
+
test.times.push(performance.now() - t0)
|
|
39
|
+
|
|
40
|
+
if (i < test.nbIter - 1) {
|
|
41
|
+
setTimeout(() => iter(test, i + 1, onFinish), 10);
|
|
42
|
+
} else {
|
|
43
|
+
test.done = true;
|
|
44
|
+
onFinish();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const log = (test, msg) => { test.tr.textContent = test.description + ": " + msg }
|
|
49
|
+
|
|
50
50
|
if(typeof window !== undefined) Object.assign(window, { bench, bench1 })
|
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
<html>
|
|
2
|
-
|
|
3
|
-
<head>
|
|
4
|
-
<title>Benchmark: Map Models without autocast</title>
|
|
5
|
-
</head>
|
|
6
|
-
|
|
7
|
-
<body>
|
|
8
|
-
<h1>Benchmark: Map Models without autocast</h1>
|
|
9
|
-
</body>
|
|
10
|
-
|
|
11
|
-
<script src="bench-lib.js"></script>
|
|
12
|
-
|
|
13
|
-
<script type="module">
|
|
14
|
-
import { Model, BasicModel, ObjectModel, MapModel } 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 = () => new OM(Object.assign({}, ...Array(10).fill().map((x, i) => ({ ["id" + i]: mockId() }))))
|
|
22
|
-
let mockOMapData = n => (new Array(n)).fill(0).map((x, i) => [i, mockOM()])
|
|
23
|
-
|
|
24
|
-
const Id = PositiveInteger.extend().as('Id');
|
|
25
|
-
|
|
26
|
-
class OM extends ObjectModel({
|
|
27
|
-
id0: [Id],
|
|
28
|
-
id0: [Id],
|
|
29
|
-
id1: [Id],
|
|
30
|
-
id2: [Id],
|
|
31
|
-
id3: [Id],
|
|
32
|
-
id4: [Id],
|
|
33
|
-
id5: [Id],
|
|
34
|
-
id6: [Id],
|
|
35
|
-
id7: [Id],
|
|
36
|
-
id8: [Id],
|
|
37
|
-
id9: [Id]
|
|
38
|
-
}) { };
|
|
39
|
-
|
|
40
|
-
const OMap = MapModel(Id, OM)
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
bench([100, 1000, 10000].map(n => ({
|
|
44
|
-
description: `Init MapModel with ${n} elements`,
|
|
45
|
-
nbIter: 10,
|
|
46
|
-
run() {
|
|
47
|
-
const data = mockOMapData(n);
|
|
48
|
-
new OMap(data)
|
|
49
|
-
}
|
|
50
|
-
})))
|
|
51
|
-
|
|
52
|
-
</script>
|
|
53
|
-
|
|
1
|
+
<html>
|
|
2
|
+
|
|
3
|
+
<head>
|
|
4
|
+
<title>Benchmark: Map Models without autocast</title>
|
|
5
|
+
</head>
|
|
6
|
+
|
|
7
|
+
<body>
|
|
8
|
+
<h1>Benchmark: Map Models without autocast</h1>
|
|
9
|
+
</body>
|
|
10
|
+
|
|
11
|
+
<script src="bench-lib.js"></script>
|
|
12
|
+
|
|
13
|
+
<script type="module">
|
|
14
|
+
import { Model, BasicModel, ObjectModel, MapModel } 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 = () => new OM(Object.assign({}, ...Array(10).fill().map((x, i) => ({ ["id" + i]: mockId() }))))
|
|
22
|
+
let mockOMapData = n => (new Array(n)).fill(0).map((x, i) => [i, mockOM()])
|
|
23
|
+
|
|
24
|
+
const Id = PositiveInteger.extend().as('Id');
|
|
25
|
+
|
|
26
|
+
class OM extends ObjectModel({
|
|
27
|
+
id0: [Id],
|
|
28
|
+
id0: [Id],
|
|
29
|
+
id1: [Id],
|
|
30
|
+
id2: [Id],
|
|
31
|
+
id3: [Id],
|
|
32
|
+
id4: [Id],
|
|
33
|
+
id5: [Id],
|
|
34
|
+
id6: [Id],
|
|
35
|
+
id7: [Id],
|
|
36
|
+
id8: [Id],
|
|
37
|
+
id9: [Id]
|
|
38
|
+
}) { };
|
|
39
|
+
|
|
40
|
+
const OMap = MapModel(Id, OM)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
bench([100, 1000, 10000].map(n => ({
|
|
44
|
+
description: `Init MapModel with ${n} elements`,
|
|
45
|
+
nbIter: 10,
|
|
46
|
+
run() {
|
|
47
|
+
const data = mockOMapData(n);
|
|
48
|
+
new OMap(data)
|
|
49
|
+
}
|
|
50
|
+
})))
|
|
51
|
+
|
|
52
|
+
</script>
|
|
53
|
+
|
|
54
54
|
</html>
|
package/test/bench/map-set.html
CHANGED
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
<html>
|
|
2
|
-
|
|
3
|
-
<head>
|
|
4
|
-
<title>Benchmark: Map Models, set one by one</title>
|
|
5
|
-
</head>
|
|
6
|
-
|
|
7
|
-
<body>
|
|
8
|
-
<h1>Benchmark: Map Models, set one by one</h1>
|
|
9
|
-
</body>
|
|
10
|
-
|
|
11
|
-
<script src="bench-lib.js"></script>
|
|
12
|
-
|
|
13
|
-
<script type="module">
|
|
14
|
-
import { Model, BasicModel, ObjectModel, MapModel } 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 mockOMapData = n => (new Array(n)).fill(0).map((x, i) => [i, 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 OMap = MapModel(Id, OM)
|
|
40
|
-
|
|
41
|
-
bench([100, 1000, 10000].map(n => ({
|
|
42
|
-
description: `Init MapModel with ${n} elements`,
|
|
43
|
-
nbIter: 10,
|
|
44
|
-
run() {
|
|
45
|
-
const data = mockOMapData(n);
|
|
46
|
-
const map = new OMap([])
|
|
47
|
-
for (let [key, value] of data) map.set(key, value)
|
|
48
|
-
}
|
|
49
|
-
})))
|
|
50
|
-
|
|
51
|
-
</script>
|
|
52
|
-
|
|
1
|
+
<html>
|
|
2
|
+
|
|
3
|
+
<head>
|
|
4
|
+
<title>Benchmark: Map Models, set one by one</title>
|
|
5
|
+
</head>
|
|
6
|
+
|
|
7
|
+
<body>
|
|
8
|
+
<h1>Benchmark: Map Models, set one by one</h1>
|
|
9
|
+
</body>
|
|
10
|
+
|
|
11
|
+
<script src="bench-lib.js"></script>
|
|
12
|
+
|
|
13
|
+
<script type="module">
|
|
14
|
+
import { Model, BasicModel, ObjectModel, MapModel } 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 mockOMapData = n => (new Array(n)).fill(0).map((x, i) => [i, 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 OMap = MapModel(Id, OM)
|
|
40
|
+
|
|
41
|
+
bench([100, 1000, 10000].map(n => ({
|
|
42
|
+
description: `Init MapModel with ${n} elements`,
|
|
43
|
+
nbIter: 10,
|
|
44
|
+
run() {
|
|
45
|
+
const data = mockOMapData(n);
|
|
46
|
+
const map = new OMap([])
|
|
47
|
+
for (let [key, value] of data) map.set(key, value)
|
|
48
|
+
}
|
|
49
|
+
})))
|
|
50
|
+
|
|
51
|
+
</script>
|
|
52
|
+
|
|
53
53
|
</html>
|
package/test/bench/map.html
CHANGED
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
<html>
|
|
2
|
-
|
|
3
|
-
<head>
|
|
4
|
-
<title>Benchmark: Map Models</title>
|
|
5
|
-
</head>
|
|
6
|
-
|
|
7
|
-
<body>
|
|
8
|
-
<h1>Benchmark: Map Models</h1>
|
|
9
|
-
</body>
|
|
10
|
-
|
|
11
|
-
<script src="bench-lib.js"></script>
|
|
12
|
-
|
|
13
|
-
<script type="module">
|
|
14
|
-
import { Model, BasicModel, ObjectModel, MapModel } 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 mockOMapData = n => (new Array(n)).fill(0).map((x, i) => [i, 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 OMap = MapModel(Id, OM)
|
|
40
|
-
|
|
41
|
-
bench([100, 1000, 10000].map(n => ({
|
|
42
|
-
description: `Init MapModel with ${n} elements`,
|
|
43
|
-
nbIter: 10,
|
|
44
|
-
run() {
|
|
45
|
-
const data = mockOMapData(n);
|
|
46
|
-
new OMap(data)
|
|
47
|
-
}
|
|
48
|
-
})))
|
|
49
|
-
|
|
50
|
-
</script>
|
|
51
|
-
|
|
1
|
+
<html>
|
|
2
|
+
|
|
3
|
+
<head>
|
|
4
|
+
<title>Benchmark: Map Models</title>
|
|
5
|
+
</head>
|
|
6
|
+
|
|
7
|
+
<body>
|
|
8
|
+
<h1>Benchmark: Map Models</h1>
|
|
9
|
+
</body>
|
|
10
|
+
|
|
11
|
+
<script src="bench-lib.js"></script>
|
|
12
|
+
|
|
13
|
+
<script type="module">
|
|
14
|
+
import { Model, BasicModel, ObjectModel, MapModel } 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 mockOMapData = n => (new Array(n)).fill(0).map((x, i) => [i, 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 OMap = MapModel(Id, OM)
|
|
40
|
+
|
|
41
|
+
bench([100, 1000, 10000].map(n => ({
|
|
42
|
+
description: `Init MapModel with ${n} elements`,
|
|
43
|
+
nbIter: 10,
|
|
44
|
+
run() {
|
|
45
|
+
const data = mockOMapData(n);
|
|
46
|
+
new OMap(data)
|
|
47
|
+
}
|
|
48
|
+
})))
|
|
49
|
+
|
|
50
|
+
</script>
|
|
51
|
+
|
|
52
52
|
</html>
|
|
@@ -1,88 +1,88 @@
|
|
|
1
|
-
<html>
|
|
2
|
-
|
|
3
|
-
<head>
|
|
4
|
-
<title>Benchmark: Object Models</title>
|
|
5
|
-
</head>
|
|
6
|
-
|
|
7
|
-
<body>
|
|
8
|
-
<h1>Benchmark: Object 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
|
-
function benchComposition() {
|
|
17
|
-
const Person = ObjectModel({
|
|
18
|
-
name: String,
|
|
19
|
-
age: [Number, Date],
|
|
20
|
-
female: [Boolean],
|
|
21
|
-
address: {
|
|
22
|
-
work: {
|
|
23
|
-
city: [String]
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
const Family = ObjectModel({
|
|
29
|
-
father: Person,
|
|
30
|
-
mother: Person.extend({ female: true }),
|
|
31
|
-
children: ArrayModel(Person),
|
|
32
|
-
grandparents: [ArrayModel(Person).assert(function (persons) {
|
|
33
|
-
return persons && persons.length <= 4
|
|
34
|
-
})]
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
const joe = Person({
|
|
38
|
-
name: "Joe",
|
|
39
|
-
age: 42,
|
|
40
|
-
female: false
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const ann = new Person({
|
|
45
|
-
female: true,
|
|
46
|
-
age: joe.age - 5,
|
|
47
|
-
name: joe.name + "'s wife"
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
let joefamily = new Family({
|
|
51
|
-
father: joe,
|
|
52
|
-
mother: ann,
|
|
53
|
-
children: [],
|
|
54
|
-
grandparents: []
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
const duckmother = {
|
|
58
|
-
female: true,
|
|
59
|
-
age: joe.age - 5,
|
|
60
|
-
name: joe.name + "'s wife"
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
joefamily = new Family({
|
|
64
|
-
father: joe,
|
|
65
|
-
mother: duckmother,
|
|
66
|
-
children: []
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
Person.test(duckmother);
|
|
70
|
-
|
|
71
|
-
joefamily.mother.name = "Daisy";
|
|
72
|
-
try {
|
|
73
|
-
joefamily.mother.female = "Quack !";
|
|
74
|
-
} catch (e) { }
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
bench([
|
|
78
|
-
{
|
|
79
|
-
description: `Bench composed Object Models`,
|
|
80
|
-
nbIter: 100,
|
|
81
|
-
run() {
|
|
82
|
-
benchComposition();
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
])
|
|
86
|
-
</script>
|
|
87
|
-
|
|
1
|
+
<html>
|
|
2
|
+
|
|
3
|
+
<head>
|
|
4
|
+
<title>Benchmark: Object Models</title>
|
|
5
|
+
</head>
|
|
6
|
+
|
|
7
|
+
<body>
|
|
8
|
+
<h1>Benchmark: Object 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
|
+
function benchComposition() {
|
|
17
|
+
const Person = ObjectModel({
|
|
18
|
+
name: String,
|
|
19
|
+
age: [Number, Date],
|
|
20
|
+
female: [Boolean],
|
|
21
|
+
address: {
|
|
22
|
+
work: {
|
|
23
|
+
city: [String]
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
const Family = ObjectModel({
|
|
29
|
+
father: Person,
|
|
30
|
+
mother: Person.extend({ female: true }),
|
|
31
|
+
children: ArrayModel(Person),
|
|
32
|
+
grandparents: [ArrayModel(Person).assert(function (persons) {
|
|
33
|
+
return persons && persons.length <= 4
|
|
34
|
+
})]
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const joe = Person({
|
|
38
|
+
name: "Joe",
|
|
39
|
+
age: 42,
|
|
40
|
+
female: false
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
const ann = new Person({
|
|
45
|
+
female: true,
|
|
46
|
+
age: joe.age - 5,
|
|
47
|
+
name: joe.name + "'s wife"
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
let joefamily = new Family({
|
|
51
|
+
father: joe,
|
|
52
|
+
mother: ann,
|
|
53
|
+
children: [],
|
|
54
|
+
grandparents: []
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
const duckmother = {
|
|
58
|
+
female: true,
|
|
59
|
+
age: joe.age - 5,
|
|
60
|
+
name: joe.name + "'s wife"
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
joefamily = new Family({
|
|
64
|
+
father: joe,
|
|
65
|
+
mother: duckmother,
|
|
66
|
+
children: []
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
Person.test(duckmother);
|
|
70
|
+
|
|
71
|
+
joefamily.mother.name = "Daisy";
|
|
72
|
+
try {
|
|
73
|
+
joefamily.mother.female = "Quack !";
|
|
74
|
+
} catch (e) { }
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
bench([
|
|
78
|
+
{
|
|
79
|
+
description: `Bench composed Object Models`,
|
|
80
|
+
nbIter: 100,
|
|
81
|
+
run() {
|
|
82
|
+
benchComposition();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
])
|
|
86
|
+
</script>
|
|
87
|
+
|
|
88
88
|
</html>
|