@hkdigital/lib-sveltekit 0.1.6 → 0.1.8

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 (220) hide show
  1. package/README.md +127 -127
  2. package/dist/classes/data/IterableTree.js +243 -243
  3. package/dist/classes/data/Selector.js +190 -190
  4. package/dist/classes/data/index.js +2 -2
  5. package/dist/classes/index.js +3 -3
  6. package/dist/classes/promise/HkPromise.js +377 -377
  7. package/dist/classes/promise/index.js +1 -1
  8. package/dist/classes/stores/SubscribersCount.js +107 -107
  9. package/dist/classes/stores/index.js +1 -1
  10. package/dist/classes/streams/LogTransformStream.js +19 -19
  11. package/dist/classes/streams/ServerEventsStore.js +110 -110
  12. package/dist/classes/streams/TimeStampSource.js +26 -26
  13. package/dist/classes/streams/index.js +3 -3
  14. package/dist/classes/svelte/audio/AudioLoader.svelte.js +58 -58
  15. package/dist/classes/svelte/audio/AudioScene.svelte.js +282 -282
  16. package/dist/classes/svelte/audio/mocks.js +35 -35
  17. package/dist/classes/svelte/final-state-machine/FiniteStateMachine.svelte.js +133 -133
  18. package/dist/classes/svelte/final-state-machine/index.js +1 -1
  19. package/dist/classes/svelte/image/ImageLoader.svelte.js +47 -47
  20. package/dist/classes/svelte/image/ImageScene.svelte.js +253 -253
  21. package/dist/classes/svelte/image/ImageVariantsLoader.svelte.js +152 -152
  22. package/dist/classes/svelte/image/index.js +4 -4
  23. package/dist/classes/svelte/image/mocks.js +35 -35
  24. package/dist/classes/svelte/image/typedef.js +8 -8
  25. package/dist/classes/svelte/loading-state-machine/LoadingStateMachine.svelte.js +109 -109
  26. package/dist/classes/svelte/loading-state-machine/constants.js +16 -16
  27. package/dist/classes/svelte/loading-state-machine/index.js +3 -3
  28. package/dist/classes/svelte/network-loader/NetworkLoader.svelte.js +331 -331
  29. package/dist/classes/svelte/network-loader/constants.js +3 -3
  30. package/dist/classes/svelte/network-loader/index.js +3 -3
  31. package/dist/classes/svelte/network-loader/mocks.js +30 -30
  32. package/dist/classes/svelte/network-loader/typedef.js +8 -8
  33. package/dist/components/area/HkArea.svelte +49 -49
  34. package/dist/components/area/HkArea.svelte.d.ts +14 -0
  35. package/dist/components/area/HkGridArea.svelte +77 -77
  36. package/dist/components/area/HkGridArea.svelte.d.ts +22 -0
  37. package/dist/components/area/index.js +2 -2
  38. package/dist/components/boxes/game-box/GameBox.svelte +112 -112
  39. package/dist/components/boxes/game-box/GameBox.svelte.d.ts +15 -0
  40. package/dist/components/boxes/game-box/gamebox.util.js +83 -83
  41. package/dist/components/boxes/index.js +2 -2
  42. package/dist/components/boxes/virtual-viewport/VirtualViewport.svelte +196 -199
  43. package/dist/components/boxes/virtual-viewport/VirtualViewport.svelte.d.ts +24 -2
  44. package/dist/components/buttons/button/Button.svelte +76 -75
  45. package/dist/components/buttons/button/Button.svelte.d.ts +21 -0
  46. package/dist/components/buttons/button-icon-steeze/SteezeIconButton.svelte +30 -0
  47. package/dist/components/buttons/button-icon-steeze/SteezeIconButton.svelte.d.ts +16 -0
  48. package/dist/components/buttons/button-text/TextButton.svelte +21 -21
  49. package/dist/components/buttons/button-text/TextButton.svelte.d.ts +7 -0
  50. package/dist/components/buttons/index.d.ts +1 -0
  51. package/dist/components/buttons/index.js +3 -2
  52. package/dist/components/hkdev/blocks/TextBlock.svelte +46 -46
  53. package/dist/components/hkdev/blocks/TextBlock.svelte.d.ts +13 -0
  54. package/dist/components/hkdev/buttons/CheckButton.svelte +62 -62
  55. package/dist/components/hkdev/buttons/CheckButton.svelte.d.ts +18 -0
  56. package/dist/components/{icon → icons}/HkIcon.svelte +86 -86
  57. package/dist/components/icons/HkIcon.svelte.d.ts +22 -0
  58. package/dist/components/{icon → icons}/HkTabIcon.svelte +116 -116
  59. package/dist/components/icons/HkTabIcon.svelte.d.ts +40 -0
  60. package/dist/components/icons/SteezeIcon.svelte +96 -0
  61. package/dist/components/icons/SteezeIcon.svelte.d.ts +22 -0
  62. package/dist/components/{icon → icons}/index.d.ts +1 -0
  63. package/dist/components/{icon → icons}/index.js +6 -4
  64. package/dist/components/{icon → icons}/typedef.js +16 -16
  65. package/dist/components/image/ImageBox.svelte +208 -208
  66. package/dist/components/image/ImageBox.svelte.d.ts +19 -0
  67. package/dist/components/image/index.js +5 -5
  68. package/dist/components/image/typedef.js +32 -32
  69. package/dist/components/index.js +2 -2
  70. package/dist/components/inputs/index.js +1 -1
  71. package/dist/components/inputs/text-input/TestTextInput.svelte__ +102 -102
  72. package/dist/components/inputs/text-input/TextInput.svelte +226 -226
  73. package/dist/components/inputs/text-input/TextInput.svelte.d.ts +28 -0
  74. package/dist/components/inputs/text-input/TextInput.svelte___ +83 -83
  75. package/dist/components/inputs/text-input/assets/IconInvalid.svelte +14 -14
  76. package/dist/components/inputs/text-input/assets/IconValid.svelte +12 -12
  77. package/dist/components/layout/HkAppLayout.state.svelte.js +25 -25
  78. package/dist/components/layout/HkAppLayout.svelte +251 -251
  79. package/dist/components/layout/HkAppLayout.svelte.d.ts +11 -0
  80. package/dist/components/layout/HkGridLayers.svelte +82 -82
  81. package/dist/components/layout/HkGridLayers.svelte.d.ts +23 -0
  82. package/dist/components/layout/index.js +9 -9
  83. package/dist/components/panels/index.js +1 -1
  84. package/dist/components/panels/plain-panel/PlainPanel.svelte +33 -33
  85. package/dist/components/panels/plain-panel/PlainPanel.svelte.d.ts +12 -0
  86. package/dist/components/rows/index.js +3 -3
  87. package/dist/components/rows/panel-grid-row/PanelGridRow.svelte +104 -104
  88. package/dist/components/rows/panel-grid-row/PanelGridRow.svelte.d.ts +14 -0
  89. package/dist/components/rows/panel-row-2/PanelRow2.svelte +40 -40
  90. package/dist/components/rows/panel-row-2/PanelRow2.svelte.d.ts +14 -0
  91. package/dist/components/tab-bar/HkTabBar.state.svelte.js +149 -149
  92. package/dist/components/tab-bar/HkTabBar.svelte +74 -74
  93. package/dist/components/tab-bar/HkTabBar.svelte.d.ts +18 -0
  94. package/dist/components/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
  95. package/dist/components/tab-bar/HkTabBarSelector.svelte +49 -49
  96. package/dist/components/tab-bar/HkTabBarSelector.svelte.d.ts +19 -0
  97. package/dist/components/tab-bar/index.js +17 -17
  98. package/dist/components/tab-bar/typedef.d.ts +1 -1
  99. package/dist/components/tab-bar/typedef.js +8 -8
  100. package/dist/components/widgets/compare-left-right/CompareLeftRight.svelte +179 -179
  101. package/dist/components/widgets/compare-left-right/CompareLeftRight.svelte.d.ts +10 -0
  102. package/dist/components/widgets/compare-left-right/index.js +1 -1
  103. package/dist/components/widgets/scale-control/index.js +1 -1
  104. package/dist/config/imagetools-config.js +189 -189
  105. package/dist/config/imagetools.d.ts +71 -71
  106. package/dist/config/typedef.js +8 -8
  107. package/dist/constants/errors/api.js +9 -9
  108. package/dist/constants/errors/generic.js +5 -5
  109. package/dist/constants/errors/index.js +3 -3
  110. package/dist/constants/errors/jwt.js +5 -5
  111. package/dist/constants/http/headers.js +6 -6
  112. package/dist/constants/http/index.js +2 -2
  113. package/dist/constants/http/methods.js +2 -2
  114. package/dist/constants/index.js +3 -3
  115. package/dist/constants/mime/application.js +5 -5
  116. package/dist/constants/mime/audio.js +13 -13
  117. package/dist/constants/mime/image.js +3 -3
  118. package/dist/constants/mime/index.js +4 -4
  119. package/dist/constants/mime/text.js +2 -2
  120. package/dist/constants/regexp/index.js +31 -31
  121. package/dist/constants/regexp/inspiratie.js__ +95 -95
  122. package/dist/constants/regexp/text.js +49 -49
  123. package/dist/constants/regexp/user.js +32 -32
  124. package/dist/constants/regexp/web.js +3 -3
  125. package/dist/constants/state-labels/input-states.js +11 -11
  126. package/dist/constants/state-labels/submit-states.js +4 -4
  127. package/dist/constants/time.js +28 -28
  128. package/dist/css/tw-prose.postcss__ +259 -259
  129. package/dist/css/utilities.postcss +43 -43
  130. package/dist/design/design-config.d.ts +7 -6
  131. package/dist/design/design-config.js +73 -73
  132. package/dist/design/tailwind-theme-extend.d.ts +4 -4
  133. package/dist/design/tailwind-theme-extend.js +158 -151
  134. package/dist/schemas/index.js +1 -1
  135. package/dist/schemas/validate-url.js +180 -180
  136. package/dist/server/index.js +1 -1
  137. package/dist/server/logger.js +94 -94
  138. package/dist/states/index.js +1 -1
  139. package/dist/states/navigation.svelte.js +55 -55
  140. package/dist/stores/index.js +1 -1
  141. package/dist/stores/theme.js +80 -80
  142. package/dist/themes/hkdev/components/blocks/text-block.postcss +41 -41
  143. package/dist/themes/hkdev/components/boxes/game-box.postcss +13 -13
  144. package/dist/themes/hkdev/components/buttons/button-icon-steeze.postcss +22 -0
  145. package/dist/themes/hkdev/components/buttons/button-text.postcss +34 -34
  146. package/dist/themes/hkdev/components/buttons/button.postcss +138 -138
  147. package/dist/themes/hkdev/components/buttons/button.postcss__ +40 -0
  148. package/dist/themes/hkdev/components/buttons/button.postcss___ +91 -0
  149. package/dist/themes/hkdev/components/buttons/skip-button.postcss +8 -8
  150. package/dist/themes/hkdev/components/icons/icon-steeze.postcss +22 -0
  151. package/dist/themes/hkdev/components/inputs/text-input.postcss +108 -108
  152. package/dist/themes/hkdev/components/panels/plain-panel.postcss +46 -46
  153. package/dist/themes/hkdev/components/panels/speech-bubble.postcss +52 -52
  154. package/dist/themes/hkdev/components/rows/panel-grid-row.postcss +7 -7
  155. package/dist/themes/hkdev/components/rows/panel-row-2.postcss +9 -9
  156. package/dist/themes/hkdev/components.postcss +61 -55
  157. package/dist/themes/hkdev/debug.postcss +1 -1
  158. package/dist/themes/hkdev/global/layout.postcss +39 -39
  159. package/dist/themes/hkdev/global/on-colors.postcss +53 -53
  160. package/dist/themes/hkdev/global/text.postcss__ +34 -34
  161. package/dist/themes/hkdev/global/vars.postcss__ +7 -7
  162. package/dist/themes/hkdev/globals.postcss +11 -11
  163. package/dist/themes/hkdev/responsive.postcss +12 -12
  164. package/dist/themes/hkdev/theme-ext.js +15 -15
  165. package/dist/themes/hkdev/theme.js +227 -227
  166. package/dist/themes/index.js +1 -1
  167. package/dist/util/array/index.js +455 -455
  168. package/dist/util/compare/index.js +247 -247
  169. package/dist/util/css/css-vars.js +83 -83
  170. package/dist/util/css/index.js +1 -1
  171. package/dist/util/design-system/components/states.js +22 -22
  172. package/dist/util/design-system/css/clamp.d.ts +2 -2
  173. package/dist/util/design-system/css/clamp.js +66 -66
  174. package/dist/util/design-system/css/root-design-vars.d.ts +4 -4
  175. package/dist/util/design-system/css/root-design-vars.js +100 -100
  176. package/dist/util/design-system/index.js +5 -5
  177. package/dist/util/design-system/layout/scaling.d.ts +4 -4
  178. package/dist/util/design-system/layout/scaling.js +97 -97
  179. package/dist/util/design-system/tailwind.d.ts +20 -20
  180. package/dist/util/design-system/tailwind.js +289 -289
  181. package/dist/util/expect/arrays.js +47 -47
  182. package/dist/util/expect/index.js +259 -259
  183. package/dist/util/expect/primitives.js +55 -55
  184. package/dist/util/expect/url.js +60 -60
  185. package/dist/util/function/index.js +218 -218
  186. package/dist/util/http/errors.js +97 -97
  187. package/dist/util/http/headers.js +45 -45
  188. package/dist/util/http/http-request.js +273 -273
  189. package/dist/util/http/index.js +22 -22
  190. package/dist/util/http/json-request.js +143 -143
  191. package/dist/util/http/mocks.js +65 -65
  192. package/dist/util/http/response.js +228 -228
  193. package/dist/util/http/url.js +52 -52
  194. package/dist/util/image/index.js +86 -86
  195. package/dist/util/index.js +2 -2
  196. package/dist/util/is/index.js +140 -140
  197. package/dist/util/iterate/index.js +234 -234
  198. package/dist/util/object/index.js +1361 -1361
  199. package/dist/util/singleton/index.js +97 -97
  200. package/dist/util/string/index.js +184 -184
  201. package/dist/util/svelte/index.js +2 -2
  202. package/dist/util/svelte/observe/index.js +49 -49
  203. package/dist/util/svelte/state-context/index.js +83 -83
  204. package/dist/util/svelte/wait/index.js +38 -38
  205. package/dist/util/sveltekit/index.js +1 -1
  206. package/dist/util/sveltekit/route-folders/index.js +82 -82
  207. package/dist/util/time/index.js +339 -339
  208. package/dist/valibot/date.js__ +10 -10
  209. package/dist/valibot/index.js +9 -9
  210. package/dist/valibot/url.js +95 -95
  211. package/dist/valibot/user.js +23 -23
  212. package/dist/zod/all.js +33 -33
  213. package/dist/zod/generic.js +11 -11
  214. package/dist/zod/javascript.js +32 -32
  215. package/dist/zod/user.js +16 -16
  216. package/dist/zod/web.js +52 -52
  217. package/package.json +99 -99
  218. package/dist/components/icon/HkIcon.svelte.d.ts +0 -10
  219. package/dist/components/icon/HkTabIcon.svelte.d.ts +0 -19
  220. /package/dist/components/{icon → icons}/typedef.d.ts +0 -0
