@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,636 @@
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 parser from "@babel/parser";
12
+ import _traverse from "@babel/traverse";
13
+ import _generator from "@babel/generator";
14
+ import * as t from "@babel/types";
15
+ const traverse = _traverse.default;
16
+ const generate = _generator.default;
17
+ /**
18
+ * Refactors a webpack-bundled React chunk into a more readable form.
19
+ *
20
+ * Recognises the standard webpack 5 / React 18 production bundle shape:
21
+ * - An outer IIFE that holds a `{ <id>: function(module, exports, require) { ... } }`
22
+ * module map.
23
+ * - Each inner module function uses positional params named `(module, exports, require)`
24
+ * (minifier locals — names vary per chunk).
25
+ * - React's public surface lives in modules identifiable by content fingerprint
26
+ * (the public hooks delegate to `R.current.<hook>(...)`).
27
+ *
28
+ * Two layers of rewrites happen:
29
+ *
30
+ * 1. Webpack-level:
31
+ * - `<require>(<n>)` → `require("./<n>.js")`
32
+ * - `<require>.d(<exports>, { k: () => local })` → captured into export map
33
+ * - `Object.defineProperty(<exports>, "k", { ... })` → captured into export map
34
+ *
35
+ * 2. React-level:
36
+ * - Catalog every inner module by content fingerprint to learn which are
37
+ * `react`, `react/jsx-runtime`, `react-dom/client`.
38
+ * - In each module body, find `var <local> = <require>(<n>)` to learn which
39
+ * local aliases which React module within that scope.
40
+ * - Rewrite `(0, <reactLocal>.<hook>)(args)` → `<hook>(args)` and collect
41
+ * `<hook>` into the file-level react import set. Similarly for jsx-runtime
42
+ * and react-dom/client.
43
+ * - Any remaining `(0, X.Y)(args)` flattens to `X.Y(args)` (always safe).
44
+ *
45
+ * Lossy — for human inspection only.
46
+ */
47
+ const REACT_HOOK_NAMES = new Set([
48
+ "useState",
49
+ "useEffect",
50
+ "useRef",
51
+ "useContext",
52
+ "useReducer",
53
+ "useMemo",
54
+ "useCallback",
55
+ "useId",
56
+ "useTransition",
57
+ "useLayoutEffect",
58
+ "useDeferredValue",
59
+ "useImperativeHandle",
60
+ "useDebugValue",
61
+ "useSyncExternalStore",
62
+ "useInsertionEffect",
63
+ "useOptimistic",
64
+ "useActionState",
65
+ "useFormStatus",
66
+ ]);
67
+ const REACT_TOP_LEVEL_API_NAMES = new Set([
68
+ "createContext",
69
+ "createElement",
70
+ "createRef",
71
+ "forwardRef",
72
+ "memo",
73
+ "lazy",
74
+ "startTransition",
75
+ "Fragment",
76
+ "Children",
77
+ "cloneElement",
78
+ "isValidElement",
79
+ "use",
80
+ "act",
81
+ ]);
82
+ const JSX_RUNTIME_NAMES = new Set(["jsx", "jsxs", "jsxDEV", "Fragment"]);
83
+ const REACT_DOM_CLIENT_NAMES = new Set(["createRoot", "hydrateRoot"]);
84
+ const refactorReact = (chunk) => __awaiter(void 0, void 0, void 0, function* () {
85
+ console.log(chalk.cyan(`[i] Refactoring React chunk: ${chunk.id}`));
86
+ const ast = parser.parse(chunk.code, {
87
+ sourceType: "unambiguous",
88
+ plugins: ["jsx", "typescript"],
89
+ errorRecovery: true,
90
+ });
91
+ const modules = [];
92
+ const captureModule = (id, fnPath, params) => {
93
+ if (params.length < 2)
94
+ return;
95
+ const m = params[0], e = params[1], r = params.length >= 3 ? params[2] : undefined;
96
+ if (!t.isIdentifier(m) || !t.isIdentifier(e))
97
+ return;
98
+ if (r !== undefined && !t.isIdentifier(r))
99
+ return;
100
+ modules.push({
101
+ id,
102
+ fnPath,
103
+ moduleParam: m.name,
104
+ exportsParam: e.name,
105
+ requireParam: r ? r.name : undefined,
106
+ });
107
+ };
108
+ // Only capture entries whose key is numeric AND whose grandparent is an
109
+ // ObjectExpression at module level (the webpack module map). This filters
110
+ // out the many `useImperativeHandle(e, n, t) { ... }` ObjectMethods inside
111
+ // React's own source, which happen to share the 3-param shape.
112
+ const isInModuleMap = (path) => {
113
+ const objectParent = path.parentPath;
114
+ if (!objectParent || !objectParent.isObjectExpression())
115
+ return false;
116
+ // The ObjectExpression's parent should be the module-map assignment:
117
+ // var e = { 540: fn, 338: fn, ... }
118
+ // i.e. a VariableDeclarator whose init is the object.
119
+ const objHolder = objectParent.parentPath;
120
+ if (!objHolder)
121
+ return false;
122
+ if (objHolder.isVariableDeclarator())
123
+ return true;
124
+ // Some bundles place the map directly inside the IIFE arrow body's
125
+ // return / argument position — accept those too.
126
+ if (objHolder.isAssignmentExpression())
127
+ return true;
128
+ return false;
129
+ };
130
+ traverse(ast, {
131
+ ObjectProperty(path) {
132
+ if (!t.isNumericLiteral(path.node.key))
133
+ return;
134
+ if (!isInModuleMap(path))
135
+ return;
136
+ const value = path.node.value;
137
+ if (!t.isFunctionExpression(value) && !t.isArrowFunctionExpression(value))
138
+ return;
139
+ const id = String(path.node.key.value);
140
+ const valuePath = path.get("value");
141
+ captureModule(id, valuePath, value.params);
142
+ },
143
+ ObjectMethod(path) {
144
+ if (!t.isNumericLiteral(path.node.key))
145
+ return;
146
+ if (!isInModuleMap(path))
147
+ return;
148
+ const id = String(path.node.key.value);
149
+ captureModule(id, path, path.node.params);
150
+ },
151
+ });
152
+ const catalog = new Map();
153
+ const exportCollections = new Map();
154
+ // Track which modules are pure re-exporters: body of form
155
+ // e.exports = t(N)
156
+ // → reExportTargetOf[mod.id] = "N"
157
+ const reExportTargetOf = new Map();
158
+ for (const mod of modules) {
159
+ const exportsMap = new Map();
160
+ const exportsParamAssignKeys = new Set();
161
+ let dispatchCallCount = 0;
162
+ let reExportTarget = null;
163
+ // Quick re-export detection: a module whose ONLY non-trivial statement
164
+ // is `<module>.exports = <require>(<n>)`.
165
+ const body = mod.fnPath.node.body;
166
+ if (t.isBlockStatement(body)) {
167
+ for (const stmt of body.body) {
168
+ if (!t.isExpressionStatement(stmt))
169
+ continue;
170
+ const expr = stmt.expression;
171
+ if (t.isAssignmentExpression(expr) &&
172
+ t.isMemberExpression(expr.left) &&
173
+ t.isIdentifier(expr.left.object, { name: mod.moduleParam }) &&
174
+ t.isIdentifier(expr.left.property, { name: "exports" }) &&
175
+ t.isCallExpression(expr.right) &&
176
+ t.isIdentifier(expr.right.callee) &&
177
+ mod.requireParam &&
178
+ expr.right.callee.name === mod.requireParam &&
179
+ expr.right.arguments.length === 1 &&
180
+ t.isNumericLiteral(expr.right.arguments[0])) {
181
+ reExportTarget = String(expr.right.arguments[0].value);
182
+ break;
183
+ }
184
+ }
185
+ }
186
+ if (reExportTarget) {
187
+ reExportTargetOf.set(mod.id, reExportTarget);
188
+ }
189
+ mod.fnPath.traverse({
190
+ CallExpression(p) {
191
+ const node = p.node;
192
+ // <require>.d(<exports>, { ... })
193
+ if (mod.requireParam &&
194
+ t.isMemberExpression(node.callee) &&
195
+ t.isIdentifier(node.callee.object, { name: mod.requireParam }) &&
196
+ t.isIdentifier(node.callee.property, { name: "d" }) &&
197
+ node.arguments.length === 2 &&
198
+ t.isIdentifier(node.arguments[0], { name: mod.exportsParam }) &&
199
+ t.isObjectExpression(node.arguments[1])) {
200
+ for (const prop of node.arguments[1].properties) {
201
+ if (!t.isObjectProperty(prop))
202
+ continue;
203
+ const k = getStaticKey(prop.key);
204
+ if (!k)
205
+ continue;
206
+ const local = extractGetterLocal(prop.value);
207
+ if (!local)
208
+ continue;
209
+ exportsMap.set(k, local);
210
+ }
211
+ return;
212
+ }
213
+ // Object.defineProperty(<exports>, "k", { get: ... })
214
+ if (t.isMemberExpression(node.callee) &&
215
+ t.isIdentifier(node.callee.object, { name: "Object" }) &&
216
+ t.isIdentifier(node.callee.property, { name: "defineProperty" }) &&
217
+ node.arguments.length === 3 &&
218
+ t.isIdentifier(node.arguments[0], { name: mod.exportsParam }) &&
219
+ t.isStringLiteral(node.arguments[1]) &&
220
+ t.isObjectExpression(node.arguments[2])) {
221
+ const k = node.arguments[1].value;
222
+ for (const prop of node.arguments[2].properties) {
223
+ if (!t.isObjectProperty(prop))
224
+ continue;
225
+ if (getStaticKey(prop.key) !== "get")
226
+ continue;
227
+ const local = extractGetterLocal(prop.value);
228
+ if (!local)
229
+ continue;
230
+ exportsMap.set(k, local);
231
+ }
232
+ return;
233
+ }
234
+ // Call shape: <X>.current.<hookName>(args) — react dispatch
235
+ if (t.isMemberExpression(node.callee) &&
236
+ t.isMemberExpression(node.callee.object) &&
237
+ t.isIdentifier(node.callee.object.property, {
238
+ name: "current",
239
+ }) &&
240
+ t.isIdentifier(node.callee.property) &&
241
+ REACT_HOOK_NAMES.has(node.callee.property.name)) {
242
+ dispatchCallCount++;
243
+ }
244
+ },
245
+ AssignmentExpression(p) {
246
+ // <exportsParam>.K = ... (module-scope assignment to exports)
247
+ const left = p.node.left;
248
+ if (t.isMemberExpression(left) &&
249
+ t.isIdentifier(left.object, { name: mod.exportsParam }) &&
250
+ t.isIdentifier(left.property)) {
251
+ const minLocal = left.property.name;
252
+ exportsParamAssignKeys.add(minLocal);
253
+ // If the RHS is `<ident>.<canonicalName>`, learn that the
254
+ // exports name `minLocal` corresponds to that canonical
255
+ // name. e.g. `n.H = r.createRoot` ⇒ exportsMap["createRoot"] = "H".
256
+ const right = p.node.right;
257
+ if (t.isMemberExpression(right) && t.isIdentifier(right.property)) {
258
+ const canonical = right.property.name;
259
+ if (!exportsMap.has(canonical)) {
260
+ exportsMap.set(canonical, minLocal);
261
+ }
262
+ }
263
+ }
264
+ },
265
+ });
266
+ let kind = null;
267
+ if (dispatchCallCount > 0) {
268
+ kind = "react";
269
+ }
270
+ else if ((exportsParamAssignKeys.has("jsx") && exportsParamAssignKeys.has("jsxs")) ||
271
+ (exportsMap.has("jsx") && exportsMap.has("jsxs"))) {
272
+ kind = "react/jsx-runtime";
273
+ }
274
+ else if (exportsParamAssignKeys.has("createRoot") || exportsMap.has("createRoot")) {
275
+ kind = "react-dom/client";
276
+ }
277
+ if (kind) {
278
+ catalog.set(mod.id, { kind, exportMap: exportsMap });
279
+ }
280
+ if (exportsMap.size > 0) {
281
+ const arr = [];
282
+ for (const [k, v] of exportsMap)
283
+ arr.push({ key: k, local: v });
284
+ exportCollections.set(mod.id, arr);
285
+ }
286
+ }
287
+ // Resolve re-export chains: if module M is `e.exports = t(N)` and N is
288
+ // classified, M inherits N's kind. Iterate until no new classifications.
289
+ let changed = true;
290
+ while (changed) {
291
+ changed = false;
292
+ for (const [source, target] of reExportTargetOf) {
293
+ if (catalog.has(source))
294
+ continue;
295
+ const tgt = catalog.get(target);
296
+ if (tgt) {
297
+ catalog.set(source, { kind: tgt.kind, exportMap: tgt.exportMap });
298
+ changed = true;
299
+ }
300
+ }
301
+ }
302
+ const reactImports = new Set();
303
+ const jsxRuntimeImports = new Set();
304
+ const reactDomImports = new Set();
305
+ for (const mod of modules) {
306
+ if (!mod.requireParam)
307
+ continue; // 2-param modules can't have require()
308
+ const localAliases = new Map();
309
+ mod.fnPath.traverse({
310
+ VariableDeclarator(p) {
311
+ const id = p.node.id;
312
+ const init = p.node.init;
313
+ if (t.isIdentifier(id) &&
314
+ init &&
315
+ t.isCallExpression(init) &&
316
+ t.isIdentifier(init.callee, { name: mod.requireParam }) &&
317
+ init.arguments.length === 1 &&
318
+ t.isNumericLiteral(init.arguments[0])) {
319
+ const requireId = String(init.arguments[0].value);
320
+ const entry = catalog.get(requireId);
321
+ if (entry) {
322
+ localAliases.set(id.name, { kind: entry.kind, entry });
323
+ }
324
+ }
325
+ },
326
+ });
327
+ mod.fnPath.traverse({
328
+ CallExpression: {
329
+ exit(p) {
330
+ const node = p.node;
331
+ if (t.isIdentifier(node.callee, { name: mod.requireParam }) &&
332
+ node.arguments.length === 1 &&
333
+ t.isNumericLiteral(node.arguments[0])) {
334
+ const numId = node.arguments[0].value;
335
+ p.replaceWith(t.callExpression(t.identifier("require"), [t.stringLiteral(`./${numId}.js`)]));
336
+ return;
337
+ }
338
+ if (t.isMemberExpression(node.callee) &&
339
+ t.isIdentifier(node.callee.object, { name: mod.requireParam }) &&
340
+ t.isIdentifier(node.callee.property, { name: "d" }) &&
341
+ node.arguments.length === 2 &&
342
+ t.isIdentifier(node.arguments[0], { name: mod.exportsParam })) {
343
+ p.replaceWith(t.identifier("void 0"));
344
+ return;
345
+ }
346
+ if (t.isMemberExpression(node.callee) &&
347
+ t.isIdentifier(node.callee.object, { name: "Object" }) &&
348
+ t.isIdentifier(node.callee.property, { name: "defineProperty" }) &&
349
+ node.arguments.length === 3 &&
350
+ t.isIdentifier(node.arguments[0], { name: mod.exportsParam })) {
351
+ p.replaceWith(t.identifier("void 0"));
352
+ return;
353
+ }
354
+ if (t.isSequenceExpression(node.callee) &&
355
+ node.callee.expressions.length === 2 &&
356
+ t.isNumericLiteral(node.callee.expressions[0], { value: 0 }) &&
357
+ (t.isMemberExpression(node.callee.expressions[1]) || t.isIdentifier(node.callee.expressions[1]))) {
358
+ const inner = node.callee.expressions[1];
359
+ // If the MemberExpression visitor already rewrote the
360
+ // member to a bare Identifier, just strip the `(0, …)`
361
+ // wrapper. Otherwise pass through the recognition pass.
362
+ const callee = t.isMemberExpression(inner)
363
+ ? rewriteRecognisedMember(inner, localAliases, reactImports, jsxRuntimeImports, reactDomImports)
364
+ : inner;
365
+ p.replaceWith(t.callExpression(callee, node.arguments));
366
+ return;
367
+ }
368
+ if (t.isMemberExpression(node.callee)) {
369
+ const member = node.callee;
370
+ if (t.isIdentifier(member.object) && localAliases.has(member.object.name)) {
371
+ const newCallee = rewriteRecognisedMember(member, localAliases, reactImports, jsxRuntimeImports, reactDomImports);
372
+ // Only replace when the callee changed; otherwise
373
+ // we'd rebuild the same node and traverse would loop.
374
+ if (newCallee !== member) {
375
+ p.replaceWith(t.callExpression(newCallee, node.arguments));
376
+ }
377
+ return;
378
+ }
379
+ }
380
+ },
381
+ },
382
+ MemberExpression: {
383
+ exit(p) {
384
+ if (p.parent && t.isCallExpression(p.parent) && p.parent.callee === p.node)
385
+ return;
386
+ if (!t.isIdentifier(p.node.object) || !t.isIdentifier(p.node.property))
387
+ return;
388
+ const aliased = localAliases.get(p.node.object.name);
389
+ if (!aliased)
390
+ return;
391
+ const prop = p.node.property.name;
392
+ if (aliased.kind === "react/jsx-runtime" && JSX_RUNTIME_NAMES.has(prop)) {
393
+ jsxRuntimeImports.add(prop);
394
+ p.replaceWith(t.identifier(prop));
395
+ return;
396
+ }
397
+ if (aliased.kind === "react") {
398
+ if (REACT_HOOK_NAMES.has(prop) || REACT_TOP_LEVEL_API_NAMES.has(prop)) {
399
+ reactImports.add(prop);
400
+ p.replaceWith(t.identifier(prop));
401
+ return;
402
+ }
403
+ }
404
+ if (aliased.kind === "react-dom/client") {
405
+ for (const [canonical, minLocal] of aliased.entry.exportMap) {
406
+ if (minLocal === prop && REACT_DOM_CLIENT_NAMES.has(canonical)) {
407
+ reactDomImports.add(canonical);
408
+ p.replaceWith(t.identifier(canonical));
409
+ return;
410
+ }
411
+ }
412
+ }
413
+ },
414
+ },
415
+ });
416
+ }
417
+ // ──────────────────────────────────────────────────────────────────
418
+ // Pass 4 (global): catch IIFE-level `var X = <any>(<numericId>)` aliases
419
+ // and rewrite the user-entry callsites at the outermost scope, which the
420
+ // per-module pass cannot reach because the entry-IIFE wrapper has 0 params
421
+ // (no positional require). The catalog match keeps this safe — only known
422
+ // React-family module IDs trigger alias substitution.
423
+ // ──────────────────────────────────────────────────────────────────
424
+ const globalAliases = new Map();
425
+ traverse(ast, {
426
+ VariableDeclarator(p) {
427
+ const id = p.node.id;
428
+ const init = p.node.init;
429
+ if (t.isIdentifier(id) &&
430
+ init &&
431
+ t.isCallExpression(init) &&
432
+ t.isIdentifier(init.callee) &&
433
+ init.arguments.length === 1 &&
434
+ t.isNumericLiteral(init.arguments[0])) {
435
+ const requireId = String(init.arguments[0].value);
436
+ const entry = catalog.get(requireId);
437
+ if (entry) {
438
+ globalAliases.set(id.name, { kind: entry.kind, entry });
439
+ }
440
+ }
441
+ },
442
+ });
443
+ if (globalAliases.size > 0) {
444
+ traverse(ast, {
445
+ CallExpression: {
446
+ exit(p) {
447
+ const node = p.node;
448
+ if (t.isSequenceExpression(node.callee) &&
449
+ node.callee.expressions.length === 2 &&
450
+ t.isNumericLiteral(node.callee.expressions[0], { value: 0 }) &&
451
+ (t.isMemberExpression(node.callee.expressions[1]) || t.isIdentifier(node.callee.expressions[1]))) {
452
+ const inner = node.callee.expressions[1];
453
+ const callee = t.isMemberExpression(inner)
454
+ ? rewriteRecognisedMember(inner, globalAliases, reactImports, jsxRuntimeImports, reactDomImports)
455
+ : inner;
456
+ p.replaceWith(t.callExpression(callee, node.arguments));
457
+ return;
458
+ }
459
+ if (t.isMemberExpression(node.callee)) {
460
+ const member = node.callee;
461
+ if (t.isIdentifier(member.object) && globalAliases.has(member.object.name)) {
462
+ const newCallee = rewriteRecognisedMember(member, globalAliases, reactImports, jsxRuntimeImports, reactDomImports);
463
+ if (newCallee !== member) {
464
+ p.replaceWith(t.callExpression(newCallee, node.arguments));
465
+ }
466
+ return;
467
+ }
468
+ }
469
+ },
470
+ },
471
+ MemberExpression: {
472
+ exit(p) {
473
+ if (p.parent && t.isCallExpression(p.parent) && p.parent.callee === p.node)
474
+ return;
475
+ if (!t.isIdentifier(p.node.object) || !t.isIdentifier(p.node.property))
476
+ return;
477
+ const aliased = globalAliases.get(p.node.object.name);
478
+ if (!aliased)
479
+ return;
480
+ const prop = p.node.property.name;
481
+ if (aliased.kind === "react/jsx-runtime" && JSX_RUNTIME_NAMES.has(prop)) {
482
+ jsxRuntimeImports.add(prop);
483
+ p.replaceWith(t.identifier(prop));
484
+ return;
485
+ }
486
+ if (aliased.kind === "react" &&
487
+ (REACT_HOOK_NAMES.has(prop) || REACT_TOP_LEVEL_API_NAMES.has(prop))) {
488
+ reactImports.add(prop);
489
+ p.replaceWith(t.identifier(prop));
490
+ return;
491
+ }
492
+ if (aliased.kind === "react-dom/client") {
493
+ for (const [canonical, minLocal] of aliased.entry.exportMap) {
494
+ if (minLocal === prop && REACT_DOM_CLIENT_NAMES.has(canonical)) {
495
+ reactDomImports.add(canonical);
496
+ p.replaceWith(t.identifier(canonical));
497
+ return;
498
+ }
499
+ }
500
+ }
501
+ },
502
+ },
503
+ });
504
+ }
505
+ let codeCopy = generate(ast).code;
506
+ const importLines = [];
507
+ if (reactImports.size > 0) {
508
+ importLines.push(`import { ${Array.from(reactImports).sort().join(", ")} } from "react";`);
509
+ }
510
+ if (jsxRuntimeImports.size > 0) {
511
+ importLines.push(`import { ${Array.from(jsxRuntimeImports).sort().join(", ")} } from "react/jsx-runtime";`);
512
+ }
513
+ if (reactDomImports.size > 0) {
514
+ importLines.push(`import { ${Array.from(reactDomImports).sort().join(", ")} } from "react-dom/client";`);
515
+ }
516
+ const header = importLines.length > 0 ? `${importLines.join("\n")}\n\n` : "";
517
+ const allExports = [];
518
+ for (const arr of exportCollections.values())
519
+ allExports.push(...arr);
520
+ const codeHasDefaultExport = /\bexport\s+default\b|\bas\s+default\b/.test(codeCopy);
521
+ let trailingExports = "";
522
+ if (allExports.length > 0) {
523
+ const usedKeys = new Set();
524
+ const usedLocals = new Set();
525
+ const named = [];
526
+ let collisionIndex = 0;
527
+ const defaultLines = [];
528
+ for (const entry of allExports) {
529
+ if (usedLocals.has(entry.local))
530
+ continue;
531
+ usedLocals.add(entry.local);
532
+ let key = entry.key;
533
+ if (usedKeys.has(key)) {
534
+ collisionIndex += 1;
535
+ key = `${entry.key}_${collisionIndex}`;
536
+ }
537
+ usedKeys.add(key);
538
+ if (key === "default") {
539
+ if (!codeHasDefaultExport)
540
+ defaultLines.push(`export default ${entry.local};`);
541
+ }
542
+ else {
543
+ named.push({ key, local: entry.local });
544
+ }
545
+ }
546
+ const parts = [];
547
+ if (named.length > 0) {
548
+ const namedList = named.map(({ key, local }) => (key === local ? key : `${local} as ${key}`)).join(", ");
549
+ parts.push(`/* webpack-derived exports — keys may collide across modules in the chunk */`);
550
+ parts.push(`export { ${namedList} };`);
551
+ }
552
+ parts.push(...defaultLines);
553
+ if (parts.length > 0)
554
+ trailingExports = `\n\n${parts.join("\n")}`;
555
+ }
556
+ else {
557
+ let functionName = null;
558
+ traverse(ast, {
559
+ FunctionDeclaration(path) {
560
+ if (path.parent.type === "Program" && path.node.id) {
561
+ functionName = path.node.id.name;
562
+ path.stop();
563
+ }
564
+ },
565
+ VariableDeclarator(path) {
566
+ if (path.parentPath.parent.type === "Program" &&
567
+ path.node.init &&
568
+ path.node.init.type === "ArrowFunctionExpression" &&
569
+ path.node.id.type === "Identifier") {
570
+ functionName = path.node.id.name;
571
+ path.stop();
572
+ }
573
+ },
574
+ });
575
+ if (functionName && !codeHasDefaultExport)
576
+ trailingExports = `\n\nexport default ${functionName};`;
577
+ }
578
+ return `${header}${codeCopy}${trailingExports}`;
579
+ });
580
+ const rewriteRecognisedMember = (member, localAliases, reactImports, jsxImports, reactDomImports) => {
581
+ if (!t.isIdentifier(member.object) || !t.isIdentifier(member.property))
582
+ return member;
583
+ const aliased = localAliases.get(member.object.name);
584
+ if (!aliased)
585
+ return member;
586
+ const prop = member.property.name;
587
+ if (aliased.kind === "react" && (REACT_HOOK_NAMES.has(prop) || REACT_TOP_LEVEL_API_NAMES.has(prop))) {
588
+ reactImports.add(prop);
589
+ return t.identifier(prop);
590
+ }
591
+ if (aliased.kind === "react/jsx-runtime" && JSX_RUNTIME_NAMES.has(prop)) {
592
+ jsxImports.add(prop);
593
+ return t.identifier(prop);
594
+ }
595
+ if (aliased.kind === "react-dom/client") {
596
+ for (const [canonical, minLocal] of aliased.entry.exportMap) {
597
+ if (minLocal === prop && REACT_DOM_CLIENT_NAMES.has(canonical)) {
598
+ reactDomImports.add(canonical);
599
+ return t.identifier(canonical);
600
+ }
601
+ }
602
+ }
603
+ return member;
604
+ };
605
+ const getStaticKey = (node) => {
606
+ if (t.isIdentifier(node))
607
+ return node.name;
608
+ if (t.isStringLiteral(node))
609
+ return node.value;
610
+ if (t.isNumericLiteral(node))
611
+ return String(node.value);
612
+ return null;
613
+ };
614
+ const extractGetterLocal = (node) => {
615
+ if (t.isArrowFunctionExpression(node)) {
616
+ if (t.isIdentifier(node.body))
617
+ return node.body.name;
618
+ if (t.isBlockStatement(node.body)) {
619
+ for (const stmt of node.body.body) {
620
+ if (t.isReturnStatement(stmt) && stmt.argument && t.isIdentifier(stmt.argument)) {
621
+ return stmt.argument.name;
622
+ }
623
+ }
624
+ }
625
+ }
626
+ if (t.isFunctionExpression(node) && t.isBlockStatement(node.body)) {
627
+ for (const stmt of node.body.body) {
628
+ if (t.isReturnStatement(stmt) && stmt.argument && t.isIdentifier(stmt.argument)) {
629
+ return stmt.argument.name;
630
+ }
631
+ }
632
+ }
633
+ return null;
634
+ };
635
+ export default refactorReact;
636
+ //# sourceMappingURL=index.js.map