@schukai/monster 1.23.0 → 1.26.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.
Files changed (221) hide show
  1. package/CHANGELOG +53 -0
  2. package/README.md +4 -4
  3. package/dist/modules/constants.js +2 -2
  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 -0
  15. package/dist/modules/data/datasource/namespace.js +1 -1
  16. package/dist/modules/data/datasource/restapi/writeerror.js +2 -0
  17. package/dist/modules/data/datasource/restapi.js +2 -2
  18. package/dist/modules/data/datasource/storage/localstorage.js +2 -2
  19. package/dist/modules/data/datasource/storage/namespace.js +1 -1
  20. package/dist/modules/data/datasource/storage/sessionstorage.js +2 -2
  21. package/dist/modules/data/datasource/storage.js +2 -2
  22. package/dist/modules/data/datasource.js +2 -2
  23. package/dist/modules/data/diff.js +2 -2
  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 +2 -2
  27. package/dist/modules/data/pipe.js +1 -1
  28. package/dist/modules/data/transformer.js +2 -2
  29. package/dist/modules/dom/assembler.js +1 -1
  30. package/dist/modules/dom/attributes.js +1 -1
  31. package/dist/modules/dom/constants.js +2 -2
  32. package/dist/modules/dom/customcontrol.js +2 -2
  33. package/dist/modules/dom/customelement.js +2 -2
  34. package/dist/modules/dom/events.js +1 -1
  35. package/dist/modules/dom/focusmanager.js +2 -0
  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 +2 -0
  39. package/dist/modules/dom/resource/link/stylesheet.js +2 -0
  40. package/dist/modules/dom/resource/link.js +2 -0
  41. package/dist/modules/dom/resource/script.js +2 -0
  42. package/dist/modules/dom/resource.js +2 -0
  43. package/dist/modules/dom/resourcemanager.js +2 -0
  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 +2 -0
  49. package/dist/modules/i18n/formatter.js +2 -0
  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 +2 -2
  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 +2 -2
  64. package/dist/modules/monster.js +1 -1
  65. package/dist/modules/namespace.js +1 -1
  66. package/dist/modules/text/formatter.js +2 -2
  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 +2 -2
  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 +2 -2
  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 -0
  78. package/dist/modules/types/nodelist.js +2 -0
  79. package/dist/modules/types/noderecursiveiterator.js +2 -0
  80. package/dist/modules/types/observer.js +1 -1
  81. package/dist/modules/types/observerlist.js +2 -2
  82. package/dist/modules/types/proxyobserver.js +2 -2
  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 +2 -0
  86. package/dist/modules/types/stack.js +1 -1
  87. package/dist/modules/types/tokenlist.js +2 -2
  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 +2 -0
  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 +2 -2
  95. package/dist/modules/util/freeze.js +1 -1
  96. package/dist/modules/util/namespace.js +1 -1
  97. package/dist/modules/util/processing.js +2 -2
  98. package/dist/modules/util/trimspaces.js +2 -0
  99. package/dist/monster.dev.js +1684 -696
  100. package/dist/monster.dev.js.map +1 -1
  101. package/dist/monster.js +2 -2
  102. package/package.json +13 -2
  103. package/source/constants.js +16 -7
  104. package/source/constraints/abstract.js +5 -0
  105. package/source/constraints/abstractoperator.js +5 -0
  106. package/source/constraints/andoperator.js +10 -5
  107. package/source/constraints/invalid.js +8 -3
  108. package/source/constraints/isarray.js +9 -4
  109. package/source/constraints/isobject.js +8 -3
  110. package/source/constraints/oroperator.js +10 -5
  111. package/source/constraints/valid.js +8 -3
  112. package/source/data/buildmap.js +27 -11
  113. package/source/data/buildtree.js +95 -0
  114. package/source/data/datasource/restapi/writeerror.js +49 -0
  115. package/source/data/datasource/restapi.js +87 -20
  116. package/source/data/datasource/storage/localstorage.js +4 -10
  117. package/source/data/datasource/storage/sessionstorage.js +4 -12
  118. package/source/data/datasource/storage.js +7 -14
  119. package/source/data/datasource.js +55 -17
  120. package/source/data/diff.js +8 -8
  121. package/source/data/extend.js +5 -5
  122. package/source/data/pathfinder.js +12 -6
  123. package/source/data/pipe.js +6 -5
  124. package/source/data/transformer.js +131 -24
  125. package/source/dom/assembler.js +2 -2
  126. package/source/dom/attributes.js +24 -24
  127. package/source/dom/constants.js +305 -12
  128. package/source/dom/customcontrol.js +40 -19
  129. package/source/dom/customelement.js +121 -92
  130. package/source/dom/events.js +6 -6
  131. package/source/dom/focusmanager.js +250 -0
  132. package/source/dom/locale.js +10 -5
  133. package/source/dom/resource/data.js +170 -0
  134. package/source/dom/resource/link/stylesheet.js +54 -0
  135. package/source/dom/resource/link.js +125 -0
  136. package/source/dom/resource/script.js +112 -0
  137. package/source/dom/resource.js +268 -0
  138. package/source/dom/resourcemanager.js +214 -0
  139. package/source/dom/template.js +52 -12
  140. package/source/dom/theme.js +3 -3
  141. package/source/dom/updater.js +47 -33
  142. package/source/dom/util.js +6 -6
  143. package/source/dom/worker/factory.js +134 -0
  144. package/source/i18n/formatter.js +140 -0
  145. package/source/i18n/locale.js +10 -8
  146. package/source/i18n/provider.js +4 -4
  147. package/source/i18n/providers/fetch.js +24 -14
  148. package/source/i18n/translations.js +20 -10
  149. package/source/logging/handler/console.js +2 -2
  150. package/source/logging/handler.js +2 -2
  151. package/source/logging/logentry.js +2 -2
  152. package/source/logging/logger.js +4 -4
  153. package/source/math/random.js +11 -5
  154. package/source/namespace.js +1 -1
  155. package/source/text/formatter.js +244 -27
  156. package/source/types/base.js +4 -4
  157. package/source/types/basewithoptions.js +10 -15
  158. package/source/types/binary.js +4 -4
  159. package/source/types/dataurl.js +6 -6
  160. package/source/types/global.js +9 -7
  161. package/source/types/id.js +6 -3
  162. package/source/types/is.js +103 -85
  163. package/source/types/mediatype.js +4 -4
  164. package/source/types/node.js +179 -0
  165. package/source/types/nodelist.js +125 -0
  166. package/source/types/noderecursiveiterator.js +126 -0
  167. package/source/types/observer.js +3 -3
  168. package/source/types/observerlist.js +3 -3
  169. package/source/types/proxyobserver.js +24 -7
  170. package/source/types/queue.js +6 -6
  171. package/source/types/randomid.js +2 -2
  172. package/source/types/regex.js +49 -0
  173. package/source/types/stack.js +2 -2
  174. package/source/types/tokenlist.js +8 -9
  175. package/source/types/typeof.js +3 -3
  176. package/source/types/uniquequeue.js +4 -4
  177. package/source/types/uuid.js +102 -0
  178. package/source/types/validate.js +20 -20
  179. package/source/types/version.js +6 -6
  180. package/source/util/clone.js +4 -5
  181. package/source/util/comparator.js +5 -5
  182. package/source/util/freeze.js +5 -5
  183. package/source/util/processing.js +33 -36
  184. package/source/util/trimspaces.js +85 -0
  185. package/test/cases/data/buildtree.js +149 -0
  186. package/test/cases/data/datasource/restapi.js +1 -1
  187. package/test/cases/data/datasource.js +4 -4
  188. package/test/cases/data/diff.js +4 -4
  189. package/test/cases/data/pathfinder.js +18 -9
  190. package/test/cases/data/pipe.js +26 -2
  191. package/test/cases/data/transformer.js +41 -10
  192. package/test/cases/dom/attributes.js +18 -14
  193. package/test/cases/dom/customcontrol.js +6 -5
  194. package/test/cases/dom/customelement.js +14 -16
  195. package/test/cases/dom/focusmanager.js +111 -0
  196. package/test/cases/dom/locale.js +1 -4
  197. package/test/cases/dom/resource/data.js +129 -0
  198. package/test/cases/dom/resource/link/stylesheet.js +101 -0
  199. package/test/cases/dom/resource/link.js +101 -0
  200. package/test/cases/dom/resource/script.js +115 -0
  201. package/test/cases/dom/resourcemanager.js +118 -0
  202. package/test/cases/dom/updater.js +28 -4
  203. package/test/cases/dom/worker/factory.js +63 -0
  204. package/test/cases/i18n/formatter.js +66 -0
  205. package/test/cases/monster.js +1 -1
  206. package/test/cases/text/formatter.js +71 -8
  207. package/test/cases/types/node.js +196 -0
  208. package/test/cases/types/nodelist.js +64 -0
  209. package/test/cases/types/noderecursiveiterator.js +54 -0
  210. package/test/cases/types/proxyobserver.js +55 -11
  211. package/test/cases/types/regex.js +32 -0
  212. package/test/cases/types/uuid.js +42 -0
  213. package/test/cases/util/freeze.js +30 -4
  214. package/test/cases/util/trimspaces.js +24 -0
  215. package/test/util/cleanupdom.js +48 -0
  216. package/test/util/jsdom.js +22 -9
  217. package/test/web/import.js +15 -0
  218. package/test/web/monster-dev.html +3 -3
  219. package/test/web/monster.html +2 -2
  220. package/test/web/test.html +3 -3
  221. package/test/web/tests.js +7 -7
