@socketsecurity/lib 1.3.1 → 1.3.3

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 (337) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/abort.js +1 -60
  3. package/dist/abort.js.map +2 -2
  4. package/dist/agent.js +1 -289
  5. package/dist/agent.js.map +2 -2
  6. package/dist/ansi.js +1 -60
  7. package/dist/ansi.js.map +2 -2
  8. package/dist/argv/flags.js +1 -282
  9. package/dist/argv/flags.js.map +2 -2
  10. package/dist/argv/parse.js +1 -171
  11. package/dist/argv/parse.js.map +2 -2
  12. package/dist/arrays.js +1 -85
  13. package/dist/arrays.js.map +2 -2
  14. package/dist/bin.js +1 -402
  15. package/dist/bin.js.map +2 -2
  16. package/dist/cacache.js +1 -137
  17. package/dist/cacache.js.map +2 -2
  18. package/dist/cache-with-ttl.js +1 -223
  19. package/dist/cache-with-ttl.js.map +2 -2
  20. package/dist/constants/agents.js +1 -126
  21. package/dist/constants/agents.js.map +2 -2
  22. package/dist/constants/core.js +2 -57
  23. package/dist/constants/core.js.map +2 -2
  24. package/dist/constants/encoding.js +1 -48
  25. package/dist/constants/encoding.js.map +2 -2
  26. package/dist/constants/github.js +1 -30
  27. package/dist/constants/github.js.map +2 -2
  28. package/dist/constants/licenses.js +1 -66
  29. package/dist/constants/licenses.js.map +2 -2
  30. package/dist/constants/node.js +1 -171
  31. package/dist/constants/node.js.map +2 -2
  32. package/dist/constants/packages.js +1 -128
  33. package/dist/constants/packages.js.map +2 -2
  34. package/dist/constants/paths.js +1 -150
  35. package/dist/constants/paths.js.map +2 -2
  36. package/dist/constants/platform.js +1 -41
  37. package/dist/constants/platform.js.map +2 -2
  38. package/dist/constants/process.js +1 -52
  39. package/dist/constants/process.js.map +2 -2
  40. package/dist/constants/socket.js +1 -81
  41. package/dist/constants/socket.js.map +2 -2
  42. package/dist/constants/testing.js +1 -36
  43. package/dist/constants/testing.js.map +2 -2
  44. package/dist/constants/time.js +1 -39
  45. package/dist/constants/time.js.map +2 -2
  46. package/dist/constants/typescript.js +1 -54
  47. package/dist/constants/typescript.js.map +2 -2
  48. package/dist/cover/code.js +1 -135
  49. package/dist/cover/code.js.map +2 -2
  50. package/dist/cover/formatters.js +11 -101
  51. package/dist/cover/formatters.js.map +2 -2
  52. package/dist/cover/type.js +1 -63
  53. package/dist/cover/type.js.map +2 -2
  54. package/dist/cover/types.js +1 -15
  55. package/dist/cover/types.js.map +2 -2
  56. package/dist/debug.js +2 -343
  57. package/dist/debug.js.map +2 -2
  58. package/dist/dlx-binary.js +1 -259
  59. package/dist/dlx-binary.js.map +2 -2
  60. package/dist/dlx-package.js +1 -149
  61. package/dist/dlx-package.js.map +2 -2
  62. package/dist/dlx.js +1 -166
  63. package/dist/dlx.js.map +2 -2
  64. package/dist/download-lock.js +1 -137
  65. package/dist/download-lock.js.map +2 -2
  66. package/dist/effects/pulse-frames.js +1 -64
  67. package/dist/effects/pulse-frames.js.map +2 -2
  68. package/dist/effects/text-shimmer.js +1 -174
  69. package/dist/effects/text-shimmer.js.map +2 -2
  70. package/dist/effects/types.js +1 -15
  71. package/dist/effects/types.js.map +2 -2
  72. package/dist/effects/ultra.js +1 -61
  73. package/dist/effects/ultra.js.map +2 -2
  74. package/dist/env/appdata.js +1 -28
  75. package/dist/env/appdata.js.map +2 -2
  76. package/dist/env/ci.js +1 -29
  77. package/dist/env/ci.js.map +2 -2
  78. package/dist/env/comspec.js +1 -28
  79. package/dist/env/comspec.js.map +2 -2
  80. package/dist/env/debug.js +1 -28
  81. package/dist/env/debug.js.map +2 -2
  82. package/dist/env/getters.js +1 -281
  83. package/dist/env/getters.js.map +2 -2
  84. package/dist/env/github-api-url.js +1 -28
  85. package/dist/env/github-api-url.js.map +2 -2
  86. package/dist/env/github-base-ref.js +1 -28
  87. package/dist/env/github-base-ref.js.map +2 -2
  88. package/dist/env/github-ref-name.js +1 -28
  89. package/dist/env/github-ref-name.js.map +2 -2
  90. package/dist/env/github-ref-type.js +1 -28
  91. package/dist/env/github-ref-type.js.map +2 -2
  92. package/dist/env/github-repository.js +1 -28
  93. package/dist/env/github-repository.js.map +2 -2
  94. package/dist/env/github-server-url.js +1 -28
  95. package/dist/env/github-server-url.js.map +2 -2
  96. package/dist/env/github-token.js +1 -28
  97. package/dist/env/github-token.js.map +2 -2
  98. package/dist/env/helpers.js +1 -47
  99. package/dist/env/helpers.js.map +2 -2
  100. package/dist/env/home.js +1 -28
  101. package/dist/env/home.js.map +2 -2
  102. package/dist/env/jest-worker-id.js +1 -28
  103. package/dist/env/jest-worker-id.js.map +2 -2
  104. package/dist/env/lang.js +1 -28
  105. package/dist/env/lang.js.map +2 -2
  106. package/dist/env/lc-all.js +1 -28
  107. package/dist/env/lc-all.js.map +2 -2
  108. package/dist/env/lc-messages.js +1 -28
  109. package/dist/env/lc-messages.js.map +2 -2
  110. package/dist/env/localappdata.js +1 -28
  111. package/dist/env/localappdata.js.map +2 -2
  112. package/dist/env/node-auth-token.js +1 -28
  113. package/dist/env/node-auth-token.js.map +2 -2
  114. package/dist/env/node-env.js +1 -28
  115. package/dist/env/node-env.js.map +2 -2
  116. package/dist/env/npm-config-registry.js +1 -28
  117. package/dist/env/npm-config-registry.js.map +2 -2
  118. package/dist/env/npm-config-user-agent.js +1 -28
  119. package/dist/env/npm-config-user-agent.js.map +2 -2
  120. package/dist/env/npm-lifecycle-event.js +1 -28
  121. package/dist/env/npm-lifecycle-event.js.map +2 -2
  122. package/dist/env/npm-registry.js +1 -28
  123. package/dist/env/npm-registry.js.map +2 -2
  124. package/dist/env/npm-token.js +1 -28
  125. package/dist/env/npm-token.js.map +2 -2
  126. package/dist/env/path.js +1 -28
  127. package/dist/env/path.js.map +2 -2
  128. package/dist/env/pre-commit.js +1 -29
  129. package/dist/env/pre-commit.js.map +2 -2
  130. package/dist/env/shell.js +1 -28
  131. package/dist/env/shell.js.map +2 -2
  132. package/dist/env/socket-accept-risks.js +1 -29
  133. package/dist/env/socket-accept-risks.js.map +2 -2
  134. package/dist/env/socket-api-base-url.js +1 -28
  135. package/dist/env/socket-api-base-url.js.map +2 -2
  136. package/dist/env/socket-api-proxy.js +1 -28
  137. package/dist/env/socket-api-proxy.js.map +2 -2
  138. package/dist/env/socket-api-timeout.js +1 -29
  139. package/dist/env/socket-api-timeout.js.map +2 -2
  140. package/dist/env/socket-api-token.js +1 -28
  141. package/dist/env/socket-api-token.js.map +2 -2
  142. package/dist/env/socket-cacache-dir.js +1 -28
  143. package/dist/env/socket-cacache-dir.js.map +2 -2
  144. package/dist/env/socket-cli-accept-risks.js +1 -31
  145. package/dist/env/socket-cli-accept-risks.js.map +2 -2
  146. package/dist/env/socket-cli-api-base-url.js +1 -28
  147. package/dist/env/socket-cli-api-base-url.js.map +2 -2
  148. package/dist/env/socket-cli-api-proxy.js +1 -28
  149. package/dist/env/socket-cli-api-proxy.js.map +2 -2
  150. package/dist/env/socket-cli-api-timeout.js +1 -29
  151. package/dist/env/socket-cli-api-timeout.js.map +2 -2
  152. package/dist/env/socket-cli-api-token.js +1 -28
  153. package/dist/env/socket-cli-api-token.js.map +2 -2
  154. package/dist/env/socket-cli-config.js +1 -28
  155. package/dist/env/socket-cli-config.js.map +2 -2
  156. package/dist/env/socket-cli-fix.js +1 -28
  157. package/dist/env/socket-cli-fix.js.map +2 -2
  158. package/dist/env/socket-cli-no-api-token.js +1 -31
  159. package/dist/env/socket-cli-no-api-token.js.map +2 -2
  160. package/dist/env/socket-cli-optimize.js +1 -29
  161. package/dist/env/socket-cli-optimize.js.map +2 -2
  162. package/dist/env/socket-cli-org-slug.js +1 -28
  163. package/dist/env/socket-cli-org-slug.js.map +2 -2
  164. package/dist/env/socket-cli-shadow-accept-risks.js +1 -31
  165. package/dist/env/socket-cli-shadow-accept-risks.js.map +2 -2
  166. package/dist/env/socket-cli-shadow-api-token.js +1 -28
  167. package/dist/env/socket-cli-shadow-api-token.js.map +2 -2
  168. package/dist/env/socket-cli-shadow-bin.js +1 -28
  169. package/dist/env/socket-cli-shadow-bin.js.map +2 -2
  170. package/dist/env/socket-cli-shadow-progress.js +1 -31
  171. package/dist/env/socket-cli-shadow-progress.js.map +2 -2
  172. package/dist/env/socket-cli-shadow-silent.js +1 -31
  173. package/dist/env/socket-cli-shadow-silent.js.map +2 -2
  174. package/dist/env/socket-cli-view-all-risks.js +1 -31
  175. package/dist/env/socket-cli-view-all-risks.js.map +2 -2
  176. package/dist/env/socket-config.js +1 -28
  177. package/dist/env/socket-config.js.map +2 -2
  178. package/dist/env/socket-debug.js +1 -28
  179. package/dist/env/socket-debug.js.map +2 -2
  180. package/dist/env/socket-home.js +1 -28
  181. package/dist/env/socket-home.js.map +2 -2
  182. package/dist/env/socket-no-api-token.js +1 -29
  183. package/dist/env/socket-no-api-token.js.map +2 -2
  184. package/dist/env/socket-npm-registry.js +1 -28
  185. package/dist/env/socket-npm-registry.js.map +2 -2
  186. package/dist/env/socket-org-slug.js +1 -28
  187. package/dist/env/socket-org-slug.js.map +2 -2
  188. package/dist/env/socket-registry-url.js +1 -28
  189. package/dist/env/socket-registry-url.js.map +2 -2
  190. package/dist/env/socket-view-all-risks.js +1 -29
  191. package/dist/env/socket-view-all-risks.js.map +2 -2
  192. package/dist/env/temp.js +1 -28
  193. package/dist/env/temp.js.map +2 -2
  194. package/dist/env/term.js +1 -28
  195. package/dist/env/term.js.map +2 -2
  196. package/dist/env/tmp.js +1 -28
  197. package/dist/env/tmp.js.map +2 -2
  198. package/dist/env/tmpdir.js +1 -28
  199. package/dist/env/tmpdir.js.map +2 -2
  200. package/dist/env/userprofile.js +1 -28
  201. package/dist/env/userprofile.js.map +2 -2
  202. package/dist/env/vitest.js +1 -29
  203. package/dist/env/vitest.js.map +2 -2
  204. package/dist/env/xdg-cache-home.js +1 -28
  205. package/dist/env/xdg-cache-home.js.map +2 -2
  206. package/dist/env/xdg-config-home.js +1 -28
  207. package/dist/env/xdg-config-home.js.map +2 -2
  208. package/dist/env/xdg-data-home.js +1 -28
  209. package/dist/env/xdg-data-home.js.map +2 -2
  210. package/dist/env.js +1 -61
  211. package/dist/env.js.map +2 -2
  212. package/dist/fs.js +3 -626
  213. package/dist/fs.js.map +2 -2
  214. package/dist/functions.js +1 -68
  215. package/dist/functions.js.map +2 -2
  216. package/dist/git.js +2 -320
  217. package/dist/git.js.map +2 -2
  218. package/dist/github.js +1 -201
  219. package/dist/github.js.map +2 -2
  220. package/dist/globs.js +1 -152
  221. package/dist/globs.js.map +2 -2
  222. package/dist/http-request.js +1 -313
  223. package/dist/http-request.js.map +2 -2
  224. package/dist/index.js +1 -62
  225. package/dist/index.js.map +2 -2
  226. package/dist/ipc.js +1 -232
  227. package/dist/ipc.js.map +2 -2
  228. package/dist/json.js +1 -73
  229. package/dist/json.js.map +2 -2
  230. package/dist/logger.js +1 -1254
  231. package/dist/logger.js.map +2 -2
  232. package/dist/maintained-node-versions.js +1 -35
  233. package/dist/maintained-node-versions.js.map +2 -2
  234. package/dist/memoization.js +1 -210
  235. package/dist/memoization.js.map +2 -2
  236. package/dist/objects.d.ts +0 -3
  237. package/dist/objects.js +1 -319
  238. package/dist/objects.js.map +3 -3
  239. package/dist/packages/editable.js +9 -356
  240. package/dist/packages/editable.js.map +2 -2
  241. package/dist/packages/exports.js +1 -162
  242. package/dist/packages/exports.js.map +2 -2
  243. package/dist/packages/isolation.js +1 -195
  244. package/dist/packages/isolation.js.map +2 -2
  245. package/dist/packages/licenses.js +1 -214
  246. package/dist/packages/licenses.js.map +2 -2
  247. package/dist/packages/manifest.js +1 -190
  248. package/dist/packages/manifest.js.map +2 -2
  249. package/dist/packages/normalize.js +1 -120
  250. package/dist/packages/normalize.js.map +2 -2
  251. package/dist/packages/operations.js +1 -304
  252. package/dist/packages/operations.js.map +2 -2
  253. package/dist/packages/paths.js +1 -53
  254. package/dist/packages/paths.js.map +2 -2
  255. package/dist/packages/provenance.js +1 -178
  256. package/dist/packages/provenance.js.map +2 -2
  257. package/dist/packages/registry.js +1 -28
  258. package/dist/packages/registry.js.map +2 -2
  259. package/dist/packages/specs.js +1 -83
  260. package/dist/packages/specs.js.map +2 -2
  261. package/dist/packages/validation.js +1 -51
  262. package/dist/packages/validation.js.map +2 -2
  263. package/dist/packages.js +1 -129
  264. package/dist/packages.js.map +2 -2
  265. package/dist/path.js +1 -448
  266. package/dist/path.js.map +2 -2
  267. package/dist/paths.js +1 -143
  268. package/dist/paths.js.map +2 -2
  269. package/dist/performance.js +15 -216
  270. package/dist/performance.js.map +2 -2
  271. package/dist/promise-queue.js +1 -109
  272. package/dist/promise-queue.js.map +2 -2
  273. package/dist/promises.js +1 -269
  274. package/dist/promises.js.map +2 -2
  275. package/dist/prompts.js +1 -58
  276. package/dist/prompts.js.map +2 -2
  277. package/dist/regexps.js +1 -30
  278. package/dist/regexps.js.map +2 -2
  279. package/dist/sea.js +1 -44
  280. package/dist/sea.js.map +2 -2
  281. package/dist/shadow.js +1 -58
  282. package/dist/shadow.js.map +2 -2
  283. package/dist/signal-exit.js +1 -248
  284. package/dist/signal-exit.js.map +2 -2
  285. package/dist/sorts.js +1 -94
  286. package/dist/sorts.js.map +2 -2
  287. package/dist/spawn.js +1 -199
  288. package/dist/spawn.js.map +2 -2
  289. package/dist/spinner.js +1 -865
  290. package/dist/spinner.js.map +2 -2
  291. package/dist/ssri.js +1 -71
  292. package/dist/ssri.js.map +2 -2
  293. package/dist/stdio/clear.js +1 -82
  294. package/dist/stdio/clear.js.map +2 -2
  295. package/dist/stdio/divider.js +3 -89
  296. package/dist/stdio/divider.js.map +2 -2
  297. package/dist/stdio/footer.js +2 -94
  298. package/dist/stdio/footer.js.map +2 -2
  299. package/dist/stdio/header.js +2 -100
  300. package/dist/stdio/header.js.map +2 -2
  301. package/dist/stdio/mask.js +5 -206
  302. package/dist/stdio/mask.js.map +2 -2
  303. package/dist/stdio/progress.js +2 -209
  304. package/dist/stdio/progress.js.map +2 -2
  305. package/dist/stdio/prompts.js +1 -88
  306. package/dist/stdio/prompts.js.map +2 -2
  307. package/dist/stdio/stderr.js +2 -89
  308. package/dist/stdio/stderr.js.map +2 -2
  309. package/dist/stdio/stdout.js +2 -103
  310. package/dist/stdio/stdout.js.map +2 -2
  311. package/dist/streams.js +1 -78
  312. package/dist/streams.js.map +2 -2
  313. package/dist/strings.js +3 -251
  314. package/dist/strings.js.map +2 -2
  315. package/dist/suppress-warnings.js +1 -98
  316. package/dist/suppress-warnings.js.map +2 -2
  317. package/dist/tables.js +3 -128
  318. package/dist/tables.js.map +2 -2
  319. package/dist/temporary-executor.js +1 -53
  320. package/dist/temporary-executor.js.map +2 -2
  321. package/dist/types.js +1 -72
  322. package/dist/types.js.map +2 -2
  323. package/dist/url.js +1 -142
  324. package/dist/url.js.map +2 -2
  325. package/dist/utils/get-ipc.js +1 -58
  326. package/dist/utils/get-ipc.js.map +2 -2
  327. package/dist/validation/json-parser.js +1 -127
  328. package/dist/validation/json-parser.js.map +2 -2
  329. package/dist/validation/types.js +1 -15
  330. package/dist/validation/types.js.map +2 -2
  331. package/dist/versions.js +1 -153
  332. package/dist/versions.js.map +2 -2
  333. package/dist/words.js +1 -50
  334. package/dist/words.js.map +2 -2
  335. package/dist/zod.js +1 -27
  336. package/dist/zod.js.map +2 -2
  337. package/package.json +2 -2
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/performance.ts"],
4
4
  "sourcesContent": ["/**\n * @fileoverview Performance monitoring utilities for profiling and optimization.\n * Provides timing, profiling, and performance metric collection for identifying bottlenecks.\n */\n\nimport { debugLog } from './debug'\n\n/**\n * Performance metrics collected during execution.\n */\ntype PerformanceMetrics = {\n operation: string\n duration: number\n timestamp: number\n metadata?: Record<string, unknown>\n}\n\n/**\n * Global metrics collection (only in debug mode).\n */\nconst performanceMetrics: PerformanceMetrics[] = []\n\n/**\n * Check if performance tracking is enabled.\n */\nfunction isPerfEnabled(): boolean {\n return process.env['DEBUG']?.includes('perf') || false\n}\n\n/**\n * Start a performance timer for an operation.\n * Returns a stop function that records the duration.\n *\n * @param operation - Name of the operation being timed\n * @param metadata - Optional metadata to attach to the metric\n * @returns Stop function that completes the timing\n *\n * @example\n * import { perfTimer } from '@socketsecurity/registry/lib/performance'\n *\n * const stop = perfTimer('api-call')\n * await fetchData()\n * stop({ endpoint: '/npm/lodash/score' })\n */\nexport function perfTimer(\n operation: string,\n metadata?: Record<string, unknown>,\n): (additionalMetadata?: Record<string, unknown>) => void {\n if (!isPerfEnabled()) {\n // No-op if perf tracking disabled\n return () => {}\n }\n\n const start = performance.now()\n debugLog(`[perf] [START] ${operation}`)\n\n return (additionalMetadata?: Record<string, unknown>) => {\n const duration = performance.now() - start\n const metric: PerformanceMetrics = {\n operation,\n // Round to 2 decimals\n duration: Math.round(duration * 100) / 100,\n timestamp: Date.now(),\n metadata: { ...metadata, ...additionalMetadata },\n }\n\n performanceMetrics.push(metric)\n debugLog(`[perf] [END] ${operation} - ${metric.duration}ms`)\n }\n}\n\n/**\n * Measure execution time of an async function.\n *\n * @param operation - Name of the operation\n * @param fn - Async function to measure\n * @param metadata - Optional metadata\n * @returns Result of the function and duration\n *\n * @example\n * import { measure } from '@socketsecurity/registry/lib/performance'\n *\n * const { result, duration } = await measure('fetch-packages', async () => {\n * return await fetchPackages()\n * })\n * console.log(`Fetched packages in ${duration}ms`)\n */\nexport async function measure<T>(\n operation: string,\n fn: () => Promise<T>,\n metadata?: Record<string, unknown>,\n): Promise<{ result: T; duration: number }> {\n const stop = perfTimer(operation, metadata)\n\n try {\n const result = await fn()\n stop({ success: true })\n\n const metric = performanceMetrics[performanceMetrics.length - 1]\n return { result, duration: metric?.duration || 0 }\n } catch (e) {\n stop({\n success: false,\n error: e instanceof Error ? e.message : 'Unknown',\n })\n throw e\n }\n}\n\n/**\n * Measure synchronous function execution time.\n *\n * @param operation - Name of the operation\n * @param fn - Synchronous function to measure\n * @param metadata - Optional metadata\n * @returns Result of the function and duration\n *\n * @example\n * import { measureSync } from '@socketsecurity/registry/lib/performance'\n *\n * const { result, duration } = measureSync('parse-json', () => {\n * return JSON.parse(data)\n * })\n */\nexport function measureSync<T>(\n operation: string,\n fn: () => T,\n metadata?: Record<string, unknown>,\n): { result: T; duration: number } {\n const stop = perfTimer(operation, metadata)\n\n try {\n const result = fn()\n stop({ success: true })\n\n const metric = performanceMetrics[performanceMetrics.length - 1]\n return { result, duration: metric?.duration || 0 }\n } catch (e) {\n stop({\n success: false,\n error: e instanceof Error ? e.message : 'Unknown',\n })\n throw e\n }\n}\n\n/**\n * Get all collected performance metrics.\n * Only available when DEBUG=perf is enabled.\n *\n * @returns Array of performance metrics\n *\n * @example\n * import { getPerformanceMetrics } from '@socketsecurity/registry/lib/performance'\n *\n * const metrics = getPerformanceMetrics()\n * console.log(metrics)\n */\nexport function getPerformanceMetrics(): PerformanceMetrics[] {\n return [...performanceMetrics]\n}\n\n/**\n * Clear all collected performance metrics.\n *\n * @example\n * import { clearPerformanceMetrics } from '@socketsecurity/registry/lib/performance'\n *\n * clearPerformanceMetrics()\n */\nexport function clearPerformanceMetrics(): void {\n performanceMetrics.length = 0\n debugLog('[perf] Cleared performance metrics')\n}\n\n/**\n * Get performance summary statistics.\n *\n * @returns Summary of metrics grouped by operation\n *\n * @example\n * import { getPerformanceSummary } from '@socketsecurity/registry/lib/performance'\n *\n * const summary = getPerformanceSummary()\n * console.log(summary)\n * // {\n * // 'api-call': { count: 5, total: 1234, avg: 246.8, min: 100, max: 500 },\n * // 'file-read': { count: 10, total: 50, avg: 5, min: 2, max: 15 }\n * // }\n */\nexport function getPerformanceSummary(): Record<\n string,\n {\n count: number\n total: number\n avg: number\n min: number\n max: number\n }\n> {\n const summary: Record<\n string,\n { count: number; total: number; min: number; max: number }\n > = Object.create(null)\n\n for (const metric of performanceMetrics) {\n const { duration, operation } = metric\n\n if (!summary[operation]) {\n summary[operation] = {\n count: 0,\n total: 0,\n min: Number.POSITIVE_INFINITY,\n max: Number.NEGATIVE_INFINITY,\n }\n }\n\n const stats = summary[operation] as {\n count: number\n total: number\n min: number\n max: number\n }\n stats.count++\n stats.total += duration\n stats.min = Math.min(stats.min, duration)\n stats.max = Math.max(stats.max, duration)\n }\n\n // Calculate averages and return with proper typing\n const result: Record<\n string,\n { count: number; total: number; avg: number; min: number; max: number }\n > = Object.create(null)\n\n for (const { 0: operation, 1: stats } of Object.entries(summary)) {\n result[operation] = {\n count: stats.count,\n total: Math.round(stats.total * 100) / 100,\n avg: Math.round((stats.total / stats.count) * 100) / 100,\n min: Math.round(stats.min * 100) / 100,\n max: Math.round(stats.max * 100) / 100,\n }\n }\n\n return result\n}\n\n/**\n * Print performance summary to console.\n * Only prints when DEBUG=perf is enabled.\n *\n * @example\n * import { printPerformanceSummary } from '@socketsecurity/registry/lib/performance'\n *\n * printPerformanceSummary()\n * // Performance Summary:\n * // api-call: 5 calls, avg 246.8ms (min 100ms, max 500ms, total 1234ms)\n * // file-read: 10 calls, avg 5ms (min 2ms, max 15ms, total 50ms)\n */\nexport function printPerformanceSummary(): void {\n if (!isPerfEnabled() || performanceMetrics.length === 0) {\n return\n }\n\n const summary = getPerformanceSummary()\n const operations = Object.keys(summary).sort()\n\n debugLog('[perf]\\n=== Performance Summary ===')\n\n for (const operation of operations) {\n const stats = summary[operation] as {\n count: number\n total: number\n avg: number\n min: number\n max: number\n }\n debugLog(\n `[perf] ${operation}: ${stats.count} calls, avg ${stats.avg}ms (min ${stats.min}ms, max ${stats.max}ms, total ${stats.total}ms)`,\n )\n }\n\n debugLog('[perf] =========================\\n')\n}\n\n/**\n * Mark a checkpoint in performance tracking.\n * Useful for tracking progress through complex operations.\n *\n * @param checkpoint - Name of the checkpoint\n * @param metadata - Optional metadata\n *\n * @example\n * import { perfCheckpoint } from '@socketsecurity/registry/lib/performance'\n *\n * perfCheckpoint('start-scan')\n * // ... do work ...\n * perfCheckpoint('fetch-packages', { count: 50 })\n * // ... do work ...\n * perfCheckpoint('analyze-issues', { issueCount: 10 })\n * perfCheckpoint('end-scan')\n */\nexport function perfCheckpoint(\n checkpoint: string,\n metadata?: Record<string, unknown>,\n): void {\n if (!isPerfEnabled()) {\n return\n }\n\n const metric: PerformanceMetrics = {\n operation: `checkpoint:${checkpoint}`,\n duration: 0,\n timestamp: Date.now(),\n ...(metadata ? { metadata } : {}),\n }\n\n performanceMetrics.push(metric)\n debugLog(`[perf] [CHECKPOINT] ${checkpoint}`)\n}\n\n/**\n * Track memory usage at a specific point.\n * Only available when DEBUG=perf is enabled.\n *\n * @param label - Label for this memory snapshot\n * @returns Memory usage in MB\n *\n * @example\n * import { trackMemory } from '@socketsecurity/registry/lib/performance'\n *\n * const memBefore = trackMemory('before-operation')\n * await heavyOperation()\n * const memAfter = trackMemory('after-operation')\n * console.log(`Memory increased by ${memAfter - memBefore}MB`)\n */\nexport function trackMemory(label: string): number {\n if (!isPerfEnabled()) {\n return 0\n }\n\n const usage = process.memoryUsage()\n const heapUsedMB = Math.round((usage.heapUsed / 1024 / 1024) * 100) / 100\n\n debugLog(`[perf] [MEMORY] ${label}: ${heapUsedMB}MB heap used`)\n\n const metric: PerformanceMetrics = {\n operation: `checkpoint:memory:${label}`,\n duration: 0,\n timestamp: Date.now(),\n metadata: {\n heapUsed: heapUsedMB,\n heapTotal: Math.round((usage.heapTotal / 1024 / 1024) * 100) / 100,\n external: Math.round((usage.external / 1024 / 1024) * 100) / 100,\n },\n }\n\n performanceMetrics.push(metric)\n\n return heapUsedMB\n}\n\n/**\n * Create a performance report for the current execution.\n * Only available when DEBUG=perf is enabled.\n *\n * @returns Formatted performance report\n *\n * @example\n * import { generatePerformanceReport } from '@socketsecurity/registry/lib/performance'\n *\n * console.log(generatePerformanceReport())\n * // \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n * // \u2551 Performance Report \u2551\n * // \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\n * //\n * // api-call:\n * // Calls: 5\n * // Avg: 246.8ms\n * // Min: 100ms\n * // Max: 500ms\n * // Total: 1234ms\n */\nexport function generatePerformanceReport(): string {\n if (!isPerfEnabled() || performanceMetrics.length === 0) {\n return '(no performance data collected - enable with DEBUG=perf)'\n }\n\n const summary = getPerformanceSummary()\n const operations = Object.keys(summary).sort()\n\n let report = '\\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\\n'\n report += '\u2551 Performance Report \u2551\\n'\n report += '\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\\n\\n'\n\n for (const operation of operations) {\n const stats = summary[operation] as {\n count: number\n total: number\n avg: number\n min: number\n max: number\n }\n report += `${operation}:\\n`\n report += ` Calls: ${stats.count}\\n`\n report += ` Avg: ${stats.avg}ms\\n`\n report += ` Min: ${stats.min}ms\\n`\n report += ` Max: ${stats.max}ms\\n`\n report += ` Total: ${stats.total}ms\\n\\n`\n }\n\n const totalDuration = Object.values(summary).reduce(\n (sum, s) => sum + s.total,\n 0,\n )\n report += `Total measured time: ${Math.round(totalDuration * 100) / 100}ms\\n`\n\n return report\n}\n"],
