@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.
Files changed (209) hide show
  1. package/README.md +135 -135
  2. package/dist/assets/autospuiten/car-paint-picker.js +41 -41
  3. package/dist/assets/autospuiten/labels.js +7 -7
  4. package/dist/classes/data/IterableTree.js +243 -243
  5. package/dist/classes/data/Selector.js +190 -190
  6. package/dist/classes/data/index.js +2 -2
  7. package/dist/classes/index.js +4 -4
  8. package/dist/classes/promise/HkPromise.js +377 -377
  9. package/dist/classes/promise/index.js +1 -1
  10. package/dist/classes/stores/SubscribersCount.js +107 -107
  11. package/dist/classes/stores/index.js +1 -1
  12. package/dist/classes/streams/LogTransformStream.js +19 -19
  13. package/dist/classes/streams/ServerEventsStore.js +110 -110
  14. package/dist/classes/streams/TimeStampSource.js +26 -26
  15. package/dist/classes/streams/index.js +3 -3
  16. package/dist/classes/svelte/audio/AudioLoader.svelte.js +58 -58
  17. package/dist/classes/svelte/audio/AudioScene.svelte.js +295 -295
  18. package/dist/classes/svelte/audio/mocks.js +35 -35
  19. package/dist/classes/svelte/finite-state-machine/FiniteStateMachine.svelte.js +133 -133
  20. package/dist/classes/svelte/finite-state-machine/index.js +1 -1
  21. package/dist/classes/svelte/image/ImageLoader.svelte.js +47 -47
  22. package/dist/classes/svelte/image/ImageScene.svelte.js +253 -253
  23. package/dist/classes/svelte/image/ImageVariantsLoader.svelte.js +152 -152
  24. package/dist/classes/svelte/image/index.js +4 -4
  25. package/dist/classes/svelte/image/mocks.js +35 -35
  26. package/dist/classes/svelte/image/typedef.js +8 -8
  27. package/dist/classes/svelte/index.js +14 -14
  28. package/dist/classes/svelte/loading-state-machine/LoadingStateMachine.svelte.js +109 -109
  29. package/dist/classes/svelte/loading-state-machine/constants.js +16 -16
  30. package/dist/classes/svelte/loading-state-machine/index.js +3 -3
  31. package/dist/classes/svelte/network-loader/NetworkLoader.svelte.js +331 -331
  32. package/dist/classes/svelte/network-loader/constants.js +3 -3
  33. package/dist/classes/svelte/network-loader/index.js +3 -3
  34. package/dist/classes/svelte/network-loader/mocks.js +30 -30
  35. package/dist/classes/svelte/network-loader/typedef.js +8 -8
  36. package/dist/components/area/HkArea.svelte +49 -49
  37. package/dist/components/area/HkGridArea.svelte +77 -77
  38. package/dist/components/area/index.js +2 -2
  39. package/dist/components/buttons/button/Button.svelte +82 -82
  40. package/dist/components/buttons/button-icon-steeze/SteezeIconButton.svelte +30 -30
  41. package/dist/components/buttons/button-text/TextButton.svelte +21 -21
  42. package/dist/components/buttons/index.js +3 -3
  43. package/dist/components/debug/debug-panel-design-scaling/DebugPanelDesignScaling.svelte +146 -146
  44. package/dist/components/debug/index.js +1 -1
  45. package/dist/components/hkdev/blocks/TextBlock.svelte +46 -46
  46. package/dist/components/hkdev/buttons/CheckButton.svelte +62 -62
  47. package/dist/components/icons/HkIcon.svelte +86 -86
  48. package/dist/components/icons/HkTabIcon.svelte +116 -116
  49. package/dist/components/icons/SteezeIcon.svelte +97 -97
  50. package/dist/components/icons/index.js +6 -6
  51. package/dist/components/icons/typedef.js +16 -16
  52. package/dist/components/index.js +2 -2
  53. package/dist/components/inputs/index.js +1 -1
  54. package/dist/components/inputs/text-input/TestTextInput.svelte__ +102 -102
  55. package/dist/components/inputs/text-input/TextInput.svelte +223 -223
  56. package/dist/components/inputs/text-input/TextInput.svelte___ +83 -83
  57. package/dist/components/inputs/text-input/assets/IconInvalid.svelte +14 -14
  58. package/dist/components/inputs/text-input/assets/IconValid.svelte +12 -12
  59. package/dist/components/layout/grid-layers/GridLayers.svelte +167 -167
  60. package/dist/components/layout/index.js +1 -1
  61. package/dist/components/panels/index.js +1 -1
  62. package/dist/components/panels/panel/Panel.svelte +43 -43
  63. package/dist/components/rows/index.js +3 -3
  64. package/dist/components/rows/panel-grid-row/PanelGridRow.svelte +104 -104
  65. package/dist/components/rows/panel-row-2/PanelRow2.svelte +40 -40
  66. package/dist/components/tab-bar/HkTabBar.state.svelte.js +149 -149
  67. package/dist/components/tab-bar/HkTabBar.svelte +74 -74
  68. package/dist/components/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
  69. package/dist/components/tab-bar/HkTabBarSelector.svelte +49 -49
  70. package/dist/components/tab-bar/index.js +17 -17
  71. package/dist/components/tab-bar/typedef.js +8 -8
  72. package/dist/config/imagetools-config.js +189 -189
  73. package/dist/config/imagetools.d.ts +71 -71
  74. package/dist/config/typedef.js +8 -8
  75. package/dist/constants/bases.js +13 -13
  76. package/dist/constants/errors/api.js +9 -9
  77. package/dist/constants/errors/generic.js +5 -5
  78. package/dist/constants/errors/index.js +3 -3
  79. package/dist/constants/errors/jwt.js +5 -5
  80. package/dist/constants/http/headers.js +6 -6
  81. package/dist/constants/http/index.js +2 -2
  82. package/dist/constants/http/methods.js +2 -2
  83. package/dist/constants/index.js +3 -3
  84. package/dist/constants/mime/application.js +5 -5
  85. package/dist/constants/mime/audio.js +13 -13
  86. package/dist/constants/mime/image.js +3 -3
  87. package/dist/constants/mime/index.js +4 -4
  88. package/dist/constants/mime/text.js +2 -2
  89. package/dist/constants/regexp/index.js +31 -31
  90. package/dist/constants/regexp/inspiratie.js__ +95 -95
  91. package/dist/constants/regexp/text.js +49 -49
  92. package/dist/constants/regexp/user.js +32 -32
  93. package/dist/constants/regexp/web.js +3 -3
  94. package/dist/constants/state-labels/input-states.js +11 -11
  95. package/dist/constants/state-labels/submit-states.js +4 -4
  96. package/dist/constants/time.js +28 -28
  97. package/dist/css/utilities.css +43 -43
  98. package/dist/design/design-config.js +73 -73
  99. package/dist/design/tailwind-theme-extend.js +158 -158
  100. package/dist/schemas/index.js +1 -1
  101. package/dist/schemas/validate-url.js +180 -180
  102. package/dist/server/index.js +1 -1
  103. package/dist/server/logger.js +94 -94
  104. package/dist/states/index.js +1 -1
  105. package/dist/states/navigation.svelte.js +55 -55
  106. package/dist/stores/index.js +1 -1
  107. package/dist/stores/theme.js +80 -80
  108. package/dist/themes/hkdev/components/blocks/text-block.css +41 -41
  109. package/dist/themes/hkdev/components/boxes/game-box.css +12 -12
  110. package/dist/themes/hkdev/components/buttons/button-icon-steeze.css +22 -22
  111. package/dist/themes/hkdev/components/buttons/button-text.css +32 -32
  112. package/dist/themes/hkdev/components/buttons/button.css +142 -142
  113. package/dist/themes/hkdev/components/buttons/skip-button.css +6 -6
  114. package/dist/themes/hkdev/components/icons/icon-steeze.css +22 -22
  115. package/dist/themes/hkdev/components/inputs/text-input.css +104 -104
  116. package/dist/themes/hkdev/components/panels/panel.css +27 -27
  117. package/dist/themes/hkdev/components/rows/panel-grid-row.css +6 -6
  118. package/dist/themes/hkdev/components/rows/panel-row-2.css +7 -7
  119. package/dist/themes/hkdev/components.css +47 -47
  120. package/dist/themes/hkdev/debug.css +1 -1
  121. package/dist/themes/hkdev/global/layout.css +39 -39
  122. package/dist/themes/hkdev/global/on-colors.css +53 -53
  123. package/dist/themes/hkdev/globals.css +11 -11
  124. package/dist/themes/hkdev/responsive.css +12 -12
  125. package/dist/themes/hkdev/theme-ext.js +15 -15
  126. package/dist/themes/hkdev/theme.js +235 -235
  127. package/dist/themes/index.js +1 -1
  128. package/dist/util/array/index.js +455 -455
  129. package/dist/util/bases/base58.js +262 -262
  130. package/dist/util/bases/index.js +1 -1
  131. package/dist/util/compare/index.js +247 -247
  132. package/dist/util/css/css-vars.js +83 -83
  133. package/dist/util/css/index.js +1 -1
  134. package/dist/util/design-system/components/states.js +22 -22
  135. package/dist/util/design-system/css/clamp.js +66 -66
  136. package/dist/util/design-system/css/root-design-vars.js +100 -100
  137. package/dist/util/design-system/index.js +5 -5
  138. package/dist/util/design-system/layout/scaling.js +228 -228
  139. package/dist/util/design-system/skeleton.js +208 -208
  140. package/dist/util/design-system/tailwind.js +288 -288
  141. package/dist/util/expect/arrays.js +47 -47
  142. package/dist/util/expect/index.js +259 -259
  143. package/dist/util/expect/primitives.js +55 -55
  144. package/dist/util/expect/url.js +60 -60
  145. package/dist/util/function/index.js +218 -218
  146. package/dist/util/http/errors.js +97 -97
  147. package/dist/util/http/headers.js +45 -45
  148. package/dist/util/http/http-request.js +294 -294
  149. package/dist/util/http/index.js +22 -22
  150. package/dist/util/http/json-request.js +143 -143
  151. package/dist/util/http/mocks.js +65 -65
  152. package/dist/util/http/response.js +241 -241
  153. package/dist/util/http/test-data__/content-length-test-hkdigital-small.V4HfZyBQ.avif +0 -0
  154. package/dist/util/http/url.js +52 -52
  155. package/dist/util/image/index.js +86 -86
  156. package/dist/util/index.js +2 -2
  157. package/dist/util/is/index.js +140 -140
  158. package/dist/util/iterate/index.js +234 -234
  159. package/dist/util/object/index.js +1361 -1361
  160. package/dist/util/singleton/index.js +97 -97
  161. package/dist/util/string/array-path.js +75 -75
  162. package/dist/util/string/convert.js +54 -54
  163. package/dist/util/string/fs.js +226 -226
  164. package/dist/util/string/index.js +5 -5
  165. package/dist/util/string/interpolate.js +61 -61
  166. package/dist/util/string/pad.js +10 -10
  167. package/dist/util/svelte/index.js +4 -4
  168. package/dist/util/svelte/loading/loading-tracker.svelte.js +108 -108
  169. package/dist/util/svelte/observe/index.js +49 -49
  170. package/dist/util/svelte/state-context/index.js +83 -83
  171. package/dist/util/svelte/wait/index.js +38 -38
  172. package/dist/util/sveltekit/index.js +1 -1
  173. package/dist/util/sveltekit/route-folders/index.js +101 -101
  174. package/dist/util/time/index.js +323 -323
  175. package/dist/util/unique/index.js +249 -249
  176. package/dist/valibot/date.js__ +10 -10
  177. package/dist/valibot/index.js +9 -9
  178. package/dist/valibot/url.js +95 -95
  179. package/dist/valibot/user.js +23 -23
  180. package/dist/widgets/button-group/ButtonGroup.svelte +82 -94
  181. package/dist/widgets/button-group/ButtonGroup.svelte.d.ts +0 -2
  182. package/dist/widgets/button-group/typedef.js +10 -10
  183. package/dist/widgets/compare-left-right/CompareLeftRight.svelte +179 -179
  184. package/dist/widgets/compare-left-right/index.js +1 -1
  185. package/dist/widgets/game-box/GameBox.svelte +579 -186
  186. package/dist/widgets/game-box/GameBox.svelte.d.ts +64 -4
  187. package/dist/widgets/game-box/gamebox.util.js +83 -83
  188. package/dist/widgets/hk-app-layout/HkAppLayout.state.svelte.js +25 -25
  189. package/dist/widgets/hk-app-layout/HkAppLayout.svelte +251 -251
  190. package/dist/widgets/image-box/ImageBox.svelte +212 -212
  191. package/dist/widgets/image-box/index.js +5 -5
  192. package/dist/widgets/image-box/typedef.js +32 -32
  193. package/dist/widgets/index.js +23 -23
  194. package/dist/widgets/presenter/(broken) Presenter.state.svelte.js__ +613 -0
  195. package/dist/widgets/presenter/ImageSlide.svelte +64 -64
  196. package/dist/widgets/presenter/Presenter.state.svelte.js +636 -636
  197. package/dist/widgets/presenter/Presenter.svelte +140 -140
  198. package/dist/widgets/presenter/Presenter.svelte__ +125 -0
  199. package/dist/widgets/presenter/constants.js +7 -7
  200. package/dist/widgets/presenter/index.js +10 -10
  201. package/dist/widgets/presenter/typedef.js +106 -106
  202. package/dist/widgets/presenter/util.js +210 -210
  203. package/dist/widgets/virtual-viewport/VirtualViewport.svelte +196 -196
  204. package/dist/zod/all.js +33 -33
  205. package/dist/zod/generic.js +11 -11
  206. package/dist/zod/javascript.js +32 -32
  207. package/dist/zod/user.js +16 -16
  208. package/dist/zod/web.js +52 -52
  209. package/package.json +102 -102
