@wener/utils 1.1.48 → 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 (145) hide show
  1. package/lib/asyncs/Promises.js +9 -1
  2. package/lib/asyncs/Promises.js.map +1 -1
  3. package/lib/asyncs/createLazyPromise.js +52 -51
  4. package/lib/asyncs/createLazyPromise.js.map +1 -1
  5. package/lib/asyncs/firstOfAsyncIterator.js.map +1 -1
  6. package/lib/asyncs/nextOfAsyncIterator.js.map +1 -1
  7. package/lib/asyncs/timeout.js +4 -4
  8. package/lib/asyncs/timeout.js.map +1 -1
  9. package/lib/cn/types.js +3 -0
  10. package/lib/cn/types.js.map +1 -0
  11. package/lib/crypto/getNodeCrypto.js +1 -0
  12. package/lib/crypto/getNodeCrypto.js.map +1 -1
  13. package/lib/fetch/createFetchWith.js.map +1 -1
  14. package/lib/fetch/createFetchWithRetry.js.map +1 -1
  15. package/lib/index.js +2 -0
  16. package/lib/index.js.map +1 -1
  17. package/lib/io/ArrayBuffers.js.map +1 -1
  18. package/lib/io/ByteBuffer.js +233 -34
  19. package/lib/io/ByteBuffer.js.map +1 -1
  20. package/lib/langs/getGlobalStates.js +17 -0
  21. package/lib/langs/getGlobalStates.js.map +1 -0
  22. package/lib/langs/getObjectId.js +18 -0
  23. package/lib/langs/getObjectId.js.map +1 -0
  24. package/lib/langs/isNullish.js +5 -0
  25. package/lib/langs/isNullish.js.map +1 -0
  26. package/lib/logging/slog.js.map +1 -1
  27. package/lib/maths/clamp.js +7 -6
  28. package/lib/maths/clamp.js.map +1 -1
  29. package/lib/schema/typebox/typebox.js.map +1 -1
  30. package/lib/server/fetch/createFetchWithProxyByUndici.js.map +1 -1
  31. package/package.json +3 -3
  32. package/src/asyncs/Promises.ts +12 -2
  33. package/src/asyncs/createLazyPromise.test.ts +52 -13
  34. package/src/asyncs/createLazyPromise.ts +66 -61
  35. package/src/asyncs/firstOfAsyncIterator.ts +1 -1
  36. package/src/asyncs/nextOfAsyncIterator.ts +1 -1
  37. package/src/asyncs/timeout.ts +4 -4
  38. package/src/cn/types.ts +11 -0
  39. package/src/crypto/getNodeCrypto.ts +1 -0
  40. package/src/fetch/createFetchWith.ts +1 -1
  41. package/src/fetch/createFetchWithRetry.ts +1 -1
  42. package/src/index.ts +2 -0
  43. package/src/io/ArrayBuffers.ts +7 -3
  44. package/src/io/ByteBuffer.test.ts +26 -14
  45. package/src/io/ByteBuffer.ts +270 -38
  46. package/src/langs/getGlobalStates.ts +21 -0
  47. package/src/langs/getObjectId.ts +20 -0
  48. package/src/langs/isNullish.ts +3 -0
  49. package/src/langs/mixin.test.ts +4 -0
  50. package/src/logging/slog.ts +1 -1
  51. package/src/maths/clamp.test.ts +5 -1
  52. package/src/maths/clamp.ts +7 -7
  53. package/src/objects/merge/merge.test.ts +1 -1
  54. package/src/schema/typebox/typebox.ts +1 -1
  55. package/src/server/fetch/createFetchWithProxyByUndici.ts +2 -2
  56. package/tsconfig.json +4 -1
  57. package/lib/schema/typebox/gen/codegen/common/encoder.js +0 -94
  58. package/lib/schema/typebox/gen/codegen/common/encoder.js.map +0 -1
  59. package/lib/schema/typebox/gen/codegen/common/formatter.js +0 -33
  60. package/lib/schema/typebox/gen/codegen/common/formatter.js.map +0 -1
  61. package/lib/schema/typebox/gen/codegen/common/index.js +0 -29
  62. package/lib/schema/typebox/gen/codegen/common/index.js.map +0 -1
  63. package/lib/schema/typebox/gen/codegen/common/jsdoc.js +0 -117
  64. package/lib/schema/typebox/gen/codegen/common/jsdoc.js.map +0 -1
  65. package/lib/schema/typebox/gen/codegen/expression/compiler.js +0 -364
  66. package/lib/schema/typebox/gen/codegen/expression/compiler.js.map +0 -1
  67. package/lib/schema/typebox/gen/codegen/expression/errors.js +0 -259
  68. package/lib/schema/typebox/gen/codegen/expression/errors.js.map +0 -1
  69. package/lib/schema/typebox/gen/codegen/expression/evaluator.js +0 -254
  70. package/lib/schema/typebox/gen/codegen/expression/evaluator.js.map +0 -1
  71. package/lib/schema/typebox/gen/codegen/expression/expression.js +0 -381
  72. package/lib/schema/typebox/gen/codegen/expression/expression.js.map +0 -1
  73. package/lib/schema/typebox/gen/codegen/expression/index.js +0 -32
  74. package/lib/schema/typebox/gen/codegen/expression/index.js.map +0 -1
  75. package/lib/schema/typebox/gen/codegen/index.js +0 -29
  76. package/lib/schema/typebox/gen/codegen/index.js.map +0 -1
  77. package/lib/schema/typebox/gen/codegen/model/index.js +0 -40
  78. package/lib/schema/typebox/gen/codegen/model/index.js.map +0 -1
  79. package/lib/schema/typebox/gen/codegen/model/model-to-arktype.js +0 -260
  80. package/lib/schema/typebox/gen/codegen/model/model-to-arktype.js.map +0 -1
  81. package/lib/schema/typebox/gen/codegen/model/model-to-expression.js +0 -383
  82. package/lib/schema/typebox/gen/codegen/model/model-to-expression.js.map +0 -1
  83. package/lib/schema/typebox/gen/codegen/model/model-to-grpc.js +0 -238
  84. package/lib/schema/typebox/gen/codegen/model/model-to-grpc.js.map +0 -1
  85. package/lib/schema/typebox/gen/codegen/model/model-to-io-ts.js +0 -274
  86. package/lib/schema/typebox/gen/codegen/model/model-to-io-ts.js.map +0 -1
  87. package/lib/schema/typebox/gen/codegen/model/model-to-javascript.js +0 -47
  88. package/lib/schema/typebox/gen/codegen/model/model-to-javascript.js.map +0 -1
  89. package/lib/schema/typebox/gen/codegen/model/model-to-json-schema.js +0 -192
  90. package/lib/schema/typebox/gen/codegen/model/model-to-json-schema.js.map +0 -1
  91. package/lib/schema/typebox/gen/codegen/model/model-to-typebox.js +0 -33
  92. package/lib/schema/typebox/gen/codegen/model/model-to-typebox.js.map +0 -1
  93. package/lib/schema/typebox/gen/codegen/model/model-to-typescript.js +0 -188
  94. package/lib/schema/typebox/gen/codegen/model/model-to-typescript.js.map +0 -1
  95. package/lib/schema/typebox/gen/codegen/model/model-to-valibot.js +0 -239
  96. package/lib/schema/typebox/gen/codegen/model/model-to-valibot.js.map +0 -1
  97. package/lib/schema/typebox/gen/codegen/model/model-to-value.js +0 -43
  98. package/lib/schema/typebox/gen/codegen/model/model-to-value.js.map +0 -1
  99. package/lib/schema/typebox/gen/codegen/model/model-to-yrel.js +0 -227
  100. package/lib/schema/typebox/gen/codegen/model/model-to-yrel.js.map +0 -1
  101. package/lib/schema/typebox/gen/codegen/model/model-to-yup.js +0 -225
  102. package/lib/schema/typebox/gen/codegen/model/model-to-yup.js.map +0 -1
  103. package/lib/schema/typebox/gen/codegen/model/model-to-zod.js +0 -248
  104. package/lib/schema/typebox/gen/codegen/model/model-to-zod.js.map +0 -1
  105. package/lib/schema/typebox/gen/codegen/model/model.js +0 -27
  106. package/lib/schema/typebox/gen/codegen/model/model.js.map +0 -1
  107. package/lib/schema/typebox/gen/codegen/typescript/index.js +0 -28
  108. package/lib/schema/typebox/gen/codegen/typescript/index.js.map +0 -1
  109. package/lib/schema/typebox/gen/codegen/typescript/typescript-to-model.js +0 -72
  110. package/lib/schema/typebox/gen/codegen/typescript/typescript-to-model.js.map +0 -1
  111. package/lib/schema/typebox/gen/codegen/typescript/typescript-to-typebox.js +0 -620
  112. package/lib/schema/typebox/gen/codegen/typescript/typescript-to-typebox.js.map +0 -1
  113. package/lib/schema/typebox/gen/index.js +0 -3
  114. package/lib/schema/typebox/gen/index.js.map +0 -1
  115. package/src/schema/typebox/gen/codegen/common/encoder.ts +0 -99
  116. package/src/schema/typebox/gen/codegen/common/formatter.ts +0 -31
  117. package/src/schema/typebox/gen/codegen/common/index.ts +0 -29
  118. package/src/schema/typebox/gen/codegen/common/jsdoc.ts +0 -93
  119. package/src/schema/typebox/gen/codegen/expression/compiler.ts +0 -377
  120. package/src/schema/typebox/gen/codegen/expression/errors.ts +0 -302
  121. package/src/schema/typebox/gen/codegen/expression/evaluator.ts +0 -268
  122. package/src/schema/typebox/gen/codegen/expression/expression.ts +0 -538
  123. package/src/schema/typebox/gen/codegen/expression/index.ts +0 -32
  124. package/src/schema/typebox/gen/codegen/index.ts +0 -29
  125. package/src/schema/typebox/gen/codegen/model/index.ts +0 -40
  126. package/src/schema/typebox/gen/codegen/model/model-to-arktype.ts +0 -266
  127. package/src/schema/typebox/gen/codegen/model/model-to-expression.ts +0 -378
  128. package/src/schema/typebox/gen/codegen/model/model-to-grpc.ts +0 -244
  129. package/src/schema/typebox/gen/codegen/model/model-to-io-ts.ts +0 -294
  130. package/src/schema/typebox/gen/codegen/model/model-to-javascript.ts +0 -42
  131. package/src/schema/typebox/gen/codegen/model/model-to-json-schema.ts +0 -166
  132. package/src/schema/typebox/gen/codegen/model/model-to-typebox.ts +0 -32
  133. package/src/schema/typebox/gen/codegen/model/model-to-typescript.ts +0 -189
  134. package/src/schema/typebox/gen/codegen/model/model-to-valibot.ts +0 -236
  135. package/src/schema/typebox/gen/codegen/model/model-to-value.ts +0 -42
  136. package/src/schema/typebox/gen/codegen/model/model-to-yrel.ts +0 -232
  137. package/src/schema/typebox/gen/codegen/model/model-to-yup.ts +0 -226
  138. package/src/schema/typebox/gen/codegen/model/model-to-zod.ts +0 -251
  139. package/src/schema/typebox/gen/codegen/model/model.ts +0 -33
  140. package/src/schema/typebox/gen/codegen/typescript/index.ts +0 -28
  141. package/src/schema/typebox/gen/codegen/typescript/typescript-to-model.ts +0 -61
  142. package/src/schema/typebox/gen/codegen/typescript/typescript-to-typebox.ts +0 -647
  143. package/src/schema/typebox/gen/gen.test.ts +0 -12
  144. package/src/schema/typebox/gen/index.ts +0 -1
  145. /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/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.48",
