@schukai/monster 1.26.1 → 1.29.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 (198) hide show
  1. package/CHANGELOG +38 -1
  2. package/README.md +4 -4
  3. package/dist/modules/constants.js +1 -1
  4. package/dist/modules/constraints/abstract.js +1 -1
  5. package/dist/modules/constraints/abstractoperator.js +1 -1
  6. package/dist/modules/constraints/andoperator.js +1 -1
  7. package/dist/modules/constraints/invalid.js +1 -1
  8. package/dist/modules/constraints/isarray.js +1 -1
  9. package/dist/modules/constraints/isobject.js +1 -1
  10. package/dist/modules/constraints/namespace.js +1 -1
  11. package/dist/modules/constraints/oroperator.js +1 -1
  12. package/dist/modules/constraints/valid.js +1 -1
  13. package/dist/modules/data/buildmap.js +2 -2
  14. package/dist/modules/data/buildtree.js +2 -2
  15. package/dist/modules/data/datasource/namespace.js +1 -1
  16. package/dist/modules/data/datasource/restapi/writeerror.js +1 -1
  17. package/dist/modules/data/datasource/restapi.js +1 -1
  18. package/dist/modules/data/datasource/storage/localstorage.js +1 -1
  19. package/dist/modules/data/datasource/storage/namespace.js +1 -1
  20. package/dist/modules/data/datasource/storage/sessionstorage.js +1 -1
  21. package/dist/modules/data/datasource/storage.js +1 -1
  22. package/dist/modules/data/datasource.js +1 -1
  23. package/dist/modules/data/diff.js +1 -1
  24. package/dist/modules/data/extend.js +1 -1
  25. package/dist/modules/data/namespace.js +1 -1
  26. package/dist/modules/data/pathfinder.js +1 -1
  27. package/dist/modules/data/pipe.js +1 -1
  28. package/dist/modules/data/transformer.js +1 -1
  29. package/dist/modules/dom/assembler.js +1 -1
  30. package/dist/modules/dom/attributes.js +2 -2
  31. package/dist/modules/dom/constants.js +2 -2
  32. package/dist/modules/dom/customcontrol.js +1 -1
  33. package/dist/modules/dom/customelement.js +2 -2
  34. package/dist/modules/dom/events.js +2 -2
  35. package/dist/modules/dom/focusmanager.js +1 -1
  36. package/dist/modules/dom/locale.js +1 -1
  37. package/dist/modules/dom/namespace.js +1 -1
  38. package/dist/modules/dom/resource/data.js +1 -1
  39. package/dist/modules/dom/resource/link/stylesheet.js +1 -1
  40. package/dist/modules/dom/resource/link.js +1 -1
  41. package/dist/modules/dom/resource/script.js +1 -1
  42. package/dist/modules/dom/resource.js +1 -1
  43. package/dist/modules/dom/resourcemanager.js +1 -1
  44. package/dist/modules/dom/template.js +2 -2
  45. package/dist/modules/dom/theme.js +1 -1
  46. package/dist/modules/dom/updater.js +2 -2
  47. package/dist/modules/dom/util.js +1 -1
  48. package/dist/modules/dom/worker/factory.js +1 -1
  49. package/dist/modules/i18n/formatter.js +1 -1
  50. package/dist/modules/i18n/locale.js +1 -1
  51. package/dist/modules/i18n/namespace.js +1 -1
  52. package/dist/modules/i18n/provider.js +1 -1
  53. package/dist/modules/i18n/providers/fetch.js +1 -1
  54. package/dist/modules/i18n/providers/namespace.js +1 -1
  55. package/dist/modules/i18n/translations.js +1 -1
  56. package/dist/modules/logging/handler/console.js +1 -1
  57. package/dist/modules/logging/handler/namespace.js +1 -1
  58. package/dist/modules/logging/handler.js +1 -1
  59. package/dist/modules/logging/logentry.js +1 -1
  60. package/dist/modules/logging/logger.js +1 -1
  61. package/dist/modules/logging/namespace.js +1 -1
  62. package/dist/modules/math/namespace.js +1 -1
  63. package/dist/modules/math/random.js +1 -1
  64. package/dist/modules/monster.js +1 -1
  65. package/dist/modules/namespace.js +1 -1
  66. package/dist/modules/text/formatter.js +1 -1
  67. package/dist/modules/text/namespace.js +1 -1
  68. package/dist/modules/types/base.js +1 -1
  69. package/dist/modules/types/basewithoptions.js +1 -1
  70. package/dist/modules/types/binary.js +1 -1
  71. package/dist/modules/types/dataurl.js +1 -1
  72. package/dist/modules/types/global.js +1 -1
  73. package/dist/modules/types/id.js +1 -1
  74. package/dist/modules/types/is.js +1 -1
  75. package/dist/modules/types/mediatype.js +1 -1
  76. package/dist/modules/types/namespace.js +1 -1
  77. package/dist/modules/types/node.js +2 -2
  78. package/dist/modules/types/nodelist.js +2 -2
  79. package/dist/modules/types/noderecursiveiterator.js +2 -2
  80. package/dist/modules/types/observer.js +1 -1
  81. package/dist/modules/types/observerlist.js +1 -1
  82. package/dist/modules/types/proxyobserver.js +1 -1
  83. package/dist/modules/types/queue.js +1 -1
  84. package/dist/modules/types/randomid.js +1 -1
  85. package/dist/modules/types/regex.js +1 -1
  86. package/dist/modules/types/stack.js +1 -1
  87. package/dist/modules/types/tokenlist.js +1 -1
  88. package/dist/modules/types/typeof.js +1 -1
  89. package/dist/modules/types/uniquequeue.js +1 -1
  90. package/dist/modules/types/uuid.js +1 -1
  91. package/dist/modules/types/validate.js +1 -1
  92. package/dist/modules/types/version.js +2 -2
  93. package/dist/modules/util/clone.js +1 -1
  94. package/dist/modules/util/comparator.js +1 -1
  95. package/dist/modules/util/deadmansswitch.js +2 -0
  96. package/dist/modules/util/freeze.js +1 -1
  97. package/dist/modules/util/namespace.js +1 -1
  98. package/dist/modules/util/processing.js +1 -1
  99. package/dist/modules/util/trimspaces.js +1 -1
  100. package/dist/monster.dev.js +906 -619
  101. package/dist/monster.dev.js.map +1 -1
  102. package/dist/monster.js +2 -2
  103. package/package.json +1 -1
  104. package/source/constraints/andoperator.js +5 -5
  105. package/source/constraints/invalid.js +3 -3
  106. package/source/constraints/isarray.js +3 -3
  107. package/source/constraints/isobject.js +3 -3
  108. package/source/constraints/oroperator.js +5 -5
  109. package/source/constraints/valid.js +3 -3
  110. package/source/data/buildmap.js +10 -11
  111. package/source/data/buildtree.js +51 -17
  112. package/source/data/datasource/restapi.js +3 -3
  113. package/source/data/datasource/storage/localstorage.js +2 -2
  114. package/source/data/datasource/storage/sessionstorage.js +2 -2
  115. package/source/data/datasource/storage.js +3 -3
  116. package/source/data/datasource.js +3 -3
  117. package/source/data/diff.js +3 -3
  118. package/source/data/extend.js +2 -2
  119. package/source/data/pathfinder.js +4 -4
  120. package/source/data/pipe.js +3 -3
  121. package/source/data/transformer.js +3 -3
  122. package/source/dom/assembler.js +2 -2
  123. package/source/dom/attributes.js +111 -28
  124. package/source/dom/constants.js +17 -1
  125. package/source/dom/customcontrol.js +1 -1
  126. package/source/dom/customelement.js +27 -13
  127. package/source/dom/events.js +68 -12
  128. package/source/dom/focusmanager.js +2 -2
  129. package/source/dom/locale.js +2 -2
  130. package/source/dom/resource/data.js +2 -2
  131. package/source/dom/resource/link/stylesheet.js +2 -2
  132. package/source/dom/resource/link.js +2 -2
  133. package/source/dom/resource/script.js +2 -2
  134. package/source/dom/resource.js +2 -2
  135. package/source/dom/resourcemanager.js +2 -2
  136. package/source/dom/template.js +41 -11
  137. package/source/dom/theme.js +3 -3
  138. package/source/dom/updater.js +183 -100
  139. package/source/dom/util.js +6 -6
  140. package/source/dom/worker/factory.js +2 -2
  141. package/source/i18n/formatter.js +4 -4
  142. package/source/i18n/locale.js +4 -4
  143. package/source/i18n/provider.js +2 -2
  144. package/source/i18n/providers/fetch.js +3 -3
  145. package/source/i18n/translations.js +4 -4
  146. package/source/logging/handler/console.js +2 -2
  147. package/source/logging/handler.js +2 -2
  148. package/source/logging/logentry.js +2 -2
  149. package/source/logging/logger.js +2 -2
  150. package/source/math/random.js +2 -2
  151. package/source/namespace.js +1 -1
  152. package/source/text/formatter.js +3 -3
  153. package/source/types/base.js +2 -2
  154. package/source/types/basewithoptions.js +2 -2
  155. package/source/types/binary.js +4 -4
  156. package/source/types/dataurl.js +4 -4
  157. package/source/types/global.js +4 -4
  158. package/source/types/id.js +2 -2
  159. package/source/types/is.js +20 -20
  160. package/source/types/mediatype.js +4 -4
  161. package/source/types/node.js +33 -2
  162. package/source/types/nodelist.js +9 -5
  163. package/source/types/noderecursiveiterator.js +29 -7
  164. package/source/types/observer.js +5 -13
  165. package/source/types/observerlist.js +2 -2
  166. package/source/types/proxyobserver.js +5 -5
  167. package/source/types/queue.js +3 -3
  168. package/source/types/randomid.js +2 -2
  169. package/source/types/regex.js +2 -2
  170. package/source/types/stack.js +2 -2
  171. package/source/types/tokenlist.js +2 -2
  172. package/source/types/typeof.js +3 -3
  173. package/source/types/uniquequeue.js +2 -2
  174. package/source/types/uuid.js +2 -2
  175. package/source/types/validate.js +20 -20
  176. package/source/types/version.js +6 -6
  177. package/source/util/clone.js +2 -2
  178. package/source/util/comparator.js +3 -3
  179. package/source/util/deadmansswitch.js +124 -0
  180. package/source/util/freeze.js +2 -2
  181. package/source/util/processing.js +3 -3
  182. package/source/util/trimspaces.js +2 -2
  183. package/test/cases/data/buildtree.js +84 -21
  184. package/test/cases/dom/attributes.js +29 -6
  185. package/test/cases/dom/events.js +66 -1
  186. package/test/cases/dom/template.js +72 -14
  187. package/test/cases/dom/updater.js +102 -75
  188. package/test/cases/math/random.js +3 -0
  189. package/test/cases/monster.js +1 -1
  190. package/test/cases/types/node.js +57 -1
  191. package/test/cases/types/nodelist.js +7 -0
  192. package/test/cases/types/noderecursiveiterator.js +21 -0
  193. package/test/cases/util/deadmansswitch.js +71 -0
  194. package/test/web/import.js +1 -0
  195. package/test/web/monster-dev.html +3 -3
  196. package/test/web/monster.html +2 -2
  197. package/test/web/test.html +3 -3
  198. package/test/web/tests.js +2 -2
