@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.
- package/lib/asyncs/Promises.js +9 -1
- package/lib/asyncs/Promises.js.map +1 -1
- package/lib/asyncs/createLazyPromise.js +52 -51
- package/lib/asyncs/createLazyPromise.js.map +1 -1
- package/lib/asyncs/firstOfAsyncIterator.js.map +1 -1
- package/lib/asyncs/nextOfAsyncIterator.js.map +1 -1
- package/lib/asyncs/timeout.js +4 -4
- package/lib/asyncs/timeout.js.map +1 -1
- package/lib/cn/types.js +3 -0
- package/lib/cn/types.js.map +1 -0
- package/lib/crypto/getNodeCrypto.js +1 -0
- package/lib/crypto/getNodeCrypto.js.map +1 -1
- package/lib/fetch/createFetchWith.js.map +1 -1
- package/lib/fetch/createFetchWithRetry.js.map +1 -1
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -1
- package/lib/io/ArrayBuffers.js.map +1 -1
- package/lib/io/ByteBuffer.js +233 -34
- package/lib/io/ByteBuffer.js.map +1 -1
- package/lib/langs/getGlobalStates.js +17 -0
- package/lib/langs/getGlobalStates.js.map +1 -0
- package/lib/langs/getObjectId.js +18 -0
- package/lib/langs/getObjectId.js.map +1 -0
- package/lib/langs/isNullish.js +5 -0
- package/lib/langs/isNullish.js.map +1 -0
- package/lib/logging/slog.js.map +1 -1
- package/lib/maths/clamp.js +7 -6
- package/lib/maths/clamp.js.map +1 -1
- package/lib/schema/typebox/typebox.js.map +1 -1
- package/lib/server/fetch/createFetchWithProxyByUndici.js.map +1 -1
- package/package.json +3 -3
- package/src/asyncs/Promises.ts +12 -2
- package/src/asyncs/createLazyPromise.test.ts +52 -13
- package/src/asyncs/createLazyPromise.ts +66 -61
- package/src/asyncs/firstOfAsyncIterator.ts +1 -1
- package/src/asyncs/nextOfAsyncIterator.ts +1 -1
- package/src/asyncs/timeout.ts +4 -4
- package/src/cn/types.ts +11 -0
- package/src/crypto/getNodeCrypto.ts +1 -0
- package/src/fetch/createFetchWith.ts +1 -1
- package/src/fetch/createFetchWithRetry.ts +1 -1
- package/src/index.ts +2 -0
- package/src/io/ArrayBuffers.ts +7 -3
- package/src/io/ByteBuffer.test.ts +26 -14
- package/src/io/ByteBuffer.ts +270 -38
- package/src/langs/getGlobalStates.ts +21 -0
- package/src/langs/getObjectId.ts +20 -0
- package/src/langs/isNullish.ts +3 -0
- package/src/langs/mixin.test.ts +4 -0
- package/src/logging/slog.ts +1 -1
- package/src/maths/clamp.test.ts +5 -1
- package/src/maths/clamp.ts +7 -7
- package/src/objects/merge/merge.test.ts +1 -1
- package/src/schema/typebox/typebox.ts +1 -1
- package/src/server/fetch/createFetchWithProxyByUndici.ts +2 -2
- package/tsconfig.json +4 -1
- package/lib/schema/typebox/gen/codegen/common/encoder.js +0 -94
- package/lib/schema/typebox/gen/codegen/common/encoder.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/common/formatter.js +0 -33
- package/lib/schema/typebox/gen/codegen/common/formatter.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/common/index.js +0 -29
- package/lib/schema/typebox/gen/codegen/common/index.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/common/jsdoc.js +0 -117
- package/lib/schema/typebox/gen/codegen/common/jsdoc.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/expression/compiler.js +0 -364
- package/lib/schema/typebox/gen/codegen/expression/compiler.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/expression/errors.js +0 -259
- package/lib/schema/typebox/gen/codegen/expression/errors.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/expression/evaluator.js +0 -254
- package/lib/schema/typebox/gen/codegen/expression/evaluator.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/expression/expression.js +0 -381
- package/lib/schema/typebox/gen/codegen/expression/expression.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/expression/index.js +0 -32
- package/lib/schema/typebox/gen/codegen/expression/index.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/index.js +0 -29
- package/lib/schema/typebox/gen/codegen/index.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/index.js +0 -40
- package/lib/schema/typebox/gen/codegen/model/index.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model-to-arktype.js +0 -260
- package/lib/schema/typebox/gen/codegen/model/model-to-arktype.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model-to-expression.js +0 -383
- package/lib/schema/typebox/gen/codegen/model/model-to-expression.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model-to-grpc.js +0 -238
- package/lib/schema/typebox/gen/codegen/model/model-to-grpc.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model-to-io-ts.js +0 -274
- package/lib/schema/typebox/gen/codegen/model/model-to-io-ts.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model-to-javascript.js +0 -47
- package/lib/schema/typebox/gen/codegen/model/model-to-javascript.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model-to-json-schema.js +0 -192
- package/lib/schema/typebox/gen/codegen/model/model-to-json-schema.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model-to-typebox.js +0 -33
- package/lib/schema/typebox/gen/codegen/model/model-to-typebox.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model-to-typescript.js +0 -188
- package/lib/schema/typebox/gen/codegen/model/model-to-typescript.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model-to-valibot.js +0 -239
- package/lib/schema/typebox/gen/codegen/model/model-to-valibot.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model-to-value.js +0 -43
- package/lib/schema/typebox/gen/codegen/model/model-to-value.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model-to-yrel.js +0 -227
- package/lib/schema/typebox/gen/codegen/model/model-to-yrel.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model-to-yup.js +0 -225
- package/lib/schema/typebox/gen/codegen/model/model-to-yup.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model-to-zod.js +0 -248
- package/lib/schema/typebox/gen/codegen/model/model-to-zod.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model.js +0 -27
- package/lib/schema/typebox/gen/codegen/model/model.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/typescript/index.js +0 -28
- package/lib/schema/typebox/gen/codegen/typescript/index.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/typescript/typescript-to-model.js +0 -72
- package/lib/schema/typebox/gen/codegen/typescript/typescript-to-model.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/typescript/typescript-to-typebox.js +0 -620
- package/lib/schema/typebox/gen/codegen/typescript/typescript-to-typebox.js.map +0 -1
- package/lib/schema/typebox/gen/index.js +0 -3
- package/lib/schema/typebox/gen/index.js.map +0 -1
- package/src/schema/typebox/gen/codegen/common/encoder.ts +0 -99
- package/src/schema/typebox/gen/codegen/common/formatter.ts +0 -31
- package/src/schema/typebox/gen/codegen/common/index.ts +0 -29
- package/src/schema/typebox/gen/codegen/common/jsdoc.ts +0 -93
- package/src/schema/typebox/gen/codegen/expression/compiler.ts +0 -377
- package/src/schema/typebox/gen/codegen/expression/errors.ts +0 -302
- package/src/schema/typebox/gen/codegen/expression/evaluator.ts +0 -268
- package/src/schema/typebox/gen/codegen/expression/expression.ts +0 -538
- package/src/schema/typebox/gen/codegen/expression/index.ts +0 -32
- package/src/schema/typebox/gen/codegen/index.ts +0 -29
- package/src/schema/typebox/gen/codegen/model/index.ts +0 -40
- package/src/schema/typebox/gen/codegen/model/model-to-arktype.ts +0 -266
- package/src/schema/typebox/gen/codegen/model/model-to-expression.ts +0 -378
- package/src/schema/typebox/gen/codegen/model/model-to-grpc.ts +0 -244
- package/src/schema/typebox/gen/codegen/model/model-to-io-ts.ts +0 -294
- package/src/schema/typebox/gen/codegen/model/model-to-javascript.ts +0 -42
- package/src/schema/typebox/gen/codegen/model/model-to-json-schema.ts +0 -166
- package/src/schema/typebox/gen/codegen/model/model-to-typebox.ts +0 -32
- package/src/schema/typebox/gen/codegen/model/model-to-typescript.ts +0 -189
- package/src/schema/typebox/gen/codegen/model/model-to-valibot.ts +0 -236
- package/src/schema/typebox/gen/codegen/model/model-to-value.ts +0 -42
- package/src/schema/typebox/gen/codegen/model/model-to-yrel.ts +0 -232
- package/src/schema/typebox/gen/codegen/model/model-to-yup.ts +0 -226
- package/src/schema/typebox/gen/codegen/model/model-to-zod.ts +0 -251
- package/src/schema/typebox/gen/codegen/model/model.ts +0 -33
- package/src/schema/typebox/gen/codegen/typescript/index.ts +0 -28
- package/src/schema/typebox/gen/codegen/typescript/typescript-to-model.ts +0 -61
- package/src/schema/typebox/gen/codegen/typescript/typescript-to-typebox.ts +0 -647
- package/src/schema/typebox/gen/gen.test.ts +0 -12
- package/src/schema/typebox/gen/index.ts +0 -1
- /package/src/schema/{typebox/gen/README.md → README.md} +0 -0
package/lib/logging/slog.js.map
CHANGED
|
@@ -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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"}
|
package/lib/maths/clamp.js
CHANGED
|
@@ -1,21 +1,22 @@
|
|
|
1
|
-
|
|
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
|
|
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
|
-
}
|
|
20
|
+
}
|
|
20
21
|
|
|
21
22
|
//# sourceMappingURL=clamp.js.map
|
package/lib/maths/clamp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/maths/clamp.ts"],"sourcesContent":["// export function clamp<T>(value: T | null | undefined,
|
|
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,
|
|
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.
|
|
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.
|
|
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.
|
|
80
|
+
"undici": "^6.19.8",
|
|
81
81
|
"zod": "^3.23.8"
|
|
82
82
|
},
|
|
83
83
|
"publishConfig": {
|
package/src/asyncs/Promises.ts
CHANGED
|
@@ -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
|
|
44
|
-
return v && (v instanceof Promise ||
|
|
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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
holder.reject = reject;
|
|
37
|
-
holder.resolve = resolve;
|
|
38
|
-
}),
|
|
47
|
+
|
|
48
|
+
const like = Object.assign(
|
|
39
49
|
{
|
|
40
|
-
|
|
41
|
-
|
|
50
|
+
get status() {
|
|
51
|
+
return status;
|
|
42
52
|
},
|
|
43
|
-
|
|
44
|
-
|
|
53
|
+
get value() {
|
|
54
|
+
return value;
|
|
55
|
+
},
|
|
56
|
+
get error() {
|
|
57
|
+
return error;
|
|
45
58
|
},
|
|
46
59
|
},
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
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>;
|
package/src/asyncs/timeout.ts
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
export function timeout<T = any>(
|
|
2
|
-
|
|
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
|
|
8
|
+
if (typeof pending === 'function') {
|
|
9
9
|
ac = new AbortController();
|
|
10
|
-
|
|
10
|
+
pending = pending({ signal: ac.signal });
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
return Promise.race<T>([
|
|
14
|
-
|
|
14
|
+
pending,
|
|
15
15
|
new Promise((_resolve, reject) => {
|
|
16
16
|
timeout = setTimeout(() => {
|
|
17
17
|
ac?.abort(error);
|
package/src/cn/types.ts
ADDED
|
@@ -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,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';
|
package/src/io/ArrayBuffers.ts
CHANGED
|
@@ -157,7 +157,7 @@ export class ArrayBuffers {
|
|
|
157
157
|
return this.toUint8Array(ArrayBuffers.from(v, 'hex'));
|
|
158
158
|
};
|
|
159
159
|
|
|
160
|
-
static resize = (v:
|
|
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
|
-
|
|
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
|
-
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test('overflow max length', () => {
|
|
18
18
|
let buf = new ByteBuffer();
|
|
19
19
|
buf.writeBytes(new Uint8Array(1025));
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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('
|
|
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('
|
|
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(
|
|
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
|
});
|