@schukai/monster 1.26.1 → 1.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/CHANGELOG +38 -1
  2. package/README.md +4 -4
  3. package/dist/modules/constants.js +1 -1
  4. package/dist/modules/constraints/abstract.js +1 -1
  5. package/dist/modules/constraints/abstractoperator.js +1 -1
  6. package/dist/modules/constraints/andoperator.js +1 -1
  7. package/dist/modules/constraints/invalid.js +1 -1
  8. package/dist/modules/constraints/isarray.js +1 -1
  9. package/dist/modules/constraints/isobject.js +1 -1
  10. package/dist/modules/constraints/namespace.js +1 -1
  11. package/dist/modules/constraints/oroperator.js +1 -1
  12. package/dist/modules/constraints/valid.js +1 -1
  13. package/dist/modules/data/buildmap.js +2 -2
  14. package/dist/modules/data/buildtree.js +2 -2
  15. package/dist/modules/data/datasource/namespace.js +1 -1
  16. package/dist/modules/data/datasource/restapi/writeerror.js +1 -1
  17. package/dist/modules/data/datasource/restapi.js +1 -1
  18. package/dist/modules/data/datasource/storage/localstorage.js +1 -1
  19. package/dist/modules/data/datasource/storage/namespace.js +1 -1
  20. package/dist/modules/data/datasource/storage/sessionstorage.js +1 -1
  21. package/dist/modules/data/datasource/storage.js +1 -1
  22. package/dist/modules/data/datasource.js +1 -1
  23. package/dist/modules/data/diff.js +1 -1
  24. package/dist/modules/data/extend.js +1 -1
  25. package/dist/modules/data/namespace.js +1 -1
  26. package/dist/modules/data/pathfinder.js +1 -1
  27. package/dist/modules/data/pipe.js +1 -1
  28. package/dist/modules/data/transformer.js +1 -1
  29. package/dist/modules/dom/assembler.js +1 -1
  30. package/dist/modules/dom/attributes.js +2 -2
  31. package/dist/modules/dom/constants.js +2 -2
  32. package/dist/modules/dom/customcontrol.js +1 -1
  33. package/dist/modules/dom/customelement.js +2 -2
  34. package/dist/modules/dom/events.js +2 -2
  35. package/dist/modules/dom/focusmanager.js +1 -1
  36. package/dist/modules/dom/locale.js +1 -1
  37. package/dist/modules/dom/namespace.js +1 -1
  38. package/dist/modules/dom/resource/data.js +1 -1
  39. package/dist/modules/dom/resource/link/stylesheet.js +1 -1
  40. package/dist/modules/dom/resource/link.js +1 -1
  41. package/dist/modules/dom/resource/script.js +1 -1
  42. package/dist/modules/dom/resource.js +1 -1
  43. package/dist/modules/dom/resourcemanager.js +1 -1
  44. package/dist/modules/dom/template.js +2 -2
  45. package/dist/modules/dom/theme.js +1 -1
  46. package/dist/modules/dom/updater.js +2 -2
  47. package/dist/modules/dom/util.js +1 -1
  48. package/dist/modules/dom/worker/factory.js +1 -1
  49. package/dist/modules/i18n/formatter.js +1 -1
  50. package/dist/modules/i18n/locale.js +1 -1
  51. package/dist/modules/i18n/namespace.js +1 -1
  52. package/dist/modules/i18n/provider.js +1 -1
  53. package/dist/modules/i18n/providers/fetch.js +1 -1
  54. package/dist/modules/i18n/providers/namespace.js +1 -1
  55. package/dist/modules/i18n/translations.js +1 -1
  56. package/dist/modules/logging/handler/console.js +1 -1
  57. package/dist/modules/logging/handler/namespace.js +1 -1
  58. package/dist/modules/logging/handler.js +1 -1
  59. package/dist/modules/logging/logentry.js +1 -1
  60. package/dist/modules/logging/logger.js +1 -1
  61. package/dist/modules/logging/namespace.js +1 -1
  62. package/dist/modules/math/namespace.js +1 -1
  63. package/dist/modules/math/random.js +1 -1
  64. package/dist/modules/monster.js +1 -1
  65. package/dist/modules/namespace.js +1 -1
  66. package/dist/modules/text/formatter.js +1 -1
  67. package/dist/modules/text/namespace.js +1 -1
  68. package/dist/modules/types/base.js +1 -1
  69. package/dist/modules/types/basewithoptions.js +1 -1
  70. package/dist/modules/types/binary.js +1 -1
  71. package/dist/modules/types/dataurl.js +1 -1
  72. package/dist/modules/types/global.js +1 -1
  73. package/dist/modules/types/id.js +1 -1
  74. package/dist/modules/types/is.js +1 -1
  75. package/dist/modules/types/mediatype.js +1 -1
  76. package/dist/modules/types/namespace.js +1 -1
  77. package/dist/modules/types/node.js +2 -2
  78. package/dist/modules/types/nodelist.js +2 -2
  79. package/dist/modules/types/noderecursiveiterator.js +2 -2
  80. package/dist/modules/types/observer.js +1 -1
  81. package/dist/modules/types/observerlist.js +1 -1
  82. package/dist/modules/types/proxyobserver.js +1 -1
  83. package/dist/modules/types/queue.js +1 -1
  84. package/dist/modules/types/randomid.js +1 -1
  85. package/dist/modules/types/regex.js +1 -1
  86. package/dist/modules/types/stack.js +1 -1
  87. package/dist/modules/types/tokenlist.js +1 -1
  88. package/dist/modules/types/typeof.js +1 -1
  89. package/dist/modules/types/uniquequeue.js +1 -1
  90. package/dist/modules/types/uuid.js +1 -1
  91. package/dist/modules/types/validate.js +1 -1
  92. package/dist/modules/types/version.js +2 -2
  93. package/dist/modules/util/clone.js +1 -1
  94. package/dist/modules/util/comparator.js +1 -1
  95. package/dist/modules/util/deadmansswitch.js +2 -0
  96. package/dist/modules/util/freeze.js +1 -1
  97. package/dist/modules/util/namespace.js +1 -1
  98. package/dist/modules/util/processing.js +1 -1
  99. package/dist/modules/util/trimspaces.js +1 -1
  100. package/dist/monster.dev.js +906 -619
  101. package/dist/monster.dev.js.map +1 -1
  102. package/dist/monster.js +2 -2
  103. package/package.json +1 -1
  104. package/source/constraints/andoperator.js +5 -5
  105. package/source/constraints/invalid.js +3 -3
  106. package/source/constraints/isarray.js +3 -3
  107. package/source/constraints/isobject.js +3 -3
  108. package/source/constraints/oroperator.js +5 -5
  109. package/source/constraints/valid.js +3 -3
  110. package/source/data/buildmap.js +10 -11
  111. package/source/data/buildtree.js +51 -17
  112. package/source/data/datasource/restapi.js +3 -3
  113. package/source/data/datasource/storage/localstorage.js +2 -2
  114. package/source/data/datasource/storage/sessionstorage.js +2 -2
  115. package/source/data/datasource/storage.js +3 -3
  116. package/source/data/datasource.js +3 -3
  117. package/source/data/diff.js +3 -3
  118. package/source/data/extend.js +2 -2
  119. package/source/data/pathfinder.js +4 -4
  120. package/source/data/pipe.js +3 -3
  121. package/source/data/transformer.js +3 -3
  122. package/source/dom/assembler.js +2 -2
  123. package/source/dom/attributes.js +111 -28
  124. package/source/dom/constants.js +17 -1
  125. package/source/dom/customcontrol.js +1 -1
  126. package/source/dom/customelement.js +27 -13
  127. package/source/dom/events.js +68 -12
  128. package/source/dom/focusmanager.js +2 -2
  129. package/source/dom/locale.js +2 -2
  130. package/source/dom/resource/data.js +2 -2
  131. package/source/dom/resource/link/stylesheet.js +2 -2
  132. package/source/dom/resource/link.js +2 -2
  133. package/source/dom/resource/script.js +2 -2
  134. package/source/dom/resource.js +2 -2
  135. package/source/dom/resourcemanager.js +2 -2
  136. package/source/dom/template.js +41 -11
  137. package/source/dom/theme.js +3 -3
  138. package/source/dom/updater.js +183 -100
  139. package/source/dom/util.js +6 -6
  140. package/source/dom/worker/factory.js +2 -2
  141. package/source/i18n/formatter.js +4 -4
  142. package/source/i18n/locale.js +4 -4
  143. package/source/i18n/provider.js +2 -2
  144. package/source/i18n/providers/fetch.js +3 -3
  145. package/source/i18n/translations.js +4 -4
  146. package/source/logging/handler/console.js +2 -2
  147. package/source/logging/handler.js +2 -2
  148. package/source/logging/logentry.js +2 -2
  149. package/source/logging/logger.js +2 -2
  150. package/source/math/random.js +2 -2
  151. package/source/namespace.js +1 -1
  152. package/source/text/formatter.js +3 -3
  153. package/source/types/base.js +2 -2
  154. package/source/types/basewithoptions.js +2 -2
  155. package/source/types/binary.js +4 -4
  156. package/source/types/dataurl.js +4 -4
  157. package/source/types/global.js +4 -4
  158. package/source/types/id.js +2 -2
  159. package/source/types/is.js +20 -20
  160. package/source/types/mediatype.js +4 -4
  161. package/source/types/node.js +33 -2
  162. package/source/types/nodelist.js +9 -5
  163. package/source/types/noderecursiveiterator.js +29 -7
  164. package/source/types/observer.js +5 -13
  165. package/source/types/observerlist.js +2 -2
  166. package/source/types/proxyobserver.js +5 -5
  167. package/source/types/queue.js +3 -3
  168. package/source/types/randomid.js +2 -2
  169. package/source/types/regex.js +2 -2
  170. package/source/types/stack.js +2 -2
  171. package/source/types/tokenlist.js +2 -2
  172. package/source/types/typeof.js +3 -3
  173. package/source/types/uniquequeue.js +2 -2
  174. package/source/types/uuid.js +2 -2
  175. package/source/types/validate.js +20 -20
  176. package/source/types/version.js +6 -6
  177. package/source/util/clone.js +2 -2
  178. package/source/util/comparator.js +3 -3
  179. package/source/util/deadmansswitch.js +124 -0
  180. package/source/util/freeze.js +2 -2
  181. package/source/util/processing.js +3 -3
  182. package/source/util/trimspaces.js +2 -2
  183. package/test/cases/data/buildtree.js +84 -21
  184. package/test/cases/dom/attributes.js +29 -6
  185. package/test/cases/dom/events.js +66 -1
  186. package/test/cases/dom/template.js +72 -14
  187. package/test/cases/dom/updater.js +102 -75
  188. package/test/cases/math/random.js +3 -0
  189. package/test/cases/monster.js +1 -1
  190. package/test/cases/types/node.js +57 -1
  191. package/test/cases/types/nodelist.js +7 -0
  192. package/test/cases/types/noderecursiveiterator.js +21 -0
  193. package/test/cases/util/deadmansswitch.js +71 -0
  194. package/test/web/import.js +1 -0
  195. package/test/web/monster-dev.html +3 -3
  196. package/test/web/monster.html +2 -2
  197. package/test/web/test.html +3 -3
  198. package/test/web/tests.js +2 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@schukai/monster",
