@hkdigital/lib-sveltekit 0.1.62 → 0.1.65
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 +135 -135
- package/dist/assets/autospuiten/car-paint-picker.js +41 -41
- package/dist/assets/autospuiten/labels.js +7 -7
- 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 +4 -4
- 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/svelte/audio/AudioLoader.svelte.js +58 -58
- package/dist/classes/svelte/audio/AudioScene.svelte.js +295 -295
- package/dist/classes/svelte/audio/mocks.js +35 -35
- package/dist/classes/svelte/finite-state-machine/FiniteStateMachine.svelte.js +133 -133
- package/dist/classes/svelte/finite-state-machine/index.js +1 -1
- package/dist/classes/svelte/image/ImageLoader.svelte.js +47 -47
- package/dist/classes/svelte/image/ImageScene.svelte.js +253 -253
- package/dist/classes/svelte/image/ImageVariantsLoader.svelte.js +152 -152
- package/dist/classes/svelte/image/index.js +4 -4
- package/dist/classes/svelte/image/mocks.js +35 -35
- package/dist/classes/svelte/image/typedef.js +8 -8
- package/dist/classes/svelte/index.js +14 -14
- package/dist/classes/svelte/loading-state-machine/LoadingStateMachine.svelte.js +109 -109
- package/dist/classes/svelte/loading-state-machine/constants.js +16 -16
- package/dist/classes/svelte/loading-state-machine/index.js +3 -3
- package/dist/classes/svelte/network-loader/NetworkLoader.svelte.js +331 -331
- package/dist/classes/svelte/network-loader/constants.js +3 -3
- package/dist/classes/svelte/network-loader/index.js +3 -3
- package/dist/classes/svelte/network-loader/mocks.js +30 -30
- package/dist/classes/svelte/network-loader/typedef.js +8 -8
- package/dist/components/area/HkArea.svelte +49 -49
- package/dist/components/area/HkGridArea.svelte +77 -77
- package/dist/components/area/index.js +2 -2
- package/dist/components/buttons/button/Button.svelte +82 -82
- package/dist/components/buttons/button-icon-steeze/SteezeIconButton.svelte +30 -30
- package/dist/components/buttons/button-text/TextButton.svelte +21 -21
- package/dist/components/buttons/index.js +3 -3
- package/dist/components/debug/debug-panel-design-scaling/DebugPanelDesignScaling.svelte +146 -146
- package/dist/components/debug/index.js +1 -1
- package/dist/components/hkdev/blocks/TextBlock.svelte +46 -46
- package/dist/components/hkdev/buttons/CheckButton.svelte +62 -62
- package/dist/components/icons/HkIcon.svelte +86 -86
- package/dist/components/icons/HkTabIcon.svelte +116 -116
- package/dist/components/icons/SteezeIcon.svelte +97 -97
- package/dist/components/icons/index.js +6 -6
- package/dist/components/icons/typedef.js +16 -16
- 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 +223 -223
- 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/grid-layers/GridLayers.svelte +167 -167
- package/dist/components/layout/index.js +1 -1
- package/dist/components/panels/index.js +1 -1
- package/dist/components/panels/panel/Panel.svelte +43 -43
- package/dist/components/rows/index.js +3 -3
- package/dist/components/rows/panel-grid-row/PanelGridRow.svelte +104 -104
- package/dist/components/rows/panel-row-2/PanelRow2.svelte +40 -40
- 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/HkTabBarSelector.state.svelte.js +93 -93
- package/dist/components/tab-bar/HkTabBarSelector.svelte +49 -49
- package/dist/components/tab-bar/index.js +17 -17
- package/dist/components/tab-bar/typedef.js +8 -8
- 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/bases.js +13 -13
- 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/utilities.css +43 -43
- package/dist/design/design-config.js +73 -73
- package/dist/design/tailwind-theme-extend.js +158 -158
- 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.css +41 -41
- package/dist/themes/hkdev/components/boxes/game-box.css +12 -12
- package/dist/themes/hkdev/components/buttons/button-icon-steeze.css +22 -22
- package/dist/themes/hkdev/components/buttons/button-text.css +32 -32
- package/dist/themes/hkdev/components/buttons/button.css +142 -142
- package/dist/themes/hkdev/components/buttons/skip-button.css +6 -6
- package/dist/themes/hkdev/components/icons/icon-steeze.css +22 -22
- package/dist/themes/hkdev/components/inputs/text-input.css +104 -104
- package/dist/themes/hkdev/components/panels/panel.css +27 -27
- package/dist/themes/hkdev/components/rows/panel-grid-row.css +6 -6
- package/dist/themes/hkdev/components/rows/panel-row-2.css +7 -7
- package/dist/themes/hkdev/components.css +47 -47
- package/dist/themes/hkdev/debug.css +1 -1
- package/dist/themes/hkdev/global/layout.css +39 -39
- package/dist/themes/hkdev/global/on-colors.css +53 -53
- package/dist/themes/hkdev/globals.css +11 -11
- package/dist/themes/hkdev/responsive.css +12 -12
- package/dist/themes/hkdev/theme-ext.js +15 -15
- package/dist/themes/hkdev/theme.js +235 -235
- package/dist/themes/index.js +1 -1
- package/dist/util/array/index.js +455 -455
- package/dist/util/bases/base58.js +262 -262
- package/dist/util/bases/index.js +1 -1
- 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.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 +228 -228
- package/dist/util/design-system/skeleton.js +208 -208
- package/dist/util/design-system/tailwind.js +288 -288
- 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 +294 -294
- 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 +241 -241
- package/dist/util/http/test-data__/content-length-test-hkdigital-small.V4HfZyBQ.avif +0 -0
- 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/array-path.js +75 -75
- package/dist/util/string/convert.js +54 -54
- package/dist/util/string/fs.js +226 -226
- package/dist/util/string/index.js +5 -5
- package/dist/util/string/interpolate.js +61 -61
- package/dist/util/string/pad.js +10 -10
- package/dist/util/svelte/index.js +4 -4
- package/dist/util/svelte/loading/loading-tracker.svelte.js +108 -108
- 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 +101 -101
- package/dist/util/time/index.js +323 -323
- package/dist/util/unique/index.js +249 -249
- 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/widgets/button-group/ButtonGroup.svelte +82 -94
- package/dist/widgets/button-group/ButtonGroup.svelte.d.ts +0 -2
- package/dist/widgets/button-group/typedef.js +10 -10
- package/dist/widgets/compare-left-right/CompareLeftRight.svelte +179 -179
- package/dist/widgets/compare-left-right/index.js +1 -1
- package/dist/widgets/game-box/GameBox.svelte +579 -186
- package/dist/widgets/game-box/GameBox.svelte.d.ts +64 -4
- package/dist/widgets/game-box/gamebox.util.js +83 -83
- package/dist/widgets/hk-app-layout/HkAppLayout.state.svelte.js +25 -25
- package/dist/widgets/hk-app-layout/HkAppLayout.svelte +251 -251
- package/dist/widgets/image-box/ImageBox.svelte +212 -212
- package/dist/widgets/image-box/index.js +5 -5
- package/dist/widgets/image-box/typedef.js +32 -32
- package/dist/widgets/index.js +23 -23
- package/dist/widgets/presenter/(broken) Presenter.state.svelte.js__ +613 -0
- package/dist/widgets/presenter/ImageSlide.svelte +64 -64
- package/dist/widgets/presenter/Presenter.state.svelte.js +636 -636
- package/dist/widgets/presenter/Presenter.svelte +140 -140
- package/dist/widgets/presenter/Presenter.svelte__ +125 -0
- package/dist/widgets/presenter/constants.js +7 -7
- package/dist/widgets/presenter/index.js +10 -10
- package/dist/widgets/presenter/typedef.js +106 -106
- package/dist/widgets/presenter/util.js +210 -210
- package/dist/widgets/virtual-viewport/VirtualViewport.svelte +196 -196
- 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 +102 -102
package/dist/util/string/fs.js
CHANGED
@@ -1,226 +1,226 @@
|
|
1
|
-
/**
|
2
|
-
* Path utilities for working with file and directory paths.
|
3
|
-
* Provides functions similar to Node.js path module but for browser and SvelteKit use.
|
4
|
-
*/
|
5
|
-
|
6
|
-
/**
|
7
|
-
* Extracts the filename from a path, with or without extension.
|
8
|
-
*
|
9
|
-
* @param {string} path - The path to extract the filename from
|
10
|
-
* @param {boolean} [includeExtension=true] - Whether to include the extension
|
11
|
-
* @return {string} The extracted filename
|
12
|
-
*/
|
13
|
-
export function basename(path, includeExtension = true) {
|
14
|
-
if (typeof path !== 'string') {
|
15
|
-
throw new Error('Path must be a string');
|
16
|
-
}
|
17
|
-
|
18
|
-
// Handle empty string
|
19
|
-
if (path === '') {
|
20
|
-
return '';
|
21
|
-
}
|
22
|
-
|
23
|
-
// Remove trailing slashes
|
24
|
-
path = path.replace(/\/+$/, '');
|
25
|
-
|
26
|
-
// Find the last occurrence of '/'
|
27
|
-
const lastSlashIndex = path.lastIndexOf('/');
|
28
|
-
|
29
|
-
// Get the full filename
|
30
|
-
const filename =
|
31
|
-
lastSlashIndex === -1 ? path : path.substring(lastSlashIndex + 1);
|
32
|
-
|
33
|
-
// Return the full filename if extension should be included
|
34
|
-
if (includeExtension) {
|
35
|
-
return filename;
|
36
|
-
}
|
37
|
-
|
38
|
-
// Otherwise, remove the extension
|
39
|
-
const lastDotIndex = filename.lastIndexOf('.');
|
40
|
-
|
41
|
-
// If no dot is found or dot is the first character (hidden file), return the filename
|
42
|
-
if (lastDotIndex <= 0) {
|
43
|
-
return filename;
|
44
|
-
}
|
45
|
-
|
46
|
-
// Return everything before the last dot
|
47
|
-
return filename.substring(0, lastDotIndex);
|
48
|
-
}
|
49
|
-
|
50
|
-
/**
|
51
|
-
* Extracts the extension from a filename.
|
52
|
-
*
|
53
|
-
* @param {string} path - The path to extract the extension from
|
54
|
-
* @param {boolean} [includeDot=false] - Whether to include the dot in the extension
|
55
|
-
* @return {string} The extracted extension
|
56
|
-
*/
|
57
|
-
export function extname(path, includeDot = false) {
|
58
|
-
if (typeof path !== 'string') {
|
59
|
-
throw new Error('Path must be a string');
|
60
|
-
}
|
61
|
-
|
62
|
-
const filename = basename(path);
|
63
|
-
const lastDotIndex = filename.lastIndexOf('.');
|
64
|
-
|
65
|
-
// If no dot is found or dot is the first character (hidden file), return empty string
|
66
|
-
if (lastDotIndex <= 0) {
|
67
|
-
return '';
|
68
|
-
}
|
69
|
-
|
70
|
-
// Return the extension with or without the dot
|
71
|
-
return includeDot
|
72
|
-
? filename.substring(lastDotIndex)
|
73
|
-
: filename.substring(lastDotIndex + 1);
|
74
|
-
}
|
75
|
-
|
76
|
-
/**
|
77
|
-
* Extracts the directory name from a path.
|
78
|
-
*
|
79
|
-
* @param {string} path - The path to extract the directory name from
|
80
|
-
* @return {string} The extracted directory name
|
81
|
-
*/
|
82
|
-
export function dirname(path) {
|
83
|
-
if (typeof path !== 'string') {
|
84
|
-
throw new Error('Path must be a string');
|
85
|
-
}
|
86
|
-
|
87
|
-
// Handle empty string
|
88
|
-
if (path === '') {
|
89
|
-
return '.';
|
90
|
-
}
|
91
|
-
|
92
|
-
// Remove trailing slashes
|
93
|
-
path = path.replace(/\/+$/, '');
|
94
|
-
|
95
|
-
// Find the last occurrence of '/'
|
96
|
-
const lastSlashIndex = path.lastIndexOf('/');
|
97
|
-
|
98
|
-
// If no slash is found, return '.'
|
99
|
-
if (lastSlashIndex === -1) {
|
100
|
-
return '.';
|
101
|
-
}
|
102
|
-
|
103
|
-
// If slash is at the beginning, return '/'
|
104
|
-
if (lastSlashIndex === 0) {
|
105
|
-
return '/';
|
106
|
-
}
|
107
|
-
|
108
|
-
// Return everything before the last slash
|
109
|
-
return path.substring(0, lastSlashIndex);
|
110
|
-
}
|
111
|
-
|
112
|
-
/**
|
113
|
-
* Joins path segments with the appropriate separator.
|
114
|
-
*
|
115
|
-
* @param {...string} paths - The path segments to join
|
116
|
-
* @return {string} The joined path
|
117
|
-
*/
|
118
|
-
export function join(...paths) {
|
119
|
-
if (paths.length === 0) {
|
120
|
-
return '.';
|
121
|
-
}
|
122
|
-
|
123
|
-
return paths
|
124
|
-
.filter((segment) => typeof segment === 'string' && segment !== '')
|
125
|
-
.join('/')
|
126
|
-
.replace(/\/+/g, '/'); // Replace multiple consecutive slashes with a single one
|
127
|
-
}
|
128
|
-
|
129
|
-
/**
|
130
|
-
* Normalizes a path by resolving '..' and '.' segments.
|
131
|
-
*
|
132
|
-
* @param {string} path - The path to normalize
|
133
|
-
* @return {string} The normalized path
|
134
|
-
*/
|
135
|
-
export function normalize(path) {
|
136
|
-
if (typeof path !== 'string') {
|
137
|
-
throw new Error('Path must be a string');
|
138
|
-
}
|
139
|
-
|
140
|
-
// Replace backslashes with forward slashes
|
141
|
-
path = path.replace(/\\/g, '/');
|
142
|
-
|
143
|
-
// Handle empty string
|
144
|
-
if (path === '') {
|
145
|
-
return '.';
|
146
|
-
}
|
147
|
-
|
148
|
-
const isAbsolute = path.startsWith('/');
|
149
|
-
const trailingSlash = path.endsWith('/');
|
150
|
-
|
151
|
-
// Split path into segments
|
152
|
-
const segments = path.split('/').filter(Boolean);
|
153
|
-
const resultSegments = [];
|
154
|
-
|
155
|
-
for (const segment of segments) {
|
156
|
-
if (segment === '.') {
|
157
|
-
// Ignore current directory marker
|
158
|
-
continue;
|
159
|
-
} else if (segment === '..') {
|
160
|
-
// Go up one directory
|
161
|
-
if (
|
162
|
-
resultSegments.length > 0 &&
|
163
|
-
resultSegments[resultSegments.length - 1] !== '..'
|
164
|
-
) {
|
165
|
-
resultSegments.pop();
|
166
|
-
} else if (!isAbsolute) {
|
167
|
-
resultSegments.push('..');
|
168
|
-
}
|
169
|
-
} else {
|
170
|
-
// Add segment to result
|
171
|
-
resultSegments.push(segment);
|
172
|
-
}
|
173
|
-
}
|
174
|
-
|
175
|
-
// Handle empty result
|
176
|
-
if (resultSegments.length === 0) {
|
177
|
-
return isAbsolute ? '/' : '.';
|
178
|
-
}
|
179
|
-
|
180
|
-
// Join segments
|
181
|
-
let result = resultSegments.join('/');
|
182
|
-
|
183
|
-
// Add leading slash for absolute paths
|
184
|
-
if (isAbsolute) {
|
185
|
-
result = '/' + result;
|
186
|
-
}
|
187
|
-
|
188
|
-
// Add trailing slash if original path had one
|
189
|
-
if (trailingSlash && !result.endsWith('/')) {
|
190
|
-
result += '/';
|
191
|
-
}
|
192
|
-
|
193
|
-
return result;
|
194
|
-
}
|
195
|
-
|
196
|
-
/**
|
197
|
-
* Checks if a path is absolute.
|
198
|
-
*
|
199
|
-
* @param {string} path - The path to check
|
200
|
-
* @return {boolean} Whether the path is absolute
|
201
|
-
*/
|
202
|
-
export function isAbsolute(path) {
|
203
|
-
if (typeof path !== 'string') {
|
204
|
-
throw new Error('Path must be a string');
|
205
|
-
}
|
206
|
-
|
207
|
-
return path.startsWith('/');
|
208
|
-
}
|
209
|
-
|
210
|
-
/**
|
211
|
-
* Returns the path segments as an array.
|
212
|
-
*
|
213
|
-
* @param {string} path - The path to split
|
214
|
-
* @return {string[]} The path segments
|
215
|
-
*/
|
216
|
-
export function segments(path) {
|
217
|
-
if (typeof path !== 'string') {
|
218
|
-
throw new Error('Path must be a string');
|
219
|
-
}
|
220
|
-
|
221
|
-
// Normalize path first
|
222
|
-
const normalizedPath = normalize(path);
|
223
|
-
|
224
|
-
// Split path into segments
|
225
|
-
return normalizedPath.split('/').filter(Boolean);
|
226
|
-
}
|
1
|
+
/**
|
2
|
+
* Path utilities for working with file and directory paths.
|
3
|
+
* Provides functions similar to Node.js path module but for browser and SvelteKit use.
|
4
|
+
*/
|
5
|
+
|
6
|
+
/**
|
7
|
+
* Extracts the filename from a path, with or without extension.
|
8
|
+
*
|
9
|
+
* @param {string} path - The path to extract the filename from
|
10
|
+
* @param {boolean} [includeExtension=true] - Whether to include the extension
|
11
|
+
* @return {string} The extracted filename
|
12
|
+
*/
|
13
|
+
export function basename(path, includeExtension = true) {
|
14
|
+
if (typeof path !== 'string') {
|
15
|
+
throw new Error('Path must be a string');
|
16
|
+
}
|
17
|
+
|
18
|
+
// Handle empty string
|
19
|
+
if (path === '') {
|
20
|
+
return '';
|
21
|
+
}
|
22
|
+
|
23
|
+
// Remove trailing slashes
|
24
|
+
path = path.replace(/\/+$/, '');
|
25
|
+
|
26
|
+
// Find the last occurrence of '/'
|
27
|
+
const lastSlashIndex = path.lastIndexOf('/');
|
28
|
+
|
29
|
+
// Get the full filename
|
30
|
+
const filename =
|
31
|
+
lastSlashIndex === -1 ? path : path.substring(lastSlashIndex + 1);
|
32
|
+
|
33
|
+
// Return the full filename if extension should be included
|
34
|
+
if (includeExtension) {
|
35
|
+
return filename;
|
36
|
+
}
|
37
|
+
|
38
|
+
// Otherwise, remove the extension
|
39
|
+
const lastDotIndex = filename.lastIndexOf('.');
|
40
|
+
|
41
|
+
// If no dot is found or dot is the first character (hidden file), return the filename
|
42
|
+
if (lastDotIndex <= 0) {
|
43
|
+
return filename;
|
44
|
+
}
|
45
|
+
|
46
|
+
// Return everything before the last dot
|
47
|
+
return filename.substring(0, lastDotIndex);
|
48
|
+
}
|
49
|
+
|
50
|
+
/**
|
51
|
+
* Extracts the extension from a filename.
|
52
|
+
*
|
53
|
+
* @param {string} path - The path to extract the extension from
|
54
|
+
* @param {boolean} [includeDot=false] - Whether to include the dot in the extension
|
55
|
+
* @return {string} The extracted extension
|
56
|
+
*/
|
57
|
+
export function extname(path, includeDot = false) {
|
58
|
+
if (typeof path !== 'string') {
|
59
|
+
throw new Error('Path must be a string');
|
60
|
+
}
|
61
|
+
|
62
|
+
const filename = basename(path);
|
63
|
+
const lastDotIndex = filename.lastIndexOf('.');
|
64
|
+
|
65
|
+
// If no dot is found or dot is the first character (hidden file), return empty string
|
66
|
+
if (lastDotIndex <= 0) {
|
67
|
+
return '';
|
68
|
+
}
|
69
|
+
|
70
|
+
// Return the extension with or without the dot
|
71
|
+
return includeDot
|
72
|
+
? filename.substring(lastDotIndex)
|
73
|
+
: filename.substring(lastDotIndex + 1);
|
74
|
+
}
|
75
|
+
|
76
|
+
/**
|
77
|
+
* Extracts the directory name from a path.
|
78
|
+
*
|
79
|
+
* @param {string} path - The path to extract the directory name from
|
80
|
+
* @return {string} The extracted directory name
|
81
|
+
*/
|
82
|
+
export function dirname(path) {
|
83
|
+
if (typeof path !== 'string') {
|
84
|
+
throw new Error('Path must be a string');
|
85
|
+
}
|
86
|
+
|
87
|
+
// Handle empty string
|
88
|
+
if (path === '') {
|
89
|
+
return '.';
|
90
|
+
}
|
91
|
+
|
92
|
+
// Remove trailing slashes
|
93
|
+
path = path.replace(/\/+$/, '');
|
94
|
+
|
95
|
+
// Find the last occurrence of '/'
|
96
|
+
const lastSlashIndex = path.lastIndexOf('/');
|
97
|
+
|
98
|
+
// If no slash is found, return '.'
|
99
|
+
if (lastSlashIndex === -1) {
|
100
|
+
return '.';
|
101
|
+
}
|
102
|
+
|
103
|
+
// If slash is at the beginning, return '/'
|
104
|
+
if (lastSlashIndex === 0) {
|
105
|
+
return '/';
|
106
|
+
}
|
107
|
+
|
108
|
+
// Return everything before the last slash
|
109
|
+
return path.substring(0, lastSlashIndex);
|
110
|
+
}
|
111
|
+
|
112
|
+
/**
|
113
|
+
* Joins path segments with the appropriate separator.
|
114
|
+
*
|
115
|
+
* @param {...string} paths - The path segments to join
|
116
|
+
* @return {string} The joined path
|
117
|
+
*/
|
118
|
+
export function join(...paths) {
|
119
|
+
if (paths.length === 0) {
|
120
|
+
return '.';
|
121
|
+
}
|
122
|
+
|
123
|
+
return paths
|
124
|
+
.filter((segment) => typeof segment === 'string' && segment !== '')
|
125
|
+
.join('/')
|
126
|
+
.replace(/\/+/g, '/'); // Replace multiple consecutive slashes with a single one
|
127
|
+
}
|
128
|
+
|
129
|
+
/**
|
130
|
+
* Normalizes a path by resolving '..' and '.' segments.
|
131
|
+
*
|
132
|
+
* @param {string} path - The path to normalize
|
133
|
+
* @return {string} The normalized path
|
134
|
+
*/
|
135
|
+
export function normalize(path) {
|
136
|
+
if (typeof path !== 'string') {
|
137
|
+
throw new Error('Path must be a string');
|
138
|
+
}
|
139
|
+
|
140
|
+
// Replace backslashes with forward slashes
|
141
|
+
path = path.replace(/\\/g, '/');
|
142
|
+
|
143
|
+
// Handle empty string
|
144
|
+
if (path === '') {
|
145
|
+
return '.';
|
146
|
+
}
|
147
|
+
|
148
|
+
const isAbsolute = path.startsWith('/');
|
149
|
+
const trailingSlash = path.endsWith('/');
|
150
|
+
|
151
|
+
// Split path into segments
|
152
|
+
const segments = path.split('/').filter(Boolean);
|
153
|
+
const resultSegments = [];
|
154
|
+
|
155
|
+
for (const segment of segments) {
|
156
|
+
if (segment === '.') {
|
157
|
+
// Ignore current directory marker
|
158
|
+
continue;
|
159
|
+
} else if (segment === '..') {
|
160
|
+
// Go up one directory
|
161
|
+
if (
|
162
|
+
resultSegments.length > 0 &&
|
163
|
+
resultSegments[resultSegments.length - 1] !== '..'
|
164
|
+
) {
|
165
|
+
resultSegments.pop();
|
166
|
+
} else if (!isAbsolute) {
|
167
|
+
resultSegments.push('..');
|
168
|
+
}
|
169
|
+
} else {
|
170
|
+
// Add segment to result
|
171
|
+
resultSegments.push(segment);
|
172
|
+
}
|
173
|
+
}
|
174
|
+
|
175
|
+
// Handle empty result
|
176
|
+
if (resultSegments.length === 0) {
|
177
|
+
return isAbsolute ? '/' : '.';
|
178
|
+
}
|
179
|
+
|
180
|
+
// Join segments
|
181
|
+
let result = resultSegments.join('/');
|
182
|
+
|
183
|
+
// Add leading slash for absolute paths
|
184
|
+
if (isAbsolute) {
|
185
|
+
result = '/' + result;
|
186
|
+
}
|
187
|
+
|
188
|
+
// Add trailing slash if original path had one
|
189
|
+
if (trailingSlash && !result.endsWith('/')) {
|
190
|
+
result += '/';
|
191
|
+
}
|
192
|
+
|
193
|
+
return result;
|
194
|
+
}
|
195
|
+
|
196
|
+
/**
|
197
|
+
* Checks if a path is absolute.
|
198
|
+
*
|
199
|
+
* @param {string} path - The path to check
|
200
|
+
* @return {boolean} Whether the path is absolute
|
201
|
+
*/
|
202
|
+
export function isAbsolute(path) {
|
203
|
+
if (typeof path !== 'string') {
|
204
|
+
throw new Error('Path must be a string');
|
205
|
+
}
|
206
|
+
|
207
|
+
return path.startsWith('/');
|
208
|
+
}
|
209
|
+
|
210
|
+
/**
|
211
|
+
* Returns the path segments as an array.
|
212
|
+
*
|
213
|
+
* @param {string} path - The path to split
|
214
|
+
* @return {string[]} The path segments
|
215
|
+
*/
|
216
|
+
export function segments(path) {
|
217
|
+
if (typeof path !== 'string') {
|
218
|
+
throw new Error('Path must be a string');
|
219
|
+
}
|
220
|
+
|
221
|
+
// Normalize path first
|
222
|
+
const normalizedPath = normalize(path);
|
223
|
+
|
224
|
+
// Split path into segments
|
225
|
+
return normalizedPath.split('/').filter(Boolean);
|
226
|
+
}
|
@@ -1,5 +1,5 @@
|
|
1
|
-
export * from './array-path.js';
|
2
|
-
export * from './convert.js';
|
3
|
-
export * from './fs.js';
|
4
|
-
export * from './interpolate.js';
|
5
|
-
export * from './pad.js';
|
1
|
+
export * from './array-path.js';
|
2
|
+
export * from './convert.js';
|
3
|
+
export * from './fs.js';
|
4
|
+
export * from './interpolate.js';
|
5
|
+
export * from './pad.js';
|
@@ -1,61 +1,61 @@
|
|
1
|
-
import * as expect from '../expect/index.js';
|
2
|
-
|
3
|
-
import { toArrayPath } from '../array/index.js';
|
4
|
-
|
5
|
-
import { objectGet, PATH_SEPARATOR } from '../object/index.js';
|
6
|
-
|
7
|
-
export const RE_JS_EXPRESSION = /\$\{([^${}]*)\}/g;
|
8
|
-
export const RE_MUSTACHE = /\{\{([^{}]*)\}\}/g;
|
9
|
-
|
10
|
-
/**
|
11
|
-
* Interpolate: substitute variables in a string
|
12
|
-
*
|
13
|
-
* - Uses mustache template style expression substitution:
|
14
|
-
* Variables and expressions are surrounded by {{...}}
|
15
|
-
*
|
16
|
-
* TODO: full mustache support, see https://github.com/janl/mustache.js
|
17
|
-
*
|
18
|
-
* --
|
19
|
-
*
|
20
|
-
* @eg const template = `Hello {{name}}`;
|
21
|
-
*
|
22
|
-
* --
|
23
|
-
*
|
24
|
-
* @param {string} template - Template string to interpolate
|
25
|
-
* @param {object} templateData - Template data to use for interpolation
|
26
|
-
*
|
27
|
-
* @returns {string} interpolated string
|
28
|
-
*/
|
29
|
-
export function interpolate(
|
30
|
-
template,
|
31
|
-
templateData,
|
32
|
-
expressionRegexp = RE_MUSTACHE
|
33
|
-
) {
|
34
|
-
expect.string(template);
|
35
|
-
|
36
|
-
expect.object(templateData);
|
37
|
-
|
38
|
-
return template.replace(
|
39
|
-
expressionRegexp,
|
40
|
-
|
41
|
-
(match, expression) => {
|
42
|
-
const path = toArrayPath(expression);
|
43
|
-
|
44
|
-
/** @type {string} */
|
45
|
-
const replacement = objectGet(templateData, path, undefined);
|
46
|
-
|
47
|
-
if (
|
48
|
-
typeof replacement !== 'string' &&
|
49
|
-
typeof replacement !== 'number' &&
|
50
|
-
typeof replacement !== 'boolean'
|
51
|
-
) {
|
52
|
-
throw new Error(
|
53
|
-
'Failed to interpolate template: Missing or invalid value for ' +
|
54
|
-
`expression [${expression}] (expected string, number or boolean)`
|
55
|
-
);
|
56
|
-
}
|
57
|
-
|
58
|
-
return replacement;
|
59
|
-
}
|
60
|
-
);
|
61
|
-
}
|
1
|
+
import * as expect from '../expect/index.js';
|
2
|
+
|
3
|
+
import { toArrayPath } from '../array/index.js';
|
4
|
+
|
5
|
+
import { objectGet, PATH_SEPARATOR } from '../object/index.js';
|
6
|
+
|
7
|
+
export const RE_JS_EXPRESSION = /\$\{([^${}]*)\}/g;
|
8
|
+
export const RE_MUSTACHE = /\{\{([^{}]*)\}\}/g;
|
9
|
+
|
10
|
+
/**
|
11
|
+
* Interpolate: substitute variables in a string
|
12
|
+
*
|
13
|
+
* - Uses mustache template style expression substitution:
|
14
|
+
* Variables and expressions are surrounded by {{...}}
|
15
|
+
*
|
16
|
+
* TODO: full mustache support, see https://github.com/janl/mustache.js
|
17
|
+
*
|
18
|
+
* --
|
19
|
+
*
|
20
|
+
* @eg const template = `Hello {{name}}`;
|
21
|
+
*
|
22
|
+
* --
|
23
|
+
*
|
24
|
+
* @param {string} template - Template string to interpolate
|
25
|
+
* @param {object} templateData - Template data to use for interpolation
|
26
|
+
*
|
27
|
+
* @returns {string} interpolated string
|
28
|
+
*/
|
29
|
+
export function interpolate(
|
30
|
+
template,
|
31
|
+
templateData,
|
32
|
+
expressionRegexp = RE_MUSTACHE
|
33
|
+
) {
|
34
|
+
expect.string(template);
|
35
|
+
|
36
|
+
expect.object(templateData);
|
37
|
+
|
38
|
+
return template.replace(
|
39
|
+
expressionRegexp,
|
40
|
+
|
41
|
+
(match, expression) => {
|
42
|
+
const path = toArrayPath(expression);
|
43
|
+
|
44
|
+
/** @type {string} */
|
45
|
+
const replacement = objectGet(templateData, path, undefined);
|
46
|
+
|
47
|
+
if (
|
48
|
+
typeof replacement !== 'string' &&
|
49
|
+
typeof replacement !== 'number' &&
|
50
|
+
typeof replacement !== 'boolean'
|
51
|
+
) {
|
52
|
+
throw new Error(
|
53
|
+
'Failed to interpolate template: Missing or invalid value for ' +
|
54
|
+
`expression [${expression}] (expected string, number or boolean)`
|
55
|
+
);
|
56
|
+
}
|
57
|
+
|
58
|
+
return replacement;
|
59
|
+
}
|
60
|
+
);
|
61
|
+
}
|
package/dist/util/string/pad.js
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
/**
|
2
|
-
* Prefix a numeric string with 0's
|
3
|
-
*
|
4
|
-
* @param {string|number} input
|
5
|
-
*
|
6
|
-
* @returns {string}
|
7
|
-
*/
|
8
|
-
export function padDigits(input, targetLength = 2, padString = '0') {
|
9
|
-
return ('' + input).padStart(targetLength, padString);
|
10
|
-
}
|
1
|
+
/**
|
2
|
+
* Prefix a numeric string with 0's
|
3
|
+
*
|
4
|
+
* @param {string|number} input
|
5
|
+
*
|
6
|
+
* @returns {string}
|
7
|
+
*/
|
8
|
+
export function padDigits(input, targetLength = 2, padString = '0') {
|
9
|
+
return ('' + input).padStart(targetLength, padString);
|
10
|
+
}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
export * as observe from './observe/index.js';
|
2
|
-
export * as stateContext from './state-context/index.js';
|
3
|
-
|
4
|
-
export * as loading from './loading/loading-tracker.svelte.js';
|
1
|
+
export * as observe from './observe/index.js';
|
2
|
+
export * as stateContext from './state-context/index.js';
|
3
|
+
|
4
|
+
export * as loading from './loading/loading-tracker.svelte.js';
|