@hkdigital/lib-sveltekit 0.1.4 → 0.1.6
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.
- package/README.md +127 -127
- package/dist/classes/data/IterableTree.js +243 -243
- package/dist/classes/data/Selector.js +190 -190
- package/dist/classes/data/index.js +2 -2
- package/dist/classes/index.js +3 -3
- package/dist/classes/promise/HkPromise.js +377 -377
- package/dist/classes/promise/index.js +1 -1
- package/dist/classes/stores/SubscribersCount.js +107 -107
- package/dist/classes/stores/index.js +1 -1
- package/dist/classes/streams/LogTransformStream.js +19 -19
- package/dist/classes/streams/ServerEventsStore.js +110 -110
- package/dist/classes/streams/TimeStampSource.js +26 -26
- package/dist/classes/streams/index.js +3 -3
- package/dist/classes/{svkit → svelte}/audio/AudioLoader.svelte.js +58 -58
- package/dist/classes/{svkit → svelte}/audio/AudioScene.svelte.js +282 -282
- package/dist/classes/{svkit → svelte}/audio/mocks.js +35 -35
- package/dist/classes/{svkit → svelte}/final-state-machine/FiniteStateMachine.svelte.js +133 -133
- package/dist/classes/{svkit → svelte}/final-state-machine/index.js +1 -1
- package/dist/classes/{svkit → svelte}/image/ImageLoader.svelte.js +47 -47
- package/dist/classes/{svkit → svelte}/image/ImageScene.svelte.js +253 -253
- package/dist/classes/{svkit → svelte}/image/ImageVariantsLoader.svelte.js +152 -152
- package/dist/classes/{svkit → svelte}/image/index.js +4 -4
- package/dist/classes/{svkit → svelte}/image/mocks.js +35 -35
- package/dist/classes/{svkit → svelte}/image/typedef.js +8 -8
- package/dist/classes/{svkit → svelte}/loading-state-machine/LoadingStateMachine.svelte.js +109 -109
- package/dist/classes/{svkit → svelte}/loading-state-machine/constants.js +16 -16
- package/dist/classes/{svkit → svelte}/loading-state-machine/index.js +3 -3
- package/dist/classes/{svkit → svelte}/network-loader/NetworkLoader.svelte.js +331 -331
- package/dist/classes/{svkit → svelte}/network-loader/constants.js +3 -3
- package/dist/classes/{svkit → svelte}/network-loader/index.js +3 -3
- package/dist/classes/{svkit → svelte}/network-loader/mocks.js +30 -30
- package/dist/classes/{svkit → svelte}/network-loader/typedef.js +8 -8
- package/dist/components/area/HkArea.svelte +49 -49
- package/dist/components/area/HkArea.svelte.d.ts +0 -14
- package/dist/components/area/HkGridArea.svelte +77 -77
- package/dist/components/area/HkGridArea.svelte.d.ts +0 -22
- package/dist/components/area/index.js +2 -2
- package/dist/components/boxes/game-box/GameBox.svelte +112 -112
- package/dist/components/boxes/game-box/GameBox.svelte.d.ts +0 -15
- package/dist/components/boxes/game-box/gamebox.util.js +83 -83
- package/dist/components/boxes/index.js +2 -2
- package/dist/components/boxes/virtual-viewport/VirtualViewport.svelte +199 -199
- package/dist/components/boxes/virtual-viewport/VirtualViewport.svelte.d.ts +0 -22
- package/dist/components/buttons/button/Button.svelte +75 -75
- package/dist/components/buttons/button/Button.svelte.d.ts +0 -21
- package/dist/components/buttons/button-text/TextButton.svelte +21 -21
- package/dist/components/buttons/button-text/TextButton.svelte.d.ts +0 -7
- package/dist/components/buttons/index.js +2 -2
- package/dist/components/hkdev/blocks/TextBlock.svelte +46 -46
- package/dist/components/hkdev/blocks/TextBlock.svelte.d.ts +0 -13
- package/dist/components/hkdev/buttons/CheckButton.svelte +62 -62
- package/dist/components/hkdev/buttons/CheckButton.svelte.d.ts +0 -18
- package/dist/components/icon/HkIcon.svelte +86 -86
- package/dist/components/icon/HkIcon.svelte.d.ts +0 -12
- package/dist/components/icon/HkTabIcon.svelte +116 -116
- package/dist/components/icon/HkTabIcon.svelte.d.ts +0 -21
- package/dist/components/icon/index.js +4 -4
- package/dist/components/icon/typedef.js +16 -16
- package/dist/components/image/ImageBox.svelte +208 -208
- package/dist/components/image/ImageBox.svelte.d.ts +2 -21
- package/dist/components/image/index.js +5 -5
- package/dist/components/image/typedef.js +32 -32
- package/dist/components/index.js +2 -2
- package/dist/components/inputs/index.js +1 -1
- package/dist/components/inputs/text-input/TestTextInput.svelte__ +102 -102
- package/dist/components/inputs/text-input/TextInput.svelte +226 -226
- package/dist/components/inputs/text-input/TextInput.svelte.d.ts +0 -28
- package/dist/components/inputs/text-input/TextInput.svelte___ +83 -83
- package/dist/components/inputs/text-input/assets/IconInvalid.svelte +14 -14
- package/dist/components/inputs/text-input/assets/IconValid.svelte +12 -12
- package/dist/components/layout/HkAppLayout.state.svelte.js +25 -25
- package/dist/components/layout/HkAppLayout.svelte +251 -251
- package/dist/components/layout/HkAppLayout.svelte.d.ts +0 -11
- package/dist/components/layout/HkGridLayers.svelte +82 -82
- package/dist/components/layout/HkGridLayers.svelte.d.ts +0 -23
- package/dist/components/layout/index.js +9 -9
- package/dist/components/panels/index.js +1 -1
- package/dist/components/panels/plain-panel/PlainPanel.svelte +33 -33
- package/dist/components/panels/plain-panel/PlainPanel.svelte.d.ts +0 -12
- package/dist/components/rows/index.js +3 -3
- package/dist/components/rows/panel-grid-row/PanelGridRow.svelte +104 -104
- package/dist/components/rows/panel-grid-row/PanelGridRow.svelte.d.ts +0 -14
- package/dist/components/rows/panel-row-2/PanelRow2.svelte +40 -40
- package/dist/components/rows/panel-row-2/PanelRow2.svelte.d.ts +0 -14
- package/dist/components/tab-bar/HkTabBar.state.svelte.js +149 -149
- package/dist/components/tab-bar/HkTabBar.svelte +74 -74
- package/dist/components/tab-bar/HkTabBar.svelte.d.ts +0 -18
- package/dist/components/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
- package/dist/components/tab-bar/HkTabBarSelector.svelte +49 -49
- package/dist/components/tab-bar/HkTabBarSelector.svelte.d.ts +0 -19
- package/dist/components/tab-bar/index.js +17 -17
- package/dist/components/tab-bar/typedef.js +8 -8
- package/dist/components/widgets/compare-left-right/CompareLeftRight.svelte +179 -179
- package/dist/components/widgets/compare-left-right/CompareLeftRight.svelte.d.ts +0 -10
- package/dist/components/widgets/compare-left-right/index.js +1 -1
- package/dist/components/widgets/scale-control/index.js +1 -1
- package/dist/config/imagetools-config.js +189 -189
- package/dist/config/imagetools.d.ts +71 -71
- package/dist/config/typedef.js +8 -8
- package/dist/constants/errors/api.js +9 -9
- package/dist/constants/errors/generic.js +5 -5
- package/dist/constants/errors/index.js +3 -3
- package/dist/constants/errors/jwt.js +5 -5
- package/dist/constants/http/headers.js +6 -6
- package/dist/constants/http/index.js +2 -2
- package/dist/constants/http/methods.js +2 -2
- package/dist/constants/index.js +3 -3
- package/dist/constants/mime/application.js +5 -5
- package/dist/constants/mime/audio.js +13 -13
- package/dist/constants/mime/image.js +3 -3
- package/dist/constants/mime/index.js +4 -4
- package/dist/constants/mime/text.js +2 -2
- package/dist/constants/regexp/index.js +31 -31
- package/dist/constants/regexp/inspiratie.js__ +95 -95
- package/dist/constants/regexp/text.js +49 -49
- package/dist/constants/regexp/user.js +32 -32
- package/dist/constants/regexp/web.js +3 -3
- package/dist/constants/state-labels/input-states.js +11 -11
- package/dist/constants/state-labels/submit-states.js +4 -4
- package/dist/constants/time.js +28 -28
- package/dist/css/tw-prose.postcss__ +259 -259
- package/dist/css/utilities.postcss +43 -43
- package/dist/{design-system → design}/design-config.js +73 -73
- package/dist/{design-system → design}/tailwind-theme-extend.d.ts +4 -4
- package/dist/{design-system → design}/tailwind-theme-extend.js +151 -151
- package/dist/schemas/index.js +1 -1
- package/dist/schemas/validate-url.js +180 -180
- package/dist/server/index.js +1 -1
- package/dist/server/logger.js +94 -94
- package/dist/states/index.js +1 -1
- package/dist/states/navigation.svelte.js +55 -55
- package/dist/stores/index.js +1 -1
- package/dist/stores/theme.js +80 -80
- package/dist/themes/hkdev/components/blocks/text-block.postcss +40 -40
- package/dist/themes/hkdev/components/boxes/game-box.postcss +13 -13
- package/dist/themes/hkdev/components/buttons/button-text.postcss +34 -34
- package/dist/themes/hkdev/components/buttons/button.postcss +138 -138
- package/dist/themes/hkdev/components/buttons/skip-button.postcss +8 -8
- package/dist/themes/hkdev/components/inputs/text-input.postcss +108 -108
- package/dist/themes/hkdev/components/panels/plain-panel.postcss +46 -46
- package/dist/themes/hkdev/components/panels/speech-bubble.postcss +52 -52
- package/dist/themes/hkdev/components/rows/panel-grid-row.postcss +7 -7
- package/dist/themes/hkdev/components/rows/panel-row-2.postcss +9 -9
- package/dist/themes/hkdev/components.postcss +55 -55
- package/dist/themes/hkdev/debug.postcss +1 -1
- package/dist/themes/hkdev/global/layout.postcss +39 -39
- package/dist/themes/hkdev/global/on-colors.postcss +53 -53
- package/dist/themes/hkdev/global/text.postcss__ +34 -34
- package/dist/themes/hkdev/global/vars.postcss__ +7 -7
- package/dist/themes/hkdev/globals.postcss +11 -11
- package/dist/themes/hkdev/responsive.postcss +12 -12
- package/dist/themes/hkdev/theme-ext.js +15 -15
- package/dist/themes/hkdev/theme.js +227 -227
- package/dist/themes/index.js +1 -1
- package/dist/util/array/index.js +455 -455
- package/dist/util/compare/index.js +247 -247
- package/dist/util/css/css-vars.js +83 -83
- package/dist/util/css/index.js +1 -1
- package/dist/util/design-system/components/states.js +22 -22
- package/dist/util/design-system/css/clamp.d.ts +2 -2
- package/dist/util/design-system/css/clamp.js +66 -66
- package/dist/util/design-system/css/root-design-vars.js +100 -100
- package/dist/util/design-system/index.js +5 -5
- package/dist/util/design-system/layout/scaling.js +97 -97
- package/dist/util/design-system/tailwind.js +289 -289
- package/dist/util/expect/arrays.js +47 -47
- package/dist/util/expect/index.js +259 -259
- package/dist/util/expect/primitives.js +55 -55
- package/dist/util/expect/url.js +60 -60
- package/dist/util/function/index.js +218 -218
- package/dist/util/http/errors.js +97 -97
- package/dist/util/http/headers.js +45 -45
- package/dist/util/http/http-request.js +273 -273
- package/dist/util/http/index.js +22 -22
- package/dist/util/http/json-request.js +143 -143
- package/dist/util/http/mocks.js +65 -65
- package/dist/util/http/response.js +228 -228
- package/dist/util/http/url.js +52 -52
- package/dist/util/image/index.js +86 -86
- package/dist/util/index.js +2 -2
- package/dist/util/is/index.js +140 -140
- package/dist/util/iterate/index.js +234 -234
- package/dist/util/object/index.js +1361 -1361
- package/dist/util/singleton/index.js +97 -97
- package/dist/util/string/index.js +184 -184
- package/dist/util/svelte/index.js +2 -2
- package/dist/util/svelte/observe/index.js +49 -49
- package/dist/util/svelte/state-context/index.js +83 -83
- package/dist/util/svelte/wait/index.js +38 -38
- package/dist/util/sveltekit/index.js +1 -1
- package/dist/util/sveltekit/route-folders/index.js +82 -82
- package/dist/util/time/index.js +339 -339
- package/dist/valibot/date.js__ +10 -10
- package/dist/valibot/index.js +9 -9
- package/dist/valibot/url.js +95 -95
- package/dist/valibot/user.js +23 -23
- package/dist/zod/all.js +33 -33
- package/dist/zod/generic.js +11 -11
- package/dist/zod/javascript.js +32 -32
- package/dist/zod/user.js +16 -16
- package/dist/zod/web.js +52 -52
- package/package.json +99 -99
- package/dist/themes/hkdev/components/buttons/button.postcss__ +0 -40
- package/dist/themes/hkdev/components/buttons/button.postcss___ +0 -91
- /package/dist/classes/{svkit → svelte}/audio/AudioLoader.svelte.d.ts +0 -0
- /package/dist/classes/{svkit → svelte}/audio/AudioScene.svelte.d.ts +0 -0
- /package/dist/classes/{svkit → svelte}/audio/mocks.d.ts +0 -0
- /package/dist/classes/{svkit → svelte}/final-state-machine/FiniteStateMachine.svelte.d.ts +0 -0
- /package/dist/classes/{svkit → svelte}/final-state-machine/index.d.ts +0 -0
- /package/dist/classes/{svkit → svelte}/image/ImageLoader.svelte.d.ts +0 -0
- /package/dist/classes/{svkit → svelte}/image/ImageScene.svelte.d.ts +0 -0
- /package/dist/classes/{svkit → svelte}/image/ImageVariantsLoader.svelte.d.ts +0 -0
- /package/dist/classes/{svkit → svelte}/image/index.d.ts +0 -0
- /package/dist/classes/{svkit → svelte}/image/mocks.d.ts +0 -0
- /package/dist/classes/{svkit → svelte}/image/typedef.d.ts +0 -0
- /package/dist/classes/{svkit → svelte}/loading-state-machine/LoadingStateMachine.svelte.d.ts +0 -0
- /package/dist/classes/{svkit → svelte}/loading-state-machine/constants.d.ts +0 -0
- /package/dist/classes/{svkit → svelte}/loading-state-machine/index.d.ts +0 -0
- /package/dist/classes/{svkit → svelte}/network-loader/NetworkLoader.svelte.d.ts +0 -0
- /package/dist/classes/{svkit → svelte}/network-loader/constants.d.ts +0 -0
- /package/dist/classes/{svkit → svelte}/network-loader/index.d.ts +0 -0
- /package/dist/classes/{svkit → svelte}/network-loader/mocks.d.ts +0 -0
- /package/dist/classes/{svkit → svelte}/network-loader/typedef.d.ts +0 -0
- /package/dist/{design-system → design}/design-config.d.ts +0 -0
@@ -1,180 +1,180 @@
|
|
1
|
-
// > Imports
|
2
|
-
|
3
|
-
import * as v from 'valibot';
|
4
|
-
// import { UrlOrEmptyString } from '../valibot/url.js';
|
5
|
-
|
6
|
-
const ValidateTrim = v.custom((value) => {
|
7
|
-
if (/^\s|\s$/.test(value)) {
|
8
|
-
throw new Error('Should not start or end with whitespace');
|
9
|
-
}
|
10
|
-
return true;
|
11
|
-
});
|
12
|
-
|
13
|
-
// > Exports
|
14
|
-
|
15
|
-
/**
|
16
|
-
* Schema to validate an URL
|
17
|
-
*/
|
18
|
-
export const ValidateUrl = v.pipe(v.string(), v.url(), ValidateTrim);
|
19
|
-
|
20
|
-
/**
|
21
|
-
* Schema to validate an URL or empty string.
|
22
|
-
*/
|
23
|
-
export const ValidateUrlOrEmptyString = v.union([v.literal(''), v.pipe(v.string(), v.url())]);
|
24
|
-
|
25
|
-
// export const ValidateHumanUrl
|
26
|
-
|
27
|
-
/**
|
28
|
-
* Schema to validate an URL path
|
29
|
-
*/
|
30
|
-
export const ValidateUrlPath = v.pipe(
|
31
|
-
v.string(),
|
32
|
-
ValidateTrim,
|
33
|
-
v.transform((value) => {
|
34
|
-
return {
|
35
|
-
url: new URL(value, 'http://localhost'),
|
36
|
-
value
|
37
|
-
};
|
38
|
-
}),
|
39
|
-
v.custom(({ url }) => {
|
40
|
-
if (url.search) {
|
41
|
-
return false;
|
42
|
-
}
|
43
|
-
return true;
|
44
|
-
}, 'Value should not contain search path'),
|
45
|
-
v.custom(({ url }) => {
|
46
|
-
if (url.hash) {
|
47
|
-
return false;
|
48
|
-
}
|
49
|
-
return true;
|
50
|
-
}, 'Value should not contain hash path'),
|
51
|
-
v.transform(({ url }) => {
|
52
|
-
return url.pathname;
|
53
|
-
})
|
54
|
-
);
|
55
|
-
|
56
|
-
/**
|
57
|
-
* Schema to validate a relative URL
|
58
|
-
*/
|
59
|
-
export const ValidateRelativeUrl = v.pipe(
|
60
|
-
v.string(),
|
61
|
-
ValidateTrim,
|
62
|
-
v.custom((value) => {
|
63
|
-
try {
|
64
|
-
return new URL(value, 'http://localhost');
|
65
|
-
|
66
|
-
// eslint-disable-next-line no-unused-vars
|
67
|
-
} catch (e) {
|
68
|
-
throw new Error('Invalid relative URL');
|
69
|
-
}
|
70
|
-
})
|
71
|
-
);
|
72
|
-
|
73
|
-
export const ValidateAbsOrRelUrl = v.pipe(
|
74
|
-
v.string(),
|
75
|
-
ValidateTrim,
|
76
|
-
v.custom((value) => {
|
77
|
-
try {
|
78
|
-
if (/^https?:\/\//.test(value)) {
|
79
|
-
// Absolute url using protocol http(s)
|
80
|
-
return new URL(value);
|
81
|
-
} else {
|
82
|
-
// Relative URL
|
83
|
-
return new URL(value, 'http://localhost');
|
84
|
-
}
|
85
|
-
|
86
|
-
// eslint-disable-next-line no-unused-vars
|
87
|
-
} catch (e) {
|
88
|
-
throw new Error('Invalid relative URL');
|
89
|
-
}
|
90
|
-
})
|
91
|
-
);
|
92
|
-
|
93
|
-
/**
|
94
|
-
* Schema to validate an url that may miss the protocol part
|
95
|
-
*
|
96
|
-
* @note an empty string is not allowed!
|
97
|
-
*/
|
98
|
-
// export const HumanUrl = v.pipe(
|
99
|
-
// v.custom( ( value ) => {
|
100
|
-
// if( value.includes('://') )
|
101
|
-
// {
|
102
|
-
// v.parse( Url, value );
|
103
|
-
// return true;
|
104
|
-
// }
|
105
|
-
// } )
|
106
|
-
// );
|
107
|
-
|
108
|
-
// // v.transform((value) => {
|
109
|
-
// // if (!value.length || value.includes('://')) {
|
110
|
-
// // return value;
|
111
|
-
// // } else {
|
112
|
-
// // // Prefix 'url' with 'https://'
|
113
|
-
// // return `https://${value}`;
|
114
|
-
// // }
|
115
|
-
// // }),
|
116
|
-
// // v.url()
|
117
|
-
// );
|
118
|
-
|
119
|
-
/**
|
120
|
-
* Schema to validate url path, without a search and hash part
|
121
|
-
*/
|
122
|
-
// export const UrlPath = v.pipe(
|
123
|
-
// v.string(),
|
124
|
-
// v.transform((value) => {
|
125
|
-
// // Convert relative url to URL object
|
126
|
-
// // @note removes ../../ parts
|
127
|
-
// try {
|
128
|
-
// return new URL(value, 'http://localhost');
|
129
|
-
|
130
|
-
// // eslint-disable-next-line no-unused-vars
|
131
|
-
// } catch (e) {
|
132
|
-
// return null;
|
133
|
-
// }
|
134
|
-
// }),
|
135
|
-
// v.custom((urlOrNull) => {
|
136
|
-
// return urlOrNull ? true : false;
|
137
|
-
// }, 'Invalid URL pathname'),
|
138
|
-
// v.transform((url) => {
|
139
|
-
// return url.pathname;
|
140
|
-
// })
|
141
|
-
// );
|
142
|
-
|
143
|
-
/**
|
144
|
-
* Schema to validate a url path, which consists of
|
145
|
-
* a path and optionally search and hash parts
|
146
|
-
*/
|
147
|
-
// export const RelativeUrl = v.pipe(
|
148
|
-
// v.string(),
|
149
|
-
// v.transform((value) => {
|
150
|
-
// // Convert relative url to URL object
|
151
|
-
// // @note removes ../../ parts
|
152
|
-
// try {
|
153
|
-
// return new URL(value, 'http://localhost');
|
154
|
-
|
155
|
-
// // eslint-disable-next-line no-unused-vars
|
156
|
-
// } catch (e) {
|
157
|
-
// return null;
|
158
|
-
// }
|
159
|
-
// }),
|
160
|
-
// v.custom((urlOrNull) => {
|
161
|
-
// return urlOrNull ? true : false;
|
162
|
-
// }, 'Invalid URL pathname or search part'),
|
163
|
-
// v.transform((url) => {
|
164
|
-
// return (
|
165
|
-
// `${url.pathname}` +
|
166
|
-
// `${url.search.length <= 1 ? '' : url.search}` +
|
167
|
-
// `${url.hash.length <= 1 ? '' : url.hash}`
|
168
|
-
// );
|
169
|
-
// })
|
170
|
-
// );
|
171
|
-
|
172
|
-
/**
|
173
|
-
* Schema to validate an absolute or relative url
|
174
|
-
*
|
175
|
-
* @note an empty string is not allowed!
|
176
|
-
*/
|
177
|
-
// export const AbsOrRelUrl = v.union([
|
178
|
-
// v.pipe(v.string(), v.trim(), v.url()),
|
179
|
-
// v.pipe(v.string(), v.nonEmpty(), RelativeUrl)
|
180
|
-
// ]);
|
1
|
+
// > Imports
|
2
|
+
|
3
|
+
import * as v from 'valibot';
|
4
|
+
// import { UrlOrEmptyString } from '../valibot/url.js';
|
5
|
+
|
6
|
+
const ValidateTrim = v.custom((value) => {
|
7
|
+
if (/^\s|\s$/.test(value)) {
|
8
|
+
throw new Error('Should not start or end with whitespace');
|
9
|
+
}
|
10
|
+
return true;
|
11
|
+
});
|
12
|
+
|
13
|
+
// > Exports
|
14
|
+
|
15
|
+
/**
|
16
|
+
* Schema to validate an URL
|
17
|
+
*/
|
18
|
+
export const ValidateUrl = v.pipe(v.string(), v.url(), ValidateTrim);
|
19
|
+
|
20
|
+
/**
|
21
|
+
* Schema to validate an URL or empty string.
|
22
|
+
*/
|
23
|
+
export const ValidateUrlOrEmptyString = v.union([v.literal(''), v.pipe(v.string(), v.url())]);
|
24
|
+
|
25
|
+
// export const ValidateHumanUrl
|
26
|
+
|
27
|
+
/**
|
28
|
+
* Schema to validate an URL path
|
29
|
+
*/
|
30
|
+
export const ValidateUrlPath = v.pipe(
|
31
|
+
v.string(),
|
32
|
+
ValidateTrim,
|
33
|
+
v.transform((value) => {
|
34
|
+
return {
|
35
|
+
url: new URL(value, 'http://localhost'),
|
36
|
+
value
|
37
|
+
};
|
38
|
+
}),
|
39
|
+
v.custom(({ url }) => {
|
40
|
+
if (url.search) {
|
41
|
+
return false;
|
42
|
+
}
|
43
|
+
return true;
|
44
|
+
}, 'Value should not contain search path'),
|
45
|
+
v.custom(({ url }) => {
|
46
|
+
if (url.hash) {
|
47
|
+
return false;
|
48
|
+
}
|
49
|
+
return true;
|
50
|
+
}, 'Value should not contain hash path'),
|
51
|
+
v.transform(({ url }) => {
|
52
|
+
return url.pathname;
|
53
|
+
})
|
54
|
+
);
|
55
|
+
|
56
|
+
/**
|
57
|
+
* Schema to validate a relative URL
|
58
|
+
*/
|
59
|
+
export const ValidateRelativeUrl = v.pipe(
|
60
|
+
v.string(),
|
61
|
+
ValidateTrim,
|
62
|
+
v.custom((value) => {
|
63
|
+
try {
|
64
|
+
return new URL(value, 'http://localhost');
|
65
|
+
|
66
|
+
// eslint-disable-next-line no-unused-vars
|
67
|
+
} catch (e) {
|
68
|
+
throw new Error('Invalid relative URL');
|
69
|
+
}
|
70
|
+
})
|
71
|
+
);
|
72
|
+
|
73
|
+
export const ValidateAbsOrRelUrl = v.pipe(
|
74
|
+
v.string(),
|
75
|
+
ValidateTrim,
|
76
|
+
v.custom((value) => {
|
77
|
+
try {
|
78
|
+
if (/^https?:\/\//.test(value)) {
|
79
|
+
// Absolute url using protocol http(s)
|
80
|
+
return new URL(value);
|
81
|
+
} else {
|
82
|
+
// Relative URL
|
83
|
+
return new URL(value, 'http://localhost');
|
84
|
+
}
|
85
|
+
|
86
|
+
// eslint-disable-next-line no-unused-vars
|
87
|
+
} catch (e) {
|
88
|
+
throw new Error('Invalid relative URL');
|
89
|
+
}
|
90
|
+
})
|
91
|
+
);
|
92
|
+
|
93
|
+
/**
|
94
|
+
* Schema to validate an url that may miss the protocol part
|
95
|
+
*
|
96
|
+
* @note an empty string is not allowed!
|
97
|
+
*/
|
98
|
+
// export const HumanUrl = v.pipe(
|
99
|
+
// v.custom( ( value ) => {
|
100
|
+
// if( value.includes('://') )
|
101
|
+
// {
|
102
|
+
// v.parse( Url, value );
|
103
|
+
// return true;
|
104
|
+
// }
|
105
|
+
// } )
|
106
|
+
// );
|
107
|
+
|
108
|
+
// // v.transform((value) => {
|
109
|
+
// // if (!value.length || value.includes('://')) {
|
110
|
+
// // return value;
|
111
|
+
// // } else {
|
112
|
+
// // // Prefix 'url' with 'https://'
|
113
|
+
// // return `https://${value}`;
|
114
|
+
// // }
|
115
|
+
// // }),
|
116
|
+
// // v.url()
|
117
|
+
// );
|
118
|
+
|
119
|
+
/**
|
120
|
+
* Schema to validate url path, without a search and hash part
|
121
|
+
*/
|
122
|
+
// export const UrlPath = v.pipe(
|
123
|
+
// v.string(),
|
124
|
+
// v.transform((value) => {
|
125
|
+
// // Convert relative url to URL object
|
126
|
+
// // @note removes ../../ parts
|
127
|
+
// try {
|
128
|
+
// return new URL(value, 'http://localhost');
|
129
|
+
|
130
|
+
// // eslint-disable-next-line no-unused-vars
|
131
|
+
// } catch (e) {
|
132
|
+
// return null;
|
133
|
+
// }
|
134
|
+
// }),
|
135
|
+
// v.custom((urlOrNull) => {
|
136
|
+
// return urlOrNull ? true : false;
|
137
|
+
// }, 'Invalid URL pathname'),
|
138
|
+
// v.transform((url) => {
|
139
|
+
// return url.pathname;
|
140
|
+
// })
|
141
|
+
// );
|
142
|
+
|
143
|
+
/**
|
144
|
+
* Schema to validate a url path, which consists of
|
145
|
+
* a path and optionally search and hash parts
|
146
|
+
*/
|
147
|
+
// export const RelativeUrl = v.pipe(
|
148
|
+
// v.string(),
|
149
|
+
// v.transform((value) => {
|
150
|
+
// // Convert relative url to URL object
|
151
|
+
// // @note removes ../../ parts
|
152
|
+
// try {
|
153
|
+
// return new URL(value, 'http://localhost');
|
154
|
+
|
155
|
+
// // eslint-disable-next-line no-unused-vars
|
156
|
+
// } catch (e) {
|
157
|
+
// return null;
|
158
|
+
// }
|
159
|
+
// }),
|
160
|
+
// v.custom((urlOrNull) => {
|
161
|
+
// return urlOrNull ? true : false;
|
162
|
+
// }, 'Invalid URL pathname or search part'),
|
163
|
+
// v.transform((url) => {
|
164
|
+
// return (
|
165
|
+
// `${url.pathname}` +
|
166
|
+
// `${url.search.length <= 1 ? '' : url.search}` +
|
167
|
+
// `${url.hash.length <= 1 ? '' : url.hash}`
|
168
|
+
// );
|
169
|
+
// })
|
170
|
+
// );
|
171
|
+
|
172
|
+
/**
|
173
|
+
* Schema to validate an absolute or relative url
|
174
|
+
*
|
175
|
+
* @note an empty string is not allowed!
|
176
|
+
*/
|
177
|
+
// export const AbsOrRelUrl = v.union([
|
178
|
+
// v.pipe(v.string(), v.trim(), v.url()),
|
179
|
+
// v.pipe(v.string(), v.nonEmpty(), RelativeUrl)
|
180
|
+
// ]);
|
package/dist/server/index.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
export * from './logger.js';
|
1
|
+
export * from './logger.js';
|
package/dist/server/logger.js
CHANGED
@@ -1,94 +1,94 @@
|
|
1
|
-
/**
|
2
|
-
* @example
|
3
|
-
*
|
4
|
-
* import { logger } from './logger.js';
|
5
|
-
*
|
6
|
-
* logger.info('Hello there!');
|
7
|
-
* logger.info( { a: 1, b: 2 }, 'Test vars');
|
8
|
-
*
|
9
|
-
* export function load({ route }) {
|
10
|
-
* logger.context({route}).info('Log');
|
11
|
-
* }
|
12
|
-
*
|
13
|
-
* @note
|
14
|
-
* Set a 'handleError' hook to log errors captured by svelte
|
15
|
-
*
|
16
|
-
* // hooks.server.js
|
17
|
-
* export const handleError = ({ status, error, message }) => {
|
18
|
-
* if (status !== 404) {
|
19
|
-
* logger.error(error);
|
20
|
-
* }
|
21
|
-
*
|
22
|
-
* // do not return sensitive data here as it will be sent to the client
|
23
|
-
* return { message };
|
24
|
-
* };
|
25
|
-
*
|
26
|
-
* @see https://kit.svelte.dev/docs/hooks#shared-hooks-handleerror
|
27
|
-
* @see https://stolthq.com/blog/structured-logging-sveltekit
|
28
|
-
*/
|
29
|
-
|
30
|
-
import pino from 'pino';
|
31
|
-
import { dev } from '$app/environment';
|
32
|
-
|
33
|
-
// import { browser, building, dev, version } from '$app/environment';
|
34
|
-
|
35
|
-
// > Setup
|
36
|
-
|
37
|
-
/** @type {pino.LoggerOptions} */
|
38
|
-
let options = {};
|
39
|
-
|
40
|
-
if (dev) {
|
41
|
-
options = {
|
42
|
-
level: 'debug',
|
43
|
-
transport: {
|
44
|
-
target: 'pino-pretty',
|
45
|
-
options: {
|
46
|
-
colorize: true
|
47
|
-
}
|
48
|
-
}
|
49
|
-
};
|
50
|
-
}
|
51
|
-
|
52
|
-
// > Exports
|
53
|
-
|
54
|
-
// ?? function routeLogger( ... )
|
55
|
-
|
56
|
-
/**
|
57
|
-
* @typedef {object} LoggerContext
|
58
|
-
* @property {{ id: string }} [route]
|
59
|
-
* @property {string} [componentName]
|
60
|
-
*/
|
61
|
-
|
62
|
-
/**
|
63
|
-
* @typedef {pino.Logger & LoggerExtension} ExtendedLogger
|
64
|
-
*/
|
65
|
-
|
66
|
-
/**
|
67
|
-
* @typedef {Object} LoggerExtension
|
68
|
-
* @property {( context: LoggerContext )=> ExtendedLogger} context
|
69
|
-
*/
|
70
|
-
|
71
|
-
/** @type {pino.Logger & LoggerExtension} */
|
72
|
-
// @ts-ignore
|
73
|
-
const logger = pino(options);
|
74
|
-
|
75
|
-
Object.assign(logger, {
|
76
|
-
/**
|
77
|
-
* @param {LoggerContext} _
|
78
|
-
*
|
79
|
-
* @returns {pino.Logger}
|
80
|
-
*/
|
81
|
-
context({ route, componentName }) {
|
82
|
-
if (route) {
|
83
|
-
// @ts-ignore
|
84
|
-
return this.child({ route: route.id });
|
85
|
-
} else if (componentName) {
|
86
|
-
// @ts-ignore
|
87
|
-
return this.child({ componentName });
|
88
|
-
} else {
|
89
|
-
throw new Error(`Missing input parameter`);
|
90
|
-
}
|
91
|
-
}
|
92
|
-
});
|
93
|
-
|
94
|
-
export { logger };
|
1
|
+
/**
|
2
|
+
* @example
|
3
|
+
*
|
4
|
+
* import { logger } from './logger.js';
|
5
|
+
*
|
6
|
+
* logger.info('Hello there!');
|
7
|
+
* logger.info( { a: 1, b: 2 }, 'Test vars');
|
8
|
+
*
|
9
|
+
* export function load({ route }) {
|
10
|
+
* logger.context({route}).info('Log');
|
11
|
+
* }
|
12
|
+
*
|
13
|
+
* @note
|
14
|
+
* Set a 'handleError' hook to log errors captured by svelte
|
15
|
+
*
|
16
|
+
* // hooks.server.js
|
17
|
+
* export const handleError = ({ status, error, message }) => {
|
18
|
+
* if (status !== 404) {
|
19
|
+
* logger.error(error);
|
20
|
+
* }
|
21
|
+
*
|
22
|
+
* // do not return sensitive data here as it will be sent to the client
|
23
|
+
* return { message };
|
24
|
+
* };
|
25
|
+
*
|
26
|
+
* @see https://kit.svelte.dev/docs/hooks#shared-hooks-handleerror
|
27
|
+
* @see https://stolthq.com/blog/structured-logging-sveltekit
|
28
|
+
*/
|
29
|
+
|
30
|
+
import pino from 'pino';
|
31
|
+
import { dev } from '$app/environment';
|
32
|
+
|
33
|
+
// import { browser, building, dev, version } from '$app/environment';
|
34
|
+
|
35
|
+
// > Setup
|
36
|
+
|
37
|
+
/** @type {pino.LoggerOptions} */
|
38
|
+
let options = {};
|
39
|
+
|
40
|
+
if (dev) {
|
41
|
+
options = {
|
42
|
+
level: 'debug',
|
43
|
+
transport: {
|
44
|
+
target: 'pino-pretty',
|
45
|
+
options: {
|
46
|
+
colorize: true
|
47
|
+
}
|
48
|
+
}
|
49
|
+
};
|
50
|
+
}
|
51
|
+
|
52
|
+
// > Exports
|
53
|
+
|
54
|
+
// ?? function routeLogger( ... )
|
55
|
+
|
56
|
+
/**
|
57
|
+
* @typedef {object} LoggerContext
|
58
|
+
* @property {{ id: string }} [route]
|
59
|
+
* @property {string} [componentName]
|
60
|
+
*/
|
61
|
+
|
62
|
+
/**
|
63
|
+
* @typedef {pino.Logger & LoggerExtension} ExtendedLogger
|
64
|
+
*/
|
65
|
+
|
66
|
+
/**
|
67
|
+
* @typedef {Object} LoggerExtension
|
68
|
+
* @property {( context: LoggerContext )=> ExtendedLogger} context
|
69
|
+
*/
|
70
|
+
|
71
|
+
/** @type {pino.Logger & LoggerExtension} */
|
72
|
+
// @ts-ignore
|
73
|
+
const logger = pino(options);
|
74
|
+
|
75
|
+
Object.assign(logger, {
|
76
|
+
/**
|
77
|
+
* @param {LoggerContext} _
|
78
|
+
*
|
79
|
+
* @returns {pino.Logger}
|
80
|
+
*/
|
81
|
+
context({ route, componentName }) {
|
82
|
+
if (route) {
|
83
|
+
// @ts-ignore
|
84
|
+
return this.child({ route: route.id });
|
85
|
+
} else if (componentName) {
|
86
|
+
// @ts-ignore
|
87
|
+
return this.child({ componentName });
|
88
|
+
} else {
|
89
|
+
throw new Error(`Missing input parameter`);
|
90
|
+
}
|
91
|
+
}
|
92
|
+
});
|
93
|
+
|
94
|
+
export { logger };
|
package/dist/states/index.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
export * from './navigation.svelte.js';
|
1
|
+
export * from './navigation.svelte.js';
|
@@ -1,55 +1,55 @@
|
|
1
|
-
import { onMount } from 'svelte';
|
2
|
-
|
3
|
-
import { lazySingleton } from '../util/singleton/index.js';
|
4
|
-
|
5
|
-
import { beforeNavigate, onNavigate, afterNavigate } from '$app/navigation';
|
6
|
-
|
7
|
-
import { page } from '$app/stores';
|
8
|
-
import { get } from 'svelte/store';
|
9
|
-
|
10
|
-
class Navigation {
|
11
|
-
// TODO: complete page type
|
12
|
-
|
13
|
-
/** @type {{ url: { pathname: string } }} */
|
14
|
-
page = $state(get(page));
|
15
|
-
|
16
|
-
/** @type {string} */
|
17
|
-
pathname = $derived(this.page.url.pathname);
|
18
|
-
|
19
|
-
stage = $state.raw({ before: false, navigating: true, after: false });
|
20
|
-
|
21
|
-
constructor() {
|
22
|
-
beforeNavigate(() => {
|
23
|
-
this.stage = { before: true, navigating: false, after: false };
|
24
|
-
});
|
25
|
-
|
26
|
-
onNavigate(() => {
|
27
|
-
this.stage = { before: false, navigating: true, after: false };
|
28
|
-
});
|
29
|
-
|
30
|
-
// onNavigate(async () => {
|
31
|
-
// console.log('onNavigate can be used to perform async page transitions');
|
32
|
-
// return new Promise((resolve) => {
|
33
|
-
// setTimeout(resolve, 1000);
|
34
|
-
// });
|
35
|
-
// });
|
36
|
-
|
37
|
-
afterNavigate(() => {
|
38
|
-
this.stage = { before: false, navigating: false, after: true };
|
39
|
-
});
|
40
|
-
|
41
|
-
onMount(() => {
|
42
|
-
return page.subscribe((value) => {
|
43
|
-
// console.log('***update page url');
|
44
|
-
this.page = value;
|
45
|
-
});
|
46
|
-
});
|
47
|
-
} // end constructor
|
48
|
-
|
49
|
-
init() {}
|
50
|
-
} // end class
|
51
|
-
|
52
|
-
/**
|
53
|
-
* @note call nav.init() during component initialization phase
|
54
|
-
*/
|
55
|
-
export const nav = lazySingleton({ class: Navigation });
|
1
|
+
import { onMount } from 'svelte';
|
2
|
+
|
3
|
+
import { lazySingleton } from '../util/singleton/index.js';
|
4
|
+
|
5
|
+
import { beforeNavigate, onNavigate, afterNavigate } from '$app/navigation';
|
6
|
+
|
7
|
+
import { page } from '$app/stores';
|
8
|
+
import { get } from 'svelte/store';
|
9
|
+
|
10
|
+
class Navigation {
|
11
|
+
// TODO: complete page type
|
12
|
+
|
13
|
+
/** @type {{ url: { pathname: string } }} */
|
14
|
+
page = $state(get(page));
|
15
|
+
|
16
|
+
/** @type {string} */
|
17
|
+
pathname = $derived(this.page.url.pathname);
|
18
|
+
|
19
|
+
stage = $state.raw({ before: false, navigating: true, after: false });
|
20
|
+
|
21
|
+
constructor() {
|
22
|
+
beforeNavigate(() => {
|
23
|
+
this.stage = { before: true, navigating: false, after: false };
|
24
|
+
});
|
25
|
+
|
26
|
+
onNavigate(() => {
|
27
|
+
this.stage = { before: false, navigating: true, after: false };
|
28
|
+
});
|
29
|
+
|
30
|
+
// onNavigate(async () => {
|
31
|
+
// console.log('onNavigate can be used to perform async page transitions');
|
32
|
+
// return new Promise((resolve) => {
|
33
|
+
// setTimeout(resolve, 1000);
|
34
|
+
// });
|
35
|
+
// });
|
36
|
+
|
37
|
+
afterNavigate(() => {
|
38
|
+
this.stage = { before: false, navigating: false, after: true };
|
39
|
+
});
|
40
|
+
|
41
|
+
onMount(() => {
|
42
|
+
return page.subscribe((value) => {
|
43
|
+
// console.log('***update page url');
|
44
|
+
this.page = value;
|
45
|
+
});
|
46
|
+
});
|
47
|
+
} // end constructor
|
48
|
+
|
49
|
+
init() {}
|
50
|
+
} // end class
|
51
|
+
|
52
|
+
/**
|
53
|
+
* @note call nav.init() during component initialization phase
|
54
|
+
*/
|
55
|
+
export const nav = lazySingleton({ class: Navigation });
|
package/dist/stores/index.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
export * as theme from './theme.js';
|
1
|
+
export * as theme from './theme.js';
|