@hkdigital/lib-sveltekit 0.2.8 → 0.2.9
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/cache/IndexedDbCache.js +1407 -1407
- package/dist/classes/cache/MemoryResponseCache.js +138 -138
- package/dist/classes/cache/index.js +5 -5
- package/dist/classes/cache/typedef.js +41 -41
- 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/events/EventEmitter.js +275 -275
- package/dist/classes/events/index.js +2 -2
- package/dist/classes/index.js +4 -4
- package/dist/classes/logging/Logger.js +158 -158
- package/dist/classes/logging/constants.js +18 -18
- package/dist/classes/logging/index.js +4 -4
- package/dist/classes/promise/HkPromise.js +377 -377
- package/dist/classes/promise/index.js +1 -1
- package/dist/classes/services/ServiceBase.js +409 -409
- package/dist/classes/services/ServiceManager.js +1114 -1114
- package/dist/classes/services/constants.js +12 -12
- package/dist/classes/services/index.js +5 -5
- 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 +324 -324
- 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 +45 -45
- package/dist/classes/svelte/image/ImageScene.svelte.js +249 -249
- 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 +338 -338
- 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/drag-drop/DragController.js +44 -44
- package/dist/components/drag-drop/DragDropContext.svelte +112 -110
- package/dist/components/drag-drop/Draggable.svelte +498 -512
- package/dist/components/drag-drop/{Dropzone.svelte → DropZone.svelte} +258 -258
- package/dist/components/drag-drop/DropZoneArea.svelte +119 -119
- package/dist/components/drag-drop/DropZoneList.svelte +125 -125
- package/dist/components/drag-drop/actions.d.ts +6 -0
- package/dist/components/drag-drop/actions.js +18 -0
- package/dist/components/drag-drop/drag-state.svelte.js +319 -319
- package/dist/components/drag-drop/index.js +7 -7
- package/dist/components/drag-drop/util.js +85 -85
- 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 +63 -63
- package/dist/components/layout/grid-layers/GridLayers.svelte__heightFrom__ +372 -0
- package/dist/components/layout/grid-layers/util.js +74 -74
- 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 +11 -11
- package/dist/config/imagetools-config.js +189 -189
- package/dist/config/imagetools.d.ts +72 -72
- 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/drag-states.js +6 -6
- package/dist/constants/state-labels/drop-states.js +6 -6
- 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/features/button-group/ButtonGroup.svelte +82 -82
- package/dist/features/button-group/typedef.js +10 -10
- package/dist/features/compare-left-right/CompareLeftRight.svelte +179 -179
- package/dist/features/compare-left-right/index.js +1 -1
- package/dist/features/game-box/GameBox.svelte +577 -577
- package/dist/features/game-box/gamebox.util.js +83 -83
- package/dist/features/hk-app-layout/HkAppLayout.state.svelte.js +25 -25
- package/dist/features/hk-app-layout/HkAppLayout.svelte +251 -251
- package/dist/features/image-box/ImageBox.svelte +210 -210
- package/dist/features/image-box/index.js +5 -5
- package/dist/features/image-box/typedef.js +32 -32
- package/dist/features/index.js +23 -23
- package/dist/features/presenter/ImageSlide.svelte +64 -64
- package/dist/features/presenter/Presenter.state.svelte.js +638 -638
- package/dist/features/presenter/Presenter.svelte +142 -142
- package/dist/features/presenter/constants.js +7 -7
- package/dist/features/presenter/index.js +10 -10
- package/dist/features/presenter/typedef.js +106 -106
- package/dist/features/presenter/util.js +210 -210
- package/dist/features/virtual-viewport/VirtualViewport.svelte +196 -196
- 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 +146 -146
- package/dist/themes/hkdev/components/buttons/skip-button.css +6 -6
- package/dist/themes/hkdev/components/drag-drop/draggable.css +73 -73
- package/dist/themes/hkdev/components/drag-drop/drop-zone.css +48 -48
- 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 +53 -53
- 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/typedef/context.js +6 -6
- package/dist/typedef/drag.js +25 -25
- package/dist/typedef/drop.js +12 -12
- package/dist/typedef/image.js +38 -38
- package/dist/typedef/index.js +4 -4
- package/dist/util/array/index.js +436 -436
- 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 +102 -102
- 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/env/index.js +9 -9
- 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/geo/index.js +26 -26
- package/dist/util/http/caching.js +263 -263
- package/dist/util/http/errors.js +97 -97
- package/dist/util/http/headers.js +75 -75
- package/dist/util/http/http-request.js +379 -379
- package/dist/util/http/index.js +22 -22
- package/dist/util/http/json-request.js +224 -224
- package/dist/util/http/mocks.js +65 -65
- package/dist/util/http/response.js +294 -294
- package/dist/util/http/test-data__/content-length-test-hkdigital-small.V4HfZyBQ.avif +0 -0
- package/dist/util/http/typedef.js +93 -93
- 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 +117 -117
- 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/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 +112 -112
package/dist/util/http/index.js
CHANGED
@@ -1,22 +1,22 @@
|
|
1
|
-
// import * as expect from '../expect/index.js';
|
2
|
-
|
3
|
-
// import {
|
4
|
-
// ResponseError,
|
5
|
-
// AbortError,
|
6
|
-
// TimeoutError,
|
7
|
-
// TypeOrValueError
|
8
|
-
// } from '$lib/constants/errors/index.js';
|
9
|
-
|
10
|
-
// import { setRequestHeaders } from './headers.js';
|
11
|
-
// import { getErrorFromResponse } from './errors.js';
|
12
|
-
|
13
|
-
export * from './headers.js';
|
14
|
-
export * from './errors.js';
|
15
|
-
export * from './url.js';
|
16
|
-
export * from './response.js';
|
17
|
-
export * from './http-request.js';
|
18
|
-
export * from './json-request.js';
|
19
|
-
|
20
|
-
// import { CONTENT_TYPE, METHOD_GET, METHOD_POST } from '../../constants/http/index.js';
|
21
|
-
|
22
|
-
// import { APPLICATION_JSON } from '../../constants/mime/index.js';
|
1
|
+
// import * as expect from '../expect/index.js';
|
2
|
+
|
3
|
+
// import {
|
4
|
+
// ResponseError,
|
5
|
+
// AbortError,
|
6
|
+
// TimeoutError,
|
7
|
+
// TypeOrValueError
|
8
|
+
// } from '$lib/constants/errors/index.js';
|
9
|
+
|
10
|
+
// import { setRequestHeaders } from './headers.js';
|
11
|
+
// import { getErrorFromResponse } from './errors.js';
|
12
|
+
|
13
|
+
export * from './headers.js';
|
14
|
+
export * from './errors.js';
|
15
|
+
export * from './url.js';
|
16
|
+
export * from './response.js';
|
17
|
+
export * from './http-request.js';
|
18
|
+
export * from './json-request.js';
|
19
|
+
|
20
|
+
// import { CONTENT_TYPE, METHOD_GET, METHOD_POST } from '../../constants/http/index.js';
|
21
|
+
|
22
|
+
// import { APPLICATION_JSON } from '../../constants/mime/index.js';
|
@@ -1,224 +1,224 @@
|
|
1
|
-
import { METHOD_GET, METHOD_POST } from '../../constants/http/methods.js';
|
2
|
-
|
3
|
-
import { APPLICATION_JSON } from '../../constants/mime/application.js';
|
4
|
-
import { CONTENT_TYPE } from '../../constants/http/headers.js';
|
5
|
-
import { ResponseError } from '../../constants/errors/index.js';
|
6
|
-
|
7
|
-
import * as expect from '../expect/index.js';
|
8
|
-
|
9
|
-
import { toURL } from './url.js';
|
10
|
-
import { httpRequest } from './http-request.js';
|
11
|
-
import { waitForAndCheckResponse } from './response.js';
|
12
|
-
|
13
|
-
const ACCEPT = 'accept';
|
14
|
-
|
15
|
-
/**
|
16
|
-
* Make a GET request to fetch JSON encoded data
|
17
|
-
*
|
18
|
-
* This function performs a GET request and expects a JSON response from the server.
|
19
|
-
* It handles common error cases and parses the JSON response.
|
20
|
-
*
|
21
|
-
* @param {import('./typedef').JsonGetOptions} options
|
22
|
-
* Request configuration options
|
23
|
-
*
|
24
|
-
* @returns {Promise<any>} Parsed JSON data
|
25
|
-
*
|
26
|
-
* @example
|
27
|
-
* // Basic JSON GET request
|
28
|
-
* try {
|
29
|
-
* const data = await jsonGet({
|
30
|
-
* url: 'https://api.example.com/users/123'
|
31
|
-
* });
|
32
|
-
* console.log(data); // { id: 123, name: "John Doe", ... }
|
33
|
-
* } catch (error) {
|
34
|
-
* console.error('Failed to fetch user data:', error.message);
|
35
|
-
* }
|
36
|
-
*
|
37
|
-
* @example
|
38
|
-
* // JSON GET request with parameters
|
39
|
-
* const data = await jsonGet({
|
40
|
-
* url: 'https://api.example.com/search',
|
41
|
-
* urlSearchParams: new URLSearchParams({ q: 'search term' }),
|
42
|
-
* withCredentials: true
|
43
|
-
* });
|
44
|
-
*
|
45
|
-
* @example
|
46
|
-
* // Using advanced options
|
47
|
-
* const data = await jsonGet({
|
48
|
-
* url: 'https://api.example.com/data',
|
49
|
-
* timeoutMs: 5000,
|
50
|
-
* requestHandler: ({ abort }) => {
|
51
|
-
* // Store abort function
|
52
|
-
* window.abortDataRequest = abort;
|
53
|
-
* }
|
54
|
-
* });
|
55
|
-
*/
|
56
|
-
export async function jsonGet(options) {
|
57
|
-
// Extract specific parameters needed for this function
|
58
|
-
const {
|
59
|
-
url: rawUrl,
|
60
|
-
urlSearchParams,
|
61
|
-
headers,
|
62
|
-
withCredentials,
|
63
|
-
...otherOptions
|
64
|
-
} = options;
|
65
|
-
|
66
|
-
const url = toURL(rawUrl);
|
67
|
-
|
68
|
-
// Apply JSON-specific defaults
|
69
|
-
const jsonHeaders = headers || {};
|
70
|
-
jsonHeaders[ACCEPT] = APPLICATION_JSON;
|
71
|
-
|
72
|
-
// Create request with all options
|
73
|
-
const responsePromise = httpRequest({
|
74
|
-
method: METHOD_GET,
|
75
|
-
url,
|
76
|
-
urlSearchParams,
|
77
|
-
headers: jsonHeaders,
|
78
|
-
withCredentials,
|
79
|
-
...otherOptions // Pass through any other options
|
80
|
-
});
|
81
|
-
|
82
|
-
const response = await waitForAndCheckResponse(responsePromise, url);
|
83
|
-
|
84
|
-
let parsedResponse;
|
85
|
-
|
86
|
-
try {
|
87
|
-
//
|
88
|
-
// @note when security on the client side fails, an `opaque` response
|
89
|
-
// is returned by the browser (empty body) -> parsing fails
|
90
|
-
// (use CORS to fix this)
|
91
|
-
//
|
92
|
-
parsedResponse = await response.json();
|
93
|
-
} catch (e) {
|
94
|
-
throw new ResponseError(
|
95
|
-
`Failed to JSON decode server response from [${decodeURI(url.href)}]`,
|
96
|
-
{
|
97
|
-
cause: e
|
98
|
-
}
|
99
|
-
);
|
100
|
-
}
|
101
|
-
|
102
|
-
if (parsedResponse.error) {
|
103
|
-
throw new ResponseError(
|
104
|
-
`Server returned response error message [${parsedResponse.error}]`
|
105
|
-
);
|
106
|
-
}
|
107
|
-
|
108
|
-
return parsedResponse;
|
109
|
-
}
|
110
|
-
|
111
|
-
/**
|
112
|
-
* Make a POST request to fetch JSON encoded data
|
113
|
-
*
|
114
|
-
* This function performs a POST request with JSON data and expects a JSON
|
115
|
-
* response from the server. It handles common error cases and parses the JSON response.
|
116
|
-
*
|
117
|
-
* @param {import('./typedef').JsonPostOptions} options
|
118
|
-
* Request configuration options
|
119
|
-
*
|
120
|
-
* @returns {Promise<any>} Parsed JSON data
|
121
|
-
*
|
122
|
-
* @example
|
123
|
-
* // Basic JSON POST request
|
124
|
-
* try {
|
125
|
-
* const newUser = {
|
126
|
-
* name: "Jane Smith",
|
127
|
-
* email: "jane@example.com"
|
128
|
-
* };
|
129
|
-
*
|
130
|
-
* const data = await jsonPost({
|
131
|
-
* url: 'https://api.example.com/users',
|
132
|
-
* body: JSON.stringify(newUser)
|
133
|
-
* });
|
134
|
-
*
|
135
|
-
* console.log('Created user with ID:', data.id);
|
136
|
-
* } catch (error) {
|
137
|
-
* console.error('Failed to create user:', error.message);
|
138
|
-
* }
|
139
|
-
*
|
140
|
-
* @example
|
141
|
-
* // JSON POST with authentication and timeout
|
142
|
-
* const data = await jsonPost({
|
143
|
-
* url: 'https://api.example.com/protected/resource',
|
144
|
-
* body: JSON.stringify({ action: 'update' }),
|
145
|
-
* headers: {
|
146
|
-
* 'authorization': 'Bearer ' + token
|
147
|
-
* },
|
148
|
-
* withCredentials: true,
|
149
|
-
* timeoutMs: 5000
|
150
|
-
* });
|
151
|
-
*/
|
152
|
-
export async function jsonPost(options) {
|
153
|
-
// Extract specific parameters needed for this function
|
154
|
-
const {
|
155
|
-
url: rawUrl,
|
156
|
-
body,
|
157
|
-
urlSearchParams,
|
158
|
-
headers,
|
159
|
-
withCredentials,
|
160
|
-
...otherOptions
|
161
|
-
} = options;
|
162
|
-
|
163
|
-
const url = toURL(rawUrl);
|
164
|
-
|
165
|
-
// Apply JSON-specific defaults and validation
|
166
|
-
expect.defined(body);
|
167
|
-
|
168
|
-
const jsonHeaders = headers || {};
|
169
|
-
jsonHeaders[ACCEPT] = APPLICATION_JSON;
|
170
|
-
jsonHeaders[CONTENT_TYPE] = APPLICATION_JSON;
|
171
|
-
|
172
|
-
// Check if body is a string when using application/json
|
173
|
-
if (
|
174
|
-
jsonHeaders[CONTENT_TYPE] === APPLICATION_JSON &&
|
175
|
-
typeof body !== 'string'
|
176
|
-
) {
|
177
|
-
throw new Error(
|
178
|
-
`Trying to send request with [content-type:${APPLICATION_JSON}], ` +
|
179
|
-
'but body is not a (JSON encoded) string.'
|
180
|
-
);
|
181
|
-
}
|
182
|
-
|
183
|
-
// Create request with all options
|
184
|
-
const responsePromise = httpRequest({
|
185
|
-
method: METHOD_POST,
|
186
|
-
url,
|
187
|
-
body,
|
188
|
-
urlSearchParams,
|
189
|
-
headers: jsonHeaders,
|
190
|
-
withCredentials,
|
191
|
-
...otherOptions // Pass through any other options
|
192
|
-
});
|
193
|
-
|
194
|
-
const response = await waitForAndCheckResponse(responsePromise, url);
|
195
|
-
|
196
|
-
let parsedResponse;
|
197
|
-
|
198
|
-
try {
|
199
|
-
//
|
200
|
-
// @note when security on the client side fails, an `opaque` response
|
201
|
-
// is returned by the browser (empty body) -> parsing fails
|
202
|
-
// (use CORS to fix this)
|
203
|
-
//
|
204
|
-
parsedResponse = await response.json();
|
205
|
-
} catch (e) {
|
206
|
-
throw new ResponseError(
|
207
|
-
`Failed to JSON decode server response from [${decodeURI(url.href)}]`,
|
208
|
-
{
|
209
|
-
cause: e
|
210
|
-
}
|
211
|
-
);
|
212
|
-
}
|
213
|
-
|
214
|
-
if (parsedResponse.error) {
|
215
|
-
//
|
216
|
-
// @note this is API specific, but it's quite logical
|
217
|
-
//
|
218
|
-
throw new ResponseError(
|
219
|
-
`Server returned response error message [${parsedResponse.error}]`
|
220
|
-
);
|
221
|
-
}
|
222
|
-
|
223
|
-
return parsedResponse;
|
224
|
-
}
|
1
|
+
import { METHOD_GET, METHOD_POST } from '../../constants/http/methods.js';
|
2
|
+
|
3
|
+
import { APPLICATION_JSON } from '../../constants/mime/application.js';
|
4
|
+
import { CONTENT_TYPE } from '../../constants/http/headers.js';
|
5
|
+
import { ResponseError } from '../../constants/errors/index.js';
|
6
|
+
|
7
|
+
import * as expect from '../expect/index.js';
|
8
|
+
|
9
|
+
import { toURL } from './url.js';
|
10
|
+
import { httpRequest } from './http-request.js';
|
11
|
+
import { waitForAndCheckResponse } from './response.js';
|
12
|
+
|
13
|
+
const ACCEPT = 'accept';
|
14
|
+
|
15
|
+
/**
|
16
|
+
* Make a GET request to fetch JSON encoded data
|
17
|
+
*
|
18
|
+
* This function performs a GET request and expects a JSON response from the server.
|
19
|
+
* It handles common error cases and parses the JSON response.
|
20
|
+
*
|
21
|
+
* @param {import('./typedef').JsonGetOptions} options
|
22
|
+
* Request configuration options
|
23
|
+
*
|
24
|
+
* @returns {Promise<any>} Parsed JSON data
|
25
|
+
*
|
26
|
+
* @example
|
27
|
+
* // Basic JSON GET request
|
28
|
+
* try {
|
29
|
+
* const data = await jsonGet({
|
30
|
+
* url: 'https://api.example.com/users/123'
|
31
|
+
* });
|
32
|
+
* console.log(data); // { id: 123, name: "John Doe", ... }
|
33
|
+
* } catch (error) {
|
34
|
+
* console.error('Failed to fetch user data:', error.message);
|
35
|
+
* }
|
36
|
+
*
|
37
|
+
* @example
|
38
|
+
* // JSON GET request with parameters
|
39
|
+
* const data = await jsonGet({
|
40
|
+
* url: 'https://api.example.com/search',
|
41
|
+
* urlSearchParams: new URLSearchParams({ q: 'search term' }),
|
42
|
+
* withCredentials: true
|
43
|
+
* });
|
44
|
+
*
|
45
|
+
* @example
|
46
|
+
* // Using advanced options
|
47
|
+
* const data = await jsonGet({
|
48
|
+
* url: 'https://api.example.com/data',
|
49
|
+
* timeoutMs: 5000,
|
50
|
+
* requestHandler: ({ abort }) => {
|
51
|
+
* // Store abort function
|
52
|
+
* window.abortDataRequest = abort;
|
53
|
+
* }
|
54
|
+
* });
|
55
|
+
*/
|
56
|
+
export async function jsonGet(options) {
|
57
|
+
// Extract specific parameters needed for this function
|
58
|
+
const {
|
59
|
+
url: rawUrl,
|
60
|
+
urlSearchParams,
|
61
|
+
headers,
|
62
|
+
withCredentials,
|
63
|
+
...otherOptions
|
64
|
+
} = options;
|
65
|
+
|
66
|
+
const url = toURL(rawUrl);
|
67
|
+
|
68
|
+
// Apply JSON-specific defaults
|
69
|
+
const jsonHeaders = headers || {};
|
70
|
+
jsonHeaders[ACCEPT] = APPLICATION_JSON;
|
71
|
+
|
72
|
+
// Create request with all options
|
73
|
+
const responsePromise = httpRequest({
|
74
|
+
method: METHOD_GET,
|
75
|
+
url,
|
76
|
+
urlSearchParams,
|
77
|
+
headers: jsonHeaders,
|
78
|
+
withCredentials,
|
79
|
+
...otherOptions // Pass through any other options
|
80
|
+
});
|
81
|
+
|
82
|
+
const response = await waitForAndCheckResponse(responsePromise, url);
|
83
|
+
|
84
|
+
let parsedResponse;
|
85
|
+
|
86
|
+
try {
|
87
|
+
//
|
88
|
+
// @note when security on the client side fails, an `opaque` response
|
89
|
+
// is returned by the browser (empty body) -> parsing fails
|
90
|
+
// (use CORS to fix this)
|
91
|
+
//
|
92
|
+
parsedResponse = await response.json();
|
93
|
+
} catch (e) {
|
94
|
+
throw new ResponseError(
|
95
|
+
`Failed to JSON decode server response from [${decodeURI(url.href)}]`,
|
96
|
+
{
|
97
|
+
cause: e
|
98
|
+
}
|
99
|
+
);
|
100
|
+
}
|
101
|
+
|
102
|
+
if (parsedResponse.error) {
|
103
|
+
throw new ResponseError(
|
104
|
+
`Server returned response error message [${parsedResponse.error}]`
|
105
|
+
);
|
106
|
+
}
|
107
|
+
|
108
|
+
return parsedResponse;
|
109
|
+
}
|
110
|
+
|
111
|
+
/**
|
112
|
+
* Make a POST request to fetch JSON encoded data
|
113
|
+
*
|
114
|
+
* This function performs a POST request with JSON data and expects a JSON
|
115
|
+
* response from the server. It handles common error cases and parses the JSON response.
|
116
|
+
*
|
117
|
+
* @param {import('./typedef').JsonPostOptions} options
|
118
|
+
* Request configuration options
|
119
|
+
*
|
120
|
+
* @returns {Promise<any>} Parsed JSON data
|
121
|
+
*
|
122
|
+
* @example
|
123
|
+
* // Basic JSON POST request
|
124
|
+
* try {
|
125
|
+
* const newUser = {
|
126
|
+
* name: "Jane Smith",
|
127
|
+
* email: "jane@example.com"
|
128
|
+
* };
|
129
|
+
*
|
130
|
+
* const data = await jsonPost({
|
131
|
+
* url: 'https://api.example.com/users',
|
132
|
+
* body: JSON.stringify(newUser)
|
133
|
+
* });
|
134
|
+
*
|
135
|
+
* console.log('Created user with ID:', data.id);
|
136
|
+
* } catch (error) {
|
137
|
+
* console.error('Failed to create user:', error.message);
|
138
|
+
* }
|
139
|
+
*
|
140
|
+
* @example
|
141
|
+
* // JSON POST with authentication and timeout
|
142
|
+
* const data = await jsonPost({
|
143
|
+
* url: 'https://api.example.com/protected/resource',
|
144
|
+
* body: JSON.stringify({ action: 'update' }),
|
145
|
+
* headers: {
|
146
|
+
* 'authorization': 'Bearer ' + token
|
147
|
+
* },
|
148
|
+
* withCredentials: true,
|
149
|
+
* timeoutMs: 5000
|
150
|
+
* });
|
151
|
+
*/
|
152
|
+
export async function jsonPost(options) {
|
153
|
+
// Extract specific parameters needed for this function
|
154
|
+
const {
|
155
|
+
url: rawUrl,
|
156
|
+
body,
|
157
|
+
urlSearchParams,
|
158
|
+
headers,
|
159
|
+
withCredentials,
|
160
|
+
...otherOptions
|
161
|
+
} = options;
|
162
|
+
|
163
|
+
const url = toURL(rawUrl);
|
164
|
+
|
165
|
+
// Apply JSON-specific defaults and validation
|
166
|
+
expect.defined(body);
|
167
|
+
|
168
|
+
const jsonHeaders = headers || {};
|
169
|
+
jsonHeaders[ACCEPT] = APPLICATION_JSON;
|
170
|
+
jsonHeaders[CONTENT_TYPE] = APPLICATION_JSON;
|
171
|
+
|
172
|
+
// Check if body is a string when using application/json
|
173
|
+
if (
|
174
|
+
jsonHeaders[CONTENT_TYPE] === APPLICATION_JSON &&
|
175
|
+
typeof body !== 'string'
|
176
|
+
) {
|
177
|
+
throw new Error(
|
178
|
+
`Trying to send request with [content-type:${APPLICATION_JSON}], ` +
|
179
|
+
'but body is not a (JSON encoded) string.'
|
180
|
+
);
|
181
|
+
}
|
182
|
+
|
183
|
+
// Create request with all options
|
184
|
+
const responsePromise = httpRequest({
|
185
|
+
method: METHOD_POST,
|
186
|
+
url,
|
187
|
+
body,
|
188
|
+
urlSearchParams,
|
189
|
+
headers: jsonHeaders,
|
190
|
+
withCredentials,
|
191
|
+
...otherOptions // Pass through any other options
|
192
|
+
});
|
193
|
+
|
194
|
+
const response = await waitForAndCheckResponse(responsePromise, url);
|
195
|
+
|
196
|
+
let parsedResponse;
|
197
|
+
|
198
|
+
try {
|
199
|
+
//
|
200
|
+
// @note when security on the client side fails, an `opaque` response
|
201
|
+
// is returned by the browser (empty body) -> parsing fails
|
202
|
+
// (use CORS to fix this)
|
203
|
+
//
|
204
|
+
parsedResponse = await response.json();
|
205
|
+
} catch (e) {
|
206
|
+
throw new ResponseError(
|
207
|
+
`Failed to JSON decode server response from [${decodeURI(url.href)}]`,
|
208
|
+
{
|
209
|
+
cause: e
|
210
|
+
}
|
211
|
+
);
|
212
|
+
}
|
213
|
+
|
214
|
+
if (parsedResponse.error) {
|
215
|
+
//
|
216
|
+
// @note this is API specific, but it's quite logical
|
217
|
+
//
|
218
|
+
throw new ResponseError(
|
219
|
+
`Server returned response error message [${parsedResponse.error}]`
|
220
|
+
);
|
221
|
+
}
|
222
|
+
|
223
|
+
return parsedResponse;
|
224
|
+
}
|
package/dist/util/http/mocks.js
CHANGED
@@ -1,65 +1,65 @@
|
|
1
|
-
import { CONTENT_TYPE, CONTENT_LENGTH } from '../../constants/http/index.js';
|
2
|
-
|
3
|
-
import { OCTET_STREAM } from '../../constants/mime/index.js';
|
4
|
-
|
5
|
-
/**
|
6
|
-
* Create a response value that can be used by a mocked fetch function
|
7
|
-
*
|
8
|
-
* @template T
|
9
|
-
*
|
10
|
-
* @param {T} data
|
11
|
-
*
|
12
|
-
* @returns {{ json: () => Promise<T>}}
|
13
|
-
*/
|
14
|
-
export function createJsonFetchResponse(data /* , options */) {
|
15
|
-
return { json: () => new Promise((resolve) => resolve(data)) };
|
16
|
-
}
|
17
|
-
|
18
|
-
/**
|
19
|
-
* Create a response value that can be used by a mocked fetch function
|
20
|
-
*
|
21
|
-
* @param {ArrayBuffer} arrayBuffer
|
22
|
-
*
|
23
|
-
* @returns {Response}
|
24
|
-
*/
|
25
|
-
export function createStreamedResponse(arrayBuffer /*, options */) {
|
26
|
-
const byteLength = arrayBuffer.byteLength;
|
27
|
-
const chunkSize = Math.ceil(byteLength / 10);
|
28
|
-
|
29
|
-
const body = new ReadableStream({
|
30
|
-
start(controller) {
|
31
|
-
let offset = 0;
|
32
|
-
|
33
|
-
function pushChunk() {
|
34
|
-
if (offset >= byteLength) {
|
35
|
-
controller.close();
|
36
|
-
return;
|
37
|
-
}
|
38
|
-
|
39
|
-
// Calculate the size of the current chunk
|
40
|
-
const currentChunkSize = Math.min(chunkSize, byteLength - offset);
|
41
|
-
|
42
|
-
// Create a new ArrayBuffer for this chunk
|
43
|
-
const chunk = arrayBuffer.slice(offset, offset + currentChunkSize);
|
44
|
-
|
45
|
-
controller.enqueue(chunk);
|
46
|
-
offset += currentChunkSize;
|
47
|
-
|
48
|
-
// Schedule next chunk
|
49
|
-
setTimeout(pushChunk, 0);
|
50
|
-
}
|
51
|
-
|
52
|
-
// Start pushing chunks
|
53
|
-
pushChunk();
|
54
|
-
}
|
55
|
-
});
|
56
|
-
|
57
|
-
const response = new Response(body, {
|
58
|
-
headers: new Headers({
|
59
|
-
[CONTENT_TYPE]: OCTET_STREAM,
|
60
|
-
[CONTENT_LENGTH]: String(byteLength)
|
61
|
-
})
|
62
|
-
});
|
63
|
-
|
64
|
-
return response;
|
65
|
-
}
|
1
|
+
import { CONTENT_TYPE, CONTENT_LENGTH } from '../../constants/http/index.js';
|
2
|
+
|
3
|
+
import { OCTET_STREAM } from '../../constants/mime/index.js';
|
4
|
+
|
5
|
+
/**
|
6
|
+
* Create a response value that can be used by a mocked fetch function
|
7
|
+
*
|
8
|
+
* @template T
|
9
|
+
*
|
10
|
+
* @param {T} data
|
11
|
+
*
|
12
|
+
* @returns {{ json: () => Promise<T>}}
|
13
|
+
*/
|
14
|
+
export function createJsonFetchResponse(data /* , options */) {
|
15
|
+
return { json: () => new Promise((resolve) => resolve(data)) };
|
16
|
+
}
|
17
|
+
|
18
|
+
/**
|
19
|
+
* Create a response value that can be used by a mocked fetch function
|
20
|
+
*
|
21
|
+
* @param {ArrayBuffer} arrayBuffer
|
22
|
+
*
|
23
|
+
* @returns {Response}
|
24
|
+
*/
|
25
|
+
export function createStreamedResponse(arrayBuffer /*, options */) {
|
26
|
+
const byteLength = arrayBuffer.byteLength;
|
27
|
+
const chunkSize = Math.ceil(byteLength / 10);
|
28
|
+
|
29
|
+
const body = new ReadableStream({
|
30
|
+
start(controller) {
|
31
|
+
let offset = 0;
|
32
|
+
|
33
|
+
function pushChunk() {
|
34
|
+
if (offset >= byteLength) {
|
35
|
+
controller.close();
|
36
|
+
return;
|
37
|
+
}
|
38
|
+
|
39
|
+
// Calculate the size of the current chunk
|
40
|
+
const currentChunkSize = Math.min(chunkSize, byteLength - offset);
|
41
|
+
|
42
|
+
// Create a new ArrayBuffer for this chunk
|
43
|
+
const chunk = arrayBuffer.slice(offset, offset + currentChunkSize);
|
44
|
+
|
45
|
+
controller.enqueue(chunk);
|
46
|
+
offset += currentChunkSize;
|
47
|
+
|
48
|
+
// Schedule next chunk
|
49
|
+
setTimeout(pushChunk, 0);
|
50
|
+
}
|
51
|
+
|
52
|
+
// Start pushing chunks
|
53
|
+
pushChunk();
|
54
|
+
}
|
55
|
+
});
|
56
|
+
|
57
|
+
const response = new Response(body, {
|
58
|
+
headers: new Headers({
|
59
|
+
[CONTENT_TYPE]: OCTET_STREAM,
|
60
|
+
[CONTENT_LENGTH]: String(byteLength)
|
61
|
+
})
|
62
|
+
});
|
63
|
+
|
64
|
+
return response;
|
65
|
+
}
|