@wener/utils 1.1.37 → 1.1.38
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/browsers/download.js +20 -11
- package/lib/browsers/download.js.map +1 -1
- package/lib/cn/division/DivisionCode.js +204 -0
- package/lib/cn/division/DivisionCode.js.map +1 -0
- package/lib/cn/id/Mod11Checksum.js +46 -0
- package/lib/cn/id/Mod11Checksum.js.map +1 -0
- package/lib/cn/id/ResidentIdNumber.js +89 -0
- package/lib/cn/id/ResidentIdNumber.js.map +1 -0
- package/lib/cn/id/types.js +8 -0
- package/lib/cn/id/types.js.map +1 -0
- package/lib/cn/index.js +9 -1
- package/lib/cn/index.js.map +1 -1
- package/lib/cn/uscc/Mod31Checksum.js +52 -0
- package/lib/cn/uscc/Mod31Checksum.js.map +1 -0
- package/lib/cn/uscc/USCC.js +97 -0
- package/lib/cn/uscc/USCC.js.map +1 -0
- package/lib/cn/uscc/isUSCC.js +8 -0
- package/lib/cn/uscc/isUSCC.js.map +1 -0
- package/lib/crypto/getRandomValues.js +1 -1
- package/lib/crypto/getRandomValues.js.map +1 -1
- package/lib/crypto/randomUUID.js +1 -1
- package/lib/crypto/randomUUID.js.map +1 -1
- package/lib/crypto/randomUUIDv7.js +3 -0
- package/lib/crypto/randomUUIDv7.js.map +1 -0
- package/lib/errors/Errors.js +1 -1
- package/lib/errors/Errors.js.map +1 -1
- package/lib/fetch/HttpStatus.js.map +1 -0
- package/lib/fetch/createFetchWith.js +1 -1
- package/lib/fetch/createFetchWith.js.map +1 -1
- package/lib/fetch/createFetchWithRetry.js +1 -1
- package/lib/fetch/createFetchWithRetry.js.map +1 -1
- package/lib/index.js +7 -5
- package/lib/index.js.map +1 -1
- package/lib/io/ArrayBuffers.js +58 -4
- package/lib/io/ArrayBuffers.js.map +1 -1
- package/lib/io/isTransferable.js +1 -1
- package/lib/io/isTransferable.js.map +1 -1
- package/lib/io/parseDataUri.js +57 -0
- package/lib/io/parseDataUri.js.map +1 -0
- package/lib/objects/computeIfAbsent.js +14 -0
- package/lib/objects/computeIfAbsent.js.map +1 -0
- package/lib/runtime/AsyncCloser.js.map +1 -0
- package/lib/runtime/Closer.js.map +1 -0
- package/lib/runtime/getGlobalThis.js.map +1 -0
- package/lib/runtime/structuredClone.js.map +1 -0
- package/lib/server/fetch/createFetchWithProxyByNodeFetch.js +1 -1
- package/lib/server/fetch/createFetchWithProxyByNodeFetch.js.map +1 -1
- package/lib/server/fetch/createFetchWithProxyByUndici.js +1 -1
- package/lib/server/fetch/createFetchWithProxyByUndici.js.map +1 -1
- package/lib/server/getPackageDir.js +5 -4
- package/lib/server/getPackageDir.js.map +1 -1
- package/lib/server/polyfill/polyfillCrypto.js +1 -1
- package/lib/server/polyfill/polyfillCrypto.js.map +1 -1
- package/lib/server/polyfill/polyfillJsDom.js +1 -1
- package/lib/server/polyfill/polyfillJsDom.js.map +1 -1
- package/lib/server/polyfill/polyfillWebSocket.js +1 -1
- package/lib/server/polyfill/polyfillWebSocket.js.map +1 -1
- package/package.json +18 -15
- package/src/browsers/download.ts +20 -13
- package/src/cn/division/DivisionCode.ts +109 -0
- package/src/cn/id/Mod11Checksum.ts +29 -0
- package/src/cn/id/ResidentIdNumber.ts +102 -0
- package/src/cn/id/id.test.ts +20 -0
- package/src/cn/id/types.ts +26 -0
- package/src/cn/index.ts +13 -0
- package/src/cn/uscc/Mod31Checksum.ts +42 -0
- package/src/cn/uscc/USCC.ts +98 -0
- package/src/cn/uscc/isUSCC.ts +8 -0
- package/src/cn/uscc/uscc.test.ts +16 -0
- package/src/crypto/getRandomValues.ts +1 -1
- package/src/crypto/randomUUID.ts +1 -1
- package/src/crypto/randomUUIDv7.ts +1 -0
- package/src/errors/Errors.ts +1 -1
- package/src/fetch/createFetchWith.ts +1 -1
- package/src/fetch/createFetchWithRetry.ts +1 -1
- package/src/index.ts +7 -5
- package/src/io/ArrayBuffers.base64.test.ts +24 -0
- package/src/io/ArrayBuffers.ts +106 -4
- package/src/io/isTransferable.ts +1 -1
- package/src/io/parseDataUri.test.ts +34 -0
- package/src/io/parseDataUri.ts +66 -0
- package/src/objects/computeIfAbsent.ts +15 -0
- package/src/schema/typebox/gen/README.md +2 -0
- package/src/server/fetch/createFetchWithProxyByNodeFetch.ts +1 -1
- package/src/server/fetch/createFetchWithProxyByUndici.ts +1 -1
- package/src/server/getPackageDir.ts +6 -4
- package/src/server/polyfill/polyfillCrypto.ts +1 -1
- package/src/server/polyfill/polyfillJsDom.ts +1 -1
- package/src/server/polyfill/polyfillWebSocket.ts +1 -1
- package/lib/http/HttpStatus.js.map +0 -1
- package/lib/io/Bytes.js +0 -51
- package/lib/io/Bytes.js.map +0 -1
- package/lib/isomorphics/getGlobalThis.js.map +0 -1
- package/lib/isomorphics/structuredClone.js.map +0 -1
- package/lib/langs/AsyncCloser.js.map +0 -1
- package/lib/langs/Closer.js.map +0 -1
- package/src/io/Bytes.ts +0 -64
- /package/lib/{http → fetch}/HttpStatus.js +0 -0
- /package/lib/{langs → runtime}/AsyncCloser.js +0 -0
- /package/lib/{langs → runtime}/Closer.js +0 -0
- /package/lib/{isomorphics → runtime}/getGlobalThis.js +0 -0
- /package/lib/{isomorphics → runtime}/structuredClone.js +0 -0
- /package/src/{http → fetch}/HttpStatus.ts +0 -0
- /package/src/{langs → runtime}/AsyncCloser.ts +0 -0
- /package/src/{langs → runtime}/Closer.ts +0 -0
- /package/src/{isomorphics → runtime}/getGlobalThis.ts +0 -0
- /package/src/{isomorphics → runtime}/structuredClone.test.ts +0 -0
- /package/src/{isomorphics → runtime}/structuredClone.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/crypto/getRandomValues.ts"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/consistent-type-imports\nimport type { TypedArray } from '../io/ArrayBuffers';\nimport { getGlobalThis } from '../
|
|
1
|
+
{"version":3,"sources":["../../src/crypto/getRandomValues.ts"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/consistent-type-imports\nimport type { TypedArray } from '../io/ArrayBuffers';\nimport { getGlobalThis } from '../runtime/getGlobalThis';\nimport { getNodeCrypto } from './getNodeCrypto';\n\nconst globalThis = getGlobalThis();\nexport let getRandomValues: <T extends Exclude<TypedArray, Float32Array | Float64Array>>(typedArray: T) => T =\n globalThis.crypto?.getRandomValues?.bind(globalThis.crypto) ||\n (globalThis as any).msCrypto?.getRandomValues?.bind((globalThis as any).msCrypto) ||\n _getRandomValues;\n\nfunction _getRandomValues<T extends Exclude<TypedArray, Float32Array | Float64Array>>(buf: T) {\n const nodeCrypto = getNodeCrypto();\n // avoid type error\n let wc = nodeCrypto?.webcrypto as any;\n if (wc?.getRandomValues) {\n getRandomValues = wc.getRandomValues?.bind(nodeCrypto?.webcrypto);\n return wc.getRandomValues(buf);\n }\n if (nodeCrypto?.randomBytes) {\n if (!(buf instanceof Uint8Array)) {\n throw new TypeError('expected Uint8Array');\n }\n if (buf.length > 65536) {\n const e: any = new Error();\n e.code = 22;\n e.message = `Failed to execute 'getRandomValues' on 'Crypto': The ArrayBufferView's byte length (${buf.length}) exceeds the number of bytes of entropy available via this API (65536).`;\n e.name = 'QuotaExceededError';\n throw e;\n }\n const bytes = nodeCrypto.randomBytes(buf.length);\n buf.set(bytes);\n return buf;\n }\n throw new Error('[getRandomValues]: No secure random number generator available.');\n}\n"],"names":["getGlobalThis","getNodeCrypto","globalThis","getRandomValues","crypto","bind","msCrypto","_getRandomValues","buf","nodeCrypto","wc","webcrypto","randomBytes","Uint8Array","TypeError","length","e","Error","code","message","name","bytes","set"],"mappings":"AAAA,sEAAsE;AAEtE,SAASA,aAAa,QAAQ,2BAA2B;AACzD,SAASC,aAAa,QAAQ,kBAAkB;AAEhD,MAAMC,aAAaF;AACnB,OAAO,IAAIG,kBACTD,WAAWE,MAAM,EAAED,iBAAiBE,KAAKH,WAAWE,MAAM,KAC1D,AAACF,WAAmBI,QAAQ,EAAEH,iBAAiBE,KAAK,AAACH,WAAmBI,QAAQ,KAChFC,iBAAiB;AAEnB,SAASA,iBAA6EC,GAAM;IAC1F,MAAMC,aAAaR;IACnB,mBAAmB;IACnB,IAAIS,KAAKD,YAAYE;IACrB,IAAID,IAAIP,iBAAiB;QACvBA,kBAAkBO,GAAGP,eAAe,EAAEE,KAAKI,YAAYE;QACvD,OAAOD,GAAGP,eAAe,CAACK;IAC5B;IACA,IAAIC,YAAYG,aAAa;QAC3B,IAAI,CAAEJ,CAAAA,eAAeK,UAAS,GAAI;YAChC,MAAM,IAAIC,UAAU;QACtB;QACA,IAAIN,IAAIO,MAAM,GAAG,OAAO;YACtB,MAAMC,IAAS,IAAIC;YACnBD,EAAEE,IAAI,GAAG;YACTF,EAAEG,OAAO,GAAG,CAAC,oFAAoF,EAAEX,IAAIO,MAAM,CAAC,wEAAwE,CAAC;YACvLC,EAAEI,IAAI,GAAG;YACT,MAAMJ;QACR;QACA,MAAMK,QAAQZ,WAAWG,WAAW,CAACJ,IAAIO,MAAM;QAC/CP,IAAIc,GAAG,CAACD;QACR,OAAOb;IACT;IACA,MAAM,IAAIS,MAAM;AAClB"}
|
package/lib/crypto/randomUUID.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/crypto/randomUUID.ts"],"sourcesContent":["import { getGlobalThis } from '../
|
|
1
|
+
{"version":3,"sources":["../../src/crypto/randomUUID.ts"],"sourcesContent":["import { getGlobalThis } from '../runtime/getGlobalThis';\n\nconst globalThis = getGlobalThis();\n\n/**\n * generate random UUIDv4\n */\nexport const randomUUID: () => string = globalThis.crypto?.randomUUID?.bind(globalThis.crypto) || _randomUUID;\n\n/**\n * @internal\n */\nexport function _randomUUID() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n"],"names":["getGlobalThis","globalThis","randomUUID","crypto","bind","_randomUUID","replace","c","r","Math","random","v","toString"],"mappings":"AAAA,SAASA,aAAa,QAAQ,2BAA2B;AAEzD,MAAMC,aAAaD;AAEnB;;CAEC,GACD,OAAO,MAAME,aAA2BD,WAAWE,MAAM,EAAED,YAAYE,KAAKH,WAAWE,MAAM,KAAKE,YAAY;AAE9G;;CAEC,GACD,OAAO,SAASA;IACd,OAAO,uCAAuCC,OAAO,CAAC,SAAS,CAACC;QAC9D,MAAMC,IAAI,AAACC,KAAKC,MAAM,KAAK,KAAM;QACjC,MAAMC,IAAIJ,MAAM,MAAMC,IAAI,AAACA,IAAI,MAAO;QACtC,OAAOG,EAAEC,QAAQ,CAAC;IACpB;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/crypto/randomUUIDv7.ts"],"sourcesContent":["// https://github.com/LiosK/uuidv7/blob/main/src/index.ts\n"],"names":[],"mappings":"AAAA,yDAAyD"}
|
package/lib/errors/Errors.js
CHANGED
package/lib/errors/Errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/errors/Errors.ts"],"sourcesContent":["import { getHttpStatusText } from '../
|
|
1
|
+
{"version":3,"sources":["../../src/errors/Errors.ts"],"sourcesContent":["import { getHttpStatusText } from '../fetch/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 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/fetch/HttpStatus.ts"],"sourcesContent":["// http://httpstat.us/\n// https://en.wikipedia.org/wiki/List_of_HTTP_status_codes\nconst HttpStatus: Record<string, string> = {\n 100: 'Continue',\n 101: 'Switching Protocols',\n 102: 'Processing',\n 103: 'Early Hints',\n 200: 'OK',\n 201: 'Created',\n 202: 'Accepted',\n 203: 'Non-Authoritative Information',\n 204: 'No Content',\n 205: 'Reset Content',\n 206: 'Partial Content',\n 207: 'Multi-Status',\n 208: 'Already Reported',\n 226: 'IM Used',\n 300: 'Multiple Choices',\n 301: 'Moved Permanently',\n 302: 'Found',\n 303: 'See Other',\n 304: 'Not Modified',\n 305: 'Use Proxy',\n 306: 'Unused',\n 307: 'Temporary Redirect',\n 308: 'Permanent Redirect',\n\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 402: 'Payment Required',\n 403: 'Forbidden',\n 404: 'Not Found',\n 405: 'Method Not Allowed',\n 406: 'Not Acceptable',\n 407: 'Proxy Authentication Required',\n 408: 'Request Timeout',\n 409: 'Conflict',\n 410: 'Gone',\n 411: 'Length Required',\n 412: 'Precondition Required',\n 413: 'Request Entry Too Large',\n 414: 'Request-URI Too Long',\n 415: 'Unsupported Media Type',\n 416: 'Requested Range Not Satisfiable',\n 417: 'Expectation Failed',\n 418: \"I'm a teapot\",\n 421: 'Misdirected Request',\n 422: 'Unprocessable Entity',\n 423: 'Locked',\n 424: 'Failed Dependency',\n 425: 'Too Early',\n 426: 'Upgrade Required',\n 428: 'Precondition Required',\n 429: 'Too Many Requests',\n 431: 'Request Header Fields Too Large',\n 451: 'Unavailable For Legal Reasons',\n 500: 'Internal Server Error',\n 501: 'Not Implemented',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n 504: 'Gateway Timeout',\n 505: 'HTTP Version Not Supported',\n 506: 'Variant Also Negotiates',\n 507: 'Insufficient Storage',\n 508: 'Loop Detected',\n 509: 'Bandwidth Limit Exceeded',\n 510: 'Not Extended',\n 511: 'Network Authentication Required',\n};\n\nexport function getHttpStatusText(status: number | string): string | undefined {\n return HttpStatus[status];\n}\n\nexport function isRetryableHttpStatus(status: number) {\n switch (status) {\n /*\n408 Request Timeout\n425 Too Early\n429 Too Many Requests\n500 Internal Server Error\n502 Bad Gateway\n503 Service Unavailable\n504 Gateway Timeout\n */\n case 408:\n case 425:\n case 429:\n case 502:\n case 503:\n case 504:\n return true;\n default:\n return false;\n }\n}\n"],"names":["HttpStatus","getHttpStatusText","status","isRetryableHttpStatus"],"mappings":"AAAA,sBAAsB;AACtB,0DAA0D;AAC1D,MAAMA,aAAqC;IACzC,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IAEL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;AACP;AAEA,OAAO,SAASC,kBAAkBC,MAAuB;IACvD,OAAOF,UAAU,CAACE,OAAO;AAC3B;AAEA,OAAO,SAASC,sBAAsBD,MAAc;IAClD,OAAQA;QACN;;;;;;;;KAQC,GACD,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;YACH,OAAO;QACT;YACE,OAAO;IACX;AACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getGlobalThis } from '../
|
|
1
|
+
import { getGlobalThis } from '../runtime/getGlobalThis.js';
|
|
2
2
|
export function createFetchWith({ fetch = getGlobalThis().fetch, onRequest = (ctx)=>ctx.next(ctx.url, ctx.req), onResponse = (ctx)=>ctx.res }) {
|
|
3
3
|
return async (urlOrRequest, init)=>{
|
|
4
4
|
const url = String(urlOrRequest);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/fetch/createFetchWith.ts"],"sourcesContent":["import { MaybePromise } from '../asyncs/MaybePromise';\nimport { getGlobalThis } from '../
|
|
1
|
+
{"version":3,"sources":["../../src/fetch/createFetchWith.ts"],"sourcesContent":["import { MaybePromise } from '../asyncs/MaybePromise';\nimport { getGlobalThis } from '../runtime/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,2BAA2B;AAGzD,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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getGlobalThis } from '../
|
|
1
|
+
import { getGlobalThis } from '../runtime/getGlobalThis.js';
|
|
2
2
|
export function createFetchWithRetry({ fetch = getGlobalThis().fetch, retries = 3, retryDelay = 1000, retryOn = [] } = {}) {
|
|
3
3
|
// https://github.com/jonbern/fetch-retry/blob/master/index.js
|
|
4
4
|
return function fetchRetry(input, init) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/fetch/createFetchWithRetry.ts"],"sourcesContent":["import { getGlobalThis } from '../
|
|
1
|
+
{"version":3,"sources":["../../src/fetch/createFetchWithRetry.ts"],"sourcesContent":["import { getGlobalThis } from '../runtime/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,2BAA2B;AAiBzD,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"}
|
package/lib/index.js
CHANGED
|
@@ -5,6 +5,7 @@ export { arrayFromAsync } from './arrays/arrayFromAsync.js';
|
|
|
5
5
|
export { get } from './objects/get.js';
|
|
6
6
|
export { set } from './objects/set.js';
|
|
7
7
|
export { parseObjectPath } from './objects/parseObjectPath.js';
|
|
8
|
+
export { computeIfAbsent } from './objects/computeIfAbsent.js';
|
|
8
9
|
export { merge } from './objects/merge/index.js';
|
|
9
10
|
// async
|
|
10
11
|
export { createLazyPromise } from './asyncs/createLazyPromise.js';
|
|
@@ -31,8 +32,8 @@ export { isPlainObject } from './langs/isPlainObject.js';
|
|
|
31
32
|
export { parseBoolean } from './langs/parseBoolean.js';
|
|
32
33
|
export { maybeFunction } from './langs/MaybeFunction.js';
|
|
33
34
|
export { memoize } from './langs/memoize.js';
|
|
34
|
-
export { AsyncCloser } from './
|
|
35
|
-
export { Closer } from './
|
|
35
|
+
export { AsyncCloser } from './runtime/AsyncCloser.js';
|
|
36
|
+
export { Closer } from './runtime/Closer.js';
|
|
36
37
|
export { isUUID } from './validations/isUUID.js';
|
|
37
38
|
export { parseTimestamp } from './validations/parseTimestamp.js';
|
|
38
39
|
// modules
|
|
@@ -52,14 +53,15 @@ export { isBuffer } from './io/isBuffer.js';
|
|
|
52
53
|
export { isTransferable } from './io/isTransferable.js';
|
|
53
54
|
export { ArrayBuffers } from './io/ArrayBuffers.js';
|
|
54
55
|
export { Buffer } from './io/Buffer.js';
|
|
56
|
+
export { parseDataUri } from './io/parseDataUri.js';
|
|
55
57
|
// browser
|
|
56
58
|
export { copy } from './browsers/copy.js';
|
|
57
59
|
export { download } from './browsers/download.js';
|
|
58
60
|
export { loadScripts, loadStyles } from './browsers/loaders.js';
|
|
59
61
|
export { getFileFromDataTransfer } from './browsers/getFileFromDataTransfer.js';
|
|
60
62
|
// polyfills
|
|
61
|
-
export { getGlobalThis } from './
|
|
62
|
-
export { structuredClone } from './
|
|
63
|
+
export { getGlobalThis } from './runtime/getGlobalThis.js';
|
|
64
|
+
export { structuredClone } from './runtime/structuredClone.js';
|
|
63
65
|
// crypto
|
|
64
66
|
export { randomUUID } from './crypto/randomUUID.js';
|
|
65
67
|
export { getRandomValues } from './crypto/getRandomValues.js';
|
|
@@ -78,6 +80,6 @@ export { default as ms } from './libs/ms.js';
|
|
|
78
80
|
// error
|
|
79
81
|
export { Errors, DetailError } from './errors/Errors.js';
|
|
80
82
|
// http
|
|
81
|
-
export { getHttpStatusText, isRetryableHttpStatus } from './
|
|
83
|
+
export { getHttpStatusText, isRetryableHttpStatus } from './fetch/HttpStatus.js';
|
|
82
84
|
|
|
83
85
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// arrays\nexport {\n firstOfMaybeArray,\n lastOfMaybeArray,\n arrayOfMaybeArray,\n objectOfMaybeArray,\n type MaybeArray,\n} from './arrays/MaybeArray';\nexport { arrayFromAsync } from './arrays/arrayFromAsync';\n\n// object\nexport { get } from './objects/get';\nexport { set } from './objects/set';\nexport { parseObjectPath } from './objects/parseObjectPath';\nexport { merge, type MergeOptions } from './objects/merge';\n\n// async\nexport { createLazyPromise, type LazyPromise } from './asyncs/createLazyPromise';\nexport { setAsyncInterval, clearAsyncInterval } from './asyncs/AsyncInterval';\nexport { type MaybePromise } from './asyncs/MaybePromise';\n// async - iterator\nexport { createAsyncIterator } from './asyncs/createAsyncIterator';\nexport { firstOfAsyncIterator } from './asyncs/firstOfAsyncIterator';\nexport { nextOfAsyncIterator } from './asyncs/nextOfAsyncIterator';\nexport { isIterator } from './asyncs/isIterator';\n\nexport { sleep } from './asyncs/sleep';\nexport { timeout, TimeoutError } from './asyncs/timeout';\nexport { isPromise } from './asyncs/isPromise';\n// export * from './async/promiseOfCallback';\n\n// langs\nexport { shallowEqual } from './langs/shallowEqual';\nexport { deepEqual } from './langs/deepEqual';\nexport { deepFreeze } from './langs/deepFreeze';\nexport { classOf } from './langs/classOf';\nexport { shallowClone } from './langs/shallowClone';\nexport { isClass } from './langs/isClass';\nexport { isDefined } from './langs/isDefined';\nexport { isEmptyObject } from './langs/isEmptyObject';\nexport { isPlainObject } from './langs/isPlainObject';\nexport { parseBoolean } from './langs/parseBoolean';\nexport { maybeFunction, type MaybeFunction } from './langs/MaybeFunction';\nexport { memoize } from './langs/memoize';\nexport { AsyncCloser } from './
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// arrays\nexport {\n firstOfMaybeArray,\n lastOfMaybeArray,\n arrayOfMaybeArray,\n objectOfMaybeArray,\n type MaybeArray,\n} from './arrays/MaybeArray';\nexport { arrayFromAsync } from './arrays/arrayFromAsync';\n\n// object\nexport { get } from './objects/get';\nexport { set } from './objects/set';\nexport { parseObjectPath } from './objects/parseObjectPath';\nexport { computeIfAbsent } from './objects/computeIfAbsent';\nexport { merge, type MergeOptions } from './objects/merge';\n\n// async\nexport { createLazyPromise, type LazyPromise } from './asyncs/createLazyPromise';\nexport { setAsyncInterval, clearAsyncInterval } from './asyncs/AsyncInterval';\nexport { type MaybePromise } from './asyncs/MaybePromise';\n// async - iterator\nexport { createAsyncIterator } from './asyncs/createAsyncIterator';\nexport { firstOfAsyncIterator } from './asyncs/firstOfAsyncIterator';\nexport { nextOfAsyncIterator } from './asyncs/nextOfAsyncIterator';\nexport { isIterator } from './asyncs/isIterator';\n\nexport { sleep } from './asyncs/sleep';\nexport { timeout, TimeoutError } from './asyncs/timeout';\nexport { isPromise } from './asyncs/isPromise';\n// export * from './async/promiseOfCallback';\n\n// langs\nexport { shallowEqual } from './langs/shallowEqual';\nexport { deepEqual } from './langs/deepEqual';\nexport { deepFreeze } from './langs/deepFreeze';\nexport { classOf } from './langs/classOf';\nexport { shallowClone } from './langs/shallowClone';\nexport { isClass } from './langs/isClass';\nexport { isDefined } from './langs/isDefined';\nexport { isEmptyObject } from './langs/isEmptyObject';\nexport { isPlainObject } from './langs/isPlainObject';\nexport { parseBoolean } from './langs/parseBoolean';\nexport { maybeFunction, type MaybeFunction } from './langs/MaybeFunction';\nexport { memoize } from './langs/memoize';\nexport { AsyncCloser } from './runtime/AsyncCloser';\nexport { Closer } from './runtime/Closer';\n\nexport { isUUID } from './validations/isUUID';\nexport { parseTimestamp } from './validations/parseTimestamp';\n\n// modules\nexport { parseModuleId, type ParsedModuleId } from './modules/parseModuleId';\nexport { isModule, type Module } from './modules/isModule';\n\n// logging\nexport { type Logger, type LogLevel } from './logging/Logger';\nexport { createLogger } from './logging/createLogger';\nexport { createNoopLogger } from './logging/createNoopLogger';\nexport { createChildLogger } from './logging/createChildLogger';\n\n// strings\nexport { pascalCase, camelCase } from './strings/camelCase';\nexport { renderTemplate } from './strings/renderTemplate';\nexport { formatBytes } from './strings/formatBytes';\n\n// i18n\nexport { createTranslate } from './i18n/createTranslate';\n\n// io\nexport { isBuffer } from './io/isBuffer';\nexport { isTransferable } from './io/isTransferable';\nexport { ArrayBuffers } from './io/ArrayBuffers';\nexport { Buffer } from './io/Buffer';\nexport { parseDataUri, type ParsedDataUri } from './io/parseDataUri';\nexport type { AbstractEncoding } from './io/AbstractEncoding';\n\n// browser\nexport { copy } from './browsers/copy';\nexport { download } from './browsers/download';\nexport { loadScripts, loadStyles } from './browsers/loaders';\nexport { getFileFromDataTransfer } from './browsers/getFileFromDataTransfer';\n\n// polyfills\nexport { getGlobalThis } from './runtime/getGlobalThis';\nexport { structuredClone } from './runtime/structuredClone';\n\n// crypto\nexport { randomUUID } from './crypto/randomUUID';\nexport { getRandomValues } from './crypto/getRandomValues';\nexport { sha1, sha256, sha384, sha512, hmac, type DigestOptions } from './crypto/hashing';\nexport { md5 } from './crypto/md5';\nexport { hex } from './crypto/base';\nexport { isULID, createULID, ulid, parseULID } from './crypto/ulid';\nexport { PEM } from './crypto/pem/pem';\n\n// math\nexport { createRandom } from './maths/random';\nexport { clamp } from './maths/clamp';\n\n// network\nexport {\n type FetchLike,\n createFetchWith,\n createFetchWithLogging,\n dumpResponse,\n dumpRequest,\n createFetchWithRetry,\n type FetchWithRetryOptions,\n} from './fetch';\n\n// bundled\nexport { default as ms } from './libs/ms';\n\n// error\nexport { Errors, DetailError, type ErrorDetail, type ErrorDetailInit } from './errors/Errors';\n// http\nexport { getHttpStatusText, isRetryableHttpStatus } from './fetch/HttpStatus';\n\nexport type * from './types';\n"],"names":["firstOfMaybeArray","lastOfMaybeArray","arrayOfMaybeArray","objectOfMaybeArray","arrayFromAsync","get","set","parseObjectPath","computeIfAbsent","merge","createLazyPromise","setAsyncInterval","clearAsyncInterval","createAsyncIterator","firstOfAsyncIterator","nextOfAsyncIterator","isIterator","sleep","timeout","TimeoutError","isPromise","shallowEqual","deepEqual","deepFreeze","classOf","shallowClone","isClass","isDefined","isEmptyObject","isPlainObject","parseBoolean","maybeFunction","memoize","AsyncCloser","Closer","isUUID","parseTimestamp","parseModuleId","isModule","createLogger","createNoopLogger","createChildLogger","pascalCase","camelCase","renderTemplate","formatBytes","createTranslate","isBuffer","isTransferable","ArrayBuffers","Buffer","parseDataUri","copy","download","loadScripts","loadStyles","getFileFromDataTransfer","getGlobalThis","structuredClone","randomUUID","getRandomValues","sha1","sha256","sha384","sha512","hmac","md5","hex","isULID","createULID","ulid","parseULID","PEM","createRandom","clamp","createFetchWith","createFetchWithLogging","dumpResponse","dumpRequest","createFetchWithRetry","default","ms","Errors","DetailError","getHttpStatusText","isRetryableHttpStatus"],"mappings":"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"}
|
package/lib/io/ArrayBuffers.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { getGlobalThis } from '../isomorphics/getGlobalThis.js';
|
|
2
1
|
import { classOf } from '../langs/classOf.js';
|
|
2
|
+
import { getGlobalThis } from '../runtime/getGlobalThis.js';
|
|
3
3
|
import { decodeBase64ToArrayBuffer, encodeArrayBufferToBase64 } from './base64.js';
|
|
4
4
|
import { isBuffer } from './isBuffer.js';
|
|
5
5
|
export class ArrayBuffers {
|
|
@@ -18,6 +18,57 @@ export class ArrayBuffers {
|
|
|
18
18
|
static isArrayBuffer = (v)=>{
|
|
19
19
|
return v instanceof ArrayBuffer;
|
|
20
20
|
};
|
|
21
|
+
static toArrayBuffer(v) {
|
|
22
|
+
return v instanceof ArrayBuffer ? v : v.buffer;
|
|
23
|
+
}
|
|
24
|
+
static toUint8Array(v) {
|
|
25
|
+
return ArrayBuffers.asView(Uint8Array, v);
|
|
26
|
+
}
|
|
27
|
+
static toBase64 = (v)=>{
|
|
28
|
+
if ('toBase64' in Uint8Array.prototype) {
|
|
29
|
+
return this.toUint8Array(v).toBase64();
|
|
30
|
+
}
|
|
31
|
+
if (ArrayBuffers.isNativeBufferAllowed()) {
|
|
32
|
+
return Buffer.from(ArrayBuffers.asView(Uint8Array, v)).toString('base64');
|
|
33
|
+
}
|
|
34
|
+
return encodeArrayBufferToBase64(this.toArrayBuffer(v));
|
|
35
|
+
};
|
|
36
|
+
static toHex = (v)=>{
|
|
37
|
+
if ('toHex' in Uint8Array.prototype) {
|
|
38
|
+
return this.toUint8Array(v).toHex();
|
|
39
|
+
}
|
|
40
|
+
if (ArrayBuffers.isNativeBufferAllowed()) {
|
|
41
|
+
return Buffer.from(ArrayBuffers.asView(Uint8Array, v)).toString('hex');
|
|
42
|
+
}
|
|
43
|
+
return ArrayBuffers.toString(v, 'hex');
|
|
44
|
+
};
|
|
45
|
+
static fromBase64 = (v)=>{
|
|
46
|
+
if ('fromBase64' in Uint8Array) {
|
|
47
|
+
return Uint8Array.fromBase64(v);
|
|
48
|
+
}
|
|
49
|
+
if (ArrayBuffers.isNativeBufferAllowed()) {
|
|
50
|
+
return Buffer.from(v, 'base64');
|
|
51
|
+
}
|
|
52
|
+
return this.toUint8Array(decodeBase64ToArrayBuffer(v));
|
|
53
|
+
};
|
|
54
|
+
static fromHex = (v)=>{
|
|
55
|
+
if ('fromHex' in Uint8Array) {
|
|
56
|
+
return Uint8Array.fromHex(v);
|
|
57
|
+
}
|
|
58
|
+
return this.toUint8Array(ArrayBuffers.from(v, 'hex'));
|
|
59
|
+
};
|
|
60
|
+
static resize = (v, newByteLength)=>{
|
|
61
|
+
if ('resize' in v) {
|
|
62
|
+
v.resize(newByteLength);
|
|
63
|
+
return v;
|
|
64
|
+
}
|
|
65
|
+
const old = v;
|
|
66
|
+
const newBuf = new ArrayBuffer(newByteLength);
|
|
67
|
+
const oldView = new Uint8Array(old);
|
|
68
|
+
const newView = new Uint8Array(newBuf);
|
|
69
|
+
newView.set(oldView);
|
|
70
|
+
return newBuf;
|
|
71
|
+
};
|
|
21
72
|
static slice = (o, start, end)=>{
|
|
22
73
|
// NodeJS Buffer slice is not the same as UInt8Array slice
|
|
23
74
|
// https://nodejs.org/api/buffer.html#bufslicestart-end
|
|
@@ -118,7 +169,10 @@ export class ArrayBuffers {
|
|
|
118
169
|
}
|
|
119
170
|
return new ArrayBuffer(size);
|
|
120
171
|
};
|
|
121
|
-
static from = (v, encoding = 'utf8')=>{
|
|
172
|
+
static from = (v, encoding = 'utf8', view)=>{
|
|
173
|
+
if (view) {
|
|
174
|
+
return this.asView(view, this.from(v, encoding));
|
|
175
|
+
}
|
|
122
176
|
if (!v) {
|
|
123
177
|
return new ArrayBuffer(0);
|
|
124
178
|
}
|
|
@@ -134,8 +188,8 @@ export class ArrayBuffers {
|
|
|
134
188
|
case 'base64':
|
|
135
189
|
// replaceAll need higher version of nodejs
|
|
136
190
|
return decodeBase64ToArrayBuffer(v.replace(/[^0-9a-zA-Z=+/_]/g, ''));
|
|
137
|
-
|
|
138
|
-
|
|
191
|
+
case 'hex':
|
|
192
|
+
return new Uint8Array(v.match(/.{1,2}/g).map((byte)=>parseInt(byte, 16))).buffer;
|
|
139
193
|
default:
|
|
140
194
|
throw new Error(`[ArrayBuffers.from] Unknown encoding: ${encoding}`);
|
|
141
195
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/io/ArrayBuffers.ts"],"sourcesContent":["import { getGlobalThis } from '../isomorphics/getGlobalThis';\nimport { classOf } from '../langs/classOf';\nimport { decodeBase64ToArrayBuffer, encodeArrayBufferToBase64 } from './base64';\nimport { isBuffer } from './isBuffer';\n\n/**\n * Various utils to work with {@link ArrayBuffer}\n */\nexport interface ArrayBuffers {\n /**\n * isArrayBuffer check if the given value is an {@link ArrayBuffer}\n */\n isArrayBuffer(v: any): v is ArrayBuffer;\n\n /**\n * slice the given view with the given offset and length, will handle the {@link Buffer} as well\n *\n * @see {@link https://nodejs.org/api/buffer.html#bufslicestart-end Buffer.slice}\n */\n slice<T extends ArrayBufferView>(o: T, start?: number, end?: number): T;\n\n /**\n * asView convert the given value to given {@link TypedArray} view\n *\n * TypedArray can be {@link Buffer}, will avoid copy\n */\n asView<C extends ArrayBufferViewConstructor<unknown>>(\n TypedArray: C,\n v: BufferSource,\n byteOffset?: number,\n byteLength?: number,\n ): InstanceType<C>;\n\n /**\n * toString convert the given {@link BufferSource} to string\n */\n toString(v: BufferSource | string, encoding?: ToStringEncoding): string;\n\n /**\n * Returns true if encoding is the name of a supported character encoding, or false otherwise.\n */\n isEncoding(v?: string): v is ToStringEncoding;\n\n toJSON<T = any>(v: BufferSource | string, reviver?: (this: any, key: string, value: any) => any): T;\n\n /**\n * from convert the given value to {@link ArrayBuffer}\n */\n from(v: string | BufferSource, encoding?: ToStringEncoding): ArrayBuffer;\n\n /**\n * concat the given {@link BufferSource} to a new {@link ArrayBuffer}\n */\n concat(buffers: Array<BufferSource>, result?: ArrayBuffer, offset?: number): ArrayBuffer;\n}\n\ntype ToStringEncoding =\n | 'ascii'\n | 'utf16le'\n // | 'utf-16le'\n | 'ucs2'\n | 'ucs-2'\n | 'base64'\n | 'base64url'\n | 'latin1'\n | 'binary'\n | 'utf8'\n | 'utf-8'\n | 'hex';\n\nexport class ArrayBuffers {\n static #nativeBufferAllowed: boolean = true;\n static #isBufferAvailable: undefined | boolean;\n\n static isNativeBufferAvailable() {\n // eslint-disable-next-line no-return-assign\n return (this.#isBufferAvailable ??= !(getGlobalThis().Buffer as any)?.isPollyfill?.());\n }\n\n static isNativeBufferAllowed() {\n return this.#nativeBufferAllowed && this.#isBufferAvailable;\n }\n\n static setNativeBufferAllowed(v: boolean) {\n this.#nativeBufferAllowed = v;\n }\n\n static isArrayBuffer = (v: any): v is ArrayBuffer => {\n return v instanceof ArrayBuffer;\n };\n\n static slice = (o: TypedArray, start?: number, end?: number) => {\n // NodeJS Buffer slice is not the same as UInt8Array slice\n // https://nodejs.org/api/buffer.html#bufslicestart-end\n if (isBuffer(o)) {\n return Uint8Array.prototype.slice.call(o, start, end);\n }\n return o.slice(start, end);\n };\n\n static asView = <C extends ArrayBufferViewConstructor<unknown>, I extends InstanceType<C>>(\n TypedArray: C,\n v: BufferSource,\n byteOffset?: number,\n byteLength?: number,\n ): I => {\n if (v instanceof TypedArray && (byteOffset ?? 0) === 0 && byteLength === undefined) {\n return v as I;\n }\n if (ArrayBuffer.isView(v) || isBuffer(v)) {\n if (ArrayBuffers.isNativeBufferAllowed() && (TypedArray as any) === Buffer) {\n // new Buffer() is deprecated\n return Buffer.from(v.buffer, byteOffset, byteLength) as I;\n }\n return new TypedArray(v.buffer, v.byteOffset + (byteOffset ?? 0), byteLength ?? v.byteLength) as I;\n }\n return new TypedArray(v, byteOffset, byteLength) as I;\n };\n\n static toString = (buf: BufferSource | string, encoding: ToStringEncoding = 'utf8') => {\n // 'ascii' 'utf16le' | 'ucs2' | 'ucs-2' | 'base64' | 'base64url' | 'latin1' | 'binary' | 'hex'\n if (typeof buf === 'string') {\n switch (encoding) {\n case 'base64':\n return btoa(buf);\n case 'utf-8':\n case 'utf8':\n return buf;\n default:\n throw new Error(`[ArrayBuffers.toString] Unsupported encoding for string: ${encoding}`);\n }\n }\n if (ArrayBuffers.isNativeBufferAllowed()) {\n return Buffer.from(ArrayBuffers.asView(Uint8Array, buf)).toString(encoding);\n }\n // reference\n // https://github.com/feross/buffer/blob/master/index.js\n switch (encoding) {\n case 'hex': {\n const view: Uint8Array = ArrayBuffers.asView(Uint8Array, buf);\n return [...view].map((b) => hexLookupTable[b]).join('');\n }\n case 'base64': {\n return encodeArrayBufferToBase64(ArrayBuffers.asView(Uint8Array, buf));\n }\n case 'utf8':\n // falls through\n case 'utf-8':\n return new TextDecoder().decode(buf as any);\n case 'ascii': {\n const view: Uint8Array = ArrayBuffers.asView(Uint8Array, buf);\n return String.fromCharCode(...view.map((v) => v & 0x7f));\n }\n case 'latin1':\n // falls through\n case 'binary': {\n const view: Uint8Array = ArrayBuffers.asView(Uint8Array, buf);\n return String.fromCharCode(...view);\n }\n case 'ucs2':\n // falls through\n case 'ucs-2':\n // case 'utf-16le':\n // falls through\n case 'utf16le': {\n const view: Uint8Array = ArrayBuffers.asView(Uint8Array, buf);\n let res = '';\n // If length is odd, the last 8 bits must be ignored (same as node.js)\n for (let i = 0; i < view.length - 1; i += 2) {\n res += String.fromCharCode(view[i] + view[i + 1] * 256);\n }\n return res;\n }\n default:\n throw new Error(`[ArrayBuffers.toString] Unknown encoding: ${encoding}`);\n }\n };\n\n static toJSON = (v: BufferSource | string, reviver?: (this: any, key: string, value: any) => any) => {\n return JSON.parse(ArrayBuffers.toString(v), reviver);\n };\n\n static alloc = (size: number, fill?: string | number, encoding?: ToStringEncoding) => {\n if (fill !== undefined) {\n if (typeof fill === 'number') {\n return new Uint8Array(size).fill(fill);\n }\n // as cast\n // https://stackoverflow.com/questions/73994091\n return ArrayBuffers.asView(Uint8Array, ArrayBuffers.from(fill, encoding)).slice(0, size);\n }\n return new ArrayBuffer(size);\n };\n\n static from = (\n v: string | BufferSource | ArrayLike<number> | Iterable<number>,\n encoding: ToStringEncoding = 'utf8',\n ): BufferSource => {\n if (!v) {\n return new ArrayBuffer(0);\n }\n if (typeof v === 'string') {\n if (ArrayBuffers.isNativeBufferAllowed()) {\n return Buffer.from(v, encoding);\n }\n\n switch (encoding) {\n case 'utf-8':\n // falls through\n case 'utf8':\n return new TextEncoder().encode(v).buffer;\n case 'base64':\n // replaceAll need higher version of nodejs\n return decodeBase64ToArrayBuffer(v.replace(/[^0-9a-zA-Z=+/_]/g, ''));\n // error in nodejs 18\n // return Uint8Array.from(atob(v.replace(/[^0-9a-zA-Z=+/_ \\r\\n]/g, '')), (c) => c.charCodeAt(0));\n default:\n throw new Error(`[ArrayBuffers.from] Unknown encoding: ${encoding}`);\n }\n }\n if (v instanceof ArrayBuffer) {\n return v;\n }\n // lost length\n if (ArrayBuffer.isView(v) || isBuffer(v)) {\n if (v.byteOffset !== 0) {\n // return v.buffer.slice(v.byteOffset, v.byteOffset + v.byteLength)\n throw new Error('ArrayBuffers.from do not support view with offset');\n }\n return v.buffer;\n }\n if (Array.isArray(v)) {\n return new Uint8Array(v);\n }\n const type = classOf(v);\n throw new TypeError(`ArrayBuffers.from unsupported type ${type}`);\n };\n\n static isEncoding = (encoding?: string) => {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n // case 'utf-16le':\n return true;\n default:\n return false;\n }\n };\n\n static concat = (buffers: Array<BufferSource>, result?: ArrayBuffer, offset = 0) => {\n // https://stackoverflow.com/questions/10786128/appending-arraybuffers\n\n const length = buffers.reduce((a, b) => a + b.byteLength, 0);\n const r = result ? new Uint8Array(result) : new Uint8Array(length);\n for (const buffer of buffers) {\n if (!buffer?.byteLength) continue;\n let n: Uint8Array;\n if (buffer instanceof ArrayBuffer) {\n n = new Uint8Array(buffer);\n } else if (ArrayBuffer.isView(buffer)) {\n n = new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength);\n } else {\n throw new Error(`ArrayBuffers.concat unsupported type ${classOf(buffer)}`);\n }\n r.set(n, offset);\n offset += buffer.byteLength;\n }\n return r.buffer;\n };\n}\n\nexport type TypedArray =\n | Uint8Array\n | Uint8ClampedArray\n | Uint16Array\n | Uint32Array\n | Int8Array\n | Int16Array\n | Int32Array\n | BigUint64Array\n | BigInt64Array\n | Float32Array\n | Float64Array;\n\ntype ArrayBufferViewConstructor<T> = new (buffer: ArrayBufferLike, byteOffset?: number, byteLength?: number) => T;\n\nconst hexLookupTable = (function () {\n const alphabet = '0123456789abcdef';\n const table = new Array(256);\n for (let i = 0; i < 16; ++i) {\n const i16 = i * 16;\n for (let j = 0; j < 16; ++j) {\n table[i16 + j] = alphabet[i] + alphabet[j];\n }\n }\n return table;\n})();\n"],"names":["getGlobalThis","classOf","decodeBase64ToArrayBuffer","encodeArrayBufferToBase64","isBuffer","ArrayBuffers","nativeBufferAllowed","isBufferAvailable","isNativeBufferAvailable","Buffer","isPollyfill","isNativeBufferAllowed","setNativeBufferAllowed","v","isArrayBuffer","ArrayBuffer","slice","o","start","end","Uint8Array","prototype","call","asView","TypedArray","byteOffset","byteLength","undefined","isView","from","buffer","toString","buf","encoding","btoa","Error","view","map","b","hexLookupTable","join","TextDecoder","decode","String","fromCharCode","res","i","length","toJSON","reviver","JSON","parse","alloc","size","fill","TextEncoder","encode","replace","Array","isArray","type","TypeError","isEncoding","toLowerCase","concat","buffers","result","offset","reduce","a","r","n","set","alphabet","table","i16","j"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/io/ArrayBuffers.ts"],"sourcesContent":["import { classOf } from '../langs/classOf';\nimport { getGlobalThis } from '../runtime/getGlobalThis';\nimport { decodeBase64ToArrayBuffer, encodeArrayBufferToBase64 } from './base64';\nimport { isBuffer } from './isBuffer';\n\n/**\n * Various utils to work with {@link ArrayBuffer}\n *\n * @see https://github.com/tc39/proposal-arraybuffer-base64\n * @see https://github.com/tc39/proposal-resizablearraybuffer\n */\nexport interface ArrayBuffers {\n /**\n * isArrayBuffer check if the given value is an {@link ArrayBuffer}\n */\n isArrayBuffer(v: any): v is ArrayBuffer;\n\n /**\n * slice the given view with the given offset and length, will handle the {@link Buffer} as well\n *\n * @see {@link https://nodejs.org/api/buffer.html#bufslicestart-end Buffer.slice}\n */\n slice<T extends ArrayBufferView>(o: T, start?: number, end?: number): T;\n\n /**\n * asView convert the given value to given {@link TypedArray} view\n *\n * TypedArray can be {@link Buffer}, will avoid copy\n */\n asView<C extends ArrayBufferViewConstructor<unknown>>(\n TypedArray: C,\n v: BufferSource,\n byteOffset?: number,\n byteLength?: number,\n ): InstanceType<C>;\n\n /**\n * toString convert the given {@link BufferSource} to string\n */\n toString(v: BufferSource | string, encoding?: ToStringEncoding): string;\n\n /**\n * Returns true if encoding is the name of a supported character encoding, or false otherwise.\n */\n isEncoding(v?: string): v is ToStringEncoding;\n\n toJSON<T = any>(v: BufferSource | string, reviver?: (this: any, key: string, value: any) => any): T;\n\n /**\n * from convert the given value to {@link ArrayBuffer}\n */\n from(v: string | BufferSource, encoding?: ToStringEncoding): ArrayBuffer;\n\n from<C extends ArrayBufferViewConstructor<unknown>>(\n v: string | BufferSource,\n encoding: ToStringEncoding,\n TypedArray: C,\n ): C;\n\n /**\n * concat the given {@link BufferSource} to a new {@link ArrayBuffer}\n */\n concat(buffers: Array<BufferSource>, result?: ArrayBuffer, offset?: number): ArrayBuffer;\n\n fromBase64(v: string): Uint8Array;\n\n fromHex(v: string): Uint8Array;\n\n toBase64(v: BufferSource): string;\n\n toHex(v: BufferSource): string;\n\n resize(v: ArrayBuffer, newByteLength: number): ArrayBuffer;\n}\n\ntype ToStringEncoding =\n | 'ascii'\n | 'utf16le'\n // | 'utf-16le'\n | 'ucs2'\n | 'ucs-2'\n | 'base64'\n | 'base64url'\n | 'latin1'\n | 'binary'\n | 'utf8'\n | 'utf-8'\n | 'hex';\n\nexport class ArrayBuffers {\n static #nativeBufferAllowed: boolean = true;\n static #isBufferAvailable: undefined | boolean;\n\n static isNativeBufferAvailable() {\n // eslint-disable-next-line no-return-assign\n return (this.#isBufferAvailable ??= !(getGlobalThis().Buffer as any)?.isPollyfill?.());\n }\n\n static isNativeBufferAllowed() {\n return this.#nativeBufferAllowed && this.#isBufferAvailable;\n }\n\n static setNativeBufferAllowed(v: boolean) {\n this.#nativeBufferAllowed = v;\n }\n\n static isArrayBuffer = (v: any): v is ArrayBuffer => {\n return v instanceof ArrayBuffer;\n };\n\n static toArrayBuffer(v: BufferSource): ArrayBuffer {\n return v instanceof ArrayBuffer ? v : (v.buffer as ArrayBuffer);\n }\n\n static toUint8Array(v: BufferSource) {\n return ArrayBuffers.asView(Uint8Array, v);\n }\n\n static toBase64 = (v: BufferSource) => {\n if ('toBase64' in Uint8Array.prototype) {\n return this.toUint8Array(v).toBase64();\n }\n\n if (ArrayBuffers.isNativeBufferAllowed()) {\n return Buffer.from(ArrayBuffers.asView(Uint8Array, v)).toString('base64');\n }\n\n return encodeArrayBufferToBase64(this.toArrayBuffer(v));\n };\n\n static toHex = (v: BufferSource) => {\n if ('toHex' in Uint8Array.prototype) {\n return this.toUint8Array(v).toHex();\n }\n if (ArrayBuffers.isNativeBufferAllowed()) {\n return Buffer.from(ArrayBuffers.asView(Uint8Array, v)).toString('hex');\n }\n return ArrayBuffers.toString(v, 'hex');\n };\n\n static fromBase64 = (v: string) => {\n if ('fromBase64' in Uint8Array) {\n return Uint8Array.fromBase64(v);\n }\n if (ArrayBuffers.isNativeBufferAllowed()) {\n return Buffer.from(v, 'base64');\n }\n return this.toUint8Array(decodeBase64ToArrayBuffer(v));\n };\n\n static fromHex = (v: string) => {\n if ('fromHex' in Uint8Array) {\n return Uint8Array.fromHex(v);\n }\n return this.toUint8Array(ArrayBuffers.from(v, 'hex'));\n };\n\n static resize = (v: ArrayBuffer, newByteLength: number): ArrayBuffer => {\n if ('resize' in v) {\n (v as any).resize(newByteLength);\n return v;\n }\n\n const old = v;\n const newBuf = new ArrayBuffer(newByteLength);\n const oldView = new Uint8Array(old);\n const newView = new Uint8Array(newBuf);\n newView.set(oldView);\n return newBuf;\n };\n\n static slice = (o: TypedArray, start?: number, end?: number) => {\n // NodeJS Buffer slice is not the same as UInt8Array slice\n // https://nodejs.org/api/buffer.html#bufslicestart-end\n if (isBuffer(o)) {\n return Uint8Array.prototype.slice.call(o, start, end);\n }\n return o.slice(start, end);\n };\n\n static asView = <C extends ArrayBufferViewConstructor<unknown>, I extends InstanceType<C>>(\n TypedArray: C,\n v: BufferSource,\n byteOffset?: number,\n byteLength?: number,\n ): I => {\n if (v instanceof TypedArray && (byteOffset ?? 0) === 0 && byteLength === undefined) {\n return v as I;\n }\n if (ArrayBuffer.isView(v) || isBuffer(v)) {\n if (ArrayBuffers.isNativeBufferAllowed() && (TypedArray as any) === Buffer) {\n // new Buffer() is deprecated\n return Buffer.from(v.buffer, byteOffset, byteLength) as I;\n }\n return new TypedArray(v.buffer, v.byteOffset + (byteOffset ?? 0), byteLength ?? v.byteLength) as I;\n }\n return new TypedArray(v, byteOffset, byteLength) as I;\n };\n\n static toString = (buf: BufferSource | string, encoding: ToStringEncoding = 'utf8') => {\n // 'ascii' 'utf16le' | 'ucs2' | 'ucs-2' | 'base64' | 'base64url' | 'latin1' | 'binary' | 'hex'\n if (typeof buf === 'string') {\n switch (encoding) {\n case 'base64':\n return btoa(buf);\n case 'utf-8':\n case 'utf8':\n return buf;\n default:\n throw new Error(`[ArrayBuffers.toString] Unsupported encoding for string: ${encoding}`);\n }\n }\n if (ArrayBuffers.isNativeBufferAllowed()) {\n return Buffer.from(ArrayBuffers.asView(Uint8Array, buf)).toString(encoding);\n }\n // reference\n // https://github.com/feross/buffer/blob/master/index.js\n switch (encoding) {\n case 'hex': {\n const view: Uint8Array = ArrayBuffers.asView(Uint8Array, buf);\n return [...view].map((b) => hexLookupTable[b]).join('');\n }\n case 'base64': {\n return encodeArrayBufferToBase64(ArrayBuffers.asView(Uint8Array, buf));\n }\n case 'utf8':\n // falls through\n case 'utf-8':\n return new TextDecoder().decode(buf as any);\n case 'ascii': {\n const view: Uint8Array = ArrayBuffers.asView(Uint8Array, buf);\n return String.fromCharCode(...view.map((v) => v & 0x7f));\n }\n case 'latin1':\n // falls through\n case 'binary': {\n const view: Uint8Array = ArrayBuffers.asView(Uint8Array, buf);\n return String.fromCharCode(...view);\n }\n case 'ucs2':\n // falls through\n case 'ucs-2':\n // case 'utf-16le':\n // falls through\n case 'utf16le': {\n const view: Uint8Array = ArrayBuffers.asView(Uint8Array, buf);\n let res = '';\n // If length is odd, the last 8 bits must be ignored (same as node.js)\n for (let i = 0; i < view.length - 1; i += 2) {\n res += String.fromCharCode(view[i] + view[i + 1] * 256);\n }\n return res;\n }\n default:\n throw new Error(`[ArrayBuffers.toString] Unknown encoding: ${encoding}`);\n }\n };\n\n static toJSON = (v: BufferSource | string, reviver?: (this: any, key: string, value: any) => any) => {\n return JSON.parse(ArrayBuffers.toString(v), reviver);\n };\n\n static alloc = (size: number, fill?: string | number, encoding?: ToStringEncoding) => {\n if (fill !== undefined) {\n if (typeof fill === 'number') {\n return new Uint8Array(size).fill(fill);\n }\n // as cast\n // https://stackoverflow.com/questions/73994091\n return ArrayBuffers.asView(Uint8Array, ArrayBuffers.from(fill, encoding)).slice(0, size);\n }\n return new ArrayBuffer(size);\n };\n\n static from = (\n v: string | BufferSource | ArrayLike<number> | Iterable<number>,\n encoding: ToStringEncoding = 'utf8',\n view?: any,\n ): any => {\n if (view) {\n return this.asView(view, this.from(v, encoding));\n }\n if (!v) {\n return new ArrayBuffer(0);\n }\n if (typeof v === 'string') {\n if (ArrayBuffers.isNativeBufferAllowed()) {\n return Buffer.from(v, encoding);\n }\n\n switch (encoding) {\n case 'utf-8':\n // falls through\n case 'utf8':\n return new TextEncoder().encode(v).buffer;\n case 'base64':\n // replaceAll need higher version of nodejs\n return decodeBase64ToArrayBuffer(v.replace(/[^0-9a-zA-Z=+/_]/g, ''));\n case 'hex':\n return new Uint8Array(v.match(/.{1,2}/g)!.map((byte) => parseInt(byte, 16))).buffer;\n default:\n throw new Error(`[ArrayBuffers.from] Unknown encoding: ${encoding}`);\n }\n }\n if (v instanceof ArrayBuffer) {\n return v;\n }\n // lost length\n if (ArrayBuffer.isView(v) || isBuffer(v)) {\n if (v.byteOffset !== 0) {\n // return v.buffer.slice(v.byteOffset, v.byteOffset + v.byteLength)\n throw new Error('ArrayBuffers.from do not support view with offset');\n }\n return v.buffer;\n }\n if (Array.isArray(v)) {\n return new Uint8Array(v);\n }\n const type = classOf(v);\n throw new TypeError(`ArrayBuffers.from unsupported type ${type}`);\n };\n\n static isEncoding = (encoding?: string) => {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n // case 'utf-16le':\n return true;\n default:\n return false;\n }\n };\n\n static concat = (buffers: Array<BufferSource>, result?: ArrayBuffer, offset = 0) => {\n // https://stackoverflow.com/questions/10786128/appending-arraybuffers\n\n const length = buffers.reduce((a, b) => a + b.byteLength, 0);\n const r = result ? new Uint8Array(result) : new Uint8Array(length);\n for (const buffer of buffers) {\n if (!buffer?.byteLength) continue;\n let n: Uint8Array;\n if (buffer instanceof ArrayBuffer) {\n n = new Uint8Array(buffer);\n } else if (ArrayBuffer.isView(buffer)) {\n n = new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength);\n } else {\n throw new Error(`ArrayBuffers.concat unsupported type ${classOf(buffer)}`);\n }\n r.set(n, offset);\n offset += buffer.byteLength;\n }\n return r.buffer;\n };\n}\n\nexport type TypedArray =\n | Uint8Array\n | Uint8ClampedArray\n | Uint16Array\n | Uint32Array\n | Int8Array\n | Int16Array\n | Int32Array\n | BigUint64Array\n | BigInt64Array\n | Float32Array\n | Float64Array;\n\ntype ArrayBufferViewConstructor<T> = new (buffer: ArrayBufferLike, byteOffset?: number, byteLength?: number) => T;\n\nconst hexLookupTable = (function () {\n const alphabet = '0123456789abcdef';\n const table = new Array(256);\n for (let i = 0; i < 16; ++i) {\n const i16 = i * 16;\n for (let j = 0; j < 16; ++j) {\n table[i16 + j] = alphabet[i] + alphabet[j];\n }\n }\n return table;\n})();\n\ndeclare global {\n interface ArrayBuffer {\n // resize(newByteLength: number): void;\n }\n\n interface Uint8Array {\n toBase64(): string;\n\n toHex(): string;\n }\n\n interface Uint8ArrayConstructor {\n fromBase64(v: string): Uint8Array;\n\n fromHex(v: string): Uint8Array;\n }\n}\n"],"names":["classOf","getGlobalThis","decodeBase64ToArrayBuffer","encodeArrayBufferToBase64","isBuffer","ArrayBuffers","nativeBufferAllowed","isBufferAvailable","isNativeBufferAvailable","Buffer","isPollyfill","isNativeBufferAllowed","setNativeBufferAllowed","v","isArrayBuffer","ArrayBuffer","toArrayBuffer","buffer","toUint8Array","asView","Uint8Array","toBase64","prototype","from","toString","toHex","fromBase64","fromHex","resize","newByteLength","old","newBuf","oldView","newView","set","slice","o","start","end","call","TypedArray","byteOffset","byteLength","undefined","isView","buf","encoding","btoa","Error","view","map","b","hexLookupTable","join","TextDecoder","decode","String","fromCharCode","res","i","length","toJSON","reviver","JSON","parse","alloc","size","fill","TextEncoder","encode","replace","match","byte","parseInt","Array","isArray","type","TypeError","isEncoding","toLowerCase","concat","buffers","result","offset","reduce","a","r","n","alphabet","table","i16","j"],"mappings":"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"}
|
package/lib/io/isTransferable.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/io/isTransferable.ts"],"sourcesContent":["import { getGlobalThis } from '../
|
|
1
|
+
{"version":3,"sources":["../../src/io/isTransferable.ts"],"sourcesContent":["import { getGlobalThis } from '../runtime/getGlobalThis';\n\nconst globalThis = getGlobalThis();\n\n/**\n * transferable object pass between workers, can work with structuredClone\n *\n * - Chrome 87, FF 103, Safari X, NodeJS X\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Glossary/Transferable_objects | Transferable objects}\n */\nexport function isTransferable(v: any): v is TransferableObject {\n _ctors ||= ctors();\n return _ctors.some((ctor) => v instanceof ctor);\n}\n\nlet _ctors: any[];\n\nfunction ctors() {\n const o: any = globalThis.window || globalThis || global;\n return [\n o.ArrayBuffer,\n o.MessagePort,\n o.ReadableStream,\n o.WritableStream,\n o.TransformStream,\n o.AudioData,\n o.ImageBitmap,\n o.VideoFrame,\n o.OffscreenCanvas,\n o.RTCDataChannel,\n ].filter(Boolean);\n}\n\nexport type TransferableObject =\n | Transferable\n | ArrayBuffer\n | MessagePort\n | ReadableStream\n | WritableStream\n | TransformStream\n | AudioData\n | ImageBitmap\n | VideoFrame\n | OffscreenCanvas\n | RTCDataChannel;\n\ndeclare global {\n interface OffscreenCanvas {}\n\n interface VideoFrame {}\n\n interface AudioData {}\n}\n"],"names":["getGlobalThis","globalThis","isTransferable","v","_ctors","ctors","some","ctor","o","window","global","ArrayBuffer","MessagePort","ReadableStream","WritableStream","TransformStream","AudioData","ImageBitmap","VideoFrame","OffscreenCanvas","RTCDataChannel","filter","Boolean"],"mappings":"AAAA,SAASA,aAAa,QAAQ,2BAA2B;AAEzD,MAAMC,aAAaD;AAEnB;;;;;;CAMC,GACD,OAAO,SAASE,eAAeC,CAAM;IACnCC,WAAWC;IACX,OAAOD,OAAOE,IAAI,CAAC,CAACC,OAASJ,aAAaI;AAC5C;AAEA,IAAIH;AAEJ,SAASC;IACP,MAAMG,IAASP,WAAWQ,MAAM,IAAIR,cAAcS;IAClD,OAAO;QACLF,EAAEG,WAAW;QACbH,EAAEI,WAAW;QACbJ,EAAEK,cAAc;QAChBL,EAAEM,cAAc;QAChBN,EAAEO,eAAe;QACjBP,EAAEQ,SAAS;QACXR,EAAES,WAAW;QACbT,EAAEU,UAAU;QACZV,EAAEW,eAAe;QACjBX,EAAEY,cAAc;KACjB,CAACC,MAAM,CAACC;AACX"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { ArrayBuffers } from './ArrayBuffers.js';
|
|
2
|
+
export function parseDataUri(data) {
|
|
3
|
+
if (!data || !data.startsWith('data:')) {
|
|
4
|
+
return;
|
|
5
|
+
}
|
|
6
|
+
// https://en.wikipedia.org/wiki/Data_URI_scheme
|
|
7
|
+
// data:content/type;base64,
|
|
8
|
+
// data:content/type;a=b,content
|
|
9
|
+
const [header, body] = data.split(',');
|
|
10
|
+
const [type, ...paramsStr] = header.slice('data:'.length).split(';');
|
|
11
|
+
const content = body;
|
|
12
|
+
const params = Object.fromEntries(paramsStr.map((s)=>{
|
|
13
|
+
const [k, v] = s.trim().split('=');
|
|
14
|
+
return [
|
|
15
|
+
k,
|
|
16
|
+
v ?? true
|
|
17
|
+
];
|
|
18
|
+
}));
|
|
19
|
+
// params charset=utf-8
|
|
20
|
+
// params base64
|
|
21
|
+
// params a=b
|
|
22
|
+
let base64 = Boolean(params['base64']);
|
|
23
|
+
return {
|
|
24
|
+
type,
|
|
25
|
+
params,
|
|
26
|
+
content,
|
|
27
|
+
base64,
|
|
28
|
+
getData: async (enc)=>{
|
|
29
|
+
if (!enc) {
|
|
30
|
+
return await fetch(data).then((v)=>v.arrayBuffer());
|
|
31
|
+
}
|
|
32
|
+
//
|
|
33
|
+
let buf;
|
|
34
|
+
if (base64) {
|
|
35
|
+
if (enc === 'base64') {
|
|
36
|
+
return content;
|
|
37
|
+
}
|
|
38
|
+
buf = await fetch(data).then((v)=>v.arrayBuffer());
|
|
39
|
+
} else {
|
|
40
|
+
let raw = decodeURIComponent(content);
|
|
41
|
+
if (enc === 'utf-8') {
|
|
42
|
+
return raw;
|
|
43
|
+
}
|
|
44
|
+
buf = ArrayBuffers.from(raw, 'utf-8');
|
|
45
|
+
}
|
|
46
|
+
if (enc === 'utf-8') {
|
|
47
|
+
return new TextDecoder(enc).decode(buf);
|
|
48
|
+
}
|
|
49
|
+
if (enc === 'base64') {
|
|
50
|
+
return ArrayBuffers.toString(buf, 'base64');
|
|
51
|
+
}
|
|
52
|
+
return buf;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=parseDataUri.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/io/parseDataUri.ts"],"sourcesContent":["import { ArrayBuffers } from './ArrayBuffers';\n\nexport interface ParsedDataUri {\n type: string;\n params: Record<string, string | boolean>;\n content: string;\n base64: boolean;\n\n getData(enc: 'utf-8' | 'base64'): Promise<string>;\n\n getData(): Promise<ArrayBuffer>;\n}\n\nexport function parseDataUri(data: string): undefined | ParsedDataUri {\n if (!data || !data.startsWith('data:')) {\n return;\n }\n // https://en.wikipedia.org/wiki/Data_URI_scheme\n // data:content/type;base64,\n // data:content/type;a=b,content\n const [header, body] = data.split(',');\n const [type, ...paramsStr] = header.slice('data:'.length).split(';');\n const content = body;\n const params: Record<string, string | boolean> = Object.fromEntries(\n paramsStr.map((s) => {\n const [k, v] = s.trim().split('=');\n return [k, v ?? true];\n }),\n );\n // params charset=utf-8\n // params base64\n // params a=b\n let base64 = Boolean(params['base64']);\n return {\n type,\n params,\n content,\n base64,\n getData: async (enc?: 'utf-8' | 'base64') => {\n if (!enc) {\n return await fetch(data).then((v) => v.arrayBuffer());\n }\n //\n let buf: BufferSource;\n if (base64) {\n if (enc === 'base64') {\n return content;\n }\n buf = await fetch(data).then((v) => v.arrayBuffer());\n } else {\n let raw = decodeURIComponent(content);\n if (enc === 'utf-8') {\n return raw;\n }\n buf = ArrayBuffers.from(raw, 'utf-8');\n }\n if (enc === 'utf-8') {\n return new TextDecoder(enc).decode(buf);\n }\n if (enc === 'base64') {\n return ArrayBuffers.toString(buf, 'base64');\n }\n return buf;\n },\n } as ParsedDataUri;\n}\n"],"names":["ArrayBuffers","parseDataUri","data","startsWith","header","body","split","type","paramsStr","slice","length","content","params","Object","fromEntries","map","s","k","v","trim","base64","Boolean","getData","enc","fetch","then","arrayBuffer","buf","raw","decodeURIComponent","from","TextDecoder","decode","toString"],"mappings":"AAAA,SAASA,YAAY,QAAQ,iBAAiB;AAa9C,OAAO,SAASC,aAAaC,IAAY;IACvC,IAAI,CAACA,QAAQ,CAACA,KAAKC,UAAU,CAAC,UAAU;QACtC;IACF;IACA,gDAAgD;IAChD,4BAA4B;IAC5B,gCAAgC;IAChC,MAAM,CAACC,QAAQC,KAAK,GAAGH,KAAKI,KAAK,CAAC;IAClC,MAAM,CAACC,MAAM,GAAGC,UAAU,GAAGJ,OAAOK,KAAK,CAAC,QAAQC,MAAM,EAAEJ,KAAK,CAAC;IAChE,MAAMK,UAAUN;IAChB,MAAMO,SAA2CC,OAAOC,WAAW,CACjEN,UAAUO,GAAG,CAAC,CAACC;QACb,MAAM,CAACC,GAAGC,EAAE,GAAGF,EAAEG,IAAI,GAAGb,KAAK,CAAC;QAC9B,OAAO;YAACW;YAAGC,KAAK;SAAK;IACvB;IAEF,uBAAuB;IACvB,gBAAgB;IAChB,aAAa;IACb,IAAIE,SAASC,QAAQT,MAAM,CAAC,SAAS;IACrC,OAAO;QACLL;QACAK;QACAD;QACAS;QACAE,SAAS,OAAOC;YACd,IAAI,CAACA,KAAK;gBACR,OAAO,MAAMC,MAAMtB,MAAMuB,IAAI,CAAC,CAACP,IAAMA,EAAEQ,WAAW;YACpD;YACA,EAAE;YACF,IAAIC;YACJ,IAAIP,QAAQ;gBACV,IAAIG,QAAQ,UAAU;oBACpB,OAAOZ;gBACT;gBACAgB,MAAM,MAAMH,MAAMtB,MAAMuB,IAAI,CAAC,CAACP,IAAMA,EAAEQ,WAAW;YACnD,OAAO;gBACL,IAAIE,MAAMC,mBAAmBlB;gBAC7B,IAAIY,QAAQ,SAAS;oBACnB,OAAOK;gBACT;gBACAD,MAAM3B,aAAa8B,IAAI,CAACF,KAAK;YAC/B;YACA,IAAIL,QAAQ,SAAS;gBACnB,OAAO,IAAIQ,YAAYR,KAAKS,MAAM,CAACL;YACrC;YACA,IAAIJ,QAAQ,UAAU;gBACpB,OAAOvB,aAAaiC,QAAQ,CAACN,KAAK;YACpC;YACA,OAAOA;QACT;IACF;AACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function computeIfAbsent(map, key, fn) {
|
|
2
|
+
if (map instanceof Map) {
|
|
3
|
+
if (!map.has(key)) {
|
|
4
|
+
map.set(key, fn());
|
|
5
|
+
}
|
|
6
|
+
return map.get(key);
|
|
7
|
+
}
|
|
8
|
+
if (!map[key]) {
|
|
9
|
+
map[key] = fn();
|
|
10
|
+
}
|
|
11
|
+
return map[key];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=computeIfAbsent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/objects/computeIfAbsent.ts"],"sourcesContent":["export function computeIfAbsent<K, V>(map: Map<K, V>, key: K, fn: () => V): V ;\nexport function computeIfAbsent<K extends string | symbol | number, V>(map: Record<K, V>, key: K, fn: () => V): V ;\nexport function computeIfAbsent<K, V>(map: any, key: K, fn: () => V): V {\n if (map instanceof Map) {\n if (!map.has(key)) {\n map.set(key, fn());\n }\n return map.get(key)!;\n }\n\n if (!map[key]) {\n map[key] = fn();\n }\n return map[key];\n}\n"],"names":["computeIfAbsent","map","key","fn","Map","has","set","get"],"mappings":"AAEA,OAAO,SAASA,gBAAsBC,GAAQ,EAAEC,GAAM,EAAEC,EAAW;IACjE,IAAIF,eAAeG,KAAK;QACtB,IAAI,CAACH,IAAII,GAAG,CAACH,MAAM;YACjBD,IAAIK,GAAG,CAACJ,KAAKC;QACf;QACA,OAAOF,IAAIM,GAAG,CAACL;IACjB;IAEA,IAAI,CAACD,GAAG,CAACC,IAAI,EAAE;QACbD,GAAG,CAACC,IAAI,GAAGC;IACb;IACA,OAAOF,GAAG,CAACC,IAAI;AACjB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/AsyncCloser.ts"],"sourcesContent":["type AsyncClosable = { close(): void | Promise<void> } | (() => void | Promise<void>) | AsyncDisposable | Disposable;\n\n/**\n * @see AsyncDisposableStack\n */\nexport class AsyncCloser implements AsyncDisposable {\n closers: Array<AsyncClosable> = [];\n\n defer(closer: AsyncClosable | null | undefined) {\n if (!closer) {\n return;\n }\n this.closers.push(closer);\n }\n\n add<T extends AsyncClosable | null | undefined>(closer: T): T {\n if (!closer) {\n return closer;\n }\n this.closers.push(closer);\n return closer;\n }\n\n async [Symbol.asyncDispose]() {\n for (let closer of this.closers) {\n let o;\n if (typeof closer === 'function') {\n o = closer();\n } else if (Symbol.asyncDispose in closer) {\n o = closer[Symbol.asyncDispose]();\n } else if (Symbol.dispose in closer) {\n closer[Symbol.dispose]();\n } else {\n o = closer.close();\n }\n if (o && typeof o.then === 'function') {\n await o;\n }\n }\n }\n\n close() {\n return this[Symbol.asyncDispose]();\n }\n}\n"],"names":["AsyncCloser","closers","defer","closer","push","add","Symbol","asyncDispose","o","dispose","close","then"],"mappings":"AAEA;;CAEC,GACD,OAAO,MAAMA;IACXC,UAAgC,EAAE,CAAC;IAEnCC,MAAMC,MAAwC,EAAE;QAC9C,IAAI,CAACA,QAAQ;YACX;QACF;QACA,IAAI,CAACF,OAAO,CAACG,IAAI,CAACD;IACpB;IAEAE,IAAgDF,MAAS,EAAK;QAC5D,IAAI,CAACA,QAAQ;YACX,OAAOA;QACT;QACA,IAAI,CAACF,OAAO,CAACG,IAAI,CAACD;QAClB,OAAOA;IACT;IAEA,MAAM,CAACG,OAAOC,YAAY,CAAC,GAAG;QAC5B,KAAK,IAAIJ,UAAU,IAAI,CAACF,OAAO,CAAE;YAC/B,IAAIO;YACJ,IAAI,OAAOL,WAAW,YAAY;gBAChCK,IAAIL;YACN,OAAO,IAAIG,OAAOC,YAAY,IAAIJ,QAAQ;gBACxCK,IAAIL,MAAM,CAACG,OAAOC,YAAY,CAAC;YACjC,OAAO,IAAID,OAAOG,OAAO,IAAIN,QAAQ;gBACnCA,MAAM,CAACG,OAAOG,OAAO,CAAC;YACxB,OAAO;gBACLD,IAAIL,OAAOO,KAAK;YAClB;YACA,IAAIF,KAAK,OAAOA,EAAEG,IAAI,KAAK,YAAY;gBACrC,MAAMH;YACR;QACF;IACF;IAEAE,QAAQ;QACN,OAAO,IAAI,CAACJ,OAAOC,YAAY,CAAC;IAClC;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/Closer.ts"],"sourcesContent":["type Closable = { close(): void } | (() => void) | Disposable;\n\n/**\n * @see DisposableStack\n */\nexport class Closer implements Disposable {\n closers: Array<Closable> = [];\n\n defer(closer: Closable | null | undefined) {\n if (!closer) {\n return;\n }\n this.closers.push(closer);\n }\n\n add<T extends Closable | null | undefined>(closer: T): T {\n if (!closer) {\n return closer;\n }\n this.closers.push(closer);\n return closer;\n }\n\n [Symbol.dispose]() {\n for (let closer of this.closers) {\n if (typeof closer === 'function') {\n closer();\n } else if (Symbol.dispose in closer) {\n closer[Symbol.dispose]();\n } else {\n closer.close();\n }\n }\n }\n\n close() {\n this[Symbol.dispose]();\n }\n}\n"],"names":["Closer","closers","defer","closer","push","add","Symbol","dispose","close"],"mappings":"AAEA;;CAEC,GACD,OAAO,MAAMA;IACXC,UAA2B,EAAE,CAAC;IAE9BC,MAAMC,MAAmC,EAAE;QACzC,IAAI,CAACA,QAAQ;YACX;QACF;QACA,IAAI,CAACF,OAAO,CAACG,IAAI,CAACD;IACpB;IAEAE,IAA2CF,MAAS,EAAK;QACvD,IAAI,CAACA,QAAQ;YACX,OAAOA;QACT;QACA,IAAI,CAACF,OAAO,CAACG,IAAI,CAACD;QAClB,OAAOA;IACT;IAEA,CAACG,OAAOC,OAAO,CAAC,GAAG;QACjB,KAAK,IAAIJ,UAAU,IAAI,CAACF,OAAO,CAAE;YAC/B,IAAI,OAAOE,WAAW,YAAY;gBAChCA;YACF,OAAO,IAAIG,OAAOC,OAAO,IAAIJ,QAAQ;gBACnCA,MAAM,CAACG,OAAOC,OAAO,CAAC;YACxB,OAAO;gBACLJ,OAAOK,KAAK;YACd;QACF;IACF;IAEAA,QAAQ;QACN,IAAI,CAACF,OAAOC,OAAO,CAAC;IACtB;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/getGlobalThis.ts"],"sourcesContent":["declare const global: typeof globalThis;\n\n/**\n * isomorphic globalThis\n *\n * globalThis supported by ff 65, Chrome 71, Node 12, babel\n *\n * non-standard globalThis supported for Alipay Miniprogram\n *\n * @see https://caniuse.com/#search=globalThis\n * @see https://v8.dev/features/globalthis\n */\nexport const getGlobalThis = (): typeof globalThis => {\n if (typeof globalThis !== 'undefined') return globalThis;\n if (typeof self !== 'undefined') return self;\n if (typeof window !== 'undefined') return window;\n if (typeof global !== 'undefined') return global as any;\n if (typeof this !== 'undefined') return this as any;\n throw new Error('Unable to locate global `this`');\n};\n"],"names":["getGlobalThis","globalThis","self","window","global","Error"],"mappings":"AAEA;;;;;;;;;CASC,GACD,OAAO,MAAMA,gBAAgB;IAC3B,IAAI,OAAOC,eAAe,aAAa,OAAOA;IAC9C,IAAI,OAAOC,SAAS,aAAa,OAAOA;IACxC,IAAI,OAAOC,WAAW,aAAa,OAAOA;IAC1C,IAAI,OAAOC,WAAW,aAAa,OAAOA;IAC1C,IAAI,OAAO,IAAI,KAAK,aAAa,OAAO,IAAI;IAC5C,MAAM,IAAIC,MAAM;AAClB,EAAE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/structuredClone.ts"],"sourcesContent":["/* eslint no-proto:0 */\nimport { classOf } from '../langs/classOf';\n\n/**\n * Clone an object using structured cloning algorithm\n *\n * - Chrome 98, Safari 15.4, NodeJS 17\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/structuredClone structuredClone}\n * @see {@link https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/web.structured-clone.js core-js}\n */\nexport const structuredClone: <T>(value: T, options?: StructuredSerializeOptions) => T =\n globalThis.structuredClone || _clone;\n\nfunction set(obj: any, key: any, val: any) {\n if (typeof val.value === 'object') val.value = _clone(val.value);\n if (!val.enumerable || val.get || val.set || !val.configurable || !val.writable || key === '__proto__') {\n Object.defineProperty(obj, key, val);\n } else obj[key] = val.value;\n}\n\n/**\n * @see {@link https://github.com/lukeed/klona/blob/master/src/full.js klona}\n */\nexport function _clone(x: any): any {\n // too complex\n // https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/web.structured-clone.js\n\n if (typeof x !== 'object') return x;\n\n let i = 0;\n let k;\n let list;\n let tmp: any;\n const str = classOf(x);\n switch (str) {\n case 'Array':\n tmp = Array(x.length);\n break;\n case 'Object':\n tmp = Object.create(x.__proto__ || null);\n break;\n case 'Set':\n tmp = new Set();\n x.forEach(function (val: any) {\n tmp.add(_clone(val));\n });\n break;\n case 'Map':\n tmp = new Map();\n x.forEach(function (val: any, key: any) {\n tmp.set(_clone(key), _clone(val));\n });\n break;\n case 'Date':\n tmp = new Date(+x);\n break;\n case 'RegExp':\n tmp = new RegExp(x.source, x.flags);\n break;\n case 'DataView':\n tmp = new x.constructor(_clone(x.buffer));\n break;\n case 'ArrayBuffer':\n tmp = x.slice(0);\n break;\n default:\n // typed arrays\n if (str.endsWith('Array')) {\n // ArrayBuffer.isView(x)\n // ~> `new` bcuz `Buffer.slice` => ref\n tmp = new x.constructor(x);\n }\n }\n\n if (tmp) {\n for (list = Object.getOwnPropertySymbols(x); i < list.length; i++) {\n set(tmp, list[i], Object.getOwnPropertyDescriptor(x, list[i]));\n }\n\n for (i = 0, list = Object.getOwnPropertyNames(x); i < list.length; i++) {\n if (Object.hasOwnProperty.call(tmp, (k = list[i])) && tmp[k] === x[k]) continue;\n set(tmp, k, Object.getOwnPropertyDescriptor(x, k));\n }\n }\n\n return tmp || x;\n}\n"],"names":["classOf","structuredClone","globalThis","_clone","set","obj","key","val","value","enumerable","get","configurable","writable","Object","defineProperty","x","i","k","list","tmp","str","Array","length","create","__proto__","Set","forEach","add","Map","Date","RegExp","source","flags","constructor","buffer","slice","endsWith","getOwnPropertySymbols","getOwnPropertyDescriptor","getOwnPropertyNames","hasOwnProperty","call"],"mappings":"AAAA,qBAAqB,GACrB,SAASA,OAAO,QAAQ,mBAAmB;AAE3C;;;;;;;CAOC,GACD,OAAO,MAAMC,kBACXC,WAAWD,eAAe,IAAIE,OAAO;AAEvC,SAASC,IAAIC,GAAQ,EAAEC,GAAQ,EAAEC,GAAQ;IACvC,IAAI,OAAOA,IAAIC,KAAK,KAAK,UAAUD,IAAIC,KAAK,GAAGL,OAAOI,IAAIC,KAAK;IAC/D,IAAI,CAACD,IAAIE,UAAU,IAAIF,IAAIG,GAAG,IAAIH,IAAIH,GAAG,IAAI,CAACG,IAAII,YAAY,IAAI,CAACJ,IAAIK,QAAQ,IAAIN,QAAQ,aAAa;QACtGO,OAAOC,cAAc,CAACT,KAAKC,KAAKC;IAClC,OAAOF,GAAG,CAACC,IAAI,GAAGC,IAAIC,KAAK;AAC7B;AAEA;;CAEC,GACD,OAAO,SAASL,OAAOY,CAAM;IAC3B,cAAc;IACd,mGAAmG;IAEnG,IAAI,OAAOA,MAAM,UAAU,OAAOA;IAElC,IAAIC,IAAI;IACR,IAAIC;IACJ,IAAIC;IACJ,IAAIC;IACJ,MAAMC,MAAMpB,QAAQe;IACpB,OAAQK;QACN,KAAK;YACHD,MAAME,MAAMN,EAAEO,MAAM;YACpB;QACF,KAAK;YACHH,MAAMN,OAAOU,MAAM,CAACR,EAAES,SAAS,IAAI;YACnC;QACF,KAAK;YACHL,MAAM,IAAIM;YACVV,EAAEW,OAAO,CAAC,SAAUnB,GAAQ;gBAC1BY,IAAIQ,GAAG,CAACxB,OAAOI;YACjB;YACA;QACF,KAAK;YACHY,MAAM,IAAIS;YACVb,EAAEW,OAAO,CAAC,SAAUnB,GAAQ,EAAED,GAAQ;gBACpCa,IAAIf,GAAG,CAACD,OAAOG,MAAMH,OAAOI;YAC9B;YACA;QACF,KAAK;YACHY,MAAM,IAAIU,KAAK,CAACd;YAChB;QACF,KAAK;YACHI,MAAM,IAAIW,OAAOf,EAAEgB,MAAM,EAAEhB,EAAEiB,KAAK;YAClC;QACF,KAAK;YACHb,MAAM,IAAIJ,EAAEkB,WAAW,CAAC9B,OAAOY,EAAEmB,MAAM;YACvC;QACF,KAAK;YACHf,MAAMJ,EAAEoB,KAAK,CAAC;YACd;QACF;YACE,eAAe;YACf,IAAIf,IAAIgB,QAAQ,CAAC,UAAU;gBACzB,wBAAwB;gBACxB,sCAAsC;gBACtCjB,MAAM,IAAIJ,EAAEkB,WAAW,CAAClB;YAC1B;IACJ;IAEA,IAAII,KAAK;QACP,IAAKD,OAAOL,OAAOwB,qBAAqB,CAACtB,IAAIC,IAAIE,KAAKI,MAAM,EAAEN,IAAK;YACjEZ,IAAIe,KAAKD,IAAI,CAACF,EAAE,EAAEH,OAAOyB,wBAAwB,CAACvB,GAAGG,IAAI,CAACF,EAAE;QAC9D;QAEA,IAAKA,IAAI,GAAGE,OAAOL,OAAO0B,mBAAmB,CAACxB,IAAIC,IAAIE,KAAKI,MAAM,EAAEN,IAAK;YACtE,IAAIH,OAAO2B,cAAc,CAACC,IAAI,CAACtB,KAAMF,IAAIC,IAAI,CAACF,EAAE,KAAMG,GAAG,CAACF,EAAE,KAAKF,CAAC,CAACE,EAAE,EAAE;YACvEb,IAAIe,KAAKF,GAAGJ,OAAOyB,wBAAwB,CAACvB,GAAGE;QACjD;IACF;IAEA,OAAOE,OAAOJ;AAChB"}
|