@@ -0,0 +1,118 @@
1
+ 'use strict';
2
+
3
+ import {expect} from "chai"
4
+
5
+ import {ResourceManager} from "../../../source/dom/resourcemanager.js";
6
+ import {cleanupDOMFromTesting, initMutationObserverForTesting} from "../../util/cleanupdom.js";
7
+ import {initJSDOM} from "../../util/jsdom.js";
8
+
9
+ describe('ResourceManager', function () {
10
+
11
+ let fetchReference, returnStatus;
12
+
13
+ before(function (done) {
14
+ initJSDOM().then(() => {
15
+ done()
16
+ }).catch(e => done(e));
17
+ });
18
+
19
+ afterEach(() => {
20
+ global['fetch'] = fetchReference;
21
+ cleanupDOMFromTesting();
22
+ })
23
+
24
+ beforeEach(() => {
25
+
26
+ initMutationObserverForTesting()
27
+
28
+ returnStatus = 200;
29
+ fetchReference = global['fetch'];
30
+ global['fetch'] = function (url, options) {
31
+
32
+ if (!url) throw new Error('missing url')
33
+
34
+ return new Promise((resolve, reject) => {
35
+ resolve({
36
+ text: function () {
37
+ return JSON.stringify({
38
+ a: "test"
39
+ })
40
+ },
41
+ status: returnStatus
42
+ });
43
+ })
44
+
45
+ };
46
+
47
+ })
48
+
49
+ describe('new', function () {
50
+ it('new ResourceManager() should return ResourceManager object', function () {
51
+ let d = new ResourceManager();
52
+ expect(d).to.be.instanceOf(ResourceManager);
53
+ });
54
+ });
55
+
56
+ describe('load resources', function () {
57
+
58
+ let manager;
59
+
60
+ beforeEach(() => {
61
+ manager = new ResourceManager();
62
+ })
63
+
64
+ it('add script should instance of ResourceManager', function () {
65
+ expect(manager.addScript('/example.js')).to.be.instanceOf(ResourceManager);
66
+ });
67
+
68
+ it('add style should instance of ResourceManager', function () {
69
+ expect(manager.addStylesheet('/style.js')).to.be.instanceOf(ResourceManager);
70
+ });
71
+
72
+ it('add data should instance of ResourceManager', function () {
73
+ expect(manager.addData('/data.json')).to.be.instanceOf(ResourceManager);
74
+ });
75
+
76
+ describe('connect resources', function () {
77
+ it('add script and connect should instance of ResourceManager', function () {
78
+ expect(manager.addScript('/example.js').connect()).to.be.instanceOf(ResourceManager);
79
+ });
80
+
81
+ it('add style and connect should instance of ResourceManager', function () {
82
+ expect(manager.addStylesheet('/style.js').connect()).to.be.instanceOf(ResourceManager);
83
+ });
84
+
85
+ it('add data and connect should instance of ResourceManager', function () {
86
+ expect(manager.addData('/data.json').connect()).to.be.instanceOf(ResourceManager);
87
+ });
88
+ })
89
+
90
+
91
+ describe('check availability resources', function () {
92
+ it('add script and check availability should return Promise', function () {
93
+ expect(manager.addScript('/example.js').available()).to.be.instanceOf(Promise);
94
+ });
95
+
96
+ it('add style and check availability should should return Promise', function () {
97
+ expect(manager.addStylesheet('/style.js').available()).to.be.instanceOf(Promise);
98
+ });
99
+
100
+ it('add data and check availability should should return Promise', function () {
101
+ expect(manager.addData('/data.json').available()).to.be.instanceOf(Promise);
102
+ });
103
+ })
104
+
105
+ describe('check availability example.json', function () {
106
+ it('add data and check content', function (done) {
107
+ manager.addData('https://example.com/example.json').connect().available().then(r => {
108
+ expect(document.querySelector('html').outerHTML).contains('>{"a":"test"}</script></head>');
109
+ done();
110
+ }).catch(e => done(e));
111
+ });
112
+
113
+ })
114
+
115
+ });
116
+
117
+
118
+ });
@@ -2,6 +2,7 @@
2
2
 
