@wener/utils 1.1.42 → 1.1.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/lib/arrays/MaybeArray.js.map +1 -1
  2. package/lib/arrays/arrayFromAsync.js.map +1 -1
  3. package/lib/asyncs/AsyncInterval.js.map +1 -1
  4. package/lib/asyncs/MaybePromise.js.map +1 -1
  5. package/lib/asyncs/createAsyncIterator.js.map +1 -1
  6. package/lib/asyncs/createLazyPromise.js.map +1 -1
  7. package/lib/asyncs/firstOfAsyncIterator.js.map +1 -1
  8. package/lib/asyncs/generatorOfStream.js.map +1 -1
  9. package/lib/asyncs/isIterator.js.map +1 -1
  10. package/lib/asyncs/isPromise.js.map +1 -1
  11. package/lib/asyncs/isThenable.js.map +1 -1
  12. package/lib/asyncs/nextOfAsyncIterator.js.map +1 -1
  13. package/lib/asyncs/promiseOfCallback.js.map +1 -1
  14. package/lib/asyncs/sleep.js.map +1 -1
  15. package/lib/asyncs/timeout.js.map +1 -1
  16. package/lib/browsers/copy.js.map +1 -1
  17. package/lib/browsers/download.js.map +1 -1
  18. package/lib/browsers/getFileFromDataTransfer.js.map +1 -1
  19. package/lib/browsers/loaders.js.map +1 -1
  20. package/lib/cn/division/DivisionCode.js.map +1 -1
  21. package/lib/cn/division/binarySearch.js.map +1 -1
  22. package/lib/cn/id/Mod11Checksum.js.map +1 -1
  23. package/lib/cn/id/ResidentIdNumber.js.map +1 -1
  24. package/lib/cn/id/types.js.map +1 -1
  25. package/lib/cn/index.js.map +1 -1
  26. package/lib/cn/parseChineseNumber.js.map +1 -1
  27. package/lib/cn/pinyin/cartesianProduct.js.map +1 -1
  28. package/lib/cn/pinyin/loader.js.map +1 -1
  29. package/lib/cn/pinyin/preload.js.map +1 -1
  30. package/lib/cn/pinyin/toPinyinPure.js.map +1 -1
  31. package/lib/cn/pinyin/transform.js.map +1 -1
  32. package/lib/cn/uscc/Mod31Checksum.js.map +1 -1
  33. package/lib/cn/uscc/USCC.js.map +1 -1
  34. package/lib/cn/uscc/isUSCC.js.map +1 -1
  35. package/lib/crypto/base.js.map +1 -1
  36. package/lib/crypto/getNodeCrypto.js.map +1 -1
  37. package/lib/crypto/getRandomValues.js.map +1 -1
  38. package/lib/crypto/hashing.js.map +1 -1
  39. package/lib/crypto/md5.bench.js.map +1 -1
  40. package/lib/crypto/md5.d.js.map +1 -1
  41. package/lib/crypto/md5.js.map +1 -1
  42. package/lib/crypto/pem/pem.js.map +1 -1
  43. package/lib/crypto/randomUUID.js.map +1 -1
  44. package/lib/crypto/randomUUIDv7.js.map +1 -1
  45. package/lib/crypto/ulid.js.map +1 -1
  46. package/lib/errors/Errors.js.map +1 -1
  47. package/lib/fetch/HttpStatus.js.map +1 -1
  48. package/lib/fetch/createFetchWith.js.map +1 -1
  49. package/lib/fetch/createFetchWithLogging.js.map +1 -1
  50. package/lib/fetch/createFetchWithRetry.js.map +1 -1
  51. package/lib/fetch/dumpRequest.js.map +1 -1
  52. package/lib/fetch/dumpResponse.js.map +1 -1
  53. package/lib/fetch/index.js.map +1 -1
  54. package/lib/fetch/types.js.map +1 -1
  55. package/lib/i18n/createTranslate.js.map +1 -1
  56. package/lib/index.js +1 -0
  57. package/lib/index.js.map +1 -1
  58. package/lib/io/AbstractEncoding.js.map +1 -1
  59. package/lib/io/ArrayBuffer.test-d.js.map +1 -1
  60. package/lib/io/ArrayBuffers.js +20 -1
  61. package/lib/io/ArrayBuffers.js.map +1 -1
  62. package/lib/io/Buffer.js.map +1 -1
  63. package/lib/io/ByteArray.js +327 -0
  64. package/lib/io/ByteArray.js.map +1 -0
  65. package/lib/io/base64.js.map +1 -1
  66. package/lib/io/isBuffer.js.map +1 -1
  67. package/lib/io/isTransferable.js.map +1 -1
  68. package/lib/io/parseDataUri.js.map +1 -1
  69. package/lib/langs/MaybeFunction.js.map +1 -1
  70. package/lib/langs/classOf.js.map +1 -1
  71. package/lib/langs/deepEqual.js.map +1 -1
  72. package/lib/langs/deepFreeze.js.map +1 -1
  73. package/lib/langs/isClass.js.map +1 -1
  74. package/lib/langs/isDefined.js.map +1 -1
  75. package/lib/langs/isEmptyObject.js.map +1 -1
  76. package/lib/langs/isFunction.js.map +1 -1
  77. package/lib/langs/isPlainObject.js.map +1 -1
  78. package/lib/langs/memoize.js.map +1 -1
  79. package/lib/langs/mixin.js.map +1 -1
  80. package/lib/langs/parseBoolean.js.map +1 -1
  81. package/lib/langs/shallowClone.js.map +1 -1
  82. package/lib/langs/shallowEqual.js.map +1 -1
  83. package/lib/libs/ms.js.map +1 -1
  84. package/lib/logging/Logger.js.map +1 -1
  85. package/lib/logging/createChildLogger.js.map +1 -1
  86. package/lib/logging/createLogger.js.map +1 -1
  87. package/lib/logging/createNoopLogger.js.map +1 -1
  88. package/lib/logging/slog.js.map +1 -1
  89. package/lib/maths/clamp.js.map +1 -1
  90. package/lib/maths/random.js.map +1 -1
  91. package/lib/modules/isModule.js.map +1 -1
  92. package/lib/modules/parseModuleId.js.map +1 -1
  93. package/lib/objects/computeIfAbsent.js.map +1 -1
  94. package/lib/objects/get.js.map +1 -1
  95. package/lib/objects/get.test-d.js.map +1 -1
  96. package/lib/objects/merge/index.js.map +1 -1
  97. package/lib/objects/merge/isMergeableObject.js.map +1 -1
  98. package/lib/objects/merge/merge.js.map +1 -1
  99. package/lib/objects/parseObjectPath.js.map +1 -1
  100. package/lib/objects/set.js.map +1 -1
  101. package/lib/runtime/AsyncCloser.js.map +1 -1
  102. package/lib/runtime/Closer.js.map +1 -1
  103. package/lib/runtime/getGlobalThis.js.map +1 -1
  104. package/lib/runtime/structuredClone.js.map +1 -1
  105. package/lib/schema/typebox/gen/codegen/common/encoder.js.map +1 -1
  106. package/lib/schema/typebox/gen/codegen/common/formatter.js.map +1 -1
  107. package/lib/schema/typebox/gen/codegen/common/index.js.map +1 -1
  108. package/lib/schema/typebox/gen/codegen/common/jsdoc.js.map +1 -1
  109. package/lib/schema/typebox/gen/codegen/expression/compiler.js.map +1 -1
  110. package/lib/schema/typebox/gen/codegen/expression/errors.js.map +1 -1
  111. package/lib/schema/typebox/gen/codegen/expression/evaluator.js.map +1 -1
  112. package/lib/schema/typebox/gen/codegen/expression/expression.js.map +1 -1
  113. package/lib/schema/typebox/gen/codegen/expression/index.js.map +1 -1
  114. package/lib/schema/typebox/gen/codegen/index.js.map +1 -1
  115. package/lib/schema/typebox/gen/codegen/model/index.js.map +1 -1
  116. package/lib/schema/typebox/gen/codegen/model/model-to-arktype.js.map +1 -1
  117. package/lib/schema/typebox/gen/codegen/model/model-to-expression.js.map +1 -1
  118. package/lib/schema/typebox/gen/codegen/model/model-to-grpc.js.map +1 -1
  119. package/lib/schema/typebox/gen/codegen/model/model-to-io-ts.js.map +1 -1
  120. package/lib/schema/typebox/gen/codegen/model/model-to-javascript.js.map +1 -1
  121. package/lib/schema/typebox/gen/codegen/model/model-to-json-schema.js.map +1 -1
  122. package/lib/schema/typebox/gen/codegen/model/model-to-typebox.js.map +1 -1
  123. package/lib/schema/typebox/gen/codegen/model/model-to-typescript.js.map +1 -1
  124. package/lib/schema/typebox/gen/codegen/model/model-to-valibot.js.map +1 -1
  125. package/lib/schema/typebox/gen/codegen/model/model-to-value.js.map +1 -1
  126. package/lib/schema/typebox/gen/codegen/model/model-to-yrel.js.map +1 -1
  127. package/lib/schema/typebox/gen/codegen/model/model-to-yup.js.map +1 -1
  128. package/lib/schema/typebox/gen/codegen/model/model-to-zod.js.map +1 -1
  129. package/lib/schema/typebox/gen/codegen/model/model.js.map +1 -1
  130. package/lib/schema/typebox/gen/codegen/typescript/index.js.map +1 -1
  131. package/lib/schema/typebox/gen/codegen/typescript/typescript-to-model.js.map +1 -1
  132. package/lib/schema/typebox/gen/codegen/typescript/typescript-to-typebox.js.map +1 -1
  133. package/lib/schema/typebox/gen/index.js.map +1 -1
  134. package/lib/schema/typebox/index.js.map +1 -1
  135. package/lib/schema/typebox/typebox.js.map +1 -1
  136. package/lib/scripts/getGenerateContext.js.map +1 -1
  137. package/lib/server/crypto/md5.js.map +1 -1
  138. package/lib/server/fetch/createFetchWithProxy.js.map +1 -1
  139. package/lib/server/fetch/createFetchWithProxyByNodeFetch.js.map +1 -1
  140. package/lib/server/fetch/createFetchWithProxyByUndici.js.map +1 -1
  141. package/lib/server/getPackageDir.js.map +1 -1
  142. package/lib/server/index.js.map +1 -1
  143. package/lib/server/jsdom.js.map +1 -1
  144. package/lib/server/node-fetch.js.map +1 -1
  145. package/lib/server/polyfill/polyfillBrowser.js.map +1 -1
  146. package/lib/server/polyfill/polyfillCrypto.js.map +1 -1
  147. package/lib/server/polyfill/polyfillFetch.js.map +1 -1
  148. package/lib/server/polyfill/polyfillJsDom.js.map +1 -1
  149. package/lib/server/polyfill/polyfillWebSocket.js.map +1 -1
  150. package/lib/server/ws.js.map +1 -1
  151. package/lib/strings/camelCase.js.map +1 -1
  152. package/lib/strings/formatBytes.js.map +1 -1
  153. package/lib/strings/renderTemplate.js.map +1 -1
  154. package/lib/typedoc.js.map +1 -1
  155. package/lib/types.d.js.map +1 -1
  156. package/lib/validations/asserts.js.map +1 -1
  157. package/lib/validations/isUUID.js.map +1 -1
  158. package/lib/validations/parseTimestamp.js.map +1 -1
  159. package/package.json +5 -5
  160. package/src/index.ts +1 -0
  161. package/src/io/ArrayBuffers.ts +32 -3
  162. package/src/io/ByteArray.ts +403 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/strings/renderTemplate.ts"],"sourcesContent":["import { get } from '../objects/get';\n\n/**\n * render template like js template string\n *\n * @example\n * renderTemplate('My name is ${name}',{name:'wener'})\n * // 'My name is wener'\n *\n * @param match `js` for `${name}`, common for `{{name}}`\n */\nexport function renderTemplate(\n template: string,\n data: ((v: string) => any) | object | undefined,\n match: 'js' | 'common' | RegExp = 'js',\n) {\n let getter: Function;\n if (!data) {\n // todo warning in dev\n getter = () => '';\n } else if (typeof data === 'function') {\n getter = data;\n } else {\n getter = (v: string) => get(data, v);\n }\n if (typeof match === 'string') {\n match = Matches[match] || Matches.js;\n }\n return template.replace(match, (_, g) => {\n return getter(g.trim());\n });\n}\n\nconst Matches: Record<string, RegExp> = {\n js: /\\${(.*?)}/g,\n common: /{{(.*?)}}/g,\n};\n"],"names":["get","renderTemplate","template","data","match","getter","v","Matches","js","replace","_","g","trim","common"],"mappings":"AAAA,SAASA,GAAG,QAAQ,iBAAiB;AAErC;;;;;;;;CAQC,GACD,OAAO,SAASC,eACdC,QAAgB,EAChBC,IAA+C,EAC/CC,QAAkC,IAAI;IAEtC,IAAIC;IACJ,IAAI,CAACF,MAAM;QACT,sBAAsB;QACtBE,SAAS,IAAM;IACjB,OAAO,IAAI,OAAOF,SAAS,YAAY;QACrCE,SAASF;IACX,OAAO;QACLE,SAAS,CAACC,IAAcN,IAAIG,MAAMG;IACpC;IACA,IAAI,OAAOF,UAAU,UAAU;QAC7BA,QAAQG,OAAO,CAACH,MAAM,IAAIG,QAAQC,EAAE;IACtC;IACA,OAAON,SAASO,OAAO,CAACL,OAAO,CAACM,GAAGC;QACjC,OAAON,OAAOM,EAAEC,IAAI;IACtB;AACF;AAEA,MAAML,UAAkC;IACtCC,IAAI;IACJK,QAAQ;AACV"}
1
+ {"version":3,"sources":["../../src/strings/renderTemplate.ts"],"sourcesContent":["import { get } from '../objects/get';\n\n/**\n * render template like js template string\n *\n * @example\n * renderTemplate('My name is ${name}',{name:'wener'})\n * // 'My name is wener'\n *\n * @param match `js` for `${name}`, common for `{{name}}`\n */\nexport function renderTemplate(\n template: string,\n data: ((v: string) => any) | object | undefined,\n match: 'js' | 'common' | RegExp = 'js',\n) {\n let getter: Function;\n if (!data) {\n // todo warning in dev\n getter = () => '';\n } else if (typeof data === 'function') {\n getter = data;\n } else {\n getter = (v: string) => get(data, v);\n }\n if (typeof match === 'string') {\n match = Matches[match] || Matches.js;\n }\n return template.replace(match, (_, g) => {\n return getter(g.trim());\n });\n}\n\nconst Matches: Record<string, RegExp> = {\n js: /\\${(.*?)}/g,\n common: /{{(.*?)}}/g,\n};\n"],"names":["get","renderTemplate","template","data","match","getter","v","Matches","js","replace","_","g","trim","common"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,SAASA,GAAG,QAAQ,iBAAiB;AAErC;;;;;;;;CAQC,GACD,OAAO,SAASC,eACdC,QAAgB,EAChBC,IAA+C,EAC/CC,QAAkC,IAAI;IAEtC,IAAIC;IACJ,IAAI,CAACF,MAAM;QACT,sBAAsB;QACtBE,SAAS,IAAM;IACjB,OAAO,IAAI,OAAOF,SAAS,YAAY;QACrCE,SAASF;IACX,OAAO;QACLE,SAAS,CAACC,IAAcN,IAAIG,MAAMG;IACpC;IACA,IAAI,OAAOF,UAAU,UAAU;QAC7BA,QAAQG,OAAO,CAACH,MAAM,IAAIG,QAAQC,EAAE;IACtC;IACA,OAAON,SAASO,OAAO,CAACL,OAAO,CAACM,GAAGC;QACjC,OAAON,OAAOM,EAAEC,IAAI;IACtB;AACF;AAEA,MAAML,UAAkC;IACtCC,IAAI;IACJK,QAAQ;AACV"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/typedoc.ts"],"sourcesContent":["export * from './index';\n// fixme md5 conflict\n// export * from './server';\n"],"names":[],"mappings":"AAAA,cAAc,UAAU,CACxB,qBAAqB;CACrB,4BAA4B"}
1
+ {"version":3,"sources":["../src/typedoc.ts"],"sourcesContent":["export * from './index';\n// fixme md5 conflict\n// export * from './server';\n"],"names":[],"rangeMappings":";","mappings":"AAAA,cAAc,UAAU,CACxB,qBAAqB;CACrB,4BAA4B"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.d.ts"],"sourcesContent":["declare var __DEV__: boolean;\n\nnamespace NodeJS {\n interface Process {\n // webpack check\n readonly browser?: boolean;\n }\n interface ProcessEnv {\n readonly NODE_ENV: 'development' | 'production' | 'test';\n }\n}\n\nexport type AbstractConstructor<T = {}> = abstract new (...args: any[]) => T;\nexport type Constructor<T = {}> = new (...args: any[]) => T;\nexport type Optional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;\nexport type PartialRequired<T, K extends keyof T> = Partial<Omit<T, K>> & Required<Pick<T, K>>;\n\n/*\nhttps://github.com/total-typescript/ts-reset/blob/main/src/entrypoints/filter-boolean.d.ts\nhttps://github.com/sindresorhus/type-fest\n */\n"],"names":[],"mappings":"AAeA,WAA+F,CAE/F;;;CAGC"}
1
+ {"version":3,"sources":["../src/types.d.ts"],"sourcesContent":["declare var __DEV__: boolean;\n\nnamespace NodeJS {\n interface Process {\n // webpack check\n readonly browser?: boolean;\n }\n interface ProcessEnv {\n readonly NODE_ENV: 'development' | 'production' | 'test';\n }\n}\n\nexport type AbstractConstructor<T = {}> = abstract new (...args: any[]) => T;\nexport type Constructor<T = {}> = new (...args: any[]) => T;\nexport type Optional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;\nexport type PartialRequired<T, K extends keyof T> = Partial<Omit<T, K>> & Required<Pick<T, K>>;\n\n/*\nhttps://github.com/total-typescript/ts-reset/blob/main/src/entrypoints/filter-boolean.d.ts\nhttps://github.com/sindresorhus/type-fest\n */\n"],"names":[],"rangeMappings":";;;","mappings":"AAeA,WAA+F,CAE/F;;;CAGC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/validations/asserts.ts"],"sourcesContent":["export function assert(condition: any, msg?: string): asserts condition {\n // if (!condition) {\n // throw new AssertionError(msg);\n // }\n console.assert(!condition, msg);\n}\n\nexport function assertIsDefined<T>(val: T): asserts val is NonNullable<T> {\n // if (val === undefined || val === null) {\n // throw new AssertionError(`Expected 'val' to be defined, but received ${val}`);\n // }\n console.assert(val === undefined || val === null, 'Expected defined');\n}\n"],"names":["assert","condition","msg","console","assertIsDefined","val","undefined"],"mappings":"AAAA,OAAO,SAASA,OAAOC,SAAc,EAAEC,GAAY;IACjD,oBAAoB;IACpB,mCAAmC;IACnC,IAAI;IACJC,QAAQH,MAAM,CAAC,CAACC,WAAWC;AAC7B;AAEA,OAAO,SAASE,gBAAmBC,GAAM;IACvC,2CAA2C;IAC3C,mFAAmF;IACnF,IAAI;IACJF,QAAQH,MAAM,CAACK,QAAQC,aAAaD,QAAQ,MAAM;AACpD"}
1
+ {"version":3,"sources":["../../src/validations/asserts.ts"],"sourcesContent":["export function assert(condition: any, msg?: string): asserts condition {\n // if (!condition) {\n // throw new AssertionError(msg);\n // }\n console.assert(!condition, msg);\n}\n\nexport function assertIsDefined<T>(val: T): asserts val is NonNullable<T> {\n // if (val === undefined || val === null) {\n // throw new AssertionError(`Expected 'val' to be defined, but received ${val}`);\n // }\n console.assert(val === undefined || val === null, 'Expected defined');\n}\n"],"names":["assert","condition","msg","console","assertIsDefined","val","undefined"],"rangeMappings":";;;;;;;;;;;","mappings":"AAAA,OAAO,SAASA,OAAOC,SAAc,EAAEC,GAAY;IACjD,oBAAoB;IACpB,mCAAmC;IACnC,IAAI;IACJC,QAAQH,MAAM,CAAC,CAACC,WAAWC;AAC7B;AAEA,OAAO,SAASE,gBAAmBC,GAAM;IACvC,2CAA2C;IAC3C,mFAAmF;IACnF,IAAI;IACJF,QAAQH,MAAM,CAACK,QAAQC,aAAaD,QAAQ,MAAM;AACpD"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/validations/isUUID.ts"],"sourcesContent":["export function isUUID(str: string | undefined | null) {\n return Boolean(str) && /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(String(str));\n}\n"],"names":["isUUID","str","Boolean","test","String"],"mappings":"AAAA,OAAO,SAASA,OAAOC,GAA8B;IACnD,OAAOC,QAAQD,QAAQ,yEAAyEE,IAAI,CAACC,OAAOH;AAC9G"}
1
+ {"version":3,"sources":["../../src/validations/isUUID.ts"],"sourcesContent":["export function isUUID(str: string | undefined | null) {\n return Boolean(str) && /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(String(str));\n}\n"],"names":["isUUID","str","Boolean","test","String"],"rangeMappings":";;","mappings":"AAAA,OAAO,SAASA,OAAOC,GAA8B;IACnD,OAAOC,QAAQD,QAAQ,yEAAyEE,IAAI,CAACC,OAAOH;AAC9G"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/validations/parseTimestamp.ts"],"sourcesContent":["export function parseTimestamp(raw?: string | number | Date): Date | undefined {\n if (!raw) {\n return undefined;\n }\n if (raw instanceof Date) {\n return raw;\n }\n\n if (typeof raw === 'string' && /^[0-9.]+$/.test(raw)) {\n let n = parseFloat(raw);\n const len = Math.floor(n).toString().length;\n /*\n 最常见的是 10 位和 13 位\n 9999999999 - 10*9 - 1970-04-26\n 99999999999 - 11*9 - 1973\n 999999999999 - 12*9 - 2001\n */\n if (len <= 11) {\n n *= 1000;\n }\n return new Date(n);\n } else if (typeof raw === 'string') {\n const date = new Date(raw);\n if (!isNaN(+date)) {\n return date;\n }\n }\n throw new Error(`parseTimestamp: invalid \"${raw}\"`);\n}\n"],"names":["parseTimestamp","raw","undefined","Date","test","n","parseFloat","len","Math","floor","toString","length","date","isNaN","Error"],"mappings":"AAAA,OAAO,SAASA,eAAeC,GAA4B;IACzD,IAAI,CAACA,KAAK;QACR,OAAOC;IACT;IACA,IAAID,eAAeE,MAAM;QACvB,OAAOF;IACT;IAEA,IAAI,OAAOA,QAAQ,YAAY,YAAYG,IAAI,CAACH,MAAM;QACpD,IAAII,IAAIC,WAAWL;QACnB,MAAMM,MAAMC,KAAKC,KAAK,CAACJ,GAAGK,QAAQ,GAAGC,MAAM;QAC3C;;;;;KAKC,GACD,IAAIJ,OAAO,IAAI;YACbF,KAAK;QACP;QACA,OAAO,IAAIF,KAAKE;IAClB,OAAO,IAAI,OAAOJ,QAAQ,UAAU;QAClC,MAAMW,OAAO,IAAIT,KAAKF;QACtB,IAAI,CAACY,MAAM,CAACD,OAAO;YACjB,OAAOA;QACT;IACF;IACA,MAAM,IAAIE,MAAM,CAAC,yBAAyB,EAAEb,IAAI,CAAC,CAAC;AACpD"}
1
+ {"version":3,"sources":["../../src/validations/parseTimestamp.ts"],"sourcesContent":["export function parseTimestamp(raw?: string | number | Date): Date | undefined {\n if (!raw) {\n return undefined;\n }\n if (raw instanceof Date) {\n return raw;\n }\n\n if (typeof raw === 'string' && /^[0-9.]+$/.test(raw)) {\n let n = parseFloat(raw);\n const len = Math.floor(n).toString().length;\n /*\n 最常见的是 10 位和 13 位\n 9999999999 - 10*9 - 1970-04-26\n 99999999999 - 11*9 - 1973\n 999999999999 - 12*9 - 2001\n */\n if (len <= 11) {\n n *= 1000;\n }\n return new Date(n);\n } else if (typeof raw === 'string') {\n const date = new Date(raw);\n if (!isNaN(+date)) {\n return date;\n }\n }\n throw new Error(`parseTimestamp: invalid \"${raw}\"`);\n}\n"],"names":["parseTimestamp","raw","undefined","Date","test","n","parseFloat","len","Math","floor","toString","length","date","isNaN","Error"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,OAAO,SAASA,eAAeC,GAA4B;IACzD,IAAI,CAACA,KAAK;QACR,OAAOC;IACT;IACA,IAAID,eAAeE,MAAM;QACvB,OAAOF;IACT;IAEA,IAAI,OAAOA,QAAQ,YAAY,YAAYG,IAAI,CAACH,MAAM;QACpD,IAAII,IAAIC,WAAWL;QACnB,MAAMM,MAAMC,KAAKC,KAAK,CAACJ,GAAGK,QAAQ,GAAGC,MAAM;QAC3C;;;;;KAKC,GACD,IAAIJ,OAAO,IAAI;YACbF,KAAK;QACP;QACA,OAAO,IAAIF,KAAKE;IAClB,OAAO,IAAI,OAAOJ,QAAQ,UAAU;QAClC,MAAMW,OAAO,IAAIT,KAAKF;QACtB,IAAI,CAACY,MAAM,CAACD,OAAO;YACjB,OAAOA;QACT;IACF;IACA,MAAM,IAAIE,MAAM,CAAC,yBAAyB,EAAEb,IAAI,CAAC,CAAC;AACpD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wener/utils",
3
- "version": "1.1.42",
3
+ "version": "1.1.44",
4
4
  "type": "module",
5
5
  "description": "Utils for daily use",
6
6
  "repository": {
@@ -78,15 +78,15 @@
78
78
  }
79
79
  },
80
80
  "devDependencies": {
81
- "@sinclair/typebox": "^0.32.15",
81
+ "@sinclair/typebox": "^0.32.24",
82
82
  "@types/lodash": "^4.17.0",
83
83
  "@types/ws": "^8.5.10",
84
- "@wener/utils": "link:.",
84
+ "@wener/utils": "link:",
85
85
  "https-proxy-agent": "^7.0.4",
86
86
  "lodash": "^4.17.21",
87
87
  "node-fetch": "^3.3.2",
88
- "undici": "^6.9.0",
89
- "zod": "^3.22.4"
88
+ "undici": "^6.14.1",
89
+ "zod": "^3.23.4"
90
90
  },
91
91
  "publishConfig": {
92
92
  "registry": "https://registry.npmjs.org",
package/src/index.ts CHANGED
@@ -74,6 +74,7 @@ export { createTranslate } from './i18n/createTranslate';
74
74
  export { isBuffer } from './io/isBuffer';
75
75
  export { isTransferable } from './io/isTransferable';
76
76
  export { ArrayBuffers } from './io/ArrayBuffers';
77
+ export { ByteArray } from './io/ByteArray';
77
78
  export { Buffer } from './io/Buffer';
78
79
  export { parseDataUri, type ParsedDataUri } from './io/parseDataUri';
79
80
  export type { AbstractEncoding } from './io/AbstractEncoding';
@@ -71,6 +71,8 @@ export interface ArrayBuffers {
71
71
  toHex(v: BufferSource): string;
72
72
 
73
73
  resize(v: ArrayBuffer, newByteLength: number): ArrayBuffer;
74
+
75
+ // truncate(v: ArrayBufferLike, len?: number): ArrayBufferLike;
74
76
  }
75
77
 
76
78
  type ToStringEncoding =
@@ -155,8 +157,12 @@ export class ArrayBuffers {
155
157
  return this.toUint8Array(ArrayBuffers.from(v, 'hex'));
156
158
  };
157
159
 
158
- static resize = (v: ArrayBuffer, newByteLength: number): ArrayBuffer => {
159
- if ('resize' in v) {
160
+ static resize = (v: ArrayBufferLike, newByteLength?: number) => {
161
+ if (newByteLength === undefined || newByteLength === null) {
162
+ return v;
163
+ }
164
+
165
+ if ('resize' in v && (v as any).resizable) {
160
166
  (v as any).resize(newByteLength);
161
167
  return v;
162
168
  }
@@ -339,6 +345,23 @@ export class ArrayBuffers {
339
345
  }
340
346
  };
341
347
 
348
+ // static truncate = (a: ArrayBufferLike, len?: number) => {
349
+ // if (len === 0) {
350
+ // return new ArrayBuffer(0);
351
+ // }
352
+ // if (!len) {
353
+ // return a;
354
+ // }
355
+ // if (a.byteLength > len) {
356
+ // return a.slice(0, len);
357
+ // } else if (a.byteLength < len) {
358
+ // let b = new Uint8Array(len);
359
+ // b.set(new Uint8Array(a));
360
+ // return b;
361
+ // }
362
+ // return a;
363
+ // };
364
+
342
365
  static concat = (buffers: Array<BufferSource>, result?: ArrayBuffer, offset = 0) => {
343
366
  // https://stackoverflow.com/questions/10786128/appending-arraybuffers
344
367
 
@@ -390,7 +413,13 @@ const hexLookupTable = (function () {
390
413
 
391
414
  declare global {
392
415
  interface ArrayBuffer {
393
- // resize(newByteLength: number): void;
416
+ resize?: (newByteLength: number) => void;
417
+ resizable?: boolean;
418
+ }
419
+
420
+ interface SharedArrayBuffer {
421
+ resize?: (newByteLength: number) => void;
422
+ resizable?: boolean;
394
423
  }
395
424
 
396
425
  interface Uint8Array {
@@ -0,0 +1,403 @@
1
+ import { isDefined } from '../langs/isDefined';
2
+ import { ArrayBuffers } from './ArrayBuffers';
3
+
4
+ type AnyBuffer = BufferSource | ArrayBufferLike;
5
+
6
+ function asBuffer(o: AnyBuffer) {
7
+ if (o instanceof ArrayBuffer) {
8
+ return o;
9
+ }
10
+ if (ArrayBuffer.isView(o)) {
11
+ // 保留 offset&length
12
+ if (o.byteLength !== o.buffer.byteLength) {
13
+ // ArrayBuffer 没有 subarray
14
+ // if ('subarray' in o.buffer) {
15
+ // return (o.buffer as any).subarray(o.byteOffset, o.byteOffset + o.byteLength);
16
+ // }
17
+ return o.buffer.slice(o.byteOffset, o.byteOffset + o.byteLength);
18
+ }
19
+ return o.buffer;
20
+ }
21
+ return o;
22
+ }
23
+
24
+ // function asView(o: AnyBuffer) {
25
+ // if (o instanceof DataView) {
26
+ // return o;
27
+ // }
28
+ // if (ArrayBuffer.isView(o)) {
29
+ // // 不 clone 也能保留 offset&length
30
+ // return new DataView(o.buffer, o.byteOffset, o.byteLength);
31
+ // }
32
+ // return new DataView(o);
33
+ // }
34
+
35
+ /**
36
+ * @see https://www.egret.uk/docs/egretengine/engine/egret.ByteArray
37
+ * @see https://netty.io/4.1/api/io/netty/buffer/ByteBuf.html
38
+ */
39
+ export class ByteArray {
40
+ position = 0;
41
+
42
+ #buffer: ArrayBufferLike;
43
+ #view: DataView;
44
+
45
+ constructor(buffer: AnyBuffer = new ArrayBuffer(0, { maxByteLength: 1024 })) {
46
+ this.#buffer = asBuffer(buffer);
47
+ // note prefer view over buffer, avoid the slice overhead ?
48
+ this.#view = new DataView(this.#buffer);
49
+ }
50
+
51
+ get view() {
52
+ return this.#view;
53
+ }
54
+
55
+ get buffer(): ArrayBufferLike {
56
+ return this.#buffer;
57
+ }
58
+
59
+ set buffer(buffer: AnyBuffer) {
60
+ this.#buffer = asBuffer(buffer);
61
+ this.#view = new DataView(this.#buffer);
62
+ }
63
+
64
+ get length() {
65
+ return this.view.byteLength;
66
+ }
67
+
68
+ set length(length: number) {
69
+ this.resize(length);
70
+ }
71
+
72
+ private ensureSpace(length: number) {
73
+ if (this.remaining() < length) {
74
+ this.resize(this.length + length);
75
+ }
76
+ }
77
+
78
+ resize(newLength: number) {
79
+ // Chrome 111, Nodejs 20
80
+ let buf = this.buffer;
81
+ if (buf.resize && (!isDefined(buf.resizable) || buf.resizable)) {
82
+ buf.resize(newLength);
83
+ } else {
84
+ let newBuffer = new ArrayBuffer(newLength);
85
+ new Uint8Array(newBuffer).set(new Uint8Array(buf));
86
+ this.buffer = newBuffer;
87
+ }
88
+ }
89
+
90
+ writeByte(value: number) {
91
+ this.ensureSpace(1);
92
+ this.view.setUint8(this.position++, value);
93
+ }
94
+
95
+ writeBytes(bytes: ArrayBufferLike) {
96
+ this.ensureSpace(bytes.byteLength);
97
+ new Uint8Array(this.buffer).set(new Uint8Array(bytes), this.position);
98
+ this.position += bytes.byteLength;
99
+ }
100
+
101
+ writeInt8(value: number) {
102
+ this.ensureSpace(1);
103
+ this.view.setInt8(this.position, value);
104
+ this.position += 1;
105
+ }
106
+
107
+ writeUint8(value: number) {
108
+ this.ensureSpace(1);
109
+ this.view.setUint8(this.position, value);
110
+ this.position += 1;
111
+ }
112
+
113
+ writeInt16(value: number) {
114
+ this.ensureSpace(2);
115
+ this.view.setInt16(this.position, value);
116
+ this.position += 2;
117
+ }
118
+
119
+ writeUint16(value: number) {
120
+ this.ensureSpace(2);
121
+ this.view.setUint16(this.position, value);
122
+ this.position += 2;
123
+ }
124
+
125
+ writeInt32(value: number) {
126
+ this.ensureSpace(4);
127
+ this.view.setInt32(this.position, value);
128
+ this.position += 4;
129
+ }
130
+
131
+ writeUint32(value: number) {
132
+ this.ensureSpace(4);
133
+ this.view.setUint32(this.position, value);
134
+ this.position += 4;
135
+ }
136
+
137
+ writeInt64(value: bigint) {
138
+ this.ensureSpace(8);
139
+ this.view.setBigInt64(this.position, value);
140
+ this.position += 8;
141
+ }
142
+
143
+ writeUint64(value: bigint) {
144
+ this.ensureSpace(8);
145
+ this.view.setBigUint64(this.position, value);
146
+ this.position += 8;
147
+ }
148
+
149
+ writeFloat32(value: number) {
150
+ this.ensureSpace(4);
151
+ this.view.setFloat32(this.position, value);
152
+ this.position += 4;
153
+ }
154
+
155
+ writeFloat64(value: number) {
156
+ this.ensureSpace(8);
157
+ this.view.setFloat64(this.position, value);
158
+ this.position += 8;
159
+ }
160
+
161
+ writeBoolean(value: boolean) {
162
+ this.writeByte(value ? 1 : 0);
163
+ }
164
+
165
+ writeString(value: string): void;
166
+ writeString(value: string, len?: number): void;
167
+ writeString(value: string, len?: number) {
168
+ let encoder = new TextEncoder();
169
+ let bytes = encoder.encode(value);
170
+ this.writeBytes(ArrayBuffers.resize(bytes.buffer, len));
171
+ }
172
+
173
+ readByte() {
174
+ return this.view.getUint8(this.position++);
175
+ }
176
+
177
+ readBytes(length: number) {
178
+ let bytes = this.buffer.slice(this.position, this.position + length);
179
+ this.position += length;
180
+ return bytes;
181
+ }
182
+
183
+ readInt8() {
184
+ let value = this.view.getInt8(this.position);
185
+ this.position += 1;
186
+ return value;
187
+ }
188
+
189
+ readUint8() {
190
+ let value = this.view.getUint8(this.position);
191
+ this.position += 1;
192
+ return value;
193
+ }
194
+
195
+ readInt16() {
196
+ let value = this.view.getInt16(this.position);
197
+ this.position += 2;
198
+ return value;
199
+ }
200
+
201
+ readUint16() {
202
+ let value = this.view.getUint16(this.position);
203
+ this.position += 2;
204
+ return value;
205
+ }
206
+
207
+ readInt32() {
208
+ let value = this.view.getInt32(this.position);
209
+ this.position += 4;
210
+ return value;
211
+ }
212
+
213
+ readUint32() {
214
+ let value = this.view.getUint32(this.position);
215
+ this.position += 4;
216
+ return value;
217
+ }
218
+
219
+ readInt64() {
220
+ let value = this.view.getBigInt64(this.position);
221
+ this.position += 8;
222
+ return safeNumber(value);
223
+ }
224
+
225
+ readUint64() {
226
+ let value = this.view.getBigUint64(this.position);
227
+ this.position += 8;
228
+ return safeNumber(value);
229
+ }
230
+
231
+ readFloat32() {
232
+ let value = this.view.getFloat32(this.position);
233
+ this.position += 4;
234
+ return value;
235
+ }
236
+
237
+ readFloat64() {
238
+ let value = this.view.getFloat64(this.position);
239
+ this.position += 8;
240
+ return value;
241
+ }
242
+
243
+ readBoolean() {
244
+ return this.readByte() === 1;
245
+ }
246
+
247
+ readString(length: number) {
248
+ let bytes = this.readBytes(length);
249
+ let decoder = new TextDecoder();
250
+ let a = new Uint8Array(bytes);
251
+ let idx = a.indexOf(0);
252
+ if (idx !== -1) {
253
+ bytes = bytes.slice(0, idx);
254
+ }
255
+ return decoder.decode(bytes);
256
+ }
257
+
258
+ readHexString(length: number) {
259
+ let bytes = this.readBytes(length);
260
+ return ArrayBuffers.toHex(bytes);
261
+ }
262
+
263
+ writeInt24(value: number) {
264
+ this.writeUint8(value & 0xff);
265
+ this.writeUint16(value >> 8);
266
+ }
267
+
268
+ readInt24() {
269
+ return this.readUint8() | (this.readUint16() << 8);
270
+ }
271
+
272
+ writeZero(length: number) {
273
+ this.writeBytes(new Uint8Array(length).buffer);
274
+ }
275
+
276
+ writeValue(typ: TypedValue['type'], val: TypedValue['value']): void;
277
+ writeValue(tv: TypedValue): void;
278
+ writeValue(a: any, b?: any) {
279
+ const tv: TypedValue = typeof a === 'string' ? { type: a, value: b } : a;
280
+ const { type, value, length } = tv;
281
+ switch (type) {
282
+ case 'uint8':
283
+ this.writeUint8(value);
284
+ break;
285
+ case 'byte':
286
+ case 'int8':
287
+ this.writeInt8(value);
288
+ break;
289
+ case 'uint16':
290
+ this.writeUint16(value);
291
+ break;
292
+ case 'int16':
293
+ this.writeInt16(value);
294
+ break;
295
+ case 'uint32':
296
+ this.writeUint32(value);
297
+ break;
298
+ case 'int32':
299
+ this.writeInt32(value);
300
+ break;
301
+ case 'float32':
302
+ this.writeFloat32(value);
303
+ break;
304
+ case 'float64':
305
+ this.writeFloat64(value);
306
+ break;
307
+ case 'string':
308
+ this.writeString(value, length);
309
+ break;
310
+ case 'boolean':
311
+ this.writeBoolean(value);
312
+ break;
313
+ case 'bytes':
314
+ this.writeBytes(value);
315
+ break;
316
+ default:
317
+ throw new Error(`Unknown type ${type}`);
318
+ }
319
+ }
320
+
321
+ readInt() {
322
+ return this.readInt32();
323
+ }
324
+
325
+ readFloat() {
326
+ return this.readFloat32();
327
+ }
328
+
329
+ readDouble() {
330
+ return this.readFloat64();
331
+ }
332
+
333
+ remaining() {
334
+ return this.view.byteLength - this.position;
335
+ }
336
+
337
+ toUint8Array() {
338
+ return new Uint8Array(this.buffer);
339
+ }
340
+
341
+ toHex() {
342
+ return ArrayBuffers.toHex(this.buffer);
343
+ }
344
+ }
345
+
346
+ export interface TypedValue {
347
+ type:
348
+ | 'byte'
349
+ | 'bytes'
350
+ | 'uint8'
351
+ | 'int8'
352
+ | 'uint16'
353
+ | 'int16'
354
+ | 'uint32'
355
+ | 'int32'
356
+ | 'float32'
357
+ | 'float64'
358
+ | 'string'
359
+ | 'boolean';
360
+ value: any;
361
+ length?: number;
362
+ }
363
+
364
+ export function toDump(data: BufferSource) {
365
+ return Array.from(ArrayBuffers.toHex(data).match(/.{1,32}/g) ?? [])
366
+ .map((v, i) => {
367
+ let idxPrefix = `${i.toString(16).padStart(8, '0')}:`;
368
+ let content = Array.from(v.match(/.{4}/g) ?? []).join(' ');
369
+ let chars = Array.from(new Uint8Array(ArrayBuffers.fromHex(v).buffer)).map((v) => {
370
+ let c = String.fromCharCode(v);
371
+ if (v < 32 || v > 126) {
372
+ c = '.';
373
+ }
374
+ return c;
375
+ });
376
+ return [idxPrefix, content.padEnd(40, ' '), chars.join('')].join(' ');
377
+ })
378
+ .join('\n');
379
+ }
380
+
381
+ /**
382
+ * Chrome Websocket Binary format
383
+ * ```
384
+ * 00000000: 0000 0000 0000 0000 0000 0000 0000 0000 ................
385
+ * ```
386
+ */
387
+ export function fromDump(dump: string) {
388
+ return ArrayBuffers.fromHex(
389
+ dump
390
+ .split('\n')
391
+ .map((v) => {
392
+ return v.substring(10, 10 + 41).replaceAll(' ', '');
393
+ })
394
+ .join(''),
395
+ );
396
+ }
397
+
398
+ function safeNumber(n: bigint) {
399
+ if (n > Number.MAX_SAFE_INTEGER) {
400
+ return n;
401
+ }
402
+ return Number(n);
403
+ }