3
+ "version": "1.1.49",
4
4
  "type": "module",
5
5
  "description": "Utils for daily use",
6
6
  "repository": {
@@ -70,14 +70,14 @@
70
70
  "lodash"
71
71
  ],
72
72
  "devDependencies": {
73
- "@sinclair/typebox": "^0.32.35",
73
+ "@sinclair/typebox": "^0.33.9",
74
74
  "@types/lodash": "^4.17.7",
75
75
  "@types/ws": "^8.5.12",
76
76
  "@wener/utils": "link:",
77
77
  "https-proxy-agent": "^7.0.5",
78
78
  "lodash": "^4.17.21",
79
79
  "node-fetch": "^3.3.2",
80
- "undici": "^6.19.5",
80
+ "undici": "^6.19.8",
81
81
  "zod": "^3.23.8"
82
82
  },
83
83
  "publishConfig": {
@@ -40,8 +40,18 @@ export class Promises {
40
40
  * Returns `true` if the given value is a Promise.
41
41
  * @param v The value to check.
42
42
  */
43
- static isPromise<T>(v: any): v is Promise<T> {
44
- return v && (v instanceof Promise || (v.then && v.catch));
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
+ });
45
55
  }
46
56
  }
47
57
 
@@ -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,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);
@@ -0,0 +1,11 @@
1
+ export interface StringFormat<GenerateOptions, ParsedObject> {
2
+ regex?: RegExp;
3
+ validate: (s: string) => boolean;
4
+ generate: (opts?: GenerateOptions) => ParsedObject;
5
+ parse: (s: string) => ParsedObject | undefined;
6
+ }
7
+
8
+ export interface StringChecksum {
9
+ validate: (s: string) => boolean;
10
+ generate: (s: string) => string;
11
+ }
@@ -1,3 +1,4 @@
1
+ // import type * as NodeCrypto from 'node:crypto';
1
2
  import { getGlobalThis } from '../runtime/getGlobalThis';