3
3
  import chai from "chai"
4
4
  import {Updater} from "../../../source/dom/updater.js";
5
+ import {ID} from "../../../source/types/id.js";
5
6
  import {Observer} from "../../../source/types/observer.js";
6
7
  import {ProxyObserver} from "../../../source/types/proxyobserver.js";
7
8
  import {chaiDom} from "../../util/chai-dom.js";
@@ -55,7 +56,7 @@ let html2 = `
55
56
  <div id="test1">
56
57
  <div data-monster-replace="path:text | tolower"> </div>
57
58
  <div data-monster-replace="path:text | call:myformatter"> </div>
58
- <div data-monster-replace="static:hello"></div>
59
+ <div data-monster-replace="static:hello\\ "></div>
59
60
  </div>
60
61
  `;
61
62
 
@@ -505,16 +506,16 @@ describe('DOM', function () {
505
506
  expect(typeof d).is.equal('object');
506
507
  expect(element).contain.html('<div data-monster-replace="path:text | tolower">hallo</div>');
507
508
  expect(element).contain.html('<div data-monster-replace="path:text | call:myformatter">HALLOyes!</div>');
508
- expect(element).contain.html('<div data-monster-replace="static:hello">hello</div>');
509
+ expect(element).contain.html('<div data-monster-replace="static:hello\\ ">hello </div>');
509
510
 
510
- return done();
511
+ return done();
511
512
  }).catch(
512
513
  e => {
513
514
  done(new Error(e))
514
515
  })
