@svta/cml-utils 1.5.1 → 1.6.1
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 +12 -20
- package/dist/index.d.ts +48 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -28
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -21,39 +21,31 @@ import {
|
|
|
21
21
|
} from "@svta/cml-utils";
|
|
22
22
|
|
|
23
23
|
// Unescape HTML entities
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
console.log(unescapeHtml(""<Hello&World>""));
|
|
25
|
+
// "<Hello&World>"
|
|
26
26
|
|
|
27
27
|
// Convert string to Uint16Array
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
uint16Array ===
|
|
31
|
-
new Uint16Array([104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100])
|
|
32
|
-
);
|
|
28
|
+
console.log(stringToUint16("hello world"));
|
|
29
|
+
// Uint16Array(11) [104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]
|
|
33
30
|
|
|
34
31
|
// Convert hex string to ArrayBuffer
|
|
35
32
|
const hex = "a0564af760c2d94b9610c7ae70d5d970";
|
|
36
33
|
const arrayBuffer = hexToArrayBuffer(hex);
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
]);
|
|
40
|
-
assert(new Uint8Array(arrayBuffer) === expected);
|
|
34
|
+
console.log(new Uint8Array(arrayBuffer));
|
|
35
|
+
// Uint8Array(16) [160, 86, 74, 247, 96, 194, 217, 75, 150, 16, 199, 174, 112, 213, 217, 112]
|
|
41
36
|
|
|
42
37
|
// Decode base64
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
decoded ===
|
|
46
|
-
new Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100])
|
|
47
|
-
);
|
|
38
|
+
console.log(decodeBase64("SGVsbG8gV29ybGQ="));
|
|
39
|
+
// Uint8Array(11) [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]
|
|
48
40
|
|
|
49
41
|
// Convert ArrayBuffer to UUID
|
|
50
42
|
const data = new Uint8Array([
|
|
51
43
|
160, 86, 74, 247, 96, 194, 217, 75, 150, 16, 199, 174, 112, 213, 217, 112,
|
|
52
44
|
]);
|
|
53
|
-
|
|
54
|
-
|
|
45
|
+
console.log(arrayBufferToUuid(data.buffer));
|
|
46
|
+
// a0564af7-60c2-d94b-9610-c7ae70d5d970
|
|
55
47
|
|
|
56
48
|
// Convert ArrayBuffer to hex string
|
|
57
|
-
|
|
58
|
-
|
|
49
|
+
console.log(arrayBufferToHex(data.buffer));
|
|
50
|
+
// a0564af760c2d94b9610c7ae70d5d970
|
|
59
51
|
```
|
package/dist/index.d.ts
CHANGED
|
@@ -60,6 +60,9 @@ declare const base64decode: typeof decodeBase64;
|
|
|
60
60
|
* @returns The base64 encoded string
|
|
61
61
|
*
|
|
62
62
|
* @public
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* {@includeCode ../test/encodeBase64.test.ts#example}
|
|
63
66
|
*/
|
|
64
67
|
declare function encodeBase64(binary: Uint8Array): string;
|
|
65
68
|
//#endregion
|
|
@@ -156,15 +159,15 @@ type Encoding = ValueOf<typeof Encoding>;
|
|
|
156
159
|
*/
|
|
157
160
|
type DecodeTextOptions = {
|
|
158
161
|
/**
|
|
159
|
-
*
|
|
162
|
+
* The encoding to use. If omitted, the function tries to detect the encoding from the BOM.
|
|
160
163
|
*/
|
|
161
164
|
encoding?: Encoding;
|
|
162
165
|
};
|
|
163
166
|
//#endregion
|
|
164
167
|
//#region src/decodeText.d.ts
|
|
165
168
|
/**
|
|
166
|
-
* Converts an ArrayBuffer or ArrayBufferView to a string.
|
|
167
|
-
*
|
|
169
|
+
* Converts an ArrayBuffer or ArrayBufferView to a string. The function works like
|
|
170
|
+
* `TextDecoder.decode` and also supports environments without `TextDecoder`.
|
|
168
171
|
*
|
|
169
172
|
* @param data - The data to decode.
|
|
170
173
|
* @param options - The options for the decoding.
|
|
@@ -177,10 +180,31 @@ type DecodeTextOptions = {
|
|
|
177
180
|
*/
|
|
178
181
|
declare function decodeText(data: ArrayBufferLike | ArrayBufferView, options?: DecodeTextOptions): string;
|
|
179
182
|
//#endregion
|
|
183
|
+
//#region src/DeepReadonly.d.ts
|
|
184
|
+
/**
|
|
185
|
+
* Utility type that marks every property of a given type as `readonly`,
|
|
186
|
+
* recursively.
|
|
187
|
+
*
|
|
188
|
+
* `Readonly<T>` stops at the top level, so a nested object remains writable and
|
|
189
|
+
* `value.nested.field = …` still compiles. `DeepReadonly` applies at every depth,
|
|
190
|
+
* including through arrays.
|
|
191
|
+
*
|
|
192
|
+
* Functions keep their type, so callbacks on a value remain callable.
|
|
193
|
+
* Primitives keep their type.
|
|
194
|
+
*
|
|
195
|
+
* @typeParam T - The type to make deeply readonly.
|
|
196
|
+
*
|
|
197
|
+
* @example
|
|
198
|
+
* {@includeCode ../test/DeepReadonly.test.ts#example}
|
|
199
|
+
*
|
|
200
|
+
* @public
|
|
201
|
+
*/
|
|
202
|
+
type DeepReadonly<T> = T extends ((...args: never[]) => unknown) ? T : T extends readonly (infer U)[] ? readonly DeepReadonly<U>[] : T extends object ? { readonly [P in keyof T]: DeepReadonly<T[P]> } : T;
|
|
203
|
+
//#endregion
|
|
180
204
|
//#region src/encodeText.d.ts
|
|
181
205
|
/**
|
|
182
|
-
* Converts a string to a Uint8Array.
|
|
183
|
-
*
|
|
206
|
+
* Converts a string to a Uint8Array. The function works like
|
|
207
|
+
* `TextEncoder.encode` and also supports environments without `TextEncoder`.
|
|
184
208
|
*
|
|
185
209
|
* @param data - The string to encode.
|
|
186
210
|
* @returns The Uint8Array representation of the string.
|
|
@@ -202,7 +226,7 @@ type ExclusiveRecord<K extends PropertyKey, V> = { [P in K]: Record<P, V> & Part
|
|
|
202
226
|
//#endregion
|
|
203
227
|
//#region src/ResourceTiming.d.ts
|
|
204
228
|
/**
|
|
205
|
-
*
|
|
229
|
+
* A subset of the `PerformanceResourceTiming` interface.
|
|
206
230
|
* https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming
|
|
207
231
|
*
|
|
208
232
|
* @public
|
|
@@ -228,10 +252,10 @@ type ResourceTiming = {
|
|
|
228
252
|
//#endregion
|
|
229
253
|
//#region src/getBandwidthBps.d.ts
|
|
230
254
|
/**
|
|
231
|
-
* Converts a ResourceTiming sample to bandwidth in bits per second
|
|
255
|
+
* Converts a ResourceTiming sample to bandwidth in bits per second.
|
|
232
256
|
*
|
|
233
257
|
* @param sample - A ResourceTiming sample
|
|
234
|
-
* @returns
|
|
258
|
+
* @returns The bandwidth in bits per second.
|
|
235
259
|
*
|
|
236
260
|
* @public
|
|
237
261
|
*/
|
|
@@ -239,7 +263,7 @@ declare function getBandwidthBps(sample: ResourceTiming): number;
|
|
|
239
263
|
//#endregion
|
|
240
264
|
//#region src/getBaseUrl.d.ts
|
|
241
265
|
/**
|
|
242
|
-
*
|
|
266
|
+
* Gets the base URL from a full URL or a URL object.
|
|
243
267
|
*
|
|
244
268
|
* @param fullUrl - The full URL or URL object.
|
|
245
269
|
* @returns The base URL.
|
|
@@ -267,12 +291,11 @@ declare function hexToArrayBuffer(hex: string): ArrayBuffer;
|
|
|
267
291
|
//#endregion
|
|
268
292
|
//#region src/isArrayBufferLike.d.ts
|
|
269
293
|
/**
|
|
270
|
-
* Checks if the given value is `ArrayBufferLike
|
|
271
|
-
*
|
|
294
|
+
* Checks if the given value is `ArrayBufferLike`: an `ArrayBuffer` or a
|
|
295
|
+
* `SharedArrayBuffer`.
|
|
272
296
|
*
|
|
273
|
-
*
|
|
274
|
-
*
|
|
275
|
-
* isolated browser contexts.
|
|
297
|
+
* The function also works where `SharedArrayBuffer` is not defined, such as
|
|
298
|
+
* browser contexts without cross-origin isolation.
|
|
276
299
|
*
|
|
277
300
|
* @param value - The value to check.
|
|
278
301
|
* @returns `true` if the value is an `ArrayBuffer` or `SharedArrayBuffer`.
|
|
@@ -325,7 +348,7 @@ type HttpRequest<D = any> = {
|
|
|
325
348
|
*/
|
|
326
349
|
body?: BodyInit;
|
|
327
350
|
/**
|
|
328
|
-
* The
|
|
351
|
+
* The type that the response from the server must be compatible with.
|
|
329
352
|
*/
|
|
330
353
|
responseType?: RequestResponseType;
|
|
331
354
|
/**
|
|
@@ -333,16 +356,16 @@ type HttpRequest<D = any> = {
|
|
|
333
356
|
*/
|
|
334
357
|
headers?: Record<string, string>;
|
|
335
358
|
/**
|
|
336
|
-
*
|
|
359
|
+
* Whether the user agent should send or receive cookies from the other domain in cross-origin requests.
|
|
337
360
|
*/
|
|
338
361
|
credentials?: RequestCredentials;
|
|
339
362
|
/**
|
|
340
|
-
* The mode of the request
|
|
363
|
+
* The mode of the request, for example cors, no-cors, or same-origin.
|
|
341
364
|
*/
|
|
342
365
|
mode?: RequestMode;
|
|
343
366
|
/**
|
|
344
|
-
* The number of milliseconds the request
|
|
345
|
-
* If
|
|
367
|
+
* The number of milliseconds the request may take before it is terminated.
|
|
368
|
+
* If the value is undefined or 0, there is no timeout.
|
|
346
369
|
*/
|
|
347
370
|
timeout?: number;
|
|
348
371
|
/**
|
|
@@ -391,7 +414,7 @@ type HttpResponse<R extends HttpRequest = HttpRequest> = {
|
|
|
391
414
|
*/
|
|
392
415
|
url?: string;
|
|
393
416
|
/**
|
|
394
|
-
*
|
|
417
|
+
* Whether the request was redirected.
|
|
395
418
|
*/
|
|
396
419
|
redirected?: boolean;
|
|
397
420
|
/**
|
|
@@ -431,8 +454,8 @@ type Request = HttpRequest;
|
|
|
431
454
|
//#endregion
|
|
432
455
|
//#region src/roundToEven.d.ts
|
|
433
456
|
/**
|
|
434
|
-
*
|
|
435
|
-
*
|
|
457
|
+
* Rounds a value with the procedure from step 2 of the "Serializing a Decimal" specification.
|
|
458
|
+
* The style is known as "even rounding", "banker's rounding", or "commercial rounding".
|
|
436
459
|
*
|
|
437
460
|
* @param value - The value to round
|
|
438
461
|
* @param precision - The number of decimal places to round to
|
|
@@ -485,7 +508,7 @@ declare function unescapeHtml(text: string): string;
|
|
|
485
508
|
/**
|
|
486
509
|
* Constructs a relative path from a URL.
|
|
487
510
|
*
|
|
488
|
-
* If `url` is already
|
|
511
|
+
* If `url` is already relative, or its origin differs from `base`, the function returns `url` unchanged.
|
|
489
512
|
*
|
|
490
513
|
* @param url - The destination URL
|
|
491
514
|
* @param base - The base URL
|
|
@@ -500,7 +523,7 @@ declare function urlToRelativePath(url: string, base: string): string;
|
|
|
500
523
|
//#endregion
|
|
501
524
|
//#region src/uuid.d.ts
|
|
502
525
|
/**
|
|
503
|
-
*
|
|
526
|
+
* Generates a random v4 UUID
|
|
504
527
|
*
|
|
505
528
|
* @returns A random v4 UUID
|
|
506
529
|
*
|
|
@@ -533,5 +556,5 @@ declare function uuidToArrayBuffer(uuid: string): ArrayBuffer;
|
|
|
533
556
|
*/
|
|
534
557
|
type ValueOrArray<T> = T | T[];
|
|
535
558
|
//#endregion
|
|
536
|
-
export { DecodeTextOptions, Encoding, ExclusiveRecord, HttpRequest, HttpResponse, Request, RequestResponseType, ResourceTiming, ResponseTypeMap, TypedResult, UTF_16, UTF_16_BE, UTF_16_LE, UTF_8, ValueOf, ValueOrArray, XmlNode, arrayBufferToHex, arrayBufferToUuid, base64decode, base64encode, convertUint8ToUint16, decodeBase64, decodeText, encodeBase64, encodeText, getBandwidthBps, getBaseUrl, hexToArrayBuffer, isArrayBufferLike, roundToEven, stringToUint16, unescapeHtml, urlToRelativePath, uuid, uuidToArrayBuffer };
|
|
559
|
+
export { DecodeTextOptions, DeepReadonly, Encoding, ExclusiveRecord, HttpRequest, HttpResponse, Request, RequestResponseType, ResourceTiming, ResponseTypeMap, TypedResult, UTF_16, UTF_16_BE, UTF_16_LE, UTF_8, ValueOf, ValueOrArray, XmlNode, arrayBufferToHex, arrayBufferToUuid, base64decode, base64encode, convertUint8ToUint16, decodeBase64, decodeText, encodeBase64, encodeText, getBandwidthBps, getBaseUrl, hexToArrayBuffer, isArrayBufferLike, roundToEven, stringToUint16, unescapeHtml, urlToRelativePath, uuid, uuidToArrayBuffer };
|
|
537
560
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":["base64decode: typeof decodeBase64","base64encode: typeof encodeBase64"],"sources":["../src/arrayBufferToHex.ts","../src/arrayBufferToUuid.ts","../src/decodeBase64.ts","../src/base64decode.ts","../src/encodeBase64.ts","../src/base64encode.ts","../src/convertUint8ToUint16.ts","../src/UTF_16.ts","../src/UTF_16_BE.ts","../src/UTF_16_LE.ts","../src/UTF_8.ts","../src/ValueOf.ts","../src/Encoding.ts","../src/DecodeTextOptions.ts","../src/decodeText.ts","../src/encodeText.ts","../src/ExclusiveRecord.ts","../src/ResourceTiming.ts","../src/getBandwidthBps.ts","../src/getBaseUrl.ts","../src/hexToArrayBuffer.ts","../src/isArrayBufferLike.ts","../src/RequestResponseType.ts","../src/HttpRequest.ts","../src/XmlNode.ts","../src/ResponseTypeMap.ts","../src/HttpResponse.ts","../src/Request.ts","../src/roundToEven.ts","../src/stringToUint16.ts","../src/TypedResult.ts","../src/unescapeHtml.ts","../src/urlToRelativePath.ts","../src/uuid.ts","../src/uuidToArrayBuffer.ts","../src/ValueOrArray.ts"],"sourcesContent":[],"mappings":";;AAWA;;;;ACEA;;;;ACLA;;iBFGgB,gBAAA,SAAyB;;;;AAAzC;;;;ACEA;;;;ACLA;;iBDKgB,iBAAA,SAA0B;;;;ADF1C;;;;ACEA;;;iBCLgB,YAAA,eAA2B;;;AFG3C;;;;ACEA;;;;ACLA;;;;ACMaA,cAAAA,YAAqB,EAAA,OAAA,YAAA;;;;AHHlC;;;;ACEA
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":["base64decode: typeof decodeBase64","base64encode: typeof encodeBase64"],"sources":["../src/arrayBufferToHex.ts","../src/arrayBufferToUuid.ts","../src/decodeBase64.ts","../src/base64decode.ts","../src/encodeBase64.ts","../src/base64encode.ts","../src/convertUint8ToUint16.ts","../src/UTF_16.ts","../src/UTF_16_BE.ts","../src/UTF_16_LE.ts","../src/UTF_8.ts","../src/ValueOf.ts","../src/Encoding.ts","../src/DecodeTextOptions.ts","../src/decodeText.ts","../src/DeepReadonly.ts","../src/encodeText.ts","../src/ExclusiveRecord.ts","../src/ResourceTiming.ts","../src/getBandwidthBps.ts","../src/getBaseUrl.ts","../src/hexToArrayBuffer.ts","../src/isArrayBufferLike.ts","../src/RequestResponseType.ts","../src/HttpRequest.ts","../src/XmlNode.ts","../src/ResponseTypeMap.ts","../src/HttpResponse.ts","../src/Request.ts","../src/roundToEven.ts","../src/stringToUint16.ts","../src/TypedResult.ts","../src/unescapeHtml.ts","../src/urlToRelativePath.ts","../src/uuid.ts","../src/uuidToArrayBuffer.ts","../src/ValueOrArray.ts"],"sourcesContent":[],"mappings":";;AAWA;;;;ACEA;;;;ACLA;;iBFGgB,gBAAA,SAAyB;;;;AAAzC;;;;ACEA;;;;ACLA;;iBDKgB,iBAAA,SAA0B;;;;ADF1C;;;;ACEA;;;iBCLgB,YAAA,eAA2B;;;AFG3C;;;;ACEA;;;;ACLA;;;;ACMaA,cAAAA,YAAqB,EAAA,OAAA,YAAA;;;;AHHlC;;;;ACEA;;;;ACLA;;iBEKgB,YAAA,SAAqB;;;AJFrC;;;;ACEA;;;;ACLA;;;;ACMaA,cEAAC,YFAqB,EAAA,OEAA,YFAA;;;;AHHlC;;;;ACEA;;;iBKLgB,oBAAA,QAA4B,aAAa;;;;ANGzD;;;;ACEgB,cMRH,MAAA,GNQG,QAA0B;;;;ADF1C;;;;ACEgB,cORH,SAAA,GPQG,UAA0B;;;;ADF1C;;;;ACEgB,cQRH,SAAA,GRQG,UAA0B;;;;ADF1C;;;;ACEgB,cSRH,KAAA,GTQG,OAA0B;;;;ADF1C;;;;ACEgB,KURJ,OVQI,CAAA,CAAA,CAAA,GURS,CVQT,CAAA,MURiB,CVQjB,CAA0B;;;AAA1C;;;;ACLA;cUGa;wBACU;yBACE;ETCzB,SAAaD,OAAAA,EAAqB,OSAJ,STAI;2BSCJ;;;ARF9B;;;;ACCaC,KOSD,QAAA,GAAW,OPTW,CAAA,OOSI,QPTJ,CAAA;;;ALHlC;;;;ACEA;KYNY,iBAAA;;;AXCZ;aWGY;;;;AbAZ;;;;ACEA;;;;ACLA;;;;ACMA;iBWMgB,UAAA,OAAiB,kBAAkB,2BAA0B;;;;AdT7E;;;;ACEA;;;;ACLA;;;;ACMA;;;;ACDA;KWKY,kBAAkB,4CAA0C,IACrE,0CAA0C,aAAa,OACvD,0CAA0C,IAAI,aAAa,EAAE,QAC7D;;;;AfVH;;;;ACEA;;;;ACLA;;;iBcKgB,UAAA,gBAA0B;;;;AhBF1C;;;;ACEgB,KgBRJ,ehBQI,WgBRsB,0BAC/B,IAAI,OAAO,GAAG,KACpB,QAAQ,OAAO,QAAQ,GAAG,4CACV,IAAI,EAAE,eAErB;;;;AjBCF;;;;ACEA;KiBPY,cAAA;;;AhBEZ;;;;ACMA;;;;ACDA;;;;ACCA;;;;;ALHA;;;;ACEA;;;;ACLgB,iBiBEA,eAAA,CjBF2B,MAAA,EiBEH,cjBFG,CAAA,EAAA,MAAA;;;;AFG3C;;;;ACEA;;;;ACLA;;iBkBGgB,UAAA,mBAA6B;;;;ApBA7C;;;;ACEA;;;;ACLA;;iBmBGgB,gBAAA,eAA+B;;;;ArBA/C;;;;ACEA;;;;ACLA;;;;ACMA;;iBmBCgB,iBAAA,2BAA4C;;;AtBJ5D;;;;ACEA;;;csBJa;ErBDb,SAAgB,IAAA,EAAA,MAAA;;;;ECMhB,SAAaD,QAAAA,EAAqB,UAAA;;;;ACDlC;;KmBQY,mBAAA,GAAsB,eAAe;;;AvBVjD;;;;ACEA;KuBNY;;;AtBCZ;;;;ACMA;;;;ACDA;SoBSQ;;;AnBRR;iBmBagB;;;AlBnBhB;YkBwBW;;;AjB3BX;gBiBgCe;;;AhBhCf;SgBqCQ;;;AfrCR;;;;ACAA;;ecgDc;;;;;AxB1Cd;;;;ACEgB,KwBRJ,OAAA,GxBQI;;;cwBLH;EvBAb,UAAgB,EuBCH,OvBDG,EAAA;;;kBuBIC;AtBEjB,CAAA;;;AHHA;;;;ACEA;KyBNY,gDACX,yBACA,4BACA,mBAAmB,OACnB,0BAA0B,cAC1B,uBAAuB,UACvB,qBAAqB;;;;;AzBAtB;;;K0BJY,uBAAuB,cAAc;EzBDjD;;;WyBMU;ExBAV;;;;ECDA;;;;ECCA;;;;ECNA;;;;ECHA;;;;ECAA;;;YmBuCW;ElBvCX;;;SkB4CQ,gBAAgB;EjB5CxB;;;mBiBiDkB;AhBjDlB,CAAA;;;AXMA;;;;ACEA;;K2BLY,OAAA,GAAU;;;;A5BGtB;;;;ACEA;;;;ACLA;iB2BEgB,WAAA;;;;A7BChB;;;;ACEA;;;;ACLA;;iB4BGgB,cAAA,eAA6B;;;;A9BA7C;;;;ACEgB,K8BRJ,W9BQI;ECLhB,IAAgB,E6BFT,C7BES;Q6BDT;;;;;A/BIP;;;;ACEA;;;;ACLA;;iB8BKgB,YAAA;;;;AhCFhB;;;;ACEA;;;;ACLA;;;;ACMA;iB8BAgB,iBAAA;;;;AjCHhB;;;;ACEA;;;;ACLA;iBgCIgB,IAAA,CAAA;;;;AlCDhB;;;;ACEA;;;;ACLA;;iBiCKgB,iBAAA,gBAAiC;;;;AnCFjD;;;;ACEgB,KmCRJ,YnCQI,CAAA,CAAA,CAAA,GmCRc,CnCQd,GmCRkB,CnCQQ,EAAA"}
|
package/dist/index.js
CHANGED
|
@@ -63,6 +63,7 @@ const base64decode = decodeBase64;
|
|
|
63
63
|
|
|
64
64
|
//#endregion
|
|
65
65
|
//#region src/encodeBase64.ts
|
|
66
|
+
const CHUNK_SIZE = 32768;
|
|
66
67
|
/**
|
|
67
68
|
* Encodes binary data to base64
|
|
68
69
|
*
|
|
@@ -70,9 +71,17 @@ const base64decode = decodeBase64;
|
|
|
70
71
|
* @returns The base64 encoded string
|
|
71
72
|
*
|
|
72
73
|
* @public
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* {@includeCode ../test/encodeBase64.test.ts#example}
|
|
73
77
|
*/
|
|
74
78
|
function encodeBase64(binary) {
|
|
75
|
-
|
|
79
|
+
let text = "";
|
|
80
|
+
for (let i = 0; i < binary.length; i += CHUNK_SIZE) {
|
|
81
|
+
const chunk = binary.subarray(i, i + CHUNK_SIZE);
|
|
82
|
+
text += String.fromCharCode.apply(null, chunk);
|
|
83
|
+
}
|
|
84
|
+
return btoa(text);
|
|
76
85
|
}
|
|
77
86
|
|
|
78
87
|
//#endregion
|
|
@@ -113,12 +122,11 @@ function convertUint8ToUint16(input) {
|
|
|
113
122
|
//#endregion
|
|
114
123
|
//#region src/isArrayBufferLike.ts
|
|
115
124
|
/**
|
|
116
|
-
* Checks if the given value is `ArrayBufferLike
|
|
117
|
-
*
|
|
125
|
+
* Checks if the given value is `ArrayBufferLike`: an `ArrayBuffer` or a
|
|
126
|
+
* `SharedArrayBuffer`.
|
|
118
127
|
*
|
|
119
|
-
*
|
|
120
|
-
*
|
|
121
|
-
* isolated browser contexts.
|
|
128
|
+
* The function also works where `SharedArrayBuffer` is not defined, such as
|
|
129
|
+
* browser contexts without cross-origin isolation.
|
|
122
130
|
*
|
|
123
131
|
* @param value - The value to check.
|
|
124
132
|
* @returns `true` if the value is an `ArrayBuffer` or `SharedArrayBuffer`.
|
|
@@ -171,8 +179,8 @@ const UTF_8 = "utf-8";
|
|
|
171
179
|
//#endregion
|
|
172
180
|
//#region src/decodeText.ts
|
|
173
181
|
/**
|
|
174
|
-
* Converts an ArrayBuffer or ArrayBufferView to a string.
|
|
175
|
-
*
|
|
182
|
+
* Converts an ArrayBuffer or ArrayBufferView to a string. The function works like
|
|
183
|
+
* `TextDecoder.decode` and also supports environments without `TextDecoder`.
|
|
176
184
|
*
|
|
177
185
|
* @param data - The data to decode.
|
|
178
186
|
* @param options - The options for the decoding.
|
|
@@ -254,8 +262,8 @@ function decodeText(data, options = {}) {
|
|
|
254
262
|
//#endregion
|
|
255
263
|
//#region src/encodeText.ts
|
|
256
264
|
/**
|
|
257
|
-
* Converts a string to a Uint8Array.
|
|
258
|
-
*
|
|
265
|
+
* Converts a string to a Uint8Array. The function works like
|
|
266
|
+
* `TextEncoder.encode` and also supports environments without `TextEncoder`.
|
|
259
267
|
*
|
|
260
268
|
* @param data - The string to encode.
|
|
261
269
|
* @returns The Uint8Array representation of the string.
|
|
@@ -286,10 +294,10 @@ const Encoding = {
|
|
|
286
294
|
//#endregion
|
|
287
295
|
//#region src/getBandwidthBps.ts
|
|
288
296
|
/**
|
|
289
|
-
* Converts a ResourceTiming sample to bandwidth in bits per second
|
|
297
|
+
* Converts a ResourceTiming sample to bandwidth in bits per second.
|
|
290
298
|
*
|
|
291
299
|
* @param sample - A ResourceTiming sample
|
|
292
|
-
* @returns
|
|
300
|
+
* @returns The bandwidth in bits per second.
|
|
293
301
|
*
|
|
294
302
|
* @public
|
|
295
303
|
*/
|
|
@@ -301,7 +309,7 @@ function getBandwidthBps(sample) {
|
|
|
301
309
|
//#endregion
|
|
302
310
|
//#region src/getBaseUrl.ts
|
|
303
311
|
/**
|
|
304
|
-
*
|
|
312
|
+
* Gets the base URL from a full URL or a URL object.
|
|
305
313
|
*
|
|
306
314
|
* @param fullUrl - The full URL or URL object.
|
|
307
315
|
* @returns The base URL.
|
|
@@ -357,8 +365,8 @@ const RequestResponseType = {
|
|
|
357
365
|
//#endregion
|
|
358
366
|
//#region src/roundToEven.ts
|
|
359
367
|
/**
|
|
360
|
-
*
|
|
361
|
-
*
|
|
368
|
+
* Rounds a value with the procedure from step 2 of the "Serializing a Decimal" specification.
|
|
369
|
+
* The style is known as "even rounding", "banker's rounding", or "commercial rounding".
|
|
362
370
|
*
|
|
363
371
|
* @param value - The value to round
|
|
364
372
|
* @param precision - The number of decimal places to round to
|
|
@@ -436,7 +444,7 @@ function unescapeHtml(text) {
|
|
|
436
444
|
/**
|
|
437
445
|
* Constructs a relative path from a URL.
|
|
438
446
|
*
|
|
439
|
-
* If `url` is already
|
|
447
|
+
* If `url` is already relative, or its origin differs from `base`, the function returns `url` unchanged.
|
|
440
448
|
*
|
|
441
449
|
* @param url - The destination URL
|
|
442
450
|
* @param base - The base URL
|
|
@@ -458,23 +466,18 @@ function urlToRelativePath(url, base) {
|
|
|
458
466
|
if (to.origin !== from.origin) return url;
|
|
459
467
|
const toPath = to.pathname.split("/").slice(1);
|
|
460
468
|
const fromPath = from.pathname.split("/").slice(1, -1);
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
while (fromPath.length) {
|
|
468
|
-
fromPath.shift();
|
|
469
|
-
toPath.unshift("..");
|
|
470
|
-
}
|
|
471
|
-
return toPath.join("/") + to.search + to.hash;
|
|
469
|
+
let common = 0;
|
|
470
|
+
while (common < toPath.length - 1 && common < fromPath.length && toPath[common] === fromPath[common]) common++;
|
|
471
|
+
const ups = fromPath.length - common;
|
|
472
|
+
let relativePath = "../".repeat(ups) + toPath.slice(common).join("/");
|
|
473
|
+
if (ups === 0 && (relativePath === "" || relativePath.startsWith("/") || toPath[common].includes(":"))) relativePath = "./" + relativePath;
|
|
474
|
+
return relativePath + to.search + to.hash;
|
|
472
475
|
}
|
|
473
476
|
|
|
474
477
|
//#endregion
|
|
475
478
|
//#region src/uuid.ts
|
|
476
479
|
/**
|
|
477
|
-
*
|
|
480
|
+
* Generates a random v4 UUID
|
|
478
481
|
*
|
|
479
482
|
* @returns A random v4 UUID
|
|
480
483
|
*
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["base64decode: typeof decodeBase64","base64encode: typeof encodeBase64","view: DataView","char!: number","to: URL","error","uuid","uuid"],"sources":["../src/arrayBufferToHex.ts","../src/arrayBufferToUuid.ts","../src/decodeBase64.ts","../src/base64decode.ts","../src/encodeBase64.ts","../src/base64encode.ts","../src/convertUint8ToUint16.ts","../src/isArrayBufferLike.ts","../src/UTF_16.ts","../src/UTF_16_BE.ts","../src/UTF_16_LE.ts","../src/UTF_8.ts","../src/decodeText.ts","../src/encodeText.ts","../src/Encoding.ts","../src/getBandwidthBps.ts","../src/getBaseUrl.ts","../src/hexToArrayBuffer.ts","../src/RequestResponseType.ts","../src/roundToEven.ts","../src/stringToUint16.ts","../src/unescapeHtml.ts","../src/urlToRelativePath.ts","../src/uuid.ts","../src/uuidToArrayBuffer.ts"],"sourcesContent":["/**\n * Encodes an ArrayBuffer as a hexadecimal string.\n *\n * @param buffer - The ArrayBuffer to encode.\n * @returns The hexadecimal string representation.\n *\n * @public\n *\n * @example\n * {@includeCode ../test/arrayBufferToHex.test.ts#example}\n */\nexport function arrayBufferToHex(buffer: ArrayBuffer): string {\n\tconst view = new Uint8Array(buffer)\n\treturn view.reduce((result, byte) => result + byte.toString(16).padStart(2, '0'), '')\n}\n","import { arrayBufferToHex } from './arrayBufferToHex.ts'\n\n/**\n * Converts an ArrayBuffer to a UUID string.\n *\n * @param buffer - The ArrayBuffer to convert.\n * @returns The UUID string representation.\n *\n * @public\n *\n * @example\n * {@includeCode ../test/arrayBufferToUuid.test.ts#example}\n */\nexport function arrayBufferToUuid(buffer: ArrayBuffer): string {\n\tconst hex = arrayBufferToHex(buffer)\n\treturn hex.replace(/(.{8})(.{4})(.{4})(.{4})(.{12})/, '$1-$2-$3-$4-$5')\n}\n","/**\n * Decodes a base64 encoded string into binary data\n *\n * @param str - The base64 encoded string to decode\n * @returns The decoded binary data\n *\n * @public\n */\nexport function decodeBase64(str: string): Uint8Array {\n\treturn new Uint8Array([...atob(str)].map((a) => a.charCodeAt(0)))\n}\n","import { decodeBase64 } from './decodeBase64.ts'\n\n/**\n * Decodes a base64 encoded string into binary data\n *\n * @param str - The base64 encoded string to decode\n * @returns The decoded binary data\n *\n * @public\n *\n * @deprecated Use {@link decodeBase64} instead.\n *\n * @see {@link decodeBase64}\n */\nexport const base64decode: typeof decodeBase64 = decodeBase64\n","/**\n * Encodes binary data to base64\n *\n * @param binary - The binary data to encode\n * @returns The base64 encoded string\n *\n * @public\n */\nexport function encodeBase64(binary: Uint8Array): string {\n\treturn btoa(String.fromCharCode(...binary))\n}\n","import { encodeBase64 } from './encodeBase64.ts'\n\n/**\n * Encodes binary data to base64\n *\n * @param binary - The binary data to encode\n * @returns The base64 encoded string\n *\n * @public\n *\n * @deprecated Use {@link encodeBase64} instead.\n *\n * @see {@link encodeBase64}\n */\nexport const base64encode: typeof encodeBase64 = encodeBase64\n","/**\n * Converts a Uint8Array to a Uint16Array by aligning its buffer.\n *\n * @param input - The Uint8Array to convert\n * @returns A properly aligned Uint16Array\n *\n * @public\n */\nexport function convertUint8ToUint16(input: Uint8Array): Uint16Array {\n\tif (input.length % 2 !== 0) {\n\t\tconst padded = new Uint8Array(input.length + 1)\n\t\tpadded.set(input)\n\t\treturn new Uint16Array(padded.buffer)\n\t}\n\treturn new Uint16Array(input.buffer)\n}\n","/**\n * Checks if the given value is `ArrayBufferLike` (i.e. an `ArrayBuffer`\n * or a `SharedArrayBuffer`).\n *\n * This function safely handles environments where\n * `SharedArrayBuffer` is not defined, such as non-cross-origin\n * isolated browser contexts.\n *\n * @param value - The value to check.\n * @returns `true` if the value is an `ArrayBuffer` or `SharedArrayBuffer`.\n *\n * @public\n *\n * @example\n * {@includeCode ../test/isArrayBufferLike.test.ts#example}\n */\nexport function isArrayBufferLike(value: unknown): value is ArrayBufferLike {\n\treturn value instanceof ArrayBuffer\n\t\t|| (typeof SharedArrayBuffer !== 'undefined' && value instanceof SharedArrayBuffer)\n}\n","/**\n * UTF-16 Encoding.\n *\n * @public\n */\nexport const UTF_16 = 'utf-16'\n","/**\n * UTF-16 Big Endian Encoding.\n *\n * @public\n */\nexport const UTF_16_BE = 'utf-16be'\n","/**\n * UTF-16 Little Endian Encoding.\n *\n * @public\n */\nexport const UTF_16_LE = 'utf-16le'\n","/**\n * UTF-8 Encoding.\n *\n * @public\n */\nexport const UTF_8 = 'utf-8'\n","import type { DecodeTextOptions } from './DecodeTextOptions.ts'\nimport { isArrayBufferLike } from './isArrayBufferLike.ts'\nimport { UTF_16 } from './UTF_16.ts'\nimport { UTF_16_BE } from './UTF_16_BE.ts'\nimport { UTF_16_LE } from './UTF_16_LE.ts'\nimport { UTF_8 } from './UTF_8.ts'\n\n/**\n * Converts an ArrayBuffer or ArrayBufferView to a string. Similar to `TextDecoder.decode`\n * but with a fallback for environments that don't support `TextDecoder`.\n *\n * @param data - The data to decode.\n * @param options - The options for the decoding.\n * @returns The string representation of the ArrayBuffer.\n *\n * @public\n *\n * @example\n * {@includeCode ../test/decodeText.test.ts#example}\n */\nexport function decodeText(data: ArrayBufferLike | ArrayBufferView, options: DecodeTextOptions = {}): string {\n\tlet view: DataView\n\n\tif (isArrayBufferLike(data)) {\n\t\tview = new DataView(data)\n\t}\n\telse {\n\t\tview = new DataView(data.buffer, data.byteOffset, data.byteLength)\n\t}\n\n\tlet byteOffset = 0\n\tlet { encoding } = options\n\n\t// If no encoding is provided, try to detect it from the BOM\n\tif (!encoding) {\n\t\tconst first = view.getUint8(0)\n\t\tconst second = view.getUint8(1)\n\n\t\t// UTF-8 BOM\n\t\tif (first == 0xef && second == 0xbb && view.getUint8(2) == 0xbf) {\n\t\t\tencoding = UTF_8\n\t\t\tbyteOffset = 3\n\t\t}\n\t\t// UTF-16 BE BOM\n\t\telse if (first == 0xfe && second == 0xff) {\n\t\t\tencoding = UTF_16_BE\n\t\t\tbyteOffset = 2\n\t\t}\n\t\t// UTF-16 LE BOM\n\t\telse if (first == 0xff && second == 0xfe) {\n\t\t\tencoding = UTF_16_LE\n\t\t\tbyteOffset = 2\n\t\t}\n\t\telse {\n\t\t\tencoding = UTF_8\n\t\t}\n\t}\n\n\tif (typeof TextDecoder !== 'undefined') {\n\t\treturn new TextDecoder(encoding).decode(view)\n\t}\n\n\tconst { byteLength } = view\n\tconst endian = encoding !== UTF_16_BE\n\tlet str = ''\n\tlet char!: number\n\n\twhile (byteOffset < byteLength) {\n\t\tswitch (encoding) {\n\t\t\tcase UTF_8:\n\t\t\t\tchar = view.getUint8(byteOffset)\n\n\t\t\t\t// Single byte (ASCII)\n\t\t\t\tif (char < 128) {\n\t\t\t\t\tbyteOffset++\n\t\t\t\t}\n\t\t\t\t// 2-byte sequence\n\t\t\t\telse if (char >= 194 && char <= 223) {\n\t\t\t\t\tif (byteOffset + 1 < byteLength) {\n\t\t\t\t\t\tconst byte2 = view.getUint8(byteOffset + 1)\n\t\t\t\t\t\tif (byte2 >= 128 && byte2 <= 191) {\n\t\t\t\t\t\t\tchar = ((char & 0x1F) << 6) | (byte2 & 0x3F)\n\t\t\t\t\t\t\tbyteOffset += 2\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t// Invalid sequence, skip\n\t\t\t\t\t\t\tbyteOffset++\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// Incomplete sequence, skip\n\t\t\t\t\t\tbyteOffset++\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// 3-byte sequence\n\t\t\t\telse if (char >= 224 && char <= 239) {\n\t\t\t\t\tif (byteOffset + 2 <= byteLength - 1) {\n\t\t\t\t\t\tconst byte2 = view.getUint8(byteOffset + 1)\n\t\t\t\t\t\tconst byte3 = view.getUint8(byteOffset + 2)\n\t\t\t\t\t\tif (byte2 >= 128 && byte2 <= 191 && byte3 >= 128 && byte3 <= 191) {\n\t\t\t\t\t\t\tchar = ((char & 0x0F) << 12) | ((byte2 & 0x3F) << 6) | (byte3 & 0x3F)\n\t\t\t\t\t\t\tbyteOffset += 3\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t// Invalid sequence, skip\n\t\t\t\t\t\t\tbyteOffset++\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// Incomplete sequence, skip\n\t\t\t\t\t\tbyteOffset++\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// 4-byte sequence\n\t\t\t\telse if (char >= 240 && char <= 244) {\n\t\t\t\t\tif (byteOffset + 3 <= byteLength - 1) {\n\t\t\t\t\t\tconst byte2 = view.getUint8(byteOffset + 1)\n\t\t\t\t\t\tconst byte3 = view.getUint8(byteOffset + 2)\n\t\t\t\t\t\tconst byte4 = view.getUint8(byteOffset + 3)\n\t\t\t\t\t\tif (byte2 >= 128 && byte2 <= 191 && byte3 >= 128 && byte3 <= 191 && byte4 >= 128 && byte4 <= 191) {\n\t\t\t\t\t\t\tchar = ((char & 0x07) << 18) | ((byte2 & 0x3F) << 12) | ((byte3 & 0x3F) << 6) | (byte4 & 0x3F)\n\t\t\t\t\t\t\tbyteOffset += 4\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t// Invalid sequence, skip\n\t\t\t\t\t\t\tbyteOffset++\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// Incomplete sequence, skip\n\t\t\t\t\t\tbyteOffset++\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Invalid byte, skip\n\t\t\t\telse {\n\t\t\t\t\tbyteOffset++\n\t\t\t\t}\n\t\t\t\tbreak\n\n\t\t\tcase UTF_16_BE:\n\t\t\tcase UTF_16:\n\t\t\tcase UTF_16_LE:\n\t\t\t\tchar = view.getUint16(byteOffset, endian)\n\t\t\t\tbyteOffset += 2\n\t\t\t\tbreak\n\t\t}\n\n\t\tstr += String.fromCodePoint(char)\n\t}\n\n\treturn str\n}\n","\n/**\n * Converts a string to a Uint8Array. Similar to `TextEncoder.encode`\n * but with a fallback for environments that don't support `TextEncoder`.\n *\n * @param data - The string to encode.\n * @returns The Uint8Array representation of the string.\n *\n * @public\n *\n * @example\n * {@includeCode ../test/encodeText.test.ts#example}\n */\nexport function encodeText(data: string): Uint8Array {\n\treturn new TextEncoder().encode(data)\n}\n","import { UTF_16 } from './UTF_16.ts'\nimport { UTF_16_BE } from './UTF_16_BE.ts'\nimport { UTF_16_LE } from './UTF_16_LE.ts'\nimport { UTF_8 } from './UTF_8.ts'\nimport type { ValueOf } from './ValueOf.ts'\n\n/**\n * Text encoding types.\n *\n * @public\n */\nexport const Encoding = {\n\tUTF8: UTF_8 as typeof UTF_8,\n\tUTF16: UTF_16 as typeof UTF_16,\n\tUTF16BE: UTF_16_BE as typeof UTF_16_BE,\n\tUTF16LE: UTF_16_LE as typeof UTF_16_LE,\n} as const\n\n/**\n * Text encoding types.\n *\n * @public\n */\nexport type Encoding = ValueOf<typeof Encoding>;\n","import type { ResourceTiming } from './ResourceTiming.ts'\n\n/**\n * Converts a ResourceTiming sample to bandwidth in bits per second (bps).\n *\n * @param sample - A ResourceTiming sample\n * @returns\n *\n * @public\n */\nexport function getBandwidthBps(sample: ResourceTiming): number {\n\tconst durationSeconds = sample.duration / 1000\n\tconst bandwidthBps = sample.encodedBodySize * 8 / durationSeconds\n\treturn bandwidthBps\n}\n","/**\n * Get the base URL from a full URL or a URL object.\n *\n * @param fullUrl - The full URL or URL object.\n * @returns The base URL.\n *\n * @public\n *\n * @example\n * {@includeCode ../test/getBaseUrl.test.ts#example}\n */\nexport function getBaseUrl(fullUrl: string | URL): string {\n\tconst url = typeof fullUrl === 'string' ? new URL(fullUrl) : fullUrl\n\treturn url.origin + url.pathname.substring(0, url.pathname.lastIndexOf('/') + 1)\n}\n","/**\n * Decodes a hexadecimal string into an ArrayBuffer.\n *\n * @param hex - The hexadecimal string to decode.\n * @returns The decoded ArrayBuffer.\n *\n * @public\n *\n * @example\n * {@includeCode ../test/hexToArrayBuffer.test.ts#example}\n */\nexport function hexToArrayBuffer(hex: string): ArrayBuffer {\n\tconst buffer = new ArrayBuffer(hex.length / 2)\n\tconst view = new Uint8Array(buffer)\n\tfor (let i = 0; i < hex.length; i += 2) {\n\t\tview[i / 2] = parseInt(hex.slice(i, i + 2), 16)\n\t}\n\treturn buffer\n}\n","import type { ValueOf } from './ValueOf.ts'\n\n/**\n * The response type of the request.\n *\n * @enum\n *\n * @public\n */\nexport const RequestResponseType = {\n\tTEXT: 'text' as const,\n\tJSON: 'json' as const,\n\tBLOB: 'blob' as const,\n\tARRAY_BUFFER: 'arrayBuffer' as const,\n\tDOCUMENT: 'document' as const,\n\tSTREAM: 'stream' as const,\n} as const\n\n/**\n * @public\n */\nexport type RequestResponseType = ValueOf<typeof RequestResponseType>;\n","/**\n * This implements the rounding procedure described in step 2 of the \"Serializing a Decimal\" specification.\n * This rounding style is known as \"even rounding\", \"banker's rounding\", or \"commercial rounding\".\n *\n * @param value - The value to round\n * @param precision - The number of decimal places to round to\n * @returns The rounded value\n *\n * @public\n */\nexport function roundToEven(value: number, precision: number): number {\n\tif (value < 0) {\n\t\treturn -roundToEven(-value, precision)\n\t}\n\n\tconst decimalShift = Math.pow(10, precision)\n\tconst isEquidistant = Math.abs(((value * decimalShift) % 1) - 0.5) < Number.EPSILON\n\n\tif (isEquidistant) {\n\t\t// If the tail of the decimal place is 'equidistant' we round to the nearest even value\n\t\tconst flooredValue = Math.floor(value * decimalShift)\n\t\treturn (flooredValue % 2 === 0 ? flooredValue : flooredValue + 1) / decimalShift\n\t}\n\telse {\n\t\t// Otherwise, proceed as normal\n\t\treturn Math.round(value * decimalShift) / decimalShift\n\t}\n}\n","/**\n * Converts a string to a Uint16Array.\n *\n * @param str - The string to convert\n * @returns A Uint16Array representation of the string\n *\n * @public\n *\n * @example\n * {@includeCode ../test/stringToUint16.test.ts#example}\n */\nexport function stringToUint16(str: string): Uint16Array {\n\tconst buffer = new ArrayBuffer(str.length * 2)\n\tconst view = new DataView(buffer)\n\n\tfor (let i = 0; i < str.length; i++) {\n\t\tview.setUint16(i * 2, str.charCodeAt(i), true) // true for little-endian\n\t}\n\n\treturn new Uint16Array(buffer)\n}\n","const escapedHtml = /&(?:amp|lt|gt|quot|apos|nbsp|lrm|rlm|#[xX]?[0-9a-fA-F]+);/g\n\n/**\n * Unescapes HTML entities\n *\n * @param text - The text to unescape\n * @returns The unescaped text\n *\n * @public\n *\n * @example\n * {@includeCode ../test/unescapeHtml.test.ts#example}\n */\nexport function unescapeHtml(text: string): string {\n\tif (text.indexOf('&') === -1) {\n\t\treturn text\n\t}\n\n\treturn text.replace(escapedHtml, (match) => {\n\t\tswitch (match) {\n\t\t\tcase '&': return '&'\n\t\t\tcase '<': return '<'\n\t\t\tcase '>': return '>'\n\t\t\tcase '"': return '\"'\n\t\t\tcase ''': return '\\''\n\t\t\tcase ' ': return '\\u{a0}'\n\t\t\tcase '‎': return '\\u{200e}'\n\t\t\tcase '‏': return '\\u{200f}'\n\t\t\tdefault: {\n\t\t\t\tif (match[1] === '#') {\n\t\t\t\t\tconst code = match[2] === 'x' || match[2] === 'X' ? parseInt(match.slice(3), 16) : parseInt(match.slice(2), 10)\n\t\t\t\t\treturn String.fromCodePoint(code)\n\t\t\t\t}\n\t\t\t\treturn match\n\t\t\t}\n\t\t}\n\t})\n}\n","/**\n * Constructs a relative path from a URL.\n *\n * If `url` is already a relative path, or its origin differs from `base`, it is returned unchanged.\n *\n * @param url - The destination URL\n * @param base - The base URL\n * @returns The relative path\n *\n * @public\n *\n * @example\n * {@includeCode ../test/urlToRelativePath.test.ts#example}\n */\nexport function urlToRelativePath(url: string, base: string): string {\n\tlet to: URL\n\ttry {\n\t\tto = new URL(url)\n\t}\n\tcatch {\n\t\treturn url\n\t}\n\n\tconst from = new URL(base)\n\n\tif (to.origin !== from.origin) {\n\t\treturn url\n\t}\n\n\tconst toPath = to.pathname.split('/').slice(1)\n\tconst fromPath = from.pathname.split('/').slice(1, -1)\n\n\t// remove common parents\n\tconst length = Math.min(toPath.length, fromPath.length)\n\n\tfor (let i = 0; i < length; i++) {\n\t\tif (toPath[i] !== fromPath[i]) {\n\t\t\tbreak\n\t\t}\n\n\t\ttoPath.shift()\n\t\tfromPath.shift()\n\t}\n\n\t// add back paths\n\twhile (fromPath.length) {\n\t\tfromPath.shift()\n\t\ttoPath.unshift('..')\n\t}\n\n\tconst relativePath = toPath.join('/')\n\n\t// preserve query parameters and hash of the destination url\n\treturn relativePath + to.search + to.hash\n}\n","import { arrayBufferToUuid } from './arrayBufferToUuid.ts'\n\n/**\n * Generate a random v4 UUID\n *\n * @returns A random v4 UUID\n *\n * @public\n *\n * @example\n * {@includeCode ../test/uuid.test.ts#example}\n */\nexport function uuid(): string {\n\ttry {\n\t\treturn crypto.randomUUID()\n\t}\n\tcatch (error) {\n\t\ttry {\n\t\t\tconst bytes = crypto.getRandomValues(new Uint8Array(16))\n\n\t\t\t// Set the version (4) and variant (RFC 4122) bits\n\t\t\tbytes[6] = (bytes[6] & 0x0f) | 0x40\n\t\t\tbytes[8] = (bytes[8] & 0x3f) | 0x80\n\n\t\t\treturn arrayBufferToUuid(bytes.buffer)\n\t\t}\n\t\tcatch (error) {\n\t\t\tconst url = URL.createObjectURL(new Blob())\n\t\t\tconst uuid = url.toString()\n\t\t\tURL.revokeObjectURL(url)\n\t\t\treturn uuid.slice(uuid.lastIndexOf('/') + 1)\n\t\t}\n\t}\n}\n","import { hexToArrayBuffer } from './hexToArrayBuffer.ts'\n\n/**\n * Converts a UUID string to an ArrayBuffer.\n *\n * @param uuid - The UUID string to convert.\n * @returns The ArrayBuffer representation.\n *\n * @public\n *\n * @example\n * {@includeCode ../test/uuidToArrayBuffer.test.ts#example}\n */\nexport function uuidToArrayBuffer(uuid: string): ArrayBuffer {\n\tconst hex = uuid.replace(/-/g, '')\n\treturn hexToArrayBuffer(hex)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["base64decode: typeof decodeBase64","chunk: ArrayLike<number>","base64encode: typeof encodeBase64","view: DataView","char!: number","to: URL","error","uuid","uuid"],"sources":["../src/arrayBufferToHex.ts","../src/arrayBufferToUuid.ts","../src/decodeBase64.ts","../src/base64decode.ts","../src/encodeBase64.ts","../src/base64encode.ts","../src/convertUint8ToUint16.ts","../src/isArrayBufferLike.ts","../src/UTF_16.ts","../src/UTF_16_BE.ts","../src/UTF_16_LE.ts","../src/UTF_8.ts","../src/decodeText.ts","../src/encodeText.ts","../src/Encoding.ts","../src/getBandwidthBps.ts","../src/getBaseUrl.ts","../src/hexToArrayBuffer.ts","../src/RequestResponseType.ts","../src/roundToEven.ts","../src/stringToUint16.ts","../src/unescapeHtml.ts","../src/urlToRelativePath.ts","../src/uuid.ts","../src/uuidToArrayBuffer.ts"],"sourcesContent":["/**\n * Encodes an ArrayBuffer as a hexadecimal string.\n *\n * @param buffer - The ArrayBuffer to encode.\n * @returns The hexadecimal string representation.\n *\n * @public\n *\n * @example\n * {@includeCode ../test/arrayBufferToHex.test.ts#example}\n */\nexport function arrayBufferToHex(buffer: ArrayBuffer): string {\n\tconst view = new Uint8Array(buffer)\n\treturn view.reduce((result, byte) => result + byte.toString(16).padStart(2, '0'), '')\n}\n","import { arrayBufferToHex } from './arrayBufferToHex.ts'\n\n/**\n * Converts an ArrayBuffer to a UUID string.\n *\n * @param buffer - The ArrayBuffer to convert.\n * @returns The UUID string representation.\n *\n * @public\n *\n * @example\n * {@includeCode ../test/arrayBufferToUuid.test.ts#example}\n */\nexport function arrayBufferToUuid(buffer: ArrayBuffer): string {\n\tconst hex = arrayBufferToHex(buffer)\n\treturn hex.replace(/(.{8})(.{4})(.{4})(.{4})(.{12})/, '$1-$2-$3-$4-$5')\n}\n","/**\n * Decodes a base64 encoded string into binary data\n *\n * @param str - The base64 encoded string to decode\n * @returns The decoded binary data\n *\n * @public\n */\nexport function decodeBase64(str: string): Uint8Array {\n\treturn new Uint8Array([...atob(str)].map((a) => a.charCodeAt(0)))\n}\n","import { decodeBase64 } from './decodeBase64.ts'\n\n/**\n * Decodes a base64 encoded string into binary data\n *\n * @param str - The base64 encoded string to decode\n * @returns The decoded binary data\n *\n * @public\n *\n * @deprecated Use {@link decodeBase64} instead.\n *\n * @see {@link decodeBase64}\n */\nexport const base64decode: typeof decodeBase64 = decodeBase64\n","const CHUNK_SIZE = 0x8000\n\n/**\n * Encodes binary data to base64\n *\n * @param binary - The binary data to encode\n * @returns The base64 encoded string\n *\n * @public\n *\n * @example\n * {@includeCode ../test/encodeBase64.test.ts#example}\n */\nexport function encodeBase64(binary: Uint8Array): string {\n\tlet text = ''\n\n\tfor (let i = 0; i < binary.length; i += CHUNK_SIZE) {\n\t\tconst chunk: ArrayLike<number> = binary.subarray(i, i + CHUNK_SIZE)\n\t\ttext += String.fromCharCode.apply(null, chunk as number[])\n\t}\n\n\treturn btoa(text)\n}\n","import { encodeBase64 } from './encodeBase64.ts'\n\n/**\n * Encodes binary data to base64\n *\n * @param binary - The binary data to encode\n * @returns The base64 encoded string\n *\n * @public\n *\n * @deprecated Use {@link encodeBase64} instead.\n *\n * @see {@link encodeBase64}\n */\nexport const base64encode: typeof encodeBase64 = encodeBase64\n","/**\n * Converts a Uint8Array to a Uint16Array by aligning its buffer.\n *\n * @param input - The Uint8Array to convert\n * @returns A properly aligned Uint16Array\n *\n * @public\n */\nexport function convertUint8ToUint16(input: Uint8Array): Uint16Array {\n\tif (input.length % 2 !== 0) {\n\t\tconst padded = new Uint8Array(input.length + 1)\n\t\tpadded.set(input)\n\t\treturn new Uint16Array(padded.buffer)\n\t}\n\treturn new Uint16Array(input.buffer)\n}\n","/**\n * Checks if the given value is `ArrayBufferLike`: an `ArrayBuffer` or a\n * `SharedArrayBuffer`.\n *\n * The function also works where `SharedArrayBuffer` is not defined, such as\n * browser contexts without cross-origin isolation.\n *\n * @param value - The value to check.\n * @returns `true` if the value is an `ArrayBuffer` or `SharedArrayBuffer`.\n *\n * @public\n *\n * @example\n * {@includeCode ../test/isArrayBufferLike.test.ts#example}\n */\nexport function isArrayBufferLike(value: unknown): value is ArrayBufferLike {\n\treturn value instanceof ArrayBuffer\n\t\t|| (typeof SharedArrayBuffer !== 'undefined' && value instanceof SharedArrayBuffer)\n}\n","/**\n * UTF-16 Encoding.\n *\n * @public\n */\nexport const UTF_16 = 'utf-16'\n","/**\n * UTF-16 Big Endian Encoding.\n *\n * @public\n */\nexport const UTF_16_BE = 'utf-16be'\n","/**\n * UTF-16 Little Endian Encoding.\n *\n * @public\n */\nexport const UTF_16_LE = 'utf-16le'\n","/**\n * UTF-8 Encoding.\n *\n * @public\n */\nexport const UTF_8 = 'utf-8'\n","import type { DecodeTextOptions } from './DecodeTextOptions.ts'\nimport { isArrayBufferLike } from './isArrayBufferLike.ts'\nimport { UTF_16 } from './UTF_16.ts'\nimport { UTF_16_BE } from './UTF_16_BE.ts'\nimport { UTF_16_LE } from './UTF_16_LE.ts'\nimport { UTF_8 } from './UTF_8.ts'\n\n/**\n * Converts an ArrayBuffer or ArrayBufferView to a string. The function works like\n * `TextDecoder.decode` and also supports environments without `TextDecoder`.\n *\n * @param data - The data to decode.\n * @param options - The options for the decoding.\n * @returns The string representation of the ArrayBuffer.\n *\n * @public\n *\n * @example\n * {@includeCode ../test/decodeText.test.ts#example}\n */\nexport function decodeText(data: ArrayBufferLike | ArrayBufferView, options: DecodeTextOptions = {}): string {\n\tlet view: DataView\n\n\tif (isArrayBufferLike(data)) {\n\t\tview = new DataView(data)\n\t}\n\telse {\n\t\tview = new DataView(data.buffer, data.byteOffset, data.byteLength)\n\t}\n\n\tlet byteOffset = 0\n\tlet { encoding } = options\n\n\t// If no encoding is provided, try to detect it from the BOM\n\tif (!encoding) {\n\t\tconst first = view.getUint8(0)\n\t\tconst second = view.getUint8(1)\n\n\t\t// UTF-8 BOM\n\t\tif (first == 0xef && second == 0xbb && view.getUint8(2) == 0xbf) {\n\t\t\tencoding = UTF_8\n\t\t\tbyteOffset = 3\n\t\t}\n\t\t// UTF-16 BE BOM\n\t\telse if (first == 0xfe && second == 0xff) {\n\t\t\tencoding = UTF_16_BE\n\t\t\tbyteOffset = 2\n\t\t}\n\t\t// UTF-16 LE BOM\n\t\telse if (first == 0xff && second == 0xfe) {\n\t\t\tencoding = UTF_16_LE\n\t\t\tbyteOffset = 2\n\t\t}\n\t\telse {\n\t\t\tencoding = UTF_8\n\t\t}\n\t}\n\n\tif (typeof TextDecoder !== 'undefined') {\n\t\treturn new TextDecoder(encoding).decode(view)\n\t}\n\n\tconst { byteLength } = view\n\tconst endian = encoding !== UTF_16_BE\n\tlet str = ''\n\tlet char!: number\n\n\twhile (byteOffset < byteLength) {\n\t\tswitch (encoding) {\n\t\t\tcase UTF_8:\n\t\t\t\tchar = view.getUint8(byteOffset)\n\n\t\t\t\t// Single byte (ASCII)\n\t\t\t\tif (char < 128) {\n\t\t\t\t\tbyteOffset++\n\t\t\t\t}\n\t\t\t\t// 2-byte sequence\n\t\t\t\telse if (char >= 194 && char <= 223) {\n\t\t\t\t\tif (byteOffset + 1 < byteLength) {\n\t\t\t\t\t\tconst byte2 = view.getUint8(byteOffset + 1)\n\t\t\t\t\t\tif (byte2 >= 128 && byte2 <= 191) {\n\t\t\t\t\t\t\tchar = ((char & 0x1F) << 6) | (byte2 & 0x3F)\n\t\t\t\t\t\t\tbyteOffset += 2\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t// Invalid sequence, skip\n\t\t\t\t\t\t\tbyteOffset++\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// Incomplete sequence, skip\n\t\t\t\t\t\tbyteOffset++\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// 3-byte sequence\n\t\t\t\telse if (char >= 224 && char <= 239) {\n\t\t\t\t\tif (byteOffset + 2 <= byteLength - 1) {\n\t\t\t\t\t\tconst byte2 = view.getUint8(byteOffset + 1)\n\t\t\t\t\t\tconst byte3 = view.getUint8(byteOffset + 2)\n\t\t\t\t\t\tif (byte2 >= 128 && byte2 <= 191 && byte3 >= 128 && byte3 <= 191) {\n\t\t\t\t\t\t\tchar = ((char & 0x0F) << 12) | ((byte2 & 0x3F) << 6) | (byte3 & 0x3F)\n\t\t\t\t\t\t\tbyteOffset += 3\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t// Invalid sequence, skip\n\t\t\t\t\t\t\tbyteOffset++\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// Incomplete sequence, skip\n\t\t\t\t\t\tbyteOffset++\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// 4-byte sequence\n\t\t\t\telse if (char >= 240 && char <= 244) {\n\t\t\t\t\tif (byteOffset + 3 <= byteLength - 1) {\n\t\t\t\t\t\tconst byte2 = view.getUint8(byteOffset + 1)\n\t\t\t\t\t\tconst byte3 = view.getUint8(byteOffset + 2)\n\t\t\t\t\t\tconst byte4 = view.getUint8(byteOffset + 3)\n\t\t\t\t\t\tif (byte2 >= 128 && byte2 <= 191 && byte3 >= 128 && byte3 <= 191 && byte4 >= 128 && byte4 <= 191) {\n\t\t\t\t\t\t\tchar = ((char & 0x07) << 18) | ((byte2 & 0x3F) << 12) | ((byte3 & 0x3F) << 6) | (byte4 & 0x3F)\n\t\t\t\t\t\t\tbyteOffset += 4\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t// Invalid sequence, skip\n\t\t\t\t\t\t\tbyteOffset++\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// Incomplete sequence, skip\n\t\t\t\t\t\tbyteOffset++\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Invalid byte, skip\n\t\t\t\telse {\n\t\t\t\t\tbyteOffset++\n\t\t\t\t}\n\t\t\t\tbreak\n\n\t\t\tcase UTF_16_BE:\n\t\t\tcase UTF_16:\n\t\t\tcase UTF_16_LE:\n\t\t\t\tchar = view.getUint16(byteOffset, endian)\n\t\t\t\tbyteOffset += 2\n\t\t\t\tbreak\n\t\t}\n\n\t\tstr += String.fromCodePoint(char)\n\t}\n\n\treturn str\n}\n","\n/**\n * Converts a string to a Uint8Array. The function works like\n * `TextEncoder.encode` and also supports environments without `TextEncoder`.\n *\n * @param data - The string to encode.\n * @returns The Uint8Array representation of the string.\n *\n * @public\n *\n * @example\n * {@includeCode ../test/encodeText.test.ts#example}\n */\nexport function encodeText(data: string): Uint8Array {\n\treturn new TextEncoder().encode(data)\n}\n","import { UTF_16 } from './UTF_16.ts'\nimport { UTF_16_BE } from './UTF_16_BE.ts'\nimport { UTF_16_LE } from './UTF_16_LE.ts'\nimport { UTF_8 } from './UTF_8.ts'\nimport type { ValueOf } from './ValueOf.ts'\n\n/**\n * Text encoding types.\n *\n * @public\n */\nexport const Encoding = {\n\tUTF8: UTF_8 as typeof UTF_8,\n\tUTF16: UTF_16 as typeof UTF_16,\n\tUTF16BE: UTF_16_BE as typeof UTF_16_BE,\n\tUTF16LE: UTF_16_LE as typeof UTF_16_LE,\n} as const\n\n/**\n * Text encoding types.\n *\n * @public\n */\nexport type Encoding = ValueOf<typeof Encoding>;\n","import type { ResourceTiming } from './ResourceTiming.ts'\n\n/**\n * Converts a ResourceTiming sample to bandwidth in bits per second.\n *\n * @param sample - A ResourceTiming sample\n * @returns The bandwidth in bits per second.\n *\n * @public\n */\nexport function getBandwidthBps(sample: ResourceTiming): number {\n\tconst durationSeconds = sample.duration / 1000\n\tconst bandwidthBps = sample.encodedBodySize * 8 / durationSeconds\n\treturn bandwidthBps\n}\n","/**\n * Gets the base URL from a full URL or a URL object.\n *\n * @param fullUrl - The full URL or URL object.\n * @returns The base URL.\n *\n * @public\n *\n * @example\n * {@includeCode ../test/getBaseUrl.test.ts#example}\n */\nexport function getBaseUrl(fullUrl: string | URL): string {\n\tconst url = typeof fullUrl === 'string' ? new URL(fullUrl) : fullUrl\n\treturn url.origin + url.pathname.substring(0, url.pathname.lastIndexOf('/') + 1)\n}\n","/**\n * Decodes a hexadecimal string into an ArrayBuffer.\n *\n * @param hex - The hexadecimal string to decode.\n * @returns The decoded ArrayBuffer.\n *\n * @public\n *\n * @example\n * {@includeCode ../test/hexToArrayBuffer.test.ts#example}\n */\nexport function hexToArrayBuffer(hex: string): ArrayBuffer {\n\tconst buffer = new ArrayBuffer(hex.length / 2)\n\tconst view = new Uint8Array(buffer)\n\tfor (let i = 0; i < hex.length; i += 2) {\n\t\tview[i / 2] = parseInt(hex.slice(i, i + 2), 16)\n\t}\n\treturn buffer\n}\n","import type { ValueOf } from './ValueOf.ts'\n\n/**\n * The response type of the request.\n *\n * @enum\n *\n * @public\n */\nexport const RequestResponseType = {\n\tTEXT: 'text' as const,\n\tJSON: 'json' as const,\n\tBLOB: 'blob' as const,\n\tARRAY_BUFFER: 'arrayBuffer' as const,\n\tDOCUMENT: 'document' as const,\n\tSTREAM: 'stream' as const,\n} as const\n\n/**\n * @public\n */\nexport type RequestResponseType = ValueOf<typeof RequestResponseType>;\n","/**\n * Rounds a value with the procedure from step 2 of the \"Serializing a Decimal\" specification.\n * The style is known as \"even rounding\", \"banker's rounding\", or \"commercial rounding\".\n *\n * @param value - The value to round\n * @param precision - The number of decimal places to round to\n * @returns The rounded value\n *\n * @public\n */\nexport function roundToEven(value: number, precision: number): number {\n\tif (value < 0) {\n\t\treturn -roundToEven(-value, precision)\n\t}\n\n\tconst decimalShift = Math.pow(10, precision)\n\tconst isEquidistant = Math.abs(((value * decimalShift) % 1) - 0.5) < Number.EPSILON\n\n\tif (isEquidistant) {\n\t\t// If the tail of the decimal place is 'equidistant' we round to the nearest even value\n\t\tconst flooredValue = Math.floor(value * decimalShift)\n\t\treturn (flooredValue % 2 === 0 ? flooredValue : flooredValue + 1) / decimalShift\n\t}\n\telse {\n\t\t// Otherwise, proceed as normal\n\t\treturn Math.round(value * decimalShift) / decimalShift\n\t}\n}\n","/**\n * Converts a string to a Uint16Array.\n *\n * @param str - The string to convert\n * @returns A Uint16Array representation of the string\n *\n * @public\n *\n * @example\n * {@includeCode ../test/stringToUint16.test.ts#example}\n */\nexport function stringToUint16(str: string): Uint16Array {\n\tconst buffer = new ArrayBuffer(str.length * 2)\n\tconst view = new DataView(buffer)\n\n\tfor (let i = 0; i < str.length; i++) {\n\t\tview.setUint16(i * 2, str.charCodeAt(i), true) // true for little-endian\n\t}\n\n\treturn new Uint16Array(buffer)\n}\n","const escapedHtml = /&(?:amp|lt|gt|quot|apos|nbsp|lrm|rlm|#[xX]?[0-9a-fA-F]+);/g\n\n/**\n * Unescapes HTML entities\n *\n * @param text - The text to unescape\n * @returns The unescaped text\n *\n * @public\n *\n * @example\n * {@includeCode ../test/unescapeHtml.test.ts#example}\n */\nexport function unescapeHtml(text: string): string {\n\tif (text.indexOf('&') === -1) {\n\t\treturn text\n\t}\n\n\treturn text.replace(escapedHtml, (match) => {\n\t\tswitch (match) {\n\t\t\tcase '&': return '&'\n\t\t\tcase '<': return '<'\n\t\t\tcase '>': return '>'\n\t\t\tcase '"': return '\"'\n\t\t\tcase ''': return '\\''\n\t\t\tcase ' ': return '\\u{a0}'\n\t\t\tcase '‎': return '\\u{200e}'\n\t\t\tcase '‏': return '\\u{200f}'\n\t\t\tdefault: {\n\t\t\t\tif (match[1] === '#') {\n\t\t\t\t\tconst code = match[2] === 'x' || match[2] === 'X' ? parseInt(match.slice(3), 16) : parseInt(match.slice(2), 10)\n\t\t\t\t\treturn String.fromCodePoint(code)\n\t\t\t\t}\n\t\t\t\treturn match\n\t\t\t}\n\t\t}\n\t})\n}\n","/**\n * Constructs a relative path from a URL.\n *\n * If `url` is already relative, or its origin differs from `base`, the function returns `url` unchanged.\n *\n * @param url - The destination URL\n * @param base - The base URL\n * @returns The relative path\n *\n * @public\n *\n * @example\n * {@includeCode ../test/urlToRelativePath.test.ts#example}\n */\nexport function urlToRelativePath(url: string, base: string): string {\n\tlet to: URL\n\ttry {\n\t\tto = new URL(url)\n\t}\n\tcatch {\n\t\treturn url\n\t}\n\n\tconst from = new URL(base)\n\n\tif (to.origin !== from.origin) {\n\t\treturn url\n\t}\n\n\tconst toPath = to.pathname.split('/').slice(1)\n\tconst fromPath = from.pathname.split('/').slice(1, -1)\n\n\t// count common parents, stopping before the destination file\n\tlet common = 0\n\n\twhile (common < toPath.length - 1 && common < fromPath.length && toPath[common] === fromPath[common]) {\n\t\tcommon++\n\t}\n\n\t// add back paths\n\tconst ups = fromPath.length - common\n\tlet relativePath = '../'.repeat(ups) + toPath.slice(common).join('/')\n\n\t// RFC 3986 section 4.2: a relative-path reference cannot be empty, start with \"/\", or have \":\" in its first segment\n\tif (ups === 0 && (relativePath === '' || relativePath.startsWith('/') || toPath[common].includes(':'))) {\n\t\trelativePath = './' + relativePath\n\t}\n\n\t// preserve query parameters and hash of the destination url\n\treturn relativePath + to.search + to.hash\n}\n","import { arrayBufferToUuid } from './arrayBufferToUuid.ts'\n\n/**\n * Generates a random v4 UUID\n *\n * @returns A random v4 UUID\n *\n * @public\n *\n * @example\n * {@includeCode ../test/uuid.test.ts#example}\n */\nexport function uuid(): string {\n\ttry {\n\t\treturn crypto.randomUUID()\n\t}\n\tcatch (error) {\n\t\ttry {\n\t\t\tconst bytes = crypto.getRandomValues(new Uint8Array(16))\n\n\t\t\t// Set the version (4) and variant (RFC 4122) bits\n\t\t\tbytes[6] = (bytes[6] & 0x0f) | 0x40\n\t\t\tbytes[8] = (bytes[8] & 0x3f) | 0x80\n\n\t\t\treturn arrayBufferToUuid(bytes.buffer)\n\t\t}\n\t\tcatch (error) {\n\t\t\tconst url = URL.createObjectURL(new Blob())\n\t\t\tconst uuid = url.toString()\n\t\t\tURL.revokeObjectURL(url)\n\t\t\treturn uuid.slice(uuid.lastIndexOf('/') + 1)\n\t\t}\n\t}\n}\n","import { hexToArrayBuffer } from './hexToArrayBuffer.ts'\n\n/**\n * Converts a UUID string to an ArrayBuffer.\n *\n * @param uuid - The UUID string to convert.\n * @returns The ArrayBuffer representation.\n *\n * @public\n *\n * @example\n * {@includeCode ../test/uuidToArrayBuffer.test.ts#example}\n */\nexport function uuidToArrayBuffer(uuid: string): ArrayBuffer {\n\tconst hex = uuid.replace(/-/g, '')\n\treturn hexToArrayBuffer(hex)\n}\n"],"mappings":"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"}
|