@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
@@ -0,0 +1,516 @@
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 chalk from "chalk";
11
+ import fs from "fs";
12
+ import { marked } from "marked";
13
+ import hljs from "highlight.js";
14
+ import addAnalyze from "./markdownGen/addAnalyze.js";
15
+ import CONFIG from "../../globalConfig.js";
16
+ import addMappedJson from "./markdownGen/addMappedJson.js";
17
+ import genDataTablesPage from "./dataTables/genDataTablesPage.js";
18
+ import { createRequire } from "module";
19
+ /**
20
+ * Attempts to read local DataTables assets from node_modules (for offline/self-contained reports)
21
+ *
22
+ * @returns An object containing the DataTables JavaScript and CSS, or null if not found
23
+ */
24
+ const getLocalDataTablesAssets = () => {
25
+ try {
26
+ const require = createRequire(import.meta.url);
27
+ const dtJsPath = require.resolve("datatables.net/js/dataTables.min.js");
28
+ const dtCssPath = require.resolve("datatables.net-dt/css/dataTables.dataTables.min.css");
29
+ const js = fs.readFileSync(dtJsPath, "utf8");
30
+ const css = fs.readFileSync(dtCssPath, "utf8");
31
+ return { js, css };
32
+ }
33
+ catch (e) {
34
+ console.warn("[DataTables] Local assets not found; falling back to CDN", (e === null || e === void 0 ? void 0 : e.message) || e);
35
+ return { js: null, css: null };
36
+ }
37
+ };
38
+ /**
39
+ * Attempts to read local jQuery asset
40
+ *
41
+ * @returns The jQuery JavaScript, or null if not found
42
+ */
43
+ const getLocalJqueryAsset = () => {
44
+ try {
45
+ const require = createRequire(import.meta.url);
46
+ const jqPath = require.resolve("jquery/dist/jquery.min.js");
47
+ const js = fs.readFileSync(jqPath, "utf8");
48
+ return js;
49
+ }
50
+ catch (e) {
51
+ console.warn("[DataTables] Local jQuery not found; falling back to CDN", (e === null || e === void 0 ? void 0 : e.message) || e);
52
+ return null;
53
+ }
54
+ };
55
+ /**
56
+ * Generates an HTML report based on the provided markdown and assets.
57
+ *
58
+ * @param analyzeMarkdown - The markdown for the analyze section
59
+ * @param mappedJsonMarkdown - The markdown for the mapped JSON section
60
+ * @param dataTablesHtml - The HTML for the data tables section
61
+ * @param dtAssets - The DataTables assets (JavaScript and CSS)
62
+ * @param jqueryJs - The jQuery JavaScript
63
+ *
64
+ * @returns The generated HTML report as a string
65
+ */
66
+ const html = (analyzeMarkdown, mappedJsonMarkdown, dataTablesHtml, dtAssets, jqueryJs) => __awaiter(void 0, void 0, void 0, function* () {
67
+ return `<!DOCTYPE html>
68
+ <html>
69
+ <head>
70
+ <meta charset="UTF-8">
71
+ <title>JS Recon Report</title>
72
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/highlight.js@11.9.0/styles/github-dark.css">
73
+ ${dtAssets.css
74
+ ? `<style id="dt-inline-css">${dtAssets.css}</style>`
75
+ : `<link rel="stylesheet" href="https://cdn.datatables.net/2.0.8/css/dataTables.dataTables.min.css">`}
76
+ <style>
77
+ h2, h3, h4 {
78
+ cursor: pointer;
79
+ position: relative;
80
+ padding-left: 20px;
81
+ }
82
+ h2::before, h3::before, h4::before {
83
+ content: '▼';
84
+ position: absolute;
85
+ left: 0;
86
+ transition: transform 0.2s;
87
+ }
88
+ .collapsed::before {
89
+ transform: rotate(-90deg);
90
+ }
91
+ body {
92
+ padding-top: 80px; /* Height of the navbar */
93
+ }
94
+ .navbar {
95
+ position: fixed;
96
+ top: 0;
97
+ left: 0;
98
+ width: 100%;
99
+ background-color: #ffffff;
100
+ border-bottom: 1px solid #e0e0e0;
101
+ display: flex;
102
+ align-items: center;
103
+ padding: 10px 20px;
104
+ z-index: 1000;
105
+ box-shadow: 0 2px 5px rgba(0,0,0,0.1);
106
+ }
107
+ .navbar-logo img {
108
+ height: 40px;
109
+ }
110
+ .navbar-links {
111
+ list-style: none;
112
+ margin: 0 0 0 20px;
113
+ padding: 0;
114
+ display: flex;
115
+ gap: 15px;
116
+ }
117
+ .data-table { font-size: 0.9rem; }
118
+ pre.code-cell { white-space: pre-wrap; word-break: break-word; max-height: 200px; overflow: auto; }
119
+ thead tr.filter-row th { padding: 4px 6px; }
120
+ thead tr.filter-row th input {
121
+ width: 100%;
122
+ padding: 4px 6px;
123
+ border: 1px solid #ccc;
124
+ border-radius: 4px;
125
+ font-size: 0.85rem;
126
+ box-sizing: border-box;
127
+ }
128
+ /* Column resize styles */
129
+ table.display.data-table { table-layout: fixed; }
130
+ table.display.data-table thead th { position: relative; }
131
+ .th-resizer {
132
+ position: absolute;
133
+ right: 0;
134
+ top: 0;
135
+ width: 6px;
136
+ height: 100%;
137
+ cursor: col-resize;
138
+ user-select: none;
139
+ opacity: 0;
140
+ transition: opacity 0.15s ease-in-out;
141
+ }
142
+ table.display.data-table thead th:hover .th-resizer { opacity: 1; }
143
+ </style>
144
+ </head>
145
+ <body>
146
+ <nav class="navbar">
147
+ <div class="navbar-logo">
148
+ <img src="https://js-recon.io/img/js-recon-logo.png" alt="JS Recon Logo">
149
+ </div>
150
+ <ul class="navbar-links" id="navbar-links">
151
+ <li><a href="#home">Home</a></li>
152
+ <li><a href="#mappedJson">Mapped JSON</a></li>
153
+ <li><a href="#dataTables">Data Tables</a></li>
154
+ <li><a href="#about">About</a></li>
155
+ </ul>
156
+ </nav>
157
+ <div id="content"></div>
158
+ <script id="page-data" type="application/json">
159
+ ${JSON.stringify({
160
+ home: yield marked.parse(analyzeMarkdown),
161
+ mappedJson: yield marked.parse(mappedJsonMarkdown),
162
+ dataTables: dataTablesHtml,
163
+ about: `# About\n\n The documentation for this tool is available at [JS Recon Docs](https://js-recon.io/).\n\n## Version\n\nThis report is generated with JS Recon [v${CONFIG.version}](https://github.com/shriyanss/js-recon/releases/tag/v${CONFIG.version}).`,
164
+ }).replace(/</g, "\\u003c")}
165
+ </script>
166
+ <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
167
+ ${jqueryJs
168
+ ? `<script id="jquery-inline-js">${jqueryJs}</script>`
169
+ : `<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>`}
170
+ ${dtAssets.js
171
+ ? `<script id="dt-inline-js">${dtAssets.js}</script>`
172
+ : `<script src="https://cdn.datatables.net/2.0.8/js/dataTables.min.js"></script>`}
173
+ <script>
174
+ document.addEventListener('DOMContentLoaded', () => {
175
+ const contentDiv = document.getElementById('content');
176
+ const navbarLinks = document.getElementById('navbar-links');
177
+ const pages = JSON.parse(document.getElementById('page-data').textContent);
178
+
179
+ const isDtAvailable = () => {
180
+ if (typeof window.DataTable !== 'undefined') return true; // ESM/global
181
+ const $ = window.jQuery || window.$;
182
+ return !!($ && $.fn && ($.fn.DataTable || $.fn.dataTable)); // UMD via jQuery plugin
183
+ };
184
+
185
+ const loadScriptOnce = (src, id) => new Promise((resolve, reject) => {
186
+ if (document.getElementById(id)) return resolve(null);
187
+ const s = document.createElement('script');
188
+ s.src = src;
189
+ s.id = id;
190
+ s.onload = () => resolve(null);
191
+ s.onerror = (e) => reject(e);
192
+ document.head.appendChild(s);
193
+ });
194
+
195
+ const loadCssOnce = (href, id) => new Promise((resolve) => {
196
+ if (document.getElementById(id)) return resolve(null);
197
+ const l = document.createElement('link');
198
+ l.rel = 'stylesheet';
199
+ l.href = href;
200
+ l.id = id;
201
+ l.onload = () => resolve(null);
202
+ l.onerror = () => resolve(null);
203
+ document.head.appendChild(l);
204
+ });
205
+
206
+ const ensureJquery = async () => {
207
+ if (window.jQuery) return true;
208
+ const jqCdn = [
209
+ 'https://code.jquery.com/jquery-3.7.1.min.js',
210
+ 'https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js',
211
+ 'https://unpkg.com/jquery@3.7.1/dist/jquery.min.js'
212
+ ];
213
+ for (let i = 0; i < jqCdn.length; i++) {
214
+ const url = jqCdn[i];
215
+ try {
216
+ await loadScriptOnce(url, 'jq-cdn-' + i);
217
+ } catch (e) {
218
+ console.error('[jQuery] Load failed', url, e);
219
+ }
220
+ if (window.jQuery) {
221
+ console.log('[jQuery] Loaded from', url);
222
+ return true;
223
+ }
224
+ }
225
+ return false;
226
+ };
227
+
228
+ const tryLoadDataTables = async () => {
229
+ // Ensure jQuery is present for DataTables UMD build
230
+ if (!isDtAvailable() && !window.jQuery) {
231
+ const jqOk = await ensureJquery();
232
+ if (!jqOk) {
233
+ console.error('[DataTables] jQuery not available; cannot initialize DataTables.');
234
+ }
235
+ }
236
+ const sources = [
237
+ {
238
+ js: 'https://cdn.datatables.net/2.0.8/js/dataTables.min.js',
239
+ css: 'https://cdn.datatables.net/2.0.8/css/dataTables.dataTables.min.css',
240
+ id: 'dt-cdn'
241
+ },
242
+ {
243
+ js: 'https://cdn.jsdelivr.net/npm/datatables.net@2.0.8/js/dataTables.min.js',
244
+ css: 'https://cdn.jsdelivr.net/npm/datatables.net-dt@2.0.8/css/dataTables.dataTables.min.css',
245
+ id: 'dt-jsd'
246
+ },
247
+ {
248
+ js: 'https://unpkg.com/datatables.net@2.0.8/js/dataTables.min.js',
249
+ css: 'https://unpkg.com/datatables.net-dt@2.0.8/css/dataTables.dataTables.min.css',
250
+ id: 'dt-unp'
251
+ }
252
+ ];
253
+ for (const src of sources) {
254
+ if (isDtAvailable()) return true;
255
+ console.warn('[DataTables] Attempting load from', src.js);
256
+ await loadCssOnce(src.css, src.id + '-css');
257
+ try {
258
+ await loadScriptOnce(src.js, src.id + '-js');
259
+ } catch (e) {
260
+ console.error('[DataTables] Load failed', src.js, e);
261
+ }
262
+ if (isDtAvailable()) {
263
+ console.log('[DataTables] Loaded from', src.js);
264
+ return true;
265
+ }
266
+ }
267
+ return false;
268
+ };
269
+
270
+ const updateVisibility = () => {
271
+ const headers = contentDiv.querySelectorAll('h2, h3, h4');
272
+ let parentCollapsedLevels = [];
273
+ headers.forEach(header => {
274
+ const level = parseInt(header.tagName.substring(1));
275
+ parentCollapsedLevels = parentCollapsedLevels.filter(l => l < level);
276
+ if (parentCollapsedLevels.length > 0) {
277
+ header.style.display = 'none';
278
+ } else {
279
+ header.style.display = '';
280
+ }
281
+ if (header.classList.contains('collapsed')) {
282
+ parentCollapsedLevels.push(level);
283
+ }
284
+ let nextEl = header.nextElementSibling;
285
+ while (nextEl && !nextEl.tagName.match(/^H[1-4]$/)) {
286
+ if (parentCollapsedLevels.length > 0) {
287
+ nextEl.style.display = 'none';
288
+ } else {
289
+ nextEl.style.display = '';
290
+ }
291
+ nextEl = nextEl.nextElementSibling;
292
+ }
293
+ });
294
+ };
295
+
296
+ const setColWidth = (tableEl, colIndex, widthPx) => {
297
+ const nth = colIndex + 1;
298
+ const w = Math.max(50, widthPx) + 'px';
299
+ const th = tableEl.querySelector('thead tr:first-child th:nth-child(' + nth + ')');
300
+ if (th) th.style.width = w;
301
+ const filterTh = tableEl.querySelector('thead tr.filter-row th:nth-child(' + nth + ')');
302
+ if (filterTh) filterTh.style.width = w;
303
+ const tds = tableEl.querySelectorAll('tbody tr td:nth-child(' + nth + ')');
304
+ tds.forEach(td => { td.style.width = w; });
305
+ };
306
+
307
+ const addColumnResizers = (tableEl) => {
308
+ if (!tableEl || tableEl.dataset.resizers === '1') return;
309
+ const ths = tableEl.querySelectorAll('thead tr:first-child th');
310
+ ths.forEach((th, idx) => {
311
+ if (th.querySelector('.th-resizer')) return;
312
+ const handle = document.createElement('div');
313
+ handle.className = 'th-resizer';
314
+ th.appendChild(handle);
315
+ let startX = 0;
316
+ let startWidth = 0;
317
+ const onMouseMove = (e) => {
318
+ const dx = e.pageX - startX;
319
+ setColWidth(tableEl, idx, startWidth + dx);
320
+ };
321
+ const onMouseUp = () => {
322
+ document.removeEventListener('mousemove', onMouseMove);
323
+ document.removeEventListener('mouseup', onMouseUp);
324
+ document.body.style.cursor = '';
325
+ };
326
+ handle.addEventListener('mousedown', (e) => {
327
+ e.preventDefault();
328
+ startX = e.pageX;
329
+ startWidth = th.offsetWidth;
330
+ document.addEventListener('mousemove', onMouseMove);
331
+ document.addEventListener('mouseup', onMouseUp);
332
+ document.body.style.cursor = 'col-resize';
333
+ });
334
+ });
335
+ tableEl.dataset.resizers = '1';
336
+ // Ensure table layout
337
+ tableEl.style.tableLayout = 'fixed';
338
+ };
339
+
340
+ const initializeDataTablesIfPresent = async () => {
341
+ try {
342
+ // Ensure DataTables (ESM or UMD) is present
343
+ if (!isDtAvailable()) {
344
+ const ok = await tryLoadDataTables();
345
+ if (!ok) {
346
+ console.error('[DataTables] Unable to load DataTables from any CDN. Controls disabled.');
347
+ return;
348
+ }
349
+ }
350
+ const tables = contentDiv.querySelectorAll('table.data-table');
351
+ console.log('[DataTables] Initializing', tables.length, 'table(s)');
352
+ tables.forEach((table) => {
353
+ if (table.dataset.dtInit === '1') return;
354
+ const options = {
355
+ paging: true,
356
+ searching: true,
357
+ ordering: true,
358
+ orderMulti: true,
359
+ pageLength: 25,
360
+ autoWidth: false,
361
+ // v1 fallback
362
+ dom: 'lfrtip',
363
+ // v2 layout API
364
+ layout: {
365
+ topStart: 'search',
366
+ topEnd: 'pageLength',
367
+ bottomStart: 'info',
368
+ bottomEnd: 'paging'
369
+ }
370
+ };
371
+
372
+ // Per-table column options
373
+ if (table.id === 'findings-table') {
374
+ options.columnDefs = [{ targets: 8, orderable: false, searchable: false }];
375
+ } else if (table.id === 'mapped-table') {
376
+ options.columnDefs = [{ targets: [2, 3], searchable: false }];
377
+ }
378
+
379
+ let dt;
380
+ try {
381
+ if (typeof window.DataTable !== 'undefined') {
382
+ dt = new window.DataTable(table, options); // ESM/global style
383
+ } else {
384
+ const $ = window.jQuery || window.$;
385
+ if ($ && $.fn && $.fn.DataTable) {
386
+ dt = $(table).DataTable(options); // UMD via jQuery plugin
387
+ } else {
388
+ throw new Error('DataTables not available.');
389
+ }
390
+ }
391
+ } catch (e) {
392
+ console.error('[DataTables] Error instantiating on table#' + table.id, e);
393
+ return;
394
+ }
395
+
396
+ // Add per-column filters (second header row)
397
+ const thead = table.querySelector('thead');
398
+ if (thead && !thead.querySelector('tr.filter-row')) {
399
+ const headerCells = thead.querySelectorAll('tr:first-child th');
400
+ const filterRow = document.createElement('tr');
401
+ filterRow.className = 'filter-row';
402
+ headerCells.forEach((th, idx) => {
403
+ const thFilter = document.createElement('th');
404
+ // Skip filter for non-searchable columns if specified
405
+ const isSearchable = !options.columnDefs || !options.columnDefs.some(cd => {
406
+ if (Array.isArray(cd.targets)) return cd.targets.includes(idx) && cd.searchable === false;
407
+ return cd.targets === idx && cd.searchable === false;
408
+ });
409
+ if (isSearchable) {
410
+ const input = document.createElement('input');
411
+ input.type = 'text';
412
+ input.placeholder = 'Filter ' + (th.textContent || '').trim();
413
+ input.addEventListener('input', () => {
414
+ dt.column(idx).search(input.value).draw();
415
+ });
416
+ thFilter.appendChild(input);
417
+ }
418
+ filterRow.appendChild(thFilter);
419
+ });
420
+ thead.appendChild(filterRow);
421
+ }
422
+ table.dataset.dtInit = '1';
423
+ // Attach column resizers after DataTables and filters are in place
424
+ addColumnResizers(table);
425
+ // Let DataTables recalc
426
+ try { if (dt && dt.columns) dt.columns().adjust(); } catch (e) {}
427
+ });
428
+ } catch (e) {
429
+ console.error('DataTables init error', e);
430
+ }
431
+ };
432
+
433
+ const initializeCollapsibleHeaders = () => {
434
+ const headers = contentDiv.querySelectorAll('h2, h3, h4');
435
+ headers.forEach((header) => {
436
+ if (header.tagName.toLowerCase() === 'h3') {
437
+ header.classList.add('collapsed');
438
+ }
439
+ header.addEventListener('click', () => {
440
+ header.classList.toggle('collapsed');
441
+ updateVisibility();
442
+ });
443
+ });
444
+ updateVisibility();
445
+ };
446
+
447
+ const renderPage = (pageName) => {
448
+ const content = pages[pageName] || '<h2>Page Not Found: ' + pageName + '</h2>';
449
+ if (pageName === 'home' || pageName === 'dataTables' || pageName === 'mappedJson') {
450
+ contentDiv.innerHTML = content;
451
+ } else {
452
+ contentDiv.innerHTML = window.marked.parse(content);
453
+ }
454
+ initializeCollapsibleHeaders();
455
+ initializeDataTablesIfPresent();
456
+ };
457
+
458
+ const handleHashChange = () => {
459
+ const pageName = window.location.hash.substring(1) || 'home';
460
+ renderPage(pageName);
461
+ };
462
+
463
+ navbarLinks.addEventListener('click', (event) => {
464
+ const t = event.target;
465
+ const a = t && (t.closest ? t.closest('a') : null);
466
+ if (a && a.hash) {
467
+ event.preventDefault();
468
+ const pageName = a.hash.substring(1);
469
+ window.location.hash = pageName;
470
+ }
471
+ });
472
+
473
+ window.addEventListener('hashchange', handleHashChange);
474
+
475
+ // Initial page load
476
+ handleHashChange();
477
+ });
478
+ </script>
479
+ </body>
480
+ </html>`;
481
+ });
482
+ /**
483
+ * Generates an HTML report based on the provided database.
484
+ *
485
+ * @param outputReportFile - The path to the output report file
486
+ * @param db - The database containing the findings and mapped data
487
+ *
488
+ * @returns A promise that resolves when the HTML report is generated
489
+ */
490
+ const genHtml = (outputReportFile, db) => __awaiter(void 0, void 0, void 0, function* () {
491
+ console.log(chalk.cyan("[i] Generating HTML report..."));
492
+ let analyzeMarkdown = `# JS Recon Report generated at ${new Date().toISOString()}\n\n`;
493
+ let mappedJsonMarkdown = analyzeMarkdown;
494
+ analyzeMarkdown = yield addAnalyze(analyzeMarkdown, db);
495
+ mappedJsonMarkdown = yield addMappedJson(mappedJsonMarkdown, db);
496
+ const dataTablesHtml = genDataTablesPage(db);
497
+ const renderer = new marked.Renderer();
498
+ renderer.code = ({ text, lang }) => {
499
+ const language = hljs.getLanguage(lang) ? lang : "plaintext";
500
+ const highlightedCode = hljs.highlight(text, { language, ignoreIllegals: true }).value;
501
+ return `<pre><code class="hljs ${language}">${highlightedCode}</code></pre>`;
502
+ };
503
+ marked.setOptions({
504
+ renderer,
505
+ async: true,
506
+ pedantic: false,
507
+ gfm: true,
508
+ });
509
+ const dtAssets = getLocalDataTablesAssets();
510
+ const jqueryJs = getLocalJqueryAsset();
511
+ const renderedHtml = yield html(analyzeMarkdown, mappedJsonMarkdown, dataTablesHtml, dtAssets, jqueryJs);
512
+ fs.writeFileSync(outputReportFile, renderedHtml);
513
+ console.log(chalk.green("[✓] HTML report generated successfully"));
514
+ });
515
+ export default genHtml;
516
+ //# sourceMappingURL=genHtml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"genHtml.js","sourceRoot":"","sources":["../../../src/report/utility/genHtml.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,IAAI,MAAM,cAAc,CAAC;AAEhC,OAAO,UAAU,MAAM,6BAA6B,CAAC;AACrD,OAAO,MAAM,MAAM,uBAAuB,CAAC;AAC3C,OAAO,aAAa,MAAM,gCAAgC,CAAC;AAC3D,OAAO,iBAAiB,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAQvC;;;;GAIG;AACH,MAAM,wBAAwB,GAAG,GAAG,EAAE;IAClC,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC;QACxE,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC;QACzF,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC/C,OAAO,EAAE,EAAE,EAAE,GAAG,EAA+C,CAAC;IACpE,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,0DAA0D,EAAE,CAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,OAAO,KAAI,CAAC,CAAC,CAAC;QAC1F,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAA+C,CAAC;IAChF,CAAC;AACL,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,GAAG,EAAE;IAC7B,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QAC5D,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC3C,OAAO,EAAmB,CAAC;IAC/B,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,0DAA0D,EAAE,CAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,OAAO,KAAI,CAAC,CAAC,CAAC;QAC1F,OAAO,IAAqB,CAAC;IACjC,CAAC;AACL,CAAC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,IAAI,GAAG,CACT,eAAuB,EACvB,kBAA0B,EAC1B,cAAsB,EACtB,QAAmD,EACnD,QAAuB,EACzB,EAAE;IACA,OAAO;;;;;;IAOL,QAAQ,CAAC,GAAG;QACR,CAAC,CAAC,6BAA6B,QAAQ,CAAC,GAAG,UAAU;QACrD,CAAC,CAAC,mGACV;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAoFI,IAAI,CAAC,SAAS,CAAC;QACb,IAAI,EAAE,MAAM,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC;QACzC,UAAU,EAAE,MAAM,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC;QAClD,UAAU,EAAE,cAAc;QAC1B,KAAK,EAAE,gKAAgK,MAAM,CAAC,OAAO,yDAAyD,MAAM,CAAC,OAAO,IAAI;KACnQ,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;;;IAIzB,QAAQ;QACJ,CAAC,CAAC,iCAAiC,QAAQ,WAAW;QACtD,CAAC,CAAC,qEACV;IAEI,QAAQ,CAAC,EAAE;QACP,CAAC,CAAC,6BAA6B,QAAQ,CAAC,EAAE,WAAW;QACrD,CAAC,CAAC,+EACV;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAoTM,CAAC;AACT,CAAC,CAAA,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,OAAO,GAAG,CAAO,gBAAwB,EAAE,EAAqB,EAAE,EAAE;IACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;IAEzD,IAAI,eAAe,GAAG,kCAAkC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC;IACvF,IAAI,kBAAkB,GAAG,eAAe,CAAC;IAEzC,eAAe,GAAG,MAAM,UAAU,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IACxD,kBAAkB,GAAG,MAAM,aAAa,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAEjE,MAAM,cAAc,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAE7C,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;IACvC,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,IAAc,CAAC,CAAC,CAAC,CAAE,IAAe,CAAC,CAAC,CAAC,WAAW,CAAC;QACnF,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC;QACvF,OAAO,0BAA0B,QAAQ,KAAK,eAAe,eAAe,CAAC;IACjF,CAAC,CAAC;IAEF,MAAM,CAAC,UAAU,CAAC;QACd,QAAQ;QACR,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,KAAK;QACf,GAAG,EAAE,IAAI;KACZ,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,wBAAwB,EAAE,CAAC;IAC5C,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IACvC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,kBAAkB,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACzG,EAAE,CAAC,aAAa,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAEjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC,CAAC;AACvE,CAAC,CAAA,CAAC;AAEF,eAAe,OAAO,CAAC"}
@@ -0,0 +1,96 @@
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 Database from "better-sqlite3";
11
+ /**
12
+ * Creates the mapped table in the database.
13
+ *
14
+ * @param db - The database to create the table in
15
+ */
16
+ const createMappedTable = (db) => {
17
+ db.prepare(`
18
+ CREATE TABLE IF NOT EXISTS mapped (
19
+ id TEXT PRIMARY KEY,
20
+ description TEXT,
21
+ loadedOn TEXT,
22
+ containsFetch BOOLEAN,
23
+ isAxiosClient BOOLEAN,
24
+ exports TEXT,
25
+ callStack TEXT,
26
+ code TEXT,
27
+ imports TEXT,
28
+ file TEXT
29
+ )
30
+ `).run();
31
+ };
32
+ /**
33
+ * Creates the mapped OpenAPI table in the database.
34
+ *
35
+ * @param db - The database to create the table in
36
+ */
37
+ const createMappedOpenapiTable = (db) => {
38
+ db.prepare(`
39
+ CREATE TABLE IF NOT EXISTS mapped_openapi (
40
+ path TEXT,
41
+ method TEXT,
42
+ summary TEXT,
43
+ parameters TEXT,
44
+ requestBody TEXT,
45
+ tags TEXT,
46
+ PRIMARY KEY (path, method)
47
+ )
48
+ `).run();
49
+ };
50
+ /**
51
+ * Creates the endpoints table in the database.
52
+ *
53
+ * @param db - The database to create the table in
54
+ */
55
+ const createEndpointsTable = (db) => {
56
+ db.prepare(`
57
+ CREATE TABLE IF NOT EXISTS endpoints (
58
+ url TEXT PRIMARY KEY
59
+ )
60
+ `).run();
61
+ };
62
+ /**
63
+ * Creates the analysis findings table in the database.
64
+ *
65
+ * @param db - The database to create the table in
66
+ */
67
+ const createAnalysisFindingsTable = (db) => {
68
+ db.prepare(`
69
+ CREATE TABLE IF NOT EXISTS analysis_findings (
70
+ ruleId TEXT,
71
+ ruleName TEXT,
72
+ ruleType TEXT,
73
+ ruleDescription TEXT,
74
+ ruleAuthor TEXT,
75
+ ruleTech TEXT,
76
+ severity TEXT,
77
+ message TEXT,
78
+ findingLocation TEXT
79
+ )
80
+ `).run();
81
+ };
82
+ /**
83
+ * Initializes the report database.
84
+ *
85
+ * @param sqliteDbPath - The path to the SQLite database file
86
+ */
87
+ const initReportDb = (sqliteDbPath) => __awaiter(void 0, void 0, void 0, function* () {
88
+ const db = new Database(sqliteDbPath);
89
+ createMappedTable(db);
90
+ createMappedOpenapiTable(db);
91
+ createEndpointsTable(db);
92
+ createAnalysisFindingsTable(db);
93
+ db.close();
94
+ });
95
+ export default initReportDb;
96
+ //# sourceMappingURL=initReportDb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initReportDb.js","sourceRoot":"","sources":["../../../src/report/utility/initReportDb.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC;;;;GAIG;AACH,MAAM,iBAAiB,GAAG,CAAC,EAAqB,EAAE,EAAE;IAChD,EAAE,CAAC,OAAO,CACN;;;;;;;;;;;;;KAaH,CACA,CAAC,GAAG,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,wBAAwB,GAAG,CAAC,EAAqB,EAAE,EAAE;IACvD,EAAE,CAAC,OAAO,CACN;;;;;;;;;;KAUH,CACA,CAAC,GAAG,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,oBAAoB,GAAG,CAAC,EAAqB,EAAE,EAAE;IACnD,EAAE,CAAC,OAAO,CACN;;;;KAIH,CACA,CAAC,GAAG,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,2BAA2B,GAAG,CAAC,EAAqB,EAAE,EAAE;IAC1D,EAAE,CAAC,OAAO,CACN;;;;;;;;;;;;KAYH,CACA,CAAC,GAAG,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,YAAY,GAAG,CAAO,YAAoB,EAAE,EAAE;IAChD,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,YAAY,CAAC,CAAC;IAEtC,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACtB,wBAAwB,CAAC,EAAE,CAAC,CAAC;IAC7B,oBAAoB,CAAC,EAAE,CAAC,CAAC;IACzB,2BAA2B,CAAC,EAAE,CAAC,CAAC;IAEhC,EAAE,CAAC,KAAK,EAAE,CAAC;AACf,CAAC,CAAA,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,53 @@
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
+ /**
11
+ * Adds an analyze section to the markdown.
12
+ *
13
+ * @param markdown - The markdown string to add the analyze section to
14
+ * @param db - The database containing the findings
15
+ *
16
+ * @returns A promise that resolves with the markdown string containing the analyze section
17
+ */
18
+ const addAnalyze = (markdown, db) => __awaiter(void 0, void 0, void 0, function* () {
19
+ let toReturn = markdown;
20
+ toReturn += `\n## Analyze Results\n`;
21
+ const findings = db.prepare(`SELECT * FROM analysis_findings`).all();
22
+ if (findings.length > 0) {
23
+ const groupedFindings = {};
24
+ for (const finding of findings) {
25
+ if (!groupedFindings[finding.ruleType]) {
26
+ groupedFindings[finding.ruleType] = [];
27
+ }
28
+ groupedFindings[finding.ruleType].push(finding);
29
+ }
30
+ for (const ruleType in groupedFindings) {
31
+ toReturn += `### ${ruleType.toUpperCase()}\n`;
32
+ for (const finding of groupedFindings[ruleType]) {
33
+ toReturn += `#### ${finding.ruleName}, ${finding.ruleDescription}\n`;
34
+ let findingLocationBlock = "";
35
+ if (ruleType.toLowerCase() === "ast") {
36
+ findingLocationBlock = "```js\n" + finding.findingLocation + "\n```";
37
+ }
38
+ else {
39
+ findingLocationBlock = "```\n" + finding.findingLocation + "\n```";
40
+ }
41
+ toReturn += `${findingLocationBlock}\n`;
42
+ toReturn += `- **Rule ID:** ${finding.ruleId}\n`;
43
+ toReturn += `- **Severity:** ${finding.severity}\n`;
44
+ toReturn += `- **Message:** ${finding.message}\n`;
45
+ toReturn += `- **Author:** ${finding.ruleAuthor}\n`;
46
+ toReturn += `- **Technology:** ${finding.ruleTech}\n\n`;
47
+ }
48
+ }
49
+ }
50
+ return toReturn;
51
+ });
52
+ export default addAnalyze;
53
+ //# sourceMappingURL=addAnalyze.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addAnalyze.js","sourceRoot":"","sources":["../../../../src/report/utility/markdownGen/addAnalyze.ts"],"names":[],"mappings":";;;;;;;;;AAcA;;;;;;;GAOG;AACH,MAAM,UAAU,GAAG,CAAO,QAAgB,EAAE,EAAqB,EAAmB,EAAE;IAClF,IAAI,QAAQ,GAAG,QAAQ,CAAC;IACxB,QAAQ,IAAI,wBAAwB,CAAC;IACrC,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC,GAAG,EAAuB,CAAC;IAC1F,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,eAAe,GAAyC,EAAE,CAAC;QACjE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACrC,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;YAC3C,CAAC;YACD,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC;QAED,KAAK,MAAM,QAAQ,IAAI,eAAe,EAAE,CAAC;YACrC,QAAQ,IAAI,OAAO,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;YAC9C,KAAK,MAAM,OAAO,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9C,QAAQ,IAAI,QAAQ,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,eAAe,IAAI,CAAC;gBACrE,IAAI,oBAAoB,GAAG,EAAE,CAAC;gBAC9B,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;oBACnC,oBAAoB,GAAG,SAAS,GAAG,OAAO,CAAC,eAAe,GAAG,OAAO,CAAC;gBACzE,CAAC;qBAAM,CAAC;oBACJ,oBAAoB,GAAG,OAAO,GAAG,OAAO,CAAC,eAAe,GAAG,OAAO,CAAC;gBACvE,CAAC;gBACD,QAAQ,IAAI,GAAG,oBAAoB,IAAI,CAAC;gBACxC,QAAQ,IAAI,kBAAkB,OAAO,CAAC,MAAM,IAAI,CAAC;gBACjD,QAAQ,IAAI,mBAAmB,OAAO,CAAC,QAAQ,IAAI,CAAC;gBACpD,QAAQ,IAAI,kBAAkB,OAAO,CAAC,OAAO,IAAI,CAAC;gBAClD,QAAQ,IAAI,iBAAiB,OAAO,CAAC,UAAU,IAAI,CAAC;gBACpD,QAAQ,IAAI,qBAAqB,OAAO,CAAC,QAAQ,MAAM,CAAC;YAC5D,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAA,CAAC;AAEF,eAAe,UAAU,CAAC"}