@wener/utils 1.1.47 → 1.1.49

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 (194) hide show
  1. package/README.md +9 -1
  2. package/lib/asyncs/Promises.js +54 -0
  3. package/lib/asyncs/Promises.js.map +1 -0
  4. package/lib/asyncs/createLazyPromise.js +52 -51
  5. package/lib/asyncs/createLazyPromise.js.map +1 -1
  6. package/lib/asyncs/firstOfAsyncIterator.js.map +1 -1
  7. package/lib/asyncs/isPromise.js +2 -3
  8. package/lib/asyncs/isPromise.js.map +1 -1
  9. package/lib/asyncs/nextOfAsyncIterator.js.map +1 -1
  10. package/lib/asyncs/timeout.js +4 -4
  11. package/lib/asyncs/timeout.js.map +1 -1
  12. package/lib/cn/division/DivisionCode.js +30 -17
  13. package/lib/cn/division/DivisionCode.js.map +1 -1
  14. package/lib/cn/id/{Mod11Checksum.js → Mod11.js} +3 -6
  15. package/lib/cn/id/Mod11.js.map +1 -0
  16. package/lib/cn/id/ResidentIdNumber.js +10 -12
  17. package/lib/cn/id/ResidentIdNumber.js.map +1 -1
  18. package/lib/cn/types.js +3 -0
  19. package/lib/cn/types.js.map +1 -0
  20. package/lib/cn/uscc/{Mod31Checksum.js → Mod31.js} +3 -6
  21. package/lib/cn/uscc/Mod31.js.map +1 -0
  22. package/lib/cn/uscc/USCC.js +6 -9
  23. package/lib/cn/uscc/USCC.js.map +1 -1
  24. package/lib/cn/uscc/isUSCC.js +1 -1
  25. package/lib/cn/uscc/isUSCC.js.map +1 -1
  26. package/lib/crypto/getNodeCrypto.js +14 -10
  27. package/lib/crypto/getNodeCrypto.js.map +1 -1
  28. package/lib/crypto/getRandomValues.js +5 -1
  29. package/lib/crypto/getRandomValues.js.map +1 -1
  30. package/lib/emitter/types.js +3 -0
  31. package/lib/emitter/types.js.map +1 -0
  32. package/lib/fetch/createFetchWith.js.map +1 -1
  33. package/lib/fetch/createFetchWithRetry.js.map +1 -1
  34. package/lib/fetch/http.types.js +4 -0
  35. package/lib/fetch/http.types.js.map +1 -0
  36. package/lib/index.js +6 -3
  37. package/lib/index.js.map +1 -1
  38. package/lib/io/ArrayBuffers.js.map +1 -1
  39. package/lib/io/ByteBuffer.js +235 -36
  40. package/lib/io/ByteBuffer.js.map +1 -1
  41. package/lib/langs/getGlobalStates.js +17 -0
  42. package/lib/langs/getGlobalStates.js.map +1 -0
  43. package/lib/langs/getObjectId.js +18 -0
  44. package/lib/langs/getObjectId.js.map +1 -0
  45. package/lib/langs/isNullish.js +5 -0
  46. package/lib/langs/isNullish.js.map +1 -0
  47. package/lib/logging/slog.js.map +1 -1
  48. package/lib/maths/clamp.js +7 -6
  49. package/lib/maths/clamp.js.map +1 -1
  50. package/lib/maths/random.js.map +1 -1
  51. package/lib/mitt/index.js +77 -0
  52. package/lib/mitt/index.js.map +1 -0
  53. package/lib/objects/computeIfAbsent.js +1 -1
  54. package/lib/objects/computeIfAbsent.js.map +1 -1
  55. package/lib/schema/typebox/typebox.js.map +1 -1
  56. package/lib/server/fetch/createFetchWithProxyByUndici.js.map +1 -1
  57. package/package.json +6 -14
  58. package/src/asyncs/Promises.ts +62 -0
  59. package/src/asyncs/createLazyPromise.test.ts +52 -13
  60. package/src/asyncs/createLazyPromise.ts +66 -61
  61. package/src/asyncs/firstOfAsyncIterator.ts +1 -1
  62. package/src/asyncs/isPromise.ts +3 -3
  63. package/src/asyncs/nextOfAsyncIterator.ts +1 -1
  64. package/src/asyncs/timeout.ts +4 -4
  65. package/src/cn/division/DivisionCode.ts +61 -8
  66. package/src/cn/division/division.test.ts +6 -0
  67. package/src/cn/id/{Mod11Checksum.ts → Mod11.ts} +3 -6
  68. package/src/cn/id/ResidentIdNumber.ts +11 -13
  69. package/src/cn/id/id.test.ts +5 -5
  70. package/src/cn/scripts/gen.test.ts +2 -1
  71. package/src/cn/types.ts +11 -0
  72. package/src/cn/uscc/{Mod31Checksum.ts → Mod31.ts} +3 -7
  73. package/src/cn/uscc/USCC.ts +7 -11
  74. package/src/cn/uscc/isUSCC.ts +1 -1
  75. package/src/cn/uscc/uscc.test.ts +4 -4
  76. package/src/crypto/getNodeCrypto.ts +16 -11
  77. package/src/crypto/getRandomValues.ts +6 -1
  78. package/src/emitter/types.ts +18 -0
  79. package/src/fetch/createFetchWith.ts +1 -1
  80. package/src/fetch/createFetchWithRetry.ts +1 -1
  81. package/src/fetch/http.types.ts +46 -0
  82. package/src/index.ts +7 -3
  83. package/src/io/ArrayBuffers.ts +7 -3
  84. package/src/io/ByteBuffer.test.ts +33 -6
  85. package/src/io/ByteBuffer.ts +272 -41
  86. package/src/langs/getGlobalStates.ts +21 -0
  87. package/src/langs/getObjectId.ts +20 -0
  88. package/src/langs/isNullish.ts +3 -0
  89. package/src/langs/mixin.test.ts +43 -0
  90. package/src/logging/slog.ts +1 -1
  91. package/src/maths/clamp.test.ts +5 -1
  92. package/src/maths/clamp.ts +7 -7
  93. package/src/maths/random.ts +1 -1
  94. package/src/mitt/README.md +1 -0
  95. package/src/mitt/index.ts +114 -0
  96. package/src/objects/computeIfAbsent.ts +3 -2
  97. package/src/objects/merge/merge.test.ts +1 -1
  98. package/src/schema/typebox/typebox.ts +1 -1
  99. package/src/server/fetch/createFetchWithProxyByUndici.ts +2 -2
  100. package/tsconfig.json +4 -1
  101. package/lib/asyncs/sleep.js +0 -3
  102. package/lib/asyncs/sleep.js.map +0 -1
  103. package/lib/cn/id/Mod11Checksum.js.map +0 -1
  104. package/lib/cn/uscc/Mod31Checksum.js.map +0 -1
  105. package/lib/schema/typebox/gen/codegen/common/encoder.js +0 -94
  106. package/lib/schema/typebox/gen/codegen/common/encoder.js.map +0 -1
  107. package/lib/schema/typebox/gen/codegen/common/formatter.js +0 -33
  108. package/lib/schema/typebox/gen/codegen/common/formatter.js.map +0 -1
  109. package/lib/schema/typebox/gen/codegen/common/index.js +0 -29
  110. package/lib/schema/typebox/gen/codegen/common/index.js.map +0 -1
  111. package/lib/schema/typebox/gen/codegen/common/jsdoc.js +0 -117
  112. package/lib/schema/typebox/gen/codegen/common/jsdoc.js.map +0 -1
  113. package/lib/schema/typebox/gen/codegen/expression/compiler.js +0 -364
  114. package/lib/schema/typebox/gen/codegen/expression/compiler.js.map +0 -1
  115. package/lib/schema/typebox/gen/codegen/expression/errors.js +0 -259
  116. package/lib/schema/typebox/gen/codegen/expression/errors.js.map +0 -1
  117. package/lib/schema/typebox/gen/codegen/expression/evaluator.js +0 -254
  118. package/lib/schema/typebox/gen/codegen/expression/evaluator.js.map +0 -1
  119. package/lib/schema/typebox/gen/codegen/expression/expression.js +0 -381
  120. package/lib/schema/typebox/gen/codegen/expression/expression.js.map +0 -1
  121. package/lib/schema/typebox/gen/codegen/expression/index.js +0 -32
  122. package/lib/schema/typebox/gen/codegen/expression/index.js.map +0 -1
  123. package/lib/schema/typebox/gen/codegen/index.js +0 -29
  124. package/lib/schema/typebox/gen/codegen/index.js.map +0 -1
  125. package/lib/schema/typebox/gen/codegen/model/index.js +0 -40
  126. package/lib/schema/typebox/gen/codegen/model/index.js.map +0 -1
  127. package/lib/schema/typebox/gen/codegen/model/model-to-arktype.js +0 -260
  128. package/lib/schema/typebox/gen/codegen/model/model-to-arktype.js.map +0 -1
  129. package/lib/schema/typebox/gen/codegen/model/model-to-expression.js +0 -383
  130. package/lib/schema/typebox/gen/codegen/model/model-to-expression.js.map +0 -1
  131. package/lib/schema/typebox/gen/codegen/model/model-to-grpc.js +0 -238
  132. package/lib/schema/typebox/gen/codegen/model/model-to-grpc.js.map +0 -1
  133. package/lib/schema/typebox/gen/codegen/model/model-to-io-ts.js +0 -274
  134. package/lib/schema/typebox/gen/codegen/model/model-to-io-ts.js.map +0 -1
  135. package/lib/schema/typebox/gen/codegen/model/model-to-javascript.js +0 -47
  136. package/lib/schema/typebox/gen/codegen/model/model-to-javascript.js.map +0 -1
  137. package/lib/schema/typebox/gen/codegen/model/model-to-json-schema.js +0 -192
  138. package/lib/schema/typebox/gen/codegen/model/model-to-json-schema.js.map +0 -1
  139. package/lib/schema/typebox/gen/codegen/model/model-to-typebox.js +0 -33
  140. package/lib/schema/typebox/gen/codegen/model/model-to-typebox.js.map +0 -1
  141. package/lib/schema/typebox/gen/codegen/model/model-to-typescript.js +0 -188
  142. package/lib/schema/typebox/gen/codegen/model/model-to-typescript.js.map +0 -1
  143. package/lib/schema/typebox/gen/codegen/model/model-to-valibot.js +0 -239
  144. package/lib/schema/typebox/gen/codegen/model/model-to-valibot.js.map +0 -1
  145. package/lib/schema/typebox/gen/codegen/model/model-to-value.js +0 -43
  146. package/lib/schema/typebox/gen/codegen/model/model-to-value.js.map +0 -1
  147. package/lib/schema/typebox/gen/codegen/model/model-to-yrel.js +0 -227
  148. package/lib/schema/typebox/gen/codegen/model/model-to-yrel.js.map +0 -1
  149. package/lib/schema/typebox/gen/codegen/model/model-to-yup.js +0 -225
  150. package/lib/schema/typebox/gen/codegen/model/model-to-yup.js.map +0 -1
  151. package/lib/schema/typebox/gen/codegen/model/model-to-zod.js +0 -248
  152. package/lib/schema/typebox/gen/codegen/model/model-to-zod.js.map +0 -1
  153. package/lib/schema/typebox/gen/codegen/model/model.js +0 -27
  154. package/lib/schema/typebox/gen/codegen/model/model.js.map +0 -1
  155. package/lib/schema/typebox/gen/codegen/typescript/index.js +0 -28
  156. package/lib/schema/typebox/gen/codegen/typescript/index.js.map +0 -1
  157. package/lib/schema/typebox/gen/codegen/typescript/typescript-to-model.js +0 -72
  158. package/lib/schema/typebox/gen/codegen/typescript/typescript-to-model.js.map +0 -1
  159. package/lib/schema/typebox/gen/codegen/typescript/typescript-to-typebox.js +0 -620
  160. package/lib/schema/typebox/gen/codegen/typescript/typescript-to-typebox.js.map +0 -1
  161. package/lib/schema/typebox/gen/index.js +0 -3
  162. package/lib/schema/typebox/gen/index.js.map +0 -1
  163. package/src/asyncs/sleep.ts +0 -1
  164. package/src/schema/typebox/gen/codegen/common/encoder.ts +0 -99
  165. package/src/schema/typebox/gen/codegen/common/formatter.ts +0 -31
  166. package/src/schema/typebox/gen/codegen/common/index.ts +0 -29
  167. package/src/schema/typebox/gen/codegen/common/jsdoc.ts +0 -93
  168. package/src/schema/typebox/gen/codegen/expression/compiler.ts +0 -377
  169. package/src/schema/typebox/gen/codegen/expression/errors.ts +0 -302
  170. package/src/schema/typebox/gen/codegen/expression/evaluator.ts +0 -268
  171. package/src/schema/typebox/gen/codegen/expression/expression.ts +0 -538
  172. package/src/schema/typebox/gen/codegen/expression/index.ts +0 -32
  173. package/src/schema/typebox/gen/codegen/index.ts +0 -29
  174. package/src/schema/typebox/gen/codegen/model/index.ts +0 -40
  175. package/src/schema/typebox/gen/codegen/model/model-to-arktype.ts +0 -266
  176. package/src/schema/typebox/gen/codegen/model/model-to-expression.ts +0 -378
  177. package/src/schema/typebox/gen/codegen/model/model-to-grpc.ts +0 -244
  178. package/src/schema/typebox/gen/codegen/model/model-to-io-ts.ts +0 -294
  179. package/src/schema/typebox/gen/codegen/model/model-to-javascript.ts +0 -42
  180. package/src/schema/typebox/gen/codegen/model/model-to-json-schema.ts +0 -166
  181. package/src/schema/typebox/gen/codegen/model/model-to-typebox.ts +0 -32
  182. package/src/schema/typebox/gen/codegen/model/model-to-typescript.ts +0 -189
  183. package/src/schema/typebox/gen/codegen/model/model-to-valibot.ts +0 -236
  184. package/src/schema/typebox/gen/codegen/model/model-to-value.ts +0 -42
  185. package/src/schema/typebox/gen/codegen/model/model-to-yrel.ts +0 -232
  186. package/src/schema/typebox/gen/codegen/model/model-to-yup.ts +0 -226
  187. package/src/schema/typebox/gen/codegen/model/model-to-zod.ts +0 -251
  188. package/src/schema/typebox/gen/codegen/model/model.ts +0 -33
  189. package/src/schema/typebox/gen/codegen/typescript/index.ts +0 -28
  190. package/src/schema/typebox/gen/codegen/typescript/typescript-to-model.ts +0 -61
  191. package/src/schema/typebox/gen/codegen/typescript/typescript-to-typebox.ts +0 -647
  192. package/src/schema/typebox/gen/gen.test.ts +0 -12
  193. package/src/schema/typebox/gen/index.ts +0 -1
  194. /package/src/schema/{typebox/gen/README.md → README.md} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/logging/slog.ts"],"sourcesContent":["import { Logger, LogLevel } from './Logger';\n\nenum Level {\n trace = -8,\n debug = -4,\n info = 0,\n warn = 4,\n error = 8,\n}\n\ninterface LogRecord {\n time?: Date;\n message: string;\n level?: 'info' | 'debug' | 'warn' | 'error' | 'trace';\n attrs?: Record<string, any>;\n\n source?: {\n func?: string;\n file?: string;\n line?: number;\n };\n\n // https://cs.opensource.google/go/x/exp/+/d63ba01a:slog/record.go\n}\n\ntype LogFunc =\n | ((message: string) => void)\n | ((message: string, attrs: Record<string, any>) => void)\n | ((message: string, key: string, value: any, ...attrs: any[]) => void);\n\nfunction createLogFunc(opts: {\n onRecord: (rec: LogRecord) => void;\n attrs?: Record<string, any>;\n level?: LogLevel;\n}): LogFunc {\n return (msg: string, ...args: any[]) => {\n const rec = {\n message: String(msg),\n level: opts.level,\n attrs: Object.assign({}, opts.attrs),\n };\n\n if (args[0] && typeof args[0] === 'object') {\n rec.attrs = Object.assign(rec.attrs, args[0]);\n } else {\n for (let i = 0; i < args.length; i += 2) {\n rec.attrs[String(args[i])] = args[i + 1];\n }\n }\n\n opts.onRecord(rec);\n };\n}\n\nfunction stringify(rec: LogRecord, opts: { level?: boolean } = {}) {\n const sb = [];\n if (rec.time) {\n sb.push(rec.time.toJSON());\n }\n rec.level && opts.level !== false && sb.push(rec.level.toUpperCase().padStart(5, ' '));\n sb.push(rec.message);\n\n if (rec.attrs) {\n for (let [key, value] of Object.entries(rec.attrs)) {\n sb.push(`${key}=${JSON.stringify(value)}`);\n }\n }\n return sb.join(' ');\n}\n\nexport function createLogger(\n opts: { writer?: (record: LogRecord) => void; level?: LogLevel; time?: boolean } = {},\n): Logger {\n opts.time ??= typeof window === 'undefined';\n const onRecord = (record: LogRecord) => {\n // can change options after create\n const { writer = createLogger.writer, level, time } = opts;\n if (level) {\n if (Level[level] < Level[record.level!]) {\n return;\n }\n }\n if (time) {\n record.time = new Date();\n }\n writer(record);\n };\n return {\n trace: createLogFunc({ onRecord, level: 'trace' }),\n debug: createLogFunc({ onRecord, level: 'debug' }),\n info: createLogFunc({ onRecord, level: 'info' }),\n warn: createLogFunc({ onRecord, level: 'warn' }),\n error: createLogFunc({ onRecord, level: 'error' }),\n };\n}\n\ncreateLogger.writer = (record: LogRecord) => {\n const { level } = record;\n console[level || 'info'](stringify(record));\n};\n\n// https://github.com/alexeyraspopov/picocolors/blob/main/picocolors.js\n/*\nMDN: Styling console output\nhttps://developer.mozilla.org/en-US/docs/Web/API/console#Usage\n\nChrome: Console API Reference\nhttps://developers.google.com/web/tools/chrome-devtools/console/console-write#styling_console_output_with_css\n\nWebKit: Console Object API\nhttps://webkit.org/web-inspector/console-object-api/\n\nhttps://stackoverflow.com/questions/7505623\n\nconsole.log('\\x1b[36m Hello \\x1b[34m Colored \\x1b[35m World!');\nconsole.log('\\x1B[31mHello\\x1B[34m World');\nconsole.log('\\x1b[43mHighlighted');\n\n\nNestJS Formatter\nhttps://github.com/nestjs/nest/blob/d4bda940fc10238eb18f14ebf66d66b7ef8bff41/packages/common/services/console-logger.service.ts#L201-L227\n\n */\n\nexport type Formatter = (input: string | number | null | undefined) => string;\n\nexport interface Colors {\n isColorSupported: boolean;\n reset: Formatter;\n bold: Formatter;\n dim: Formatter;\n italic: Formatter;\n underline: Formatter;\n inverse: Formatter;\n hidden: Formatter;\n strikethrough: Formatter;\n black: Formatter;\n red: Formatter;\n green: Formatter;\n yellow: Formatter;\n blue: Formatter;\n magenta: Formatter;\n cyan: Formatter;\n white: Formatter;\n gray: Formatter;\n bgBlack: Formatter;\n bgRed: Formatter;\n bgGreen: Formatter;\n bgYellow: Formatter;\n bgBlue: Formatter;\n bgMagenta: Formatter;\n bgCyan: Formatter;\n bgWhite: Formatter;\n}\n\nlet formatter =\n (open: string, close: string, replace: string = open) =>\n (input: string) => {\n let string = '' + input;\n let index = string.indexOf(close, open.length);\n return ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close;\n };\n\nlet replaceClose = (string: string, close: string, replace: string, index: number): string => {\n let start = string.substring(0, index) + replace;\n let end = string.substring(index + close.length);\n let nextIndex = end.indexOf(close);\n return ~nextIndex ? start + replaceClose(end, close, replace, nextIndex) : start + end;\n};\n\nfunction getEnv(): Record<string, string | undefined> {\n if (typeof process === 'object') {\n return process.env;\n }\n return {};\n}\n\nfunction isColorSupported() {\n if (typeof window === 'object') {\n return true;\n }\n const env = getEnv();\n if ('NO_COLOR' in env) {\n return false;\n }\n if ('FORCE_COLOR' in env || 'CI' in env) {\n return true;\n }\n return false;\n}\n\nexport function createConsoleColors(enabled = isColorSupported()) {\n return {\n isColorSupported: enabled,\n reset: enabled ? (s: string) => `\\x1b[0m${s}\\x1b[0m` : String,\n bold: enabled ? formatter('\\x1b[1m', '\\x1b[22m', '\\x1b[22m\\x1b[1m') : String,\n dim: enabled ? formatter('\\x1b[2m', '\\x1b[22m', '\\x1b[22m\\x1b[2m') : String,\n italic: enabled ? formatter('\\x1b[3m', '\\x1b[23m') : String,\n underline: enabled ? formatter('\\x1b[4m', '\\x1b[24m') : String,\n inverse: enabled ? formatter('\\x1b[7m', '\\x1b[27m') : String,\n hidden: enabled ? formatter('\\x1b[8m', '\\x1b[28m') : String,\n strikethrough: enabled ? formatter('\\x1b[9m', '\\x1b[29m') : String,\n black: enabled ? formatter('\\x1b[30m', '\\x1b[39m') : String,\n red: enabled ? formatter('\\x1b[31m', '\\x1b[39m') : String,\n green: enabled ? formatter('\\x1b[32m', '\\x1b[39m') : String,\n yellow: enabled ? formatter('\\x1b[33m', '\\x1b[39m') : String,\n blue: enabled ? formatter('\\x1b[34m', '\\x1b[39m') : String,\n magenta: enabled ? formatter('\\x1b[35m', '\\x1b[39m') : String,\n cyan: enabled ? formatter('\\x1b[36m', '\\x1b[39m') : String,\n white: enabled ? formatter('\\x1b[37m', '\\x1b[39m') : String,\n gray: enabled ? formatter('\\x1b[90m', '\\x1b[39m') : String,\n bgBlack: enabled ? formatter('\\x1b[40m', '\\x1b[49m') : String,\n bgRed: enabled ? formatter('\\x1b[41m', '\\x1b[49m') : String,\n bgGreen: enabled ? formatter('\\x1b[42m', '\\x1b[49m') : String,\n bgYellow: enabled ? formatter('\\x1b[43m', '\\x1b[49m') : String,\n bgBlue: enabled ? formatter('\\x1b[44m', '\\x1b[49m') : String,\n bgMagenta: enabled ? formatter('\\x1b[45m', '\\x1b[49m') : String,\n bgCyan: enabled ? formatter('\\x1b[46m', '\\x1b[49m') : String,\n bgWhite: enabled ? formatter('\\x1b[47m', '\\x1b[49m') : String,\n };\n}\n"],"names":["Level","createLogFunc","opts","msg","args","rec","message","String","level","attrs","Object","assign","i","length","onRecord","stringify","sb","time","push","toJSON","toUpperCase","padStart","key","value","entries","JSON","join","createLogger","window","record","writer","Date","trace","debug","info","warn","error","console","formatter","open","close","replace","input","string","index","indexOf","replaceClose","start","substring","end","nextIndex","getEnv","process","env","isColorSupported","createConsoleColors","enabled","reset","s","bold","dim","italic","underline","inverse","hidden","strikethrough","black","red","green","yellow","blue","magenta","cyan","white","gray","bgBlack","bgRed","bgGreen","bgYellow","bgBlue","bgMagenta","bgCyan","bgWhite"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../src/logging/slog.ts"],"sourcesContent":["import type { Logger, LogLevel } from './Logger';\n\nenum Level {\n trace = -8,\n debug = -4,\n info = 0,\n warn = 4,\n error = 8,\n}\n\ninterface LogRecord {\n time?: Date;\n message: string;\n level?: 'info' | 'debug' | 'warn' | 'error' | 'trace';\n attrs?: Record<string, any>;\n\n source?: {\n func?: string;\n file?: string;\n line?: number;\n };\n\n // https://cs.opensource.google/go/x/exp/+/d63ba01a:slog/record.go\n}\n\ntype LogFunc =\n | ((message: string) => void)\n | ((message: string, attrs: Record<string, any>) => void)\n | ((message: string, key: string, value: any, ...attrs: any[]) => void);\n\nfunction createLogFunc(opts: {\n onRecord: (rec: LogRecord) => void;\n attrs?: Record<string, any>;\n level?: LogLevel;\n}): LogFunc {\n return (msg: string, ...args: any[]) => {\n const rec = {\n message: String(msg),\n level: opts.level,\n attrs: Object.assign({}, opts.attrs),\n };\n\n if (args[0] && typeof args[0] === 'object') {\n rec.attrs = Object.assign(rec.attrs, args[0]);\n } else {\n for (let i = 0; i < args.length; i += 2) {\n rec.attrs[String(args[i])] = args[i + 1];\n }\n }\n\n opts.onRecord(rec);\n };\n}\n\nfunction stringify(rec: LogRecord, opts: { level?: boolean } = {}) {\n const sb = [];\n if (rec.time) {\n sb.push(rec.time.toJSON());\n }\n rec.level && opts.level !== false && sb.push(rec.level.toUpperCase().padStart(5, ' '));\n sb.push(rec.message);\n\n if (rec.attrs) {\n for (let [key, value] of Object.entries(rec.attrs)) {\n sb.push(`${key}=${JSON.stringify(value)}`);\n }\n }\n return sb.join(' ');\n}\n\nexport function createLogger(\n opts: { writer?: (record: LogRecord) => void; level?: LogLevel; time?: boolean } = {},\n): Logger {\n opts.time ??= typeof window === 'undefined';\n const onRecord = (record: LogRecord) => {\n // can change options after create\n const { writer = createLogger.writer, level, time } = opts;\n if (level) {\n if (Level[level] < Level[record.level!]) {\n return;\n }\n }\n if (time) {\n record.time = new Date();\n }\n writer(record);\n };\n return {\n trace: createLogFunc({ onRecord, level: 'trace' }),\n debug: createLogFunc({ onRecord, level: 'debug' }),\n info: createLogFunc({ onRecord, level: 'info' }),\n warn: createLogFunc({ onRecord, level: 'warn' }),\n error: createLogFunc({ onRecord, level: 'error' }),\n };\n}\n\ncreateLogger.writer = (record: LogRecord) => {\n const { level } = record;\n console[level || 'info'](stringify(record));\n};\n\n// https://github.com/alexeyraspopov/picocolors/blob/main/picocolors.js\n/*\nMDN: Styling console output\nhttps://developer.mozilla.org/en-US/docs/Web/API/console#Usage\n\nChrome: Console API Reference\nhttps://developers.google.com/web/tools/chrome-devtools/console/console-write#styling_console_output_with_css\n\nWebKit: Console Object API\nhttps://webkit.org/web-inspector/console-object-api/\n\nhttps://stackoverflow.com/questions/7505623\n\nconsole.log('\\x1b[36m Hello \\x1b[34m Colored \\x1b[35m World!');\nconsole.log('\\x1B[31mHello\\x1B[34m World');\nconsole.log('\\x1b[43mHighlighted');\n\n\nNestJS Formatter\nhttps://github.com/nestjs/nest/blob/d4bda940fc10238eb18f14ebf66d66b7ef8bff41/packages/common/services/console-logger.service.ts#L201-L227\n\n */\n\nexport type Formatter = (input: string | number | null | undefined) => string;\n\nexport interface Colors {\n isColorSupported: boolean;\n reset: Formatter;\n bold: Formatter;\n dim: Formatter;\n italic: Formatter;\n underline: Formatter;\n inverse: Formatter;\n hidden: Formatter;\n strikethrough: Formatter;\n black: Formatter;\n red: Formatter;\n green: Formatter;\n yellow: Formatter;\n blue: Formatter;\n magenta: Formatter;\n cyan: Formatter;\n white: Formatter;\n gray: Formatter;\n bgBlack: Formatter;\n bgRed: Formatter;\n bgGreen: Formatter;\n bgYellow: Formatter;\n bgBlue: Formatter;\n bgMagenta: Formatter;\n bgCyan: Formatter;\n bgWhite: Formatter;\n}\n\nlet formatter =\n (open: string, close: string, replace: string = open) =>\n (input: string) => {\n let string = '' + input;\n let index = string.indexOf(close, open.length);\n return ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close;\n };\n\nlet replaceClose = (string: string, close: string, replace: string, index: number): string => {\n let start = string.substring(0, index) + replace;\n let end = string.substring(index + close.length);\n let nextIndex = end.indexOf(close);\n return ~nextIndex ? start + replaceClose(end, close, replace, nextIndex) : start + end;\n};\n\nfunction getEnv(): Record<string, string | undefined> {\n if (typeof process === 'object') {\n return process.env;\n }\n return {};\n}\n\nfunction isColorSupported() {\n if (typeof window === 'object') {\n return true;\n }\n const env = getEnv();\n if ('NO_COLOR' in env) {\n return false;\n }\n if ('FORCE_COLOR' in env || 'CI' in env) {\n return true;\n }\n return false;\n}\n\nexport function createConsoleColors(enabled = isColorSupported()) {\n return {\n isColorSupported: enabled,\n reset: enabled ? (s: string) => `\\x1b[0m${s}\\x1b[0m` : String,\n bold: enabled ? formatter('\\x1b[1m', '\\x1b[22m', '\\x1b[22m\\x1b[1m') : String,\n dim: enabled ? formatter('\\x1b[2m', '\\x1b[22m', '\\x1b[22m\\x1b[2m') : String,\n italic: enabled ? formatter('\\x1b[3m', '\\x1b[23m') : String,\n underline: enabled ? formatter('\\x1b[4m', '\\x1b[24m') : String,\n inverse: enabled ? formatter('\\x1b[7m', '\\x1b[27m') : String,\n hidden: enabled ? formatter('\\x1b[8m', '\\x1b[28m') : String,\n strikethrough: enabled ? formatter('\\x1b[9m', '\\x1b[29m') : String,\n black: enabled ? formatter('\\x1b[30m', '\\x1b[39m') : String,\n red: enabled ? formatter('\\x1b[31m', '\\x1b[39m') : String,\n green: enabled ? formatter('\\x1b[32m', '\\x1b[39m') : String,\n yellow: enabled ? formatter('\\x1b[33m', '\\x1b[39m') : String,\n blue: enabled ? formatter('\\x1b[34m', '\\x1b[39m') : String,\n magenta: enabled ? formatter('\\x1b[35m', '\\x1b[39m') : String,\n cyan: enabled ? formatter('\\x1b[36m', '\\x1b[39m') : String,\n white: enabled ? formatter('\\x1b[37m', '\\x1b[39m') : String,\n gray: enabled ? formatter('\\x1b[90m', '\\x1b[39m') : String,\n bgBlack: enabled ? formatter('\\x1b[40m', '\\x1b[49m') : String,\n bgRed: enabled ? formatter('\\x1b[41m', '\\x1b[49m') : String,\n bgGreen: enabled ? formatter('\\x1b[42m', '\\x1b[49m') : String,\n bgYellow: enabled ? formatter('\\x1b[43m', '\\x1b[49m') : String,\n bgBlue: enabled ? formatter('\\x1b[44m', '\\x1b[49m') : String,\n bgMagenta: enabled ? formatter('\\x1b[45m', '\\x1b[49m') : String,\n bgCyan: enabled ? formatter('\\x1b[46m', '\\x1b[49m') : String,\n bgWhite: enabled ? formatter('\\x1b[47m', '\\x1b[49m') : String,\n };\n}\n"],"names":["Level","createLogFunc","opts","msg","args","rec","message","String","level","attrs","Object","assign","i","length","onRecord","stringify","sb","time","push","toJSON","toUpperCase","padStart","key","value","entries","JSON","join","createLogger","window","record","writer","Date","trace","debug","info","warn","error","console","formatter","open","close","replace","input","string","index","indexOf","replaceClose","start","substring","end","nextIndex","getEnv","process","env","isColorSupported","createConsoleColors","enabled","reset","s","bold","dim","italic","underline","inverse","hidden","strikethrough","black","red","green","yellow","blue","magenta","cyan","white","gray","bgBlack","bgRed","bgGreen","bgYellow","bgBlue","bgMagenta","bgCyan","bgWhite"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -1,21 +1,22 @@
1
- // export function clamp<T>(value: T | null | undefined, o: { min: T; max: T; default?: T }): T;
1
+ import { isDefined } from '../langs/isDefined.js';
2
+ import { isNullish } from '../langs/isNullish.js';
2
3
  export function clamp(value, ...o) {
3
4
  let min, max, def;
4
- if (o.length === 1) {
5
+ if (o.length === 1 && o[0] && typeof o[0] === 'object') {
5
6
  ({ min, max, default: def = min } = o[0]);
6
7
  } else {
7
8
  [min, max, def = min] = o;
8
9
  }
9
- if (value === null || value === undefined) {
10
+ if (isNullish(value)) {
10
11
  return def;
11
12
  }
12
- if (value < min) {
13
+ if (isDefined(min) && value < min) {
13
14
  return min;
14
15
  }
15
- if (value > max) {
16
+ if (isDefined(max) && value > max) {
16
17
  return max;
17
18
  }
18
19
  return value;
19
- } // type Comparable = number | string | Date | BigInt;
20
+ }
20
21
 
21
22
  //# sourceMappingURL=clamp.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/maths/clamp.ts"],"sourcesContent":["// export function clamp<T>(value: T | null | undefined, o: { min: T; max: T; default?: T }): T;\n\nexport function clamp<T>(value: T | null | undefined, min: T, max: T, def?: T): T;\nexport function clamp<T>(value: T | null | undefined, ...o: any[]): T {\n let min: T, max: T, def: T;\n if (o.length === 1) {\n ({ min, max, default: def = min! } = o[0]);\n } else {\n [min, max, def = min!] = o;\n }\n if (value === null || value === undefined) {\n return def;\n }\n if (value < min) {\n return min;\n }\n if (value > max) {\n return max;\n }\n return value;\n}\n\n// type Comparable = number | string | Date | BigInt;\n"],"names":["clamp","value","o","min","max","def","length","default","undefined"],"rangeMappings":";;;;;;;;;;;;;;;;;;","mappings":"AAAA,gGAAgG;AAGhG,OAAO,SAASA,MAASC,KAA2B,EAAE,GAAGC,CAAQ;IAC/D,IAAIC,KAAQC,KAAQC;IACpB,IAAIH,EAAEI,MAAM,KAAK,GAAG;QACjB,CAAA,EAAEH,GAAG,EAAEC,GAAG,EAAEG,SAASF,MAAMF,GAAI,EAAE,GAAGD,CAAC,CAAC,EAAE,AAAD;IAC1C,OAAO;QACL,CAACC,KAAKC,KAAKC,MAAMF,GAAI,CAAC,GAAGD;IAC3B;IACA,IAAID,UAAU,QAAQA,UAAUO,WAAW;QACzC,OAAOH;IACT;IACA,IAAIJ,QAAQE,KAAK;QACf,OAAOA;IACT;IACA,IAAIF,QAAQG,KAAK;QACf,OAAOA;IACT;IACA,OAAOH;AACT,EAEA,qDAAqD"}
1
+ {"version":3,"sources":["../../src/maths/clamp.ts"],"sourcesContent":["import { isDefined } from '../langs/isDefined';\nimport { isNullish } from '../langs/isNullish';\n\n// export function clamp<T>(value: T | null | undefined, opts: { min?: T; max?: T; default?: T }): T;\nexport function clamp<T>(value: T | null | undefined, min: T, max: T, def?: T): T;\nexport function clamp<T>(value: T | null | undefined, ...o: any[]): T {\n let min: T, max: T, def: T;\n if (o.length === 1 && o[0] && typeof o[0] === 'object') {\n ({ min, max, default: def = min! } = o[0]);\n } else {\n [min, max, def = min!] = o;\n }\n if (isNullish(value)) {\n return def;\n }\n if (isDefined(min) && value < min) {\n return min;\n }\n if (isDefined(max) && value > max) {\n return max;\n }\n return value;\n}\n"],"names":["isDefined","isNullish","clamp","value","o","min","max","def","length","default"],"rangeMappings":";;;;;;;;;;;;;;;;;;;","mappings":"AAAA,SAASA,SAAS,QAAQ,qBAAqB;AAC/C,SAASC,SAAS,QAAQ,qBAAqB;AAI/C,OAAO,SAASC,MAASC,KAA2B,EAAE,GAAGC,CAAQ;IAC/D,IAAIC,KAAQC,KAAQC;IACpB,IAAIH,EAAEI,MAAM,KAAK,KAAKJ,CAAC,CAAC,EAAE,IAAI,OAAOA,CAAC,CAAC,EAAE,KAAK,UAAU;QACrD,CAAA,EAAEC,GAAG,EAAEC,GAAG,EAAEG,SAASF,MAAMF,GAAI,EAAE,GAAGD,CAAC,CAAC,EAAE,AAAD;IAC1C,OAAO;QACL,CAACC,KAAKC,KAAKC,MAAMF,GAAI,CAAC,GAAGD;IAC3B;IACA,IAAIH,UAAUE,QAAQ;QACpB,OAAOI;IACT;IACA,IAAIP,UAAUK,QAAQF,QAAQE,KAAK;QACjC,OAAOA;IACT;IACA,IAAIL,UAAUM,QAAQH,QAAQG,KAAK;QACjC,OAAOA;IACT;IACA,OAAOH;AACT"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/maths/random.ts"],"sourcesContent":["/// javascript pseudo random\nexport function createRandom(o: { seed?: string | number } = {}) {\n let seed = typeof o.seed === 'string' ? 0 : o.seed ?? 0;\n if (typeof o.seed === 'string') {\n let sum = 0;\n for (let i = 0; i < o.seed.length; i++) {\n sum += o.seed.charCodeAt(i);\n }\n seed = sum;\n }\n\n return () => {\n const x = Math.sin(seed++) * 10000;\n return x - Math.floor(x);\n };\n}\n"],"names":["createRandom","o","seed","sum","i","length","charCodeAt","x","Math","sin","floor"],"rangeMappings":";;;;;;;;;;;;;;","mappings":"AAAA,4BAA4B;AAC5B,OAAO,SAASA,aAAaC,IAAgC,CAAC,CAAC;IAC7D,IAAIC,OAAO,OAAOD,EAAEC,IAAI,KAAK,WAAW,IAAID,EAAEC,IAAI,IAAI;IACtD,IAAI,OAAOD,EAAEC,IAAI,KAAK,UAAU;QAC9B,IAAIC,MAAM;QACV,IAAK,IAAIC,IAAI,GAAGA,IAAIH,EAAEC,IAAI,CAACG,MAAM,EAAED,IAAK;YACtCD,OAAOF,EAAEC,IAAI,CAACI,UAAU,CAACF;QAC3B;QACAF,OAAOC;IACT;IAEA,OAAO;QACL,MAAMI,IAAIC,KAAKC,GAAG,CAACP,UAAU;QAC7B,OAAOK,IAAIC,KAAKE,KAAK,CAACH;IACxB;AACF"}
1
+ {"version":3,"sources":["../../src/maths/random.ts"],"sourcesContent":["/// javascript pseudo random\nexport function createRandom(o: { seed?: string | number } = {}) {\n let seed = typeof o.seed === 'string' ? 0 : (o.seed ?? 0);\n if (typeof o.seed === 'string') {\n let sum = 0;\n for (let i = 0; i < o.seed.length; i++) {\n sum += o.seed.charCodeAt(i);\n }\n seed = sum;\n }\n\n return () => {\n const x = Math.sin(seed++) * 10000;\n return x - Math.floor(x);\n };\n}\n"],"names":["createRandom","o","seed","sum","i","length","charCodeAt","x","Math","sin","floor"],"rangeMappings":";;;;;;;;;;;;;;","mappings":"AAAA,4BAA4B;AAC5B,OAAO,SAASA,aAAaC,IAAgC,CAAC,CAAC;IAC7D,IAAIC,OAAO,OAAOD,EAAEC,IAAI,KAAK,WAAW,IAAKD,EAAEC,IAAI,IAAI;IACvD,IAAI,OAAOD,EAAEC,IAAI,KAAK,UAAU;QAC9B,IAAIC,MAAM;QACV,IAAK,IAAIC,IAAI,GAAGA,IAAIH,EAAEC,IAAI,CAACG,MAAM,EAAED,IAAK;YACtCD,OAAOF,EAAEC,IAAI,CAACI,UAAU,CAACF;QAC3B;QACAF,OAAOC;IACT;IAEA,OAAO;QACL,MAAMI,IAAIC,KAAKC,GAAG,CAACP,UAAU;QAC7B,OAAOK,IAAIC,KAAKE,KAAK,CAACH;IACxB;AACF"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Mitt: Tiny (~200b) functional event emitter / pubsub.
3
+ * @name createEmitter
4
+ * @returns {Emitter}
5
+ */ export default function createEmitter(all) {
6
+ all = all || new Map();
7
+ let evt;
8
+ return evt = {
9
+ /**
10
+ * A Map of event names to registered handler functions.
11
+ */ all,
12
+ on (type, handler) {
13
+ const handlers = all.get(type);
14
+ if (handlers) {
15
+ handlers.push(handler);
16
+ } else {
17
+ all.set(type, [
18
+ handler
19
+ ]);
20
+ }
21
+ },
22
+ once (type, handler) {
23
+ let fn = handler;
24
+ handler = (...args)=>{
25
+ evt.off(type, fn);
26
+ fn(...args);
27
+ };
28
+ const handlers = all.get(type);
29
+ if (handlers) {
30
+ handlers.push(handler);
31
+ } else {
32
+ all.set(type, [
33
+ handler
34
+ ]);
35
+ }
36
+ },
37
+ off (type, handler) {
38
+ const handlers = all.get(type);
39
+ if (handlers) {
40
+ if (handler) {
41
+ handlers.splice(handlers.indexOf(handler) >>> 0, 1);
42
+ } else {
43
+ all.set(type, []);
44
+ }
45
+ }
46
+ },
47
+ /**
48
+ * Invoke all handlers for the given type.
49
+ * If present, `'*'` handlers are invoked after type-matched handlers.
50
+ *
51
+ * Note: Manually firing '*' handlers is not supported.
52
+ *
53
+ * @param {string|symbol} type The event type to invoke
54
+ * @param {Any} [evt] Any value (object is recommended and powerful), passed to each handler
55
+ * @memberOf createEmitter
56
+ */ emit (type, evt) {
57
+ let handlers = all.get(type);
58
+ let ctx = {
59
+ type,
60
+ event: evt
61
+ };
62
+ if (handlers) {
63
+ handlers.slice().map((handler)=>{
64
+ handler(ctx);
65
+ });
66
+ }
67
+ handlers = all.get('*');
68
+ if (handlers) {
69
+ handlers.slice().map((handler)=>{
70
+ handler(ctx);
71
+ });
72
+ }
73
+ }
74
+ };
75
+ }
76
+
77
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/mitt/index.ts"],"sourcesContent":["export type EventType = string | symbol;\n\ntype EventPayload<T = EventType, E = unknown> = { type: T; event: E };\n\nexport type Handler<T = EventType, E = unknown> = (evt: { type: T; event: E }) => void;\n\n// An array of all currently registered event handlers for a type\nexport type EventHandlerList<T = unknown> = Array<Handler<EventType, T>>;\n\n// A map of event types and their corresponding event handlers.\nexport type EventHandlerMap<Events extends Record<EventType, unknown>> = Map<\n keyof Events | '*',\n EventHandlerList<Events[keyof Events]>\n>;\n\nexport interface Emitter<Events extends Record<EventType, unknown>> {\n all: EventHandlerMap<Events>;\n\n on<Key extends keyof Events>(type: Key, handler: Handler<Key, Events[Key]>): void;\n\n on(type: '*', handler: Handler<Events>): void;\n\n once<Key extends keyof Events>(type: Key, handler: Handler<Key, Events[Key]>): void;\n\n once(type: '*', handler: Handler<Events>): void;\n\n off<Key extends keyof Events>(type: Key, handler?: Handler<Key, Events[Key]>): void;\n\n off(type: '*', handler: Handler<Events>): void;\n\n emit<Key extends keyof Events>(type: Key, event: Events[Key]): void;\n\n emit<Key extends keyof Events>(type: undefined extends Events[Key] ? Key : never): void;\n}\n\n/**\n * Mitt: Tiny (~200b) functional event emitter / pubsub.\n * @name createEmitter\n * @returns {Emitter}\n */\nexport default function createEmitter<Events extends Record<EventType, unknown>>(\n all?: EventHandlerMap<Events>,\n): Emitter<Events> {\n type GenericEventHandler = Handler<EventType, Events[keyof Events]>;\n all = all || new Map();\n let evt: Emitter<Events>;\n return (evt = {\n /**\n * A Map of event names to registered handler functions.\n */\n all,\n\n on(type: EventType, handler: GenericEventHandler) {\n const handlers: Array<GenericEventHandler> | undefined = all!.get(type);\n if (handlers) {\n handlers.push(handler);\n } else {\n all!.set(type, [handler]);\n }\n },\n\n once(type: EventType, handler: GenericEventHandler) {\n let fn = handler;\n handler = (...args) => {\n evt.off(type, fn);\n fn(...args);\n };\n const handlers: Array<GenericEventHandler> | undefined = all!.get(type);\n if (handlers) {\n handlers.push(handler);\n } else {\n all!.set(type, [handler]);\n }\n },\n\n off(type: EventType, handler?: GenericEventHandler) {\n const handlers: Array<GenericEventHandler> | undefined = all!.get(type);\n if (handlers) {\n if (handler) {\n handlers.splice(handlers.indexOf(handler) >>> 0, 1);\n } else {\n all!.set(type, []);\n }\n }\n },\n\n /**\n * Invoke all handlers for the given type.\n * If present, `'*'` handlers are invoked after type-matched handlers.\n *\n * Note: Manually firing '*' handlers is not supported.\n *\n * @param {string|symbol} type The event type to invoke\n * @param {Any} [evt] Any value (object is recommended and powerful), passed to each handler\n * @memberOf createEmitter\n */\n emit(type: EventType, evt?: any) {\n let handlers = all!.get(type);\n let ctx: EventPayload = { type, event: evt };\n if (handlers) {\n (handlers as EventHandlerList).slice().map((handler) => {\n handler(ctx);\n });\n }\n\n handlers = all!.get('*');\n if (handlers) {\n (handlers as EventHandlerList).slice().map((handler) => {\n handler(ctx);\n });\n }\n },\n } as Emitter<Events>);\n}\n"],"names":["createEmitter","all","Map","evt","on","type","handler","handlers","get","push","set","once","fn","args","off","splice","indexOf","emit","ctx","event","slice","map"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAmCA;;;;CAIC,GACD,eAAe,SAASA,cACtBC,GAA6B;IAG7BA,MAAMA,OAAO,IAAIC;IACjB,IAAIC;IACJ,OAAQA,MAAM;QACZ;;KAEC,GACDF;QAEAG,IAAGC,IAAe,EAAEC,OAA4B;YAC9C,MAAMC,WAAmDN,IAAKO,GAAG,CAACH;YAClE,IAAIE,UAAU;gBACZA,SAASE,IAAI,CAACH;YAChB,OAAO;gBACLL,IAAKS,GAAG,CAACL,MAAM;oBAACC;iBAAQ;YAC1B;QACF;QAEAK,MAAKN,IAAe,EAAEC,OAA4B;YAChD,IAAIM,KAAKN;YACTA,UAAU,CAAC,GAAGO;gBACZV,IAAIW,GAAG,CAACT,MAAMO;gBACdA,MAAMC;YACR;YACA,MAAMN,WAAmDN,IAAKO,GAAG,CAACH;YAClE,IAAIE,UAAU;gBACZA,SAASE,IAAI,CAACH;YAChB,OAAO;gBACLL,IAAKS,GAAG,CAACL,MAAM;oBAACC;iBAAQ;YAC1B;QACF;QAEAQ,KAAIT,IAAe,EAAEC,OAA6B;YAChD,MAAMC,WAAmDN,IAAKO,GAAG,CAACH;YAClE,IAAIE,UAAU;gBACZ,IAAID,SAAS;oBACXC,SAASQ,MAAM,CAACR,SAASS,OAAO,CAACV,aAAa,GAAG;gBACnD,OAAO;oBACLL,IAAKS,GAAG,CAACL,MAAM,EAAE;gBACnB;YACF;QACF;QAEA;;;;;;;;;KASC,GACDY,MAAKZ,IAAe,EAAEF,GAAS;YAC7B,IAAII,WAAWN,IAAKO,GAAG,CAACH;YACxB,IAAIa,MAAoB;gBAAEb;gBAAMc,OAAOhB;YAAI;YAC3C,IAAII,UAAU;gBACXA,SAA8Ba,KAAK,GAAGC,GAAG,CAAC,CAACf;oBAC1CA,QAAQY;gBACV;YACF;YAEAX,WAAWN,IAAKO,GAAG,CAAC;YACpB,IAAID,UAAU;gBACXA,SAA8Ba,KAAK,GAAGC,GAAG,CAAC,CAACf;oBAC1CA,QAAQY;gBACV;YACF;QACF;IACF;AACF"}
@@ -1,5 +1,5 @@
1
1
  export function computeIfAbsent(map, key, fn) {
2
- if (map instanceof Map) {
2
+ if (map instanceof Map || map instanceof WeakMap) {
3
3
  if (!map.has(key)) {
4
4
  map.set(key, fn());
5
5
  }
@@ -1 +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"],"rangeMappings":";;;;;;;;;;;","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"}
1
+ {"version":3,"sources":["../../src/objects/computeIfAbsent.ts"],"sourcesContent":["export function computeIfAbsent<K extends WeakKey, V>(map: WeakMap<K, V>, key: K, fn: () => V): V;\nexport 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(map: any, key: any, fn: () => any): any {\n if (map instanceof Map || map instanceof WeakMap) {\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","WeakMap","has","set","get"],"rangeMappings":";;;;;;;;;;;","mappings":"AAGA,OAAO,SAASA,gBAAgBC,GAAQ,EAAEC,GAAQ,EAAEC,EAAa;IAC/D,IAAIF,eAAeG,OAAOH,eAAeI,SAAS;QAChD,IAAI,CAACJ,IAAIK,GAAG,CAACJ,MAAM;YACjBD,IAAIM,GAAG,CAACL,KAAKC;QACf;QACA,OAAOF,IAAIO,GAAG,CAACN;IACjB;IAEA,IAAI,CAACD,GAAG,CAACC,IAAI,EAAE;QACbD,GAAG,CAACC,IAAI,GAAGC;IACb;IACA,OAAOF,GAAG,CAACC,IAAI;AACjB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/schema/typebox/typebox.ts"],"sourcesContent":["import { TSchema } from '@sinclair/typebox';\nimport { Value } from '@sinclair/typebox/value';\n\n// works like zod parse\nexport const Parse = <T extends TSchema>(T: T, value: unknown) =>\n // run transform, get T\n Value.Decode(\n T,\n // remove additional\n Value.Clean(\n T,\n // add missing\n Value.Default(\n T,\n // '1' -> 1\n Value.Convert(T, value),\n ),\n ),\n );\n\nexport const SafeParse = <T extends TSchema>(T: T, value: unknown) => {\n let out = Value.Clean(T, Value.Default(T, Value.Convert(T, value)));\n if (Value.Check(T, out)) {\n // decode 也会 check\n return {\n data: Value.Decode(T, out),\n success: true,\n };\n }\n return {\n errors: Array.from(Value.Errors(T, [], value)),\n success: false,\n };\n};\n"],"names":["Value","Parse","T","value","Decode","Clean","Default","Convert","SafeParse","out","Check","data","success","errors","Array","from","Errors"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;","mappings":"AACA,SAASA,KAAK,QAAQ,0BAA0B;AAEhD,uBAAuB;AACvB,OAAO,MAAMC,QAAQ,CAAoBC,GAAMC,QAC7C,uBAAuB;IACvBH,MAAMI,MAAM,CACVF,GACA,oBAAoB;IACpBF,MAAMK,KAAK,CACTH,GACA,cAAc;IACdF,MAAMM,OAAO,CACXJ,GACA,WAAW;IACXF,MAAMO,OAAO,CAACL,GAAGC,UAGrB;AAEJ,OAAO,MAAMK,YAAY,CAAoBN,GAAMC;IACjD,IAAIM,MAAMT,MAAMK,KAAK,CAACH,GAAGF,MAAMM,OAAO,CAACJ,GAAGF,MAAMO,OAAO,CAACL,GAAGC;IAC3D,IAAIH,MAAMU,KAAK,CAACR,GAAGO,MAAM;QACvB,kBAAkB;QAClB,OAAO;YACLE,MAAMX,MAAMI,MAAM,CAACF,GAAGO;YACtBG,SAAS;QACX;IACF;IACA,OAAO;QACLC,QAAQC,MAAMC,IAAI,CAACf,MAAMgB,MAAM,CAACd,GAAG,EAAE,EAAEC;QACvCS,SAAS;IACX;AACF,EAAE"}
1
+ {"version":3,"sources":["../../../src/schema/typebox/typebox.ts"],"sourcesContent":["import type { TSchema } from '@sinclair/typebox';\nimport { Value } from '@sinclair/typebox/value';\n\n// works like zod parse\nexport const Parse = <T extends TSchema>(T: T, value: unknown) =>\n // run transform, get T\n Value.Decode(\n T,\n // remove additional\n Value.Clean(\n T,\n // add missing\n Value.Default(\n T,\n // '1' -> 1\n Value.Convert(T, value),\n ),\n ),\n );\n\nexport const SafeParse = <T extends TSchema>(T: T, value: unknown) => {\n let out = Value.Clean(T, Value.Default(T, Value.Convert(T, value)));\n if (Value.Check(T, out)) {\n // decode 也会 check\n return {\n data: Value.Decode(T, out),\n success: true,\n };\n }\n return {\n errors: Array.from(Value.Errors(T, [], value)),\n success: false,\n };\n};\n"],"names":["Value","Parse","T","value","Decode","Clean","Default","Convert","SafeParse","out","Check","data","success","errors","Array","from","Errors"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;","mappings":"AACA,SAASA,KAAK,QAAQ,0BAA0B;AAEhD,uBAAuB;AACvB,OAAO,MAAMC,QAAQ,CAAoBC,GAAMC,QAC7C,uBAAuB;IACvBH,MAAMI,MAAM,CACVF,GACA,oBAAoB;IACpBF,MAAMK,KAAK,CACTH,GACA,cAAc;IACdF,MAAMM,OAAO,CACXJ,GACA,WAAW;IACXF,MAAMO,OAAO,CAACL,GAAGC,UAGrB;AAEJ,OAAO,MAAMK,YAAY,CAAoBN,GAAMC;IACjD,IAAIM,MAAMT,MAAMK,KAAK,CAACH,GAAGF,MAAMM,OAAO,CAACJ,GAAGF,MAAMO,OAAO,CAACL,GAAGC;IAC3D,IAAIH,MAAMU,KAAK,CAACR,GAAGO,MAAM;QACvB,kBAAkB;QAClB,OAAO;YACLE,MAAMX,MAAMI,MAAM,CAACF,GAAGO;YACtBG,SAAS;QACX;IACF;IACA,OAAO;QACLC,QAAQC,MAAMC,IAAI,CAACf,MAAMgB,MAAM,CAACd,GAAG,EAAE,EAAEC;QACvCS,SAAS;IACX;AACF,EAAE"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/fetch/createFetchWithProxyByUndici.ts"],"sourcesContent":["import { MaybePromise } from '../../asyncs/MaybePromise';\nimport { createFetchWith, FetchLike } from '../../fetch';\nimport { getGlobalThis } from '../../runtime/getGlobalThis';\n\nexport function createFetchWithProxyByUndici({\n proxy,\n token: _token,\n fetch,\n undici,\n}: {\n proxy?: string;\n token?: string;\n fetch?: FetchLike;\n undici?: MaybePromise<{ fetch: any; ProxyAgent: any }>;\n} = {}): FetchLike {\n if (!proxy) {\n return fetch || globalThis.fetch;\n }\n\n if ((getGlobalThis() as any).Bun) {\n return createFetchWith({\n fetch,\n onRequest: ({ url, req, next }) => {\n return next(url, {\n ...req,\n // https://github.com/oven-sh/bun/issues/1829\n proxy,\n } as RequestInit);\n },\n });\n }\n\n let agent: any;\n // https://github.com/nodejs/undici/blob/main/docs/best-practices/proxy.md\n return async (...args) => {\n const init = (args[1] ||= {}) as RequestInit & {\n duplex?: string;\n dispatcher?: any;\n };\n {\n const body = init.body;\n if (typeof body === 'object' && body && (body instanceof ReadableStream || Symbol.asyncIterator in body)) {\n // request.duplex must be set if request.body is ReadableStream or Async Iterables\n init.duplex ||= 'half';\n }\n }\n if (!agent) {\n let uri = proxy;\n let token = _token;\n {\n let u: URL | undefined;\n try {\n u = new URL(proxy);\n } catch (e) {}\n if (!token && u && (u.username || u.password)) {\n token = `Basic ${btoa(`${u.username || ''}:${u.password}`)}`;\n u.username = '';\n u.password = '';\n uri = u.toString();\n }\n }\n // if in next use 'next/dist/compiled/undici'\n undici ||= import('undici');\n const mod = await undici;\n const ProxyAgent = mod.ProxyAgent as new (_: any) => any;\n fetch ||= mod.fetch as FetchLike;\n // https://github.com/nodejs/undici/blob/main/docs/api/ProxyAgent.md\n agent = new ProxyAgent({\n uri,\n token,\n });\n // https://github.com/nodejs/node/issues/43187#issuecomment-1134634174\n // (global as any)[Symbol.for('undici.globalDispatcher.1')] = agent;\n // fixme should unwrap error https://github.com/nodejs/undici/issues/1248\n }\n init.dispatcher = agent;\n return await fetch!(...args);\n };\n}\n"],"names":["createFetchWith","getGlobalThis","createFetchWithProxyByUndici","proxy","token","_token","fetch","undici","globalThis","Bun","onRequest","url","req","next","agent","args","init","body","ReadableStream","Symbol","asyncIterator","duplex","uri","u","URL","e","username","password","btoa","toString","mod","ProxyAgent","dispatcher"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AACA,SAASA,eAAe,QAAmB,cAAc;AACzD,SAASC,aAAa,QAAQ,8BAA8B;AAE5D,OAAO,SAASC,6BAA6B,EAC3CC,KAAK,EACLC,OAAOC,MAAM,EACbC,KAAK,EACLC,MAAM,EAMP,GAAG,CAAC,CAAC;IACJ,IAAI,CAACJ,OAAO;QACV,OAAOG,SAASE,WAAWF,KAAK;IAClC;IAEA,IAAI,AAACL,gBAAwBQ,GAAG,EAAE;QAChC,OAAOT,gBAAgB;YACrBM;YACAI,WAAW,CAAC,EAAEC,GAAG,EAAEC,GAAG,EAAEC,IAAI,EAAE;gBAC5B,OAAOA,KAAKF,KAAK;oBACf,GAAGC,GAAG;oBACN,6CAA6C;oBAC7CT;gBACF;YACF;QACF;IACF;IAEA,IAAIW;IACJ,0EAA0E;IAC1E,OAAO,OAAO,GAAGC;QACf,MAAMC,OAAQD,IAAI,CAAC,EAAE,KAAK,CAAC;QAI3B;YACE,MAAME,OAAOD,KAAKC,IAAI;YACtB,IAAI,OAAOA,SAAS,YAAYA,QAASA,CAAAA,gBAAgBC,kBAAkBC,OAAOC,aAAa,IAAIH,IAAG,GAAI;gBACxG,kFAAkF;gBAClFD,KAAKK,MAAM,KAAK;YAClB;QACF;QACA,IAAI,CAACP,OAAO;YACV,IAAIQ,MAAMnB;YACV,IAAIC,QAAQC;YACZ;gBACE,IAAIkB;gBACJ,IAAI;oBACFA,IAAI,IAAIC,IAAIrB;gBACd,EAAE,OAAOsB,GAAG,CAAC;gBACb,IAAI,CAACrB,SAASmB,KAAMA,CAAAA,EAAEG,QAAQ,IAAIH,EAAEI,QAAQ,AAAD,GAAI;oBAC7CvB,QAAQ,CAAC,MAAM,EAAEwB,KAAK,CAAC,EAAEL,EAAEG,QAAQ,IAAI,GAAG,CAAC,EAAEH,EAAEI,QAAQ,CAAC,CAAC,EAAE,CAAC;oBAC5DJ,EAAEG,QAAQ,GAAG;oBACbH,EAAEI,QAAQ,GAAG;oBACbL,MAAMC,EAAEM,QAAQ;gBAClB;YACF;YACA,6CAA6C;YAC7CtB,WAAW,MAAM,CAAC;YAClB,MAAMuB,MAAM,MAAMvB;YAClB,MAAMwB,aAAaD,IAAIC,UAAU;YACjCzB,UAAUwB,IAAIxB,KAAK;YACnB,oEAAoE;YACpEQ,QAAQ,IAAIiB,WAAW;gBACrBT;gBACAlB;YACF;QACA,sEAAsE;QACtE,oEAAoE;QACpE,yEAAyE;QAC3E;QACAY,KAAKgB,UAAU,GAAGlB;QAClB,OAAO,MAAMR,SAAUS;IACzB;AACF"}
1
+ {"version":3,"sources":["../../../src/server/fetch/createFetchWithProxyByUndici.ts"],"sourcesContent":["import type { MaybePromise } from '../../asyncs/MaybePromise';\nimport { createFetchWith, type FetchLike } from '../../fetch';\nimport { getGlobalThis } from '../../runtime/getGlobalThis';\n\nexport function createFetchWithProxyByUndici({\n proxy,\n token: _token,\n fetch,\n undici,\n}: {\n proxy?: string;\n token?: string;\n fetch?: FetchLike;\n undici?: MaybePromise<{ fetch: any; ProxyAgent: any }>;\n} = {}): FetchLike {\n if (!proxy) {\n return fetch || globalThis.fetch;\n }\n\n if ((getGlobalThis() as any).Bun) {\n return createFetchWith({\n fetch,\n onRequest: ({ url, req, next }) => {\n return next(url, {\n ...req,\n // https://github.com/oven-sh/bun/issues/1829\n proxy,\n } as RequestInit);\n },\n });\n }\n\n let agent: any;\n // https://github.com/nodejs/undici/blob/main/docs/best-practices/proxy.md\n return async (...args) => {\n const init = (args[1] ||= {}) as RequestInit & {\n duplex?: string;\n dispatcher?: any;\n };\n {\n const body = init.body;\n if (typeof body === 'object' && body && (body instanceof ReadableStream || Symbol.asyncIterator in body)) {\n // request.duplex must be set if request.body is ReadableStream or Async Iterables\n init.duplex ||= 'half';\n }\n }\n if (!agent) {\n let uri = proxy;\n let token = _token;\n {\n let u: URL | undefined;\n try {\n u = new URL(proxy);\n } catch (e) {}\n if (!token && u && (u.username || u.password)) {\n token = `Basic ${btoa(`${u.username || ''}:${u.password}`)}`;\n u.username = '';\n u.password = '';\n uri = u.toString();\n }\n }\n // if in next use 'next/dist/compiled/undici'\n undici ||= import('undici');\n const mod = await undici;\n const ProxyAgent = mod.ProxyAgent as new (_: any) => any;\n fetch ||= mod.fetch as FetchLike;\n // https://github.com/nodejs/undici/blob/main/docs/api/ProxyAgent.md\n agent = new ProxyAgent({\n uri,\n token,\n });\n // https://github.com/nodejs/node/issues/43187#issuecomment-1134634174\n // (global as any)[Symbol.for('undici.globalDispatcher.1')] = agent;\n // fixme should unwrap error https://github.com/nodejs/undici/issues/1248\n }\n init.dispatcher = agent;\n return await fetch!(...args);\n };\n}\n"],"names":["createFetchWith","getGlobalThis","createFetchWithProxyByUndici","proxy","token","_token","fetch","undici","globalThis","Bun","onRequest","url","req","next","agent","args","init","body","ReadableStream","Symbol","asyncIterator","duplex","uri","u","URL","e","username","password","btoa","toString","mod","ProxyAgent","dispatcher"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AACA,SAASA,eAAe,QAAwB,cAAc;AAC9D,SAASC,aAAa,QAAQ,8BAA8B;AAE5D,OAAO,SAASC,6BAA6B,EAC3CC,KAAK,EACLC,OAAOC,MAAM,EACbC,KAAK,EACLC,MAAM,EAMP,GAAG,CAAC,CAAC;IACJ,IAAI,CAACJ,OAAO;QACV,OAAOG,SAASE,WAAWF,KAAK;IAClC;IAEA,IAAI,AAACL,gBAAwBQ,GAAG,EAAE;QAChC,OAAOT,gBAAgB;YACrBM;YACAI,WAAW,CAAC,EAAEC,GAAG,EAAEC,GAAG,EAAEC,IAAI,EAAE;gBAC5B,OAAOA,KAAKF,KAAK;oBACf,GAAGC,GAAG;oBACN,6CAA6C;oBAC7CT;gBACF;YACF;QACF;IACF;IAEA,IAAIW;IACJ,0EAA0E;IAC1E,OAAO,OAAO,GAAGC;QACf,MAAMC,OAAQD,IAAI,CAAC,EAAE,KAAK,CAAC;QAI3B;YACE,MAAME,OAAOD,KAAKC,IAAI;YACtB,IAAI,OAAOA,SAAS,YAAYA,QAASA,CAAAA,gBAAgBC,kBAAkBC,OAAOC,aAAa,IAAIH,IAAG,GAAI;gBACxG,kFAAkF;gBAClFD,KAAKK,MAAM,KAAK;YAClB;QACF;QACA,IAAI,CAACP,OAAO;YACV,IAAIQ,MAAMnB;YACV,IAAIC,QAAQC;YACZ;gBACE,IAAIkB;gBACJ,IAAI;oBACFA,IAAI,IAAIC,IAAIrB;gBACd,EAAE,OAAOsB,GAAG,CAAC;gBACb,IAAI,CAACrB,SAASmB,KAAMA,CAAAA,EAAEG,QAAQ,IAAIH,EAAEI,QAAQ,AAAD,GAAI;oBAC7CvB,QAAQ,CAAC,MAAM,EAAEwB,KAAK,CAAC,EAAEL,EAAEG,QAAQ,IAAI,GAAG,CAAC,EAAEH,EAAEI,QAAQ,CAAC,CAAC,EAAE,CAAC;oBAC5DJ,EAAEG,QAAQ,GAAG;oBACbH,EAAEI,QAAQ,GAAG;oBACbL,MAAMC,EAAEM,QAAQ;gBAClB;YACF;YACA,6CAA6C;YAC7CtB,WAAW,MAAM,CAAC;YAClB,MAAMuB,MAAM,MAAMvB;YAClB,MAAMwB,aAAaD,IAAIC,UAAU;YACjCzB,UAAUwB,IAAIxB,KAAK;YACnB,oEAAoE;YACpEQ,QAAQ,IAAIiB,WAAW;gBACrBT;gBACAlB;YACF;QACA,sEAAsE;QACtE,oEAAoE;QACpE,yEAAyE;QAC3E;QACAY,KAAKgB,UAAU,GAAGlB;QAClB,OAAO,MAAMR,SAAUS;IACzB;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wener/utils",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "type": "module",
5
5
  "description": "Utils for daily use",
6
6
  "repository": {
@@ -69,23 +69,15 @@
69
69
  "template",
70
70
  "lodash"
71
71
  ],
72
- "peerDependencies": {
73
- "undici": "*"
74
- },
75
- "peerDependenciesMeta": {
76
- "undici": {
77
- "optional": true
78
- }
79
- },
80
72
  "devDependencies": {
81
- "@sinclair/typebox": "^0.32.29",
82
- "@types/lodash": "^4.17.1",
83
- "@types/ws": "^8.5.10",
73
+ "@sinclair/typebox": "^0.33.9",
74
+ "@types/lodash": "^4.17.7",
75
+ "@types/ws": "^8.5.12",
84
76
  "@wener/utils": "link:",
85
- "https-proxy-agent": "^7.0.4",
77
+ "https-proxy-agent": "^7.0.5",
86
78
  "lodash": "^4.17.21",
87
79
  "node-fetch": "^3.3.2",
88
- "undici": "^6.16.0",
80
+ "undici": "^6.19.8",
89
81
  "zod": "^3.23.8"
90
82
  },
91
83
  "publishConfig": {
@@ -0,0 +1,62 @@
1
+ /**
2
+ * A collection of utility functions for working with Promises.
3
+ */
4
+ export class Promises {
5
+ /**
6
+ * Creates a new Promise and returns it in an object, along with its resolve and reject functions.
7
+ * @returns An object with the properties `promise`, `resolve`, and `reject`.
8
+ *
9
+ * ```ts
10
+ * const { promise, resolve, reject } = Promise.withResolvers<T>();
11
+ * ```
12
+ *
13
+ * - Chrome 119, Safari 17.4
14
+ *
15
+ * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/withResolvers
16
+ */
17
+ static withResolvers<T>(): PromiseWithResolvers<T> {
18
+ if ('withResolvers' in Promise) {
19
+ return Promise['withResolvers']() as any;
20
+ }
21
+ let resolve: (value: T | PromiseLike<T>) => void;
22
+ let reject: (reason?: any) => void;
23
+ // @ts-ignore
24
+ const promise = new Promise<T>((res, rej) => {
25
+ resolve = res;
26
+ reject = rej;
27
+ });
28
+ return { promise, resolve: resolve!, reject: reject! };
29
+ }
30
+
31
+ /**
32
+ * Creates a new Promise and returns it in an object, along with its resolve and reject functions.
33
+ * @param ms The number of milliseconds to wait before rejecting the promise.
34
+ */
35
+ static sleep(ms: number): Promise<void> {
36
+ return new Promise((resolve) => setTimeout(resolve, ms));
37
+ }
38
+
39
+ /**
40
+ * Returns `true` if the given value is a Promise.
41
+ * @param v The value to check.
42
+ */
43
+ static isPromise<T>(v: any): v is PromiseLike<T> {
44
+ return v && (v instanceof Promise || typeof v.then === 'function');
45
+ }
46
+
47
+ /**
48
+ * Returns a Promise that resolves when the given signal is aborted.
49
+ */
50
+ static aborted(signal: AbortSignal): Promise<void> {
51
+ // https://nodejs.org/api/util.html#utilabortedsignal-resource
52
+ return new Promise((_, reject) => {
53
+ signal.addEventListener('abort', () => reject(new DOMException('Aborted', 'AbortError')));
54
+ });
55
+ }
56
+ }
57
+
58
+ interface PromiseWithResolvers<T> {
59
+ promise: Promise<T>;
60
+ resolve: (value: T | PromiseLike<T>) => void;
61
+ reject: (reason?: any) => void;
62
+ }
@@ -1,18 +1,56 @@
1
- import { expect, test } from 'vitest';
1
+ import { describe, expect, test } from 'vitest';
2
2
  import { createLazyPromise } from './createLazyPromise';
3
3
 
4
- test('basic', async () => {
5
- const promise = createLazyPromise();
6
- let r = 0;
7
- void promise.then((v) => (r = v));
8
- expect(r).toBe(0);
9
- const { resolve, reject } = promise;
10
- expect(resolve).toBeTruthy();
11
- expect(reject).toBeTruthy();
12
- resolve(1);
13
- expect(r).toBe(0);
14
- await promise;
15
- expect(r).toBe(1);
4
+ describe('basic', async () => {
5
+ test('no executor', async () => {
6
+ const promise = createLazyPromise();
7
+ let r = 0;
8
+ void promise.then((v) => (r = v));
9
+ expect(r).toBe(0);
10
+ const { resolve, reject } = promise;
11
+ expect(resolve).toBeTruthy();
12
+ expect(reject).toBeTruthy();
13
+
14
+ // peek
15
+ expect(promise.value).toBeUndefined();
16
+ expect(promise.status).toBe('pending');
17
+ resolve(1);
18
+ expect(promise.value).toBe(1);
19
+ expect(promise.status).toBe('resolved');
20
+
21
+ expect(r).toBe(0);
22
+
23
+ await promise;
24
+
25
+ expect(r).toBe(1);
26
+ });
27
+
28
+ test('can resolve to lazy', async () => {
29
+ const a = createLazyPromise(() => {
30
+ return createLazyPromise(() => {
31
+ return 10;
32
+ });
33
+ });
34
+
35
+ expect(a.value).toBeUndefined();
36
+ expect(a.status).toBe('pending');
37
+ expect(await a).toBe(10);
38
+ expect(a.status).toBe('resolved');
39
+ expect(a.value).toBe(10);
40
+ });
41
+
42
+ test('can resolve to async lazy', async () => {
43
+ const a = createLazyPromise(async () => {
44
+ return createLazyPromise(async () => {
45
+ return 10;
46
+ });
47
+ });
48
+ expect(a.value).toBeUndefined();
49
+ expect(a.status).toBe('pending');
50
+ expect(await a).toBe(10);
51
+ expect(a.status).toBe('resolved');
52
+ expect(a.value).toBe(10);
53
+ });
16
54
  });
17
55
 
18
56
  test('manual resolve skip exec', async () => {
@@ -21,6 +59,7 @@ test('manual resolve skip exec', async () => {
21
59
  });
22
60
  promise.resolve(-1);
23
61
  expect(await promise).toBe(-1);
62
+ expect(String(promise)).toBe('[object LazyPromise]');
24
63
  });
25
64
 
26
65
  test('lazy exec resolve by manual', async () => {
@@ -1,9 +1,13 @@
1
1
  import { isPromise } from './isPromise';
2
2
  import type { MaybePromise } from './MaybePromise';
3
+ import { Promises } from './Promises';
3
4
 
4
5
  export type LazyPromise<T> = Promise<T> & {
5
6
  reject(reason?: any): void;
6
7
  resolve(v?: MaybePromise<T>): void;
8
+ readonly status: 'pending' | 'resolved' | 'rejected';
9
+ readonly value: T | undefined;
10
+ readonly error: any;
7
11
  };
8
12
 
9
13
  /**
@@ -11,77 +15,78 @@ export type LazyPromise<T> = Promise<T> & {
11
15
  * if you pass a function to it, it will be executed when the promise try to resolve.
12
16
  */
13
17
  export function createLazyPromise<T = any>(
14
- executor?:
15
- | ((resolve: LazyPromise<T>['resolve'], reject: LazyPromise<T>['reject']) => void)
16
- | ((resolve: LazyPromise<T>['resolve'], reject: LazyPromise<T>['reject']) => MaybePromise<T>),
18
+ executor?: (resolve: LazyPromise<T>['resolve'], reject: LazyPromise<T>['reject']) => MaybePromise<T> | void,
17
19
  ): LazyPromise<T> {
18
- if (!executor && 'withResolvers' in Promise) {
19
- const { promise, resolve, reject } = (Promise as any).withResolvers();
20
- return Object.assign(promise, {
21
- resolve,
22
- reject,
23
- }) as LazyPromise<T>;
24
- }
20
+ const { promise, resolve, reject } = Promises.withResolvers();
21
+ const lazy = Object.assign(promise, {
22
+ resolve,
23
+ reject,
24
+ }) as LazyPromise<T>;
25
25
 
26
- const holder = {
27
- resolve(_: any): void {
28
- throw new Error('pending resolve');
29
- },
30
- reject(_: any): void {
31
- throw new Error('pending reject');
32
- },
26
+ let executed = false;
27
+ let pending = true;
28
+ let status: 'pending' | 'resolved' | 'rejected' = 'pending';
29
+ let value: T | undefined;
30
+ let error: any;
31
+
32
+ const _resolve = (v: T) => {
33
+ resolve(v);
34
+ if (!pending) return;
35
+ pending = false;
36
+ // do not delay this for sync status peek
37
+ status = 'resolved';
38
+ value = v;
39
+ };
40
+ const _reject = (v: any) => {
41
+ reject(v);
42
+ if (!pending) return;
43
+ pending = false;
44
+ status = 'rejected';
45
+ error = v;
33
46
  };
34
- const future = Object.assign(
35
- new Promise<T>((resolve, reject) => {
36
- holder.reject = reject;
37
- holder.resolve = resolve;
38
- }),
47
+
48
+ const like = Object.assign(
39
49
  {
40
- resolve(v: any) {
41
- holder.resolve(v);
50
+ get status() {
51
+ return status;
42
52
  },
43
- reject(v: any) {
44
- holder.resolve(v);
53
+ get value() {
54
+ return value;
55
+ },
56
+ get error() {
57
+ return error;
45
58
  },
46
59
  },
47
- );
48
- if (executor) {
49
- const r = holder.resolve;
50
- let shouldExec = true;
51
- holder.resolve = (v: any) => {
52
- shouldExec = false;
53
- r(v);
54
- };
55
- const then = future.then.bind(future);
56
- future.then = (...args) => {
57
- if (shouldExec) {
58
- shouldExec = false;
59
- try {
60
- // kind of bad
61
- const result = executor(holder.resolve, holder.reject);
62
- // ensure resolve/reject is called
63
- if (isPromise(result)) {
64
- result.then(holder.resolve, holder.reject);
65
- } else if (result !== undefined) {
66
- holder.resolve(result);
60
+ {
61
+ cache: lazy.catch.bind(lazy),
62
+ finally: lazy.finally?.bind(lazy),
63
+ resolve: _resolve,
64
+ reject: _reject,
65
+ then: (...args: any[]) => {
66
+ if (executor && !executed) {
67
+ executed = true;
68
+ try {
69
+ const result = executor(_resolve, _reject);
70
+ // ensure resolve/reject is called
71
+ if (isPromise(result)) {
72
+ result.then(_resolve, _reject);
73
+ } else if (result !== undefined) {
74
+ _resolve(result);
75
+ }
76
+ } catch (e) {
77
+ _reject(e);
67
78
  }
68
- } catch (e) {
69
- holder.reject(e);
70
79
  }
71
- }
72
- return then(...args);
73
- };
74
- const like = holder as LazyPromise<T>;
75
- like.then = future.then;
76
- like.catch = future.catch.bind(future);
77
- if (future.finally) like.finally = future.finally;
78
-
79
- void Object.defineProperty(like, Symbol.species, {
80
- get() {
81
- return Promise;
80
+ return lazy.then(...args);
82
81
  },
82
+ },
83
+ ) as any as LazyPromise<T>;
84
+
85
+ if ('toStringTag' in Symbol) {
86
+ Object.defineProperty(like, Symbol.toStringTag, {
87
+ value: 'LazyPromise',
83
88
  });
84
- return like;
85
89
  }
86
- return future;
90
+
91
+ return like;
87
92
  }
@@ -1,5 +1,5 @@
1
1
  import { isPromise } from './isPromise';
2
- import { MaybePromise } from './MaybePromise';
2
+ import type { MaybePromise } from './MaybePromise';
3
3
  import { nextOfAsyncIterator } from './nextOfAsyncIterator';
4
4
 
5
5
  export function firstOfAsyncIterator<T>(it: MaybePromise<AsyncIterator<T> | Iterator<T> | T>): MaybePromise<T> {
@@ -1,3 +1,3 @@
1
- export function isPromise<T>(v: any): v is Promise<T> {
2
- return v && (v instanceof Promise || (v.then && v.catch));
3
- }
1
+ import { Promises } from './Promises';
2
+
3
+ export const isPromise = Promises.isPromise;
@@ -1,6 +1,6 @@
1
1
  import { isIterator } from './isIterator';
2
2
  import { isPromise } from './isPromise';
3
- import { MaybePromise } from './MaybePromise';
3
+ import type { MaybePromise } from './MaybePromise';
4
4
 
5
5
  type IteratorLike<T> = Iterable<T> | Iterator<T>;
6
6
  type AsyncIteratorLike<T> = AsyncIterable<T> | AsyncIterator<T> | AsyncIterableIterator<T> | IteratorLike<T>;
@@ -1,17 +1,17 @@
1
1
  export function timeout<T = any>(
2
- v: Promise<T> | ((args: { signal: AbortSignal }) => Promise<T>),
2
+ pending: Promise<T> | ((args: { signal: AbortSignal }) => Promise<T>),
3
3
  ms: number,
4
4
  ): Promise<T> {
5
5
  const error = new TimeoutError();
6
6
  let timeout: any;
7
7
  let ac: AbortController | undefined;
8
- if (typeof v === 'function') {
8
+ if (typeof pending === 'function') {
9
9
  ac = new AbortController();
10
- v = v({ signal: ac.signal });
10
+ pending = pending({ signal: ac.signal });
11
11
  }
12
12
 
13
13
  return Promise.race<T>([
14
- v,
14
+ pending,
15
15
  new Promise((_resolve, reject) => {
16
16
  timeout = setTimeout(() => {
17
17
  ac?.abort(error);