@js-recon/js-recon 1.3.1-beta.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 (361) hide show
  1. package/.gitattributes +2 -0
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +29 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  4. package/.github/ISSUE_TEMPLATE/new_tech_support_request.md +26 -0
  5. package/.github/workflows/build-and-prettify.yaml +121 -0
  6. package/.github/workflows/pr_checker.yml +22 -0
  7. package/.github/workflows/publish-js-recon.yml +169 -0
  8. package/.prettierignore +2 -0
  9. package/.prettierrc +6 -0
  10. package/CHANGELOG.md +692 -0
  11. package/CLAUDE.md +290 -0
  12. package/Dockerfile +34 -0
  13. package/LICENSE +21 -0
  14. package/README.md +101 -0
  15. package/SECURITY.md +37 -0
  16. package/build/analyze/engine/astEngine.js +224 -0
  17. package/build/analyze/engine/astEngine.js.map +1 -0
  18. package/build/analyze/engine/index.js +59 -0
  19. package/build/analyze/engine/index.js.map +1 -0
  20. package/build/analyze/engine/requestEngine.js +100 -0
  21. package/build/analyze/engine/requestEngine.js.map +1 -0
  22. package/build/analyze/helpers/engineHelpers/findDirectAssignment.js +37 -0
  23. package/build/analyze/helpers/engineHelpers/findDirectAssignment.js.map +1 -0
  24. package/build/analyze/helpers/engineHelpers/findMemberExpressionAssignment.js +29 -0
  25. package/build/analyze/helpers/engineHelpers/findMemberExpressionAssignment.js.map +1 -0
  26. package/build/analyze/helpers/engineHelpers/resolveFunctionIdentifier.js +38 -0
  27. package/build/analyze/helpers/engineHelpers/resolveFunctionIdentifier.js.map +1 -0
  28. package/build/analyze/helpers/engineHelpers/taintFlow.js +250 -0
  29. package/build/analyze/helpers/engineHelpers/taintFlow.js.map +1 -0
  30. package/build/analyze/helpers/initRules.js +111 -0
  31. package/build/analyze/helpers/initRules.js.map +1 -0
  32. package/build/analyze/helpers/outputHelper.js +14 -0
  33. package/build/analyze/helpers/outputHelper.js.map +1 -0
  34. package/build/analyze/helpers/schemas.js +57 -0
  35. package/build/analyze/helpers/schemas.js.map +1 -0
  36. package/build/analyze/helpers/validate.js +89 -0
  37. package/build/analyze/helpers/validate.js.map +1 -0
  38. package/build/analyze/index.js +150 -0
  39. package/build/analyze/index.js.map +1 -0
  40. package/build/analyze/types/index.js +2 -0
  41. package/build/analyze/types/index.js.map +1 -0
  42. package/build/api_gateway/checkFeasibility.js +41 -0
  43. package/build/api_gateway/checkFeasibility.js.map +1 -0
  44. package/build/api_gateway/checkFireWallBlocking.js +33 -0
  45. package/build/api_gateway/checkFireWallBlocking.js.map +1 -0
  46. package/build/api_gateway/genReq.js +205 -0
  47. package/build/api_gateway/genReq.js.map +1 -0
  48. package/build/api_gateway/index.js +291 -0
  49. package/build/api_gateway/index.js.map +1 -0
  50. package/build/endpoints/gen_report/gen_json.js +30 -0
  51. package/build/endpoints/gen_report/gen_json.js.map +1 -0
  52. package/build/endpoints/gen_report/utility/iterate_n_store.js +64 -0
  53. package/build/endpoints/gen_report/utility/iterate_n_store.js.map +1 -0
  54. package/build/endpoints/index.js +101 -0
  55. package/build/endpoints/index.js.map +1 -0
  56. package/build/endpoints/next_js/client_jsFilesHref.js +100 -0
  57. package/build/endpoints/next_js/client_jsFilesHref.js.map +1 -0
  58. package/build/endpoints/next_js/client_jsonParse.js +89 -0
  59. package/build/endpoints/next_js/client_jsonParse.js.map +1 -0
  60. package/build/endpoints/next_js/client_mappedJsonFile.js +103 -0
  61. package/build/endpoints/next_js/client_mappedJsonFile.js.map +1 -0
  62. package/build/endpoints/next_js/client_subsequentRequests.js +211 -0
  63. package/build/endpoints/next_js/client_subsequentRequests.js.map +1 -0
  64. package/build/fingerprint/index.js +123 -0
  65. package/build/fingerprint/index.js.map +1 -0
  66. package/build/globalConfig.js +16 -0
  67. package/build/globalConfig.js.map +1 -0
  68. package/build/index.js +332 -0
  69. package/build/index.js.map +1 -0
  70. package/build/lazyLoad/angular/angular_getFromMainJs.js +55 -0
  71. package/build/lazyLoad/angular/angular_getFromMainJs.js.map +1 -0
  72. package/build/lazyLoad/angular/angular_getFromPageSource.js +43 -0
  73. package/build/lazyLoad/angular/angular_getFromPageSource.js.map +1 -0
  74. package/build/lazyLoad/downloadFilesUtil.js +127 -0
  75. package/build/lazyLoad/downloadFilesUtil.js.map +1 -0
  76. package/build/lazyLoad/downloadLoadedJsUtil.js +44 -0
  77. package/build/lazyLoad/downloadLoadedJsUtil.js.map +1 -0
  78. package/build/lazyLoad/downloadQueue.js +191 -0
  79. package/build/lazyLoad/downloadQueue.js.map +1 -0
  80. package/build/lazyLoad/globals.js +107 -0
  81. package/build/lazyLoad/globals.js.map +1 -0
  82. package/build/lazyLoad/index.js +377 -0
  83. package/build/lazyLoad/index.js.map +1 -0
  84. package/build/lazyLoad/next_js/NextJsCrawler.js +332 -0
  85. package/build/lazyLoad/next_js/NextJsCrawler.js.map +1 -0
  86. package/build/lazyLoad/next_js/next_GetJSScript.js +126 -0
  87. package/build/lazyLoad/next_js/next_GetJSScript.js.map +1 -0
  88. package/build/lazyLoad/next_js/next_GetLazyResourcesBuildManifestJs.js +83 -0
  89. package/build/lazyLoad/next_js/next_GetLazyResourcesBuildManifestJs.js.map +1 -0
  90. package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js +222 -0
  91. package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js.map +1 -0
  92. package/build/lazyLoad/next_js/next_SubsequentRequests.js +208 -0
  93. package/build/lazyLoad/next_js/next_SubsequentRequests.js.map +1 -0
  94. package/build/lazyLoad/next_js/next_bruteForceJsFiles.js +37 -0
  95. package/build/lazyLoad/next_js/next_bruteForceJsFiles.js.map +1 -0
  96. package/build/lazyLoad/next_js/next_buildId.js +55 -0
  97. package/build/lazyLoad/next_js/next_buildId.js.map +1 -0
  98. package/build/lazyLoad/next_js/next_getClientSidePaths.js +83 -0
  99. package/build/lazyLoad/next_js/next_getClientSidePaths.js.map +1 -0
  100. package/build/lazyLoad/next_js/next_globals.js +8 -0
  101. package/build/lazyLoad/next_js/next_globals.js.map +1 -0
  102. package/build/lazyLoad/next_js/next_parseLayoutJs.js +116 -0
  103. package/build/lazyLoad/next_js/next_parseLayoutJs.js.map +1 -0
  104. package/build/lazyLoad/next_js/next_promiseResolve.js +85 -0
  105. package/build/lazyLoad/next_js/next_promiseResolve.js.map +1 -0
  106. package/build/lazyLoad/next_js/next_scriptTagsSubsequentRequests.js +51 -0
  107. package/build/lazyLoad/next_js/next_scriptTagsSubsequentRequests.js.map +1 -0
  108. package/build/lazyLoad/nuxt_js/nuxt_astParse.js +202 -0
  109. package/build/lazyLoad/nuxt_js/nuxt_astParse.js.map +1 -0
  110. package/build/lazyLoad/nuxt_js/nuxt_getFromPageSource.js +82 -0
  111. package/build/lazyLoad/nuxt_js/nuxt_getFromPageSource.js.map +1 -0
  112. package/build/lazyLoad/nuxt_js/nuxt_stringAnalysisJSFiles.js +108 -0
  113. package/build/lazyLoad/nuxt_js/nuxt_stringAnalysisJSFiles.js.map +1 -0
  114. package/build/lazyLoad/react/react_followImports.js +105 -0
  115. package/build/lazyLoad/react/react_followImports.js.map +1 -0
  116. package/build/lazyLoad/react/react_getScriptTags.js +52 -0
  117. package/build/lazyLoad/react/react_getScriptTags.js.map +1 -0
  118. package/build/lazyLoad/react/react_sourcemapUrls.js +44 -0
  119. package/build/lazyLoad/react/react_sourcemapUrls.js.map +1 -0
  120. package/build/lazyLoad/react/react_webpackChunkPaths.js +188 -0
  121. package/build/lazyLoad/react/react_webpackChunkPaths.js.map +1 -0
  122. package/build/lazyLoad/sourcemap.js +188 -0
  123. package/build/lazyLoad/sourcemap.js.map +1 -0
  124. package/build/lazyLoad/svelte/svelte_discoverPagesFromJs.js +162 -0
  125. package/build/lazyLoad/svelte/svelte_discoverPagesFromJs.js.map +1 -0
  126. package/build/lazyLoad/svelte/svelte_getFromPageSource.js +91 -0
  127. package/build/lazyLoad/svelte/svelte_getFromPageSource.js.map +1 -0
  128. package/build/lazyLoad/svelte/svelte_recursivePageCrawl.js +180 -0
  129. package/build/lazyLoad/svelte/svelte_recursivePageCrawl.js.map +1 -0
  130. package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js +123 -0
  131. package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js.map +1 -0
  132. package/build/lazyLoad/techDetect/checkAngularJS.js +70 -0
  133. package/build/lazyLoad/techDetect/checkAngularJS.js.map +1 -0
  134. package/build/lazyLoad/techDetect/checkNextJS.js +45 -0
  135. package/build/lazyLoad/techDetect/checkNextJS.js.map +1 -0
  136. package/build/lazyLoad/techDetect/checkNuxtJS.js +39 -0
  137. package/build/lazyLoad/techDetect/checkNuxtJS.js.map +1 -0
  138. package/build/lazyLoad/techDetect/checkReact.js +86 -0
  139. package/build/lazyLoad/techDetect/checkReact.js.map +1 -0
  140. package/build/lazyLoad/techDetect/checkSvelte.js +69 -0
  141. package/build/lazyLoad/techDetect/checkSvelte.js.map +1 -0
  142. package/build/lazyLoad/techDetect/checkVueJS.js +118 -0
  143. package/build/lazyLoad/techDetect/checkVueJS.js.map +1 -0
  144. package/build/lazyLoad/techDetect/index.js +161 -0
  145. package/build/lazyLoad/techDetect/index.js.map +1 -0
  146. package/build/lazyLoad/vue/vue_RuntimeJs.js +169 -0
  147. package/build/lazyLoad/vue/vue_RuntimeJs.js.map +1 -0
  148. package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js +102 -0
  149. package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js.map +1 -0
  150. package/build/lazyLoad/vue/vue_discoverJsFiles.js +82 -0
  151. package/build/lazyLoad/vue/vue_discoverJsFiles.js.map +1 -0
  152. package/build/lazyLoad/vue/vue_getClientSidePaths.js +155 -0
  153. package/build/lazyLoad/vue/vue_getClientSidePaths.js.map +1 -0
  154. package/build/lazyLoad/vue/vue_jsImports.js +76 -0
  155. package/build/lazyLoad/vue/vue_jsImports.js.map +1 -0
  156. package/build/lazyLoad/vue/vue_pageSrc.js +60 -0
  157. package/build/lazyLoad/vue/vue_pageSrc.js.map +1 -0
  158. package/build/lazyLoad/vue/vue_reconstructSourceMaps.js +64 -0
  159. package/build/lazyLoad/vue/vue_reconstructSourceMaps.js.map +1 -0
  160. package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js +142 -0
  161. package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js.map +1 -0
  162. package/build/lazyLoad/vue/vue_severalJsFilesHome.js +57 -0
  163. package/build/lazyLoad/vue/vue_severalJsFilesHome.js.map +1 -0
  164. package/build/lazyLoad/vue/vue_sourcemapExtract.js +166 -0
  165. package/build/lazyLoad/vue/vue_sourcemapExtract.js.map +1 -0
  166. package/build/lazyLoad/vue/vue_stringJsFiles.js +148 -0
  167. package/build/lazyLoad/vue/vue_stringJsFiles.js.map +1 -0
  168. package/build/lazyLoad/vue/vue_viteMapDeps.js +89 -0
  169. package/build/lazyLoad/vue/vue_viteMapDeps.js.map +1 -0
  170. package/build/load/index.js +316 -0
  171. package/build/load/index.js.map +1 -0
  172. package/build/map/graphql/resolveGraphql.js +296 -0
  173. package/build/map/graphql/resolveGraphql.js.map +1 -0
  174. package/build/map/index.js +261 -0
  175. package/build/map/index.js.map +1 -0
  176. package/build/map/next_js/getAxiosInstances.js +64 -0
  177. package/build/map/next_js/getAxiosInstances.js.map +1 -0
  178. package/build/map/next_js/getExports.js +101 -0
  179. package/build/map/next_js/getExports.js.map +1 -0
  180. package/build/map/next_js/getFetchInstances.js +139 -0
  181. package/build/map/next_js/getFetchInstances.js.map +1 -0
  182. package/build/map/next_js/getTurbopackConnections.js +255 -0
  183. package/build/map/next_js/getTurbopackConnections.js.map +1 -0
  184. package/build/map/next_js/getWebpackConnections.js +235 -0
  185. package/build/map/next_js/getWebpackConnections.js.map +1 -0
  186. package/build/map/next_js/interactive.js +69 -0
  187. package/build/map/next_js/interactive.js.map +1 -0
  188. package/build/map/next_js/interactive_helpers/commandHandler.js +310 -0
  189. package/build/map/next_js/interactive_helpers/commandHandler.js.map +1 -0
  190. package/build/map/next_js/interactive_helpers/commandHelpers.js +245 -0
  191. package/build/map/next_js/interactive_helpers/commandHelpers.js.map +1 -0
  192. package/build/map/next_js/interactive_helpers/esqueryGen.js +370 -0
  193. package/build/map/next_js/interactive_helpers/esqueryGen.js.map +1 -0
  194. package/build/map/next_js/interactive_helpers/helpMenu.js +12 -0
  195. package/build/map/next_js/interactive_helpers/helpMenu.js.map +1 -0
  196. package/build/map/next_js/interactive_helpers/inputPatch.js +207 -0
  197. package/build/map/next_js/interactive_helpers/inputPatch.js.map +1 -0
  198. package/build/map/next_js/interactive_helpers/keybindings.js +90 -0
  199. package/build/map/next_js/interactive_helpers/keybindings.js.map +1 -0
  200. package/build/map/next_js/interactive_helpers/printer.js +23 -0
  201. package/build/map/next_js/interactive_helpers/printer.js.map +1 -0
  202. package/build/map/next_js/interactive_helpers/ui.js +88 -0
  203. package/build/map/next_js/interactive_helpers/ui.js.map +1 -0
  204. package/build/map/next_js/resolveAxios.js +152 -0
  205. package/build/map/next_js/resolveAxios.js.map +1 -0
  206. package/build/map/next_js/resolveAxiosHelpers/astNodeToJsonString.js +64 -0
  207. package/build/map/next_js/resolveAxiosHelpers/astNodeToJsonString.js.map +1 -0
  208. package/build/map/next_js/resolveAxiosHelpers/directCallsWithoutAssignment.js +48 -0
  209. package/build/map/next_js/resolveAxiosHelpers/directCallsWithoutAssignment.js.map +1 -0
  210. package/build/map/next_js/resolveAxiosHelpers/findAxiosClients.js +34 -0
  211. package/build/map/next_js/resolveAxiosHelpers/findAxiosClients.js.map +1 -0
  212. package/build/map/next_js/resolveAxiosHelpers/findAxiosInstance.js +39 -0
  213. package/build/map/next_js/resolveAxiosHelpers/findAxiosInstance.js.map +1 -0
  214. package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js +312 -0
  215. package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js.map +1 -0
  216. package/build/map/next_js/resolveAxiosHelpers/handleAxiosCreate.js +173 -0
  217. package/build/map/next_js/resolveAxiosHelpers/handleAxiosCreate.js.map +1 -0
  218. package/build/map/next_js/resolveAxiosHelpers/handleZDotCreate.js +261 -0
  219. package/build/map/next_js/resolveAxiosHelpers/handleZDotCreate.js.map +1 -0
  220. package/build/map/next_js/resolveAxiosHelpers/interceptorHeaders.js +206 -0
  221. package/build/map/next_js/resolveAxiosHelpers/interceptorHeaders.js.map +1 -0
  222. package/build/map/next_js/resolveAxiosHelpers/processAxiosCall.js +168 -0
  223. package/build/map/next_js/resolveAxiosHelpers/processAxiosCall.js.map +1 -0
  224. package/build/map/next_js/resolveAxiosHelpers/processDirectAxiosCall.js +121 -0
  225. package/build/map/next_js/resolveAxiosHelpers/processDirectAxiosCall.js.map +1 -0
  226. package/build/map/next_js/resolveAxiosHelpers/processExportedEndpoints.js +274 -0
  227. package/build/map/next_js/resolveAxiosHelpers/processExportedEndpoints.js.map +1 -0
  228. package/build/map/next_js/resolveAxiosHelpers/traceAxiosInstanceExports.js +518 -0
  229. package/build/map/next_js/resolveAxiosHelpers/traceAxiosInstanceExports.js.map +1 -0
  230. package/build/map/next_js/resolveAxiosHelpers/traceBody.js +913 -0
  231. package/build/map/next_js/resolveAxiosHelpers/traceBody.js.map +1 -0
  232. package/build/map/next_js/resolveFetch.js +533 -0
  233. package/build/map/next_js/resolveFetch.js.map +1 -0
  234. package/build/map/next_js/resolveNewRequest.js +749 -0
  235. package/build/map/next_js/resolveNewRequest.js.map +1 -0
  236. package/build/map/next_js/resolveServerActions.js +449 -0
  237. package/build/map/next_js/resolveServerActions.js.map +1 -0
  238. package/build/map/next_js/utils.js +1600 -0
  239. package/build/map/next_js/utils.js.map +1 -0
  240. package/build/map/react_js/getReactConnections.js +303 -0
  241. package/build/map/react_js/getReactConnections.js.map +1 -0
  242. package/build/map/react_js/interactive.js +4 -0
  243. package/build/map/react_js/interactive.js.map +1 -0
  244. package/build/map/react_js/react_resolveFetch.js +6 -0
  245. package/build/map/react_js/react_resolveFetch.js.map +1 -0
  246. package/build/map/svelte_js/interactive.js +58 -0
  247. package/build/map/svelte_js/interactive.js.map +1 -0
  248. package/build/map/svelte_js/interactive_helpers/commandHandler.js +4 -0
  249. package/build/map/svelte_js/interactive_helpers/commandHandler.js.map +1 -0
  250. package/build/map/vue_js/bodyResolver.js +477 -0
  251. package/build/map/vue_js/bodyResolver.js.map +1 -0
  252. package/build/map/vue_js/crossFileResolver.js +438 -0
  253. package/build/map/vue_js/crossFileResolver.js.map +1 -0
  254. package/build/map/vue_js/getViteConnections.js +343 -0
  255. package/build/map/vue_js/getViteConnections.js.map +1 -0
  256. package/build/map/vue_js/interactive.js +67 -0
  257. package/build/map/vue_js/interactive.js.map +1 -0
  258. package/build/map/vue_js/interactive_helpers/commandHandler.js +307 -0
  259. package/build/map/vue_js/interactive_helpers/commandHandler.js.map +1 -0
  260. package/build/map/vue_js/interactive_helpers/commandHelpers.js +39 -0
  261. package/build/map/vue_js/interactive_helpers/commandHelpers.js.map +1 -0
  262. package/build/map/vue_js/interactive_helpers/helpMenu.js +12 -0
  263. package/build/map/vue_js/interactive_helpers/helpMenu.js.map +1 -0
  264. package/build/map/vue_js/taint_utils.js +621 -0
  265. package/build/map/vue_js/taint_utils.js.map +1 -0
  266. package/build/map/vue_js/vue_resolveFetch.js +416 -0
  267. package/build/map/vue_js/vue_resolveFetch.js.map +1 -0
  268. package/build/map/vue_js/vue_resolveHttpClient.js +738 -0
  269. package/build/map/vue_js/vue_resolveHttpClient.js.map +1 -0
  270. package/build/map/vue_js/vue_resolveXhr.js +282 -0
  271. package/build/map/vue_js/vue_resolveXhr.js.map +1 -0
  272. package/build/mcp/chatOneShot.js +101 -0
  273. package/build/mcp/chatOneShot.js.map +1 -0
  274. package/build/mcp/claudeCodeCreds.js +150 -0
  275. package/build/mcp/claudeCodeCreds.js.map +1 -0
  276. package/build/mcp/cli.js +372 -0
  277. package/build/mcp/cli.js.map +1 -0
  278. package/build/mcp/commands.js +227 -0
  279. package/build/mcp/commands.js.map +1 -0
  280. package/build/mcp/config.js +68 -0
  281. package/build/mcp/config.js.map +1 -0
  282. package/build/mcp/index.js +50 -0
  283. package/build/mcp/index.js.map +1 -0
  284. package/build/mcp/intent.js +204 -0
  285. package/build/mcp/intent.js.map +1 -0
  286. package/build/mcp/jobs.js +199 -0
  287. package/build/mcp/jobs.js.map +1 -0
  288. package/build/mcp/mcpServer.js +241 -0
  289. package/build/mcp/mcpServer.js.map +1 -0
  290. package/build/mcp/providers.js +170 -0
  291. package/build/mcp/providers.js.map +1 -0
  292. package/build/mcp/skills.js +115 -0
  293. package/build/mcp/skills.js.map +1 -0
  294. package/build/mcp/tools.js +185 -0
  295. package/build/mcp/tools.js.map +1 -0
  296. package/build/refactor/index.js +85 -0
  297. package/build/refactor/index.js.map +1 -0
  298. package/build/refactor/next/index.js +109 -0
  299. package/build/refactor/next/index.js.map +1 -0
  300. package/build/refactor/react/index.js +636 -0
  301. package/build/refactor/react/index.js.map +1 -0
  302. package/build/report/index.js +68 -0
  303. package/build/report/index.js.map +1 -0
  304. package/build/report/utility/dataTables/genDataTablesPage.js +158 -0
  305. package/build/report/utility/dataTables/genDataTablesPage.js.map +1 -0
  306. package/build/report/utility/genHtml.js +516 -0
  307. package/build/report/utility/genHtml.js.map +1 -0
  308. package/build/report/utility/initReportDb.js +96 -0
  309. package/build/report/utility/initReportDb.js.map +1 -0
  310. package/build/report/utility/markdownGen/addAnalyze.js +53 -0
  311. package/build/report/utility/markdownGen/addAnalyze.js.map +1 -0
  312. package/build/report/utility/markdownGen/addMappedJson.js +33 -0
  313. package/build/report/utility/markdownGen/addMappedJson.js.map +1 -0
  314. package/build/report/utility/populateDb/populateAnalysisFindings.js +31 -0
  315. package/build/report/utility/populateDb/populateAnalysisFindings.js.map +1 -0
  316. package/build/report/utility/populateDb/populateEndpoints.js +50 -0
  317. package/build/report/utility/populateDb/populateEndpoints.js.map +1 -0
  318. package/build/report/utility/populateDb/populateMappedJson.js +31 -0
  319. package/build/report/utility/populateDb/populateMappedJson.js.map +1 -0
  320. package/build/report/utility/populateDb/populateMappedOpenapi.js +49 -0
  321. package/build/report/utility/populateDb/populateMappedOpenapi.js.map +1 -0
  322. package/build/run/index.js +446 -0
  323. package/build/run/index.js.map +1 -0
  324. package/build/run/interruptHandler.js +93 -0
  325. package/build/run/interruptHandler.js.map +1 -0
  326. package/build/strings/index.js +239 -0
  327. package/build/strings/index.js.map +1 -0
  328. package/build/strings/openapi.js +63 -0
  329. package/build/strings/openapi.js.map +1 -0
  330. package/build/strings/permutate.js +62 -0
  331. package/build/strings/permutate.js.map +1 -0
  332. package/build/strings/secrets.js +102 -0
  333. package/build/strings/secrets.js.map +1 -0
  334. package/build/utility/ai.js +97 -0
  335. package/build/utility/ai.js.map +1 -0
  336. package/build/utility/configureSandbox.js +14 -0
  337. package/build/utility/configureSandbox.js.map +1 -0
  338. package/build/utility/globals.js +322 -0
  339. package/build/utility/globals.js.map +1 -0
  340. package/build/utility/interfaces.js +2 -0
  341. package/build/utility/interfaces.js.map +1 -0
  342. package/build/utility/makeReq.js +448 -0
  343. package/build/utility/makeReq.js.map +1 -0
  344. package/build/utility/openapiGenerator.js +254 -0
  345. package/build/utility/openapiGenerator.js.map +1 -0
  346. package/build/utility/postmanGenerator.js +216 -0
  347. package/build/utility/postmanGenerator.js.map +1 -0
  348. package/build/utility/progressLog.js +50 -0
  349. package/build/utility/progressLog.js.map +1 -0
  350. package/build/utility/puppeteerInstance.js +5 -0
  351. package/build/utility/puppeteerInstance.js.map +1 -0
  352. package/build/utility/replaceUrlPlaceholders.js +48 -0
  353. package/build/utility/replaceUrlPlaceholders.js.map +1 -0
  354. package/build/utility/resolvePath.js +44 -0
  355. package/build/utility/resolvePath.js.map +1 -0
  356. package/build/utility/runSandboxed.js +42 -0
  357. package/build/utility/runSandboxed.js.map +1 -0
  358. package/build/utility/urlUtils.js +21 -0
  359. package/build/utility/urlUtils.js.map +1 -0
  360. package/contributing/nextjs.md +410 -0
  361. package/package.json +75 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,692 @@
