@js-recon/js-recon 1.4.4 → 2.0.1-alpha.2

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 (440) hide show
  1. package/.claude-sync/sync.sh +1 -1
  2. package/.github/dependabot.yml +50 -0
  3. package/.github/workflows/build-and-prettify.yaml +49 -19
  4. package/.github/workflows/codeql.yml +33 -0
  5. package/.github/workflows/exploit-smoke-test.yaml +160 -0
  6. package/.github/workflows/framework-detection-smoke-test.yaml +135 -0
  7. package/.github/workflows/plumber.yml +20 -0
  8. package/.github/workflows/promote-js-recon.yml +5 -3
  9. package/.github/workflows/publish-js-recon.yml +31 -2
  10. package/.github/workflows/rules-smoke-test.yaml +13 -5
  11. package/.nvmrc +1 -0
  12. package/.plumber.yaml +151 -0
  13. package/CHANGELOG.md +55 -0
  14. package/CONTRIBUTING.md +32 -0
  15. package/Dockerfile +1 -0
  16. package/README.md +3 -2
  17. package/SECURITY.md +1 -1
  18. package/build/analyze/engine/astEngine.js +10 -9
  19. package/build/analyze/engine/astEngine.js.map +1 -1
  20. package/build/analyze/engine/csMastSEngine.js +6 -6
  21. package/build/analyze/engine/csMastSEngine.js.map +1 -1
  22. package/build/analyze/engine/index.js +1 -1
  23. package/build/analyze/engine/index.js.map +1 -1
  24. package/build/analyze/engine/requestEngine.js +6 -6
  25. package/build/analyze/engine/requestEngine.js.map +1 -1
  26. package/build/analyze/helpers/determineCompatibleVersion.js +70 -0
  27. package/build/analyze/helpers/determineCompatibleVersion.js.map +1 -0
  28. package/build/analyze/helpers/engineHelpers/findMemberExpressionAssignment.js +9 -3
  29. package/build/analyze/helpers/engineHelpers/findMemberExpressionAssignment.js.map +1 -1
  30. package/build/analyze/helpers/initRules.js +9 -9
  31. package/build/analyze/helpers/initRules.js.map +1 -1
  32. package/build/analyze/helpers/outputHelper.js +3 -3
  33. package/build/analyze/helpers/outputHelper.js.map +1 -1
  34. package/build/analyze/helpers/schemas.js +1 -0
  35. package/build/analyze/helpers/schemas.js.map +1 -1
  36. package/build/analyze/helpers/validate.js +9 -5
  37. package/build/analyze/helpers/validate.js.map +1 -1
  38. package/build/analyze/index.js +26 -16
  39. package/build/analyze/index.js.map +1 -1
  40. package/build/cliProgram.js +733 -0
  41. package/build/cliProgram.js.map +1 -0
  42. package/build/completion/index.js +247 -382
  43. package/build/completion/index.js.map +1 -1
  44. package/build/completion/introspect.js +17 -0
  45. package/build/completion/introspect.js.map +1 -0
  46. package/build/config/applicationConfig.js +3 -2
  47. package/build/config/applicationConfig.js.map +1 -1
  48. package/build/cs_mast/index.js +18 -17
  49. package/build/cs_mast/index.js.map +1 -1
  50. package/build/endpoints/gen_report/gen_json.js +2 -2
  51. package/build/endpoints/gen_report/gen_json.js.map +1 -1
  52. package/build/endpoints/gen_report/utility/iterate_n_store.js +1 -1
  53. package/build/endpoints/gen_report/utility/iterate_n_store.js.map +1 -1
  54. package/build/endpoints/index.js +12 -12
  55. package/build/endpoints/index.js.map +1 -1
  56. package/build/endpoints/next_js/client_jsFilesHref.js +3 -3
  57. package/build/endpoints/next_js/client_jsFilesHref.js.map +1 -1
  58. package/build/endpoints/next_js/client_jsonParse.js +4 -4
  59. package/build/endpoints/next_js/client_jsonParse.js.map +1 -1
  60. package/build/endpoints/next_js/client_mappedJsonFile.js +6 -6
  61. package/build/endpoints/next_js/client_mappedJsonFile.js.map +1 -1
  62. package/build/endpoints/next_js/client_subsequentRequests.js +5 -5
  63. package/build/endpoints/next_js/client_subsequentRequests.js.map +1 -1
  64. package/build/exploit/angular/cve-2026-68945.js +61 -0
  65. package/build/exploit/angular/cve-2026-68945.js.map +1 -0
  66. package/build/exploit/index.js +60 -0
  67. package/build/exploit/index.js.map +1 -0
  68. package/build/exploit/next/cve-2025-29927.js +65 -0
  69. package/build/exploit/next/cve-2025-29927.js.map +1 -0
  70. package/build/exploit/next/cve-2026-64645.js +51 -0
  71. package/build/exploit/next/cve-2026-64645.js.map +1 -0
  72. package/build/exploit/nuxt/cve-2026-71315.js +47 -0
  73. package/build/exploit/nuxt/cve-2026-71315.js.map +1 -0
  74. package/build/exploit/nuxt/cve-2026-71320.js +114 -0
  75. package/build/exploit/nuxt/cve-2026-71320.js.map +1 -0
  76. package/build/exploit/react/cve-2025-55182.js +116 -0
  77. package/build/exploit/react/cve-2025-55182.js.map +1 -0
  78. package/build/exploit/registry/cveRegistry.js +115 -0
  79. package/build/exploit/registry/cveRegistry.js.map +1 -0
  80. package/build/exploit/types.js +2 -0
  81. package/build/exploit/types.js.map +1 -0
  82. package/build/exploit/utility/compareResponses.js +29 -0
  83. package/build/exploit/utility/compareResponses.js.map +1 -0
  84. package/build/exploit/utility/outputHelper.js +22 -0
  85. package/build/exploit/utility/outputHelper.js.map +1 -0
  86. package/build/exploit/utility/rawRequest.js +56 -0
  87. package/build/exploit/utility/rawRequest.js.map +1 -0
  88. package/build/exploit/utility/sandboxRce.js +49 -0
  89. package/build/exploit/utility/sandboxRce.js.map +1 -0
  90. package/build/exploit/utility/toEngineOutput.js +28 -0
  91. package/build/exploit/utility/toEngineOutput.js.map +1 -0
  92. package/build/exploit/utility/wsClient.js +78 -0
  93. package/build/exploit/utility/wsClient.js.map +1 -0
  94. package/build/exploit/vite/cve-2025-30208.js +44 -0
  95. package/build/exploit/vite/cve-2025-30208.js.map +1 -0
  96. package/build/exploit/vite/cve-2026-39363.js +60 -0
  97. package/build/exploit/vite/cve-2026-39363.js.map +1 -0
  98. package/build/fingerprint/index.js +3 -2
  99. package/build/fingerprint/index.js.map +1 -1
  100. package/build/globalConfig.js +2 -2
  101. package/build/globalConfig.js.map +1 -1
  102. package/build/index.js +5 -596
  103. package/build/index.js.map +1 -1
  104. package/build/lazyLoad/angular/angular_getFromPageSource.js +3 -3
  105. package/build/lazyLoad/angular/angular_getFromPageSource.js.map +1 -1
  106. package/build/lazyLoad/downloadFilesUtil.js +14 -11
  107. package/build/lazyLoad/downloadFilesUtil.js.map +1 -1
  108. package/build/lazyLoad/downloadQueue.js +9 -1
  109. package/build/lazyLoad/downloadQueue.js.map +1 -1
  110. package/build/lazyLoad/downloadResponse.js +1 -0
  111. package/build/lazyLoad/downloadResponse.js.map +1 -1
  112. package/build/lazyLoad/generic/generic_crawlPages.js +186 -0
  113. package/build/lazyLoad/generic/generic_crawlPages.js.map +1 -0
  114. package/build/lazyLoad/generic/generic_downloadFiles.js +81 -0
  115. package/build/lazyLoad/generic/generic_downloadFiles.js.map +1 -0
  116. package/build/lazyLoad/generic/generic_extractLinks.js +79 -0
  117. package/build/lazyLoad/generic/generic_extractLinks.js.map +1 -0
  118. package/build/lazyLoad/generic/generic_getScriptTags.js +152 -0
  119. package/build/lazyLoad/generic/generic_getScriptTags.js.map +1 -0
  120. package/build/lazyLoad/generic/generic_importMapDiscovery.js +87 -0
  121. package/build/lazyLoad/generic/generic_importMapDiscovery.js.map +1 -0
  122. package/build/lazyLoad/generic/generic_resolveScope.js +66 -0
  123. package/build/lazyLoad/generic/generic_resolveScope.js.map +1 -0
  124. package/build/lazyLoad/generic/generic_scanAttributesForJs.js +122 -0
  125. package/build/lazyLoad/generic/generic_scanAttributesForJs.js.map +1 -0
  126. package/build/lazyLoad/generic/generic_stringsDiscovery.js +103 -0
  127. package/build/lazyLoad/generic/generic_stringsDiscovery.js.map +1 -0
  128. package/build/lazyLoad/generic/generic_webpackChunkPaths.js +56 -0
  129. package/build/lazyLoad/generic/generic_webpackChunkPaths.js.map +1 -0
  130. package/build/lazyLoad/globals.js +31 -0
  131. package/build/lazyLoad/globals.js.map +1 -1
  132. package/build/lazyLoad/index.js +172 -75
  133. package/build/lazyLoad/index.js.map +1 -1
  134. package/build/lazyLoad/methodFilter.js +9 -1
  135. package/build/lazyLoad/methodFilter.js.map +1 -1
  136. package/build/lazyLoad/next_js/NextJsCrawler.js +98 -14
  137. package/build/lazyLoad/next_js/NextJsCrawler.js.map +1 -1
  138. package/build/lazyLoad/next_js/next_GetJSScript.js +3 -3
  139. package/build/lazyLoad/next_js/next_GetJSScript.js.map +1 -1
  140. package/build/lazyLoad/next_js/next_GetLazyResourcesBuildManifestJs.js +4 -4
  141. package/build/lazyLoad/next_js/next_GetLazyResourcesBuildManifestJs.js.map +1 -1
  142. package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js +17 -11
  143. package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js.map +1 -1
  144. package/build/lazyLoad/next_js/next_SubsequentRequests.js +7 -6
  145. package/build/lazyLoad/next_js/next_SubsequentRequests.js.map +1 -1
  146. package/build/lazyLoad/next_js/next_bruteForceJsFiles.js +1 -1
  147. package/build/lazyLoad/next_js/next_bruteForceJsFiles.js.map +1 -1
  148. package/build/lazyLoad/next_js/next_buildId.js +2 -2
  149. package/build/lazyLoad/next_js/next_buildId.js.map +1 -1
  150. package/build/lazyLoad/next_js/next_getClientSidePaths.js +2 -2
  151. package/build/lazyLoad/next_js/next_getClientSidePaths.js.map +1 -1
  152. package/build/lazyLoad/next_js/next_parseLayoutJs.js +6 -6
  153. package/build/lazyLoad/next_js/next_parseLayoutJs.js.map +1 -1
  154. package/build/lazyLoad/next_js/next_promiseResolve.js +1 -1
  155. package/build/lazyLoad/next_js/next_promiseResolve.js.map +1 -1
  156. package/build/lazyLoad/next_js/next_routerStateForge.js +407 -0
  157. package/build/lazyLoad/next_js/next_routerStateForge.js.map +1 -0
  158. package/build/lazyLoad/next_js/next_scriptTagsSubsequentRequests.js +1 -1
  159. package/build/lazyLoad/next_js/next_scriptTagsSubsequentRequests.js.map +1 -1
  160. package/build/lazyLoad/next_js/next_serverActionIdScan.js +77 -0
  161. package/build/lazyLoad/next_js/next_serverActionIdScan.js.map +1 -0
  162. package/build/lazyLoad/nuxt_js/nuxt_astParse.js +15 -13
  163. package/build/lazyLoad/nuxt_js/nuxt_astParse.js.map +1 -1
  164. package/build/lazyLoad/nuxt_js/nuxt_getBuildsManifest.js +2 -2
  165. package/build/lazyLoad/nuxt_js/nuxt_getBuildsManifest.js.map +1 -1
  166. package/build/lazyLoad/nuxt_js/nuxt_getFromPageSource.js +3 -3
  167. package/build/lazyLoad/nuxt_js/nuxt_getFromPageSource.js.map +1 -1
  168. package/build/lazyLoad/nuxt_js/nuxt_stringAnalysisJSFiles.js +29 -5
  169. package/build/lazyLoad/nuxt_js/nuxt_stringAnalysisJSFiles.js.map +1 -1
  170. package/build/lazyLoad/react/react_sourcemapUrls.js +7 -28
  171. package/build/lazyLoad/react/react_sourcemapUrls.js.map +1 -1
  172. package/build/lazyLoad/react/react_webpackChunkPaths.js +10 -202
  173. package/build/lazyLoad/react/react_webpackChunkPaths.js.map +1 -1
  174. package/build/lazyLoad/researchUtils.js +15 -0
  175. package/build/lazyLoad/researchUtils.js.map +1 -0
  176. package/build/lazyLoad/shared/webpackChunkParsers.js +218 -0
  177. package/build/lazyLoad/shared/webpackChunkParsers.js.map +1 -0
  178. package/build/lazyLoad/sourcemap.js +120 -0
  179. package/build/lazyLoad/sourcemap.js.map +1 -1
  180. package/build/lazyLoad/stagnation/stagnationMonitor.js +63 -0
  181. package/build/lazyLoad/stagnation/stagnationMonitor.js.map +1 -0
  182. package/build/lazyLoad/svelte/svelte_discoverPagesFromJs.js +1 -0
  183. package/build/lazyLoad/svelte/svelte_discoverPagesFromJs.js.map +1 -1
  184. package/build/lazyLoad/svelte/svelte_getFromPageSource.js +5 -5
  185. package/build/lazyLoad/svelte/svelte_getFromPageSource.js.map +1 -1
  186. package/build/lazyLoad/svelte/svelte_getVersionJson.js +2 -2
  187. package/build/lazyLoad/svelte/svelte_getVersionJson.js.map +1 -1
  188. package/build/lazyLoad/svelte/svelte_recursivePageCrawl.js +6 -6
  189. package/build/lazyLoad/svelte/svelte_recursivePageCrawl.js.map +1 -1
  190. package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js +15 -6
  191. package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js.map +1 -1
  192. package/build/lazyLoad/techDetect/checkAngularJS.js +1 -1
  193. package/build/lazyLoad/techDetect/checkAngularJS.js.map +1 -1
  194. package/build/lazyLoad/techDetect/checkNuxtJS.js +3 -3
  195. package/build/lazyLoad/techDetect/checkNuxtJS.js.map +1 -1
  196. package/build/lazyLoad/techDetect/checkSvelte.js +0 -1
  197. package/build/lazyLoad/techDetect/checkSvelte.js.map +1 -1
  198. package/build/lazyLoad/techDetect/checkVueJS.js +6 -6
  199. package/build/lazyLoad/techDetect/checkVueJS.js.map +1 -1
  200. package/build/lazyLoad/techDetect/index.js +17 -1
  201. package/build/lazyLoad/techDetect/index.js.map +1 -1
  202. package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js +2 -2
  203. package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js.map +1 -1
  204. package/build/lazyLoad/vue/vue_discoverJsFiles.js +13 -11
  205. package/build/lazyLoad/vue/vue_discoverJsFiles.js.map +1 -1
  206. package/build/lazyLoad/vue/vue_getClientSidePaths.js +1 -1
  207. package/build/lazyLoad/vue/vue_getClientSidePaths.js.map +1 -1
  208. package/build/lazyLoad/vue/vue_pageSrc.js +1 -1
  209. package/build/lazyLoad/vue/vue_pageSrc.js.map +1 -1
  210. package/build/lazyLoad/vue/vue_reconstructSourceMaps.js +12 -3
  211. package/build/lazyLoad/vue/vue_reconstructSourceMaps.js.map +1 -1
  212. package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js +2 -2
  213. package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js.map +1 -1
  214. package/build/lazyLoad/vue/vue_severalJsFilesHome.js +3 -3
  215. package/build/lazyLoad/vue/vue_severalJsFilesHome.js.map +1 -1
  216. package/build/load/index.js +28 -38
  217. package/build/load/index.js.map +1 -1
  218. package/build/map/angular_js/getAngularConnections.js +6 -6
  219. package/build/map/angular_js/getAngularConnections.js.map +1 -1
  220. package/build/map/graphql/resolveGraphql.js +6 -6
  221. package/build/map/graphql/resolveGraphql.js.map +1 -1
  222. package/build/map/index.js +17 -17
  223. package/build/map/index.js.map +1 -1
  224. package/build/map/interactive-mode/commandHandler.js +278 -0
  225. package/build/map/interactive-mode/commandHandler.js.map +1 -0
  226. package/build/map/interactive-mode/commandHelpers.js +189 -0
  227. package/build/map/interactive-mode/commandHelpers.js.map +1 -0
  228. package/build/map/interactive-mode/esqueryGen.js.map +1 -0
  229. package/build/map/interactive-mode/helpMenu.js +11 -0
  230. package/build/map/interactive-mode/helpMenu.js.map +1 -0
  231. package/build/map/interactive-mode/inputPatch.js.map +1 -0
  232. package/build/map/interactive-mode/interactive.js +71 -0
  233. package/build/map/interactive-mode/interactive.js.map +1 -0
  234. package/build/map/interactive-mode/keybindings.js.map +1 -0
  235. package/build/map/interactive-mode/printer.js.map +1 -0
  236. package/build/map/interactive-mode/ui.js.map +1 -0
  237. package/build/map/next_js/getAxiosInstances.js +5 -5
  238. package/build/map/next_js/getAxiosInstances.js.map +1 -1
  239. package/build/map/next_js/getExports.js +4 -4
  240. package/build/map/next_js/getExports.js.map +1 -1
  241. package/build/map/next_js/getFetchInstances.js +10 -10
  242. package/build/map/next_js/getFetchInstances.js.map +1 -1
  243. package/build/map/next_js/getTurbopackConnections.js +8 -8
  244. package/build/map/next_js/getTurbopackConnections.js.map +1 -1
  245. package/build/map/next_js/getWebpackConnections.js +27 -16
  246. package/build/map/next_js/getWebpackConnections.js.map +1 -1
  247. package/build/map/next_js/interactive.js +3 -65
  248. package/build/map/next_js/interactive.js.map +1 -1
  249. package/build/map/next_js/interactive_helpers/commandHandler.js +38 -290
  250. package/build/map/next_js/interactive_helpers/commandHandler.js.map +1 -1
  251. package/build/map/next_js/interactive_helpers/commandHelpers.js +0 -184
  252. package/build/map/next_js/interactive_helpers/commandHelpers.js.map +1 -1
  253. package/build/map/next_js/interactive_helpers/helpMenu.js +2 -10
  254. package/build/map/next_js/interactive_helpers/helpMenu.js.map +1 -1
  255. package/build/map/next_js/resolveAxios.js +6 -6
  256. package/build/map/next_js/resolveAxios.js.map +1 -1
  257. package/build/map/next_js/resolveAxiosHelpers/findAxiosClients.js +4 -4
  258. package/build/map/next_js/resolveAxiosHelpers/findAxiosClients.js.map +1 -1
  259. package/build/map/next_js/resolveAxiosHelpers/findAxiosInstance.js +2 -2
  260. package/build/map/next_js/resolveAxiosHelpers/findAxiosInstance.js.map +1 -1
  261. package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js +5 -5
  262. package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js.map +1 -1
  263. package/build/map/next_js/resolveAxiosHelpers/handleAxiosCreate.js +10 -10
  264. package/build/map/next_js/resolveAxiosHelpers/handleAxiosCreate.js.map +1 -1
  265. package/build/map/next_js/resolveAxiosHelpers/handleZDotCreate.js +13 -9
  266. package/build/map/next_js/resolveAxiosHelpers/handleZDotCreate.js.map +1 -1
  267. package/build/map/next_js/resolveAxiosHelpers/processAxiosCall.js +12 -8
  268. package/build/map/next_js/resolveAxiosHelpers/processAxiosCall.js.map +1 -1
  269. package/build/map/next_js/resolveAxiosHelpers/processDirectAxiosCall.js +12 -8
  270. package/build/map/next_js/resolveAxiosHelpers/processDirectAxiosCall.js.map +1 -1
  271. package/build/map/next_js/resolveAxiosHelpers/processExportedEndpoints.js +11 -11
  272. package/build/map/next_js/resolveAxiosHelpers/processExportedEndpoints.js.map +1 -1
  273. package/build/map/next_js/resolveAxiosHelpers/traceAxiosInstanceExports.js +16 -16
  274. package/build/map/next_js/resolveAxiosHelpers/traceAxiosInstanceExports.js.map +1 -1
  275. package/build/map/next_js/resolveFetch.js +23 -23
  276. package/build/map/next_js/resolveFetch.js.map +1 -1
  277. package/build/map/next_js/resolveNewRequest.js +10 -10
  278. package/build/map/next_js/resolveNewRequest.js.map +1 -1
  279. package/build/map/next_js/resolveServerActions.js +4 -4
  280. package/build/map/next_js/resolveServerActions.js.map +1 -1
  281. package/build/map/next_js/utils.js +8 -2
  282. package/build/map/next_js/utils.js.map +1 -1
  283. package/build/map/react_js/getReactConnections.js +21 -14
  284. package/build/map/react_js/getReactConnections.js.map +1 -1
  285. package/build/map/svelte_js/interactive.js +3 -54
  286. package/build/map/svelte_js/interactive.js.map +1 -1
  287. package/build/map/vue_js/getViteConnections.js +23 -16
  288. package/build/map/vue_js/getViteConnections.js.map +1 -1
  289. package/build/map/vue_js/interactive.js +3 -63
  290. package/build/map/vue_js/interactive.js.map +1 -1
  291. package/build/map/vue_js/interactive_helpers/commandHandler.js +34 -283
  292. package/build/map/vue_js/interactive_helpers/commandHandler.js.map +1 -1
  293. package/build/map/vue_js/interactive_helpers/helpMenu.js +2 -10
  294. package/build/map/vue_js/interactive_helpers/helpMenu.js.map +1 -1
  295. package/build/map/vue_js/taint_utils.js +1 -1
  296. package/build/map/vue_js/taint_utils.js.map +1 -1
  297. package/build/map/vue_js/vue_resolveFetch.js +12 -12
  298. package/build/map/vue_js/vue_resolveFetch.js.map +1 -1
  299. package/build/map/vue_js/vue_resolveHttpClient.js +18 -18
  300. package/build/map/vue_js/vue_resolveHttpClient.js.map +1 -1
  301. package/build/map/vue_js/vue_resolveXhr.js +11 -11
  302. package/build/map/vue_js/vue_resolveXhr.js.map +1 -1
  303. package/build/mcp/chatOneShot.js +7 -7
  304. package/build/mcp/chatOneShot.js.map +1 -1
  305. package/build/mcp/claudeCodeCreds.js +5 -5
  306. package/build/mcp/claudeCodeCreds.js.map +1 -1
  307. package/build/mcp/cli.js +36 -35
  308. package/build/mcp/cli.js.map +1 -1
  309. package/build/mcp/config.js +4 -4
  310. package/build/mcp/config.js.map +1 -1
  311. package/build/mcp/index.js +7 -7
  312. package/build/mcp/index.js.map +1 -1
  313. package/build/mcp/mcpServer.js +4 -3
  314. package/build/mcp/mcpServer.js.map +1 -1
  315. package/build/mcp/skills.js +1 -0
  316. package/build/mcp/skills.js.map +1 -1
  317. package/build/mcp/tools.js +6 -5
  318. package/build/mcp/tools.js.map +1 -1
  319. package/build/proxy/detectBlockedResponse.js +2 -0
  320. package/build/proxy/detectBlockedResponse.js.map +1 -1
  321. package/build/proxy/index.js +3 -3
  322. package/build/proxy/index.js.map +1 -1
  323. package/build/refactor/index.js +83 -79
  324. package/build/refactor/index.js.map +1 -1
  325. package/build/refactor/next/index.js +69 -26
  326. package/build/refactor/next/index.js.map +1 -1
  327. package/build/refactor/next/transform.js +11 -4
  328. package/build/refactor/next/transform.js.map +1 -1
  329. package/build/refactor/next/validator.js +7 -7
  330. package/build/refactor/next/validator.js.map +1 -1
  331. package/build/refactor/react/index.js +13 -13
  332. package/build/refactor/react/index.js.map +1 -1
  333. package/build/refactor/react/validator.js +7 -7
  334. package/build/refactor/react/validator.js.map +1 -1
  335. package/build/refactor/react-vite/index.js +3 -3
  336. package/build/refactor/react-vite/index.js.map +1 -1
  337. package/build/refactor/remote/hf-client.js +1 -0
  338. package/build/refactor/remote/hf-client.js.map +1 -1
  339. package/build/refactor/remote/version-detect.js +12 -12
  340. package/build/refactor/remote/version-detect.js.map +1 -1
  341. package/build/refactor/vue/index.js +6 -6
  342. package/build/refactor/vue/index.js.map +1 -1
  343. package/build/refactor/vue/vite.js +6 -6
  344. package/build/refactor/vue/vite.js.map +1 -1
  345. package/build/report/index.js +30 -8
  346. package/build/report/index.js.map +1 -1
  347. package/build/report/swaggerJacker.js +63 -0
  348. package/build/report/swaggerJacker.js.map +1 -0
  349. package/build/report/utility/dataTables/genDataTablesPage.js +2 -1
  350. package/build/report/utility/dataTables/genDataTablesPage.js.map +1 -1
  351. package/build/report/utility/genHtml.js +316 -25
  352. package/build/report/utility/genHtml.js.map +1 -1
  353. package/build/report/utility/markdownGen/addAnalyze.js +2 -1
  354. package/build/report/utility/markdownGen/addAnalyze.js.map +1 -1
  355. package/build/report/utility/populateDb/populateAnalysisFindings.js +2 -2
  356. package/build/report/utility/populateDb/populateAnalysisFindings.js.map +1 -1
  357. package/build/report/utility/populateDb/populateEndpoints.js +3 -3
  358. package/build/report/utility/populateDb/populateEndpoints.js.map +1 -1
  359. package/build/report/utility/populateDb/populateMappedJson.js +2 -2
  360. package/build/report/utility/populateDb/populateMappedJson.js.map +1 -1
  361. package/build/report/utility/populateDb/populateMappedOpenapi.js +3 -3
  362. package/build/report/utility/populateDb/populateMappedOpenapi.js.map +1 -1
  363. package/build/report/utility/severityColors.js +35 -0
  364. package/build/report/utility/severityColors.js.map +1 -0
  365. package/build/run/bundler-detect.js +45 -9
  366. package/build/run/bundler-detect.js.map +1 -1
  367. package/build/run/dashboard/dashboardHtml.js +150 -0
  368. package/build/run/dashboard/dashboardHtml.js.map +1 -0
  369. package/build/run/dashboard/fsBrowser.js +43 -0
  370. package/build/run/dashboard/fsBrowser.js.map +1 -0
  371. package/build/run/dashboard/server.js +123 -0
  372. package/build/run/dashboard/server.js.map +1 -0
  373. package/build/run/dashboard/state.js +97 -0
  374. package/build/run/dashboard/state.js.map +1 -0
  375. package/build/run/index.js +177 -110
  376. package/build/run/index.js.map +1 -1
  377. package/build/run/interruptHandler.js +18 -0
  378. package/build/run/interruptHandler.js.map +1 -1
  379. package/build/sourcemaps/index.js +7 -6
  380. package/build/sourcemaps/index.js.map +1 -1
  381. package/build/strings/index.js +27 -24
  382. package/build/strings/index.js.map +1 -1
  383. package/build/strings/openapi.js +4 -4
  384. package/build/strings/openapi.js.map +1 -1
  385. package/build/strings/permutate.js +4 -4
  386. package/build/strings/permutate.js.map +1 -1
  387. package/build/strings/secrets.js +1 -0
  388. package/build/strings/secrets.js.map +1 -1
  389. package/build/strings/trufflehog.js +66 -19
  390. package/build/strings/trufflehog.js.map +1 -1
  391. package/build/strings/trufflehogConfig.js +36 -0
  392. package/build/strings/trufflehogConfig.js.map +1 -0
  393. package/build/strings/trufflehogDownload.js +115 -0
  394. package/build/strings/trufflehogDownload.js.map +1 -0
  395. package/build/utility/ai.js +33 -4
  396. package/build/utility/ai.js.map +1 -1
  397. package/build/utility/banner.js +4 -3
  398. package/build/utility/banner.js.map +1 -1
  399. package/build/utility/cacheDb.js +78 -0
  400. package/build/utility/cacheDb.js.map +1 -0
  401. package/build/utility/configureSandbox.js +2 -2
  402. package/build/utility/configureSandbox.js.map +1 -1
  403. package/build/utility/customHeaders.js +30 -0
  404. package/build/utility/customHeaders.js.map +1 -0
  405. package/build/utility/globals.js +37 -12
  406. package/build/utility/globals.js.map +1 -1
  407. package/build/utility/heap.js +2 -1
  408. package/build/utility/heap.js.map +1 -1
  409. package/build/utility/makeReq.js +38 -87
  410. package/build/utility/makeReq.js.map +1 -1
  411. package/build/utility/openapiGenerator.js +2 -2
  412. package/build/utility/openapiGenerator.js.map +1 -1
  413. package/build/utility/printMsg.js +53 -0
  414. package/build/utility/printMsg.js.map +1 -0
  415. package/build/utility/progressLog.js +4 -3
  416. package/build/utility/progressLog.js.map +1 -1
  417. package/build/utility/resolvePath.js +2 -1
  418. package/build/utility/resolvePath.js.map +1 -1
  419. package/build/utility/ruleVersionMap.js +73 -0
  420. package/build/utility/ruleVersionMap.js.map +1 -0
  421. package/config.dist.yaml +3 -3
  422. package/contributing/testing.md +106 -0
  423. package/eslint.config.js +24 -0
  424. package/package.json +22 -6
  425. package/scripts/exploit-smoke-test.js +82 -0
  426. package/scripts/framework-detect-smoke-test.js +64 -0
  427. package/scripts/postinstall-completion.mjs +40 -0
  428. package/scripts/smoke-test.js +12 -0
  429. package/build/lazyLoad/downloadLoadedJsUtil.js +0 -98
  430. package/build/lazyLoad/downloadLoadedJsUtil.js.map +0 -1
  431. package/build/map/next_js/interactive_helpers/esqueryGen.js.map +0 -1
  432. package/build/map/next_js/interactive_helpers/inputPatch.js.map +0 -1
  433. package/build/map/next_js/interactive_helpers/keybindings.js.map +0 -1
  434. package/build/map/next_js/interactive_helpers/printer.js.map +0 -1
  435. package/build/map/next_js/interactive_helpers/ui.js.map +0 -1
  436. /package/build/map/{next_js/interactive_helpers → interactive-mode}/esqueryGen.js +0 -0
  437. /package/build/map/{next_js/interactive_helpers → interactive-mode}/inputPatch.js +0 -0
  438. /package/build/map/{next_js/interactive_helpers → interactive-mode}/keybindings.js +0 -0
  439. /package/build/map/{next_js/interactive_helpers → interactive-mode}/printer.js +0 -0
  440. /package/build/map/{next_js/interactive_helpers → interactive-mode}/ui.js +0 -0