@@ -1,16 +1,11 @@
1
1
  'use strict';
2
2
 
3
3
  import {expect} from "chai"
4
+ import {ATTRIBUTE_THEME_NAME} from "../../../source/dom/constants.js";
4
5
 
5
6
  import {findDocumentTemplate, Template} from "../../../source/dom/template.js";
6
7
  import {initJSDOM} from "../../util/jsdom.js";
7
8
 
8
- const html1 = `
9
-
10
- <template id="mytemplate"></template>
11
-
12
- `;
13
-
14
9
 
15
10
  describe('Template', function () {
16
11
 
@@ -20,7 +15,8 @@ describe('Template', function () {
20
15
 
21
16
  beforeEach(() => {
22
17
  let mocks = document.getElementById('mocks');
23
- mocks.innerHTML = html1;
18
+ mocks.innerHTML = `
19
+ <template id="mytemplate"></template>`;
24
20
  })
25
21
 
26
22
  afterEach(() => {
@@ -75,14 +71,76 @@ describe('Template', function () {
75
71
  });
76
72
 
77
73
  describe('.findDocumentTemplate()', function () {
78
- it('should throw Template not found', function () {
79
- const div = document.createElement('div');
80
- div.remove();
81
- let t = findDocumentTemplate("mytemplate", div);
82
- expect(t).is.instanceof(Template);
74
+ describe('Template', function () {
75
+ it('should find template over ownerDocument', function () {
76
+ const div = document.createElement('div');
77
+ div.remove();
78
+ let t = findDocumentTemplate("mytemplate", div);
79
+ expect(t).is.instanceof(Template);
80
+
81
+ })
82
+ });
83
83
 
84
- })
85
- });
84
+ describe('Thmened Template', function () {
85
+ let memAttributeValue;
86
+
87
+ beforeEach(() => {
88
+ let mocks = document.getElementById('mocks');
89
+ mocks.innerHTML = `
90
+ <template id="mytemplate"><p>1</p></template>
91
+ <template id="mytemplate-monster"><p>2</p></template>
92
+ <template id="mytemplate-testtheme"><p>4</p></template>
93
+ <template id="myprefix-mytemplate-monster"><p>3</p></template>
94
+ `;
95
+
96
+ let html = document.querySelector('html');
97
+ if (html.hasAttribute(ATTRIBUTE_THEME_NAME)) {
98
+ memAttributeValue = html.getAttribute(ATTRIBUTE_THEME_NAME)
99
+ }
100
+
101
+ })
102
+
103
+ afterEach(() => {
104
+ let mocks = document.getElementById('mocks');
105
+ mocks.innerHTML = "";
86
106
 
107
+ let html = document.querySelector('html');
87
108
 
109
+ if (html.hasAttribute(ATTRIBUTE_THEME_NAME)) {
110
+ html.removeAttribute(ATTRIBUTE_THEME_NAME);
111
+ }
112
+
113
+ if (memAttributeValue) {
114
+ html.setAttribute(ATTRIBUTE_THEME_NAME, memAttributeValue)
115
+ }
116
+
117
+ })
118
+
119
+
120
+ it('should find template over ownerDocument', function () {
121
+ let html = document.querySelector('html');
122
+ const div = document.createElement('div');
123
+ div.setAttribute('data-monster-template-prefix', 'myprefix')
124
+ div.remove();
125
+ let t1 = findDocumentTemplate("mytemplate", div);
126
+ expect(t1).is.instanceof(Template);
127
+ expect(t1.createDocumentFragment().textContent).is.equal("3");
128
+
129
+ div.removeAttribute('data-monster-template-prefix')
130
+ let t2 = findDocumentTemplate("mytemplate", div);
131
+ expect(t2).is.instanceof(Template);
132
+ expect(t2.createDocumentFragment().textContent).is.equal("2");
133
+
134
+ html.setAttribute(ATTRIBUTE_THEME_NAME,'testtheme');
135
+ let a= html.outerHTML;
136
+ let t3 = findDocumentTemplate("mytemplate", div);
137
+ expect(t3).is.instanceof(Template);
138
+ expect(t3.createDocumentFragment().textContent).is.equal("4");
139
+
140
+
141
+ })
142
+ });
143
+
144
+
145
+ });
88
146
  });
@@ -12,99 +12,100 @@ let expect = chai.expect;
12
12
 
13
13
  chai.use(chaiDom);
14
14
 
15
- let html1 = `<template id="current">
16
- <li data-monster-replace="path:current | tojson"></li>
17
- </template>
18
- <div id="test1">
19
- <ul data-monster-insert="current path:a.b">
20
- </ul>
21
- </div>
22
- <div id="test2">
23
- <ul data-monster-insert="current path:a.b | doit">
24
- </ul>
25
- </div>
26
- <div id="test3">
27
- <div data-monster-attributes="class path:a.b">
28
- <input data-monster-attributes="value path:a.c" id="input1">
29
- <input data-monster-attributes="checked path:a.checkbox" type="checkbox" name="checkbox" id="checkbox">
30
- <input data-monster-attributes="value path:a.text" type="text" name="text" id="text">
31
- <input data-monster-attributes="checked path:a.radio" type="radio" name="radio" value="r1" id="radio">
32
- <input type="radio" name="radio" value="r2" id="r2">
33
- <input type="radio" name="radio" value="rx" id="rx">
34
-
35
- <select data-monster-attributes="value path:a.select" name="select" id="select">
36
- <option value="other-value">value1</option>
37
- <option>value2</option>
38
- </select>
39
-
40
- <select data-monster-attributes="value path:a.multiselect" name="multiselect" multiple id="multiselect">
41
- <option>value1</option>
42
- <option>value2</option>
43
- <option>value3</option>
44
- <option>value4</option>
45
- <option value="other-value5">value5</option>
46
- </select>
47
-
48
- <textarea name="textarea" id="textarea" data-monster-attributes="value path:a.textarea"></textarea>
49
-
15
+ let html1 = `
16
+ <template id="current">
17
+ <li data-monster-replace="path:current | tojson"></li>
18
+ </template>
19
+ <div id="test1">
20
+ <ul data-monster-insert="current path:a.b">
21
+ </ul>
22
+ </div>
23
+ <div id="test2">
24
+ <ul data-monster-insert="current path:a.b | doit">
25
+ </ul>
26
+ </div>
27
+ <div id="test3">
28
+ <div data-monster-attributes="class path:a.b">
29
+ <input data-monster-attributes="value path:a.c" id="input1">
30
+ <input data-monster-attributes="checked path:a.checkbox" type="checkbox" name="checkbox" id="checkbox">
31
+ <input data-monster-attributes="value path:a.text" type="text" name="text" id="text">
32
+ <input data-monster-attributes="checked path:a.radio" type="radio" name="radio" value="r1" id="radio">
33
+ <input type="radio" name="radio" value="r2" id="r2">
34
+ <input type="radio" name="radio" value="rx" id="rx">
35
+
36
+ <select data-monster-attributes="value path:a.select" name="select" id="select">
37
+ <option value="other-value">value1</option>
38
+ <option>value2</option>
39
+ </select>
40
+
41
+ <select data-monster-attributes="value path:a.multiselect" name="multiselect" multiple id="multiselect">
42
+ <option>value1</option>
43
+ <option>value2</option>
44
+ <option>value3</option>
45
+ <option>value4</option>
46
+ <option value="other-value5">value5</option>
47
+ </select>
48
+
49
+ <textarea name="textarea" id="textarea" data-monster-attributes="value path:a.textarea"></textarea>
50
+
51
+ </div>
50
52
  </div>
51
- </div>
52
53
 
53
54
  `;
54
55
 
55
56
  let html2 = `
56
57
  <div id="test1">
57
- <div data-monster-replace="path:text | tolower"> </div>
58
- <div data-monster-replace="path:text | call:myformatter"> </div>
58
+ <div data-monster-replace="path:text | tolower"></div>
59
+ <div data-monster-replace="path:text | call:myformatter"></div>
59
60
  <div data-monster-replace="static:hello\\ "></div>
60
61
  </div>
61
62
  `;
62
63
 
63
64
  let html3 = `
64
65
 
65
- <template id="myinnerid">
66
- <span data-monster-replace="path:myinnerid | tojson"></span>
67
- </template>
66
+ <template id="myinnerid">
67
+ <span data-monster-replace="path:myinnerid | tojson"></span>
68
+ </template>
68
69
 
69
- <template id="myid">
70
- <p data-monster-insert="myinnerid path:a.b"></p>
71
- </template>
70
+ <template id="myid">
71
+ <p data-monster-insert="myinnerid path:a.b"></p>
72
+ </template>
72
73
 
73
- <div id="test1">
74
- <div data-monster-insert="myid path:a.b"></div>
75
- </div>
74
+ <div id="test1">
75
+ <div data-monster-insert="myid path:a.b"></div>
76
+ </div>
76
77
 
77
78
  `;
78
79
 
79
80
  let html4 = `
80
- <div>
81
- <form id="form1">
82
- <input type="checkbox" value="checked" name="checkbox" data-monster-bind="path:state">
83
- <input type="text" name="text">
84
- <input type="radio" name="radio" value="r1" id="r1" data-monster-bind="path:radio">
85
- <input type="radio" name="radio" value="r2" id="r2" data-monster-bind="path:radio">
86
- <input type="radio" name="radio" value="rx" id="rx" data-comment="not called because no bind attribute">
87
- <input type="button" name="button">
88
-
89
- <select name="select1" id="select1" data-monster-bind="path:select">
90
- <option>value1</option>
91
- <option>value2</option>
92
- </select>
93
-
94
- <select name="select2" multiple id="select2" data-monster-bind="path:multiselect">
95
- <option>value1</option>
96
- <option>value2</option>
97
- <option>value3</option>
98
- <option>value4</option>
99
- <option>value5</option>
100
- </select>
101
-
102
- <textarea name="textarea" id="textarea" data-monster-bind="path:textarea">
81
+ <div>
82
+ <form id="form1">
83
+ <input type="checkbox" value="checked" name="checkbox" data-monster-bind="path:state">
84
+ <input type="text" name="text">
85
+ <input type="radio" name="radio" value="r1" id="r1" data-monster-bind="path:radio">
86
+ <input type="radio" name="radio" value="r2" id="r2" data-monster-bind="path:radio">
87
+ <input type="radio" name="radio" value="rx" id="rx" data-comment="not called because no bind attribute">
88
+ <input type="button" name="button">
89
+
90
+ <select name="select1" id="select1" data-monster-bind="path:select">
91
+ <option>value1</option>
92
+ <option>value2</option>
93
+ </select>
94
+
95
+ <select name="select2" multiple id="select2" data-monster-bind="path:multiselect">
96
+ <option>value1</option>
97
+ <option>value2</option>
98
+ <option>value3</option>
99
+ <option>value4</option>
100
+ <option>value5</option>
101
+ </select>
102
+
103
+ <textarea name="textarea" id="textarea" data-monster-bind="path:textarea">
103
104
 
104
105
  </textarea>
105
106
 
106
- </form>
107
- </div>
107
+ </form>
108
+ </div>
108
109
 
109
110
  `;
110
111
 
@@ -515,7 +516,7 @@ describe('DOM', function () {
515
516
  })
516
517
  }, 100)
517
518
 
518
- });
519
+ });
519
520
  });
520
521
  });
521
522
 
@@ -638,14 +639,13 @@ describe('DOM', function () {
638
639
  });
639
640
  });
640
641
 
641
-
642
642
  describe('Get Attribute Pipe', function () {
643
643
  let id, mocks;
644
644
  beforeEach(() => {
645
645
  mocks = document.getElementById('mocks');
646
646
  id = new ID('monster');
647
647
  mocks.innerHTML = ` <div id="` + id + `"
648
- data-monster-replace="path:a | if:value:\\ "></div>`
648
+ data-monster-replace="path:a | if:value:\\ "></div>`
649
649
  })