1
+ # Change Log
2
+
3
+ ## 1.3.1-beta.2 - 2026-06-12
4
+
5
+ ### Fixed
6
+
7
+ - All error and warning messages (chalk.red, chalk.bgRed, chalk.yellow `[!]`, chalk.magenta `[!]`, chalk.dim `[!]`) now write to `stderr` instead of `stdout` — affects 62 source files across every subcommand; fixes machine-readable pipelines and shell redirects that expected clean stdout
8
+ - Framework detection now falls back to checking Puppeteer-intercepted network request URLs when all HTML-attribute checks fail — catches Nuxt.js and Next.js sites that load their framework chunks dynamically (e.g. behind a Cloudflare challenge or SSO redirect) rather than referencing them in static HTML (`lazyload`)
9
+ - Map step no longer crashes with SIGSEGV (JavaScript heap out of memory) on ad-heavy or large-bundle targets — all file-parsing loops in the Vue/React/Svelte resolvers now skip files larger than 1.5 MB before calling Babel, preventing unbounded AST memory accumulation on sites that download 100+ third-party JS files (`map`)
10
+ - `run` now calls `process.exit(0)` after all pipeline steps complete — previously, abandoned Puppeteer navigations left by the lazyload hard timeout kept Node.js's event loop open indefinitely, causing the container to be SIGKILL'd (exit 137) even when analysis finished successfully (`run`)
11
+ - Next.js lazyload recursive page-crawl now stops visiting pages after 200 unique page visits per crawl instance — prevents runaway crawl explosion on sites that expose many locale or language variants in their navigation, where each locale page links to every other locale causing the crawl frontier to grow exponentially and exhaust the lazyload timeout (`lazyload`)
12
+ - Next.js fetch resolver now skips CSS stylesheet lazy-loader chunks (`markAssetError`, `fetchStyleSheet`) and Next.js internal data-fetcher chunks (`x-nextjs-data`) to avoid emitting false-positive API endpoints from framework internals (`map`)
13
+ - Next.js fetch resolver resolves `[param:X]` URL placeholders by tracing callers of the enclosing wrapper function — tries same-module callers first, then falls back to cross-chunk exported callers; reduces unresolved placeholder markers in output (`map`)
14
+ - Next.js fetch resolver guards `callHeaders` assignment against non-object values so a `null` or primitive returned by header resolution no longer causes a downstream crash (`map`)
15
+ - `resolveWebpackChunkImport` in `utils.ts` now calls `resolveVariableInChunk` on identifier nodes inside template-literal expressions and function-call arguments, cutting `[var X]` placeholder noise in resolved chunk URLs (`map`)
16
+
17
+ ### Performance
18
+
19
+ - Next.js subsequent-requests passes (steps 3/8 and 4.5/8) no longer re-run webpack chunk URL builder analysis — `next_GetLazyResourcesWebpackJs` (a full Puppeteer session) is now skipped when `subsequentRequestsFlag` is true, saving 3-6 minutes per call since the chunk URL builders are static and were already resolved in the initial lazyload (`lazyload`)
20
+ - HTML inline-chunk scraping in `subsequentRequests` is now parallelised using the same thread-count semaphore as the RSC pass — previously sequential over all extracted paths, cutting the HTML phase from ~17 min to ~2 min for sites with 1000+ extracted paths (`lazyload`)
21
+
22
+ ## 1.3.1-beta.1 - 2026-06-08
23
+
24
+ ### Added
25
+
26
+ ### Changed
27
+
28
+ ### Fixed
29
+
30
+ - Bumped versions for dependencies
31
+ - Fixed container
32
+
33
+ ## 1.3.1-alpha.4 - 2026-06-08
34
+
35
+ ### Performance
36
+
37
+ - `makeGetCallers` now caches per-file content + Babel AST tuples for the lifetime of the resolver instance, so repeated caller searches at high recursion depth no longer re-read and re-parse every JS file on each call — depth-8 runs that previously took 200+ minutes on a large real-world target now complete in under a minute (`map`)
38
+ - `map -t svelte/vue/react`: `getViteConnections` now parses each JS file exactly once instead of twice (single-pass replaces the two-pass approach), cutting parse-time memory in half for large applications (`map`)
39
+ - `map -t svelte/vue/react`: replaced `JSON.stringify(chunks)` (which allocated a string equal in size to the entire output file) with a streaming `createWriteStream` write that serialises one chunk at a time, eliminating the peak in-memory JSON string (`map`)
40
+ - `map -t svelte/vue/react`: `vue_resolveFetch` no longer caches all parsed ASTs and file contents for "fetch"-containing files simultaneously; ASTs are now parsed on-demand and discarded after each file, with a bounded LRU cache of at most 20 ASTs kept alive for cross-file caller lookup (`map`)
41
+ - `map -t svelte/vue/react`: `FetchEntry.enclosingFn.node` (an AST node reference that pinned each file's full Babel AST through the entries array until the end of the second pass) is now nulled out — the field is not read in the second pass; `FetchEntry.fileContent` is similarly cleared to avoid retaining all processed file contents in memory (`map`)
42
+
43
+ ### Added
44
+
45
+ - GraphQL operation extraction during `--openapi` generation — `map` now scans every downloaded JS file's string and template literals, feeds candidates through the official `graphql` library's `parse()`, and emits each parsed query/mutation/subscription as a POST request. Output is placed under a flat top-level `GraphQL` folder in the Postman collection and tagged `GraphQL` in the OpenAPI spec, with method `POST`, path `/{{graphqlEndpoint}}`, and a JSON body of shape `{"operationName": "...", "query": "...", "variables": {...}}`. The printed query inlines transitively-referenced fragment definitions so each emitted request is self-contained. Disabled with `--no-graphql` (alias `--ngql`) on both `map` and `run` (`map`, `run`)
46
+ - `collectionFolder` optional field on `OpenapiOutputItem` — when set, the OpenAPI generator uses it as the operation's `tags` value and the Postman generator places the item under a flat top-level folder with that name, bypassing the path-segment-derived hierarchy. Used by the new GraphQL resolver to group all operations under a single `GraphQL` folder regardless of transport URL (`map`)
47
+ - `--lazyload-timeout <minutes>` flag on both `lazyload` and `run` commands (default 30, 0 = disabled) — sets a hard ceiling on how long each lazyLoad step runs. When the timer fires the module logs a warning and the pipeline continues to the next step; in-flight Puppeteer pages and downloads may still complete in the background but their results are discarded (`lazyload`, `run`)
48
+ - Next.js lazyload now scans ALL downloaded JS files for webpack chunk URL builder functions (`__webpack_require__.u` pattern), not just `webpack-*.js` files — covers module federation entry points and other non-standard filenames. Scanning runs iteratively after the initial crawl until no new chunk URLs are discovered, with a CLI progress bar (`lazyload`)
49
+ - `--max-recursion-depth <n>` flag on `map` (default 3) — controls how far the HTTP-client URL fan-out and cross-file resolver recurse through caller chains. Higher values resolve more `[param:X]` markers at the cost of runtime; the per-entry deadline scales with depth so deeper recursion still terminates (`map`)
50
+ - `deepSubstituteBodyValue` body resolver — when a request body contains a `[param:X]` leaf whose call-site value is a structured object (e.g. a credentials/config object passed by an outer caller), the leaf is now replaced with the full nested object rather than left as a placeholder string. Used by both the HTTP-client and fetch resolvers (`map`)
51
+ - `makeGetCallersSameFile` fallback for body-param resolution — when the param-owning function has a short minifier-local binding name (≤ 2 chars), `resolveParamToAnyValue` now does a targeted same-file AST search to catch direct in-file callers that `makeGetCallers` skips to avoid cross-file false positives. Same-file short-name calls are unambiguous because the binding is in scope (`map`)
52
+ - Object-preference in `resolveParamToAnyValue` — prefers a caller whose argument resolves to a structured object/array over one that resolves to a bare string, since body params are typically objects and string-arg overloads are usually unrelated dispatch calls. Also skips resolved values where every leaf is still an unresolved placeholder marker (`map`)
53
+ - `OptionalMemberExpression` AST node handling in `deepResolveValue`, `resolveReturnInline`, and `resolveNodeValue` — optional chaining (`a?.b`) in URL/body expressions is now resolved the same way as regular member expressions instead of returning the opaque "unsupported node type" marker (`map`)
54
+ - HTTP-client method-call resolver for Vue/React/Svelte bundles — captures `<obj>.<verb>(<url>, [body], [config])` callsites (where `<verb>` ∈ {get,post,put,delete,patch,head,options}), runs same-function assignment recovery for late-bound locals, fans the URL out across every caller chain, and emits one OpenAPI entry per resolved caller. Designed for bundles whose transport layer overrides `XMLHttpRequest.prototype.{open,send,setRequestHeader}` (axios xhrAdapter and similar wrappers), where the literal URL is composed at the client-instance method call site rather than inside the adapter (`map`)
55
+ - `EnclosingFn.paramNames` + `parent` chain in the shared taint primitives — taint substitution can now resolve `[param:X]` for any parameter at any index in any enclosing function, including across anonymous Promise-chain callbacks where the immediate enclosing function doesn't declare X (`map`)
56
+ - Per-file alias map in `makeGetCallers` — recognizes `{ name: Binding }` re-exports and `{ name: () => Binding }` webpack getter exports so callsites that hit the binding through its public name (e.g. `ae.request(...)`, `r.default.postUnchecked(...)`) are correctly matched as callers of the local minified symbol. Aliases are scoped per file because minifier locals collide across modules (`map`)
57
+ - Member-expression callsite matching in `makeGetCallers` — `<anything>.<exportedName>(...)` is now recognised as a caller of the bound function, in addition to bare-identifier calls (`map`)
58
+ - XMLHttpRequest detection and resolution for Vue.JS, React, and Svelte/Astro bundles — resolves `.open()` method/URL, `.setRequestHeader()` header pairs, and `.send()` body from each XHR binding's call chain; results are registered in the OpenAPI output (`map`)
59
+ - Detect Next.js Server Actions registered via `createServerReference` and emit them as POST endpoints in the OpenAPI spec and Postman collection — includes `next-action` / `Accept` / `Content-Type` headers, route derived from App Router file path, and argument hints traced from the first call site (`map`)
60
+ - Argument hints in Server Action request bodies carry the inferred type alongside the variable name (e.g. `<string:userId>`) instead of an opaque placeholder (`map`)
61
+ - Location metadata for Server Actions: definition chunk + absolute file path + line and call-site chunk + absolute file path + line, surfaced as the `description` field in both the OpenAPI spec and Postman collection (`map`)
62
+ - `list server_actions` interactive command — prints all discovered Server Actions with route, body args, and source locations (`map -i`)
63
+ - Svelte/Astro framework support — `lazyload` now discovers island JS files via recursive HTML page crawl and ESM import following; `map` decodes Vite production chunks using the same logic as Vue; `analyze` and `run` pipeline added for Svelte/Astro apps (`lazyload`, `map`, `analyze`, `run`)
64
+ - `fingerprint` subcommand — batch framework detection against one or more target URLs; outputs detected framework and version to stdout in `text` (default), `json`, `jsonl`, or `csv` format; useful for triaging large target lists before running the full pipeline (`fingerprint`)
65
+ - React (Vite/Rolldown) framework detection via `<link rel="modulepreload">` elements and fast-path filename matching, in addition to inline `<script>` tags (`lazyload`)
66
+ - Recursive ESM import following for React bundles — static imports, dynamic `import()`, and Vite `__vite_mapDeps` arrays are parsed from each downloaded file so all referenced chunks are fetched transitively (`lazyload`)
67
+ - `map` and `analyze` pipeline support for React (Vite/Rolldown) applications, using the same fetch-resolver and analyze engine as Vue with vendor-chunk filtering (`map`, `analyze`, `run`)
68
+ - Content-entropy deduplication in `lazyload` — query-param variants of the same path are probed and only skipped when their extracted script sets are identical, so genuinely distinct parameterised routes are still crawled (`lazyload`)
69
+ - Ctrl-C interrupt menu in `run` — pressing Ctrl-C during a pipeline step shows an interactive prompt (skip current step / skip current target / exit) instead of immediately killing the process; in batch mode an extra "skip target" option is offered (`run`)
70
+ - `regexMatch` step type in the AST rule engine — matches string and template literals against a regex pattern, enabling rules that detect hardcoded credentials and other value-pattern findings (`analyze`)
71
+ - React tech added to all tech-gated type definitions and rule schemas (`analyze`)
72
+ - Model Context Protocol stdio server (`mcp --server`) — speaks the MCP protocol so js-recon can be wired into Claude Code, Cursor, and other MCP-aware hosts as a tool provider. Registers `lazyload`, `strings`, `map`, `endpoints`, `analyze`, `report`, `run`, `list_skills`, and `run_skill` as MCP tools. Subcommand stdout is captured and redirected to stderr so the chatty `console.log` output never corrupts the JSON-RPC frame; captured text is returned as the tool result (`mcp`)
73
+ - One-shot chat flag `-c/--chat <prompt>` on `mcp` (repeatable) — sends a single prompt to the AI agent non-interactively, prints the reply, and exits. Intent-detected `lazyload`/`run` jobs are awaited before the reply so the LLM sees the captured output (`mcp`)
74
+ - Claude Code OAuth credential reuse — when no API key is configured, `mcp --cli` and `mcp -c` fall back to the OAuth bearer token stored by the official Claude Code CLI (macOS keychain service `Claude Code-credentials`, or `~/.claude/.credentials.json` on Linux). The Anthropic SDK is constructed with `authToken` + `anthropic-beta: oauth-2025-04-20`. Tokens are auto-refreshed when expired (with a warning); refresh tokens are written back to the source credential store. OAuth tokens are never persisted to `~/.js-recon/mcp.yaml`. Disable refresh with `--no-refresh-claude-creds` (`mcp`)
75
+ - Background-job runner for `mcp --cli` — `lazyload` and `run` actions now spawn child processes (`node build/index.js <subcmd> ...`) and return immediately so the REPL stays responsive. The user can chat with the LLM while a job runs; tails of running jobs are auto-injected into the LLM context on every turn so the model can answer "how's it going?" naturally. New slash commands: `/jobs`, `/log <id>`, `/tail <id> [n]`, `/cancel <id>`. Ctrl-C cancels the most recent running job (SIGTERM → SIGKILL after 3s) before falling through to the exit warning (`mcp --cli`)
76
+ - Skills system — workflow prompts shipped under `~/.js-recon/skills/*.md` (delivered via a new `skills/` directory in the `js-recon-rules` release zipball, staged by `initRules`). Each skill carries YAML frontmatter (`name`, `description`, `params`, optional `pre_actions`). Invoke from the REPL with `/skill <name> [--param value …]`, via natural-language intent (e.g. `pentest <url>` routes to `web_app_pentest`), or from external MCP hosts via the `run_skill` MCP tool. `pre_actions` declare tool jobs (e.g. `run`) that are spawned before the rendered skill prompt is handed to the LLM. Ships with `graphql_pentest` and `web_app_pentest` (`mcp`, `analyze`)
77
+ - `--claude-client-id <id>` flag on `mcp` — OAuth client ID used when auto-refreshing Claude Code credentials; required in environments where the default Anthropic client ID is not registered (`mcp --cli`, `mcp -c`)
78
+
79
+ ### Changed
80
+
81
+ - Fetch resolution log lines now include the resolved URL, method, headers, and body immediately after the `[+] Found fetch call in "file":line` line instead of being grouped at the end (`map`)
82
+ - Fetch resolution logs correctly label the framework ("React" or "Vue.JS") in the start and summary messages (`map`)
83
+ - `mcp --cli` launches in the user's current working directory and prints a `Working directory: <abs>` + `Artifacts are preserved across runs.` banner. Spawned job child processes inherit that cwd explicitly so artifacts always land next to the user's other working files (`mcp --cli`)
84
+ - Intent detector now requires word-boundary matches on `scan|run|check|test` so the substring `pentest` no longer accidentally routes to `run`; "pentest" + URL now routes to the `web_app_pentest` skill (or any `*_pentest` skill) when one is loaded (`mcp --cli`)
85
+ - Updated `@anthropic-ai/sdk` dependency to **0.102.0**
86
+
87
+ ### Fixed
88
+
89
+ - `refactor -t react`: chunks whose AST already contains `export { X as default }` or `export default X` no longer receive a second trailing `export default` statement — the refactor pass now checks for an existing default export in the generated code before appending one (`refactor`)
90
+ - Fetch resolver second pass now handles `[param:X]` markers in request bodies — previously `MARKER_RE` matched only `[member:]` / `[urlsearchparams:]` and the resolver explicitly excluded `[param:]` markers, so a fetch wrapper whose body was an outer function parameter (`fetch(url, { body: JSON.stringify({ ..., body: E }) })`) was emitted with the literal placeholder string instead of the structured object the caller actually passed. The body JSON is now parsed and walked with `deepSubstituteBodyValue` so nested object/array call-site values replace the marker leaves (`map`)
91
+ - `[MemberExpression -> X]`, `[var X]`, and other unresolved placeholders in URLs are now substituted with their OpenAPI equivalents (`{X}`) before URL parsing in the OpenAPI spec generator, preventing spurious `Invalid URL` errors for placeholder-containing paths (`map`)
92
+ - Silenced the `Invalid URL` catch in the OpenAPI query-parameter extractor — URLs that remain unparseable after placeholder substitution (e.g. absolute URLs with placeholder hostnames) are skipped silently, since this is expected behaviour (`map`)
93
+ - Add error handling if webpack JS file is not valid
94
+ - `getRuleFilesRecursive` now skips hidden directories (e.g. `.github`) so GitHub Actions workflow YAML files are not loaded as rules (`analyze`)
95
+ - `run` now deletes stale map artifacts (`mapped.json`, `mapped-openapi.json`, `mapped-openapi.postman_collection.json`) before invoking `map`, preventing a leftover file from a previous run being reused when the output directory has been cleared without a full `cleanup` — which caused `resolveFetch` to look up file paths from the wrong target (`run`)
96
+ - `regexMatch` engine step now collects all matching string/template-literal nodes instead of stopping at the first hit; each matched node emits its own finding, so all hardcoded secrets in a single chunk are reported individually rather than only the first one (`analyze`)
97
+ - Taint propagation now follows callback parameters: when a tainted value is passed alongside an inline function argument in a call (e.g. Vue `watch(source, cb)`), the parameters of the inline function are marked tainted, fixing false-negatives where the callback param received a tainted value at runtime but was not tracked (`analyze`)
98
+ - CSPT rule no longer treats `route.params.*` and `useParams()` as taint sources — route segment params are validated against the router's path pattern and cannot carry arbitrary `../` traversal strings; only query params (`route.query`, `URLSearchParams`, `location.search/hash`) are high-confidence CSPT sources (`analyze`)
99
+ - Vue and React pipelines now also delete stale map artifacts before invoking `map`, applying the same fix as the Next.js pipeline; previously a stale `mapped.json` from a prior run would cause the analyze step to report findings against the wrong target's chunk IDs (`run`)
100
+ - `mcp --cli` "Thinking..." spinner no longer ticks forever after a provider error — the `setInterval` is now declared outside the `try` and cleared in `finally`, so 4xx/network failures render cleanly and the next prompt is not mangled (`mcp --cli`)
101
+ - Job/skill announcements (e.g. `[Job 1] run started ...`, `[Invoking skill: web_app_pentest]`) are now echoed to the REPL the moment `handleToolExecution` returns, in addition to being baked into the LLM context. Previously, if the subsequent LLM call failed (quota / auth), the user had no visible signal that a background scan had actually been spawned (`mcp --cli`)
102
+ - Ctrl-C in `mcp --cli` no longer crashes the readline with `SES_UNCAUGHT_EXCEPTION: readline was closed`. The SIGINT handler is wrapped in a try/catch and `prompt()` is guarded by a `promptingActive` flag so a re-entrant call against an already-pending `rl.question` is dropped instead of tearing the interface down (`mcp --cli`)
103
+ - `extractSourceMaps` no longer crashes with `EISDIR` when a source map entry has a degenerate path (e.g. a bare `webpack://` prefix with no trailing path) that `normalizePath` reduces to `"."` — such entries are now silently skipped (`lazyload`, `run`)
104
+ - Source map files extracted during `run` are now written to `output/<domain>/extracted/` (or the equivalent per-target subdirectory) instead of a bare `extracted/` directory in the current working directory (`lazyload`, `run`)
105
+
106
+ ## 1.3.1-alpha.3 - 2026-05-20
107
+
108
+ ### Added
109
+
110
+ - Add version for rule templates
111
+ - Add Vue js support for analyze module
112
+ - `esquery` interactive command + headless `-c/--command` runner for `map` and `run`, with `&&` chaining (`map`)
113
+ - Line-editor behavior in interactive mode: cursor movement (left/right/home/end/ctrl-a/ctrl-e), word-wise motion/delete (ctrl-w, ctrl-left/right), kill-to-start/end (ctrl-u/ctrl-k), delete-at-cursor, mid-string insertion so paste lands at the cursor, and horizontal scroll for long inputs (`map -i`)
114
+
115
+ ### Changed
116
+
117
+ - Removed `mouse: true` from the interactive output pane so terminal-native text selection/copy works in the output area (`map -i`)
118
+ - Vue.js fetch resolver now walks back to the enclosing wrapper function's caller(s) so `URLSearchParams(param.subprop)` expands to real `?k1={k1}&k2={k2}` query strings and spread-header / member-value placeholders get substituted from the caller's object literal — including transitive resolution when the caller passes its own param through (`map`)
119
+ - Vue.js fetch resolver recognises destructured fetch wrappers (e.g. `const { wrapperKey: x } = factory({ ... })`) and resolves their callsites as fetch calls, with positional-first-arg filtering to avoid mis-identifying object-shaped wrappers that construct the URL from a property of their input (`map`)
120
+ - Distinct callsites for the same `(path, method)` are preserved in both the OpenAPI spec (path key gets a `#N` suffix) and the Postman collection (request name gets a `#N` suffix) instead of being collapsed to a single entry (`map`)
121
+
122
+ ### Fixed
123
+
124
+ - Spread elements in request bodies and option objects are no longer silently dropped when the spread argument is unresolvable — the output surfaces a sentinel key (e.g. `"...arg": "<spread>"`, `"...call()": "<spread>"`) so downstream readers know more fields exist at runtime (`map`)
125
+
126
+ ## 1.3.1-alpha.2 - 2026-05-18
127
+
128
+ ### Added
129
+
130
+ - Added taint analysis in the `analyze` engine for Next.js
131
+ - Download JS files as soon as they are discovered (`lazyload`)
132
+ - Recursively resolve HTTP requests in Next.js (`map`)
133
+ - Stream JS file downloads during Vue.js discovery — downloads start as soon as each discovery step finds files instead of waiting for the full pipeline (`lazyload`)
134
+ - Resolve `UnaryExpression` nodes (`!x`, `void 0`, `-x`, `typeof x`) so request bodies surface real boolean/null values instead of `[unsupported node type: UnaryExpression]` (`map`)
135
+ - Resolve `ArrayExpression` nodes recursively so array body fields render their element shape instead of `[unsupported node type: ArrayExpression]` (`map`)
136
+ - Resolve `JSON.stringify(variable)` calls by tracing the argument, replacing the opaque `[call:JSON.stringify()]` placeholder (`map`)
137
+ - Resolve `new URLSearchParams({...})` to a real query string, using `{key}` placeholders for values that can't be statically resolved (`map`)
138
+ - Partial-concatenation fallback for binary `+` expressions so resolvable fragments are preserved when one side is unresolved (`map`)
139
+
140
+ ### Changed
141
+
142
+ - Nested `JSON.stringify(expr)` inside a body object now resolves `expr` instead of emitting `[call to object...]` (`map`)
143
+
144
+ ### Fixed
145
+
146
+ - Invalidate request cache if the memory is full
147
+ - Progress bars no longer hide the terminal cursor permanently when they exit without a clean `stop()` — all bars now use `hideCursor: false` (`lazyload`)
148
+ - Removed the concurrent download progress bar in the Vue.js section that was causing display corruption — discovery `console.log` calls no longer collide with the bar's render line (`lazyload`)
149
+ - API spec / Postman collection URLs no longer get `{{baseUrl}}` prepended to already-absolute URLs — full URLs are now reduced to their pathname (`map`)
150
+ - Spread elements that can't be resolved are now skipped instead of being emitted as fake `"...spread": "[spread:e]"` body fields (`map`)
151
+ - Request bodies that reduce to an empty `{}` after resolution are now omitted from the Postman collection (`map`)
152
+
153
+ ## 1.3.1-alpha.1 - 2026.05.13
154
+
155
+ ### Added
156
+
157
+ - Added MCP CLI support with model and provider configuration
158
+ - Vue.js support to get JS files from the page source
159
+ - Vue.js suppor to get JS files from runtime.js file
160
+ - Pass a URL list to `run -u`
161
+ - Turbopack support for Next.js `map`
162
+ - Added an `inScopeOf` option to AST `esquery` steps so a rule can scope a query to the subtree of a previous match — useful for requiring source and sink to live inside the same function rather than just the same chunk.
163
+ - Added a re-pass of the subsequent-requests crawl after the second strings extraction in `run` so dynamic-route paths (e.g. `/post/1`, `/profile/2`) that are only discovered after the first crawl + strings extraction get their chunks downloaded.
164
+ - Added interactive mode support `-i` for vue
165
+ - Use `puppeteer-extra` rather than `puppeteer`
166
+ - Added React Support
167
+ - Added Cloudfront firewall bypass
168
+
169
+ ### Changed
170
+
171
+ - AST rules now fire when every declared step matches at least once in the chunk (counted as distinct completed steps), instead of requiring an exact total count of matches — multiple matches in a single step no longer prevent the rule from firing.
172
+
173
+ ### Fixed
174
+
175
+ - Added try-catch for .map file bruteforce requests
176
+ - Subsequent-request chunk discovery regexes now accept the `~` character so Turbopack content-hashed filenames such as `static/chunks/18865ghy~7gi9.js` are picked up.
177
+
178
+ ## 1.2.2 - 2026.04.04
179
+
180
+ ### Added
181
+
182
+ - Implemented recursive crawling in Next.js modules to discover more JS files
183
+ - Added `--max-iterations` flag to limit recursive crawl iterations in `lazyload` module
184
+
185
+ ### Changed
186
+
187
+ ### Fixed
188
+
189
+ ## 1.2.2-alpha.11 - 2026.03.01
190
+
191
+ ### Added
192
+
193
+ - Added support for finding JS files through the single JS file on homepage for Vue.js
194
+ - Added support to get JS files from `../` paths in import statements for Vue.js
195
+
196
+ ### Changed
197
+
198
+ ### Fixed
199
+
200
+ - Add the single JS file to the list of files to download in Vue.js
201
+
202
+ ## 1.2.2-alpha.10 - 2026.02.07
203
+
204
+ ### Added
205
+
206
+ ### Changed
207
+
208
+ ### Fixed
209
+
210
+ - CI pipline failed to release package on NPM - fixed
211
+
212
+ ## 1.2.2-alpha.9 - 2026.02.07
213
+
214
+ ### Added
215
+
216
+ - Added `--research` and `--research-output` flag to lazyload module
217
+
218
+ ### Changed
219
+
220
+ ### Fixed
221
+
222
+ ## 1.2.2-alpha.8 - 2026.01.27
223
+
224
+ ### Added
225
+
226
+ - Add sourcemap reconstruction for Next.js
227
+
228
+ ### Changed
229
+
230
+ ### Fixed
231
+
232
+ - Add error handling for AST parsing in next_parseLayoutJs.ts
233
+ - Fixed scope issue in parseLayoutJs.ts
234
+
235
+ ## 1.2.2-alpha.7 - 2026.01.24
236
+
237
+ ### Added
238
+
239
+ - Added support for extracting JS files from client-side paths (HTML) in Next.js
240
+
241
+ ### Changed
242
+
243
+ - Fixed recursive script tag parsing
244
+
245
+ ### Fixed
246
+
247
+ ## 1.2.2-alpha.6 - 2026.01.18
248
+
249
+ ### Added
250
+
251
+ - Added support for parsing layout.js files in Next.js
252
+
253
+ ### Changed
254
+
255
+ ### Fixed
256
+
257
+ ## 1.2.2-alpha.5 - 2025.01.18
258
+
259
+ ### Added
260
+
261
+ - Add support to bruteforce request `.js.map` files
262
+ - Add support for Promise.all-based lazy loading in Next.js Turbopack builds
263
+
264
+ ### Changed
265
+
266
+ - Add referer header to requests for improved stability
267
+
268
+ ### Fixed
269
+
270
+ ## 1.2.2-alpha.4 - 2025.12.05
271
+
272
+ ### Added
273
+
274
+ - Added support for direct axios calls like `axios.Z.get()` for Next.js
275
+ - Added support for axios with URLs exported to chunks
276
+ - Added new method for Vue.js detection using `app.js` `Vue.component()` calls
277
+ - Added new method to find JS files through the single JS file on homepage for Vue.js
278
+ - Added new method to find JS files through import statements for Vue.js
279
+ - Added support for sourcemap reconstruction for Vue.js
280
+
281
+ ### Changed
282
+
283
+ - Improved node value resolver with research about Axios library
284
+ - Improved node value resolver with research about fetch() usage
285
+
286
+ ### Fixed
287
+
288
+ - Fixed CDN handling for Next.js applications with custom ports
289
+
290
+ ## 1.2.2-alpha.3 - 2025.11.23
291
+
292
+ ### Added
293
+
294
+ - Added support for `.Z.create()` axios pattern detection in Next.js
295
+
296
+ ### Changed
297
+
298
+ ### Fixed
299
+
300
+ - Fixed build ID extraction for Next.js applications when the subsequent requests directory is missing or inaccessible
301
+ - Fixed handling of exit when tech in one target can't be detected
302
+ - Fixed syntax error issue in Next.js build manifest parsing
303
+ - Fixed SECURITY issues by upgrading the packages
304
+
305
+ ## 1.2.2-alpha.2 - 2025.10.28
306
+
307
+ ### Added
308
+
309
+ - Added Angular support to lazyload module
310
+
311
+ ### Changed
312
+
313
+ - Added root path (`/`) to endpoints list for Next.js subsequent requests
314
+
315
+ ### Fixed
316
+
317
+ ## 1.2.2-alpha.1 - 2025.10.09
318
+
319
+ ### Added
320
+
321
+ - Added `--timeout` flag to run and lazyload modules
322
+ - Added `--no-sandbox` flag to disable browser sandbox
323
+ - Added `--build-id` flag to lazyload module to get the buildId from the Next.js app
324
+
325
+ ### Changed
326
+
327
+ ### Fixed
328
+
329
+ ## 1.2.1 - 2025.09.23
330
+
331
+ ### Added
332
+
333
+ ### Changed
334
+
335
+ ### Fixed
336
+
337
+ - Add try-catch block when checking version from GH for rules
338
+
339
+ ## 1.2.1-beta.2 - 2025.08.10
340
+
341
+ ### Added
342
+
343
+ - Added tabular view to the report
344
+
345
+ ### Changed
346
+
347
+ - The run module will skip the target if it is invalid, rather than exiting the program
348
+
349
+ ### Fixed
350
+
351
+ - Fix "Attempted to use detached Frame" error by adding try-catch block
352
+ - Fix "Cannot read properties of undefined (reading 'split')" error in openapi generator by adding try catch
353
+
354
+ ## 1.2.1-beta.1 - 2025.08.07
355
+
356
+ ### Added
357
+
358
+ ### Changed
359
+
360
+ - Added `-k` as shorthand flag to the `run` module
361
+ - Added standard exit codes to the application
362
+
363
+ ### Fixed
364
+
365
+ - Fix errors when the target is using a CDN
366
+ - Fix "possible EventEmitter memory leak detected" error
367
+ - Fix "Maximum call stack size exceeded" error in resolveNodeValue
368
+ - Fix "UND_ERR_HEADERS_OVERFLOW" error
369
+
370
+ ## 1.2.1-alpha.2 - 2025.08.06
371
+
372
+ ### Added
373
+
374
+ - Added support for parsing URL list in the run module
375
+
376
+ ### Changed
377
+
378
+ ### Fixed
379
+
380
+ ## 1.2.1-alpha.1 - 2025.08.04
381
+
382
+ ### Added
383
+
384
+ - Added `-k/--insecure` flag to disable SSL certificate verification
385
+ - Added `json` output feature to analyze module
386
+ - Added `analyze` module auto-run to `run` module
387
+ - Added `report` module
388
+
389
+ ### Changed
390
+
391
+ - Updated the `postMessageFunctionResolve` step to resolve function expressions
392
+ - Updated the `postMessageFunctionResolve` step to resolve arrow function expressions
393
+ - Remove `--map-openapi` flag from run module (enabled by default)
394
+ - Remove `--map-openapi-output` flag from run module
395
+
396
+ ### Fixed
397
+
398
+ ## 1.1.4 - 2025.08.01
399
+
400
+ ### Added
401
+
402
+ ### Changed
403
+
404
+ - Replace `:` with `_` when creating host directories in `output/`
405
+ - Rename `esquery` engine to `ast` engine
406
+ - Allow any string type for `CheckAssignmentExistStep`
407
+
408
+ ### Fixed
409
+
410
+ - Fix the issue in ast engine to handle direct assignments in `checkAssignmentExist`
411
+
412
+ ## 1.1.4-alpha.4 - 2025.07.31
413
+
414
+ ### Added
415
+
416
+ - Added HTTP method condition support in request analysis engine
417
+ - Added esquery engine for static code analysis with AST queries
418
+ - Added support for multiple technologies in esquery engine
419
+
420
+ ### Changed
421
+
422
+ ### Fixed
423
+
424
+ - Fix the issue when tech wasn't checked before running a rule
425
+ - Fix the issue with next.js lazy loading (support URLs starting with http, or CDN URLs)
426
+ - Fixed broken logic in next_GetLazyResourcesWebpackJs.ts when re-building JS URLs
427
+
428
+ ## 1.1.4-alpha.3 - 2025.07.30
429
+
430
+ ### Added
431
+
432
+ - Added `analyze` module
433
+ - Added analysis of OpenAPI spec file (requestEngine)
434
+ - Use the repo https://github.com/shriyanss/js-recon-rules to remotely store and download rules
435
+
436
+ ### Changed
437
+
438
+ ### Fixed
439
+
440
+ ## 1.1.4-alpha.2 - 2025.07.29
441
+
442
+ ### Added
443
+
444
+ - Add description to chunks in mapped.json by default when using `map` module (an axios lib is detected) or when using the `endpoints` module (when a client-side path is detected)
445
+ - Add `list desc` command to show functions with non-empty descriptions in interactive mode
446
+ - Add `refactor` module
447
+ - Iterate through all the chunks, and write it to a separate file, and add export statements
448
+
449
+ ### Changed
450
+
451
+ ### Fixed
452
+
453
+ ## 1.1.4-alpha.1 - 2025.07.28
454
+
455
+ ### Added
456
+
457
+ - Get the exports of the chunks in next.js
458
+ - Added command to get the exports of a chunk in next.js - `list exportnames`
459
+ - Added `--mapped-json` flag to endpoints module
460
+
461
+ ### Changed
462
+
463
+ - Type for `exports` is now `string[]` rather than `string` in `mapped.json`
464
+ - Remove `md` output format for endpoints module
465
+ - Removed `--subsequent-requests-dir` option from endpoints module (now use `-d` only)
466
+
467
+ ### Fixed
468
+
469
+ ## 1.1.3 - 2025.07.28
470
+
471
+ ### Added
472
+
473
+ ### Changed
474
+
475
+ ### Fixed
476
+
477
+ ## 1.1.3-beta.3 - 2025.07.26
478
+
479
+ ### Added
480
+
481
+ - Added path and query parameter extraction to OpenAPI spec generation
482
+
483
+ ### Changed
484
+
485
+ ### Fixed
486
+
487
+ ## 1.1.3-beta.2 - 2025.07.25
488
+
489
+ ### Added
490
+
491
+ - Added flags for generating OpenAPI config
492
+
493
+ ### Changed
494
+
495
+ - Prepend the baseUrl when printing the URL of axios.create() calls in next.js
496
+
497
+ ### Fixed
498
+
499
+ ## 1.1.3-beta.1 - 2025.07.24
500
+
501
+ ### Added
502
+
503
+ - Added support for axios.create() detection in Next.js resolver
504
+
505
+ ### Changed
506
+
507
+ ### Fixed
508
+
509
+ - Fixed [issue 30](https://github.com/shriyanss/js-recon/issues/30): `FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory`
510
+
511
+ ## 1.1.3-alpha.2 - 2025.07.23
512
+
513
+ ### Added
514
+
515
+ - Added request body extraction and display for axios calls
516
+ - Resolve `.concat()` operations when traversing code
517
+
518
+ ### Changed
519
+
520
+ - Display full file path in fetch call log message
521
+ - Improve output in the openapi file
522
+
523
+ ### Fixed
524
+
525
+ ## 1.1.3-alpha.1 - 2025.07.22
526
+
527
+ ### Added
528
+
529
+ - Added axios URL resolution in next.js (those using `.concat()`)
530
+ - Added openapi spec generation for map module
531
+
532
+ ### Changed
533
+
534
+ ### Fixed
535
+
536
+ ## 1.1.2 - 2025.07.21
537
+
538
+ ### Added
539
+
540
+ ### Changed
541
+
542
+ ### Fixed
543
+
544
+ ## 1.1.2-alpha.4 - 2025.07.21
545
+
546
+ ### Added
547
+
548
+ ### Changed
549
+
550
+ ### Fixed
551
+
552
+ - Fix CI pipeline for GitHub Container Registry publishing
553
+
554
+ ## 1.1.2-alpha.3 - 2025.07.21
555
+
556
+ ### Added
557
+
558
+ ### Changed
559
+
560
+ - Remove `--no-sandbox` arg when launching browser (security)
561
+
562
+ ### Fixed
563
+
564
+ - Disable chrome sandbox when running in docker to fix errors
565
+
566
+ ## 1.1.2-alpha.2 - 2025.07.20
567
+
568
+ ### Added
569
+
570
+ - Created docker image for js-recon
571
+
572
+ ### Changed
573
+
574
+ ### Fixed
575
+
576
+ ## 1.1.2-alpha.1 - 2025.07.19
577
+
578
+ ### Added
579
+
580
+ - Added axios client detection in next.js
581
+ - Added `list axios` command in interactive mode for next.js
582
+
583
+ ### Changed
584
+
585
+ ### Fixed
586
+
587
+ - Provide proper directory for JS files to the `map` module when the `run` module is used
588
+ - Added output directory conflict check when using `run` module
589
+
590
+ ## 1.1.1 - 2025.07.18
591
+
592
+ ### Added
593
+
594
+ ### Changed
595
+
596
+ ### Fixed
597
+
598
+ - Fixed the version number mismatch in `CHANGELOG.md` (stated 1.1.0) and `package.json` (stated 1.1.0-beta.5)
599
+
600
+ ## 1.1.0/1.1.0-beta.5 - 2025.07.18
601
+
602
+ ### Added
603
+
604
+ - Detect next in servers in which src includes '/\_next/' rather than just startsWith
605
+ - Detect webpack chunks in \_buildManifest.js
606
+
607
+ ### Changed
608
+
609
+ ### Fixed
610
+
611
+ ## 1.1.0-beta.4 - 2025.07.09
612
+
613
+ ### Added
614
+
615
+ - Added `set funcdesc <functionId> <description>` command to interactive mode
616
+
617
+ ### Changed
618
+
619
+ - Pressing C-c in input box (interactive mode) will now also print the command like OS terminal
620
+ - Set the default value of `set writeimports` as `false`
621
+ - Do not store dupe and non-existent entries in `state.functionNavHistory` (interactive mode)
622
+
623
+ ### Fixed
624
+
625
+ - Fix error of body has been read when running the tool for first time
626
+ - Print an error when the user passes a URL list (file) to the run command
627
+ - Add error recovery in Nuxt ast parse
628
+
629
+ ## 1.1.0-beta.3 - 2025.07.08
630
+
631
+ ### Added
632
+
633
+ - Added command `set writeimports` in interactive mode for next.js
634
+ - Detect ArrowFunctionExpression when getting webpack connections (Next.JS)
635
+
636
+ ### Changed
637
+
638
+ ### Fixed
639
+
640
+ - Implement proper error handling in `list nav` in interactive mode
641
+ - Implement error handling when going to non-existent function by `back` and `ahead` in interactive mode
642
+ - Add errorRecovery in all parser.parse to enable parsing the file even if invalid due to any reason
643
+ - Implement coderabbit suggestion: 'Truthiness check can skip fd 0'
644
+
645
+ ## 1.1.0-beta.2 - 2025.07.07
646
+
647
+ ### Added
648
+
649
+ ### Changed
650
+
651
+ ### Fixed
652
+
653
+ - Fix build errors (type errors)
654
+
655
+ ## 1.1.0-beta.1 - 2025.07.07
656
+
657
+ ### Added
658
+
659
+ - Svelte framework detection, and JS extraction
660
+ - JSON-based file cache
661
+ - Auto-approve executing JS code (`-y`/`--yes`)
662
+ - Added max threads for downloading JS files `-t`/`--threads`
663
+ - Add timeout handling and network idle check for page load in tech detection
664
+ - Parse script tags to extract additional JavaScript URLs from page
665
+ - Add secret scanning
666
+ - Add feasibility check to API gateway function
667
+ - Add endpoints module to support client-side path extraction
668
+ - Add subsequent-requests feature (`RSC: 1`) in Next.JS
669
+ - Add map module
670
+ - Webpack chunk parsing
671
+ - Interactive mode
672
+ - `fetch()` detection
673
+ - Permutation in `strings` module
674
+ - OpenAI and Ollama integration for AI descriptions
675
+
676
+ ### Changed
677
+
678
+ ### Fixed
679
+
680
+ - Standardize UTF-8 encoding and improve URL path handling in lazy load module
681
+
682
+ ## 1.0.0 - 2025.06.18
683
+
684
+ ### Added
685
+
686
+ - Lazy Load Support for Next.js and Nuxt.js
687
+ - JavaScript String Extraction from downloaded JS files
688
+ - API Gateway Proxying to rotate IP addresses
689
+
690
+ ### Changed
691
+
692
+ ### Fixed