@schukai/monster 1.27.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 (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
  *