515
516
  }, 100)
516
517
 
517
- });
518
+ });
518
519
  });
519
520
  });
520
521
 
@@ -637,4 +638,27 @@ describe('DOM', function () {
637
638
  });
638
639
  });
639
640
 
641
+
642
+ describe('Get Attribute Pipe', function () {
643
+ let id, mocks;
644
+ beforeEach(() => {
645
+ mocks = document.getElementById('mocks');
646
+ id = new ID('monster');
647
+ mocks.innerHTML = ` <div id="` + id + `"
648
+ data-monster-replace="path:a | if:value:\\ "></div>`
649
+ })
650
+
651
+ afterEach(() => {
652
+ mocks.innerHTML = "";
653
+ })
654
+
655
+ it('should include space', function () {
656
+ const div = document.getElementById(id.toString())
657
+
658
+ const pipe = div.getAttribute('data-monster-replace');
659
+ expect(pipe.length).to.be.equal(20);
660
+
661
+ });
662
+ });
663
+
640
664
  });
@@ -0,0 +1,63 @@
1
+ import {expect} from "chai"
2
+
3
+ import {Factory} from "../../../../source/dom/worker/factory.js";
4
+ import {getGlobal} from "../../../../source/types/global.js";
5
+ import {initJSDOM, isNode} from "../../../util/jsdom.js";
6
+
7
+ const global = getGlobal();
8
+
9
+ describe('Worker', function () {
10
+
11
+ before(function (done) {
12
+
13
+ if (isNode()) {
14
+ Object.defineProperty(global['URL'], 'createObjectURL', {
15
+ writable: true,
16
+ value: () => {
17
+ return "/example.js"
18
+ }
19
+ })
20
+
21
+ global['Worker'] = class {
22
+ terminate() {
23
+
24
+ }
25
+
26
+ onerror() {
27
+
28
+ }
29
+
30
+ onmessage() {
31
+
32
+ }
33
+ }
34
+
35
+ let a = typeof global['Worker'];
36
+ let a1 = typeof Worker;
37
+
38
+ }
39
+
40
+ const jsdom = initJSDOM().then(() => {
41
+ done();
42
+ });
43
+
44
+
45
+ })
46
+
47
+ describe('Factory', function () {
48
+
49
+ it('create worker', function () {
50
+
51
+ const factory = new Factory();
52
+ const worker = factory.createFromScript('console.log("hello world");')
53
+ expect(worker).is.instanceof(Worker);
54
+
55
+ expect(factory.terminate(worker)).is.instanceof(Factory)
56
+
57
+
58
+ });
59
+
60
+ });
61
+
62
+
63
+ });
@@ -0,0 +1,66 @@
1
+ import {expect} from "chai"
2
+ import {Formatter} from "../../../source/i18n/formatter.js";
3
+ import {Translations} from "../../../source/i18n/translations.js";
4
+
5
+
6
+ describe('Formatter', function () {
7
+
8
+ describe('example', function () {
9
+
10
+ it('should run with marker', function () {
11
+
12
+ const translations = new Translations('en')
13
+ .assignTranslations({
14
+ thekey: "${animal} has eaten the ${food}!"
15
+ });
16
+
17
+ const f = new Formatter({}, translations);
18
+
19
+ expect(f.format("i18n{thekey::animal=dog::food=cake}")).to.be.equal('dog has eaten the cake!');
20
+ // ↦ dog has eaten the cake!
21
+
22
+ });
23
+
24
+ it('should run without marker', function () {
25
+
26
+ const translations = new Translations('en')
27
+ .assignTranslations({
28
+ thekey: "${animal} has eaten the ${food}!"
29
+ });
30
+
31
+ // missing marker
32
+ expect(new Formatter({}, translations).format("thekey::animal=dog::food=cake")).to.be.equal('dog has eaten the cake!');
33
+ // ↦ dog has eaten the cake!
34
+
35
+ });
36
+ });
37
+
38
+
39
+ describe('format', function () {
40
+
41
+ [
42
+ ['i18n{translationkey::a=3::b=5}', 'test is 3 and 5'],
43
+
44
+ ].forEach(function (data) {
45
+
46
+ let a = data.shift()
47
+ let b = data.shift()
48
+
49
+ it('format ' + a + ' should ' + b, function () {
50
+
51
+ const translations = new Translations('de').assignTranslations({
52
+ translationkey: "test is ${a} and ${b}"
53
+ })
54
+
55
+ expect(
56
+ new Formatter({}, translations).format(a)
57
+ ).to.equal(b)
58
+ });
59
+ });
60
+
61
+
62
+ })
63
+
64
+
65
+ })
66
+ ;
@@ -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.23.0')
12
+ monsterVersion = new Version('1.26.1')
13
13
  /**#@-*/