5
- "mappings": "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",
6
- "names": []
5
+ "mappings": "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",
6
+ "names": ["performance_exports", "__export", "clearPerformanceMetrics", "generatePerformanceReport", "getPerformanceMetrics", "getPerformanceSummary", "measure", "measureSync", "perfCheckpoint", "perfTimer", "printPerformanceSummary", "trackMemory", "__toCommonJS", "import_debug", "performanceMetrics", "isPerfEnabled", "operation", "metadata", "start", "additionalMetadata", "duration", "metric", "fn", "stop", "result", "e", "summary", "stats", "operations", "checkpoint", "label", "usage", "heapUsedMB", "report", "totalDuration", "sum", "s"]
7
7
  }
@@ -1,111 +1,3 @@
1
1
  /* Socket Lib - Built with esbuild */
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var promise_queue_exports = {};
20
- __export(promise_queue_exports, {
21
- PromiseQueue: () => PromiseQueue
22
- });
23
- module.exports = __toCommonJS(promise_queue_exports);
24
- class PromiseQueue {
25
- queue = [];
26
- running = 0;
27
- maxConcurrency;
28
- maxQueueLength;
29
- /**
30
- * Creates a new PromiseQueue
31
- * @param maxConcurrency - Maximum number of promises that can run concurrently
32
- * @param maxQueueLength - Maximum queue size (older tasks are dropped if exceeded)
33
- */
34
- constructor(maxConcurrency, maxQueueLength) {
35
- this.maxConcurrency = maxConcurrency;
36
- this.maxQueueLength = maxQueueLength;
37
- if (maxConcurrency < 1) {
38
- throw new Error("maxConcurrency must be at least 1");
39
- }
40
- }
41
- /**
42
- * Add a task to the queue
43
- * @param fn - Async function to execute
44
- * @returns Promise that resolves with the function's result
45
- */
46
- async add(fn) {
47
- return await new Promise((resolve, reject) => {
48
- const task = { fn, resolve, reject };
49
- if (this.maxQueueLength && this.queue.length >= this.maxQueueLength) {
50
- const droppedTask = this.queue.shift();
51
- if (droppedTask) {
52
- droppedTask.reject(new Error("Task dropped: queue length exceeded"));
53
- }
54
- }
55
- this.queue.push(task);
56
- this.runNext();
57
- });
58
- }
59
- runNext() {
60
- if (this.running >= this.maxConcurrency || this.queue.length === 0) {
61
- return;
62
- }
63
- const task = this.queue.shift();
64
- if (!task) {
65
- return;
66
- }
67
- this.running++;
68
- task.fn().then(task.resolve).catch(task.reject).finally(() => {
69
- this.running--;
70
- this.runNext();
71
- });
72
- }
73
- /**
74
- * Wait for all queued and running tasks to complete
75
- */
76
- async onIdle() {
77
- return await new Promise((resolve) => {
78
- const check = () => {
79
- if (this.running === 0 && this.queue.length === 0) {
80
- resolve();
81
- } else {
82
- setImmediate(check);
83
- }
84
- };
85
- check();
86
- });
87
- }
88
- /**
89
- * Get the number of tasks currently running
90
- */
91
- get activeCount() {
92
- return this.running;
93
- }
94
- /**
95
- * Get the number of tasks waiting in the queue
96
- */
97
- get pendingCount() {
98
- return this.queue.length;
99
- }
100
- /**
101
- * Clear all pending tasks from the queue (does not affect running tasks)
102
- */
103
- clear() {
104
- this.queue = [];
105
- }
106
- }
107
- // Annotate the CommonJS export names for ESM import in node:
108
- 0 && (module.exports = {
109
- PromiseQueue
110
- });
2
+ var i=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var o=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var d=(t,e)=>{for(var n in e)i(t,n,{get:e[n],enumerable:!0})},c=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let u of o(e))!h.call(t,u)&&u!==n&&i(t,u,{get:()=>e[u],enumerable:!(r=a(e,u))||r.enumerable});return t};var m=t=>c(i({},"__esModule",{value:!0}),t);var l={};d(l,{PromiseQueue:()=>g});module.exports=m(l);class g{queue=[];running=0;maxConcurrency;maxQueueLength;constructor(e,n){if(this.maxConcurrency=e,this.maxQueueLength=n,e<1)throw new Error("maxConcurrency must be at least 1")}async add(e){return await new Promise((n,r)=>{const u={fn:e,resolve:n,reject:r};if(this.maxQueueLength&&this.queue.length>=this.maxQueueLength){const s=this.queue.shift();s&&s.reject(new Error("Task dropped: queue length exceeded"))}this.queue.push(u),this.runNext()})}runNext(){if(this.running>=this.maxConcurrency||this.queue.length===0)return;const e=this.queue.shift();e&&(this.running++,e.fn().then(e.resolve).catch(e.reject).finally(()=>{this.running--,this.runNext()}))}async onIdle(){return await new Promise(e=>{const n=()=>{this.running===0&&this.queue.length===0?e():setImmediate(n)};n()})}get activeCount(){return this.running}get pendingCount(){return this.queue.length}clear(){this.queue=[]}}0&&(module.exports={PromiseQueue});
111
3
  //# sourceMappingURL=promise-queue.js.map
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/promise-queue.ts"],
4
4
  "sourcesContent": ["/**\n * A promise queue that limits concurrent execution of async tasks.\n * Based on patterns from coana-package-manager for resource-aware async operations.\n */\n\ntype QueuedTask<T> = {\n fn: () => Promise<T>\n resolve: (value: T) => void\n reject: (error: unknown) => void\n}\n\nexport class PromiseQueue {\n private queue: Array<QueuedTask<unknown>> = []\n private running = 0\n\n private readonly maxConcurrency: number\n private readonly maxQueueLength: number | undefined\n\n /**\n * Creates a new PromiseQueue\n * @param maxConcurrency - Maximum number of promises that can run concurrently\n * @param maxQueueLength - Maximum queue size (older tasks are dropped if exceeded)\n */\n constructor(maxConcurrency: number, maxQueueLength?: number | undefined) {\n this.maxConcurrency = maxConcurrency\n this.maxQueueLength = maxQueueLength\n if (maxConcurrency < 1) {\n throw new Error('maxConcurrency must be at least 1')\n }\n }\n\n /**\n * Add a task to the queue\n * @param fn - Async function to execute\n * @returns Promise that resolves with the function's result\n */\n async add<T>(fn: () => Promise<T>): Promise<T> {\n return await new Promise<T>((resolve, reject) => {\n const task: QueuedTask<T> = { fn, resolve, reject }\n\n if (this.maxQueueLength && this.queue.length >= this.maxQueueLength) {\n // Drop oldest task to prevent memory buildup\n const droppedTask = this.queue.shift()\n if (droppedTask) {\n droppedTask.reject(new Error('Task dropped: queue length exceeded'))\n }\n }\n\n this.queue.push(task as QueuedTask<unknown>)\n this.runNext()\n })\n }\n\n private runNext(): void {\n if (this.running >= this.maxConcurrency || this.queue.length === 0) {\n return\n }\n\n const task = this.queue.shift()\n if (!task) {\n return\n }\n\n this.running++\n\n task\n .fn()\n .then(task.resolve)\n .catch(task.reject)\n .finally(() => {\n this.running--\n this.runNext()\n })\n }\n\n /**\n * Wait for all queued and running tasks to complete\n */\n async onIdle(): Promise<void> {\n return await new Promise<void>(resolve => {\n const check = () => {\n if (this.running === 0 && this.queue.length === 0) {\n resolve()\n } else {\n setImmediate(check)\n }\n }\n check()\n })\n }\n\n /**\n * Get the number of tasks currently running\n */\n get activeCount(): number {\n return this.running\n }\n\n /**\n * Get the number of tasks waiting in the queue\n */\n get pendingCount(): number {\n return this.queue.length\n }\n\n /**\n * Clear all pending tasks from the queue (does not affect running tasks)\n */\n clear(): void {\n this.queue = []\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWO,MAAM,aAAa;AAAA,EAChB,QAAoC,CAAC;AAAA,EACrC,UAAU;AAAA,EAED;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjB,YAAY,gBAAwB,gBAAqC;AACvE,SAAK,iBAAiB;AACtB,SAAK,iBAAiB;AACtB,QAAI,iBAAiB,GAAG;AACtB,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,IAAO,IAAkC;AAC7C,WAAO,MAAM,IAAI,QAAW,CAAC,SAAS,WAAW;AAC/C,YAAM,OAAsB,EAAE,IAAI,SAAS,OAAO;AAElD,UAAI,KAAK,kBAAkB,KAAK,MAAM,UAAU,KAAK,gBAAgB;AAEnE,cAAM,cAAc,KAAK,MAAM,MAAM;AACrC,YAAI,aAAa;AACf,sBAAY,OAAO,IAAI,MAAM,qCAAqC,CAAC;AAAA,QACrE;AAAA,MACF;AAEA,WAAK,MAAM,KAAK,IAA2B;AAC3C,WAAK,QAAQ;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EAEQ,UAAgB;AACtB,QAAI,KAAK,WAAW,KAAK,kBAAkB,KAAK,MAAM,WAAW,GAAG;AAClE;AAAA,IACF;AAEA,UAAM,OAAO,KAAK,MAAM,MAAM;AAC9B,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,SAAK;AAEL,SACG,GAAG,EACH,KAAK,KAAK,OAAO,EACjB,MAAM,KAAK,MAAM,EACjB,QAAQ,MAAM;AACb,WAAK;AACL,WAAK,QAAQ;AAAA,IACf,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAwB;AAC5B,WAAO,MAAM,IAAI,QAAc,aAAW;AACxC,YAAM,QAAQ,MAAM;AAClB,YAAI,KAAK,YAAY,KAAK,KAAK,MAAM,WAAW,GAAG;AACjD,kBAAQ;AAAA,QACV,OAAO;AACL,uBAAa,KAAK;AAAA,QACpB;AAAA,MACF;AACA,YAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,cAAsB;AACxB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,eAAuB;AACzB,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,QAAQ,CAAC;AAAA,EAChB;AACF;",
6
- "names": []
5
+ "mappings": ";4ZAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kBAAAE,IAAA,eAAAC,EAAAH,GAWO,MAAME,CAAa,CAChB,MAAoC,CAAC,EACrC,QAAU,EAED,eACA,eAOjB,YAAYE,EAAwBC,EAAqC,CAGvE,GAFA,KAAK,eAAiBD,EACtB,KAAK,eAAiBC,EAClBD,EAAiB,EACnB,MAAM,IAAI,MAAM,mCAAmC,CAEvD,CAOA,MAAM,IAAOE,EAAkC,CAC7C,OAAO,MAAM,IAAI,QAAW,CAACC,EAASC,IAAW,CAC/C,MAAMC,EAAsB,CAAE,GAAAH,EAAI,QAAAC,EAAS,OAAAC,CAAO,EAElD,GAAI,KAAK,gBAAkB,KAAK,MAAM,QAAU,KAAK,eAAgB,CAEnE,MAAME,EAAc,KAAK,MAAM,MAAM,EACjCA,GACFA,EAAY,OAAO,IAAI,MAAM,qCAAqC,CAAC,CAEvE,CAEA,KAAK,MAAM,KAAKD,CAA2B,EAC3C,KAAK,QAAQ,CACf,CAAC,CACH,CAEQ,SAAgB,CACtB,GAAI,KAAK,SAAW,KAAK,gBAAkB,KAAK,MAAM,SAAW,EAC/D,OAGF,MAAMA,EAAO,KAAK,MAAM,MAAM,EACzBA,IAIL,KAAK,UAELA,EACG,GAAG,EACH,KAAKA,EAAK,OAAO,EACjB,MAAMA,EAAK,MAAM,EACjB,QAAQ,IAAM,CACb,KAAK,UACL,KAAK,QAAQ,CACf,CAAC,EACL,CAKA,MAAM,QAAwB,CAC5B,OAAO,MAAM,IAAI,QAAcF,GAAW,CACxC,MAAMI,EAAQ,IAAM,CACd,KAAK,UAAY,GAAK,KAAK,MAAM,SAAW,EAC9CJ,EAAQ,EAER,aAAaI,CAAK,CAEtB,EACAA,EAAM,CACR,CAAC,CACH,CAKA,IAAI,aAAsB,CACxB,OAAO,KAAK,OACd,CAKA,IAAI,cAAuB,CACzB,OAAO,KAAK,MAAM,MACpB,CAKA,OAAc,CACZ,KAAK,MAAQ,CAAC,CAChB,CACF",
6
+ "names": ["promise_queue_exports", "__export", "PromiseQueue", "__toCommonJS", "maxConcurrency", "maxQueueLength", "fn", "resolve", "reject", "task", "droppedTask", "check"]
7
7
  }