@@ -1,30 +1,77 @@
1
- import chalk from "chalk";
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
2
10
  import { execSync, spawn } from "child_process";
3
- const isTrufflehogInstalled = () => {
11
+ import inquirer from "inquirer";
12
+ import { printMsg, MSG } from "../utility/printMsg.js";
13
+ import { downloadTrufflehog } from "./trufflehogDownload.js";
14
+ import { isConsentGiven, giveConsent } from "./trufflehogConfig.js";
15
+ const isTrufflehogInstalled = (bin) => {
4
16
  try {
5
- execSync("which trufflehog", { stdio: "pipe" });
17
+ execSync(`which ${bin}`, { stdio: "pipe" });
6
18
  return true;
7
19
  }
8
20
  catch (_a) {
9
21
  return false;
10
22
  }
11
23
  };
24
+ /**
25
+ * Resolves the trufflehog binary to invoke: an explicit `--trufflehog-bin`/PATH binary if
26
+ * present, otherwise auto-downloads from TruffleHog's official GitHub releases after
27
+ * obtaining one-time consent (interactive prompt, or `--trufflehog-accept-terms` for CI).
28
+ */
29
+ const resolveTrufflehogBin = (trufflehogBin, acceptTerms) => __awaiter(void 0, void 0, void 0, function* () {
30
+ if (isTrufflehogInstalled(trufflehogBin)) {
31
+ return trufflehogBin;
32
+ }
33
+ if (!isConsentGiven()) {
34
+ if (acceptTerms) {
35
+ giveConsent();
36
+ }
37
+ else if (process.stdin.isTTY) {
38
+ printMsg(MSG.Header, "[i] --trufflehog was set but the trufflehog binary was not found.");
39
+ printMsg(MSG.Warn, " JS Recon can download it directly from trufflesecurity/trufflehog's official GitHub releases");
40
+ printMsg(MSG.Warn, " and run it as a separate process. TruffleHog is licensed under AGPL-3.0.");
41
+ const { confirmed } = yield inquirer.prompt([
42
+ {
43
+ type: "confirm",
44
+ name: "confirmed",
45
+ message: "Download and run TruffleHog?",
46
+ default: true,
47
+ },
48
+ ]);
49
+ if (!confirmed) {
50
+ printMsg(MSG.Err, "[!] TruffleHog download declined.");
51
+ printMsg(MSG.Warn, " Re-run with --trufflehog-accept-terms, or point --trufflehog-bin at an existing install.");
52
+ process.exit(32);
53
+ }
54
+ giveConsent();
55
+ }
56
+ else {
57
+ printMsg(MSG.Err, "[!] trufflehog not found and terms not accepted.");
58
+ printMsg(MSG.Warn, " Re-run with --trufflehog-accept-terms to allow auto-download in non-interactive contexts,");
59
+ printMsg(MSG.Warn, " or point --trufflehog-bin at an existing install.");
60
+ process.exit(32);
61
+ }
62
+ }
63
+ return downloadTrufflehog(process.env.HOME || "~");
64
+ });
12
65
  const maskSecret = (value) => {
13
66
  if (!value || value.length <= 4)
14
67
  return "****";
15
68
  return value.slice(0, 4) + "****";
16
69
  };
17
- export const runTrufflehog = (directory) => {
70
+ export const runTrufflehog = (directory_1, ...args_1) => __awaiter(void 0, [directory_1, ...args_1], void 0, function* (directory, trufflehogBin = "trufflehog", acceptTerms = false) {
71
+ const resolvedBin = yield resolveTrufflehogBin(trufflehogBin, acceptTerms);
18
72
  return new Promise((resolve) => {
19
- if (!isTrufflehogInstalled()) {
20
- console.error(chalk.red("[!] trufflehog not found in PATH."));
21
- console.error(chalk.yellow(" Install: curl -sSfL https://raw.githubusercontent.com/trufflesecurity/trufflehog/main/scripts/install.sh | sh"));
22
- console.error(chalk.yellow(" Or: brew install trufflehog"));
23
- console.error(chalk.yellow(" Then re-run with --trufflehog."));
24
- process.exit(1);
25
- }
26
- console.log(chalk.cyan("[i] Running TruffleHog on output directory"));
27
- const proc = spawn("trufflehog", ["filesystem", directory, "--json", "--no-update"], {
73
+ printMsg(MSG.Header, "[i] Running TruffleHog on output directory");
74
+ const proc = spawn(resolvedBin, ["filesystem", directory, "--json", "--no-update"], {
28
75
  stdio: ["ignore", "pipe", "pipe"],
29
76
  });
30
77
  let totalFindings = 0;
@@ -42,8 +89,8 @@ export const runTrufflehog = (directory) => {
42
89
  const detector = (_c = (_b = finding.DetectorName) !== null && _b !== void 0 ? _b : finding.detectorName) !== null && _c !== void 0 ? _c : "Unknown";
43
90
  const raw = (_e = (_d = finding.Raw) !== null && _d !== void 0 ? _d : finding.raw) !== null && _e !== void 0 ? _e : "";
44
91
  const file = (_o = (_j = (_h = (_g = (_f = finding.SourceMetadata) === null || _f === void 0 ? void 0 : _f.Data) === null || _g === void 0 ? void 0 : _g.Filesystem) === null || _h === void 0 ? void 0 : _h.file) !== null && _j !== void 0 ? _j : (_m = (_l = (_k = finding.sourceMetadata) === null || _k === void 0 ? void 0 : _k.data) === null || _l === void 0 ? void 0 : _l.filesystem) === null || _m === void 0 ? void 0 : _m.file) !== null && _o !== void 0 ? _o : "unknown file";
45
- console.log(chalk.green(`[✓] [trufflehog] ${detector} found in ${file}`));
46
- console.log(chalk.bgGreen(` → ${maskSecret(raw)}`));
92
+ printMsg(MSG.Run, `[✓] [trufflehog] ${detector} found in ${file}`);
93
+ printMsg(MSG.Run, ` → ${maskSecret(raw)}`);
47
94
  totalFindings++;
48
95
  }
49
96
  catch (_p) {
@@ -54,18 +101,18 @@ export const runTrufflehog = (directory) => {
54
101
  proc.stderr.on("data", (chunk) => {
55
102
  const msg = chunk.toString().trim();
56
103
  if (msg) {
57
- console.error(chalk.yellow(`[trufflehog] ${msg}`));
104
+ printMsg(MSG.Warn, `[trufflehog] ${msg}`);
58
105
  }
59
106
  });
60
107
  proc.on("close", () => {
61
108
  if (totalFindings === 0) {
62
- console.log(chalk.yellow("[!] TruffleHog found no secrets"));
109
+ printMsg(MSG.Warn, "[!] TruffleHog found no secrets");
63
110
  }
64
111
  else {
65
- console.log(chalk.green(`[✓] TruffleHog found ${totalFindings} secrets`));
112
+ printMsg(MSG.Run, `[✓] TruffleHog found ${totalFindings} secrets`);
66
113
  }
67
114
  resolve();
68
115
  });
69
116
  });
70
- };
117
+ });
71
118
  //# sourceMappingURL=trufflehog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"trufflehog.js","sourceRoot":"","sources":["../../src/strings/trufflehog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trufflehog.js","sourceRoot":"","sources":["../../src/strings/trufflehog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import YAML from "yaml";
4
+ const DEFAULT_CONFIG = {
5
+ terms_accepted: false,
6
+ };
7
+ const CONFIG_DIR = path.join(process.env.HOME || "~", ".js-recon");
8
+ const CONFIG_FILE = path.join(CONFIG_DIR, "trufflehog.yaml");
9
+ const ensureConfigDir = () => {
10
+ if (!fs.existsSync(CONFIG_DIR)) {
11
+ fs.mkdirSync(CONFIG_DIR, { recursive: true });
12
+ }
13
+ };
14
+ const loadConfig = () => {
15
+ ensureConfigDir();
16
+ if (!fs.existsSync(CONFIG_FILE)) {
17
+ return Object.assign({}, DEFAULT_CONFIG);
18
+ }
19
+ try {
20
+ const raw = fs.readFileSync(CONFIG_FILE, "utf-8");
21
+ const parsed = YAML.parse(raw);
22
+ return Object.assign(Object.assign({}, DEFAULT_CONFIG), parsed);
23
+ }
24
+ catch (_a) {
25
+ return Object.assign({}, DEFAULT_CONFIG);
26
+ }
27
+ };
28
+ const saveConfig = (config) => {
29
+ ensureConfigDir();
30
+ fs.writeFileSync(CONFIG_FILE, YAML.stringify(config), "utf-8");
31
+ };
32
+ export const isConsentGiven = () => loadConfig().terms_accepted;
33
+ export const giveConsent = () => {
34
+ saveConfig(Object.assign(Object.assign({}, loadConfig()), { terms_accepted: true }));
35
+ };
36
+ //# sourceMappingURL=trufflehogConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trufflehogConfig.js","sourceRoot":"","sources":["../../src/strings/trufflehogConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,IAAI,MAAM,MAAM,CAAC;AAMxB,MAAM,cAAc,GAAqB;IACrC,cAAc,EAAE,KAAK;CACxB,CAAC;AAEF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,WAAW,CAAC,CAAC;AACnE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;AAE7D,MAAM,eAAe,GAAG,GAAS,EAAE;IAC/B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,GAAqB,EAAE;IACtC,eAAe,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9B,yBAAY,cAAc,EAAG;IACjC,CAAC;IAED,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA8B,CAAC;QAC5D,uCAAY,cAAc,GAAK,MAAM,EAAG;IAC5C,CAAC;IAAC,WAAM,CAAC;QACL,yBAAY,cAAc,EAAG;IACjC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,MAAwB,EAAQ,EAAE;IAClD,eAAe,EAAE,CAAC;IAClB,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;AACnE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAY,EAAE,CAAC,UAAU,EAAE,CAAC,cAAc,CAAC;AAEzE,MAAM,CAAC,MAAM,WAAW,GAAG,GAAS,EAAE;IAClC,UAAU,iCAAM,UAAU,EAAE,KAAE,cAAc,EAAE,IAAI,IAAG,CAAC;AAC1D,CAAC,CAAC"}
@@ -0,0 +1,115 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import fs from "fs";
11
+ import path from "path";
12
+ import * as tar from "tar";
13
+ import { withActiveProxyDispatcher } from "../utility/makeReq.js";
14
+ import { printMsg, MSG } from "../utility/printMsg.js";
15
+ const TRUFFLEHOG_RELEASE_URL = "https://api.github.com/repos/trufflesecurity/trufflehog/releases/latest";
16
+ /**
17
+ * Maps Node's platform/arch identifiers to TruffleHog's GitHub release asset naming
18
+ * (e.g. `trufflehog_3.96.0_darwin_amd64.tar.gz`).
19
+ *
20
+ * @param platform - `process.platform` value
21
+ * @param arch - `process.arch` value
22
+ * @returns The `<os>_<arch>` fragment used in TruffleHog's release asset names
23
+ */
24
+ export const resolveAssetName = (platform, arch) => {
25
+ const osMap = {
26
+ darwin: "darwin",
27
+ linux: "linux",
28
+ win32: "windows",
29
+ };
30
+ const archMap = {
31
+ x64: "amd64",
32
+ arm64: "arm64",
33
+ };
34
+ const os = osMap[platform];
35
+ const mappedArch = archMap[arch];
36
+ if (!os || !mappedArch) {
37
+ throw new Error(`Unsupported platform/arch for TruffleHog auto-download: ${platform}/${arch}`);
38
+ }
39
+ return `${os}_${mappedArch}`;
40
+ };
41
+ const fetchLatestTrufflehogRelease = (options) => __awaiter(void 0, void 0, void 0, function* () {
42
+ const response = yield fetch(TRUFFLEHOG_RELEASE_URL, options);
43
+ if (!response.ok) {
44
+ throw new Error(`TruffleHog release lookup failed with HTTP ${response.status}`);
45
+ }
46
+ const release = (yield response.json());
47
+ if (typeof release !== "object" || release === null) {
48
+ throw new Error("TruffleHog release response was not an object");
49
+ }
50
+ const { tag_name: tagName, assets } = release;
51
+ if (typeof tagName !== "string" || !Array.isArray(assets)) {
52
+ throw new Error("TruffleHog release response is missing tag_name or assets");
53
+ }
54
+ const assetSuffix = resolveAssetName(process.platform, process.arch);
55
+ const asset = assets.find((a) => typeof a === "object" &&
56
+ a !== null &&
57
+ typeof a.name === "string" &&
58
+ a.name.includes(assetSuffix) &&
59
+ a.name.endsWith(".tar.gz"));
60
+ if (!asset || typeof asset.browser_download_url !== "string") {
61
+ throw new Error(`No TruffleHog release asset found for platform/arch "${assetSuffix}"`);
62
+ }
63
+ const parsedUrl = new URL(asset.browser_download_url);
64
+ if (parsedUrl.protocol !== "https:" ||
65
+ !["github.com", "objects.githubusercontent.com"].includes(parsedUrl.hostname)) {
66
+ throw new Error("TruffleHog release response contains an unexpected download URL");
67
+ }
68
+ return Object.freeze({ tagName, downloadUrl: parsedUrl.toString() });
69
+ });
70
+ /**
71
+ * Downloads and caches the TruffleHog binary from its official GitHub releases.
72
+ *
73
+ * Fetches the latest release directly from `trufflesecurity/trufflehog` and extracts the
74
+ * platform-matching binary under `~/.js-recon/trufflehog/<version>/`. JS Recon never mirrors
75
+ * or hosts its own copy of the binary — every download resolves the asset URL from GitHub's
76
+ * release API at request time.
77
+ *
78
+ * @param homeDir - The user's home directory path
79
+ * @returns Absolute path to the cached (or freshly downloaded) trufflehog binary
80
+ */
81
+ export const downloadTrufflehog = (homeDir) => __awaiter(void 0, void 0, void 0, function* () {
82
+ const trufflehogRoot = path.join(homeDir, ".js-recon", "trufflehog");
83
+ const binName = process.platform === "win32" ? "trufflehog.exe" : "trufflehog";
84
+ if (fs.existsSync(trufflehogRoot)) {
85
+ const cachedVersionDirs = fs.readdirSync(trufflehogRoot);
86
+ for (const versionDir of cachedVersionDirs) {
87
+ const cachedBin = path.join(trufflehogRoot, versionDir, binName);
88
+ if (fs.existsSync(cachedBin)) {
89
+ return cachedBin;
90
+ }
91
+ }
92
+ }
93
+ printMsg(MSG.Header, "[i] TruffleHog not found. Downloading from GitHub...");
94
+ const buffer = yield withActiveProxyDispatcher((options) => __awaiter(void 0, void 0, void 0, function* () {
95
+ const release = yield fetchLatestTrufflehogRelease(options);
96
+ const downloadResponse = yield fetch(release.downloadUrl, options);
97
+ if (!downloadResponse.ok) {
98
+ throw new Error(`Failed to download TruffleHog: ${downloadResponse.statusText}`);
99
+ }
100
+ return { buffer: Buffer.from(yield downloadResponse.arrayBuffer()), tagName: release.tagName };
101
+ }));
102
+ const version = buffer.tagName.replace(/^v/, "");
103
+ const extractPath = path.join(trufflehogRoot, version);
104
+ fs.mkdirSync(extractPath, { recursive: true });
105
+ const tarPath = path.join(extractPath, "trufflehog.tar.gz");
106
+ fs.writeFileSync(tarPath, buffer.buffer);
107
+ printMsg(MSG.Header, "[i] Extracting TruffleHog...");
108
+ yield tar.x({ file: tarPath, cwd: extractPath });
109
+ fs.unlinkSync(tarPath);
110
+ const binPath = path.join(extractPath, binName);
111
+ fs.chmodSync(binPath, 0o755);
112
+ printMsg(MSG.Run, "[✓] TruffleHog downloaded successfully.");
113
+ return binPath;
114
+ });
115
+ //# sourceMappingURL=trufflehogDownload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trufflehogDownload.js","sourceRoot":"","sources":["../../src/strings/trufflehogDownload.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  };
10
10
  import OpenAI from "openai";
11
11
  import { Ollama } from "ollama";
12
+ import Anthropic from "@anthropic-ai/sdk";
12
13
  import * as globals from "./globals.js";
13
14
  /**
14
15
  * OpenAI client instance.
@@ -16,11 +17,11 @@ import * as globals from "./globals.js";
16
17
  * @remarks
17
18
  * This client is used to communicate with the OpenAI API.
18
19
  * The base URL and API key are configurable via the
19
- * `setAiEndpoint` and `setOpenaiApiKey` functions.
20
+ * `setAiEndpoint` and `setAiApiKey` functions.
20
21
  */
21
22
  const openai_client = new OpenAI({
22
23
  baseURL: globals.getAiEndpoint() || "https://api.openai.com/v1",
23
- apiKey: globals.getOpenaiApiKey(),
24
+ apiKey: globals.getAiApiKey(),
24
25
  });
25
26
  /**
26
27
  * Ollama client instance.
@@ -32,6 +33,16 @@ const openai_client = new OpenAI({
32
33
  const ollama_client = new Ollama({
33
34
  host: globals.getAiEndpoint() || "http://127.0.0.1:11434",
34
35
  });
36
+ /**
37
+ * Anthropic client instance.
38
+ *
39
+ * @remarks
40
+ * This client is used to communicate with the Anthropic Messages API.
41
+ * The API key is configurable via the `setAiApiKey` function.
42
+ */
43
+ const anthropic_client = new Anthropic({
44
+ apiKey: globals.getAiApiKey(),
45
+ });
35
46
  /**
36
47
  * Returns an AI client instance based on the configured provider.
37
48
  *
@@ -46,6 +57,9 @@ const ai = () => __awaiter(void 0, void 0, void 0, function* () {
46
57
  if (provider === "ollama") {
47
58
  return { client: ollama_client, model };
48
59
  }
60
+ if (provider === "anthropic") {
61
+ return { client: anthropic_client, model };
62
+ }
49
63
  throw new Error(`AI service provider "${provider}" is not supported or configured.`);
50
64
  });
51
65
  /**
@@ -64,7 +78,7 @@ function getCompletion(prompt_1) {
64
78
  throw new Error(`AI service provider "${provider}" is not supported or configured.`);
65
79
  }
66
80
  if (provider === "openai") {
67
- // @ts-ignore
81
+ // @ts-expect-error -- openai SDK types don't yet cover the Responses API shape used here
68
82
  const completion = yield client.responses.create({
69
83
  input: [
70
84
  { role: "system", content: systemPrompt },
@@ -91,7 +105,22 @@ function getCompletion(prompt_1) {
91
105
  });
92
106
  return response.message.content || "none";
93
107
  }
108
+ if (provider === "anthropic") {
109
+ // @ts-expect-error -- openai SDK types don't yet cover the Responses API shape used here
110
+ const response = yield client.messages.create({
111
+ model: model || "claude-haiku-4-5-20251001",
112
+ max_tokens: 4096,
113
+ system: systemPrompt,
114
+ messages: [{ role: "user", content: prompt }],
115
+ temperature: 0.1,
116
+ });
117
+ const text = response.content
118
+ .filter((block) => block.type === "text")
119
+ .map((block) => block.text)
120
+ .join("");
121
+ return text || "none";
122
+ }
94
123
  });
95
124
  }
96
- export { ai, openai_client, ollama_client, getCompletion };
125
+ export { ai, openai_client, ollama_client, anthropic_client, getCompletion };
97
126
  //# sourceMappingURL=ai.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/utility/ai.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AAExC;;;;;;;GAOG;AACH,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE,IAAI,2BAA2B;IAC/D,MAAM,EAAE,OAAO,CAAC,eAAe,EAAE;CACpC,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC;IAC7B,IAAI,EAAE,OAAO,CAAC,aAAa,EAAE,IAAI,wBAAwB;CAC5D,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,EAAE,GAAG,GAA8D,EAAE;IACvE,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAEhD,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IAC5C,CAAC;IAED,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IAC5C,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,mCAAmC,CAAC,CAAC;AACzF,CAAC,CAAA,CAAC;AAEF;;;;;;GAMG;AACH,SAAe,aAAa;yDAAC,MAAM,EAAE,YAAY,GAAG,8BAA8B;;QAC9E,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;QAEhD,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,mCAAmC,CAAC,CAAC;QACzF,CAAC;QAED,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACxB,aAAa;YACb,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;gBAC7C,KAAK,EAAE;oBACH,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;oBACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;iBACpC;gBACD,KAAK,EAAE,KAAK,IAAI,aAAa;gBAC7B,WAAW,EAAE,GAAG;aACnB,CAAC,CAAC;YACH,OAAO,CAAA,MAAA,MAAA,MAAA,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,0CAAG,CAAC,CAAC,0CAAE,OAAO,0CAAG,CAAC,CAAC,0CAAE,IAAI,KAAI,MAAM,CAAC;QACjE,CAAC;QAED,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC;gBACtC,KAAK,EAAE,KAAK,IAAI,UAAU;gBAC1B,QAAQ,EAAE;oBACN,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;oBACzC;wBACI,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,MAAM;qBAClB;iBACJ;gBACD,OAAO,EAAE;oBACL,WAAW,EAAE,GAAG;iBACnB;aACJ,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC;QAC9C,CAAC;IACL,CAAC;CAAA;AAED,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/utility/ai.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,7 @@ import path from "path";
14
14
  import https from "https";
15
15
  import os from "os";
16
16
  import CONFIG from "../globalConfig.js";
17
+ import { printMsg, MSG } from "./printMsg.js";
17
18
  const LOGO_URL = "https://js-recon.io/img/js-recon-logo.png";
18
19
  const CACHE_DIR = path.join(os.homedir(), ".js-recon");
19
20
  const LOGO_CACHE = path.join(CACHE_DIR, "logo.png");
@@ -60,9 +61,9 @@ export function printBanner() {
60
61
  const name = chalk.bold.hex("#00d4ff")("JS Recon");
61
62
  const version = chalk.dim(`v${CONFIG.version}`);
62
63
  const tagline = chalk.hex("#888888")(CONFIG.toolDesc);
63
- console.log(` ${name} ${version}`);
64
- console.log(` ${tagline}`);
65
- console.log();
64
+ printMsg(MSG.Plain, ` ${name} ${version}`);
65
+ printMsg(MSG.Plain, ` ${tagline}`);
66
+ printMsg(MSG.Plain, "");
66
67
  });
67
68
  }
68
69
  //# sourceMappingURL=banner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/utility/banner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/utility/banner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import Database from "better-sqlite3";
2
+ import * as globals from "./globals.js";
3
+ const createCacheTable = (db) => {
4
+ db.prepare(`
5
+ CREATE TABLE IF NOT EXISTS cache_entries (
6
+ identity_digest TEXT PRIMARY KEY,
7
+ url TEXT NOT NULL,
8
+ status INTEGER NOT NULL,
9
+ status_text TEXT NOT NULL,
10
+ body_base64 TEXT NOT NULL,
11
+ response_headers TEXT NOT NULL,
12
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
13
+ )
14
+ `).run();
15
+ db.prepare(`CREATE INDEX IF NOT EXISTS idx_cache_entries_url ON cache_entries(url)`).run();
16
+ };
17
+ let db = null;
18
+ let dbPath = null;
19
+ /**
20
+ * Returns the singleton cache DB connection, lazily opening (and creating the
21
+ * schema for) `globals.getRespCacheFile()`. Reopens automatically if the
22
+ * configured cache file path has changed since the last call (the CLI sets
23
+ * the path via `setRespCacheFile()` after module import, and tests repoint
24
+ * it per-test).
25
+ */
26
+ export const getCacheDb = () => {
27
+ const path = globals.getRespCacheFile();
28
+ if (db && dbPath === path)
29
+ return db;
30
+ if (db) {
31
+ db.close();
32
+ db = null;
33
+ }
34
+ const opened = new Database(path);
35
+ opened.pragma("journal_mode = WAL");
36
+ createCacheTable(opened);
37
+ db = opened;
38
+ dbPath = path;
39
+ return db;
40
+ };
41
+ /** Closes the singleton cache DB connection, if open. Safe to call when already closed. */
42
+ export const closeCacheDb = () => {
43
+ if (db) {
44
+ db.close();
45
+ db = null;
46
+ dbPath = null;
47
+ }
48
+ };
49
+ const rowToCacheRow = (row) => ({
50
+ identityDigest: row.identity_digest,
51
+ url: row.url,
52
+ status: row.status,
53
+ statusText: row.status_text,
54
+ bodyBase64: row.body_base64,
55
+ responseHeaders: JSON.parse(row.response_headers),
56
+ });
57
+ /** Looks up a cache entry by its identity digest. Returns null on miss. */
58
+ export const readCacheEntry = (identityDigest) => {
59
+ const row = getCacheDb()
60
+ .prepare(`SELECT identity_digest, url, status, status_text, body_base64, response_headers FROM cache_entries WHERE identity_digest = ?`)
61
+ .get(identityDigest);
62
+ return row ? rowToCacheRow(row) : null;
63
+ };
64
+ /**
65
+ * Inserts a cache entry, first-write-wins for a duplicate identity digest
66
+ * (mirrors the previous sidecar format's "don't clobber an existing entry"
67
+ * behavior, done atomically here instead of via a separate existence check).
68
+ */
69
+ export const writeCacheEntryUnsafe = (entry) => {
70
+ getCacheDb()
71
+ .prepare(`INSERT OR IGNORE INTO cache_entries (identity_digest, url, status, status_text, body_base64, response_headers) VALUES (?, ?, ?, ?, ?, ?)`)
72
+ .run(entry.identityDigest, entry.url, entry.status, entry.statusText, entry.bodyBase64, JSON.stringify(entry.responseHeaders));
73
+ };
74
+ /** Deletes a cache entry by identity digest, e.g. to force a refetch of a blocked response. */
75
+ export const deleteCacheEntry = (identityDigest) => {
76
+ getCacheDb().prepare(`DELETE FROM cache_entries WHERE identity_digest = ?`).run(identityDigest);
77
+ };
78
+ //# sourceMappingURL=cacheDb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cacheDb.js","sourceRoot":"","sources":["../../src/utility/cacheDb.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AA+BxC,MAAM,gBAAgB,GAAG,CAAC,EAAqB,EAAQ,EAAE;IACrD,EAAE,CAAC,OAAO,CACN;;;;;;;;;;KAUH,CACA,CAAC,GAAG,EAAE,CAAC;IACR,EAAE,CAAC,OAAO,CAAC,wEAAwE,CAAC,CAAC,GAAG,EAAE,CAAC;AAC/F,CAAC,CAAC;AAEF,IAAI,EAAE,GAA6B,IAAI,CAAC;AACxC,IAAI,MAAM,GAAkB,IAAI,CAAC;AAEjC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,GAAsB,EAAE;IAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IACxC,IAAI,EAAE,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IACrC,IAAI,EAAE,EAAE,CAAC;QACL,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,EAAE,GAAG,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACpC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACzB,EAAE,GAAG,MAAM,CAAC;IACZ,MAAM,GAAG,IAAI,CAAC;IACd,OAAO,EAAE,CAAC;AACd,CAAC,CAAC;AAEF,2FAA2F;AAC3F,MAAM,CAAC,MAAM,YAAY,GAAG,GAAS,EAAE;IACnC,IAAI,EAAE,EAAE,CAAC;QACL,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,EAAE,GAAG,IAAI,CAAC;QACV,MAAM,GAAG,IAAI,CAAC;IAClB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,GAAuB,EAAY,EAAE,CAAC,CAAC;IAC1D,cAAc,EAAE,GAAG,CAAC,eAAe;IACnC,GAAG,EAAE,GAAG,CAAC,GAAG;IACZ,MAAM,EAAE,GAAG,CAAC,MAAM;IAClB,UAAU,EAAE,GAAG,CAAC,WAAW;IAC3B,UAAU,EAAE,GAAG,CAAC,WAAW;IAC3B,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC;CACpD,CAAC,CAAC;AAEH,2EAA2E;AAC3E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,cAAsB,EAAmB,EAAE;IACtE,MAAM,GAAG,GAAG,UAAU,EAAE;SACnB,OAAO,CACJ,8HAA8H,CACjI;SACA,GAAG,CAAC,cAAc,CAAmC,CAAC;IAC3D,OAAO,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3C,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAe,EAAQ,EAAE;IAC3D,UAAU,EAAE;SACP,OAAO,CACJ,0IAA0I,CAC7I;SACA,GAAG,CACA,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,GAAG,EACT,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,UAAU,EAChB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC,CACxC,CAAC;AACV,CAAC,CAAC;AAEF,+FAA+F;AAC/F,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,cAAsB,EAAQ,EAAE;IAC7D,UAAU,EAAE,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AACpG,CAAC,CAAC"}
@@ -1,5 +1,5 @@
1
- import chalk from "chalk";
2
1
  import * as globalsUtil from "./globals.js";
2
+ import { printMsg, MSG } from "./printMsg.js";
3
3
  /**
4
4
  * Configures the browser sandbox based on command-line flags and environment variables.
5
5
  * @param cmd - The commander command object.
@@ -7,7 +7,7 @@ import * as globalsUtil from "./globals.js";
7
7
  const configureSandbox = (cmd) => {
8
8
  if (process.env.IS_DOCKER === "true" || cmd.sandbox === false) {
9
9
  globalsUtil.setDisableSandbox(true);
10
- console.error(chalk.yellow(`[!] Disabling browser sandbox`));
10
+ printMsg(MSG.Warn, `[!] Disabling browser sandbox`);
11
11
  }
12
12
  };
13
13
  export default configureSandbox;
@@ -1 +1 @@
1
- {"version":3,"file":"configureSandbox.js","sourceRoot":"","sources":["../../src/utility/configureSandbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,WAAW,MAAM,cAAc,CAAC;AAE5C;;;GAGG;AACH,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,EAAE;IAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,MAAM,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QAC5D,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAC,CAAC;IACjE,CAAC;AACL,CAAC,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"configureSandbox.js","sourceRoot":"","sources":["../../src/utility/configureSandbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAE9C;;;GAGG;AACH,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,EAAE;IAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,MAAM,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QAC5D,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACpC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,+BAA+B,CAAC,CAAC;IACxD,CAAC;AACL,CAAC,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Folds an array of custom header name/value pairs into a plain Record, suitable for merging
3
+ * into a `HeadersInit`/`Record<string,string>`. Later entries win when names repeat.
4
+ * @param pairs - Array of name/value header pairs
5
+ * @returns Record mapping header name to header value
6
+ */
7
+ export const customHeadersToRecord = (pairs) => {
8
+ const record = {};
9
+ for (const { name, value } of pairs) {
10
+ record[name] = value;
11
+ }
12
+ return record;
13
+ };
14
+ /**
15
+ * Parses a single `-H/--header` CLI flag value into a name/value pair. Expects the
16
+ * `"Name: Value"` shape (colon-separated, whitespace around each side trimmed).
17
+ * @param raw - Raw flag value as passed on the command line
18
+ * @returns The parsed pair, or `null` if `raw` has no colon separator
19
+ */
20
+ export const parseHeaderFlagValue = (raw) => {
21
+ const idx = raw.indexOf(":");
22
+ if (idx === -1)
23
+ return null;
24
+ const name = raw.slice(0, idx).trim();
25
+ const value = raw.slice(idx + 1).trim();
26
+ if (!name)
27
+ return null;
28
+ return { name, value };
29
+ };
30
+ //# sourceMappingURL=customHeaders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customHeaders.js","sourceRoot":"","sources":["../../src/utility/customHeaders.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAkC,EAA0B,EAAE;IAChG,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IACzB,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAW,EAA2B,EAAE;IACzE,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC3B,CAAC,CAAC"}