3
- "version": "1.26.1",
3
+ "version": "1.29.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.26.1/dist/monster.js';
19
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/constraints/andoperator.js';
28
+ * import {AndOperator} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/constraints/valid.js';
36
- * import {Invalid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/modules/constraints/invalid.js';
37
- * import {AndOperator} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/modules/constraints/andoperator.js';
35
+ * import {Valid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.0/dist/modules/constraints/valid.js';
36
+ * import {Invalid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.0/dist/modules/constraints/invalid.js';
37
+ * import {AndOperator} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/monster.js';
20
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/constraints/invalid.js';
29
+ * import {Invalid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/constraints/invalid.js';
36
+ * import {Invalid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/monster.js';
19
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/constraints/isarray.js';
28
+ * import {IsArray} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/constraints/isarray.js';
35
+ * import {IsArray} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/monster.js';
19
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/constraints/isobject.js';
28
+ * import {IsObject} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/constraints/isobject.js';
35
+ * import {IsObject} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/monster.js';
18
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/constraint/oroperator.js';
27
+ * import {OrOperator} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/constraints/valid.js';
35
- * import {Invalid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/modules/constraints/invalid.js';
36
- * import {OrOperator} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/modules/constraints/oroperator.js';
34
+ * import {Valid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.0/dist/modules/constraints/valid.js';
35
+ * import {Invalid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.0/dist/modules/constraints/invalid.js';
36
+ * import {OrOperator} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/monster.js';
20
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/constraints/valid.js';
29
+ * import {Valid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/constraints/valid.js';
36
+ * import {Valid} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/monster.js';
23
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/data/buildmap.js';
32
+ * import {buildMap} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/data/buildmap.js';
43
+ * import {buildMap} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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,8 @@ 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
+ * @throws {TypeError} selector is neither a string nor a function
137
138
  */
138
139
  function assembleParts(subject, selector, filter, callback) {
139
140
 
@@ -149,14 +150,13 @@ function assembleParts(subject, selector, filter, callback) {
149
150
  map = new Map;
150
151
  buildFlatMap.call(map, subject, selector);
151
152
  } else {
152
- throw new TypeError('value is neither a string nor a function')
153
+ throw new TypeError('selector is neither a string nor a function')
153
154
  }
154
155
 
155
156
  if (!(map instanceof Map)) {
156
157
  return result;
157
158
  }
158
159
 
159
-
160
160
  map.forEach((v, k, m) => {
161
161
  if (isFunction(filter)) {
162
162
  if (filter.call(m, v, k) !== true) return;
@@ -164,7 +164,6 @@ function assembleParts(subject, selector, filter, callback) {
164
164
 
165
165
  callback.call(result, v, k, m);
166
166
 
167
-
168
167
  });
169
168
 
170
169
  return result;
@@ -197,7 +196,8 @@ function buildFlatMap(subject, selector, key, parentMap) {
197
196
  if (current === WILDCARD) {
198
197
 
199
198
  let finder = new Pathfinder(subject);
200
- let map
199
+ let map;
200
+
201
201
  try {
202
202
  map = finder.getVia(currentPath.join(DELIMITER));
203
203
  } catch (e) {
@@ -205,7 +205,6 @@ function buildFlatMap(subject, selector, key, parentMap) {
205
205
  map = new Map();
206
206
  }
207
207
 
208
-
209
208
  for (const [k, o] of map) {
210
209
 
211
210
  let copyKey = clone(key);
@@ -217,7 +216,7 @@ function buildFlatMap(subject, selector, key, parentMap) {
217
216
  let kk = copyKey.join(DELIMITER);
218
217
  let sub = buildFlatMap.call(result, o, parts.join(DELIMITER), copyKey, o);
219
218
 
220
- if (isObject(sub)) {
219
+ if (isObject(sub) && parentMap !== undefined) {
221
220
  sub['^'] = parentMap;
222
221
  }
223
222
 
@@ -255,7 +254,7 @@ function buildFlatMap(subject, selector, key, parentMap) {
255
254
  * Alternatively to a string selector a callback can be specified. this must return a map.
256
255
  *
257
256
  * @example
258
- * import {buildMap} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/modules/data/buildmap.js';
257
+ * import {buildMap} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.0/dist/modules/data/buildmap.js';
259
258
  *
260
259
  * let obj = {
261
260
  * "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.26.1/dist/buildtree.js';
33
- * console.log(Monster.Data.buildTree())
41
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/data/buildtree.js';
42
- * console.log(buildTree())
50
+ * import {buildTree} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/monster.js';
20
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/data/datasource/restapi.js';
29
+ * import {RestAPI} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/data/datasource/restapi.js';
36
+ * import {RestAPI} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/monster.js';
21
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/data/datasource/storage/localstorage.js';
30
+ * import {LocalStorage} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/monster.js';
18
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/data/datasource/storage/sessionstorage.js';
27
+ * import {SessionStorage} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/monster.js';
23
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/data/datasource/storage.js';
32
+ * import {Storage} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/data/datasource/storage.js';
39
+ * import {Storage} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/monster.js';
34
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/data/datasource.js';
43
+ * import {Datasource} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/data/datasource.js'
50
+ * import {Datasource} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/monster.js';
20
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/data/diff.js';
29
+ * import {Diff} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/data/diff.js';
36
+ * import {Diff} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/monster.js';
18
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/data/extend.js';
27
+ * import {extend} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/monster.js';
30
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/data/pathfinder.js';
39
+ * import {Pathfinder} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/data/pathfinder.js';
81
+ * import {Pathfinder} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/data/pathfinder.js';
107
+ * import {Pathfinder} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/monster.js';
22
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/data/pipe.js';
31
+ * import {Pipe} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.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.26.1/dist/modules/data/pipe.js';
42
+ * import {Pipe} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.29.0/dist/modules/data/pipe.js';
43
43
  *
44
44
  * let obj = {
45
45
  * a: {