@hkdigital/lib-core 0.3.11 → 0.3.13

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 (293) hide show
  1. package/README.md +173 -149
  2. package/dist/assets/autospuiten/car-paint-picker.js +41 -41
  3. package/dist/assets/autospuiten/labels.js +7 -7
  4. package/dist/classes/data/IterableTree.js +242 -242
  5. package/dist/classes/data/Selector.js +190 -190
  6. package/dist/classes/data/index.js +2 -2
  7. package/dist/classes/data/typedef.js +9 -9
  8. package/dist/classes/event-emitter/EventEmitter.js +273 -273
  9. package/dist/classes/event-emitter/index.js +2 -2
  10. package/dist/classes/index.js +4 -4
  11. package/dist/classes/promise/HkPromise.js +384 -384
  12. package/dist/classes/promise/index.js +1 -1
  13. package/dist/classes/stores/SubscribersCount.js +107 -107
  14. package/dist/classes/stores/index.js +1 -1
  15. package/dist/classes/streams/LogTransformStream.js +19 -19
  16. package/dist/classes/streams/ServerEventsStore.js +111 -111
  17. package/dist/classes/streams/TimeStampSource.js +26 -26
  18. package/dist/classes/streams/index.js +3 -3
  19. package/dist/classes/svelte/finite-state-machine/FiniteStateMachine.svelte.js +133 -133
  20. package/dist/classes/svelte/finite-state-machine/index.js +1 -1
  21. package/dist/classes/svelte/index.js +1 -11
  22. package/dist/classes/svelte/loading-state-machine/LoadingStateMachine.svelte.js +109 -109
  23. package/dist/classes/svelte/loading-state-machine/constants.js +16 -16
  24. package/dist/classes/svelte/loading-state-machine/index.js +3 -3
  25. package/dist/config/README.md +197 -196
  26. package/dist/config/generators/imagetools.js +189 -189
  27. package/dist/config/generators/vite.js +148 -142
  28. package/dist/config/imagetools.d.ts +72 -72
  29. package/dist/config/vite.js +4 -4
  30. package/dist/constants/bases/index.js +13 -13
  31. package/dist/constants/http/headers.js +6 -6
  32. package/dist/constants/http/index.js +2 -2
  33. package/dist/constants/http/methods.js +14 -14
  34. package/dist/constants/index.js +6 -6
  35. package/dist/constants/mime/application.js +5 -5
  36. package/dist/constants/mime/audio.js +13 -13
  37. package/dist/constants/mime/image.js +3 -3
  38. package/dist/constants/mime/index.js +4 -4
  39. package/dist/constants/mime/text.js +2 -2
  40. package/dist/constants/regexp/README.md +96 -95
  41. package/dist/constants/regexp/index.js +31 -31
  42. package/dist/constants/regexp/inspiratie.js__ +95 -95
  43. package/dist/constants/regexp/text.d.ts +4 -4
  44. package/dist/constants/regexp/text.js +49 -49
  45. package/dist/constants/regexp/url.js +3 -3
  46. package/dist/constants/regexp/user.js +29 -29
  47. package/dist/constants/states/drag.js +6 -6
  48. package/dist/constants/states/drop.js +6 -6
  49. package/dist/constants/states/index.js +4 -4
  50. package/dist/constants/states/input.js +11 -11
  51. package/dist/constants/states/submit.js +4 -4
  52. package/dist/constants/time/index.js +28 -28
  53. package/dist/css/utilities.css +43 -43
  54. package/dist/design/README.md +405 -405
  55. package/dist/design/config/design-config.js +73 -73
  56. package/dist/design/generators/index.js +288 -288
  57. package/dist/design/index.js +96 -96
  58. package/dist/design/plugins/skeleton.js +208 -208
  59. package/dist/design/tailwind-theme-extend.js +158 -158
  60. package/dist/design/themes/README.md +102 -102
  61. package/dist/design/themes/hkdev/components/blocks/text-block.css +34 -34
  62. package/dist/design/themes/hkdev/components/boxes/game-box.css +11 -11
  63. package/dist/design/themes/hkdev/components/buttons/button-icon-steeze.css +22 -22
  64. package/dist/design/themes/hkdev/components/buttons/button-text.css +32 -32
  65. package/dist/design/themes/hkdev/components/buttons/button.css +146 -146
  66. package/dist/design/themes/hkdev/components/buttons/skip-button.css +5 -5
  67. package/dist/design/themes/hkdev/components/drag-drop/draggable.css +73 -73
  68. package/dist/design/themes/hkdev/components/drag-drop/drop-zone.css +58 -58
  69. package/dist/design/themes/hkdev/components/icons/icon-steeze.css +15 -15
  70. package/dist/design/themes/hkdev/components/inputs/text-input.css +102 -102
  71. package/dist/design/themes/hkdev/components/panels/panel.css +25 -25
  72. package/dist/design/themes/hkdev/components/rows/panel-grid-row.css +4 -4
  73. package/dist/design/themes/hkdev/components/rows/panel-row-2.css +5 -5
  74. package/dist/design/themes/hkdev/components.css +29 -29
  75. package/dist/design/themes/hkdev/debug.css +1 -1
  76. package/dist/design/themes/hkdev/global/layout.css +32 -32
  77. package/dist/design/themes/hkdev/global/on-colors.css +32 -32
  78. package/dist/design/themes/hkdev/globals.css +3 -3
  79. package/dist/design/themes/hkdev/responsive.css +12 -12
  80. package/dist/design/themes/hkdev/theme-ext.js +12 -12
  81. package/dist/design/themes/hkdev/theme.css +218 -218
  82. package/dist/design/utils/clamp.js +66 -66
  83. package/dist/design/utils/root-vars.js +102 -102
  84. package/dist/design/utils/scaling.js +228 -228
  85. package/dist/design/utils/states.js +22 -22
  86. package/dist/errors/api.js +9 -9
  87. package/dist/errors/generic.js +20 -20
  88. package/dist/errors/http.js +16 -16
  89. package/dist/errors/index.js +5 -5
  90. package/dist/errors/jwt.js +5 -5
  91. package/dist/errors/promise.js +25 -25
  92. package/dist/logging/README.md +158 -0
  93. package/dist/logging/index.d.ts +3 -1
  94. package/dist/logging/index.js +11 -7
  95. package/dist/logging/internal/adapters/console.js +114 -114
  96. package/dist/logging/internal/adapters/index.js +2 -2
  97. package/dist/logging/internal/adapters/pino.js +160 -142
  98. package/dist/logging/internal/adapters/typedef.js +10 -10
  99. package/dist/logging/internal/{unified-logger/constants.js → constants.js} +22 -22
  100. package/dist/logging/internal/factories/client.d.ts +1 -1
  101. package/dist/logging/internal/factories/client.js +21 -21
  102. package/dist/logging/internal/factories/server.d.ts +1 -1
  103. package/dist/logging/internal/factories/server.js +22 -22
  104. package/dist/logging/internal/factories/universal.d.ts +2 -2
  105. package/dist/logging/internal/factories/universal.js +22 -22
  106. package/dist/logging/internal/{unified-logger → logger}/Logger.d.ts +2 -2
  107. package/dist/logging/internal/{unified-logger → logger}/Logger.js +217 -217
  108. package/dist/logging/internal/logger/index.d.ts +1 -0
  109. package/dist/logging/internal/logger/index.js +1 -0
  110. package/dist/logging/internal/{unified-logger/typedef.d.ts → typedef.d.ts} +2 -1
  111. package/dist/logging/internal/{unified-logger/typedef.js → typedef.js} +21 -17
  112. package/dist/network/README.md +172 -172
  113. package/dist/network/cache/IndexedDbCache.js +1407 -1407
  114. package/dist/network/cache/MemoryResponseCache.js +138 -138
  115. package/dist/network/cache/index.js +5 -5
  116. package/dist/network/cache/typedef.js +41 -41
  117. package/dist/network/cache.js +3 -3
  118. package/dist/network/http/caching.js +261 -261
  119. package/dist/network/http/errors.js +97 -97
  120. package/dist/network/http/headers.js +75 -75
  121. package/dist/network/http/http-request.js +578 -578
  122. package/dist/network/http/index.js +22 -22
  123. package/dist/network/http/json-request.js +224 -224
  124. package/dist/network/http/mocks.js +65 -65
  125. package/dist/network/http/response.js +318 -318
  126. package/dist/network/http/test-data__/content-length-test-hkdigital-small.V4HfZyBQ.avif +0 -0
  127. package/dist/network/http/typedef.js +93 -93
  128. package/dist/network/http/url.js +52 -52
  129. package/dist/network/http.js +5 -5
  130. package/dist/network/loaders/README.md +254 -254
  131. package/dist/network/loaders/audio/AudioLoader.svelte.js +58 -58
  132. package/dist/network/loaders/audio/AudioScene.svelte.js +324 -324
  133. package/dist/network/loaders/audio/mocks.js +35 -35
  134. package/dist/network/loaders/audio.js +1 -1
  135. package/dist/network/loaders/image/ImageLoader.svelte.js +44 -44
  136. package/dist/network/loaders/image/ImageScene.svelte.js +248 -248
  137. package/dist/network/loaders/image/ImageVariantsLoader.svelte.js +150 -150
  138. package/dist/network/loaders/image/index.js +4 -4
  139. package/dist/network/loaders/image/mocks.js +35 -35
  140. package/dist/network/loaders/image/typedef.js +8 -8
  141. package/dist/network/loaders/image/utils/index.js +86 -86
  142. package/dist/network/loaders/image.js +7 -7
  143. package/dist/network/loaders/typedef.js +38 -38
  144. package/dist/network/loaders.js +2 -2
  145. package/dist/network/states/NetworkLoader.svelte.js +338 -338
  146. package/dist/network/states/constants.js +3 -3
  147. package/dist/network/states/index.js +3 -3
  148. package/dist/network/states/mocks.js +30 -30
  149. package/dist/network/states/typedef.js +8 -8
  150. package/dist/network/typedef.js +9 -9
  151. package/dist/services/README.md +200 -0
  152. package/dist/services/index.d.ts +6 -1
  153. package/dist/services/index.js +8 -1
  154. package/dist/services/{internal/service-base → service-base}/ServiceBase.d.ts +2 -2
  155. package/dist/services/{internal/service-base → service-base}/ServiceBase.js +462 -462
  156. package/dist/services/{internal/service-base → service-base}/constants.d.ts +0 -12
  157. package/dist/services/{internal/service-base → service-base}/constants.js +98 -110
  158. package/dist/services/{internal/service-base → service-base}/index.js +3 -3
  159. package/dist/services/{internal/service-base → service-base}/typedef.d.ts +1 -1
  160. package/dist/services/{internal/service-base → service-base}/typedef.js +101 -101
  161. package/dist/services/{internal/service-manager → service-manager}/ServiceManager.d.ts +2 -2
  162. package/dist/services/{internal/service-manager → service-manager}/ServiceManager.js +608 -608
  163. package/dist/services/{internal/service-manager → service-manager}/constants.js +6 -6
  164. package/dist/services/{internal/service-manager → service-manager}/typedef.js +90 -90
  165. package/dist/states/index.js +1 -1
  166. package/dist/states/navigation.svelte.js +55 -55
  167. package/dist/stores/index.js +1 -1
  168. package/dist/stores/theme.js +80 -80
  169. package/dist/typedef/context.js +6 -6
  170. package/dist/typedef/drag.js +25 -25
  171. package/dist/typedef/drop.js +12 -12
  172. package/dist/typedef/index.d.ts +1 -0
  173. package/dist/typedef/index.js +4 -4
  174. package/dist/ui/components/button-group/ButtonGroup.svelte +82 -82
  175. package/dist/ui/components/button-group/typedef.js +10 -10
  176. package/dist/ui/components/compare-left-right/CompareLeftRight.svelte +179 -179
  177. package/dist/ui/components/compare-left-right/index.js +1 -1
  178. package/dist/ui/components/game-box/GameBox.svelte +577 -577
  179. package/dist/ui/components/game-box/gamebox.util.js +83 -83
  180. package/dist/ui/components/hk-app-layout/HkAppLayout.state.svelte.js +25 -25
  181. package/dist/ui/components/hk-app-layout/HkAppLayout.svelte +251 -251
  182. package/dist/ui/components/image-box/ImageBox.svelte +210 -210
  183. package/dist/ui/components/image-box/index.js +5 -5
  184. package/dist/ui/components/image-box/typedef.js +32 -32
  185. package/dist/ui/components/index.js +23 -23
  186. package/dist/ui/components/presenter/ImageSlide.svelte +64 -64
  187. package/dist/ui/components/presenter/Presenter.state.svelte.js +638 -638
  188. package/dist/ui/components/presenter/Presenter.svelte +142 -142
  189. package/dist/ui/components/presenter/constants.js +7 -7
  190. package/dist/ui/components/presenter/index.js +10 -10
  191. package/dist/ui/components/presenter/typedef.js +106 -106
  192. package/dist/ui/components/presenter/util.js +210 -210
  193. package/dist/ui/components/virtual-viewport/VirtualViewport.svelte +196 -196
  194. package/dist/ui/primitives/area/HkArea.svelte +49 -49
  195. package/dist/ui/primitives/area/HkGridArea.svelte +77 -77
  196. package/dist/ui/primitives/area/index.js +2 -2
  197. package/dist/ui/primitives/buttons/button/Button.svelte +82 -82
  198. package/dist/ui/primitives/buttons/button-icon-steeze/SteezeIconButton.svelte +30 -30
  199. package/dist/ui/primitives/buttons/button-text/TextButton.svelte +21 -21
  200. package/dist/ui/primitives/buttons/index.js +3 -3
  201. package/dist/ui/primitives/debug/debug-panel-design-scaling/DebugPanelDesignScaling.svelte +146 -146
  202. package/dist/ui/primitives/debug/index.js +1 -1
  203. package/dist/ui/primitives/drag-drop/DragController.js +44 -44
  204. package/dist/ui/primitives/drag-drop/DragDropContext.svelte +111 -111
  205. package/dist/ui/primitives/drag-drop/Draggable.svelte +519 -519
  206. package/dist/ui/primitives/drag-drop/DropZone.svelte +258 -258
  207. package/dist/ui/primitives/drag-drop/DropZoneArea.svelte +119 -119
  208. package/dist/ui/primitives/drag-drop/DropZoneList.svelte +125 -125
  209. package/dist/ui/primitives/drag-drop/actions.js +26 -26
  210. package/dist/ui/primitives/drag-drop/drag-state.svelte.js +322 -322
  211. package/dist/ui/primitives/drag-drop/index.js +7 -7
  212. package/dist/ui/primitives/drag-drop/util.js +85 -85
  213. package/dist/ui/primitives/hkdev/blocks/TextBlock.svelte +46 -46
  214. package/dist/ui/primitives/hkdev/buttons/CheckButton.svelte +62 -62
  215. package/dist/ui/primitives/icons/HkIcon.svelte +86 -86
  216. package/dist/ui/primitives/icons/HkTabIcon.svelte +116 -116
  217. package/dist/ui/primitives/icons/SteezeIcon.svelte +97 -97
  218. package/dist/ui/primitives/icons/index.js +6 -6
  219. package/dist/ui/primitives/icons/typedef.js +16 -16
  220. package/dist/ui/primitives/index.js +2 -2
  221. package/dist/ui/primitives/inputs/index.js +1 -1
  222. package/dist/ui/primitives/inputs/text-input/TestTextInput.svelte__ +102 -0
  223. package/dist/ui/primitives/inputs/text-input/TextInput.svelte +223 -223
  224. package/dist/ui/primitives/inputs/text-input/TextInput.svelte___ +83 -0
  225. package/dist/ui/primitives/inputs/text-input/assets/IconInvalid.svelte +14 -14
  226. package/dist/ui/primitives/inputs/text-input/assets/IconValid.svelte +12 -12
  227. package/dist/ui/primitives/layout/grid-layers/GridLayers.svelte +63 -63
  228. package/dist/ui/primitives/layout/grid-layers/GridLayers.svelte__heightFrom__ +372 -0
  229. package/dist/ui/primitives/layout/grid-layers/util.js +74 -74
  230. package/dist/ui/primitives/layout/index.js +1 -1
  231. package/dist/ui/primitives/panels/index.js +1 -1
  232. package/dist/ui/primitives/panels/panel/Panel.svelte +43 -43
  233. package/dist/ui/primitives/rows/index.js +3 -3
  234. package/dist/ui/primitives/rows/panel-grid-row/PanelGridRow.svelte +104 -104
  235. package/dist/ui/primitives/rows/panel-row-2/PanelRow2.svelte +40 -40
  236. package/dist/ui/primitives/tab-bar/HkTabBar.state.svelte.js +149 -149
  237. package/dist/ui/primitives/tab-bar/HkTabBar.svelte +74 -74
  238. package/dist/ui/primitives/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
  239. package/dist/ui/primitives/tab-bar/HkTabBarSelector.svelte +49 -49
  240. package/dist/ui/primitives/tab-bar/index.js +17 -17
  241. package/dist/ui/primitives/tab-bar/typedef.js +11 -11
  242. package/dist/util/array/index.js +436 -436
  243. package/dist/util/bases/base58.js +262 -262
  244. package/dist/util/bases/index.js +1 -1
  245. package/dist/util/compare/index.js +247 -247
  246. package/dist/util/css/css-vars.js +83 -83
  247. package/dist/util/css/index.js +1 -1
  248. package/dist/util/env/index.js +9 -9
  249. package/dist/util/exceptions/index.d.ts +4 -3
  250. package/dist/util/exceptions/index.js +26 -23
  251. package/dist/util/expect/arrays.js +47 -47
  252. package/dist/util/expect/index.js +259 -259
  253. package/dist/util/expect/primitives.js +55 -55
  254. package/dist/util/expect/url.js +60 -60
  255. package/dist/util/function/index.js +218 -218
  256. package/dist/util/geo/index.js +26 -26
  257. package/dist/util/index.js +7 -7
  258. package/dist/util/is/index.js +147 -147
  259. package/dist/util/iterate/index.js +204 -204
  260. package/dist/util/object/index.js +1345 -1345
  261. package/dist/util/singleton/index.js +97 -97
  262. package/dist/util/string/array-path.js +75 -75
  263. package/dist/util/string/convert.js +54 -54
  264. package/dist/util/string/fs.js +226 -226
  265. package/dist/util/string/index.js +5 -5
  266. package/dist/util/string/interpolate.js +61 -61
  267. package/dist/util/string/pad.js +10 -10
  268. package/dist/util/svelte/index.js +4 -4
  269. package/dist/util/svelte/loading/loading-tracker.svelte.js +108 -108
  270. package/dist/util/svelte/observe/index.js +49 -49
  271. package/dist/util/svelte/state-context/index.js +117 -117
  272. package/dist/util/svelte/wait/index.js +38 -38
  273. package/dist/util/sveltekit/index.js +1 -1
  274. package/dist/util/sveltekit/route-folders/index.js +101 -101
  275. package/dist/util/time/index.js +328 -328
  276. package/dist/util/unique/index.js +231 -231
  277. package/dist/valibot/README.md +61 -50
  278. package/dist/valibot/index.js +8 -8
  279. package/dist/valibot/parsers/date.js__ +10 -0
  280. package/dist/valibot/parsers/email.d.ts +12 -0
  281. package/dist/valibot/parsers/email.js +34 -0
  282. package/dist/valibot/parsers/url.js +110 -110
  283. package/dist/valibot/parsers/user.js +23 -23
  284. package/dist/valibot/parsers.js +3 -3
  285. package/package.json +131 -131
  286. package/dist/logging/internal/unified-logger/index.d.ts +0 -3
  287. package/dist/logging/internal/unified-logger/index.js +0 -6
  288. package/dist/services/internal/index.d.ts +0 -6
  289. package/dist/services/internal/index.js +0 -8
  290. /package/dist/logging/internal/{unified-logger/constants.d.ts → constants.d.ts} +0 -0
  291. /package/dist/services/{internal/service-base → service-base}/index.d.ts +0 -0
  292. /package/dist/services/{internal/service-manager → service-manager}/constants.d.ts +0 -0
  293. /package/dist/services/{internal/service-manager → service-manager}/typedef.d.ts +0 -0