650
650
 
651
651
  afterEach(() => {
@@ -661,4 +661,31 @@ describe('DOM', function () {
661
661
  });
662
662
  });
663
663
 
664
+
665
+ describe('manuel update', function () {
666
+ let id, mocks;
667
+
668
+ beforeEach(() => {
669
+ mocks = document.getElementById('mocks');
670
+ id = new ID('monster').toString();
671
+ mocks.innerHTML = `<input id="` + id + `"data-monster-bind="path:myvalue">`
672
+ })
673
+
674
+ afterEach(() => {
675
+ mocks.innerHTML = "";
676
+ })
677
+
678
+ it('should get value', function () {
679
+
680
+ document.getElementById(id).value="hello";
681
+ const updater = new Updater(mocks);
682
+ const subject = updater.getSubject();
683
+
684
+ expect(subject).to.not.have.property('myvalue');
685
+ updater.retrieve();
686
+ expect(subject).to.have.property('myvalue');
687
+ });
688
+
689
+
690
+ });
664
691
  });
@@ -1,8 +1,11 @@
1
1
  /** nodejs doesnt support window.crypt */
2
2
  import {expect} from "chai"
3
+ import {getGlobal} from "../../../source/types/global.js";
3
4
  import * as Crypto from "@peculiar/webcrypto";