2
3
 
3
4
  let nodeCrypto;
@@ -1,4 +1,4 @@
1
- import { MaybePromise } from '../asyncs/MaybePromise';
1
+ import type { MaybePromise } from '../asyncs/MaybePromise';
2
2
  import { getGlobalThis } from '../runtime/getGlobalThis';
3
3
  import { type FetchLike } from './types';
4
4
 
@@ -1,5 +1,5 @@
1
1
  import { getGlobalThis } from '../runtime/getGlobalThis';
2
- import { FetchLike } from './types';
2
+ import type { FetchLike } from './types';
3
3
 
4
4
  type RequestDelayFunction = (attempt: number, error: Error | null, response: Response | null) => number;
5
5
  type RequestRetryOnFunction = (
package/src/index.ts CHANGED
@@ -47,6 +47,8 @@ export { maybeFunction, type MaybeFunction } from './langs/MaybeFunction';
47
47
  export { memoize } from './langs/memoize';
48
48
  export { mixin } from './langs/mixin';
49
49
  export type { MixinFunction, MixinInstance, MixinReturnValue } from './langs/mixin';
50
+ export { getObjectId } from './langs/getObjectId';
51
+ export { getGlobalStates, setGlobalStates } from './langs/getGlobalStates';
50
52
 
51
53
  export { AsyncCloser } from './runtime/AsyncCloser';
52
54
  export { Closer } from './runtime/Closer';
@@ -157,7 +157,7 @@ export class ArrayBuffers {
157
157
  return this.toUint8Array(ArrayBuffers.from(v, 'hex'));
158
158
  };
159
159
 
160
- static resize = (v: ArrayBufferLike, newByteLength?: number, maxByteLength?: number): ArrayBuffer => {
160
+ static resize = (v: ArrayBuffer, newByteLength?: number, maxByteLength?: number): ArrayBuffer => {
161
161
  if (newByteLength === undefined || newByteLength === null) {
162
162
  return v;
163
163
  }
@@ -167,7 +167,7 @@ export class ArrayBuffers {
167
167
  if ('resizable' in v && v.resizable) {
168
168
  if ('maxByteLength' in v && typeof v.maxByteLength === 'number' && v.maxByteLength >= newByteLength) {
169
169
  v.resize(newByteLength);
170
- return v;
170
+ return v as ArrayBuffer;
171
171
  }
172
172
  }
173
173
  }
@@ -367,7 +367,7 @@ export class ArrayBuffers {
367
367
  // return a;
368
368
  // };
369
369
 
370
- static concat = (buffers: Array<BufferSource>, result?: ArrayBuffer, offset = 0) => {
370
+ static concat = (buffers: Array<BufferSource>, result?: ArrayBuffer, offset = 0): ArrayBuffer => {
371
371
  // https://stackoverflow.com/questions/10786128/appending-arraybuffers
372
372
 
373
373
  const length = buffers.reduce((a, b) => a + b.byteLength, 0);
@@ -422,6 +422,10 @@ declare global {
422
422
  resizable?: boolean;
423
423
  }
424
424
 
425
+ interface ArrayBufferConstructor {
426
+ new (byteLength: number, opts?: { maxByteLength?: number }): ArrayBuffer;
427
+ }
428
+
425
429
  interface SharedArrayBuffer {
426
430
  resize?: (newByteLength: number) => void;
427
431
  resizable?: boolean;
@@ -1,8 +1,8 @@
1
- import { assert, test } from 'vitest';
1
+ import { assert, describe, test } from 'vitest';
2
2
  import { ByteBuffer } from './ByteBuffer';
3
3
 
4
- test('ByteBuffer', async () => {
5
- {
4
+ describe('ByteBuffer', async () => {
5
+ test('base', () => {
6
6
  let buf = new ByteBuffer();
7
7
  buf.writeString('Hello');
8
8
  buf.writeString('World');
@@ -12,24 +12,36 @@ test('ByteBuffer', async () => {
12
12
  assert.equal(buf.length, 5);
13
13
  buf.position = 0;
14
14
  assert.equal(buf.readString(5), 'Hello');
15
- }
16
- {
17
- // overflow max length
15
+ });
16
+
17
+ test('overflow max length', () => {
18
18
  let buf = new ByteBuffer();
19
19
  buf.writeBytes(new Uint8Array(1025));
20
- }
21
- {
22
- // overflow max length
20
+ assert.equal(buf.length, 1025);
21
+ });
22
+
23
+ test('overflow max length tow step', () => {
24
+ let buf = new ByteBuffer();
25
+ buf.writeBytes(new Uint8Array(1023));
26
+ buf.writeBytes(new Uint8Array(2));
27
+ assert.equal(buf.length, 1025);
28
+ console.log(`Max`, (buf.buffer as any).maxByteLength);
29
+ });
30
+
31
+ test('writeBytes fill zero', () => {
23
32
  let buf = new ByteBuffer();
24
33
  buf.writeBytes(new Uint8Array([1, 2]));
25
34
  buf.position = 0;
26
- console.log('X', buf.position, buf.length, buf.remaining());
35
+ // console.log('->', buf.position, buf.length, buf.remaining());
36
+ // console.log(toHexDump(buf.buffer));
27
37
 
28
38
  // truncate to size fill zero
29
- buf.writeBytes(new Uint8Array(1), 10);
30
- console.log('X', buf.position, buf.length, buf.remaining());
39
+ buf.writeBytes(new Uint8Array([1]), 10);
40
+ // console.log('->', buf.position, buf.length, buf.remaining());
41
+ // console.log(toHexDump(buf.buffer));
31
42
 
32
- assert.equal(buf.view.getInt8(1), 2);
43
+ assert.equal(buf.view.getInt8(0), 1);
44
+ assert.equal(buf.view.getInt8(1), 0);
33
45
  assert.equal(buf.length, 10);
34
- }
46
+ });
35
47
  });