@@ -1,231 +1,231 @@
1
- /**
2
- * unique.js
3
- *
4
- * @description
5
- * This file contains functionality to generate unique data
6
- *
7
- * @example
8
- *
9
- * import { generateLocalId } from './unqiue.js';
10
- *
11
- * async function test()
12
- * {
13
- * console.log( `Id 1 [${generateLocalId()}]` );
14
- * console.log( `Id 2 [${generateLocalId()}]` );
15
- * }
16
- */
17
-
18
- /* ------------------------------------------------------------------ Imports */
19
-
20
- import {
21
- ALPHABET_BASE_HUMAN,
22
- ALPHABET_BASE_58
23
- } from '../../constants/bases/index.js';
24
-
25
- import { base58fromNumber } from '../bases';
26
-
27
- import { TIME_2025_01_01 } from '../../constants/time';
28
-
29
- import { sinceMs } from '../time';
30
-
31
- /**
32
- * @type {{
33
- * bootTimePrefix?:string,
34
- * lastTimeBasedNumber?: number,
35
- * lastTimeBasedValue58?: string,
36
- * lastCountBasedNumber?: number
37
- * }}
38
- */
39
- var vars = {}; /* @note use 'var declaration' for hoisting */
40
-
41
- export const BOOT_STAMP = (Date.now() - TIME_2025_01_01).toString(36);
42
-
43
- /* ------------------------------------------------------------------ Exports */
44
-
45
- /**
46
- * Returns a three character prefix that is calculated at boot
47
- *
48
- * @returns {string} boot time prefix
49
- */
50
- export function bootTimePrefix() {
51
- if (!vars.bootTimePrefix) {
52
- vars.bootTimePrefix = '3' + getTwoChar10ms();
53
- }
54
-
55
- return vars.bootTimePrefix;
56
- }
57
-
58
- /**
59
- * Create a string that contains random characters from the base58 alphabet
60
- *
61
- * @param {number} [length=48]
62
- *
63
- * @returns {string} a base 58 encoded random string
64
- */
65
- export function randomStringBase58(length = 48) {
66
- return randomString(length, ALPHABET_BASE_58);
67
- }
68
-
69
- /**
70
- * Create a string that contains random characters from a for human's not
71
- * ambiguous alphabet
72
- *
73
- * @param {number} [length=48]
74
- *
75
- * @returns {string} a human friendly encoded random string
76
- */
77
- export function randomStringBaseHuman(length = 48) {
78
- return randomString(length, ALPHABET_BASE_HUMAN);
79
- }
80
-
81
- /**
82
- * Create a string that contains random characters from the specified alphabet
83
- *
84
- * @param {number} [length=48]
85
- * @param {string} [ALPHABET=ALPHABET_BASE_58]
86
- *
87
- * @returns {string} a base 58 encoded random string
88
- */
89
- export function randomString(length = 48, ALPHABET = ALPHABET_BASE_58) {
90
- if (typeof length !== 'number' || length < 1) {
91
- throw new Error('Invalid parameter [length]');
92
- }
93
-
94
- if (typeof ALPHABET !== 'string' || !ALPHABET.length) {
95
- throw new Error('Invalid parameter [ALPHABET]');
96
- }
97
-
98
- let str = '';
99
-
100
- const n = ALPHABET.length;
101
-
102
- for (let j = length; j > 0; j = j - 1) {
103
- const num = (n * Math.random()) & -1; // number [0...n-1]
104
- str += ALPHABET[num];
105
- }
106
-
107
- return str;
108
- }
109
-
110
- /**
111
- * Create an access code: a string that contains 48 random characters from the
112
- * base58 alphabet
113
- *
114
- * @returns {string} a base 58 encoded random string of length 48
115
- */
116
- export function randomAccessCode() {
117
- return randomStringBase58(48);
118
- }
119
-
120
- /**
121
- * Generate client session id
122
- *
123
- * @returns {string} a base 58 encoded random string of length 48
124
- */
125
- export function generateClientSessionId() {
126
- return randomStringBase58(48);
127
- }
128
-
129
- /**
130
- * Generates and returns a new unique local id
131
- * - The generated id is garanteed to be unique on the currently running
132
- * local system
133
- *
134
- * @param {number} [timeMs]
135
- * Custom time value to be used instead of Date.now()
136
- *
137
- * @returns {string} local id
138
- */
139
- export function generateLocalId(timeMs) {
140
- const timeBasedNumber = getTimeBasedNumber30s(timeMs);
141
-
142
- let timeBasedValue58;
143
-
144
- let countBasedNumber;
145
-
146
- if (vars.lastTimeBasedNumber !== timeBasedNumber) {
147
- // -- Time stamp based number changed -> reset counter to zero
148
-
149
- countBasedNumber = vars.lastCountBasedNumber = 0;
150
-
151
- // -- Calculate timeBasedValue58 and update cache
152
-
153
- vars.lastTimeBasedNumber = timeBasedNumber;
154
-
155
- // cache string representation
156
- timeBasedValue58 = vars.lastTimeBasedValue58 =
157
- base58fromNumber(timeBasedNumber);
158
- } else {
159
- // -- Same time stamp based number -> increment counter
160
-
161
- countBasedNumber = vars.lastCountBasedNumber =
162
- vars.lastCountBasedNumber + 1;
163
-
164
- // -- Use cached lastTimeBasedNumber
165
-
166
- timeBasedValue58 = vars.lastTimeBasedValue58;
167
- }
168
-
169
- const countBasedValue58 = base58fromNumber(countBasedNumber);
170
-
171
- // Combine parts into single identifier string
172
- //
173
- // @note ALPHABET_BASE_58 is used because it is faster than
174
- // base58fromNumber for single character encoding
175
- //
176
- const id =
177
- // idFormatPrefix
178
- bootTimePrefix() +
179
- ALPHABET_BASE_58[timeBasedValue58.length] +
180
- timeBasedValue58 +
181
- countBasedValue58;
182
-
183
- // std.debug( id );
184
-
185
- return id;
186
- }
187
-
188
- /**
189
- * Returns a time based number that changes every 30 seconds
190
- *
191
- * @param {number} [timeMs=sinceMs()]
192
- * Custom time value to be used instead of sinceMs()
193
- *
194
- * @returns {number} time based numerical that changes every 30 seconds
195
- */
196
- export function getTimeBasedNumber30s(timeMs) {
197
- if (!timeMs) {
198
- timeMs = sinceMs();
199
- }
200
-
201
- // @note do not use bitwise shift since it only works on 32 bit numbers!
202
- return Math.floor(timeMs / 30000);
203
- }
204
-
205
- /**
206
- * Returns two character base58 encoded string that changes every 10
207
- * milliseconds
208
- *
209
- * - The function output changes every 9 milliseconds
210
- * - Returns a two character string
211
- * - The string is base58 encoded
212
- * - After 58 * 58 * 10ms = 33,6 seconds, the function output repeats
213
- *
214
- * @param {number} [timeMs]
215
- * Custom time value to be used instead of Date.now()
216
- *
217
- * @returns {string} time based value
218
- */
219
- export function getTwoChar10ms(timeMs) {
220
- const now = timeMs || Date.now();
221
-
222
- // @note
223
- // do not use bitwise shift since it only works on 32 bit numbers
224
- const num = Math.floor(now / 10) % 3364;
225
-
226
- if (num >= 58) {
227
- return base58fromNumber(num);
228
- } else {
229
- return '1' + base58fromNumber(num);
230
- }
231
- }
1
+ /**
2
+ * unique.js
3
+ *
4
+ * @description
5
+ * This file contains functionality to generate unique data
6
+ *
7
+ * @example
8
+ *
9
+ * import { generateLocalId } from './unqiue.js';
10
+ *
11
+ * async function test()
12
+ * {
13
+ * console.log( `Id 1 [${generateLocalId()}]` );
14
+ * console.log( `Id 2 [${generateLocalId()}]` );
15
+ * }
16
+ */
17
+
18
+ /* ------------------------------------------------------------------ Imports */
19
+
20
+ import {
21
+ ALPHABET_BASE_HUMAN,
22
+ ALPHABET_BASE_58
23
+ } from '../../constants/bases/index.js';
24
+
25
+ import { base58fromNumber } from '../bases';
26
+
27
+ import { TIME_2025_01_01 } from '../../constants/time';
28
+
29
+ import { sinceMs } from '../time';
30
+
31
+ /**
32
+ * @type {{
33
+ * bootTimePrefix?:string,
34
+ * lastTimeBasedNumber?: number,
35
+ * lastTimeBasedValue58?: string,
36
+ * lastCountBasedNumber?: number
37
+ * }}
38
+ */
39
+ var vars = {}; /* @note use 'var declaration' for hoisting */
40
+
41
+ export const BOOT_STAMP = (Date.now() - TIME_2025_01_01).toString(36);
42
+
43
+ /* ------------------------------------------------------------------ Exports */
44
+
45
+ /**
46
+ * Returns a three character prefix that is calculated at boot
47
+ *
48
+ * @returns {string} boot time prefix
49
+ */
50
+ export function bootTimePrefix() {
51
+ if (!vars.bootTimePrefix) {
52
+ vars.bootTimePrefix = '3' + getTwoChar10ms();
53
+ }
54
+
55
+ return vars.bootTimePrefix;
56
+ }
57
+
58
+ /**
59
+ * Create a string that contains random characters from the base58 alphabet
60
+ *
61
+ * @param {number} [length=48]
62
+ *
63
+ * @returns {string} a base 58 encoded random string
64
+ */
65
+ export function randomStringBase58(length = 48) {
66
+ return randomString(length, ALPHABET_BASE_58);
67
+ }
68
+
69
+ /**
70
+ * Create a string that contains random characters from a for human's not
71
+ * ambiguous alphabet
72
+ *
73
+ * @param {number} [length=48]
74
+ *
75
+ * @returns {string} a human friendly encoded random string
76
+ */
77
+ export function randomStringBaseHuman(length = 48) {
78
+ return randomString(length, ALPHABET_BASE_HUMAN);
79
+ }
80
+
81
+ /**
82
+ * Create a string that contains random characters from the specified alphabet
83
+ *
84
+ * @param {number} [length=48]
85
+ * @param {string} [ALPHABET=ALPHABET_BASE_58]
86
+ *
87
+ * @returns {string} a base 58 encoded random string
88
+ */
89
+ export function randomString(length = 48, ALPHABET = ALPHABET_BASE_58) {
90
+ if (typeof length !== 'number' || length < 1) {
91
+ throw new Error('Invalid parameter [length]');
92
+ }
93
+
94
+ if (typeof ALPHABET !== 'string' || !ALPHABET.length) {
95
+ throw new Error('Invalid parameter [ALPHABET]');
96
+ }
97
+
98
+ let str = '';
99
+
100
+ const n = ALPHABET.length;
101
+
102
+ for (let j = length; j > 0; j = j - 1) {
103
+ const num = (n * Math.random()) & -1; // number [0...n-1]
104
+ str += ALPHABET[num];
105
+ }
106
+
107
+ return str;
108
+ }
109
+
110
+ /**
111
+ * Create an access code: a string that contains 48 random characters from the
112
+ * base58 alphabet
113
+ *
114
+ * @returns {string} a base 58 encoded random string of length 48
115
+ */
116
+ export function randomAccessCode() {
117
+ return randomStringBase58(48);
118
+ }
119
+
120
+ /**
121
+ * Generate client session id
122
+ *
123
+ * @returns {string} a base 58 encoded random string of length 48
124
+ */
125
+ export function generateClientSessionId() {
126
+ return randomStringBase58(48);
127
+ }
128
+
129
+ /**
130
+ * Generates and returns a new unique local id
131
+ * - The generated id is garanteed to be unique on the currently running
132
+ * local system
133
+ *
134
+ * @param {number} [timeMs]
135
+ * Custom time value to be used instead of Date.now()
136
+ *
137
+ * @returns {string} local id
138
+ */
139
+ export function generateLocalId(timeMs) {
140
+ const timeBasedNumber = getTimeBasedNumber30s(timeMs);
141
+
142
+ let timeBasedValue58;
143
+
144
+ let countBasedNumber;
145
+
146
+ if (vars.lastTimeBasedNumber !== timeBasedNumber) {
147
+ // -- Time stamp based number changed -> reset counter to zero
148
+
149
+ countBasedNumber = vars.lastCountBasedNumber = 0;
150
+
151
+ // -- Calculate timeBasedValue58 and update cache
152
+
153
+ vars.lastTimeBasedNumber = timeBasedNumber;
154
+
155
+ // cache string representation
156
+ timeBasedValue58 = vars.lastTimeBasedValue58 =
157
+ base58fromNumber(timeBasedNumber);
158
+ } else {
159
+ // -- Same time stamp based number -> increment counter
160
+
161
+ countBasedNumber = vars.lastCountBasedNumber =
162
+ vars.lastCountBasedNumber + 1;
163
+
164
+ // -- Use cached lastTimeBasedNumber
165
+
166
+ timeBasedValue58 = vars.lastTimeBasedValue58;
167
+ }
168
+
169
+ const countBasedValue58 = base58fromNumber(countBasedNumber);
170
+
171
+ // Combine parts into single identifier string
172
+ //
173
+ // @note ALPHABET_BASE_58 is used because it is faster than
174
+ // base58fromNumber for single character encoding
175
+ //
176
+ const id =
177
+ // idFormatPrefix
178
+ bootTimePrefix() +
179
+ ALPHABET_BASE_58[timeBasedValue58.length] +
180
+ timeBasedValue58 +
181
+ countBasedValue58;
182
+
183
+ // std.debug( id );
184
+
185
+ return id;
186
+ }
187
+
188
+ /**
189
+ * Returns a time based number that changes every 30 seconds
190
+ *
191
+ * @param {number} [timeMs=sinceMs()]
192
+ * Custom time value to be used instead of sinceMs()
193
+ *
194
+ * @returns {number} time based numerical that changes every 30 seconds
195
+ */
196
+ export function getTimeBasedNumber30s(timeMs) {
197
+ if (!timeMs) {
198
+ timeMs = sinceMs();
199
+ }
200
+
201
+ // @note do not use bitwise shift since it only works on 32 bit numbers!
202
+ return Math.floor(timeMs / 30000);
203
+ }
204
+
205
+ /**
206
+ * Returns two character base58 encoded string that changes every 10
207
+ * milliseconds
208
+ *
209
+ * - The function output changes every 9 milliseconds
210
+ * - Returns a two character string
211
+ * - The string is base58 encoded
212
+ * - After 58 * 58 * 10ms = 33,6 seconds, the function output repeats
213
+ *
214
+ * @param {number} [timeMs]
215
+ * Custom time value to be used instead of Date.now()
216
+ *
217
+ * @returns {string} time based value
218
+ */
219
+ export function getTwoChar10ms(timeMs) {
220
+ const now = timeMs || Date.now();
221
+
222
+ // @note
223
+ // do not use bitwise shift since it only works on 32 bit numbers
224
+ const num = Math.floor(now / 10) % 3364;
225
+
226
+ if (num >= 58) {
227
+ return base58fromNumber(num);
228
+ } else {
229
+ return '1' + base58fromNumber(num);
230
+ }
231
+ }
@@ -1,50 +1,61 @@
1
- # Valibot Parsers
2
-
3
- Collection of Valibot validation parsers for common data types and formats.
4
-
5
- ## Overview
6
-
7
- This module provides pre-configured Valibot parsers for validating and transforming common data types like URLs and user information.
8
-
9
- ## Parsers
10
-
11
- ### URL Parsers
12
-
13
- - `UrlOrEmptyString` - Validates URL or allows empty string
14
- - `HumanUrl` - Validates URL with automatic `https://` prefix for protocol-less URLs
15
- - `UrlPath` - Extracts and validates URL pathname
16
- - `RelativeUrl` - Validates relative URLs with path, search, and hash
17
- - `AbsOrRelUrl` - Validates absolute or relative URLs
18
-
19
- ### User Parsers
20
-
21
- - `Name` - Validates user names
22
- - `Fullname` - Validates full names
23
- - `Username` - Validates usernames
24
- - `Surname` - Validates surnames
25
- - `PhoneNumber` - Validates phone numbers
26
-
27
- ## Usage
28
-
29
- ```js
30
- import { v, HumanUrl, Name } from '$lib/valibot/index.js';
31
-
32
- // Validates and transforms URL (throws error if invalid)
33
- const result = v.parse(HumanUrl, 'example.com'); // Returns 'https://example.com'
34
-
35
- // Validates name (throws error if invalid)
36
- const nameResult = v.parse(Name, 'John');
37
-
38
- // Use safeParse to avoid exceptions
39
- const safeResult = v.safeParse(HumanUrl, 'invalid-url');
40
- if (safeResult.success) {
41
- console.log(safeResult.output);
42
- } else {
43
- console.log(safeResult.issues); // Array of issue objects
44
- }
45
- ```
46
-
47
- ## References
48
-
49
- - [SafeParseResult API](https://valibot.dev/api/SafeParseResult/)
50
- - [BaseIssue API](https://valibot.dev/api/BaseIssue/)
1
+ # Valibot Parsers
2
+
3
+ Collection of Valibot validation parsers for common data types and formats.
4
+
5
+ ## Overview
6
+
7
+ This module provides pre-configured Valibot parsers for validating and transforming common data types like URLs, emails, and user information.
8
+
9
+ ## Parsers
10
+
11
+ ### URL Parsers
12
+
13
+ - `UrlOrEmptyString` - Validates URL or allows empty string
14
+ - `HumanUrl` - Validates URL with automatic `https://` prefix for protocol-less URLs
15
+ - `UrlPath` - Extracts and validates URL pathname
16
+ - `RelativeUrl` - Validates relative URLs with path, search, and hash
17
+ - `AbsOrRelUrl` - Validates absolute or relative URLs
18
+
19
+ ### Email Parsers
20
+
21
+ - `Email` - Validates email addresses with normalization (trim and lowercase)
22
+ - `LatinEmail` - Validates email addresses with Latin characters only (trim and lowercase)
23
+
24
+ ### User Parsers
25
+
26
+ - `Name` - Validates user names
27
+ - `Fullname` - Validates full names
28
+ - `Username` - Validates usernames
29
+ - `Surname` - Validates surnames
30
+ - `PhoneNumber` - Validates phone numbers
31
+
32
+ ## Usage
33
+
34
+ ```js
35
+ import { v, HumanUrl, Email, LatinEmail, Name } from '$lib/valibot/index.js';
36
+
37
+ // Validates and transforms URL (throws error if invalid)
38
+ const result = v.parse(HumanUrl, 'example.com'); // Returns 'https://example.com'
39
+
40
+ // Validates and normalizes email (throws error if invalid)
41
+ const emailResult = v.parse(Email, ' TEST@Example.COM '); // Returns 'test@example.com'
42
+
43
+ // Validates Latin-only email (throws error if invalid or contains non-Latin chars)
44
+ const latinEmailResult = v.parse(LatinEmail, 'User@Domain.ORG'); // Returns 'user@domain.org'
45
+
46
+ // Validates name (throws error if invalid)
47
+ const nameResult = v.parse(Name, 'John');
48
+
49
+ // Use safeParse to avoid exceptions
50
+ const safeResult = v.safeParse(HumanUrl, 'invalid-url');
51
+ if (safeResult.success) {
52
+ console.log(safeResult.output);
53
+ } else {
54
+ console.log(safeResult.issues); // Array of issue objects
55
+ }
56
+ ```
57
+
58
+ ## References
59
+
60
+ - [SafeParseResult API](https://valibot.dev/api/SafeParseResult/)
61
+ - [BaseIssue API](https://valibot.dev/api/BaseIssue/)
@@ -1,8 +1,8 @@
1
- import * as valibot from 'valibot';
2
-
3
- // export * from './date.js';
4
-
5
- export * from './parsers.js';
6
-
7
- export { valibot as v };
8
- export default valibot;
1
+ import * as valibot from 'valibot';
2
+
3
+ // export * from './date.js';
4
+
5
+ export * from './parsers.js';
6
+
7
+ export { valibot as v };
8
+ export default valibot;
@@ -0,0 +1,10 @@
1
+ // > Imports
2
+
3
+ import * as v from 'valibot';
4
+
5
+ // > Exports
6
+
7
+ /**
8
+ * Schema to validate a Date or ISO timestamp.
9
+ */
10
+ export const DateOrIsoTimeStamp = v.union([v.date(), v.pipe(v.string(), v.isoTimestamp())]);
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Parser for email addresses with normalization.
3
+ * Trims whitespace and converts to lowercase.
4
+ */
5
+ export const Email: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.ToLowerCaseAction, v.EmailAction<string, undefined>]>;
6
+ /**
7
+ * Parser for email addresses with Latin characters only.
8
+ * Trims whitespace, converts to lowercase, and validates email format.
9
+ * Restricts to Latin characters and numbers for international compatibility.
10
+ */
11
+ export const LatinEmail: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.ToLowerCaseAction, v.RegexAction<string, "Email address contains non-Latin characters">, v.EmailAction<string, undefined>]>;
12
+ import * as v from 'valibot';
@@ -0,0 +1,34 @@
1
+ // > Imports
2
+
3
+ import * as v from 'valibot';
4
+
5
+ import { LCHAR_LNUMBER } from '../../constants/regexp/index.js';
6
+
7
+ // > Email Parsers
8
+
9
+ /**
10
+ * Parser for email addresses with normalization.
11
+ * Trims whitespace and converts to lowercase.
12
+ */
13
+ export const Email = v.pipe(
14
+ v.string(),
15
+ v.trim(),
16
+ v.toLowerCase(),
17
+ v.email()
18
+ );
19
+
20
+ /**
21
+ * Parser for email addresses with Latin characters only.
22
+ * Trims whitespace, converts to lowercase, and validates email format.
23
+ * Restricts to Latin characters and numbers for international compatibility.
24
+ */
25
+ export const LatinEmail = v.pipe(
26
+ v.string(),
27
+ v.trim(),
28
+ v.toLowerCase(),
29
+ v.regex(
30
+ new RegExp(`^(?:${LCHAR_LNUMBER}|[\\._%+\\-])+@(?:${LCHAR_LNUMBER}|[.\\-])+\\.(?:${LCHAR_LNUMBER}){2,}$`, 'v'),
31
+ 'Email address contains non-Latin characters'
32
+ ),
33
+ v.email()
34
+ );