4
5
  import {Monster, random} from "../../../source/math/random.js";
5
6
 
7
+ const global = getGlobal();
8
+
6
9
  if (!global['crypto']) {
7
10
  global['crypto'] = new Crypto.Crypto();
8
11
  }
@@ -9,7 +9,7 @@ describe('Monster', function () {
9
9
  let monsterVersion
10
10
 
11
11
  /**#@+ dont touch, replaced by make with package.json version */
12
- monsterVersion = new Version('1.26.1')
12
+ monsterVersion = new Version('1.29.0')
13
13
  /**#@-*/
14
14
 
15
15
  let m = Monster.getVersion();
@@ -102,7 +102,7 @@ describe('NodeList', function () {
102
102
  result.push(n.value + ":" + n.level);
103
103
  }
104
104
 
105
-
105
+
106
106
  expect(result).to.deep.equal([
107
107
  'root:0',
108
108
  'n1:1',
@@ -192,5 +192,61 @@ describe('NodeList', function () {
192
192
 
193
193
  })
194
194
 
195
+ describe('Levels', function () {
196
+
197
+ it('n2 should level 2', function () {
198
+
199
+ const n0 = new Node('abc');
200
+
201
+ const n1 = new Node('def');
202
+ n0.appendChild(n1)
203
+
204
+ const n2 = new Node('ghi');
205
+ n1.appendChild(n2);
206
+
207
+ const n3 = new Node('jkl');
208
+ n2.appendChild(n3);
209
+
210
+ expect(n0.level).to.be.equal(0);
211
+ expect(n1.level).to.be.equal(1);
212
+ expect(n2.level).to.be.equal(2);
213
+ expect(n3.level).to.be.equal(3);
214
+
215
+ });
216
+ });
217
+
218
+
219
+ describe('toString()', function () {
220
+
221
+ it('should output empty string', function () {
222
+ const node = new Node();
223
+ expect(node.toString()).is.equal('');
224
+ });
225
+
226
+ it('should output string', function () {
227
+ const n0 = new Node('abc');
228
+
229
+ const n1 = new Node('def');
230
+ n0.appendChild(n1)
231
+
232
+ const n11 = new Node('ghi');
233
+ n0.appendChild(n11)
234
+
235
+ const n2 = new Node('jkl');
236
+ n1.appendChild(n2);
237
+
238
+ const n3 = new Node('mno');
239
+ n1.appendChild(n3);
240
+
241
+ const n4 = new Node('pqr');
242
+ n2.appendChild(n4);
243
+
244
+ expect(n2.level).to.be.equal(2)
245
+
246
+ console.log(n0.toString());
247
+ // expect(n0.toString()).is.equal('');
248
+ });
249
+ });
250
+
195
251
 
196
252
  });
@@ -33,8 +33,10 @@ describe('NodeList', function () {
33
33
 
34
34
  expect(nodeList2.size).to.equal(3);
35
35
  });
36
+
36
37
  });
37
38
 
39
+
38
40
  it('create NodeList', function () {
39
41
  expect(new NodeList()).is.instanceof(NodeList);
40
42
  })
@@ -55,6 +57,11 @@ describe('NodeList', function () {
55
57
  const n = new Node;
56
58
  expect(new NodeList().add(n).has(n)).to.be.true;
57
59
  })
60
+
61
+ it('toString', function () {
62
+ const n = new Node;
63
+ expect(new NodeList().add(new Node('a').appendChild(new Node('b'))).toString()).to.be.equal('a\n └b');
64
+ })
58
65
 
59
66
  it('throw exception', function () {
60
67
  expect(() => new NodeList().add(1)).to.throw(Error);
@@ -2,6 +2,7 @@
2
2
 
3
3
  import {expect} from "chai"
4
4
  import {Node} from "../../../source/types/node.js";
5
+ import {NodeList} from "../../../source/types/nodelist.js";
5
6
  import {NodeRecursiveIterator} from "../../../source/types/noderecursiveiterator.js";
6
7
 
7
8
  describe('NodeRecursiveIterator', function () {
@@ -51,4 +52,24 @@ describe('NodeRecursiveIterator', function () {
51
52
 
52
53
  });
53
54
 
55
+ it('should iterate nodelist', function () {
56
+ const nodeList = new NodeList();
57
+
58
+ nodeList.add(
59
+ (new Node('2')).appendChild(new Node('2.1')).appendChild(new Node('2.2')).appendChild(new Node('2.3')).appendChild(new Node('3')).appendChild(new Node('4').appendChild(new Node('4.1')).appendChild(new Node('4.2'))));
60
+
61
+ nodeList.add(new Node('x'));
62
+
63
+ const iterator = new NodeRecursiveIterator(nodeList);
64
+
65
+ const result = [];
66
+ for (const n of iterator) {
67
+ expect(n).to.be.an.instanceof(Node);
68
+ result.push(n.value);
69
+ }
70
+
71
+ expect(result).to.deep.equal(['2', '2.1', '2.2', '2.3', '3', '4', '4.1', '4.2', 'x']);
72
+
73
+ });
74
+
54
75
  });
@@ -0,0 +1,71 @@
1
+ import {DeadMansSwitch} from "../../../source/util/deadmansswitch.js";
2
+
3
+
4
+ describe('DeadMansSwitch', function () {
5
+
6
+ describe('run instance', function () {
7
+
8
+ it('should run', function (done) {
9
+
10
+ const ms1 = Date.now();
11
+
12
+ const deadmansswitch = new DeadMansSwitch(100, () => {
13
+
14
+ const ms2 = Date.now();
15
+
16
+ const diff = ms2 - ms1;
17
+ if (diff < 100) {
18
+ done('to short ' + diff);
19
+ return;
20
+ }
21
+ done();
22
+ })
23
+
24
+
25
+ });
26
+ });
27
+
28
+ describe('run instance and touch', function () {
29
+
30
+ it('should run', function (done) {
31
+
32
+ const ms1 = Date.now();
33
+
34
+ const deadmansswitch = new DeadMansSwitch(100, () => {
35
+
36
+ const ms2 = Date.now();
37
+
38
+ const diff = ms2 - ms1;
39
+
40
+ if (ms1 > ms2) {
41
+ done('timing error');
42
+ return;
43
+ }
44
+
45
+ if (diff < 600) {
46
+ done('to short ' + diff);
47
+ return;
48
+ }
49
+ done();
50
+ })
51
+
52
+ // 0 ms: init() -> wait 100 ms
53
+ // 50 ms: touch() -> wait 100 ms
54
+ // -> wait 100
55
+ // 100 ms: touch(500) -> wait 500 ms
56
+ // -> wait 500
57
+ // 600 ms: execute callback
58
+ setTimeout(() => {
59
+ deadmansswitch.touch()
60
+
61
+ setTimeout(() => {
62
+ deadmansswitch.touch(500)
63
+ }, 50)
64
+
65
+ }, 50)
66
+
67
+
68
+ });
69
+ });
70
+
71
+ });
@@ -57,6 +57,7 @@ import "../cases/constraint/invalid.js";
57
57
  import "../cases/constraint/oroperator.js";
58
58
  import "../cases/constraint/andoperator.js";
59
59
  import "../cases/constraint/isarray.js";
60
+ import "../cases/util/deadmansswitch.js";
60
61
  import "../cases/util/comparator.js";
61
62
  import "../cases/util/trimspaces.js";
62
63
  import "../cases/util/clone.js";
@@ -10,13 +10,13 @@
10
10
  crossorigin="anonymous"
11
11
  referrerpolicy="no-referrer"></script>
12
12
 
13
- <script src="https://monsterjs.org/dist/1.26.1/dist/monster.dev.js"></script>
13
+ <script src="https://monsterjs.org/dist/1.29.0/dist/monster.dev.js"></script>
14
14
 
15
15
  </head>
16
16
  <body>
17
17
  <div id="headline" style="display: flex;align-items: center;justify-content: center;flex-direction: column;">
18
- <h1 style='margin-bottom: 0.1em;'>Monster 1.26.1</h1>
19
- <div id="lastupdate" style='font-size:0.7em'>last update Do 2. Dez 12:05:05 CET 2021</div>
18
+ <h1 style='margin-bottom: 0.1em;'>Monster 1.29.0</h1>
19
+ <div id="lastupdate" style='font-size:0.7em'>last update Mi 29. Dez 20:04:41 CET 2021</div>
20
20
  </div>
21
21
  </body>
22
22
  </html>
@@ -14,8 +14,8 @@
14
14
  </head>
15
15
  <body>
16
16
  <div id="headline" style="display: flex;align-items: center;justify-content: center;flex-direction: column;">
17
- <h1 style='margin-bottom: 0.1em;'>Monster 1.26.1</h1>
18
- <div id="lastupdate" style='font-size:0.7em'>last update Do 2. Dez 12:05:05 CET 2021</div>
17
+ <h1 style='margin-bottom: 0.1em;'>Monster 1.29.0</h1>
18
+ <div id="lastupdate" style='font-size:0.7em'>last update Mi 29. Dez 20:04:41 CET 2021</div>
19
19
  </div>
20
20
  </body>
21
21
  </html>
@@ -5,15 +5,15 @@
5
5
  <title>Mocha Monster</title>
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
7
7
  <link rel="stylesheet" href="mocha.css"/>
8
- <script id="polyfill" src="https://polyfill.io/v3/polyfill.min.js?features=Array.from,Array.isArray,Array.prototype.entries,Array.prototype.fill,Array.prototype.filter,Array.prototype.forEach,Array.prototype.indexOf,Array.prototype.keys,Array.prototype.lastIndexOf,Array.prototype.map,Array.prototype.reduce,Array.prototype.sort,ArrayBuffer,atob,DataView,document,Document,DocumentFragment,Element,Event,fetch,globalThis,HTMLDocument,HTMLTemplateElement,Intl,JSON,Map,Math.log2,Number.isInteger,Object.assign,Object.defineProperty,Object.entries,Object.freeze,Object.getOwnPropertyDescriptor,Object.getOwnPropertyNames,Object.getPrototypeOf,Object.keys,Promise,Reflect,Reflect.defineProperty,Reflect.get,Reflect.getOwnPropertyDescriptor,Reflect.setPrototypeOf,Set,String.prototype.endsWith,String.prototype.startsWith,String.prototype.trim,Symbol,Symbol.iterator,Uint16Array,Uint8Array,URL,WeakMap,WeakSet"
8
+ <script id="polyfill" src="https://polyfill.io/v3/polyfill.min.js?features=Array.from,Array.isArray,Array.prototype.entries,Array.prototype.fill,Array.prototype.filter,Array.prototype.forEach,Array.prototype.indexOf,Array.prototype.keys,Array.prototype.lastIndexOf,Array.prototype.map,Array.prototype.reduce,Array.prototype.sort,ArrayBuffer,atob,CustomEvent,DataView,document,Document,DocumentFragment,Element,Event,fetch,globalThis,HTMLDocument,HTMLTemplateElement,Intl,JSON,Map,Math.log2,Number.isInteger,Object.assign,Object.defineProperty,Object.entries,Object.freeze,Object.getOwnPropertyDescriptor,Object.getOwnPropertyNames,Object.getPrototypeOf,Object.keys,Promise,Reflect,Reflect.defineProperty,Reflect.get,Reflect.getOwnPropertyDescriptor,Reflect.setPrototypeOf,Set,String.prototype.endsWith,String.prototype.padStart,String.prototype.startsWith,String.prototype.trim,Symbol,Symbol.iterator,Uint16Array,Uint8Array,URL,WeakMap,WeakSet"
9
9
  crossorigin="anonymous"
10
10
  referrerpolicy="no-referrer"></script>
11
11
 
12
12
  </head>
13
13
  <body>
14
14
  <div id="headline" style="display: flex;align-items: center;justify-content: center;flex-direction: column;">
15
- <h1 style='margin-bottom: 0.1em;'>Monster 1.26.1</h1>
16
- <div id="lastupdate" style='font-size:0.7em'>last update Do 2. Dez 12:05:05 CET 2021</div>
15
+ <h1 style='margin-bottom: 0.1em;'>Monster 1.29.0</h1>
16
+ <div id="lastupdate" style='font-size:0.7em'>last update Mi 29. Dez 20:04:41 CET 2021</div>
17
17
  </div>
18
18
  <div id="mocks"></div>
19
19
  <div id="mocha"></div>