@schukai/monster 1.27.0 → 1.28.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (189) hide show
  1. package/CHANGELOG +11 -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 +1 -1
  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 +1 -1
  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/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 +246 -231
  100. package/dist/monster.dev.js.map +1 -1
  101. package/dist/monster.js +2 -2
  102. package/package.json +1 -1
  103. package/source/constraints/andoperator.js +5 -5
  104. package/source/constraints/invalid.js +3 -3
  105. package/source/constraints/isarray.js +3 -3
  106. package/source/constraints/isobject.js +3 -3
  107. package/source/constraints/oroperator.js +5 -5
  108. package/source/constraints/valid.js +3 -3
  109. package/source/data/buildmap.js +8 -10
  110. package/source/data/buildtree.js +51 -17
  111. package/source/data/datasource/restapi.js +3 -3
  112. package/source/data/datasource/storage/localstorage.js +2 -2
  113. package/source/data/datasource/storage/sessionstorage.js +2 -2
  114. package/source/data/datasource/storage.js +3 -3
  115. package/source/data/datasource.js +3 -3
  116. package/source/data/diff.js +3 -3
  117. package/source/data/extend.js +2 -2
  118. package/source/data/pathfinder.js +4 -4
  119. package/source/data/pipe.js +3 -3
  120. package/source/data/transformer.js +3 -3
  121. package/source/dom/assembler.js +2 -2
  122. package/source/dom/attributes.js +26 -26
  123. package/source/dom/constants.js +9 -1
  124. package/source/dom/customcontrol.js +1 -1
  125. package/source/dom/customelement.js +1 -1
  126. package/source/dom/events.js +4 -4
  127. package/source/dom/focusmanager.js +2 -2
  128. package/source/dom/locale.js +2 -2
  129. package/source/dom/resource/data.js +2 -2
  130. package/source/dom/resource/link/stylesheet.js +2 -2
  131. package/source/dom/resource/link.js +2 -2
  132. package/source/dom/resource/script.js +2 -2
  133. package/source/dom/resource.js +2 -2
  134. package/source/dom/resourcemanager.js +2 -2
  135. package/source/dom/template.js +5 -5
  136. package/source/dom/theme.js +3 -3
  137. package/source/dom/updater.js +25 -13
  138. package/source/dom/util.js +6 -6
  139. package/source/dom/worker/factory.js +2 -2
  140. package/source/i18n/formatter.js +4 -4
  141. package/source/i18n/locale.js +4 -4
  142. package/source/i18n/provider.js +2 -2
  143. package/source/i18n/providers/fetch.js +3 -3
  144. package/source/i18n/translations.js +4 -4
  145. package/source/logging/handler/console.js +2 -2
  146. package/source/logging/handler.js +2 -2
  147. package/source/logging/logentry.js +2 -2
  148. package/source/logging/logger.js +2 -2
  149. package/source/math/random.js +2 -2
  150. package/source/namespace.js +1 -1
  151. package/source/text/formatter.js +3 -3
  152. package/source/types/base.js +2 -2
  153. package/source/types/basewithoptions.js +2 -2
  154. package/source/types/binary.js +4 -4
  155. package/source/types/dataurl.js +4 -4
  156. package/source/types/global.js +4 -4
  157. package/source/types/id.js +2 -2
  158. package/source/types/is.js +20 -20
  159. package/source/types/mediatype.js +4 -4
  160. package/source/types/node.js +33 -2
  161. package/source/types/nodelist.js +9 -5
  162. package/source/types/noderecursiveiterator.js +29 -7
  163. package/source/types/observer.js +3 -3
  164. package/source/types/observerlist.js +2 -2
  165. package/source/types/proxyobserver.js +5 -5
  166. package/source/types/queue.js +3 -3
  167. package/source/types/randomid.js +2 -2
  168. package/source/types/regex.js +2 -2
  169. package/source/types/stack.js +2 -2
  170. package/source/types/tokenlist.js +2 -2
  171. package/source/types/typeof.js +3 -3
  172. package/source/types/uniquequeue.js +2 -2
  173. package/source/types/uuid.js +2 -2
  174. package/source/types/validate.js +20 -20
  175. package/source/types/version.js +6 -6
  176. package/source/util/clone.js +2 -2
  177. package/source/util/comparator.js +3 -3
  178. package/source/util/freeze.js +2 -2
  179. package/source/util/processing.js +3 -3
  180. package/source/util/trimspaces.js +2 -2
  181. package/test/cases/data/buildtree.js +84 -21
  182. package/test/cases/monster.js +1 -1
  183. package/test/cases/types/node.js +57 -1
  184. package/test/cases/types/nodelist.js +7 -0
  185. package/test/cases/types/noderecursiveiterator.js +21 -0
  186. package/test/web/monster-dev.html +3 -3
  187. package/test/web/monster.html +2 -2
  188. package/test/web/test.html +3 -3
  189. package/test/web/tests.js +2 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@schukai/monster",