@@ -1,294 +1,294 @@
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
-
6
- import { AbortError, TimeoutError } from '../../constants/errors/api.js';
7
-
8
- import * as expect from '../expect/index.js';
9
-
10
- import { toURL } from './url.js';
11
- import { setRequestHeaders } from './headers.js';
12
- import { waitForAndCheckResponse } from './response.js';
13
-
14
- /**
15
- * @callback requestHandler
16
- * @param {Object} _
17
- * @param {AbortController} _.controller
18
- * @param {( reason?: Error ) => void} _.abort
19
- * @param {( delayMs: number) => void} _.timeout
20
- */
21
-
22
- /**
23
- * Make GET request
24
- *
25
- * @param {object} _
26
- *
27
- * @param {string|URL} _.url - Url string or URL object
28
- *
29
- * @param {object} [_.urlSearchParams]
30
- * Parameters that should be added to the request url
31
- *
32
- * @param {object} [_.headers]
33
- * Object that contains custom headers. A header is a name, value pair.
34
- *
35
- * e.g. options.headers = { "content-type": "application/json" }
36
- *
37
- * @param {requestHandler} [_.requestHandler]
38
- *
39
- * @param {number} [_.timeoutMs]
40
- * If defined, this request will abort after the specified number of
41
- * milliseconds. Values above the the built-in request timeout won't work.
42
- *
43
- * @returns {Promise<Response>} responsePromise
44
- */
45
- export async function httpGet({
46
- url,
47
- urlSearchParams,
48
- headers,
49
- requestHandler,
50
- timeoutMs
51
- }) {
52
- const responsePromise = httpRequest({
53
- method: METHOD_GET,
54
- url,
55
- urlSearchParams,
56
- headers,
57
- requestHandler,
58
- timeoutMs
59
- });
60
-
61
- return await waitForAndCheckResponse(responsePromise, url);
62
- }
63
-
64
- /**
65
- * Make POST request
66
- *
67
- * @param {object} _
68
- *
69
- * @param {string|URL} _.url - Url string or URL object
70
- *
71
- * @param {any} [_.body] - POST data
72
- *
73
- * @param {object} [_.headers]
74
- * Object that contains custom headers. A header is a name, value pair.
75
- *
76
- * e.g. options.headers = { "content-type": "application/json" }
77
- *
78
- * @param {requestHandler} [_.requestHandler]
79
- *
80
- * @param {number} [_.timeoutMs]
81
- * If defined, this request will abort after the specified number of
82
- * milliseconds. Values above the the built-in request timeout won't work.
83
- *
84
- * @returns {Promise<Response>} responsePromise
85
- */
86
- export async function httpPost({
87
- url,
88
- body = null,
89
- headers,
90
- requestHandler,
91
- timeoutMs
92
- }) {
93
- const responsePromise = httpRequest({
94
- method: METHOD_POST,
95
- url,
96
- body,
97
- headers,
98
- requestHandler,
99
- timeoutMs
100
- });
101
-
102
- return await waitForAndCheckResponse(responsePromise, url);
103
- }
104
-
105
- // -----------------------------------------------------------------------------
106
-
107
- /**
108
- * Make an HTTP request
109
- * - This is a low level function, consider using
110
- * httpGet, httpPost, jsonGet or jsonPost instead
111
- *
112
- * @param {object} _
113
- *
114
- * @param {string|URL} _.url - Url string or URL object
115
- *
116
- * @param {string} _.method - Request method: METHOD_GET | METHOD_POST
117
- *
118
- * @param {object} [_.urlSearchParams] - URL search parameters as key-value pairs
119
- *
120
- * @param {any} [_.body] - POST data
121
- *
122
- * @param {object} [_.headers]
123
- * Object that contains custom headers. A header is a name, value pair.
124
- *
125
- * e.g. options.headers = { "content-type": "application/json" }
126
- *
127
- * @param {requestHandler} [_.requestHandler]
128
- *
129
- * @param {number} [_.timeoutMs]
130
- * If defined, this request will abort after the specified number of
131
- * milliseconds. Values above the the built-in request timeout won't work.
132
- *
133
- * @throws TypeError - If a network error occurred
134
- *
135
- * @note Check the `ok` property of the resolved response to check if the
136
- * response was successfull (e.g. in case of a 404, ok is false)
137
- *
138
- * @returns {Promise<Response>} responsePromise
139
- */
140
- export async function httpRequest({
141
- method,
142
- url,
143
- urlSearchParams = null,
144
- body = null,
145
- headers,
146
- requestHandler,
147
- timeoutMs
148
- }) {
149
- url = toURL(url);
150
-
151
- // @see https://developer.mozilla.org/en-US/docs/Web/API/Headers
152
-
153
- const requestHeaders = new Headers();
154
-
155
- if (headers) {
156
- setRequestHeaders(requestHeaders, headers);
157
-
158
- if (
159
- headers[CONTENT_TYPE] === APPLICATION_JSON &&
160
- typeof body !== 'string'
161
- ) {
162
- throw new Error(
163
- `Trying to send request with [content-type:${APPLICATION_JSON}], ` +
164
- 'but body is not a (JSON encoded) string.'
165
- );
166
- }
167
- // IDEA: try to decode the body to catch errors on client side
168
- }
169
-
170
- /** @type {RequestInit} */
171
- const init = {
172
- mode: 'cors',
173
- cache: 'no-cache',
174
- credentials: 'omit',
175
- redirect: 'follow',
176
- referrerPolicy: 'no-referrer',
177
- headers: requestHeaders
178
- };
179
-
180
- // Allow search params also for other request types than GET
181
-
182
- if (urlSearchParams) {
183
- if (!(urlSearchParams instanceof URLSearchParams)) {
184
- throw new Error(
185
- 'Invalid parameter [urlSearchParams] ' +
186
- '(expected instanceof URLSearchParams)'
187
- );
188
- }
189
-
190
- const existingParams = url.searchParams;
191
-
192
- for (const [name, value] of urlSearchParams.entries()) {
193
- if (existingParams.has(name)) {
194
- throw new Error(
195
- `Cannot set URL search parameter [${name}] ` +
196
- `in url [${url.href}] (already set)`
197
- );
198
- }
199
-
200
- existingParams.set(name, value);
201
- } // end for
202
- }
203
-
204
- //
205
- // Sort search params to make the url nicer
206
- //
207
- url.searchParams.sort();
208
-
209
- // console.log( "url", url );
210
-
211
- init.method = method;
212
-
213
- if (METHOD_POST === method) {
214
- init.body = body || null; /* : JSON.stringify( body ) */
215
- }
216
-
217
- // @see https://developer.mozilla.org/en-US/docs/Web/API/Request/Request
218
-
219
- // console.log( "init", init );
220
- // console.log( "headers", init.headers );
221
-
222
- const request = new Request(url, init);
223
-
224
- // @see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/abort
225
-
226
- const controller = new AbortController();
227
- const signal = controller.signal;
228
-
229
- //
230
- // A fetch() promise will reject with a TypeError when a network error
231
- // is encountered or CORS is misconfigured on the server-side,
232
- // although this usually means permission issues or similar
233
- // — a 404 does not constitute a network error, for example.
234
- // An accurate check for a successful fetch() would include checking
235
- // that the promise resolved, then checking that the Response.ok property
236
- // has a value of true. The code would look something like this:
237
- //
238
- // fetch()
239
- // .then( () => {
240
- // if( !response.ok ) {
241
- // throw new Error('Network response was not OK');
242
- // }
243
- // ...
244
- // }
245
- // .catch((error) => { .. }
246
- //
247
-
248
- const promise = fetch(request, { signal });
249
-
250
- if (requestHandler || timeoutMs) {
251
- /**
252
- * @type {(reason?: any) => void}
253
- */
254
- const abort = (reason) => {
255
- if (!reason) {
256
- reason = new AbortError(`Request [${url.href}] aborted`);
257
- }
258
-
259
- controller.abort(reason);
260
- };
261
-
262
- /**
263
- * Function that can be used to set a timeout on a request
264
- *
265
- * @param {number} delayMs
266
- */
267
- const timeout = (delayMs = 10000) => {
268
- expect.positiveNumber(delayMs);
269
-
270
- const timerId = setTimeout(() => {
271
- controller.abort(
272
- new TimeoutError(`Request [${url.href}] timed out [${delayMs}]`)
273
- );
274
- }, delayMs);
275
-
276
- promise.finally(() => {
277
- clearTimeout(timerId);
278
- });
279
- };
280
-
281
- if (timeoutMs) {
282
- timeout(timeoutMs);
283
- }
284
-
285
- if (requestHandler) {
286
- expect.function(requestHandler);
287
-
288
- requestHandler({ controller, abort, timeout });
289
- }
290
- }
291
-
292
- // response promise
293
- return promise;
294
- }
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
+
6
+ import { AbortError, TimeoutError } from '../../constants/errors/api.js';
7
+
8
+ import * as expect from '../expect/index.js';
9
+
10
+ import { toURL } from './url.js';
11
+ import { setRequestHeaders } from './headers.js';
12
+ import { waitForAndCheckResponse } from './response.js';
13
+
14
+ /**
15
+ * @callback requestHandler
16
+ * @param {Object} _
17
+ * @param {AbortController} _.controller
18
+ * @param {( reason?: Error ) => void} _.abort
19
+ * @param {( delayMs: number) => void} _.timeout
20
+ */
21
+
22
+ /**
23
+ * Make GET request
24
+ *
25
+ * @param {object} _
26
+ *
27
+ * @param {string|URL} _.url - Url string or URL object
28
+ *
29
+ * @param {object} [_.urlSearchParams]
30
+ * Parameters that should be added to the request url
31
+ *
32
+ * @param {object} [_.headers]
33
+ * Object that contains custom headers. A header is a name, value pair.
34
+ *
35
+ * e.g. options.headers = { "content-type": "application/json" }
36
+ *
37
+ * @param {requestHandler} [_.requestHandler]
38
+ *
39
+ * @param {number} [_.timeoutMs]
40
+ * If defined, this request will abort after the specified number of
41
+ * milliseconds. Values above the the built-in request timeout won't work.
42
+ *
43
+ * @returns {Promise<Response>} responsePromise
44
+ */
45
+ export async function httpGet({
46
+ url,
47
+ urlSearchParams,
48
+ headers,
49
+ requestHandler,
50
+ timeoutMs
51
+ }) {
52
+ const responsePromise = httpRequest({
53
+ method: METHOD_GET,
54
+ url,
55
+ urlSearchParams,
56
+ headers,
57
+ requestHandler,
58
+ timeoutMs
59
+ });
60
+
61
+ return await waitForAndCheckResponse(responsePromise, url);
62
+ }
63
+
64
+ /**
65
+ * Make POST request
66
+ *
67
+ * @param {object} _
68
+ *
69
+ * @param {string|URL} _.url - Url string or URL object
70
+ *
71
+ * @param {any} [_.body] - POST data
72
+ *
73
+ * @param {object} [_.headers]
74
+ * Object that contains custom headers. A header is a name, value pair.
75
+ *
76
+ * e.g. options.headers = { "content-type": "application/json" }
77
+ *
78
+ * @param {requestHandler} [_.requestHandler]
79
+ *
80
+ * @param {number} [_.timeoutMs]
81
+ * If defined, this request will abort after the specified number of
82
+ * milliseconds. Values above the the built-in request timeout won't work.
83
+ *
84
+ * @returns {Promise<Response>} responsePromise
85
+ */
86
+ export async function httpPost({
87
+ url,
88
+ body = null,
89
+ headers,
90
+ requestHandler,
91
+ timeoutMs
92
+ }) {
93
+ const responsePromise = httpRequest({
94
+ method: METHOD_POST,
95
+ url,
96
+ body,
97
+ headers,
98
+ requestHandler,
99
+ timeoutMs
100
+ });
101
+
102
+ return await waitForAndCheckResponse(responsePromise, url);
103
+ }
104
+
105
+ // -----------------------------------------------------------------------------
106
+
107
+ /**
108
+ * Make an HTTP request
109
+ * - This is a low level function, consider using
110
+ * httpGet, httpPost, jsonGet or jsonPost instead
111
+ *
112
+ * @param {object} _
113
+ *
114
+ * @param {string|URL} _.url - Url string or URL object
115
+ *
116
+ * @param {string} _.method - Request method: METHOD_GET | METHOD_POST
117
+ *
118
+ * @param {object} [_.urlSearchParams] - URL search parameters as key-value pairs
119
+ *
120
+ * @param {any} [_.body] - POST data
121
+ *
122
+ * @param {object} [_.headers]
123
+ * Object that contains custom headers. A header is a name, value pair.
124
+ *
125
+ * e.g. options.headers = { "content-type": "application/json" }
126
+ *
127
+ * @param {requestHandler} [_.requestHandler]
128
+ *
129
+ * @param {number} [_.timeoutMs]
130
+ * If defined, this request will abort after the specified number of
131
+ * milliseconds. Values above the the built-in request timeout won't work.
132
+ *
133
+ * @throws TypeError - If a network error occurred
134
+ *
135
+ * @note Check the `ok` property of the resolved response to check if the
136
+ * response was successfull (e.g. in case of a 404, ok is false)
137
+ *
138
+ * @returns {Promise<Response>} responsePromise
139
+ */
140
+ export async function httpRequest({
141
+ method,
142
+ url,
143
+ urlSearchParams = null,
144
+ body = null,
145
+ headers,
146
+ requestHandler,
147
+ timeoutMs
148
+ }) {
149
+ url = toURL(url);
150
+
151
+ // @see https://developer.mozilla.org/en-US/docs/Web/API/Headers
152
+
153
+ const requestHeaders = new Headers();
154
+
155
+ if (headers) {
156
+ setRequestHeaders(requestHeaders, headers);
157
+
158
+ if (
159
+ headers[CONTENT_TYPE] === APPLICATION_JSON &&
160
+ typeof body !== 'string'
161
+ ) {
162
+ throw new Error(
163
+ `Trying to send request with [content-type:${APPLICATION_JSON}], ` +
164
+ 'but body is not a (JSON encoded) string.'
165
+ );
166
+ }
167
+ // IDEA: try to decode the body to catch errors on client side
168
+ }
169
+
170
+ /** @type {RequestInit} */
171
+ const init = {
172
+ mode: 'cors',
173
+ cache: 'no-cache',
174
+ credentials: 'omit',
175
+ redirect: 'follow',
176
+ referrerPolicy: 'no-referrer',
177
+ headers: requestHeaders
178
+ };
179
+
180
+ // Allow search params also for other request types than GET
181
+
182
+ if (urlSearchParams) {
183
+ if (!(urlSearchParams instanceof URLSearchParams)) {
184
+ throw new Error(
185
+ 'Invalid parameter [urlSearchParams] ' +
186
+ '(expected instanceof URLSearchParams)'
187
+ );
188
+ }
189
+
190
+ const existingParams = url.searchParams;
191
+
192
+ for (const [name, value] of urlSearchParams.entries()) {
193
+ if (existingParams.has(name)) {
194
+ throw new Error(
195
+ `Cannot set URL search parameter [${name}] ` +
196
+ `in url [${url.href}] (already set)`
197
+ );
198
+ }
199
+
200
+ existingParams.set(name, value);
201
+ } // end for
202
+ }
203
+
204
+ //
205
+ // Sort search params to make the url nicer
206
+ //
207
+ url.searchParams.sort();
208
+
209
+ // console.log( "url", url );
210
+
211
+ init.method = method;
212
+
213
+ if (METHOD_POST === method) {
214
+ init.body = body || null; /* : JSON.stringify( body ) */
215
+ }
216
+
217
+ // @see https://developer.mozilla.org/en-US/docs/Web/API/Request/Request
218
+
219
+ // console.log( "init", init );
220
+ // console.log( "headers", init.headers );
221
+
222
+ const request = new Request(url, init);
223
+
224
+ // @see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/abort
225
+
226
+ const controller = new AbortController();
227
+ const signal = controller.signal;
228
+
229
+ //
230
+ // A fetch() promise will reject with a TypeError when a network error
231
+ // is encountered or CORS is misconfigured on the server-side,
232
+ // although this usually means permission issues or similar
233
+ // — a 404 does not constitute a network error, for example.
234
+ // An accurate check for a successful fetch() would include checking
235
+ // that the promise resolved, then checking that the Response.ok property
236
+ // has a value of true. The code would look something like this:
237
+ //
238
+ // fetch()
239
+ // .then( () => {
240
+ // if( !response.ok ) {
241
+ // throw new Error('Network response was not OK');
242
+ // }
243
+ // ...
244
+ // }
245
+ // .catch((error) => { .. }
246
+ //
247
+
248
+ const promise = fetch(request, { signal });
249
+
250
+ if (requestHandler || timeoutMs) {
251
+ /**
252
+ * @type {(reason?: any) => void}
253
+ */
254
+ const abort = (reason) => {
255
+ if (!reason) {
256
+ reason = new AbortError(`Request [${url.href}] aborted`);
257
+ }
258
+
259
+ controller.abort(reason);
260
+ };
261
+
262
+ /**
263
+ * Function that can be used to set a timeout on a request
264
+ *
265
+ * @param {number} delayMs
266
+ */
267
+ const timeout = (delayMs = 10000) => {
268
+ expect.positiveNumber(delayMs);
269
+
270
+ const timerId = setTimeout(() => {
271
+ controller.abort(
272
+ new TimeoutError(`Request [${url.href}] timed out [${delayMs}]`)
273
+ );
274
+ }, delayMs);
275
+
276
+ promise.finally(() => {
277
+ clearTimeout(timerId);
278
+ });
279
+ };
280
+
281
+ if (timeoutMs) {
282
+ timeout(timeoutMs);
283
+ }
284
+
285
+ if (requestHandler) {
286
+ expect.function(requestHandler);
287
+
288
+ requestHandler({ controller, abort, timeout });
289
+ }
290
+ }
291
+
292
+ // response promise
293
+ return promise;
294
+ }
@@ -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 '../../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 '../../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';