@schukai/monster 1.25.0 → 1.28.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 (200) hide show
  1. package/CHANGELOG +43 -0
  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 -0
  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 +1 -1
  34. package/dist/modules/dom/events.js +1 -1
  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 +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 +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 +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 +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 +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 +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 +2 -0
  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/freeze.js +1 -1
  96. package/dist/modules/util/namespace.js +1 -1
  97. package/dist/modules/util/processing.js +1 -1
  98. package/dist/modules/util/trimspaces.js +1 -1
  99. package/dist/monster.dev.js +1181 -708
  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/constraints/abstract.js +5 -0
  104. package/source/constraints/abstractoperator.js +5 -0
  105. package/source/constraints/andoperator.js +10 -5
  106. package/source/constraints/invalid.js +8 -3
  107. package/source/constraints/isarray.js +9 -4
  108. package/source/constraints/isobject.js +8 -3
  109. package/source/constraints/oroperator.js +10 -5
  110. package/source/constraints/valid.js +8 -3
  111. package/source/data/buildmap.js +27 -13
  112. package/source/data/buildtree.js +129 -0
  113. package/source/data/datasource/restapi.js +3 -3
  114. package/source/data/datasource/storage/localstorage.js +2 -2
  115. package/source/data/datasource/storage/sessionstorage.js +2 -2
  116. package/source/data/datasource/storage.js +3 -3
  117. package/source/data/datasource.js +3 -3
  118. package/source/data/diff.js +3 -3
  119. package/source/data/extend.js +2 -2
  120. package/source/data/pathfinder.js +4 -4
  121. package/source/data/pipe.js +3 -3
  122. package/source/data/transformer.js +3 -3
  123. package/source/dom/assembler.js +2 -2
  124. package/source/dom/attributes.js +111 -28
  125. package/source/dom/constants.js +17 -1
  126. package/source/dom/customcontrol.js +1 -1
  127. package/source/dom/customelement.js +1 -1
  128. package/source/dom/events.js +6 -7
  129. package/source/dom/focusmanager.js +6 -7
  130. package/source/dom/locale.js +8 -4
  131. package/source/dom/resource/data.js +2 -2
  132. package/source/dom/resource/link/stylesheet.js +2 -2
  133. package/source/dom/resource/link.js +2 -2
  134. package/source/dom/resource/script.js +2 -2
  135. package/source/dom/resource.js +2 -2
  136. package/source/dom/resourcemanager.js +2 -2
  137. package/source/dom/template.js +55 -15
  138. package/source/dom/theme.js +3 -3
  139. package/source/dom/updater.js +158 -98
  140. package/source/dom/util.js +6 -6
  141. package/source/dom/worker/factory.js +2 -2
  142. package/source/i18n/formatter.js +140 -0
  143. package/source/i18n/locale.js +6 -4
  144. package/source/i18n/provider.js +2 -2
  145. package/source/i18n/providers/fetch.js +18 -3
  146. package/source/i18n/translations.js +18 -9
  147. package/source/logging/handler/console.js +2 -2
  148. package/source/logging/handler.js +2 -2
  149. package/source/logging/logentry.js +2 -2
  150. package/source/logging/logger.js +2 -2
  151. package/source/math/random.js +2 -2
  152. package/source/namespace.js +1 -1
  153. package/source/text/formatter.js +190 -48
  154. package/source/types/base.js +2 -2
  155. package/source/types/basewithoptions.js +2 -2
  156. package/source/types/binary.js +4 -4
  157. package/source/types/dataurl.js +4 -4
  158. package/source/types/global.js +4 -4
  159. package/source/types/id.js +6 -3
  160. package/source/types/is.js +100 -82
  161. package/source/types/mediatype.js +4 -4
  162. package/source/types/node.js +210 -0
  163. package/source/types/nodelist.js +129 -0
  164. package/source/types/noderecursiveiterator.js +148 -0
  165. package/source/types/observer.js +3 -3
  166. package/source/types/observerlist.js +2 -2
  167. package/source/types/proxyobserver.js +5 -5
  168. package/source/types/queue.js +4 -4
  169. package/source/types/randomid.js +2 -2
  170. package/source/types/regex.js +49 -0
  171. package/source/types/stack.js +2 -2
  172. package/source/types/tokenlist.js +2 -2
  173. package/source/types/typeof.js +3 -3
  174. package/source/types/uniquequeue.js +2 -2
  175. package/source/types/uuid.js +2 -2
  176. package/source/types/validate.js +20 -20
  177. package/source/types/version.js +6 -6
  178. package/source/util/clone.js +2 -2
  179. package/source/util/comparator.js +3 -3
  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 +212 -0
  184. package/test/cases/dom/attributes.js +46 -19
  185. package/test/cases/dom/resource/link/stylesheet.js +1 -1
  186. package/test/cases/dom/template.js +72 -14
  187. package/test/cases/dom/updater.js +102 -75
  188. package/test/cases/i18n/formatter.js +66 -0
  189. package/test/cases/monster.js +1 -1
  190. package/test/cases/text/formatter.js +36 -5
  191. package/test/cases/types/node.js +252 -0
  192. package/test/cases/types/nodelist.js +71 -0
  193. package/test/cases/types/noderecursiveiterator.js +75 -0
  194. package/test/cases/types/regex.js +32 -0
  195. package/test/util/jsdom.js +0 -1
  196. package/test/web/import.js +6 -0
  197. package/test/web/monster-dev.html +3 -3
  198. package/test/web/monster.html +2 -2
  199. package/test/web/test.html +3 -3
  200. package/test/web/tests.js +3 -3
@@ -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
  });
@@ -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.25.0')
12
+ monsterVersion = new Version('1.28.0')
13
13
  /**#@-*/
14
14
 
15
15
  let m = Monster.getVersion();
@@ -69,6 +69,7 @@ describe('Formatter', function () {
69
69
 
70
70
  [
71
71
  ['${a | tojson}', "{\"b\":{\"c\":\"Hello\"},\"d\":\"World\",\"e\":1}"],
72
+ ['click ${a.d} times', "click World times"],
72
73
  [' ${a.b.c} ', ' Hello '],
73
74
  [' ${a.b.c}', ' Hello'],
74
75
  ['${a.b.c} ', 'Hello '],
@@ -84,9 +85,8 @@ describe('Formatter', function () {
84
85
 
85
86
  let a = data.shift()
86
87
  let b = data.shift()
87
- let c = data.shift()
88
88
 
89
- it('format ' + a + ' should return ' + c, function () {
89
+ it('format ' + a + ' should return ' + b, function () {
90
90
 
91
91
  let obj = {
92
92
  a: {
@@ -110,7 +110,7 @@ describe('Formatter', function () {
110
110
  let text = '${mykey${subkey}}';
111
111
  let expected = '1';
112
112
 
113
- it('format ' + text + ' should '+expected, function () {
113
+ it('format ' + text + ' should ' + expected, function () {
114
114
 
115
115
  let obj = {
116
116
  mykey2: "1",
@@ -123,13 +123,44 @@ describe('Formatter', function () {
123
123
 
124
124
 
125
125
  });
126
-
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
+
127
158
  describe('Marker in marker with parameter', function () {
128
159
 
129
160
  let text = '${mykey::mykey=${subkey}}';
130
161
  let expected = '2';
131
162
 
132
- it('format ' + text + ' should '+expected, function () {
163
+ it('format ' + text + ' should ' + expected, function () {
133
164
 
134
165
  let obj = {
135
166
  subkey: "2"