3
- "version": "1.27.0",
3
+ "version": "1.28.0",
4
4
  "types": "./source/types/package.d.ts",
5
5
  "description": "Monster is a simple library for creating fast, robust and lightweight websites.",
6
6
  "keywords": [
@@ -16,7 +16,7 @@ import {AbstractOperator} from "./abstractoperator.js";
16
16
  *
17
17
  * ```
18
18
  * <script type="module">
19
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/monster.js';
19
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/monster.js';
20
20
  * new Monster.Constraint.AndOperator();
21
21
  * </script>
22
22
  * ```
@@ -25,16 +25,16 @@ import {AbstractOperator} from "./abstractoperator.js";
25
25
  *
26
26
  * ```
27
27
  * <script type="module">
28
- * import {AndOperator} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/constraints/andoperator.js';
28
+ * import {AndOperator} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/constraints/andoperator.js';
29
29
  * new AndOperator();
30
30
  * </script>
31
31
  * ```
32
32
  *
33
33
  * @example
34
34
  *
35
- * import {Valid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/constraints/valid.js';
36
- * import {Invalid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/constraints/invalid.js';
37
- * import {AndOperator} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/constraints/andoperator.js';
35
+ * import {Valid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/constraints/valid.js';
36
+ * import {Invalid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/constraints/invalid.js';
37
+ * import {AndOperator} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/constraints/andoperator.js';
38
38
  *
39
39
  * new AndOperator(
40
40
  * new Valid(), new Valid()).isValid()
@@ -17,7 +17,7 @@ import {AbstractConstraint} from "./abstract.js";
17
17
  *
18
18
  * ```
19
19
  * <script type="module">
20
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/monster.js';
20
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/monster.js';
21
21
  * new Monster.Constraint.Invalid();
22
22
  * </script>
23
23
  * ```
@@ -26,14 +26,14 @@ import {AbstractConstraint} from "./abstract.js";
26
26
  *
27
27
  * ```
28
28
  * <script type="module">
29
- * import {Invalid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/constraints/invalid.js';
29
+ * import {Invalid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/constraints/invalid.js';
30
30
  * new Invalid();
31
31
  * </script>
32
32
  * ```
33
33
  *
34
34
  * @example
35
35
  *
36
- * import {Invalid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/constraints/invalid.js';
36
+ * import {Invalid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/constraints/invalid.js';
37
37
  *
38
38
  * new Invalid().isValid()
39
39
  * .then(()=>console.log(true))
@@ -16,7 +16,7 @@ import {AbstractConstraint} from "./abstract.js";
16
16
  *
17
17
  * ```
18
18
  * <script type="module">
19
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/monster.js';
19
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/monster.js';
20
20
  * new Monster.Constraint.IsArray()
21
21
  * </script>
22
22
  * ```
@@ -25,14 +25,14 @@ import {AbstractConstraint} from "./abstract.js";
25
25
  *
26
26
  * ```
27
27
  * <script type="module">
28
- * import {IsArray} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/constraints/isarray.js';
28
+ * import {IsArray} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/constraints/isarray.js';
29
29
  * console.log(new IsArray())
30
30
  * </script>
31
31
  * ```
32
32
  *
33
33
  * @example
34
34
  *
35
- * import {IsArray} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/constraints/isarray.js';
35
+ * import {IsArray} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/constraints/isarray.js';
36
36
  *
37
37
  * new IsArray()
38
38
  * .isValid([])
@@ -16,7 +16,7 @@ import {AbstractConstraint} from "./abstract.js";
16
16
  *
17
17
  * ```
18
18
  * <script type="module">
19
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/monster.js';
19
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/monster.js';
20
20
  * console.log(new Monster.Constraint.IsObject())
21
21
  * </script>
22
22
  * ```
@@ -25,14 +25,14 @@ import {AbstractConstraint} from "./abstract.js";
25
25
  *
26
26
  * ```
27
27
  * <script type="module">
28
- * import {IsObject} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/constraints/isobject.js';
28
+ * import {IsObject} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/constraints/isobject.js';
29
29
  * console.log(new IsObject())
30
30
  * </script>
31
31
  * ```
32
32
  *
33
33
  * @example
34
34
  *
35
- * import {IsObject} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/constraints/isobject.js';
35
+ * import {IsObject} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/constraints/isobject.js';
36
36
  *
37
37
  * new IsObject()
38
38
  * .isValid({})
@@ -15,7 +15,7 @@ import {AbstractOperator} from "./abstractoperator.js";
15
15
  *
16
16
  * ```
17
17
  * <script type="module">
18
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/monster.js';
18
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/monster.js';
19
19
  * new Monster.Constraint.OrOperator();
20
20
  * </script>
21
21
  * ```
@@ -24,16 +24,16 @@ import {AbstractOperator} from "./abstractoperator.js";
24
24
  *
25
25
  * ```
26
26
  * <script type="module">
27
- * import {OrOperator} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/constraint/oroperator.js';
27
+ * import {OrOperator} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/constraint/oroperator.js';
28
28
  * new OrOperator();
29
29
  * </script>
30
30
  * ```
31
31
  *
32
32
  * @example
33
33
  *
34
- * import {Valid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/constraints/valid.js';
35
- * import {Invalid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/constraints/invalid.js';
36
- * import {OrOperator} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/constraints/oroperator.js';
34
+ * import {Valid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/constraints/valid.js';
35
+ * import {Invalid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/constraints/invalid.js';
36
+ * import {OrOperator} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/constraints/oroperator.js';
37
37
  *
38
38
  * new OrOperator(
39
39
  * new Valid(), new Invalid()).isValid()
@@ -17,7 +17,7 @@ import {AbstractConstraint} from "./abstract.js";
17
17
  *
18
18
  * ```
19
19
  * <script type="module">
20
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/monster.js';
20
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/monster.js';
21
21
  * new Monster.Constraint.Valid();
22
22
  * </script>
23
23
  * ```
@@ -26,14 +26,14 @@ import {AbstractConstraint} from "./abstract.js";
26
26
  *
27
27
  * ```
28
28
  * <script type="module">
29
- * import {Valid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/constraints/valid.js';
29
+ * import {Valid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/constraints/valid.js';
30
30
  * new Valid();
31
31
  * </script>
32
32
  * ```
33
33
  *
34
34
  * @example
35
35
  *
36
- * import {Valid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/constraints/valid.js';
36
+ * import {Valid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/constraints/valid.js';
37
37
  *
38
38
  * new Valid().isValid()
39
39
  * .then(()=>console.log(true))
@@ -20,7 +20,7 @@ import {DELIMITER, Pathfinder, WILDCARD} from "./pathfinder.js";
20
20
  *
21
21
  * ```
22
22
  * <script type="module">
23
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/monster.js';
23
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/monster.js';
24
24
  * console.log(Monster.Data.buildMap())
25
25
  * </script>
26
26
  * ```
@@ -29,7 +29,7 @@ import {DELIMITER, Pathfinder, WILDCARD} from "./pathfinder.js";
29
29
  *
30
30
  * ```
31
31
  * <script type="module">
32
- * import {buildMap} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/data/buildmap.js';
32
+ * import {buildMap} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/data/buildmap.js';
33
33
  * console.log(buildMap())
34
34
  * </script>
35
35
  * ```
@@ -40,7 +40,7 @@ import {DELIMITER, Pathfinder, WILDCARD} from "./pathfinder.js";
40
40
  *
41
41
  * @example
42
42
  *
43
- * import {buildMap} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/data/buildmap.js';
43
+ * import {buildMap} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/data/buildmap.js';
44
44
  * // a typical data structure as reported by an api
45
45
  *
46
46
  * let map;
@@ -133,7 +133,7 @@ function buildMap(subject, selector, valueTemplate, keyTemplate, filter) {
133
133
  * @param {string|Monster.Data~exampleSelectorCallback} selector
134
134
  * @param {Monster.Data~exampleFilterCallback} [filter]
135
135
  * @param {function} callback
136
- * @return {*}
136
+ * @return {Map}
137
137
  */
138
138
  function assembleParts(subject, selector, filter, callback) {
139
139
 
@@ -156,7 +156,6 @@ function assembleParts(subject, selector, filter, callback) {
156
156
  return result;
157
157
  }
158
158
 
159
-
160
159
  map.forEach((v, k, m) => {
161
160
  if (isFunction(filter)) {
162
161
  if (filter.call(m, v, k) !== true) return;
@@ -164,7 +163,6 @@ function assembleParts(subject, selector, filter, callback) {
164
163
 
165
164
  callback.call(result, v, k, m);
166
165
 
167
-
168
166
  });
169
167
 
170
168
  return result;
@@ -197,7 +195,8 @@ function buildFlatMap(subject, selector, key, parentMap) {
197
195
  if (current === WILDCARD) {
198
196
 
199
197
  let finder = new Pathfinder(subject);
200
- let map
198
+ let map;
199
+
201
200
  try {
202
201
  map = finder.getVia(currentPath.join(DELIMITER));
203
202
  } catch (e) {
@@ -205,7 +204,6 @@ function buildFlatMap(subject, selector, key, parentMap) {
205
204
  map = new Map();
206
205
  }
207
206
 
208
-
209
207
  for (const [k, o] of map) {
210
208
 
211
209
  let copyKey = clone(key);
@@ -217,7 +215,7 @@ function buildFlatMap(subject, selector, key, parentMap) {
217
215
  let kk = copyKey.join(DELIMITER);
218
216
  let sub = buildFlatMap.call(result, o, parts.join(DELIMITER), copyKey, o);
219
217
 
220
- if (isObject(sub)) {
218
+ if (isObject(sub) && parentMap !== undefined) {
221
219
  sub['^'] = parentMap;
222
220
  }
223
221
 
@@ -255,7 +253,7 @@ function buildFlatMap(subject, selector, key, parentMap) {
255
253
  * Alternatively to a string selector a callback can be specified. this must return a map.
256
254
  *
257
255
  * @example
258
- * import {buildMap} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/data/buildmap.js';
256
+ * import {buildMap} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/data/buildmap.js';
259
257
  *
260
258
  * let obj = {
261
259
  * "data": [
@@ -5,9 +5,11 @@
5
5
  */
6
6
 
7
7
  import {assignToNamespace, Monster} from '../namespace.js';
8
+ import {isArray, isObject} from "../types/is.js";
8
9
  import {Node} from "../types/node.js";
9
10
  import {NodeList} from "../types/nodelist.js";
10
11
  import {assembleParts} from "./buildmap.js";
12
+ import {extend} from "./extend.js";
11
13
 
12
14
 
13
15
  /**
@@ -22,6 +24,13 @@ const parentSymbol = Symbol('parent');
22
24
  */
23
25
  const rootSymbol = Symbol('root');
24
26
 
27
+ /**
28
+ * @typedef {Object} buildTreeOptions
29
+ * @property {array} options.rootReferences=[null, undefined] defines the values for elements without parents
30
+ * @property {Monster.Data~exampleFilterCallback} options.filter filtering of the values
31
+ * @memberOf Monster.Data
32
+ */
33
+
25
34
  /**
26
35
  * With the help of the function `buildTree()`, nodes can be easily created from data objects.
27
36
  *
@@ -29,8 +38,8 @@ const rootSymbol = Symbol('root');
29
38
  *
30
39
  * ```
31
40
  * <script type="module">
32
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/buildtree.js';
33
- * console.log(Monster.Data.buildTree())
41
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/buildtree.js';
42
+ * Monster.Data.buildTree()
34
43
  * </script>
35
44
  * ```
36
45
  *
@@ -38,38 +47,54 @@ const rootSymbol = Symbol('root');
38
47
  *
39
48
  * ```
40
49
  * <script type="module">
41
- * import {buildTree} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/data/buildtree.js';
42
- * console.log(buildTree())
50
+ * import {buildTree} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/data/buildtree.js';
51
+ * buildTree()
43
52
  * </script>
44
53
  * ```
45
54
  *
46
55
  * @param {*} subject
47
56
  * @param {string|Monster.Data~exampleSelectorCallback} selector
48
- * @param {string} id
49
- * @param {string} parentID
50
- * @param {Monster.Data~exampleFilterCallback} [filter]
57
+ * @param {string} idKey
58
+ * @param {string} parentIDKey
59
+ * @param {buildTreeOptions} [options]
51
60
  * @return {*}
52
61
  * @memberOf Monster.Data
53
62
  * @throws {TypeError} value is neither a string nor a function
54
63
  * @throws {TypeError} the selector callback must return a map
55
64
  * @throws {Error} the object has no value for the specified id
65
+ * @since 1.26.0
56
66
  */
57
- function buildTree(subject, selector, id, parentID, filter) {
67
+ function buildTree(subject, selector, idKey, parentIDKey, options) {
58
68
 
59
69
  const nodes = new Map;
60
70
 
71
+ if (!isObject(options)) {
72
+ options = {}
73
+ }
74
+
75
+ options = extend({}, {
76
+ rootReferences: [null, undefined],
77
+ filter: undefined
78
+ }, options)
79
+
80
+ const filter = options?.filter;
81
+ let rootReferences = options.rootReferences;
82
+ if (!isArray(rootReferences)) {
83
+ rootReferences = [rootReferences];
84
+ }
85
+
61
86
  const childMap = assembleParts(subject, selector, filter, function (o, k, m) {
62
87
 
63
- const key = o?.[id]
64
- let ref = o?.[parentID]
65
- if (ref === null|| ref===undefined) ref = rootSymbol;
88
+ const key = o?.[idKey]
89
+ let ref = o?.[parentIDKey]
90
+ if (rootReferences.indexOf(ref) !== -1) ref = rootSymbol;
66
91
 
67
92
  if (key === undefined) {
68
93
  throw new Error('the object has no value for the specified id')
69
94
  }
70
95
 
71
96
  o[parentSymbol] = ref;
72
-
97
+
73
98
  const node = new Node(o);
74
99
  this.has(ref) ? this.get(ref).add(node) : this.set(ref, new NodeList().add(node));
75
100
  nodes.set(key, node);
@@ -77,17 +102,26 @@ function buildTree(subject, selector, id, parentID, filter) {
77
102
  })
78
103
 
79
104
  nodes.forEach(node => {
105
+
106
+ let id = node?.['value']?.[idKey];
80
107
 
81
- if (childMap.has(node.value.id)) {
82
- node.childNodes = childMap.get(node.value.id);
108
+ if (childMap.has(id)) {
109
+ node.childNodes = childMap.get(id);
110
+ childMap.delete(id)
83
111
  }
84
112
  })
85
113
 
86
- const r = childMap.get(rootSymbol);
87
-
88
- return new NodeList(childMap.get(rootSymbol));
114
+ const list = new NodeList;
89
115
 
116
+ childMap.forEach((s) => {
117
+ if (s instanceof Set) {
118
+ s.forEach((n) => {
119
+ list.add(n);
120
+ })
121
+ }
122
+ })
90
123
 
124
+ return list;
91
125
  }
92
126
 
93
127
 
@@ -17,7 +17,7 @@ import {WriteError} from "./restapi/writeerror.js";
17
17
  *
18
18
  * ```
19
19
  * <script type="module">
20
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/monster.js';
20
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/monster.js';
21
21
  * Monster.Data.Datasource.RestAPI()
22
22
  * </script>
23
23
  * ```
@@ -26,14 +26,14 @@ import {WriteError} from "./restapi/writeerror.js";
26
26
  *
27
27
  * ```
28
28
  * <script type="module">
29
- * import {RestAPI} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/data/datasource/restapi.js';
29
+ * import {RestAPI} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/data/datasource/restapi.js';
30
30
  * new RestAPI()
31
31
  * </script>
32
32
  * ```
33
33
  *
34
34
  * @example
35
35
  *
36
- * import {RestAPI} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/data/datasource/restapi.js';
36
+ * import {RestAPI} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/data/datasource/restapi.js';
37
37
  *
38
38
  * const ds = new RestAPI({
39
39
  * url: 'https://httpbin.org/get'
@@ -18,7 +18,7 @@ import {Storage, storageObjectSymbol} from "../storage.js";
18
18
  *
19
19
  * ```
20
20
  * <script type="module">
21
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/monster.js';
21
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/monster.js';
22
22
  * Monster.Data.Datasource.Storage.LocalStorage()
23
23
  * </script>
24
24
  * ```
@@ -27,7 +27,7 @@ import {Storage, storageObjectSymbol} from "../storage.js";
27
27
  *
28
28
  * ```
29
29
  * <script type="module">
30
- * import {LocalStorage} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/data/datasource/storage/localstorage.js';
30
+ * import {LocalStorage} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/data/datasource/storage/localstorage.js';
31
31
  * new LocalStorage()
32
32
  * </script>
33
33
  * ```
@@ -15,7 +15,7 @@ import {Storage, storageObjectSymbol} from "../storage.js";
15
15
  *
16
16
  * ```
17
17
  * <script type="module">
18
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/monster.js';
18
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/monster.js';
19
19
  * Monster.Data.Datasource.Storage.SessionStorage()
20
20
  * </script>
21
21
  * ```
@@ -24,7 +24,7 @@ import {Storage, storageObjectSymbol} from "../storage.js";
24
24
  *
25
25
  * ```
26
26
  * <script type="module">
27
- * import {SessionStorage} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/data/datasource/storage/sessionstorage.js';
27
+ * import {SessionStorage} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/data/datasource/storage/sessionstorage.js';
28
28
  * new SessionStorage()
29
29
  * </script>
30
30
  * ```
@@ -20,7 +20,7 @@ const storageObjectSymbol = Symbol('storageObject');
20
20
  *
21
21
  * ```
22
22
  * <script type="module">
23
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/monster.js';
23
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/monster.js';
24
24
  * Monster.Data.Datasource.Storage()
25
25
  * </script>
26
26
  * ```
@@ -29,14 +29,14 @@ const storageObjectSymbol = Symbol('storageObject');
29
29
  *
30
30
  * ```
31
31
  * <script type="module">
32
- * import {Storage} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/data/datasource/storage.js';
32
+ * import {Storage} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/data/datasource/storage.js';
33
33
  * new Storage()
34
34
  * </script>
35
35
  * ```
36
36
  *
37
37
  * @example
38
38
  *
39
- * import {Storage} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/data/datasource/storage.js';
39
+ * import {Storage} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/data/datasource/storage.js';
40
40
  *
41
41
  * new Datasource();
42
42
  *
@@ -31,7 +31,7 @@ const internalDataSymbol = Symbol('internalData');
31
31
  *
32
32
  * ```
33
33
  * <script type="module">
34
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/monster.js';
34
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/monster.js';
35
35
  * Monster.Data.Datasource()
36
36
  * </script>
37
37
  * ```
@@ -40,14 +40,14 @@ const internalDataSymbol = Symbol('internalData');
40
40
  *
41
41
  * ```
42
42
  * <script type="module">
43
- * import {Datasource} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/data/datasource.js';
43
+ * import {Datasource} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/data/datasource.js';
44
44
  * new Datasource()
45
45
  * </script>
46
46
  * ```
47
47
  *
48
48
  * @example
49
49
  *
50
- * import {Datasource} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/data/datasource.js'
50
+ * import {Datasource} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/data/datasource.js'
51
51
  *
52
52
  * class MyDatasource extends Datasource {
53
53
  *
@@ -17,7 +17,7 @@ import {typeOf} from "../types/typeof.js";
17
17
  *
18
18
  * ```
19
19
  * <script type="module">
20
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/monster.js';
20
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/monster.js';
21
21
  * Monster.Data.Diff(a, b)
22
22
  * </script>
23
23
  * ```
@@ -26,14 +26,14 @@ import {typeOf} from "../types/typeof.js";
26
26
  *
27
27
  * ```
28
28
  * <script type="module">
29
- * import {Diff} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/data/diff.js';
29
+ * import {Diff} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/data/diff.js';
30
30
  * Diff(a, b)
31
31
  * </script>
32
32
  * ```
33
33
  *
34
34
  * @example
35
35
  *
36
- * import {Diff} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/data/diff.js';
36
+ * import {Diff} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/data/diff.js';
37
37
  *
38
38
  * // given are two objects x and y.
39
39
  *
@@ -15,7 +15,7 @@ import {typeOf} from "../types/typeof.js";
15
15
  *
16
16
  * ```
17
17
  * <script type="module">
18
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/monster.js';
18
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/monster.js';
19
19
  * Monster.Data.extend(a, b)
20
20
  * </script>
21
21
  * ```
@@ -24,7 +24,7 @@ import {typeOf} from "../types/typeof.js";
24
24
  *
25
25
  * ```
26
26
  * <script type="module">
27
- * import {extend} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/data/extend.js';
27
+ * import {extend} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/data/extend.js';
28
28
  * extend(a, b)
29
29
  * </script>
30
30
  * ```
@@ -27,7 +27,7 @@ export const WILDCARD = '*';
27
27
  *
28
28
  * ```
29
29
  * <script type="module">
30
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/monster.js';
30
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/monster.js';
31
31
  * console.log(new Monster.Data.Pathfinder())
32
32
  * </script>
33
33
  * ```
@@ -36,7 +36,7 @@ export const WILDCARD = '*';
36
36
  *
37
37
  * ```
38
38
  * <script type="module">
39
- * import {Pathfinder} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/data/pathfinder.js';
39
+ * import {Pathfinder} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/data/pathfinder.js';
40
40
  * console.log(new Pathfinder())
41
41
  * </script>
42
42
  * ```
@@ -78,7 +78,7 @@ export const WILDCARD = '*';
78
78
  *
79
79
  * @example
80
80
  *
81
- * import {Pathfinder} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/data/pathfinder.js';
81
+ * import {Pathfinder} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/data/pathfinder.js';
82
82
  *
83
83
  * let value = new Pathfinder({
84
84
  * a: {
@@ -104,7 +104,7 @@ export const WILDCARD = '*';
104
104
  *
105
105
  * @example
106
106
  *
107
- * import {Pathfinder} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/data/pathfinder.js';
107
+ * import {Pathfinder} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/data/pathfinder.js';
108
108
  *
109
109
  * let p = new Pathfinder({
110
110
  * a: {
@@ -19,7 +19,7 @@ const DELIMITER = '|';
19
19
  *
20
20
  * ```
21
21
  * <script type="module">
22
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/monster.js';
22
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/monster.js';
23
23
  * new Monster.Data.Pipe()
24
24
  * </script>
25
25
  * ```
@@ -28,7 +28,7 @@ const DELIMITER = '|';
28
28
  *
29
29
  * ```
30
30
  * <script type="module">
31
- * import {Pipe} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/data/pipe.js';
31
+ * import {Pipe} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/data/pipe.js';
32
32
  * new Pipe()
33
33
  * </script>
34
34
  * ```
@@ -39,7 +39,7 @@ const DELIMITER = '|';
39
39
  * the word is then converted to uppercase letters and a prefix Hello is added. the two backslash safe the space char.
40
40
  *
41
41
  * @example
42
- * import {Pipe} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/data/pipe.js';
42
+ * import {Pipe} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/data/pipe.js';
43
43
  *
44
44
  * let obj = {
45
45
  * a: {
@@ -25,7 +25,7 @@ import {Pathfinder} from "./pathfinder.js";
25
25
  *
26
26
  * ```
27
27
  * <script type="module">
28
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/monster.js';
28
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/monster.js';
29
29
  * new Monster.Data.Transformer()
30
30
  * </script>
31
31
  * ```
@@ -34,7 +34,7 @@ import {Pathfinder} from "./pathfinder.js";
34
34
  *
35
35
  * ```
36
36
  * <script type="module">
37
- * import {Transformer} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/data/transformer.js';
37
+ * import {Transformer} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/data/transformer.js';
38
38
  * new Transformer()
39
39
  * </script>
40
40
  * ```
@@ -120,7 +120,7 @@ import {Pathfinder} from "./pathfinder.js";
120
120
  *
121
121
  * @example
122
122
  *
123
- * import {Transformer} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.27.0/dist/modules/data/transformer.js';
123
+ * import {Transformer} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.28.0/dist/modules/data/transformer.js';
124
124
  *
125
125
  * const transformer = new Transformer("tolower")
126
126
  *