package/dist/promises.js CHANGED
@@ -1,271 +1,3 @@
1
1
  /* Socket Lib - Built with esbuild */
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var promises_exports = {};
20
- __export(promises_exports, {
21
- normalizeIterationOptions: () => normalizeIterationOptions,
22
- normalizeRetryOptions: () => normalizeRetryOptions,
23
- pEach: () => pEach,
24
- pEachChunk: () => pEachChunk,
25
- pFilter: () => pFilter,
26
- pFilterChunk: () => pFilterChunk,
27
- pRetry: () => pRetry,
28
- resolveRetryOptions: () => resolveRetryOptions
29
- });
30
- module.exports = __toCommonJS(promises_exports);
31
- var import_core = require("#constants/core");
32
- var import_process = require("#constants/process");
33
- var import_arrays = require("./arrays");
34
- const abortSignal = (0, import_process.getAbortSignal)();
35
- let _timers;
36
- // @__NO_SIDE_EFFECTS__
37
- function getTimers() {
38
- if (_timers === void 0) {
39
- _timers = require("node:timers/promises");
40
- }
41
- return _timers;
42
- }
43
- // @__NO_SIDE_EFFECTS__
44
- function normalizeIterationOptions(options) {
45
- const opts = typeof options === "number" ? { concurrency: options } : options;
46
- const {
47
- // The number of concurrent executions performed at one time.
48
- concurrency = 1,
49
- // Retries as a number or options object.
50
- retries,
51
- // AbortSignal used to support cancellation.
52
- signal = abortSignal
53
- } = { __proto__: null, ...opts };
54
- const normalizedConcurrency = Math.max(1, concurrency);
55
- const retryOpts = /* @__PURE__ */ resolveRetryOptions(retries);
56
- return {
57
- __proto__: null,
58
- concurrency: normalizedConcurrency,
59
- retries: /* @__PURE__ */ normalizeRetryOptions({ signal, ...retryOpts }),
60
- signal
61
- };
62
- }
63
- // @__NO_SIDE_EFFECTS__
64
- function normalizeRetryOptions(options) {
65
- const resolved = /* @__PURE__ */ resolveRetryOptions(options);
66
- const {
67
- // Arguments to pass to the callback function.
68
- args = [],
69
- // Multiplier for exponential backoff (e.g., 2 doubles delay each retry).
70
- backoffFactor = resolved.factor || 2,
71
- // Initial delay before the first retry (in milliseconds).
72
- baseDelayMs = resolved.minTimeout || 200,
73
- // Whether to apply randomness to spread out retries.
74
- jitter = true,
75
- // Upper limit for any backoff delay (in milliseconds).
76
- maxDelayMs = resolved.maxTimeout || 1e4,
77
- // Optional callback invoked on each retry attempt:
78
- // (attempt: number, error: unknown, delay: number) => void
79
- onRetry,
80
- // Whether onRetry can cancel retries by returning `false`.
81
- onRetryCancelOnFalse = false,
82
- // Whether onRetry will rethrow errors.
83
- onRetryRethrow = false,
84
- // Number of retry attempts (0 = no retries, only initial attempt).
85
- retries = resolved.retries || 0,
86
- // AbortSignal used to support cancellation.
87
- signal = abortSignal
88
- } = resolved;
89
- return {
90
- args,
91
- backoffFactor,
92
- baseDelayMs,
93
- jitter,
94
- maxDelayMs,
95
- minTimeout: baseDelayMs,
96
- maxTimeout: maxDelayMs,
97
- onRetry,
98
- onRetryCancelOnFalse,
99
- onRetryRethrow,
100
- retries,
101
- signal
102
- };
103
- }
104
- // @__NO_SIDE_EFFECTS__
105
- function resolveRetryOptions(options) {
106
- const defaults = {
107
- __proto__: null,
108
- retries: 0,
109
- minTimeout: 200,
110
- maxTimeout: 1e4,
111
- factor: 2
112
- };
113
- if (typeof options === "number") {
114
- return { ...defaults, retries: options };
115
- }
116
- return options ? { ...defaults, ...options } : defaults;
117
- }
118
- // @__NO_SIDE_EFFECTS__
119
- async function pEach(array, callbackFn, options) {
120
- const iterOpts = /* @__PURE__ */ normalizeIterationOptions(options);
121
- const { concurrency, retries, signal } = iterOpts;
122
- const chunks = (0, import_arrays.arrayChunk)(array, concurrency);
123
- for (const chunk of chunks) {
124
- if (signal?.aborted) {
125
- return;
126
- }
127
- await Promise.all(
128
- chunk.map(
129
- (item) => /* @__PURE__ */ pRetry((...args) => callbackFn(args[0]), {
130
- ...retries,
131
- args: [item],
132
- signal
133
- })
134
- )
135
- );
136
- }
137
- }
138
- // @__NO_SIDE_EFFECTS__
139
- async function pFilter(array, callbackFn, options) {
140
- const iterOpts = /* @__PURE__ */ normalizeIterationOptions(options);
141
- return (await /* @__PURE__ */ pFilterChunk(
142
- (0, import_arrays.arrayChunk)(array, iterOpts.concurrency),
143
- callbackFn,
144
- iterOpts.retries
145
- )).flat();
146
- }
147
- // @__NO_SIDE_EFFECTS__
148
- async function pEachChunk(array, callbackFn, options) {
149
- const { chunkSize = 100, ...retryOpts } = options || {};
150
- const chunks = (0, import_arrays.arrayChunk)(array, chunkSize);
151
- const normalizedRetryOpts = /* @__PURE__ */ normalizeRetryOptions(retryOpts);
152
- const { signal } = normalizedRetryOpts;
153
- for (const chunk of chunks) {
154
- if (signal?.aborted) {
155
- return;
156
- }
157
- await /* @__PURE__ */ pRetry((...args) => callbackFn(args[0]), {
158
- ...normalizedRetryOpts,
159
- args: [chunk]
160
- });
161
- }
162
- }
163
- // @__NO_SIDE_EFFECTS__
164
- async function pFilterChunk(chunks, callbackFn, options) {
165
- const retryOpts = /* @__PURE__ */ normalizeRetryOptions(options);
166
- const { signal } = retryOpts;
167
- const { length } = chunks;
168
- const filteredChunks = Array(length);
169
- for (let i = 0; i < length; i += 1) {
170
- if (signal?.aborted) {
171
- filteredChunks[i] = [];
172
- } else {
173
- const chunk = chunks[i];
174
- const predicateResults = await Promise.all(
175
- chunk.map(
176
- (value) => /* @__PURE__ */ pRetry((...args) => callbackFn(args[0]), {
177
- ...retryOpts,
178
- args: [value]
179
- })
180
- )
181
- );
182
- filteredChunks[i] = chunk.filter((_v, i2) => predicateResults[i2]);
183
- }
184
- }
185
- return filteredChunks;
186
- }
187
- // @__NO_SIDE_EFFECTS__
188
- async function pRetry(callbackFn, options) {
189
- const {
190
- args,
191
- backoffFactor,
192
- baseDelayMs,
193
- jitter,
194
- maxDelayMs,
195
- onRetry,
196
- onRetryCancelOnFalse,
197
- onRetryRethrow,
198
- retries,
199
- signal
200
- } = /* @__PURE__ */ normalizeRetryOptions(options);
201
- if (signal?.aborted) {
202
- return void 0;
203
- }
204
- if (retries === 0) {
205
- return await callbackFn(...args || [], { signal });
206
- }
207
- const timers = /* @__PURE__ */ getTimers();
208
- let attempts = retries;
209
- let delay = baseDelayMs;
210
- let error = import_core.UNDEFINED_TOKEN;
211
- while (attempts-- >= 0) {
212
- if (signal?.aborted) {
213
- return void 0;
214
- }
215
- try {
216
- return await callbackFn(...args || [], { signal });
217
- } catch (e) {
218
- if (error === import_core.UNDEFINED_TOKEN) {
219
- error = e;
220
- }
221
- if (attempts < 0) {
222
- break;
223
- }
224
- let waitTime = delay;
225
- if (jitter) {
226
- waitTime += Math.floor(Math.random() * delay);
227
- }
228
- waitTime = Math.min(waitTime, maxDelayMs);
229
- if (typeof onRetry === "function") {
230
- try {
231
- const result = onRetry(retries - attempts, e, waitTime);
232
- if (result === false && onRetryCancelOnFalse) {
233
- break;
234
- }
235
- if (typeof result === "number" && result >= 0) {
236
- waitTime = Math.min(result, maxDelayMs);
237
- }
238
- } catch (e2) {
239
- if (onRetryRethrow) {
240
- throw e2;
241
- }
242
- }
243
- }
244
- try {
245
- await timers.setTimeout(waitTime, void 0, { signal });
246
- } catch {
247
- return void 0;
248
- }
249
- if (signal?.aborted) {
250
- return void 0;
251
- }
252
- delay = Math.min(delay * backoffFactor, maxDelayMs);
253
- }
254
- }
255
- if (error !== import_core.UNDEFINED_TOKEN) {
256
- throw error;
257
- }
258
- return void 0;
259
- }
260
- // Annotate the CommonJS export names for ESM import in node:
261
- 0 && (module.exports = {
262
- normalizeIterationOptions,
263
- normalizeRetryOptions,
264
- pEach,
265
- pEachChunk,
266
- pFilter,
267
- pFilterChunk,
268
- pRetry,
269
- resolveRetryOptions
270
- });
2
+ var g=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var z=Object.prototype.hasOwnProperty;var I=(n,e)=>{for(var r in e)g(n,r,{get:e[r],enumerable:!0})},v=(n,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of S(e))!z.call(n,t)&&t!==r&&g(n,t,{get:()=>e[t],enumerable:!(o=F(e,t))||o.enumerable});return n};var A=n=>v(g({},"__esModule",{value:!0}),n);var K={};I(K,{normalizeIterationOptions:()=>w,normalizeRetryOptions:()=>y,pEach:()=>j,pEachChunk:()=>q,pFilter:()=>N,pFilterChunk:()=>C,pRetry:()=>h,resolveRetryOptions:()=>x});module.exports=A(K);var T=require("#constants/core"),M=require("#constants/process"),O=require("./arrays");const P=(0,M.getAbortSignal)();let k;function E(){return k===void 0&&(k=require("node:timers/promises")),k}function w(n){const e=typeof n=="number"?{concurrency:n}:n,{concurrency:r=1,retries:o,signal:t=P}={__proto__:null,...e};return{__proto__:null,concurrency:Math.max(1,r),retries:y({signal:t,...x(o)}),signal:t}}function y(n){const e=x(n),{args:r=[],backoffFactor:o=e.factor||2,baseDelayMs:t=e.minTimeout||200,jitter:u=!0,maxDelayMs:i=e.maxTimeout||1e4,onRetry:s,onRetryCancelOnFalse:c=!1,onRetryRethrow:f=!1,retries:m=e.retries||0,signal:a=P}=e;return{args:r,backoffFactor:o,baseDelayMs:t,jitter:u,maxDelayMs:i,minTimeout:t,maxTimeout:i,onRetry:s,onRetryCancelOnFalse:c,onRetryRethrow:f,retries:m,signal:a}}function x(n){const e={__proto__:null,retries:0,minTimeout:200,maxTimeout:1e4,factor:2};return typeof n=="number"?{...e,retries:n}:n?{...e,...n}:e}async function j(n,e,r){const o=w(r),{concurrency:t,retries:u,signal:i}=o,s=(0,O.arrayChunk)(n,t);for(const c of s){if(i?.aborted)return;await Promise.all(c.map(f=>h((...m)=>e(m[0]),{...u,args:[f],signal:i})))}}async function N(n,e,r){const o=w(r);return(await C((0,O.arrayChunk)(n,o.concurrency),e,o.retries)).flat()}async function q(n,e,r){const{chunkSize:o=100,...t}=r||{},u=(0,O.arrayChunk)(n,o),i=y(t),{signal:s}=i;for(const c of u){if(s?.aborted)return;await h((...f)=>e(f[0]),{...i,args:[c]})}}async function C(n,e,r){const o=y(r),{signal:t}=o,{length:u}=n,i=Array(u);for(let s=0;s<u;s+=1)if(t?.aborted)i[s]=[];else{const c=n[s],f=await Promise.all(c.map(m=>h((...a)=>e(a[0]),{...o,args:[m]})));i[s]=c.filter((m,a)=>f[a])}return i}async function h(n,e){const{args:r,backoffFactor:o,baseDelayMs:t,jitter:u,maxDelayMs:i,onRetry:s,onRetryCancelOnFalse:c,onRetryRethrow:f,retries:m,signal:a}=y(e);if(a?.aborted)return;if(m===0)return await n(...r||[],{signal:a});const D=E();let R=m,p=t,b=T.UNDEFINED_TOKEN;for(;R-->=0;){if(a?.aborted)return;try{return await n(...r||[],{signal:a})}catch(_){if(b===T.UNDEFINED_TOKEN&&(b=_),R<0)break;let d=p;if(u&&(d+=Math.floor(Math.random()*p)),d=Math.min(d,i),typeof s=="function")try{const l=s(m-R,_,d);if(l===!1&&c)break;typeof l=="number"&&l>=0&&(d=Math.min(l,i))}catch(l){if(f)throw l}try{await D.setTimeout(d,void 0,{signal:a})}catch{return}if(a?.aborted)return;p=Math.min(p*o,i)}}if(b!==T.UNDEFINED_TOKEN)throw b}0&&(module.exports={normalizeIterationOptions,normalizeRetryOptions,pEach,pEachChunk,pFilter,pFilterChunk,pRetry,resolveRetryOptions});
271
3
  //# sourceMappingURL=promises.js.map
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/promises.ts"],
4
4
  "sourcesContent": ["/**\n * @fileoverview Promise utilities including chunked iteration and timers.\n * Provides async control flow helpers and promise-based timing functions.\n */\n\nimport { UNDEFINED_TOKEN } from '#constants/core'\nimport { getAbortSignal } from '#constants/process'\n\nimport { arrayChunk } from './arrays'\n\nconst abortSignal = getAbortSignal()\n\n/**\n * Configuration options for retry behavior with exponential backoff.\n *\n * Controls how failed operations are retried, including timing, backoff strategy,\n * and callback hooks for observing or modifying retry behavior.\n */\nexport interface RetryOptions {\n /**\n * Arguments to pass to the callback function on each attempt.\n *\n * @default []\n */\n args?: unknown[] | undefined\n\n /**\n * Multiplier for exponential backoff (e.g., 2 doubles delay each retry).\n * Each retry waits `baseDelayMs * (backoffFactor ** attemptNumber)`.\n *\n * @default 2\n * @example\n * // With backoffFactor: 2, baseDelayMs: 100\n * // Retry 1: 100ms\n * // Retry 2: 200ms\n * // Retry 3: 400ms\n */\n backoffFactor?: number | undefined\n\n /**\n * Initial delay before the first retry (in milliseconds).\n * This is the base value for exponential backoff calculations.\n *\n * @default 200\n */\n baseDelayMs?: number | undefined\n\n /**\n * Legacy alias for `backoffFactor`. Use `backoffFactor` instead.\n *\n * @deprecated Use `backoffFactor` instead\n * @default 2\n */\n factor?: number | undefined\n\n /**\n * Whether to apply randomness to spread out retries and avoid thundering herd.\n * When `true`, adds random delay between 0 and current delay value.\n *\n * @default true\n * @example\n * // With jitter: true, delay: 100ms\n * // Actual wait: 100ms + random(0-100ms) = 100-200ms\n */\n jitter?: boolean | undefined\n\n /**\n * Upper limit for any backoff delay (in milliseconds).\n * Prevents exponential backoff from growing unbounded.\n *\n * @default 10000\n */\n maxDelayMs?: number | undefined\n\n /**\n * Legacy alias for `maxDelayMs`. Use `maxDelayMs` instead.\n *\n * @deprecated Use `maxDelayMs` instead\n * @default 10000\n */\n maxTimeout?: number | undefined\n\n /**\n * Legacy alias for `baseDelayMs`. Use `baseDelayMs` instead.\n *\n * @deprecated Use `baseDelayMs` instead\n * @default 200\n */\n minTimeout?: number | undefined\n\n /**\n * Callback invoked on each retry attempt.\n * Can observe errors, customize delays, or cancel retries.\n *\n * @param attempt - The current attempt number (1-based: 1, 2, 3, ...)\n * @param error - The error that triggered this retry\n * @param delay - The calculated delay in milliseconds before next retry\n * @returns `false` to cancel retries (if `onRetryCancelOnFalse` is `true`),\n * a number to override the delay, or `undefined` to use calculated delay\n *\n * @example\n * // Log each retry\n * onRetry: (attempt, error, delay) => {\n * console.log(`Retry ${attempt} after ${delay}ms: ${error}`)\n * }\n *\n * @example\n * // Cancel retries for specific errors\n * onRetry: (attempt, error) => {\n * if (error instanceof ValidationError) return false\n * }\n *\n * @example\n * // Use custom delay\n * onRetry: (attempt) => attempt * 1000 // 1s, 2s, 3s, ...\n */\n onRetry?:\n | ((\n attempt: number,\n error: unknown,\n delay: number,\n ) => boolean | number | undefined)\n | undefined\n\n /**\n * Whether `onRetry` can cancel retries by returning `false`.\n * When `true`, returning `false` from `onRetry` stops retry attempts.\n *\n * @default false\n */\n onRetryCancelOnFalse?: boolean | undefined\n\n /**\n * Whether errors thrown by `onRetry` should propagate.\n * When `true`, exceptions in `onRetry` terminate the retry loop.\n * When `false`, exceptions in `onRetry` are silently caught.\n *\n * @default false\n */\n onRetryRethrow?: boolean | undefined\n\n /**\n * Number of retry attempts (0 = no retries, only initial attempt).\n * The callback is executed `retries + 1` times total (initial + retries).\n *\n * @default 0\n * @example\n * // retries: 0 -> 1 total attempt (no retries)\n * // retries: 3 -> 4 total attempts (1 initial + 3 retries)\n */\n retries?: number | undefined\n\n /**\n * AbortSignal to support cancellation of retry operations.\n * When aborted, immediately stops retrying and returns `undefined`.\n *\n * @default process abort signal\n * @example\n * const controller = new AbortController()\n * pRetry(fn, { signal: controller.signal })\n * // Later: controller.abort() to cancel\n */\n signal?: AbortSignal | undefined\n}\n\n/**\n * Configuration options for iteration functions with concurrency control.\n *\n * Controls how array operations are parallelized and retried.\n */\nexport interface IterationOptions {\n /**\n * The number of concurrent executions performed at one time.\n * Higher values increase parallelism but may overwhelm resources.\n *\n * @default 1\n * @example\n * // Process 5 items at a time\n * await pEach(items, processItem, { concurrency: 5 })\n */\n concurrency?: number | undefined\n\n /**\n * Retry configuration as a number (retry count) or full options object.\n * Applied to each individual item's callback execution.\n *\n * @default 0 (no retries)\n * @example\n * // Simple: retry each item up to 3 times\n * await pEach(items, fetchItem, { retries: 3 })\n *\n * @example\n * // Advanced: custom backoff for each item\n * await pEach(items, fetchItem, {\n * retries: {\n * retries: 3,\n * baseDelayMs: 1000,\n * backoffFactor: 2\n * }\n * })\n */\n retries?: number | RetryOptions | undefined\n\n /**\n * AbortSignal to support cancellation of the entire iteration.\n * When aborted, stops processing remaining items.\n *\n * @default process abort signal\n */\n signal?: AbortSignal | undefined\n}\n\nlet _timers: typeof import('node:timers/promises') | undefined\n/**\n * Get the timers/promises module.\n * Uses lazy loading to avoid Webpack bundling issues.\n *\n * @private\n * @returns The Node.js timers/promises module\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction getTimers() {\n if (_timers === undefined) {\n // Use non-'node:' prefixed require to avoid Webpack errors.\n\n _timers = /*@__PURE__*/ require('node:timers/promises')\n }\n return _timers as typeof import('node:timers/promises')\n}\n\n/**\n * Normalize options for iteration functions.\n *\n * Converts various option formats into a consistent structure with defaults applied.\n * Handles number shorthand for concurrency and ensures minimum values.\n *\n * @param options - Concurrency as number, or full options object, or undefined\n * @returns Normalized options with concurrency, retries, and signal\n *\n * @example\n * // Number shorthand for concurrency\n * normalizeIterationOptions(5)\n * // => { concurrency: 5, retries: {...}, signal: AbortSignal }\n *\n * @example\n * // Full options\n * normalizeIterationOptions({ concurrency: 3, retries: 2 })\n * // => { concurrency: 3, retries: {...}, signal: AbortSignal }\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function normalizeIterationOptions(\n options?: number | IterationOptions | undefined,\n): { concurrency: number; retries: RetryOptions; signal: AbortSignal } {\n // Handle number as concurrency shorthand\n const opts = typeof options === 'number' ? { concurrency: options } : options\n\n const {\n // The number of concurrent executions performed at one time.\n concurrency = 1,\n // Retries as a number or options object.\n retries,\n // AbortSignal used to support cancellation.\n signal = abortSignal,\n } = { __proto__: null, ...opts } as IterationOptions\n\n // Ensure concurrency is at least 1\n const normalizedConcurrency = Math.max(1, concurrency)\n const retryOpts = resolveRetryOptions(retries)\n return {\n __proto__: null,\n concurrency: normalizedConcurrency,\n retries: normalizeRetryOptions({ signal, ...retryOpts }),\n signal,\n } as { concurrency: number; retries: RetryOptions; signal: AbortSignal }\n}\n\n/**\n * Normalize options for retry functionality.\n *\n * Converts various retry option formats into a complete configuration with all defaults.\n * Handles legacy property names (`factor`, `minTimeout`, `maxTimeout`) and merges them\n * with modern equivalents.\n *\n * @param options - Retry count as number, or full options object, or undefined\n * @returns Normalized retry options with all properties set\n *\n * @example\n * // Number shorthand\n * normalizeRetryOptions(3)\n * // => { retries: 3, baseDelayMs: 200, backoffFactor: 2, ... }\n *\n * @example\n * // Full options with defaults filled in\n * normalizeRetryOptions({ retries: 5, baseDelayMs: 500 })\n * // => { retries: 5, baseDelayMs: 500, backoffFactor: 2, jitter: true, ... }\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function normalizeRetryOptions(\n options?: number | RetryOptions | undefined,\n): RetryOptions {\n const resolved = resolveRetryOptions(options)\n const {\n // Arguments to pass to the callback function.\n args = [],\n // Multiplier for exponential backoff (e.g., 2 doubles delay each retry).\n backoffFactor = resolved.factor || 2,\n // Initial delay before the first retry (in milliseconds).\n baseDelayMs = resolved.minTimeout || 200,\n // Whether to apply randomness to spread out retries.\n jitter = true,\n // Upper limit for any backoff delay (in milliseconds).\n maxDelayMs = resolved.maxTimeout || 10_000,\n // Optional callback invoked on each retry attempt:\n // (attempt: number, error: unknown, delay: number) => void\n onRetry,\n // Whether onRetry can cancel retries by returning `false`.\n onRetryCancelOnFalse = false,\n // Whether onRetry will rethrow errors.\n onRetryRethrow = false,\n // Number of retry attempts (0 = no retries, only initial attempt).\n retries = resolved.retries || 0,\n // AbortSignal used to support cancellation.\n signal = abortSignal,\n } = resolved\n return {\n args,\n backoffFactor,\n baseDelayMs,\n jitter,\n maxDelayMs,\n minTimeout: baseDelayMs,\n maxTimeout: maxDelayMs,\n onRetry,\n onRetryCancelOnFalse,\n onRetryRethrow,\n retries,\n signal,\n } as RetryOptions\n}\n\n/**\n * Resolve retry options from various input formats.\n *\n * Converts shorthand and partial options into a base configuration that can be\n * further normalized. This is an internal helper for option processing.\n *\n * @param options - Retry count as number, or partial options object, or undefined\n * @returns Resolved retry options with defaults for basic properties\n *\n * @example\n * resolveRetryOptions(3)\n * // => { retries: 3, minTimeout: 200, maxTimeout: 10000, factor: 2 }\n *\n * @example\n * resolveRetryOptions({ retries: 5, maxTimeout: 5000 })\n * // => { retries: 5, minTimeout: 200, maxTimeout: 5000, factor: 2 }\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function resolveRetryOptions(\n options?: number | RetryOptions | undefined,\n): RetryOptions {\n const defaults = {\n __proto__: null,\n retries: 0,\n minTimeout: 200,\n maxTimeout: 10_000,\n factor: 2,\n }\n\n if (typeof options === 'number') {\n return { ...defaults, retries: options }\n }\n\n return options ? { ...defaults, ...options } : defaults\n}\n\n/**\n * Execute an async function for each array element with concurrency control.\n *\n * Processes array items in parallel batches (chunks) with configurable concurrency.\n * Each item's callback can be retried independently on failure. Similar to\n * `Promise.all(array.map(fn))` but with controlled parallelism.\n *\n * @template T - The type of array elements\n * @param array - The array to iterate over\n * @param callbackFn - Async function to execute for each item\n * @param options - Concurrency as number, or full iteration options, or undefined\n * @returns Promise that resolves when all items are processed\n *\n * @example\n * // Process items serially (concurrency: 1)\n * await pEach(urls, async (url) => {\n * await fetch(url)\n * })\n *\n * @example\n * // Process 5 items at a time\n * await pEach(files, async (file) => {\n * await processFile(file)\n * }, 5)\n *\n * @example\n * // With retries and cancellation\n * const controller = new AbortController()\n * await pEach(tasks, async (task) => {\n * await executeTask(task)\n * }, {\n * concurrency: 3,\n * retries: 2,\n * signal: controller.signal\n * })\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport async function pEach<T>(\n array: T[],\n callbackFn: (item: T) => Promise<unknown>,\n options?: number | IterationOptions | undefined,\n): Promise<void> {\n const iterOpts = normalizeIterationOptions(options)\n const { concurrency, retries, signal } = iterOpts\n\n // Process items with concurrency control.\n const chunks = arrayChunk(array, concurrency)\n for (const chunk of chunks) {\n if (signal?.aborted) {\n return\n }\n // Process each item in the chunk concurrently.\n // eslint-disable-next-line no-await-in-loop\n await Promise.all(\n chunk.map((item: T) =>\n pRetry((...args: unknown[]) => callbackFn(args[0] as T), {\n ...retries,\n args: [item],\n signal,\n }),\n ),\n )\n }\n}\n\n/**\n * Filter an array asynchronously with concurrency control.\n *\n * Tests each element with an async predicate function, processing items in parallel\n * batches. Returns a new array with only items that pass the test. Similar to\n * `array.filter()` but for async predicates with controlled concurrency.\n *\n * @template T - The type of array elements\n * @param array - The array to filter\n * @param callbackFn - Async predicate function returning true to keep item\n * @param options - Concurrency as number, or full iteration options, or undefined\n * @returns Promise resolving to filtered array\n *\n * @example\n * // Filter serially\n * const activeUsers = await pFilter(users, async (user) => {\n * return await isUserActive(user.id)\n * })\n *\n * @example\n * // Filter with concurrency\n * const validFiles = await pFilter(filePaths, async (path) => {\n * try {\n * await fs.access(path)\n * return true\n * } catch {\n * return false\n * }\n * }, 10)\n *\n * @example\n * // With retries for flaky checks\n * const reachable = await pFilter(endpoints, async (url) => {\n * const response = await fetch(url)\n * return response.ok\n * }, {\n * concurrency: 5,\n * retries: 2\n * })\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport async function pFilter<T>(\n array: T[],\n callbackFn: (item: T) => Promise<boolean>,\n options?: number | IterationOptions | undefined,\n): Promise<T[]> {\n const iterOpts = normalizeIterationOptions(options)\n return (\n await pFilterChunk(\n arrayChunk(array, iterOpts.concurrency),\n callbackFn,\n iterOpts.retries,\n )\n ).flat()\n}\n\n/**\n * Process array in chunks with an async callback.\n *\n * Divides the array into fixed-size chunks and processes each chunk sequentially\n * with the callback. Useful for batch operations like bulk database inserts or\n * API calls with payload size limits.\n *\n * @template T - The type of array elements\n * @param array - The array to process in chunks\n * @param callbackFn - Async function to execute for each chunk\n * @param options - Chunk size and retry options\n * @returns Promise that resolves when all chunks are processed\n *\n * @example\n * // Insert records in batches of 100\n * await pEachChunk(records, async (chunk) => {\n * await db.batchInsert(chunk)\n * }, { chunkSize: 100 })\n *\n * @example\n * // Upload files in batches with retries\n * await pEachChunk(files, async (batch) => {\n * await uploadBatch(batch)\n * }, {\n * chunkSize: 50,\n * retries: 3,\n * baseDelayMs: 1000\n * })\n *\n * @example\n * // Process with cancellation support\n * const controller = new AbortController()\n * await pEachChunk(items, async (chunk) => {\n * await processChunk(chunk)\n * }, {\n * chunkSize: 25,\n * signal: controller.signal\n * })\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport async function pEachChunk<T>(\n array: T[],\n callbackFn: (chunk: T[]) => Promise<unknown>,\n options?: (RetryOptions & { chunkSize?: number | undefined }) | undefined,\n): Promise<void> {\n const { chunkSize = 100, ...retryOpts } = options || {}\n const chunks = arrayChunk(array, chunkSize)\n const normalizedRetryOpts = normalizeRetryOptions(retryOpts)\n const { signal } = normalizedRetryOpts\n for (const chunk of chunks) {\n if (signal?.aborted) {\n return\n }\n // eslint-disable-next-line no-await-in-loop\n await pRetry((...args: unknown[]) => callbackFn(args[0] as T[]), {\n ...normalizedRetryOpts,\n args: [chunk],\n })\n }\n}\n\n/**\n * Filter chunked arrays with an async predicate.\n *\n * Internal helper for `pFilter`. Processes pre-chunked arrays, applying the\n * predicate to each element within each chunk with retry support.\n *\n * @template T - The type of array elements\n * @param chunks - Pre-chunked array (array of arrays)\n * @param callbackFn - Async predicate function\n * @param options - Retry count as number, or full retry options, or undefined\n * @returns Promise resolving to array of filtered chunks\n *\n * @example\n * const chunks = [[1, 2], [3, 4], [5, 6]]\n * const filtered = await pFilterChunk(chunks, async (n) => n % 2 === 0)\n * // => [[2], [4], [6]]\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport async function pFilterChunk<T>(\n chunks: T[][],\n callbackFn: (value: T) => Promise<boolean>,\n options?: number | RetryOptions | undefined,\n): Promise<T[][]> {\n const retryOpts = normalizeRetryOptions(options)\n const { signal } = retryOpts\n const { length } = chunks\n const filteredChunks = Array(length)\n for (let i = 0; i < length; i += 1) {\n // Process each chunk, filtering based on the callback function.\n if (signal?.aborted) {\n filteredChunks[i] = []\n } else {\n const chunk = chunks[i] as T[]\n // eslint-disable-next-line no-await-in-loop\n const predicateResults = await Promise.all(\n chunk.map(value =>\n pRetry((...args: unknown[]) => callbackFn(args[0] as T), {\n ...retryOpts,\n args: [value],\n }),\n ),\n )\n filteredChunks[i] = chunk.filter((_v, i) => predicateResults[i])\n }\n }\n return filteredChunks\n}\n\n/**\n * Retry an async function with exponential backoff.\n *\n * Attempts to execute a function multiple times with increasing delays between attempts.\n * Implements exponential backoff with optional jitter to prevent thundering herd problems.\n * Supports custom retry logic via `onRetry` callback.\n *\n * The delay calculation follows: `min(baseDelayMs * (backoffFactor ** attempt), maxDelayMs)`\n * With jitter: adds random value between 0 and calculated delay.\n *\n * @template T - The return type of the callback function\n * @param callbackFn - Async function to retry\n * @param options - Retry count as number, or full retry options, or undefined\n * @returns Promise resolving to callback result, or `undefined` if aborted\n *\n * @throws {Error} The last error if all retry attempts fail\n *\n * @example\n * // Simple retry: 3 attempts with default backoff\n * const data = await pRetry(async () => {\n * return await fetchData()\n * }, 3)\n *\n * @example\n * // Custom backoff strategy\n * const result = await pRetry(async () => {\n * return await unreliableOperation()\n * }, {\n * retries: 5,\n * baseDelayMs: 1000, // Start at 1 second\n * backoffFactor: 2, // Double each time\n * maxDelayMs: 30000, // Cap at 30 seconds\n * jitter: true // Add randomness\n * })\n * // Delays: ~1s, ~2s, ~4s, ~8s, ~16s (each \u00B1 random jitter)\n *\n * @example\n * // With custom retry logic\n * const data = await pRetry(async () => {\n * return await apiCall()\n * }, {\n * retries: 3,\n * onRetry: (attempt, error, delay) => {\n * console.log(`Attempt ${attempt} failed: ${error}`)\n * console.log(`Waiting ${delay}ms before retry...`)\n *\n * // Cancel retries for client errors (4xx)\n * if (error.statusCode >= 400 && error.statusCode < 500) {\n * return false\n * }\n *\n * // Use longer delay for rate limit errors\n * if (error.statusCode === 429) {\n * return 60000 // Wait 1 minute\n * }\n * },\n * onRetryCancelOnFalse: true\n * })\n *\n * @example\n * // With cancellation support\n * const controller = new AbortController()\n * setTimeout(() => controller.abort(), 5000) // Cancel after 5s\n *\n * const result = await pRetry(async ({ signal }) => {\n * return await longRunningTask(signal)\n * }, {\n * retries: 10,\n * signal: controller.signal\n * })\n * // Returns undefined if aborted\n *\n * @example\n * // Pass arguments to callback\n * const result = await pRetry(\n * async (url, options) => {\n * return await fetch(url, options)\n * },\n * {\n * retries: 3,\n * args: ['https://api.example.com', { method: 'POST' }]\n * }\n * )\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport async function pRetry<T>(\n callbackFn: (...args: unknown[]) => Promise<T>,\n options?: number | RetryOptions | undefined,\n): Promise<T | undefined> {\n const {\n args,\n backoffFactor,\n baseDelayMs,\n jitter,\n maxDelayMs,\n onRetry,\n onRetryCancelOnFalse,\n onRetryRethrow,\n retries,\n signal,\n } = normalizeRetryOptions(options)\n if (signal?.aborted) {\n return undefined\n }\n if (retries === 0) {\n return await callbackFn(...(args || []), { signal })\n }\n\n const timers = getTimers()\n\n let attempts = retries as number\n let delay = baseDelayMs as number\n let error: unknown = UNDEFINED_TOKEN\n\n while (attempts-- >= 0) {\n // Check abort before attempt.\n if (signal?.aborted) {\n return undefined\n }\n\n try {\n // eslint-disable-next-line no-await-in-loop\n return await callbackFn(...(args || []), { signal })\n } catch (e) {\n if (error === UNDEFINED_TOKEN) {\n error = e\n }\n if (attempts < 0) {\n break\n }\n let waitTime = delay\n if (jitter) {\n // Add randomness: Pick a value between 0 and `delay`.\n waitTime += Math.floor(Math.random() * delay)\n }\n // Clamp wait time to max delay.\n waitTime = Math.min(waitTime, maxDelayMs as number)\n if (typeof onRetry === 'function') {\n try {\n const result = onRetry((retries as number) - attempts, e, waitTime)\n if (result === false && onRetryCancelOnFalse) {\n break\n }\n // If onRetry returns a number, use it as the custom delay.\n if (typeof result === 'number' && result >= 0) {\n waitTime = Math.min(result, maxDelayMs as number)\n }\n } catch (e) {\n if (onRetryRethrow) {\n throw e\n }\n }\n }\n\n try {\n // eslint-disable-next-line no-await-in-loop\n await timers.setTimeout(waitTime, undefined, { signal })\n } catch {\n // setTimeout was aborted.\n return undefined\n }\n\n // Check abort again after delay.\n if (signal?.aborted) {\n return undefined\n }\n\n // Exponentially increase the delay for the next attempt, capping at maxDelayMs.\n delay = Math.min(delay * (backoffFactor as number), maxDelayMs as number)\n }\n }\n if (error !== UNDEFINED_TOKEN) {\n throw error\n }\n return undefined\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,kBAAgC;AAChC,qBAA+B;AAE/B,oBAA2B;AAE3B,MAAM,kBAAc,+BAAe;AA0MnC,IAAI;AAAA;AASJ,SAAS,YAAY;AACnB,MAAI,YAAY,QAAW;AAGzB,cAAwB,QAAQ,sBAAsB;AAAA,EACxD;AACA,SAAO;AACT;AAAA;AAsBO,SAAS,0BACd,SACqE;AAErE,QAAM,OAAO,OAAO,YAAY,WAAW,EAAE,aAAa,QAAQ,IAAI;AAEtE,QAAM;AAAA;AAAA,IAEJ,cAAc;AAAA;AAAA,IAEd;AAAA;AAAA,IAEA,SAAS;AAAA,EACX,IAAI,EAAE,WAAW,MAAM,GAAG,KAAK;AAG/B,QAAM,wBAAwB,KAAK,IAAI,GAAG,WAAW;AACrD,QAAM,YAAY,oCAAoB,OAAO;AAC7C,SAAO;AAAA,IACL,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS,sCAAsB,EAAE,QAAQ,GAAG,UAAU,CAAC;AAAA,IACvD;AAAA,EACF;AACF;AAAA;AAuBO,SAAS,sBACd,SACc;AACd,QAAM,WAAW,oCAAoB,OAAO;AAC5C,QAAM;AAAA;AAAA,IAEJ,OAAO,CAAC;AAAA;AAAA,IAER,gBAAgB,SAAS,UAAU;AAAA;AAAA,IAEnC,cAAc,SAAS,cAAc;AAAA;AAAA,IAErC,SAAS;AAAA;AAAA,IAET,aAAa,SAAS,cAAc;AAAA;AAAA;AAAA,IAGpC;AAAA;AAAA,IAEA,uBAAuB;AAAA;AAAA,IAEvB,iBAAiB;AAAA;AAAA,IAEjB,UAAU,SAAS,WAAW;AAAA;AAAA,IAE9B,SAAS;AAAA,EACX,IAAI;AACJ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAAA;AAoBO,SAAS,oBACd,SACc;AACd,QAAM,WAAW;AAAA,IACf,WAAW;AAAA,IACX,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AAEA,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO,EAAE,GAAG,UAAU,SAAS,QAAQ;AAAA,EACzC;AAEA,SAAO,UAAU,EAAE,GAAG,UAAU,GAAG,QAAQ,IAAI;AACjD;AAAA;AAuCA,eAAsB,MACpB,OACA,YACA,SACe;AACf,QAAM,WAAW,0CAA0B,OAAO;AAClD,QAAM,EAAE,aAAa,SAAS,OAAO,IAAI;AAGzC,QAAM,aAAS,0BAAW,OAAO,WAAW;AAC5C,aAAW,SAAS,QAAQ;AAC1B,QAAI,QAAQ,SAAS;AACnB;AAAA,IACF;AAGA,UAAM,QAAQ;AAAA,MACZ,MAAM;AAAA,QAAI,CAAC,SACT,uBAAO,IAAI,SAAoB,WAAW,KAAK,CAAC,CAAM,GAAG;AAAA,UACvD,GAAG;AAAA,UACH,MAAM,CAAC,IAAI;AAAA,UACX;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;AAAA;AA2CA,eAAsB,QACpB,OACA,YACA,SACc;AACd,QAAM,WAAW,0CAA0B,OAAO;AAClD,UACE,MAAM;AAAA,QACJ,0BAAW,OAAO,SAAS,WAAW;AAAA,IACtC;AAAA,IACA,SAAS;AAAA,EACX,GACA,KAAK;AACT;AAAA;AA0CA,eAAsB,WACpB,OACA,YACA,SACe;AACf,QAAM,EAAE,YAAY,KAAK,GAAG,UAAU,IAAI,WAAW,CAAC;AACtD,QAAM,aAAS,0BAAW,OAAO,SAAS;AAC1C,QAAM,sBAAsB,sCAAsB,SAAS;AAC3D,QAAM,EAAE,OAAO,IAAI;AACnB,aAAW,SAAS,QAAQ;AAC1B,QAAI,QAAQ,SAAS;AACnB;AAAA,IACF;AAEA,UAAM,uBAAO,IAAI,SAAoB,WAAW,KAAK,CAAC,CAAQ,GAAG;AAAA,MAC/D,GAAG;AAAA,MACH,MAAM,CAAC,KAAK;AAAA,IACd,CAAC;AAAA,EACH;AACF;AAAA;AAoBA,eAAsB,aACpB,QACA,YACA,SACgB;AAChB,QAAM,YAAY,sCAAsB,OAAO;AAC/C,QAAM,EAAE,OAAO,IAAI;AACnB,QAAM,EAAE,OAAO,IAAI;AACnB,QAAM,iBAAiB,MAAM,MAAM;AACnC,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK,GAAG;AAElC,QAAI,QAAQ,SAAS;AACnB,qBAAe,CAAC,IAAI,CAAC;AAAA,IACvB,OAAO;AACL,YAAM,QAAQ,OAAO,CAAC;AAEtB,YAAM,mBAAmB,MAAM,QAAQ;AAAA,QACrC,MAAM;AAAA,UAAI,WACR,uBAAO,IAAI,SAAoB,WAAW,KAAK,CAAC,CAAM,GAAG;AAAA,YACvD,GAAG;AAAA,YACH,MAAM,CAAC,KAAK;AAAA,UACd,CAAC;AAAA,QACH;AAAA,MACF;AACA,qBAAe,CAAC,IAAI,MAAM,OAAO,CAAC,IAAIA,OAAM,iBAAiBA,EAAC,CAAC;AAAA,IACjE;AAAA,EACF;AACA,SAAO;AACT;AAAA;AAuFA,eAAsB,OACpB,YACA,SACwB;AACxB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,sCAAsB,OAAO;AACjC,MAAI,QAAQ,SAAS;AACnB,WAAO;AAAA,EACT;AACA,MAAI,YAAY,GAAG;AACjB,WAAO,MAAM,WAAW,GAAI,QAAQ,CAAC,GAAI,EAAE,OAAO,CAAC;AAAA,EACrD;AAEA,QAAM,SAAS,0BAAU;AAEzB,MAAI,WAAW;AACf,MAAI,QAAQ;AACZ,MAAI,QAAiB;AAErB,SAAO,cAAc,GAAG;AAEtB,QAAI,QAAQ,SAAS;AACnB,aAAO;AAAA,IACT;AAEA,QAAI;AAEF,aAAO,MAAM,WAAW,GAAI,QAAQ,CAAC,GAAI,EAAE,OAAO,CAAC;AAAA,IACrD,SAAS,GAAG;AACV,UAAI,UAAU,6BAAiB;AAC7B,gBAAQ;AAAA,MACV;AACA,UAAI,WAAW,GAAG;AAChB;AAAA,MACF;AACA,UAAI,WAAW;AACf,UAAI,QAAQ;AAEV,oBAAY,KAAK,MAAM,KAAK,OAAO,IAAI,KAAK;AAAA,MAC9C;AAEA,iBAAW,KAAK,IAAI,UAAU,UAAoB;AAClD,UAAI,OAAO,YAAY,YAAY;AACjC,YAAI;AACF,gBAAM,SAAS,QAAS,UAAqB,UAAU,GAAG,QAAQ;AAClE,cAAI,WAAW,SAAS,sBAAsB;AAC5C;AAAA,UACF;AAEA,cAAI,OAAO,WAAW,YAAY,UAAU,GAAG;AAC7C,uBAAW,KAAK,IAAI,QAAQ,UAAoB;AAAA,UAClD;AAAA,QACF,SAASC,IAAG;AACV,cAAI,gBAAgB;AAClB,kBAAMA;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,UAAI;AAEF,cAAM,OAAO,WAAW,UAAU,QAAW,EAAE,OAAO,CAAC;AAAA,MACzD,QAAQ;AAEN,eAAO;AAAA,MACT;AAGA,UAAI,QAAQ,SAAS;AACnB,eAAO;AAAA,MACT;AAGA,cAAQ,KAAK,IAAI,QAAS,eAA0B,UAAoB;AAAA,IAC1E;AAAA,EACF;AACA,MAAI,UAAU,6BAAiB;AAC7B,UAAM;AAAA,EACR;AACA,SAAO;AACT;",
6
- "names": ["i", "e"]
5
+ "mappings": "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",
6
+ "names": ["promises_exports", "__export", "normalizeIterationOptions", "normalizeRetryOptions", "pEach", "pEachChunk", "pFilter", "pFilterChunk", "pRetry", "resolveRetryOptions", "__toCommonJS", "import_core", "import_process", "import_arrays", "abortSignal", "_timers", "getTimers", "options", "opts", "concurrency", "retries", "signal", "resolved", "args", "backoffFactor", "baseDelayMs", "jitter", "maxDelayMs", "onRetry", "onRetryCancelOnFalse", "onRetryRethrow", "defaults", "array", "callbackFn", "iterOpts", "chunks", "chunk", "item", "chunkSize", "retryOpts", "normalizedRetryOpts", "length", "filteredChunks", "i", "predicateResults", "value", "_v", "timers", "attempts", "delay", "error", "e", "waitTime", "result"]
7
7
  }