@@ -1,97 +1,97 @@
1
- import { expect } from '../index.js';
2
-
3
- const instancesByNeedle = new Map();
4
-
5
- /**
6
- * Get a singleton instance
7
- * - A class can be supplied to create the singleton instance from
8
- * - The singleton is identified by a needle string
9
- *
10
- * @param {object} _
11
- * @param {any} _.class
12
- * @param {*[]} [_.args] - Constructor arguments
13
- * @param {string} [_.needle]
14
- * If not supplied, a needle will be constructed from the serialized
15
- * constructor arguments (args).
16
- */
17
- export function getInstance({ needle, class: Class, args }) {
18
- expect.class(Class);
19
-
20
- if (!needle) {
21
- // Stringify instance arguments and use it as needle
22
- needle = JSON.stringify(args === undefined ? null : args);
23
- }
24
-
25
- expect.notEmptyString(needle);
26
-
27
- const className = Class.constructor.name;
28
-
29
- // console.log('getInstance()', { needle, args, className });
30
-
31
- needle = `${className}:${needle}`;
32
-
33
- let instance = instancesByNeedle.get(needle);
34
-
35
- if (!instance) {
36
- // console.log('Create new instance');
37
- // @ts-ignore
38
- instance = new Class(...(args ?? []));
39
-
40
- instancesByNeedle.set(needle, instance);
41
- }
42
-
43
- return instance;
44
- }
45
-
46
- /**
47
- * Creates a proxy that instantiates the singleton class upon it's first usage
48
- *
49
- * @template T
50
- *
51
- * @param {object} _
52
- * @param {new() => T} _.class
53
- * @param {*[]} [_.args] - Constructor arguments
54
- *
55
- * @returns {T & {init:()=>null}} proxy
56
- */
57
- export function lazySingleton({ class: Class, args }) {
58
- /** @type {T} */
59
- let singleton;
60
-
61
- /** @type {T & {init:()=>null}} */
62
- // @ts-ignore
63
- const proxy = new Proxy(
64
- // @ts-ignore
65
- {},
66
- {
67
- /**
68
- * @param {T} target
69
- * @param {string} prop
70
- */
71
- // @ts-ignore
72
- get(target, prop) {
73
- // console.log('lazySingleton: get property', prop);
74
-
75
- if (!singleton) {
76
- // @ts-ignore
77
- singleton = new Class(...(args ?? []));
78
- }
79
-
80
- if (prop === 'init') {
81
- // @ts-ignore
82
- if (prop in singleton) {
83
- // The class has an init method itself, return a reference
84
- return singleton[prop];
85
- }
86
-
87
- return () => null;
88
- }
89
-
90
- // @ts-ignore
91
- return singleton[prop];
92
- }
93
- }
94
- );
95
-
96
- return proxy;
97
- }
1
+ import { expect } from '../index.js';
2
+
3
+ const instancesByNeedle = new Map();
4
+
5
+ /**
6
+ * Get a singleton instance
7
+ * - A class can be supplied to create the singleton instance from
8
+ * - The singleton is identified by a needle string
9
+ *
10
+ * @param {object} _
11
+ * @param {any} _.class
12
+ * @param {*[]} [_.args] - Constructor arguments
13
+ * @param {string} [_.needle]
14
+ * If not supplied, a needle will be constructed from the serialized
15
+ * constructor arguments (args).
16
+ */
17
+ export function getInstance({ needle, class: Class, args }) {
18
+ expect.class(Class);
19
+
20
+ if (!needle) {
21
+ // Stringify instance arguments and use it as needle
22
+ needle = JSON.stringify(args === undefined ? null : args);
23
+ }
24
+
25
+ expect.notEmptyString(needle);
26
+
27
+ const className = Class.constructor.name;
28
+
29
+ // console.log('getInstance()', { needle, args, className });
30
+
31
+ needle = `${className}:${needle}`;
32
+
33
+ let instance = instancesByNeedle.get(needle);
34
+
35
+ if (!instance) {
36
+ // console.log('Create new instance');
37
+ // @ts-ignore
38
+ instance = new Class(...(args ?? []));
39
+
40
+ instancesByNeedle.set(needle, instance);
41
+ }
42
+
43
+ return instance;
44
+ }
45
+
46
+ /**
47
+ * Creates a proxy that instantiates the singleton class upon it's first usage
48
+ *
49
+ * @template T
50
+ *
51
+ * @param {object} _
52
+ * @param {new() => T} _.class
53
+ * @param {*[]} [_.args] - Constructor arguments
54
+ *
55
+ * @returns {T & {init:()=>null}} proxy
56
+ */
57
+ export function lazySingleton({ class: Class, args }) {
58
+ /** @type {T} */
59
+ let singleton;
60
+
61
+ /** @type {T & {init:()=>null}} */
62
+ // @ts-ignore
63
+ const proxy = new Proxy(
64
+ // @ts-ignore
65
+ {},
66
+ {
67
+ /**
68
+ * @param {T} target
69
+ * @param {string} prop
70
+ */
71
+ // @ts-ignore
72
+ get(target, prop) {
73
+ // console.log('lazySingleton: get property', prop);
74
+
75
+ if (!singleton) {
76
+ // @ts-ignore
77
+ singleton = new Class(...(args ?? []));
78
+ }
79
+
80
+ if (prop === 'init') {
81
+ // @ts-ignore
82
+ if (prop in singleton) {
83
+ // The class has an init method itself, return a reference
84
+ return singleton[prop];
85
+ }
86
+
87
+ return () => null;
88
+ }
89
+
90
+ // @ts-ignore
91
+ return singleton[prop];
92
+ }
93
+ }
94
+ );
95
+
96
+ return proxy;
97
+ }
@@ -1,184 +1,184 @@
1
- /* ------------------------------------------------------------------ Imports */
2
-
3
- import * as expect from '../expect/index.js';
4
-
5
- import { objectGet, PATH_SEPARATOR } from '../object/index.js';
6
-
7
- import { toArrayPath } from '../array/index.js';
8
-
9
- /* ------------------------------------------------------------------ Exports */
10
-
11
- export const RE_JS_EXPRESSION = /\$\{([^${}]*)\}/g;
12
- export const RE_MUSTACHE = /\{\{([^{}]*)\}\}/g;
13
-
14
- // -----------------------------------------------------------------------------
15
-
16
- /**
17
- * Captizalize the first character of a string
18
- *
19
- * @param {string} str - Input string
20
- *
21
- * @returns {string} string with first letter capitalized
22
- */
23
- export function capitalizeFirst(str) {
24
- if (!str.length) {
25
- return str;
26
- }
27
-
28
- return str.charAt(0).toUpperCase() + str.slice(1);
29
- }
30
-
31
- // -----------------------------------------------------------------------------
32
-
33
- /**
34
- * Interpolate: substitute variables in a string
35
- *
36
- * - Uses mustache template style expression substitution:
37
- * Variables and expressions are surrounded by {{...}}
38
- *
39
- * TODO: full mustache support, see https://github.com/janl/mustache.js
40
- *
41
- * --
42
- *
43
- * @eg const template = `Hello {{name}}`;
44
- *
45
- * --
46
- *
47
- * @param {string} template - Template string to interpolate
48
- * @param {object} templateData - Template data to use for interpolation
49
- *
50
- * @returns {string} interpolated string
51
- */
52
- export function interpolate(template, templateData, expressionRegexp = RE_MUSTACHE) {
53
- expect.string(template, 'Missing or invalid variable [template]');
54
-
55
- expect.object(templateData, 'Missing or invalid variable [templateData]');
56
-
57
- return template.replace(
58
- expressionRegexp,
59
-
60
- (match, expression) => {
61
- const path = toArrayPath(expression);
62
-
63
- const replacement = objectGet(templateData, path, undefined);
64
-
65
- if (
66
- typeof replacement !== 'string' &&
67
- typeof replacement !== 'number' &&
68
- typeof replacement !== 'boolean'
69
- ) {
70
- throw new Error(
71
- 'Failed to interpolate template: Missing or invalid value for ' +
72
- `expression [${expression}] (expected string, number or boolean)`
73
- );
74
- }
75
-
76
- return replacement;
77
- }
78
- );
79
- }
80
-
81
- // -----------------------------------------------------------------------------
82
-
83
- /**
84
- * Remove strange characters from a string and replace whitespace by
85
- * dashes.
86
- *
87
- * @returns {string} string that can be used as uri
88
- */
89
- export function toUriName(str) {
90
- expect.string(str, 'Missing or invalid variable [str]');
91
-
92
- str = str.toLowerCase().replace(/[^a-z0-9]+/gi, '-');
93
-
94
- // TODO: remove duplicate dashes
95
-
96
- return str;
97
- }
98
-
99
- // -----------------------------------------------------------------------------
100
-
101
- /**
102
- * Convert a path string to an array path
103
- * - The path string will be spit at the `pathSeparator` token
104
- * - If the supplied path is already an array, the original array will
105
- * be returned
106
- *
107
- * @param {string|string[]} path
108
- * String or array path (e.g. "some.path.to")
109
- *
110
- * @param {string} [pathSeparator=PATH_SEPARATOR]
111
- * A custom path separator to use instead of the default "."
112
- *
113
- * @returns {string[]} array path (e.g. ["some", "path", "to"])
114
- */
115
- export function toStringPath(path, pathSeparator = PATH_SEPARATOR) {
116
- if (Array.isArray(path)) {
117
- return path.join(pathSeparator);
118
- } else if (typeof path === 'string') {
119
- // path is already a string
120
- return path;
121
- } else {
122
- throw new Error('Missing or invalid parameter [path] (expected string or array)');
123
- }
124
- }
125
-
126
- // -----------------------------------------------------------------------------
127
-
128
- /**
129
- * Prefix a numeric string with 0's
130
- *
131
- * @param {string|number} input
132
- *
133
- * @returns {string}
134
- */
135
- export function padDigits(input, targetLength = 2, padString = '0') {
136
- return ('' + input).padStart(targetLength, padString);
137
- }
138
-
139
- // -----------------------------------------------------------------------------
140
-
141
- /**
142
- * Make sure that the outputted path is an array path
143
- * - The input value may be a array path
144
- * - The input value may be a string path (no conversion needed)
145
- *
146
- * @param {string|string[]} path
147
- *
148
- * @returns {string[]} array path (list of strings)
149
- */
150
- // export function fromPath( path )
151
- // {
152
- // if( typeof path === "string" )
153
- // {
154
- // return path;
155
- // }
156
- // else {
157
- // expect.array( path,
158
- // "Missing or invalid parameter [path] (expected string or string[])" );
159
-
160
- // let strPath = proc.arrayToStringPathWeakMap.get( path );
161
-
162
- // if( strPath )
163
- // {
164
- // // std.debug( "Using cached value", path );
165
- // return strPath;
166
- // }
167
-
168
- // // Check array path
169
- // for( let j = 0, n = path.length; j < n; j = j + 1 )
170
- // {
171
- // if( typeof path[j] !== "string" )
172
- // {
173
- // throw new Error("Invalid array path. Expected array of strings");
174
- // }
175
- // }
176
-
177
- // strPath = path.join("/");
178
-
179
- // proc.safeArrayPathsWeakMap.set( path, true );
180
- // proc.arrayToStringPathWeakMap.set( path, strPath );
181
-
182
- // return strPath;
183
- // }
184
- // }
1
+ /* ------------------------------------------------------------------ Imports */
2
+
3
+ import * as expect from '../expect/index.js';
4
+
5
+ import { objectGet, PATH_SEPARATOR } from '../object/index.js';
6
+
7
+ import { toArrayPath } from '../array/index.js';
8
+
9
+ /* ------------------------------------------------------------------ Exports */
10
+
11
+ export const RE_JS_EXPRESSION = /\$\{([^${}]*)\}/g;
12
+ export const RE_MUSTACHE = /\{\{([^{}]*)\}\}/g;
13
+
14
+ // -----------------------------------------------------------------------------
15
+
16
+ /**
17
+ * Captizalize the first character of a string
18
+ *
19
+ * @param {string} str - Input string
20
+ *
21
+ * @returns {string} string with first letter capitalized
22
+ */
23
+ export function capitalizeFirst(str) {
24
+ if (!str.length) {
25
+ return str;
26
+ }
27
+
28
+ return str.charAt(0).toUpperCase() + str.slice(1);
29
+ }
30
+
31
+ // -----------------------------------------------------------------------------
32
+
33
+ /**
34
+ * Interpolate: substitute variables in a string
35
+ *
36
+ * - Uses mustache template style expression substitution:
37
+ * Variables and expressions are surrounded by {{...}}
38
+ *
39
+ * TODO: full mustache support, see https://github.com/janl/mustache.js
40
+ *
41
+ * --
42
+ *
43
+ * @eg const template = `Hello {{name}}`;
44
+ *
45
+ * --
46
+ *
47
+ * @param {string} template - Template string to interpolate
48
+ * @param {object} templateData - Template data to use for interpolation
49
+ *
50
+ * @returns {string} interpolated string
51
+ */
52
+ export function interpolate(template, templateData, expressionRegexp = RE_MUSTACHE) {
53
+ expect.string(template, 'Missing or invalid variable [template]');
54
+
55
+ expect.object(templateData, 'Missing or invalid variable [templateData]');
56
+
57
+ return template.replace(
58
+ expressionRegexp,
59
+
60
+ (match, expression) => {
61
+ const path = toArrayPath(expression);
62
+
63
+ const replacement = objectGet(templateData, path, undefined);
64
+
65
+ if (
66
+ typeof replacement !== 'string' &&
67
+ typeof replacement !== 'number' &&
68
+ typeof replacement !== 'boolean'
69
+ ) {
70
+ throw new Error(
71
+ 'Failed to interpolate template: Missing or invalid value for ' +
72
+ `expression [${expression}] (expected string, number or boolean)`
73
+ );
74
+ }
75
+
76
+ return replacement;
77
+ }
78
+ );
79
+ }
80
+
81
+ // -----------------------------------------------------------------------------
82
+
83
+ /**
84
+ * Remove strange characters from a string and replace whitespace by
85
+ * dashes.
86
+ *
87
+ * @returns {string} string that can be used as uri
88
+ */
89
+ export function toUriName(str) {
90
+ expect.string(str, 'Missing or invalid variable [str]');
91
+
92
+ str = str.toLowerCase().replace(/[^a-z0-9]+/gi, '-');
93
+
94
+ // TODO: remove duplicate dashes
95
+
96
+ return str;
97
+ }
98
+
99
+ // -----------------------------------------------------------------------------
100
+
101
+ /**
102
+ * Convert a path string to an array path
103
+ * - The path string will be spit at the `pathSeparator` token
104
+ * - If the supplied path is already an array, the original array will
105
+ * be returned
106
+ *
107
+ * @param {string|string[]} path
108
+ * String or array path (e.g. "some.path.to")
109
+ *
110
+ * @param {string} [pathSeparator=PATH_SEPARATOR]
111
+ * A custom path separator to use instead of the default "."
112
+ *
113
+ * @returns {string[]} array path (e.g. ["some", "path", "to"])
114
+ */
115
+ export function toStringPath(path, pathSeparator = PATH_SEPARATOR) {
116
+ if (Array.isArray(path)) {
117
+ return path.join(pathSeparator);
118
+ } else if (typeof path === 'string') {
119
+ // path is already a string
120
+ return path;
121
+ } else {
122
+ throw new Error('Missing or invalid parameter [path] (expected string or array)');
123
+ }
124
+ }
125
+
126
+ // -----------------------------------------------------------------------------
127
+
128
+ /**
129
+ * Prefix a numeric string with 0's
130
+ *
131
+ * @param {string|number} input
132
+ *
133
+ * @returns {string}
134
+ */
135
+ export function padDigits(input, targetLength = 2, padString = '0') {
136
+ return ('' + input).padStart(targetLength, padString);
137
+ }
138
+
139
+ // -----------------------------------------------------------------------------
140
+
141
+ /**
142
+ * Make sure that the outputted path is an array path
143
+ * - The input value may be a array path
144
+ * - The input value may be a string path (no conversion needed)
145
+ *
146
+ * @param {string|string[]} path
147
+ *
148
+ * @returns {string[]} array path (list of strings)
149
+ */
150
+ // export function fromPath( path )
151
+ // {
152
+ // if( typeof path === "string" )
153
+ // {
154
+ // return path;
155
+ // }
156
+ // else {
157
+ // expect.array( path,
158
+ // "Missing or invalid parameter [path] (expected string or string[])" );
159
+
160
+ // let strPath = proc.arrayToStringPathWeakMap.get( path );
161
+
162
+ // if( strPath )
163
+ // {
164
+ // // std.debug( "Using cached value", path );
165
+ // return strPath;
166
+ // }
167
+
168
+ // // Check array path
169
+ // for( let j = 0, n = path.length; j < n; j = j + 1 )
170
+ // {
171
+ // if( typeof path[j] !== "string" )
172
+ // {
173
+ // throw new Error("Invalid array path. Expected array of strings");
174
+ // }
175
+ // }
176
+
177
+ // strPath = path.join("/");
178
+
179
+ // proc.safeArrayPathsWeakMap.set( path, true );
180
+ // proc.arrayToStringPathWeakMap.set( path, strPath );
181
+
182
+ // return strPath;
183
+ // }
184
+ // }
@@ -1,2 +1,2 @@
1
- export * as observe from './observe/index.js';
2
- export * as stateContext from './state-context/index.js';
1
+ export * as observe from './observe/index.js';
2
+ export * as stateContext from './state-context/index.js';
@@ -1,49 +1,49 @@
1
- import { onMount, onDestroy } from 'svelte';
2
-
3
- /**
4
- * @param {function} target
5
- * @param {(entries:ResizeObserverEntry[]) => void} callback
6
- * @param {object} [options]
7
- *
8
- * @returns {{ stop: () => void }}
9
- */
10
- export function useResizeObserver(target, callback, options) {
11
- /** @type {HTMLInputElement} */
12
- let elem;
13
-
14
- /** @type {ResizeObserver|undefined} */
15
- let resizeObserver;
16
-
17
- onMount(() => {
18
- // console.log('useResizeObserver:onMount');
19
-
20
- if (target instanceof HTMLInputElement) {
21
- elem = target;
22
- } else if (typeof target === 'function') {
23
- let output = target();
24
-
25
- // console.log({ output });
26
-
27
- elem = output;
28
- } else {
29
- throw new Error('Invalid value for parameter [target]');
30
- }
31
-
32
- resizeObserver = new ResizeObserver(callback);
33
-
34
- resizeObserver.observe(elem);
35
- });
36
-
37
- onDestroy(() => {
38
- // console.log('useResizeObserver:onDestroy');
39
-
40
- if (resizeObserver) {
41
- resizeObserver.unobserve(elem);
42
- resizeObserver = undefined;
43
- }
44
- });
45
-
46
- return {
47
- stop: () => {}
48
- };
49
- }
1
+ import { onMount, onDestroy } from 'svelte';
2
+
3
+ /**
4
+ * @param {function} target
5
+ * @param {(entries:ResizeObserverEntry[]) => void} callback
6
+ * @param {object} [options]
7
+ *
8
+ * @returns {{ stop: () => void }}
9
+ */
10
+ export function useResizeObserver(target, callback, options) {
11
+ /** @type {HTMLInputElement} */
12
+ let elem;
13
+
14
+ /** @type {ResizeObserver|undefined} */
15
+ let resizeObserver;
16
+
17
+ onMount(() => {
18
+ // console.log('useResizeObserver:onMount');
19
+
20
+ if (target instanceof HTMLInputElement) {
21
+ elem = target;
22
+ } else if (typeof target === 'function') {
23
+ let output = target();
24
+
25
+ // console.log({ output });
26
+
27
+ elem = output;
28
+ } else {
29
+ throw new Error('Invalid value for parameter [target]');
30
+ }
31
+
32
+ resizeObserver = new ResizeObserver(callback);
33
+
34
+ resizeObserver.observe(elem);
35
+ });
36
+
37
+ onDestroy(() => {
38
+ // console.log('useResizeObserver:onDestroy');
39
+
40
+ if (resizeObserver) {
41
+ resizeObserver.unobserve(elem);
42
+ resizeObserver = undefined;
43
+ }
44
+ });
45
+
46
+ return {
47
+ stop: () => {}
48
+ };
49
+ }