@wener/utils 1.1.33 → 1.1.35
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/lib/arrays/MaybeArray.js +41 -0
- package/lib/arrays/MaybeArray.js.map +1 -0
- package/lib/arrays/arrayFromAsync.js +7 -0
- package/lib/arrays/arrayFromAsync.js.map +1 -0
- package/lib/asyncs/AsyncInterval.js +14 -0
- package/lib/asyncs/AsyncInterval.js.map +1 -0
- package/lib/asyncs/MaybePromise.js +3 -0
- package/lib/asyncs/MaybePromise.js.map +1 -0
- package/lib/asyncs/createAsyncIterator.js +41 -0
- package/lib/asyncs/createAsyncIterator.js.map +1 -0
- package/lib/asyncs/createLazyPromise.js +65 -0
- package/lib/asyncs/createLazyPromise.js.map +1 -0
- package/lib/asyncs/firstOfAsyncIterator.js +11 -0
- package/lib/asyncs/firstOfAsyncIterator.js.map +1 -0
- package/lib/asyncs/generatorOfStream.js +16 -0
- package/lib/asyncs/generatorOfStream.js.map +1 -0
- package/lib/asyncs/isIterator.js +5 -0
- package/lib/asyncs/isIterator.js.map +1 -0
- package/lib/asyncs/isPromise.js +5 -0
- package/lib/asyncs/isPromise.js.map +1 -0
- package/lib/asyncs/isThenable.js +6 -0
- package/lib/asyncs/isThenable.js.map +1 -0
- package/lib/asyncs/nextOfAsyncIterator.js +33 -0
- package/lib/asyncs/nextOfAsyncIterator.js.map +1 -0
- package/lib/asyncs/promiseOfCallback.js +17 -0
- package/lib/asyncs/promiseOfCallback.js.map +1 -0
- package/lib/asyncs/sleep.js +3 -0
- package/lib/asyncs/sleep.js.map +1 -0
- package/lib/asyncs/timeout.js +29 -0
- package/lib/asyncs/timeout.js.map +1 -0
- package/lib/browsers/copy.js +53 -0
- package/lib/browsers/copy.js.map +1 -0
- package/lib/browsers/download.js +41 -0
- package/lib/browsers/download.js.map +1 -0
- package/lib/browsers/getFileFromDataTransfer.js +45 -0
- package/lib/browsers/getFileFromDataTransfer.js.map +1 -0
- package/lib/browsers/loaders.js +49 -0
- package/lib/browsers/loaders.js.map +1 -0
- package/lib/cn/index.js +3 -0
- package/lib/cn/index.js.map +1 -0
- package/lib/cn/parseChineseNumber.js +94 -0
- package/lib/cn/parseChineseNumber.js.map +1 -0
- package/lib/crypto/base.js +7 -0
- package/lib/crypto/base.js.map +1 -0
- package/lib/crypto/getNodeCrypto.js +18 -0
- package/lib/crypto/getNodeCrypto.js.map +1 -0
- package/lib/crypto/getRandomValues.js +32 -0
- package/lib/crypto/getRandomValues.js.map +1 -0
- package/lib/crypto/hashing.js +57 -0
- package/lib/crypto/hashing.js.map +1 -0
- package/lib/crypto/md5.bench.js +21 -0
- package/lib/crypto/md5.bench.js.map +1 -0
- package/lib/crypto/md5.d.js +3 -0
- package/lib/crypto/md5.d.js.map +1 -0
- package/lib/crypto/md5.js +121 -0
- package/lib/crypto/md5.js.map +1 -0
- package/lib/crypto/pem/pem.js +35 -0
- package/lib/crypto/pem/pem.js.map +1 -0
- package/lib/crypto/randomUUID.js +16 -0
- package/lib/crypto/randomUUID.js.map +1 -0
- package/lib/crypto/ulid.js +153 -0
- package/lib/crypto/ulid.js.map +1 -0
- package/lib/errors/Errors.js +181 -0
- package/lib/errors/Errors.js.map +1 -0
- package/lib/fetch/createFetchWith.js +23 -0
- package/lib/fetch/createFetchWith.js.map +1 -0
- package/lib/fetch/createFetchWithLogging.js +25 -0
- package/lib/fetch/createFetchWithLogging.js.map +1 -0
- package/lib/fetch/createFetchWithRetry.js +66 -0
- package/lib/fetch/createFetchWithRetry.js.map +1 -0
- package/lib/fetch/dumpRequest.js +45 -0
- package/lib/fetch/dumpRequest.js.map +1 -0
- package/lib/fetch/dumpResponse.js +16 -0
- package/lib/fetch/dumpResponse.js.map +1 -0
- package/lib/fetch/index.js +7 -0
- package/lib/fetch/index.js.map +1 -0
- package/lib/fetch/types.js +3 -0
- package/lib/fetch/types.js.map +1 -0
- package/lib/http/HttpStatus.js +94 -0
- package/lib/http/HttpStatus.js.map +1 -0
- package/lib/i18n/createTranslate.js +54 -0
- package/lib/i18n/createTranslate.js.map +1 -0
- package/lib/index.js +83 -0
- package/lib/index.js.map +1 -0
- package/lib/io/AbstractEncoding.js +7 -0
- package/lib/io/AbstractEncoding.js.map +1 -0
- package/lib/io/ArrayBuffer.test-d.js +7 -0
- package/lib/io/ArrayBuffer.test-d.js.map +1 -0
- package/lib/io/ArrayBuffers.js +210 -0
- package/lib/io/ArrayBuffers.js.map +1 -0
- package/lib/io/Buffer.js +25 -0
- package/lib/io/Buffer.js.map +1 -0
- package/lib/io/Bytes.js +51 -0
- package/lib/io/Bytes.js.map +1 -0
- package/lib/io/base64.js +54 -0
- package/lib/io/base64.js.map +1 -0
- package/lib/io/isBuffer.js +9 -0
- package/lib/io/isBuffer.js.map +1 -0
- package/lib/io/isTransferable.js +30 -0
- package/lib/io/isTransferable.js.map +1 -0
- package/lib/isomorphics/getGlobalThis.js +19 -0
- package/lib/isomorphics/getGlobalThis.js.map +1 -0
- package/lib/isomorphics/structuredClone.js +78 -0
- package/lib/isomorphics/structuredClone.js.map +1 -0
- package/lib/langs/AsyncCloser.js +40 -0
- package/lib/langs/AsyncCloser.js.map +1 -0
- package/lib/langs/Closer.js +34 -0
- package/lib/langs/Closer.js.map +1 -0
- package/lib/langs/MaybeFunction.js +9 -0
- package/lib/langs/MaybeFunction.js.map +1 -0
- package/lib/langs/classOf.js +5 -0
- package/lib/langs/classOf.js.map +1 -0
- package/lib/langs/deepEqual.js +87 -0
- package/lib/langs/deepEqual.js.map +1 -0
- package/lib/langs/deepFreeze.js +20 -0
- package/lib/langs/deepFreeze.js.map +1 -0
- package/lib/langs/hashCode.ignored.js +112 -0
- package/lib/langs/hashCode.ignored.js.map +1 -0
- package/lib/langs/isClass.js +5 -0
- package/lib/langs/isClass.js.map +1 -0
- package/lib/langs/isDefined.js +5 -0
- package/lib/langs/isDefined.js.map +1 -0
- package/lib/langs/isEmptyObject.js +6 -0
- package/lib/langs/isEmptyObject.js.map +1 -0
- package/lib/langs/isFunction.js +5 -0
- package/lib/langs/isFunction.js.map +1 -0
- package/lib/langs/isPlainObject.js +10 -0
- package/lib/langs/isPlainObject.js.map +1 -0
- package/lib/langs/memoize.js +22 -0
- package/lib/langs/memoize.js.map +1 -0
- package/lib/langs/parseBoolean.js +30 -0
- package/lib/langs/parseBoolean.js.map +1 -0
- package/lib/langs/shallowClone.js +15 -0
- package/lib/langs/shallowClone.js.map +1 -0
- package/lib/langs/shallowEqual.js +24 -0
- package/lib/langs/shallowEqual.js.map +1 -0
- package/lib/libs/ms.js +137 -0
- package/lib/libs/ms.js.map +1 -0
- package/lib/logging/Logger.js +5 -0
- package/lib/logging/Logger.js.map +1 -0
- package/lib/logging/createChildLogger.js +16 -0
- package/lib/logging/createChildLogger.js.map +1 -0
- package/lib/logging/createLogger.js +63 -0
- package/lib/logging/createLogger.js.map +1 -0
- package/lib/logging/createNoopLogger.js +13 -0
- package/lib/logging/createNoopLogger.js.map +1 -0
- package/lib/logging/slog.js +143 -0
- package/lib/logging/slog.js.map +1 -0
- package/lib/maths/clamp.js +21 -0
- package/lib/maths/clamp.js.map +1 -0
- package/lib/maths/random.js +17 -0
- package/lib/maths/random.js.map +1 -0
- package/lib/modules/isModule.js +7 -0
- package/lib/modules/isModule.js.map +1 -0
- package/lib/modules/parseModuleId.js +39 -0
- package/lib/modules/parseModuleId.js.map +1 -0
- package/lib/objects/get.js +16 -0
- package/lib/objects/get.js.map +1 -0
- package/lib/objects/get.test-d.js +33 -0
- package/lib/objects/get.test-d.js.map +1 -0
- package/lib/objects/merge/index.js +3 -0
- package/lib/objects/merge/index.js.map +1 -0
- package/lib/objects/merge/isMergeableObject.js +19 -0
- package/lib/objects/merge/isMergeableObject.js.map +1 -0
- package/lib/objects/merge/merge.js +90 -0
- package/lib/objects/merge/merge.js.map +1 -0
- package/lib/objects/parseObjectPath.js +39 -0
- package/lib/objects/parseObjectPath.js.map +1 -0
- package/lib/objects/set.js +38 -0
- package/lib/objects/set.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/common/encoder.js +94 -0
- package/lib/schema/typebox/gen/codegen/common/encoder.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/common/formatter.js +33 -0
- package/lib/schema/typebox/gen/codegen/common/formatter.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/common/index.js +29 -0
- package/lib/schema/typebox/gen/codegen/common/index.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/common/jsdoc.js +117 -0
- package/lib/schema/typebox/gen/codegen/common/jsdoc.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/expression/compiler.js +364 -0
- package/lib/schema/typebox/gen/codegen/expression/compiler.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/expression/errors.js +259 -0
- package/lib/schema/typebox/gen/codegen/expression/errors.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/expression/evaluator.js +254 -0
- package/lib/schema/typebox/gen/codegen/expression/evaluator.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/expression/expression.js +381 -0
- package/lib/schema/typebox/gen/codegen/expression/expression.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/expression/index.js +32 -0
- package/lib/schema/typebox/gen/codegen/expression/index.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/index.js +29 -0
- package/lib/schema/typebox/gen/codegen/index.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/model/index.js +40 -0
- package/lib/schema/typebox/gen/codegen/model/index.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/model/model-to-arktype.js +260 -0
- package/lib/schema/typebox/gen/codegen/model/model-to-arktype.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/model/model-to-expression.js +383 -0
- package/lib/schema/typebox/gen/codegen/model/model-to-expression.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/model/model-to-grpc.js +238 -0
- package/lib/schema/typebox/gen/codegen/model/model-to-grpc.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/model/model-to-io-ts.js +274 -0
- package/lib/schema/typebox/gen/codegen/model/model-to-io-ts.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/model/model-to-javascript.js +47 -0
- package/lib/schema/typebox/gen/codegen/model/model-to-javascript.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/model/model-to-json-schema.js +192 -0
- package/lib/schema/typebox/gen/codegen/model/model-to-json-schema.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/model/model-to-typebox.js +33 -0
- package/lib/schema/typebox/gen/codegen/model/model-to-typebox.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/model/model-to-typescript.js +188 -0
- package/lib/schema/typebox/gen/codegen/model/model-to-typescript.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/model/model-to-valibot.js +239 -0
- package/lib/schema/typebox/gen/codegen/model/model-to-valibot.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/model/model-to-value.js +43 -0
- package/lib/schema/typebox/gen/codegen/model/model-to-value.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/model/model-to-yrel.js +227 -0
- package/lib/schema/typebox/gen/codegen/model/model-to-yrel.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/model/model-to-yup.js +225 -0
- package/lib/schema/typebox/gen/codegen/model/model-to-yup.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/model/model-to-zod.js +248 -0
- package/lib/schema/typebox/gen/codegen/model/model-to-zod.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/model/model.js +27 -0
- package/lib/schema/typebox/gen/codegen/model/model.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/typescript/index.js +28 -0
- package/lib/schema/typebox/gen/codegen/typescript/index.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/typescript/typescript-to-model.js +72 -0
- package/lib/schema/typebox/gen/codegen/typescript/typescript-to-model.js.map +1 -0
- package/lib/schema/typebox/gen/codegen/typescript/typescript-to-typebox.js +620 -0
- package/lib/schema/typebox/gen/codegen/typescript/typescript-to-typebox.js.map +1 -0
- package/lib/schema/typebox/gen/index.js +3 -0
- package/lib/schema/typebox/gen/index.js.map +1 -0
- package/lib/schema/typebox/index.js +3 -0
- package/lib/schema/typebox/index.js.map +1 -0
- package/lib/schema/typebox/typebox.js +23 -0
- package/lib/schema/typebox/typebox.js.map +1 -0
- package/lib/server/crypto/md5.js +6 -0
- package/lib/server/crypto/md5.js.map +1 -0
- package/lib/server/fetch/createFetchWithProxy.js +4 -0
- package/lib/server/fetch/createFetchWithProxy.js.map +1 -0
- package/lib/server/fetch/createFetchWithProxyByNodeFetch.js +38 -0
- package/lib/server/fetch/createFetchWithProxyByNodeFetch.js.map +1 -0
- package/lib/server/fetch/createFetchWithProxyByUndici.js +64 -0
- package/lib/server/fetch/createFetchWithProxyByUndici.js.map +1 -0
- package/lib/server/getPackageDir.js +16 -0
- package/lib/server/getPackageDir.js.map +1 -0
- package/lib/server/index.js +7 -0
- package/lib/server/index.js.map +1 -0
- package/lib/server/jsdom.js +3 -0
- package/lib/server/jsdom.js.map +1 -0
- package/lib/server/node-fetch.js +4 -0
- package/lib/server/node-fetch.js.map +1 -0
- package/lib/server/polyfill/polyfillBrowser.js +17 -0
- package/lib/server/polyfill/polyfillBrowser.js.map +1 -0
- package/lib/server/polyfill/polyfillCrypto.js +11 -0
- package/lib/server/polyfill/polyfillCrypto.js.map +1 -0
- package/lib/server/polyfill/polyfillFetch.js +25 -0
- package/lib/server/polyfill/polyfillFetch.js.map +1 -0
- package/lib/server/polyfill/polyfillJsDom.js +64 -0
- package/lib/server/polyfill/polyfillJsDom.js.map +1 -0
- package/lib/server/polyfill/polyfillWebSocket.js +21 -0
- package/lib/server/polyfill/polyfillWebSocket.js.map +1 -0
- package/lib/server/ws.js +3 -0
- package/lib/server/ws.js.map +1 -0
- package/lib/strings/camelCase.js +58 -0
- package/lib/strings/camelCase.js.map +1 -0
- package/lib/strings/formatBytes.js +43 -0
- package/lib/strings/formatBytes.js.map +1 -0
- package/lib/strings/renderTemplate.js +32 -0
- package/lib/strings/renderTemplate.js.map +1 -0
- package/lib/typedoc.js +4 -0
- package/lib/typedoc.js.map +1 -0
- package/lib/types.d.js +6 -0
- package/lib/types.d.js.map +1 -0
- package/lib/validations/asserts.js +14 -0
- package/lib/validations/asserts.js.map +1 -0
- package/lib/validations/isUUID.js +5 -0
- package/lib/validations/isUUID.js.map +1 -0
- package/lib/validations/parseTimestamp.js +29 -0
- package/lib/validations/parseTimestamp.js.map +1 -0
- package/package.json +1 -3
- package/dist/LICENSE.txt +0 -1
- package/dist/cjs/index.cjs +0 -21
- package/dist/cjs/index.cjs.map +0 -1
- package/dist/esm/index.js +0 -21
- package/dist/esm/index.js.map +0 -1
- package/dist/system/index.js +0 -21
- package/dist/system/index.js.map +0 -1
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { getRandomValues } from './getRandomValues.js';
|
|
2
|
+
function createError(message) {
|
|
3
|
+
const err = new Error(message);
|
|
4
|
+
err.source = 'ulid';
|
|
5
|
+
return err;
|
|
6
|
+
}
|
|
7
|
+
// These values should NEVER change. If
|
|
8
|
+
// they do, we're no longer making ulids!
|
|
9
|
+
const ENCODING = '0123456789ABCDEFGHJKMNPQRSTVWXYZ'; // Crockford's Base32
|
|
10
|
+
const ENCODING_LEN = ENCODING.length;
|
|
11
|
+
const TIME_MAX = Math.pow(2, 48) - 1;
|
|
12
|
+
const TIME_LEN = 10;
|
|
13
|
+
const RANDOM_LEN = 16;
|
|
14
|
+
/**
|
|
15
|
+
* check give {@link str} is a valid ulid
|
|
16
|
+
*/ export function isULID(str) {
|
|
17
|
+
if (!str) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
// ttttttttttrrrrrrrrrrrrrrrr
|
|
21
|
+
return str.length === 26 && /^[0-9A-HJKMNP-TV-Z]{26}$/i.test(str);
|
|
22
|
+
}
|
|
23
|
+
function replaceCharAt(str, index, char) {
|
|
24
|
+
if (index > str.length - 1) {
|
|
25
|
+
return str;
|
|
26
|
+
}
|
|
27
|
+
return str.substr(0, index) + char + str.substr(index + 1);
|
|
28
|
+
}
|
|
29
|
+
function incrementBase32(str) {
|
|
30
|
+
let done;
|
|
31
|
+
let index = str.length;
|
|
32
|
+
let char;
|
|
33
|
+
let charIndex;
|
|
34
|
+
const maxCharIndex = ENCODING_LEN - 1;
|
|
35
|
+
while(!done && index-- >= 0){
|
|
36
|
+
char = str[index];
|
|
37
|
+
charIndex = ENCODING.indexOf(char);
|
|
38
|
+
if (charIndex === -1) {
|
|
39
|
+
throw createError('incorrectly encoded string');
|
|
40
|
+
}
|
|
41
|
+
if (charIndex === maxCharIndex) {
|
|
42
|
+
str = replaceCharAt(str, index, ENCODING[0]);
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
done = replaceCharAt(str, index, ENCODING[charIndex + 1]);
|
|
46
|
+
}
|
|
47
|
+
if (typeof done === 'string') {
|
|
48
|
+
return done;
|
|
49
|
+
}
|
|
50
|
+
throw createError('cannot increment this string');
|
|
51
|
+
}
|
|
52
|
+
function randomChar(prng) {
|
|
53
|
+
let rand = Math.floor(prng() * ENCODING_LEN);
|
|
54
|
+
if (rand === ENCODING_LEN) {
|
|
55
|
+
rand = ENCODING_LEN - 1;
|
|
56
|
+
}
|
|
57
|
+
return ENCODING.charAt(rand);
|
|
58
|
+
}
|
|
59
|
+
function encodeTime(now, len) {
|
|
60
|
+
if (isNaN(now)) {
|
|
61
|
+
throw new Error(`${now} must be a number`);
|
|
62
|
+
}
|
|
63
|
+
if (now > TIME_MAX) {
|
|
64
|
+
throw createError(`cannot encode time greater than ${TIME_MAX}`);
|
|
65
|
+
}
|
|
66
|
+
if (now < 0) {
|
|
67
|
+
throw createError('time must be positive');
|
|
68
|
+
}
|
|
69
|
+
if (!Number.isInteger(now)) {
|
|
70
|
+
throw createError('time must be an integer');
|
|
71
|
+
}
|
|
72
|
+
let mod;
|
|
73
|
+
let str = '';
|
|
74
|
+
for(; len > 0; len--){
|
|
75
|
+
mod = now % ENCODING_LEN;
|
|
76
|
+
str = ENCODING.charAt(mod) + str;
|
|
77
|
+
now = (now - mod) / ENCODING_LEN;
|
|
78
|
+
}
|
|
79
|
+
return str;
|
|
80
|
+
}
|
|
81
|
+
function encodeRandom(len, prng) {
|
|
82
|
+
let str = '';
|
|
83
|
+
for(; len > 0; len--){
|
|
84
|
+
str = randomChar(prng) + str;
|
|
85
|
+
}
|
|
86
|
+
return str;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* extract time & random from ulid
|
|
90
|
+
*
|
|
91
|
+
* @throws ULIDError
|
|
92
|
+
*/ export function parseULID(id) {
|
|
93
|
+
if (id.length !== TIME_LEN + RANDOM_LEN) {
|
|
94
|
+
throw createError('malformed ulid');
|
|
95
|
+
}
|
|
96
|
+
const time = id.substr(0, TIME_LEN).split('').reverse().reduce((carry, char, index)=>{
|
|
97
|
+
const encodingIndex = ENCODING.indexOf(char);
|
|
98
|
+
if (encodingIndex === -1) {
|
|
99
|
+
throw createError('invalid character found: ' + char);
|
|
100
|
+
}
|
|
101
|
+
return carry += encodingIndex * Math.pow(ENCODING_LEN, index);
|
|
102
|
+
}, 0);
|
|
103
|
+
if (time > TIME_MAX) {
|
|
104
|
+
throw createError('malformed ulid, timestamp too large');
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
timestamp: time,
|
|
108
|
+
random: id.substring(TIME_LEN)
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function createPrng() {
|
|
112
|
+
return ()=>{
|
|
113
|
+
const buffer = new Uint8Array(1);
|
|
114
|
+
getRandomValues(buffer);
|
|
115
|
+
return buffer[0] / 0xff;
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* create a ulid generator
|
|
120
|
+
*/ export function createULID({ monotonic = true, random = createPrng(), now = Date.now } = {}) {
|
|
121
|
+
if (!monotonic) {
|
|
122
|
+
return function ulid(seedTime) {
|
|
123
|
+
seedTime ||= now();
|
|
124
|
+
return encodeTime(seedTime, TIME_LEN) + encodeRandom(RANDOM_LEN, random);
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
let lastTime = 0;
|
|
128
|
+
let lastRandom;
|
|
129
|
+
return function ulid(seedTime) {
|
|
130
|
+
seedTime ||= now();
|
|
131
|
+
if (seedTime <= lastTime && lastRandom) {
|
|
132
|
+
const incrementedRandom = lastRandom = incrementBase32(lastRandom);
|
|
133
|
+
return encodeTime(lastTime, TIME_LEN) + incrementedRandom;
|
|
134
|
+
}
|
|
135
|
+
lastTime = seedTime;
|
|
136
|
+
const newRandom = lastRandom = encodeRandom(RANDOM_LEN, random);
|
|
137
|
+
return encodeTime(seedTime, TIME_LEN) + newRandom;
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* default monotonic ulid generator
|
|
142
|
+
*/ export let ulid = (...args)=>{
|
|
143
|
+
if (_real) {
|
|
144
|
+
return _real(...args);
|
|
145
|
+
}
|
|
146
|
+
// delay initialize crypto
|
|
147
|
+
_real = createULID();
|
|
148
|
+
ulid = _real;
|
|
149
|
+
return _real(...args);
|
|
150
|
+
};
|
|
151
|
+
let _real;
|
|
152
|
+
|
|
153
|
+
//# sourceMappingURL=ulid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/crypto/ulid.ts"],"sourcesContent":["import { getRandomValues } from './getRandomValues';\n\ntype PRNG = () => number;\n\n/**\n * Universally Unique Lexicographically Sortable Identifier\n *\n * @see https://github.com/ulid/spec ulid/spec\n */\nexport type ULID = (seedTime?: number) => string;\n\nexport interface ULIDError extends Error {\n source: string;\n}\n\nfunction createError(message: string): ULIDError {\n const err = new Error(message) as ULIDError;\n err.source = 'ulid';\n return err;\n}\n\n// These values should NEVER change. If\n// they do, we're no longer making ulids!\nconst ENCODING = '0123456789ABCDEFGHJKMNPQRSTVWXYZ'; // Crockford's Base32\nconst ENCODING_LEN = ENCODING.length;\nconst TIME_MAX = Math.pow(2, 48) - 1;\nconst TIME_LEN = 10;\nconst RANDOM_LEN = 16;\n\n/**\n * check give {@link str} is a valid ulid\n */\nexport function isULID(str: string | undefined | null): boolean {\n if (!str) {\n return false;\n }\n // ttttttttttrrrrrrrrrrrrrrrr\n return str.length === 26 && /^[0-9A-HJKMNP-TV-Z]{26}$/i.test(str);\n}\n\nfunction replaceCharAt(str: string, index: number, char: string) {\n if (index > str.length - 1) {\n return str;\n }\n return str.substr(0, index) + char + str.substr(index + 1);\n}\n\nfunction incrementBase32(str: string): string {\n let done;\n let index = str.length;\n let char;\n let charIndex;\n const maxCharIndex = ENCODING_LEN - 1;\n while (!done && index-- >= 0) {\n char = str[index];\n charIndex = ENCODING.indexOf(char);\n if (charIndex === -1) {\n throw createError('incorrectly encoded string');\n }\n if (charIndex === maxCharIndex) {\n str = replaceCharAt(str, index, ENCODING[0]);\n continue;\n }\n done = replaceCharAt(str, index, ENCODING[charIndex + 1]);\n }\n if (typeof done === 'string') {\n return done;\n }\n throw createError('cannot increment this string');\n}\n\nfunction randomChar(prng: PRNG): string {\n let rand = Math.floor(prng() * ENCODING_LEN);\n if (rand === ENCODING_LEN) {\n rand = ENCODING_LEN - 1;\n }\n return ENCODING.charAt(rand);\n}\n\nfunction encodeTime(now: number, len: number): string {\n if (isNaN(now)) {\n throw new Error(`${now} must be a number`);\n }\n if (now > TIME_MAX) {\n throw createError(`cannot encode time greater than ${TIME_MAX}`);\n }\n if (now < 0) {\n throw createError('time must be positive');\n }\n if (!Number.isInteger(now)) {\n throw createError('time must be an integer');\n }\n let mod;\n let str = '';\n for (; len > 0; len--) {\n mod = now % ENCODING_LEN;\n str = ENCODING.charAt(mod) + str;\n now = (now - mod) / ENCODING_LEN;\n }\n return str;\n}\n\nfunction encodeRandom(len: number, prng: PRNG): string {\n let str = '';\n for (; len > 0; len--) {\n str = randomChar(prng) + str;\n }\n return str;\n}\n\n/**\n * extract time & random from ulid\n *\n * @throws ULIDError\n */\nexport function parseULID(id: string): { timestamp: number; random: string } {\n if (id.length !== TIME_LEN + RANDOM_LEN) {\n throw createError('malformed ulid');\n }\n const time = id\n .substr(0, TIME_LEN)\n .split('')\n .reverse()\n .reduce((carry, char, index) => {\n const encodingIndex = ENCODING.indexOf(char);\n if (encodingIndex === -1) {\n throw createError('invalid character found: ' + char);\n }\n return (carry += encodingIndex * Math.pow(ENCODING_LEN, index));\n }, 0);\n if (time > TIME_MAX) {\n throw createError('malformed ulid, timestamp too large');\n }\n return { timestamp: time, random: id.substring(TIME_LEN) };\n}\n\nfunction createPrng(): PRNG {\n return () => {\n const buffer = new Uint8Array(1);\n getRandomValues(buffer);\n return buffer[0] / 0xff;\n };\n}\n\n/**\n * create a ulid generator\n */\nexport function createULID({\n monotonic = true,\n random = createPrng(),\n now = Date.now,\n}: { monotonic?: boolean; now?: () => number; random?: () => number } = {}) {\n if (!monotonic) {\n return function ulid(seedTime?: number): string {\n seedTime ||= now();\n return encodeTime(seedTime, TIME_LEN) + encodeRandom(RANDOM_LEN, random);\n };\n }\n\n let lastTime: number = 0;\n let lastRandom: string;\n return function ulid(seedTime?: number): string {\n seedTime ||= now();\n if (seedTime <= lastTime && lastRandom) {\n const incrementedRandom = (lastRandom = incrementBase32(lastRandom));\n return encodeTime(lastTime, TIME_LEN) + incrementedRandom;\n }\n lastTime = seedTime;\n const newRandom = (lastRandom = encodeRandom(RANDOM_LEN, random));\n return encodeTime(seedTime, TIME_LEN) + newRandom;\n };\n}\n\n/**\n * default monotonic ulid generator\n */\nexport let ulid: ULID = (...args) => {\n if (_real) {\n return _real(...args);\n }\n // delay initialize crypto\n _real = createULID();\n ulid = _real;\n return _real(...args);\n};\nlet _real: ULID;\n"],"names":["getRandomValues","createError","message","err","Error","source","ENCODING","ENCODING_LEN","length","TIME_MAX","Math","pow","TIME_LEN","RANDOM_LEN","isULID","str","test","replaceCharAt","index","char","substr","incrementBase32","done","charIndex","maxCharIndex","indexOf","randomChar","prng","rand","floor","charAt","encodeTime","now","len","isNaN","Number","isInteger","mod","encodeRandom","parseULID","id","time","split","reverse","reduce","carry","encodingIndex","timestamp","random","substring","createPrng","buffer","Uint8Array","createULID","monotonic","Date","ulid","seedTime","lastTime","lastRandom","incrementedRandom","newRandom","args","_real"],"mappings":"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"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { getHttpStatusText } from '../http/HttpStatus.js';
|
|
2
|
+
export class DetailError extends Error {
|
|
3
|
+
detail;
|
|
4
|
+
status;
|
|
5
|
+
description;
|
|
6
|
+
constructor(detail){
|
|
7
|
+
super(detail.message, {
|
|
8
|
+
cause: detail.cause
|
|
9
|
+
});
|
|
10
|
+
this.detail = detail;
|
|
11
|
+
this.status = detail.status;
|
|
12
|
+
this.description = detail.description;
|
|
13
|
+
}
|
|
14
|
+
toJSON() {
|
|
15
|
+
return {
|
|
16
|
+
code: this.detail.code,
|
|
17
|
+
message: this.message,
|
|
18
|
+
status: this.status,
|
|
19
|
+
description: this.description,
|
|
20
|
+
cause: this.cause
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
let DetailHolder = class DetailHolder {
|
|
25
|
+
message;
|
|
26
|
+
status;
|
|
27
|
+
code;
|
|
28
|
+
metadata;
|
|
29
|
+
description;
|
|
30
|
+
cause;
|
|
31
|
+
constructor({ status, message = getHttpStatusText(status), code = status, metadata, description, cause }){
|
|
32
|
+
this.message = message ?? String(status);
|
|
33
|
+
this.status = status;
|
|
34
|
+
this.code = code;
|
|
35
|
+
this.description = description;
|
|
36
|
+
this.metadata = metadata;
|
|
37
|
+
this.cause = cause;
|
|
38
|
+
}
|
|
39
|
+
with(o) {
|
|
40
|
+
if (typeof o === 'string') {
|
|
41
|
+
o = {
|
|
42
|
+
message: o
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
if (o === undefined) {
|
|
46
|
+
return new DetailHolder(this);
|
|
47
|
+
}
|
|
48
|
+
return new DetailHolder({
|
|
49
|
+
status: this.status,
|
|
50
|
+
code: this.code,
|
|
51
|
+
message: this.message,
|
|
52
|
+
metadata: this.metadata,
|
|
53
|
+
cause: this.cause,
|
|
54
|
+
...o
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
asError(o) {
|
|
58
|
+
if (typeof o === 'string') {
|
|
59
|
+
o = {
|
|
60
|
+
message: o
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
return new DetailError(this.with(o));
|
|
64
|
+
}
|
|
65
|
+
require(v, o) {
|
|
66
|
+
if (v === undefined || v === null) {
|
|
67
|
+
throw this.asError(o);
|
|
68
|
+
}
|
|
69
|
+
return v;
|
|
70
|
+
}
|
|
71
|
+
check(cond, o) {
|
|
72
|
+
switch(cond){
|
|
73
|
+
case false:
|
|
74
|
+
case undefined:
|
|
75
|
+
case null:
|
|
76
|
+
{
|
|
77
|
+
throw this.asError(o);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
throw(o) {
|
|
82
|
+
throw this.asError(o);
|
|
83
|
+
}
|
|
84
|
+
toJSON() {
|
|
85
|
+
return {
|
|
86
|
+
code: this.code,
|
|
87
|
+
message: this.message,
|
|
88
|
+
status: this.status,
|
|
89
|
+
description: this.description,
|
|
90
|
+
cause: this.cause,
|
|
91
|
+
metadata: this.metadata
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
asResponse() {
|
|
95
|
+
return new Response(JSON.stringify(this.toJSON()), {
|
|
96
|
+
status: this.status,
|
|
97
|
+
statusText: this.description,
|
|
98
|
+
headers: {
|
|
99
|
+
'Content-Type': 'application/json'
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
export class Errors {
|
|
105
|
+
static BadRequest = this.with({
|
|
106
|
+
status: 400
|
|
107
|
+
});
|
|
108
|
+
static Unauthorized = this.with({
|
|
109
|
+
status: 403
|
|
110
|
+
});
|
|
111
|
+
static Forbidden = this.with({
|
|
112
|
+
status: 403
|
|
113
|
+
});
|
|
114
|
+
static NotFound = this.with({
|
|
115
|
+
status: 404
|
|
116
|
+
});
|
|
117
|
+
static InternalServerError = this.with({
|
|
118
|
+
status: 500
|
|
119
|
+
});
|
|
120
|
+
static NotImplemented = this.with({
|
|
121
|
+
status: 501
|
|
122
|
+
});
|
|
123
|
+
static ServiceUnavailable = this.with({
|
|
124
|
+
status: 503
|
|
125
|
+
});
|
|
126
|
+
static resolvers = [];
|
|
127
|
+
static with(init) {
|
|
128
|
+
return new DetailHolder(init);
|
|
129
|
+
}
|
|
130
|
+
static ok(res, o) {
|
|
131
|
+
if (res.ok) {
|
|
132
|
+
return res;
|
|
133
|
+
}
|
|
134
|
+
throw this.with({
|
|
135
|
+
description: res.statusText,
|
|
136
|
+
status: res.status,
|
|
137
|
+
...o,
|
|
138
|
+
metadata: {
|
|
139
|
+
...o?.metadata,
|
|
140
|
+
response: res
|
|
141
|
+
}
|
|
142
|
+
}).asError();
|
|
143
|
+
}
|
|
144
|
+
static resolve(e) {
|
|
145
|
+
if (e instanceof DetailHolder) {
|
|
146
|
+
return e;
|
|
147
|
+
}
|
|
148
|
+
if (e instanceof DetailError) {
|
|
149
|
+
return e.detail;
|
|
150
|
+
}
|
|
151
|
+
for (const resolver of this.resolvers){
|
|
152
|
+
const r = resolver(e);
|
|
153
|
+
if (r) {
|
|
154
|
+
return r;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (e instanceof Error) {
|
|
158
|
+
const { message, code, status } = e;
|
|
159
|
+
// can get status from NestJS HttpException
|
|
160
|
+
return new DetailHolder({
|
|
161
|
+
message,
|
|
162
|
+
status: parseInt(status) || 500,
|
|
163
|
+
code,
|
|
164
|
+
cause: e
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
return new DetailHolder({
|
|
168
|
+
message: e.message,
|
|
169
|
+
status: 500,
|
|
170
|
+
cause: e
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
} // interface ZodError {
|
|
174
|
+
// path: Array<string | number>;
|
|
175
|
+
// message: string;
|
|
176
|
+
// code: string;
|
|
177
|
+
// expected?: any;
|
|
178
|
+
// received?: any;
|
|
179
|
+
// }
|
|
180
|
+
|
|
181
|
+
//# sourceMappingURL=Errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/errors/Errors.ts"],"sourcesContent":["import { getHttpStatusText } from '../http/HttpStatus';\n\nexport interface ErrorDetailInit {\n message?: string;\n status: number;\n description?: string;\n code?: number | string;\n metadata?: Record<string, any>;\n cause?: any;\n}\n\nexport class DetailError extends Error {\n readonly status: number;\n readonly description?: string;\n\n constructor(readonly detail: ErrorDetail) {\n super(detail.message, {\n cause: detail.cause,\n });\n this.status = detail.status;\n this.description = detail.description;\n }\n\n toJSON() {\n return {\n code: this.detail.code,\n message: this.message,\n status: this.status,\n description: this.description,\n cause: this.cause,\n };\n }\n}\n\nclass DetailHolder implements ErrorDetail {\n readonly message: string;\n readonly status: number;\n readonly code: number | string;\n readonly metadata?: Record<string, any>;\n readonly description?: string;\n readonly cause?: any;\n\n constructor({\n status,\n message = getHttpStatusText(status),\n code = status,\n metadata,\n description,\n cause,\n }: ErrorDetailInit) {\n this.message = message ?? String(status);\n this.status = status;\n this.code = code;\n this.description = description;\n this.metadata = metadata;\n this.cause = cause;\n }\n\n with(o?: Partial<ErrorDetailInit> | string): DetailHolder {\n if (typeof o === 'string') {\n o = { message: o };\n }\n\n if (o === undefined) {\n return new DetailHolder(this);\n }\n\n return new DetailHolder({\n status: this.status,\n code: this.code,\n message: this.message,\n metadata: this.metadata,\n cause: this.cause,\n ...o,\n });\n }\n\n asError(o?: Partial<ErrorDetailInit> | string): Error {\n if (typeof o === 'string') {\n o = { message: o };\n }\n\n return new DetailError(this.with(o));\n }\n\n require(v: any, o?: Partial<ErrorDetailInit> | string): any {\n if (v === undefined || v === null) {\n throw this.asError(o);\n }\n\n return v;\n }\n\n check(cond: any, o?: Partial<ErrorDetailInit> | string) {\n switch (cond) {\n case false:\n case undefined:\n case null: {\n throw this.asError(o);\n }\n }\n }\n\n throw(o?: string | Partial<ErrorDetailInit>): never {\n throw this.asError(o);\n }\n\n toJSON() {\n return {\n code: this.code,\n message: this.message,\n status: this.status,\n description: this.description,\n cause: this.cause,\n metadata: this.metadata,\n };\n }\n\n asResponse(): Response {\n return new Response(JSON.stringify(this.toJSON()), {\n status: this.status,\n statusText: this.description,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n }\n}\n\nexport interface ErrorDetail {\n readonly message: string;\n readonly status: number;\n readonly code?: number | string;\n readonly metadata?: Record<string, any>;\n readonly description?: string;\n readonly cause?: any;\n\n with(message: string): ErrorDetail;\n\n with(o?: Partial<ErrorDetailInit>): ErrorDetail;\n\n asError(o?: string | Partial<ErrorDetailInit>): Error;\n\n asResponse(): Response;\n\n throw(o?: string | Partial<ErrorDetailInit>): never;\n\n require<T>(v: T | undefined, o?: Partial<ErrorDetailInit> | string): NonNullable<T>;\n\n check(condition: boolean, o?: Partial<ErrorDetailInit> | string): asserts condition;\n\n check<T>(v: T | undefined | null, o?: Partial<ErrorDetailInit> | string): asserts v is NonNullable<T>;\n}\n\nexport class Errors {\n static BadRequest: ErrorDetail = this.with({ status: 400 });\n static Unauthorized: ErrorDetail = this.with({ status: 403 });\n static Forbidden: ErrorDetail = this.with({ status: 403 });\n static NotFound: ErrorDetail = this.with({ status: 404 });\n static InternalServerError: ErrorDetail = this.with({ status: 500 });\n static NotImplemented: ErrorDetail = this.with({ status: 501 });\n static ServiceUnavailable: ErrorDetail = this.with({ status: 503 });\n\n static resolvers: ((e: any) => ErrorDetail | void)[] = [];\n\n static with(init: ErrorDetailInit): ErrorDetail {\n return new DetailHolder(init);\n }\n\n static ok(res: Response, o?: Partial<ErrorDetailInit>) {\n if (res.ok) {\n return res;\n }\n throw this.with({\n description: res.statusText,\n status: res.status,\n ...o,\n metadata: {\n ...o?.metadata,\n response: res,\n },\n }).asError();\n }\n\n static resolve(e: any): ErrorDetail {\n if (e instanceof DetailHolder) {\n return e;\n }\n\n if (e instanceof DetailError) {\n return e.detail;\n }\n\n for (const resolver of this.resolvers) {\n const r = resolver(e);\n if (r) {\n return r;\n }\n }\n\n if (e instanceof Error) {\n const { message, code, status } = e as any;\n // can get status from NestJS HttpException\n return new DetailHolder({\n message,\n status: parseInt(status) || 500,\n code,\n cause: e,\n });\n }\n\n return new DetailHolder({\n message: e.message,\n status: 500,\n cause: e,\n });\n }\n}\n\n// interface ZodError {\n// path: Array<string | number>;\n// message: string;\n// code: string;\n// expected?: any;\n// received?: any;\n// }\n"],"names":["getHttpStatusText","DetailError","Error","status","description","constructor","detail","message","cause","toJSON","code","DetailHolder","metadata","String","with","o","undefined","asError","require","v","check","cond","throw","asResponse","Response","JSON","stringify","statusText","headers","Errors","BadRequest","Unauthorized","Forbidden","NotFound","InternalServerError","NotImplemented","ServiceUnavailable","resolvers","init","ok","res","response","resolve","e","resolver","r","parseInt"],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { getGlobalThis } from '../isomorphics/getGlobalThis.js';
|
|
2
|
+
export function createFetchWith({ fetch = getGlobalThis().fetch, onRequest = (ctx)=>ctx.next(ctx.url, ctx.req), onResponse = (ctx)=>ctx.res }) {
|
|
3
|
+
return async (urlOrRequest, init)=>{
|
|
4
|
+
const url = String(urlOrRequest);
|
|
5
|
+
let req = init || {};
|
|
6
|
+
const nextFetch = req.fetch || fetch;
|
|
7
|
+
const res = await onRequest({
|
|
8
|
+
url,
|
|
9
|
+
req,
|
|
10
|
+
next: (url, init)=>{
|
|
11
|
+
req = init;
|
|
12
|
+
return nextFetch(url, init);
|
|
13
|
+
}
|
|
14
|
+
}) ?? await nextFetch(url, init);
|
|
15
|
+
return onResponse({
|
|
16
|
+
url,
|
|
17
|
+
req,
|
|
18
|
+
res
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=createFetchWith.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/fetch/createFetchWith.ts"],"sourcesContent":["import { MaybePromise } from '../asyncs/MaybePromise';\nimport { getGlobalThis } from '../isomorphics/getGlobalThis';\nimport { type FetchLike } from './types';\n\nexport function createFetchWith({\n fetch = getGlobalThis().fetch,\n onRequest = (ctx) => ctx.next(ctx.url, ctx.req),\n onResponse = (ctx) => ctx.res,\n}: {\n fetch?: FetchLike;\n onRequest?: (ctx: {\n url: string;\n req: RequestInit;\n next: (url: string, req: RequestInit) => Promise<Response>;\n }) => MaybePromise<Response | void>;\n onResponse?: (ctx: { url: string; req: RequestInit; res: Response }) => MaybePromise<Response>;\n}) {\n return async (urlOrRequest: string | URL | Request, init?: RequestInit & { fetch?: FetchLike }) => {\n const url = String(urlOrRequest);\n let req = init || {};\n const nextFetch = req.fetch || fetch;\n const res =\n (await onRequest({\n url,\n req,\n next: (url, init) => {\n req = init;\n return nextFetch(url, init);\n },\n })) ?? (await nextFetch(url, init));\n return onResponse({ url, req, res });\n };\n}\n"],"names":["getGlobalThis","createFetchWith","fetch","onRequest","ctx","next","url","req","onResponse","res","urlOrRequest","init","String","nextFetch"],"mappings":"AACA,SAASA,aAAa,QAAQ,+BAA+B;AAG7D,OAAO,SAASC,gBAAgB,EAC9BC,QAAQF,gBAAgBE,KAAK,EAC7BC,YAAY,CAACC,MAAQA,IAAIC,IAAI,CAACD,IAAIE,GAAG,EAAEF,IAAIG,GAAG,CAAC,EAC/CC,aAAa,CAACJ,MAAQA,IAAIK,GAAG,EAS9B;IACC,OAAO,OAAOC,cAAsCC;QAClD,MAAML,MAAMM,OAAOF;QACnB,IAAIH,MAAMI,QAAQ,CAAC;QACnB,MAAME,YAAYN,IAAIL,KAAK,IAAIA;QAC/B,MAAMO,MACJ,AAAC,MAAMN,UAAU;YACfG;YACAC;YACAF,MAAM,CAACC,KAAKK;gBACVJ,MAAMI;gBACN,OAAOE,UAAUP,KAAKK;YACxB;QACF,MAAQ,MAAME,UAAUP,KAAKK;QAC/B,OAAOH,WAAW;YAAEF;YAAKC;YAAKE;QAAI;IACpC;AACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { createFetchWith } from './createFetchWith.js';
|
|
2
|
+
import { dumpRequest } from './dumpRequest.js';
|
|
3
|
+
import { dumpResponse } from './dumpResponse.js';
|
|
4
|
+
export function createFetchWithLogging({ fetch, log = console.log } = {}) {
|
|
5
|
+
return createFetchWith({
|
|
6
|
+
fetch,
|
|
7
|
+
onRequest: ({ url, req })=>{
|
|
8
|
+
void dumpRequest({
|
|
9
|
+
url,
|
|
10
|
+
req,
|
|
11
|
+
log
|
|
12
|
+
});
|
|
13
|
+
},
|
|
14
|
+
onResponse: ({ url, req, res })=>{
|
|
15
|
+
return dumpResponse({
|
|
16
|
+
url,
|
|
17
|
+
req,
|
|
18
|
+
res,
|
|
19
|
+
log
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=createFetchWithLogging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/fetch/createFetchWithLogging.ts"],"sourcesContent":["import { createFetchWith } from './createFetchWith';\nimport { dumpRequest } from './dumpRequest';\nimport { dumpResponse } from './dumpResponse';\nimport { type FetchLike } from './types';\n\nexport function createFetchWithLogging({\n fetch,\n log = console.log,\n}: {\n fetch?: FetchLike;\n log?: (s: string) => void;\n} = {}): FetchLike {\n return createFetchWith({\n fetch,\n onRequest: ({ url, req }) => {\n void dumpRequest({ url, req, log });\n },\n onResponse: ({ url, req, res }) => {\n return dumpResponse({ url, req, res, log });\n },\n });\n}\n"],"names":["createFetchWith","dumpRequest","dumpResponse","createFetchWithLogging","fetch","log","console","onRequest","url","req","onResponse","res"],"mappings":"AAAA,SAASA,eAAe,QAAQ,oBAAoB;AACpD,SAASC,WAAW,QAAQ,gBAAgB;AAC5C,SAASC,YAAY,QAAQ,iBAAiB;AAG9C,OAAO,SAASC,uBAAuB,EACrCC,KAAK,EACLC,MAAMC,QAAQD,GAAG,EAIlB,GAAG,CAAC,CAAC;IACJ,OAAOL,gBAAgB;QACrBI;QACAG,WAAW,CAAC,EAAEC,GAAG,EAAEC,GAAG,EAAE;YACtB,KAAKR,YAAY;gBAAEO;gBAAKC;gBAAKJ;YAAI;QACnC;QACAK,YAAY,CAAC,EAAEF,GAAG,EAAEC,GAAG,EAAEE,GAAG,EAAE;YAC5B,OAAOT,aAAa;gBAAEM;gBAAKC;gBAAKE;gBAAKN;YAAI;QAC3C;IACF;AACF"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { getGlobalThis } from '../isomorphics/getGlobalThis.js';
|
|
2
|
+
export function createFetchWithRetry({ fetch = getGlobalThis().fetch, retries = 3, retryDelay = 1000, retryOn = [] } = {}) {
|
|
3
|
+
// https://github.com/jonbern/fetch-retry/blob/master/index.js
|
|
4
|
+
return function fetchRetry(input, init) {
|
|
5
|
+
return new Promise(function(resolve, reject) {
|
|
6
|
+
var wrappedFetch = function(attempt) {
|
|
7
|
+
// As of node 18, this is no longer needed since node comes with native support for fetch:
|
|
8
|
+
/* istanbul ignore next */ var _input = typeof Request !== 'undefined' && input instanceof Request ? input.clone() : input;
|
|
9
|
+
fetch(_input, init).then(function(response) {
|
|
10
|
+
if (Array.isArray(retryOn) && retryOn.indexOf(response.status) === -1) {
|
|
11
|
+
resolve(response);
|
|
12
|
+
} else if (typeof retryOn === 'function') {
|
|
13
|
+
try {
|
|
14
|
+
return Promise.resolve(retryOn(attempt, null, response)).then(function(retryOnResponse) {
|
|
15
|
+
if (retryOnResponse) {
|
|
16
|
+
retry(attempt, null, response);
|
|
17
|
+
} else {
|
|
18
|
+
resolve(response);
|
|
19
|
+
}
|
|
20
|
+
}).catch(reject);
|
|
21
|
+
} catch (error) {
|
|
22
|
+
reject(error);
|
|
23
|
+
}
|
|
24
|
+
} else {
|
|
25
|
+
if (attempt < retries) {
|
|
26
|
+
retry(attempt, null, response);
|
|
27
|
+
} else {
|
|
28
|
+
resolve(response);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return;
|
|
32
|
+
}).catch(function(error) {
|
|
33
|
+
if (typeof retryOn === 'function') {
|
|
34
|
+
try {
|
|
35
|
+
// eslint-disable-next-line no-undef
|
|
36
|
+
Promise.resolve(retryOn(attempt, error, null)).then(function(retryOnResponse) {
|
|
37
|
+
if (retryOnResponse) {
|
|
38
|
+
retry(attempt, error, null);
|
|
39
|
+
} else {
|
|
40
|
+
reject(error);
|
|
41
|
+
}
|
|
42
|
+
}).catch(function(error) {
|
|
43
|
+
reject(error);
|
|
44
|
+
});
|
|
45
|
+
} catch (error) {
|
|
46
|
+
reject(error);
|
|
47
|
+
}
|
|
48
|
+
} else if (attempt < retries) {
|
|
49
|
+
retry(attempt, error, null);
|
|
50
|
+
} else {
|
|
51
|
+
reject(error);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
function retry(attempt, error, response) {
|
|
56
|
+
let delay = typeof retryDelay === 'function' ? retryDelay(attempt, error, response) : retryDelay;
|
|
57
|
+
setTimeout(function() {
|
|
58
|
+
wrappedFetch(++attempt);
|
|
59
|
+
}, delay);
|
|
60
|
+
}
|
|
61
|
+
wrappedFetch(0);
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
//# sourceMappingURL=createFetchWithRetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/fetch/createFetchWithRetry.ts"],"sourcesContent":["import { getGlobalThis } from '../isomorphics/getGlobalThis';\nimport { FetchLike } from './types';\n\ntype RequestDelayFunction = (attempt: number, error: Error | null, response: Response | null) => number;\ntype RequestRetryOnFunction = (\n attempt: number,\n error: Error | null,\n response: Response | null,\n) => boolean | Promise<boolean>;\n\nexport interface FetchWithRetryOptions {\n fetch?: FetchLike;\n retries?: number;\n retryDelay?: number | RequestDelayFunction;\n retryOn?: number[] | RequestRetryOnFunction;\n}\n\nexport function createFetchWithRetry({\n fetch = getGlobalThis().fetch,\n retries = 3,\n retryDelay = 1000,\n retryOn = [],\n}: FetchWithRetryOptions = {}): FetchLike {\n // https://github.com/jonbern/fetch-retry/blob/master/index.js\n\n return function fetchRetry(input: string | URL | Request, init?: RequestInit) {\n return new Promise(function (resolve, reject) {\n var wrappedFetch = function (attempt: number) {\n // As of node 18, this is no longer needed since node comes with native support for fetch:\n /* istanbul ignore next */\n var _input = typeof Request !== 'undefined' && input instanceof Request ? input.clone() : input;\n fetch(_input, init)\n .then(function (response) {\n if (Array.isArray(retryOn) && retryOn.indexOf(response.status) === -1) {\n resolve(response);\n } else if (typeof retryOn === 'function') {\n try {\n return Promise.resolve(retryOn(attempt, null, response))\n .then(function (retryOnResponse) {\n if (retryOnResponse) {\n retry(attempt, null, response);\n } else {\n resolve(response);\n }\n })\n .catch(reject);\n } catch (error) {\n reject(error);\n }\n } else {\n if (attempt < retries) {\n retry(attempt, null, response);\n } else {\n resolve(response);\n }\n }\n return;\n })\n .catch(function (error) {\n if (typeof retryOn === 'function') {\n try {\n // eslint-disable-next-line no-undef\n Promise.resolve(retryOn(attempt, error, null))\n .then(function (retryOnResponse) {\n if (retryOnResponse) {\n retry(attempt, error, null);\n } else {\n reject(error);\n }\n })\n .catch(function (error) {\n reject(error);\n });\n } catch (error) {\n reject(error);\n }\n } else if (attempt < retries) {\n retry(attempt, error, null);\n } else {\n reject(error);\n }\n });\n };\n\n function retry(attempt: number, error: any, response: Response | null) {\n let delay = typeof retryDelay === 'function' ? retryDelay(attempt, error, response) : retryDelay;\n setTimeout(function () {\n wrappedFetch(++attempt);\n }, delay);\n }\n\n wrappedFetch(0);\n });\n };\n}\n"],"names":["getGlobalThis","createFetchWithRetry","fetch","retries","retryDelay","retryOn","fetchRetry","input","init","Promise","resolve","reject","wrappedFetch","attempt","_input","Request","clone","then","response","Array","isArray","indexOf","status","retryOnResponse","retry","catch","error","delay","setTimeout"],"mappings":"AAAA,SAASA,aAAa,QAAQ,+BAA+B;AAiB7D,OAAO,SAASC,qBAAqB,EACnCC,QAAQF,gBAAgBE,KAAK,EAC7BC,UAAU,CAAC,EACXC,aAAa,IAAI,EACjBC,UAAU,EAAE,EACU,GAAG,CAAC,CAAC;IAC3B,8DAA8D;IAE9D,OAAO,SAASC,WAAWC,KAA6B,EAAEC,IAAkB;QAC1E,OAAO,IAAIC,QAAQ,SAAUC,OAAO,EAAEC,MAAM;YAC1C,IAAIC,eAAe,SAAUC,OAAe;gBAC1C,0FAA0F;gBAC1F,wBAAwB,GACxB,IAAIC,SAAS,OAAOC,YAAY,eAAeR,iBAAiBQ,UAAUR,MAAMS,KAAK,KAAKT;gBAC1FL,MAAMY,QAAQN,MACXS,IAAI,CAAC,SAAUC,QAAQ;oBACtB,IAAIC,MAAMC,OAAO,CAACf,YAAYA,QAAQgB,OAAO,CAACH,SAASI,MAAM,MAAM,CAAC,GAAG;wBACrEZ,QAAQQ;oBACV,OAAO,IAAI,OAAOb,YAAY,YAAY;wBACxC,IAAI;4BACF,OAAOI,QAAQC,OAAO,CAACL,QAAQQ,SAAS,MAAMK,WAC3CD,IAAI,CAAC,SAAUM,eAAe;gCAC7B,IAAIA,iBAAiB;oCACnBC,MAAMX,SAAS,MAAMK;gCACvB,OAAO;oCACLR,QAAQQ;gCACV;4BACF,GACCO,KAAK,CAACd;wBACX,EAAE,OAAOe,OAAO;4BACdf,OAAOe;wBACT;oBACF,OAAO;wBACL,IAAIb,UAAUV,SAAS;4BACrBqB,MAAMX,SAAS,MAAMK;wBACvB,OAAO;4BACLR,QAAQQ;wBACV;oBACF;oBACA;gBACF,GACCO,KAAK,CAAC,SAAUC,KAAK;oBACpB,IAAI,OAAOrB,YAAY,YAAY;wBACjC,IAAI;4BACF,oCAAoC;4BACpCI,QAAQC,OAAO,CAACL,QAAQQ,SAASa,OAAO,OACrCT,IAAI,CAAC,SAAUM,eAAe;gCAC7B,IAAIA,iBAAiB;oCACnBC,MAAMX,SAASa,OAAO;gCACxB,OAAO;oCACLf,OAAOe;gCACT;4BACF,GACCD,KAAK,CAAC,SAAUC,KAAK;gCACpBf,OAAOe;4BACT;wBACJ,EAAE,OAAOA,OAAO;4BACdf,OAAOe;wBACT;oBACF,OAAO,IAAIb,UAAUV,SAAS;wBAC5BqB,MAAMX,SAASa,OAAO;oBACxB,OAAO;wBACLf,OAAOe;oBACT;gBACF;YACJ;YAEA,SAASF,MAAMX,OAAe,EAAEa,KAAU,EAAER,QAAyB;gBACnE,IAAIS,QAAQ,OAAOvB,eAAe,aAAaA,WAAWS,SAASa,OAAOR,YAAYd;gBACtFwB,WAAW;oBACThB,aAAa,EAAEC;gBACjB,GAAGc;YACL;YAEAf,aAAa;QACf;IACF;AACF"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export function dumpRequest({ url, req = {}, log = console.log }) {
|
|
2
|
+
const { method = 'GET' } = req;
|
|
3
|
+
let out = `-> ${method} ${url}
|
|
4
|
+
${Array.from(new Headers(req.headers).entries()).map(([k, v])=>`${k}: ${v}`).join('\n')}
|
|
5
|
+
`;
|
|
6
|
+
let done;
|
|
7
|
+
if (req.body) {
|
|
8
|
+
let hdr = new Headers(req.headers);
|
|
9
|
+
let ct = hdr.get('content-type');
|
|
10
|
+
if (ct === 'application/octet-stream') {
|
|
11
|
+
// skip
|
|
12
|
+
} else if (req.body instanceof ReadableStream) {
|
|
13
|
+
const [a, b] = req.body.tee();
|
|
14
|
+
req.body = a;
|
|
15
|
+
const signal = req.signal;
|
|
16
|
+
done = Promise.resolve().then(async ()=>{
|
|
17
|
+
const reader = b.getReader();
|
|
18
|
+
log(out);
|
|
19
|
+
while(true){
|
|
20
|
+
if (signal?.aborted) {
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
let { done, value } = await reader.read();
|
|
24
|
+
value instanceof Uint8Array && (value = new TextDecoder().decode(value));
|
|
25
|
+
out += value;
|
|
26
|
+
log(value);
|
|
27
|
+
if (!done) {
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// maybe for archive
|
|
32
|
+
out += `\n`;
|
|
33
|
+
return out;
|
|
34
|
+
});
|
|
35
|
+
} else {
|
|
36
|
+
out += `
|
|
37
|
+
${req.body}
|
|
38
|
+
`;
|
|
39
|
+
}
|
|
40
|
+
log(out);
|
|
41
|
+
}
|
|
42
|
+
return done || Promise.resolve(out);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
//# sourceMappingURL=dumpRequest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/fetch/dumpRequest.ts"],"sourcesContent":["export function dumpRequest({\n url,\n req = {},\n log = console.log,\n}: {\n url: string;\n req?: RequestInit;\n log?: (s: string) => void;\n}) {\n const { method = 'GET' } = req;\n let out = `-> ${method} ${url}\n${Array.from(new Headers(req.headers).entries())\n .map(([k, v]) => `${k}: ${v}`)\n .join('\\n')}\n`;\n\n let done: Promise<string> | undefined;\n if (req.body) {\n let hdr = new Headers(req.headers);\n let ct = hdr.get('content-type');\n if (ct === 'application/octet-stream') {\n // skip\n } else if (req.body instanceof ReadableStream) {\n const [a, b] = req.body.tee();\n req.body = a;\n const signal = req.signal;\n done = Promise.resolve().then(async () => {\n const reader = b.getReader();\n log(out);\n while (true) {\n if (signal?.aborted) {\n break;\n }\n\n let { done, value } = await reader.read();\n value instanceof Uint8Array && (value = new TextDecoder().decode(value));\n out += value;\n log(value);\n if (!done) {\n break;\n }\n }\n // maybe for archive\n out += `\\n`;\n return out;\n });\n } else {\n out += `\n${req.body}\n`;\n }\n log(out);\n }\n return done || Promise.resolve(out);\n}\n"],"names":["dumpRequest","url","req","log","console","method","out","Array","from","Headers","headers","entries","map","k","v","join","done","body","hdr","ct","get","ReadableStream","a","b","tee","signal","Promise","resolve","then","reader","getReader","aborted","value","read","Uint8Array","TextDecoder","decode"],"mappings":"AAAA,OAAO,SAASA,YAAY,EAC1BC,GAAG,EACHC,MAAM,CAAC,CAAC,EACRC,MAAMC,QAAQD,GAAG,EAKlB;IACC,MAAM,EAAEE,SAAS,KAAK,EAAE,GAAGH;IAC3B,IAAII,MAAM,CAAC,GAAG,EAAED,OAAO,CAAC,EAAEJ,IAAI;AAChC,EAAEM,MAAMC,IAAI,CAAC,IAAIC,QAAQP,IAAIQ,OAAO,EAAEC,OAAO,IAC1CC,GAAG,CAAC,CAAC,CAACC,GAAGC,EAAE,GAAK,CAAC,EAAED,EAAE,EAAE,EAAEC,EAAE,CAAC,EAC5BC,IAAI,CAAC,MAAM;AACd,CAAC;IAEC,IAAIC;IACJ,IAAId,IAAIe,IAAI,EAAE;QACZ,IAAIC,MAAM,IAAIT,QAAQP,IAAIQ,OAAO;QACjC,IAAIS,KAAKD,IAAIE,GAAG,CAAC;QACjB,IAAID,OAAO,4BAA4B;QACrC,OAAO;QACT,OAAO,IAAIjB,IAAIe,IAAI,YAAYI,gBAAgB;YAC7C,MAAM,CAACC,GAAGC,EAAE,GAAGrB,IAAIe,IAAI,CAACO,GAAG;YAC3BtB,IAAIe,IAAI,GAAGK;YACX,MAAMG,SAASvB,IAAIuB,MAAM;YACzBT,OAAOU,QAAQC,OAAO,GAAGC,IAAI,CAAC;gBAC5B,MAAMC,SAASN,EAAEO,SAAS;gBAC1B3B,IAAIG;gBACJ,MAAO,KAAM;oBACX,IAAImB,QAAQM,SAAS;wBACnB;oBACF;oBAEA,IAAI,EAAEf,IAAI,EAAEgB,KAAK,EAAE,GAAG,MAAMH,OAAOI,IAAI;oBACvCD,iBAAiBE,cAAeF,CAAAA,QAAQ,IAAIG,cAAcC,MAAM,CAACJ,MAAK;oBACtE1B,OAAO0B;oBACP7B,IAAI6B;oBACJ,IAAI,CAAChB,MAAM;wBACT;oBACF;gBACF;gBACA,oBAAoB;gBACpBV,OAAO,CAAC,EAAE,CAAC;gBACX,OAAOA;YACT;QACF,OAAO;YACLA,OAAO,CAAC;AACd,EAAEJ,IAAIe,IAAI,CAAC;AACX,CAAC;QACG;QACAd,IAAIG;IACN;IACA,OAAOU,QAAQU,QAAQC,OAAO,CAACrB;AACjC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export async function dumpResponse({ res, url, req, log = console.log }) {
|
|
2
|
+
let out = `<- ${res.status} ${res.statusText} ${req.method} ${url}
|
|
3
|
+
${Array.from(res.headers.entries()).map(([k, v])=>`${k}: ${v}`).join('\n')}
|
|
4
|
+
`;
|
|
5
|
+
let contentType = res.headers.get('content-type');
|
|
6
|
+
// TODO text/event-stream
|
|
7
|
+
if (contentType?.includes('application/json') || contentType?.includes('text/plain')) {
|
|
8
|
+
const body = await res.text();
|
|
9
|
+
out += `\n${body}\n`;
|
|
10
|
+
res = new Response(body, res);
|
|
11
|
+
}
|
|
12
|
+
log(out);
|
|
13
|
+
return res;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=dumpResponse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/fetch/dumpResponse.ts"],"sourcesContent":["export async function dumpResponse({\n res,\n url,\n req,\n log = console.log,\n}: {\n res: Response;\n url: string;\n req: RequestInit;\n log?: (s: string) => void;\n}) {\n let out = `<- ${res.status} ${res.statusText} ${req.method} ${url}\n${Array.from(res.headers.entries())\n .map(([k, v]) => `${k}: ${v}`)\n .join('\\n')}\n `;\n let contentType = res.headers.get('content-type');\n // TODO text/event-stream\n if (contentType?.includes('application/json') || contentType?.includes('text/plain')) {\n const body = await res.text();\n out += `\\n${body}\\n`;\n res = new Response(body, res);\n }\n\n log(out);\n\n return res;\n}\n"],"names":["dumpResponse","res","url","req","log","console","out","status","statusText","method","Array","from","headers","entries","map","k","v","join","contentType","get","includes","body","text","Response"],"mappings":"AAAA,OAAO,eAAeA,aAAa,EACjCC,GAAG,EACHC,GAAG,EACHC,GAAG,EACHC,MAAMC,QAAQD,GAAG,EAMlB;IACC,IAAIE,MAAM,CAAC,GAAG,EAAEL,IAAIM,MAAM,CAAC,CAAC,EAAEN,IAAIO,UAAU,CAAC,CAAC,EAAEL,IAAIM,MAAM,CAAC,CAAC,EAAEP,IAAI;AACpE,EAAEQ,MAAMC,IAAI,CAACV,IAAIW,OAAO,CAACC,OAAO,IAC7BC,GAAG,CAAC,CAAC,CAACC,GAAGC,EAAE,GAAK,CAAC,EAAED,EAAE,EAAE,EAAEC,EAAE,CAAC,EAC5BC,IAAI,CAAC,MAAM;GACX,CAAC;IACF,IAAIC,cAAcjB,IAAIW,OAAO,CAACO,GAAG,CAAC;IAClC,yBAAyB;IACzB,IAAID,aAAaE,SAAS,uBAAuBF,aAAaE,SAAS,eAAe;QACpF,MAAMC,OAAO,MAAMpB,IAAIqB,IAAI;QAC3BhB,OAAO,CAAC,EAAE,EAAEe,KAAK,EAAE,CAAC;QACpBpB,MAAM,IAAIsB,SAASF,MAAMpB;IAC3B;IAEAG,IAAIE;IAEJ,OAAOL;AACT"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { createFetchWith } from './createFetchWith.js';
|
|
2
|
+
export { createFetchWithLogging } from './createFetchWithLogging.js';
|
|
3
|
+
export { dumpRequest } from './dumpRequest.js';
|
|
4
|
+
export { dumpResponse } from './dumpResponse.js';
|
|
5
|
+
export { createFetchWithRetry } from './createFetchWithRetry.js';
|
|
6
|
+
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/fetch/index.ts"],"sourcesContent":["export type * from './types';\nexport { createFetchWith } from './createFetchWith';\nexport { createFetchWithLogging } from './createFetchWithLogging';\nexport { dumpRequest } from './dumpRequest';\nexport { dumpResponse } from './dumpResponse';\nexport { createFetchWithRetry, type FetchWithRetryOptions } from './createFetchWithRetry';\n"],"names":["createFetchWith","createFetchWithLogging","dumpRequest","dumpResponse","createFetchWithRetry"],"mappings":"AACA,SAASA,eAAe,QAAQ,oBAAoB;AACpD,SAASC,sBAAsB,QAAQ,2BAA2B;AAClE,SAASC,WAAW,QAAQ,gBAAgB;AAC5C,SAASC,YAAY,QAAQ,iBAAiB;AAC9C,SAASC,oBAAoB,QAAoC,yBAAyB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/fetch/types.ts"],"sourcesContent":["export type FetchLike<R extends RequestInit = RequestInit> = (\n url: string | URL | Request,\n init?: R,\n) => Promise<Response>;\n"],"names":[],"mappings":"AAAA,WAGuB"}
|