14
14
 
15
15
  let m = Monster.getVersion();
@@ -1,5 +1,3 @@
1
-
2
-
3
1
  import {expect} from "chai"
4
2
  import {Formatter} from "../../../source/text/formatter.js";
5
3
 
@@ -57,10 +55,9 @@ describe('Formatter', function () {
57
55
  it('format ' + a + ' with marker ' + b + ' and ' + c + ' should return ' + b, function () {
58
56
 
59
57
  expect(
60
- new Formatter({
61
- a: "test"
62
- }).setMarker(b,c).format(a)
63
-
58
+ new Formatter({
59
+ a: "test"
60
+ }).setMarker(b, c).format(a)
64
61
  ).to.equal(d)
65
62
  });
66
63
  });
@@ -72,6 +69,7 @@ describe('Formatter', function () {
72
69
 
73
70
  [
74
71
  ['${a | tojson}', "{\"b\":{\"c\":\"Hello\"},\"d\":\"World\",\"e\":1}"],
72
+ ['click ${a.d} times', "click World times"],
75
73
  [' ${a.b.c} ', ' Hello '],
76
74
  [' ${a.b.c}', ' Hello'],
77
75
  ['${a.b.c} ', 'Hello '],
@@ -87,9 +85,8 @@ describe('Formatter', function () {
87
85
 
88
86
  let a = data.shift()
89
87
  let b = data.shift()
90
- let c = data.shift()
91
88
 
92
- it('format ' + a + ' should return ' + c, function () {
89
+ it('format ' + a + ' should return ' + b, function () {
93
90
 
94
91
  let obj = {
95
92
  a: {
@@ -108,6 +105,72 @@ describe('Formatter', function () {
108
105
 
109
106
  });
110
107
 
108
+ describe('Marker in marker', function () {
109
+
110
+ let text = '${mykey${subkey}}';
111
+ let expected = '1';
112
+
113
+ it('format ' + text + ' should ' + expected, function () {
114
+
115
+ let obj = {
116
+ mykey2: "1",
117
+ subkey: "2"
118
+ };
119
+
120
+ expect(new Formatter(obj).format(text)).is.equal(expected)
121
+
122
+ });
123
+
124
+
125
+ });
126
+
127
+ describe('setParameterChars()', function () {
128
+
129
+ it('setParameterChars() should return Instance', function () {
130
+ expect(new Formatter({}).setParameterChars('a', 'b')).is.instanceof(Formatter);
131
+
132
+ });
133
+
134
+
135
+ });
136
+
137
+
138
+ describe('with callbacks', function () {
139
+
140
+ it('add callback', function () {
141
+ const formatter = new Formatter({
142
+ x: '1'
143
+ }, {
144
+ callbacks: {
145
+ my: (value) => {
146
+ return "!" + value + "!"
147
+ }
148
+ }
149
+ });
150
+
151
+ expect(formatter.format('${x | call:my}')).is.equal('!1!');
152
+
153
+ });
154
+
155
+
156
+ });
157
+
158
+ describe('Marker in marker with parameter', function () {
159
+
160
+ let text = '${mykey::mykey=${subkey}}';
161
+ let expected = '2';
162
+
163
+ it('format ' + text + ' should ' + expected, function () {
164
+
165
+ let obj = {
166
+ subkey: "2"
167
+ };
168
+
169
+ expect(new Formatter(obj).format(text)).is.equal(expected)
170
+
171
+ });
172
+ });
173
+
111
174
  describe('exceptions', function () {
112
175
 
113
176
  [
@@ -0,0 +1,196 @@
1
+ 'use strict';
2
+
3
+ import {expect} from "chai"
4
+ import {Node} from "../../../source/types/node.js";
5
+ import {NodeList} from "../../../source/types/nodelist.js";
6
+ import {NodeRecursiveIterator} from "../../../source/types/noderecursiveiterator.js";
7
+
8
+ describe('NodeList', function () {
9
+ describe('#constructor', function () {
10
+ it('should create an empty NodeList', function () {
11
+ let nodeList = new NodeList();
12
+
13
+ expect(nodeList.size).to.equal(0);
14
+ });
15
+
16
+ it('should create a NodeList from an array', function () {
17
+ let nodeList = new NodeList([
18
+ new Node('div'),
19
+ new Node('div'),
20
+ new Node('div')
21
+ ]);
22
+
23
+ expect(nodeList.size).to.equal(3);
24
+ });
25
+
26
+ it('should create a NodeList from a NodeList', function () {
27
+ let nodeList = new NodeList([
28
+ new Node('div'),
29
+ new Node('div'),
30
+ new Node('div')
31
+ ]);
32
+
33
+ let nodeList2 = new NodeList(nodeList);
34
+
35
+ expect(nodeList2.size).to.equal(3);
36
+ });
37
+ });
38
+
39
+ it('create NodeList', function () {
40
+ expect(new NodeList()).is.instanceof(NodeList);
41
+ })
42
+
43
+ it('add Node', function () {
44
+ expect(new NodeList().add(new Node())).to.be.instanceof(NodeList);
45
+ })
46
+
47
+ it('remove Node', function () {
48
+ expect(new NodeList().remove(new Node())).to.be.instanceof(NodeList);
49
+ })
50
+
51
+ it('has unknown Node', function () {
52
+ expect(new NodeList().has(new Node)).to.be.false;
53
+ })
54
+
55
+ it('has added Node', function () {
56
+ const n = new Node;
57
+ expect(new NodeList().add(n).has(n)).to.be.true;
58
+ })
59
+
60
+ it('throw exception', function () {
61
+ expect(() => new NodeList().add(1)).to.throw(Error);
62
+ })
63
+
64
+ it('check level', function () {
65
+
66
+ const root = new Node('root');
67
+
68
+ const n1 = new Node('n1');
69
+ const n2 = new Node('n2');
70
+ const n3 = new Node('n3');
71
+ const n4 = new Node('n4');
72
+
73
+ const n11 = new Node('n11');
74
+ const n12 = new Node('n12');
75
+ const n13 = new Node('n13');
76
+
77
+ const n21 = new Node('n21');
78
+ const n22 = new Node('n22');
79
+ const n23 = new Node('n23');
80
+
81
+ const n41 = new Node('n41');
82
+ const n42 = new Node('n42');
83
+
84
+ const n411 = new Node('n411');
85
+ const n412 = new Node('n412');
86
+ const n413 = new Node('n413');
87
+
88
+ const n4121 = new Node('n4121');
89
+
90
+ root.appendChild(n1).appendChild(n2).appendChild(n3).appendChild(n4);
91
+ n1.appendChild(n11).appendChild(n12).appendChild(n13);
92
+ n2.appendChild(n21).appendChild(n22).appendChild(n23);
93
+ n4.appendChild(n41).appendChild(n42);
94
+ n41.appendChild(n411).appendChild(n412).appendChild(n413);
95
+ n412.appendChild(n4121);
96
+
97
+ let iterator = new NodeRecursiveIterator(root);
98
+
99
+ let result = [];
100
+ for (const n of iterator) {
101
+ expect(n).to.be.an.instanceof(Node);
102
+ result.push(n.value + ":" + n.level);
103
+ }
104
+
105
+
106
+ expect(result).to.deep.equal([
107
+ 'root:0',
108
+ 'n1:1',
109
+ 'n11:2',
110
+ 'n12:2',
111
+ 'n13:2',
112
+ 'n2:1',
113
+ 'n21:2',
114
+ 'n22:2',
115
+ 'n23:2',
116
+ 'n3:1',
117
+ 'n4:1',
118
+ 'n41:2',
119
+ 'n411:3',
120
+ 'n412:3',
121
+ 'n4121:4',
122
+ 'n413:3',
123
+ 'n42:2'
124
+
125
+ ]);
126
+
127
+ n4121.appendChild(new Node('n41211'));
128
+
129
+ iterator = new NodeRecursiveIterator(root);
130
+ result = [];
131
+ for (const n of iterator) {
132
+ expect(n).to.be.an.instanceof(Node);
133
+ result.push(n.value + ":" + n.level);
134
+ }
135
+
136
+ expect(result).to.deep.equal([
137
+ 'root:0',
138
+ 'n1:1',
139
+ 'n11:2',
140
+ 'n12:2',
141
+ 'n13:2',
142
+ 'n2:1',
143
+ 'n21:2',
144
+ 'n22:2',
145
+ 'n23:2',
146
+ 'n3:1',
147
+ 'n4:1',
148
+ 'n41:2',
149
+ 'n411:3',
150
+ 'n412:3',
151
+ 'n4121:4',
152
+ 'n41211:5',
153
+ 'n413:3',
154
+ 'n42:2'
155
+
156
+ ]);
157
+
158
+
159
+ const bb = new Node('bb') // big bang
160
+
161
+ bb.appendChild(root);
162
+ iterator = new NodeRecursiveIterator(bb);
163
+
164
+ result = [];
165
+ for (const n of iterator) {
166
+ expect(n).to.be.an.instanceof(Node);
167
+ result.push(n.value + ":" + n.level);
168
+ }
169
+
170
+ expect(result).to.deep.equal([
171
+ 'bb:0',
172
+ 'root:1',
173
+ 'n1:2',
174
+ 'n11:3',
175
+ 'n12:3',
176
+ 'n13:3',
177
+ 'n2:2',
178
+ 'n21:3',
179
+ 'n22:3',
180
+ 'n23:3',
181
+ 'n3:2',
182
+ 'n4:2',
183
+ 'n41:3',
184
+ 'n411:4',
185
+ 'n412:4',
186
+ 'n4121:5',
187
+ 'n41211:6',
188
+ 'n413:4',
189
+ 'n42:3'
190
+
191
+ ]);
192
+
193
+ })
194
+
195
+
196
+ });
@@ -0,0 +1,64 @@
1
+ 'use strict';
2
+
3
+ import {expect} from "chai"
4
+ import {Node} from "../../../source/types/node.js";
5
+ import {NodeList} from "../../../source/types/nodelist.js";
6
+
7
+ describe('NodeList', function () {
8
+ describe('#constructor', function () {
9
+ it('should create an empty NodeList', function () {
10
+ let nodeList = new NodeList();
11
+
12
+ expect(nodeList.size).to.equal(0);
13
+ });
14
+
15
+ it('should create a NodeList from an array', function () {
16
+ let nodeList = new NodeList([
17
+ new Node('div'),
18
+ new Node('div'),
19
+ new Node('div')
20
+ ]);
21
+
22
+ expect(nodeList.size).to.equal(3);
23
+ });
24
+
25
+ it('should create a NodeList from a NodeList', function () {
26
+ let nodeList = new NodeList([
27
+ new Node('div'),
28
+ new Node('div'),
29
+ new Node('div')
30
+ ]);
31
+
32
+ let nodeList2 = new NodeList(nodeList);
33
+
34
+ expect(nodeList2.size).to.equal(3);
35
+ });
36
+ });
37
+
38
+ it('create NodeList', function () {
39
+ expect(new NodeList()).is.instanceof(NodeList);
40
+ })
41
+
42
+ it('add Node', function () {
43
+ expect(new NodeList().add(new Node())).to.be.instanceof(NodeList);
44
+ })
45
+
46
+ it('remove Node', function () {
47
+ expect(new NodeList().remove(new Node())).to.be.instanceof(NodeList);
48
+ })
49
+
50
+ it('has unknown Node', function () {
51
+ expect(new NodeList().has(new Node)).to.be.false;
52
+ })
53
+
54
+ it('has added Node', function () {
55
+ const n = new Node;
56
+ expect(new NodeList().add(n).has(n)).to.be.true;
57
+ })
58
+
59
+ it('throw exception', function () {
60
+ expect(() => new NodeList().add(1)).to.throw(Error);
61
+ })
62
+
63
+
64
+ });