@js-recon/js-recon 1.3.1 → 1.4.1-alpha.10

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 (234) hide show
  1. package/.github/workflows/build-and-prettify.yaml +207 -14
  2. package/.github/workflows/pr_checker.yml +2 -2
  3. package/.github/workflows/promote-js-recon.yml +104 -0
  4. package/.github/workflows/publish-js-recon.yml +22 -80
  5. package/.github/workflows/rules-smoke-test.yaml +79 -0
  6. package/CHANGELOG.md +181 -2
  7. package/CLAUDE.md +350 -16
  8. package/Dockerfile.release +29 -0
  9. package/README.md +48 -19
  10. package/build/analyze/engine/csMastSEngine.js +129 -0
  11. package/build/analyze/engine/csMastSEngine.js.map +1 -0
  12. package/build/analyze/engine/index.js +15 -0
  13. package/build/analyze/engine/index.js.map +1 -1
  14. package/build/analyze/helpers/engineHelpers/findDirectAssignment.js +2 -1
  15. package/build/analyze/helpers/engineHelpers/findDirectAssignment.js.map +1 -1
  16. package/build/analyze/helpers/engineHelpers/findMemberExpressionAssignment.js +2 -1
  17. package/build/analyze/helpers/engineHelpers/findMemberExpressionAssignment.js.map +1 -1
  18. package/build/analyze/helpers/engineHelpers/resolveFunctionIdentifier.js +2 -1
  19. package/build/analyze/helpers/engineHelpers/resolveFunctionIdentifier.js.map +1 -1
  20. package/build/analyze/helpers/engineHelpers/taintFlow.js +11 -2
  21. package/build/analyze/helpers/engineHelpers/taintFlow.js.map +1 -1
  22. package/build/analyze/helpers/initRules.js +3 -3
  23. package/build/analyze/helpers/initRules.js.map +1 -1
  24. package/build/analyze/helpers/schemas.js +6 -2
  25. package/build/analyze/helpers/schemas.js.map +1 -1
  26. package/build/analyze/helpers/validate.js +3 -3
  27. package/build/analyze/helpers/validate.js.map +1 -1
  28. package/build/analyze/index.js +1 -0
  29. package/build/analyze/index.js.map +1 -1
  30. package/build/completion/index.js +432 -0
  31. package/build/completion/index.js.map +1 -0
  32. package/build/cs_mast/index.js +213 -0
  33. package/build/cs_mast/index.js.map +1 -0
  34. package/build/endpoints/next_js/client_jsFilesHref.js +2 -1
  35. package/build/endpoints/next_js/client_jsFilesHref.js.map +1 -1
  36. package/build/endpoints/next_js/client_jsonParse.js +2 -1
  37. package/build/endpoints/next_js/client_jsonParse.js.map +1 -1
  38. package/build/endpoints/next_js/client_mappedJsonFile.js +2 -1
  39. package/build/endpoints/next_js/client_mappedJsonFile.js.map +1 -1
  40. package/build/endpoints/next_js/client_subsequentRequests.js +2 -1
  41. package/build/endpoints/next_js/client_subsequentRequests.js.map +1 -1
  42. package/build/fingerprint/index.js +56 -33
  43. package/build/fingerprint/index.js.map +1 -1
  44. package/build/globalConfig.js +3 -3
  45. package/build/globalConfig.js.map +1 -1
  46. package/build/index.js +210 -10
  47. package/build/index.js.map +1 -1
  48. package/build/lazyLoad/angular/angular_getFromMainJs.js +2 -1
  49. package/build/lazyLoad/angular/angular_getFromMainJs.js.map +1 -1
  50. package/build/lazyLoad/downloadFilesUtil.js +6 -5
  51. package/build/lazyLoad/downloadFilesUtil.js.map +1 -1
  52. package/build/lazyLoad/downloadLoadedJsUtil.js +59 -5
  53. package/build/lazyLoad/downloadLoadedJsUtil.js.map +1 -1
  54. package/build/lazyLoad/downloadQueue.js +10 -9
  55. package/build/lazyLoad/downloadQueue.js.map +1 -1
  56. package/build/lazyLoad/index.js +127 -85
  57. package/build/lazyLoad/index.js.map +1 -1
  58. package/build/lazyLoad/methodFilter.js +50 -0
  59. package/build/lazyLoad/methodFilter.js.map +1 -0
  60. package/build/lazyLoad/next_js/NextJsCrawler.js +69 -48
  61. package/build/lazyLoad/next_js/NextJsCrawler.js.map +1 -1
  62. package/build/lazyLoad/next_js/next_GetLazyResourcesBuildManifestJs.js +36 -34
  63. package/build/lazyLoad/next_js/next_GetLazyResourcesBuildManifestJs.js.map +1 -1
  64. package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js +66 -13
  65. package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js.map +1 -1
  66. package/build/lazyLoad/next_js/next_parseLayoutJs.js +80 -68
  67. package/build/lazyLoad/next_js/next_parseLayoutJs.js.map +1 -1
  68. package/build/lazyLoad/next_js/next_promiseResolve.js +22 -16
  69. package/build/lazyLoad/next_js/next_promiseResolve.js.map +1 -1
  70. package/build/lazyLoad/nuxt_js/nuxt_astParse.js +49 -47
  71. package/build/lazyLoad/nuxt_js/nuxt_astParse.js.map +1 -1
  72. package/build/lazyLoad/nuxt_js/nuxt_getBuildsManifest.js +64 -0
  73. package/build/lazyLoad/nuxt_js/nuxt_getBuildsManifest.js.map +1 -0
  74. package/build/lazyLoad/nuxt_js/nuxt_getFromPageSource.js +3 -1
  75. package/build/lazyLoad/nuxt_js/nuxt_getFromPageSource.js.map +1 -1
  76. package/build/lazyLoad/nuxt_js/nuxt_stringAnalysisJSFiles.js +3 -2
  77. package/build/lazyLoad/nuxt_js/nuxt_stringAnalysisJSFiles.js.map +1 -1
  78. package/build/lazyLoad/react/react_followImports.js +16 -7
  79. package/build/lazyLoad/react/react_followImports.js.map +1 -1
  80. package/build/lazyLoad/react/react_webpackChunkPaths.js +175 -123
  81. package/build/lazyLoad/react/react_webpackChunkPaths.js.map +1 -1
  82. package/build/lazyLoad/svelte/svelte_getFromPageSource.js +16 -0
  83. package/build/lazyLoad/svelte/svelte_getFromPageSource.js.map +1 -1
  84. package/build/lazyLoad/svelte/svelte_getVersionJson.js +40 -0
  85. package/build/lazyLoad/svelte/svelte_getVersionJson.js.map +1 -0
  86. package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js +3 -2
  87. package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js.map +1 -1
  88. package/build/lazyLoad/techDetect/checkAngularJS.js +27 -6
  89. package/build/lazyLoad/techDetect/checkAngularJS.js.map +1 -1
  90. package/build/lazyLoad/techDetect/checkNextJS.js +24 -15
  91. package/build/lazyLoad/techDetect/checkNextJS.js.map +1 -1
  92. package/build/lazyLoad/techDetect/checkReact.js +8 -0
  93. package/build/lazyLoad/techDetect/checkReact.js.map +1 -1
  94. package/build/lazyLoad/techDetect/checkSvelte.js +17 -0
  95. package/build/lazyLoad/techDetect/checkSvelte.js.map +1 -1
  96. package/build/lazyLoad/techDetect/index.js +33 -5
  97. package/build/lazyLoad/techDetect/index.js.map +1 -1
  98. package/build/lazyLoad/vue/vue_RuntimeJs.js +2 -1
  99. package/build/lazyLoad/vue/vue_RuntimeJs.js.map +1 -1
  100. package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js +2 -1
  101. package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js.map +1 -1
  102. package/build/lazyLoad/vue/vue_discoverJsFiles.js +59 -25
  103. package/build/lazyLoad/vue/vue_discoverJsFiles.js.map +1 -1
  104. package/build/lazyLoad/vue/vue_getClientSidePaths.js +2 -1
  105. package/build/lazyLoad/vue/vue_getClientSidePaths.js.map +1 -1
  106. package/build/lazyLoad/vue/vue_jsImports.js +2 -1
  107. package/build/lazyLoad/vue/vue_jsImports.js.map +1 -1
  108. package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js +2 -2
  109. package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js.map +1 -1
  110. package/build/lazyLoad/vue/vue_viteMapDeps.js +62 -54
  111. package/build/lazyLoad/vue/vue_viteMapDeps.js.map +1 -1
  112. package/build/map/angular_js/getAngularConnections.js +88 -0
  113. package/build/map/angular_js/getAngularConnections.js.map +1 -0
  114. package/build/map/angular_js/interactive.js +4 -0
  115. package/build/map/angular_js/interactive.js.map +1 -0
  116. package/build/map/graphql/resolveGraphql.js +2 -1
  117. package/build/map/graphql/resolveGraphql.js.map +1 -1
  118. package/build/map/index.js +38 -0
  119. package/build/map/index.js.map +1 -1
  120. package/build/map/next_js/getExports.js +2 -1
  121. package/build/map/next_js/getExports.js.map +1 -1
  122. package/build/map/next_js/getFetchInstances.js +2 -1
  123. package/build/map/next_js/getFetchInstances.js.map +1 -1
  124. package/build/map/next_js/getTurbopackConnections.js +2 -1
  125. package/build/map/next_js/getTurbopackConnections.js.map +1 -1
  126. package/build/map/next_js/getWebpackConnections.js +2 -1
  127. package/build/map/next_js/getWebpackConnections.js.map +1 -1
  128. package/build/map/next_js/resolveAxios.js +2 -1
  129. package/build/map/next_js/resolveAxios.js.map +1 -1
  130. package/build/map/next_js/resolveAxiosHelpers/directCallsWithoutAssignment.js +2 -1
  131. package/build/map/next_js/resolveAxiosHelpers/directCallsWithoutAssignment.js.map +1 -1
  132. package/build/map/next_js/resolveAxiosHelpers/findAxiosInstance.js +2 -1
  133. package/build/map/next_js/resolveAxiosHelpers/findAxiosInstance.js.map +1 -1
  134. package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js +2 -1
  135. package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js.map +1 -1
  136. package/build/map/next_js/resolveAxiosHelpers/handleAxiosCreate.js +2 -1
  137. package/build/map/next_js/resolveAxiosHelpers/handleAxiosCreate.js.map +1 -1
  138. package/build/map/next_js/resolveAxiosHelpers/handleZDotCreate.js +2 -1
  139. package/build/map/next_js/resolveAxiosHelpers/handleZDotCreate.js.map +1 -1
  140. package/build/map/next_js/resolveAxiosHelpers/interceptorHeaders.js +2 -1
  141. package/build/map/next_js/resolveAxiosHelpers/interceptorHeaders.js.map +1 -1
  142. package/build/map/next_js/resolveAxiosHelpers/processExportedEndpoints.js +2 -1
  143. package/build/map/next_js/resolveAxiosHelpers/processExportedEndpoints.js.map +1 -1
  144. package/build/map/next_js/resolveAxiosHelpers/traceAxiosInstanceExports.js +2 -1
  145. package/build/map/next_js/resolveAxiosHelpers/traceAxiosInstanceExports.js.map +1 -1
  146. package/build/map/next_js/resolveAxiosHelpers/traceBody.js +2 -1
  147. package/build/map/next_js/resolveAxiosHelpers/traceBody.js.map +1 -1
  148. package/build/map/next_js/resolveFetch.js +2 -1
  149. package/build/map/next_js/resolveFetch.js.map +1 -1
  150. package/build/map/next_js/resolveNewRequest.js +2 -1
  151. package/build/map/next_js/resolveNewRequest.js.map +1 -1
  152. package/build/map/next_js/resolveServerActions.js +2 -1
  153. package/build/map/next_js/resolveServerActions.js.map +1 -1
  154. package/build/map/next_js/utils.js +2 -1
  155. package/build/map/next_js/utils.js.map +1 -1
  156. package/build/map/react_js/getReactConnections.js +5 -4
  157. package/build/map/react_js/getReactConnections.js.map +1 -1
  158. package/build/map/vue_js/crossFileResolver.js +3 -2
  159. package/build/map/vue_js/crossFileResolver.js.map +1 -1
  160. package/build/map/vue_js/getViteConnections.js +5 -4
  161. package/build/map/vue_js/getViteConnections.js.map +1 -1
  162. package/build/map/vue_js/taint_utils.js +2 -1
  163. package/build/map/vue_js/taint_utils.js.map +1 -1
  164. package/build/map/vue_js/vue_resolveFetch.js +3 -2
  165. package/build/map/vue_js/vue_resolveFetch.js.map +1 -1
  166. package/build/map/vue_js/vue_resolveHttpClient.js +5 -3
  167. package/build/map/vue_js/vue_resolveHttpClient.js.map +1 -1
  168. package/build/map/vue_js/vue_resolveXhr.js +5 -3
  169. package/build/map/vue_js/vue_resolveXhr.js.map +1 -1
  170. package/build/mcp/cli.js.map +1 -1
  171. package/build/refactor/index.js +973 -27
  172. package/build/refactor/index.js.map +1 -1
  173. package/build/refactor/next/helpers.js +395 -0
  174. package/build/refactor/next/helpers.js.map +1 -0
  175. package/build/refactor/next/index.js +261 -71
  176. package/build/refactor/next/index.js.map +1 -1
  177. package/build/refactor/next/transform.js +1027 -0
  178. package/build/refactor/next/transform.js.map +1 -0
  179. package/build/refactor/next/validator.js +119 -0
  180. package/build/refactor/next/validator.js.map +1 -0
  181. package/build/refactor/react/helpers.js +106 -0
  182. package/build/refactor/react/helpers.js.map +1 -0
  183. package/build/refactor/react/index.js +290 -585
  184. package/build/refactor/react/index.js.map +1 -1
  185. package/build/refactor/react/library-classify.js +397 -0
  186. package/build/refactor/react/library-classify.js.map +1 -0
  187. package/build/refactor/react/transform.js +1852 -0
  188. package/build/refactor/react/transform.js.map +1 -0
  189. package/build/refactor/react/validator.js +123 -0
  190. package/build/refactor/react/validator.js.map +1 -0
  191. package/build/refactor/react-vite/index.js +652 -0
  192. package/build/refactor/react-vite/index.js.map +1 -0
  193. package/build/refactor/react-vite/vendor-analyze.js +336 -0
  194. package/build/refactor/react-vite/vendor-analyze.js.map +1 -0
  195. package/build/refactor/remote/cache.js +250 -0
  196. package/build/refactor/remote/cache.js.map +1 -0
  197. package/build/refactor/remote/config.js +63 -0
  198. package/build/refactor/remote/config.js.map +1 -0
  199. package/build/refactor/remote/hf-client.js +202 -0
  200. package/build/refactor/remote/hf-client.js.map +1 -0
  201. package/build/refactor/remote/version-detect.js +355 -0
  202. package/build/refactor/remote/version-detect.js.map +1 -0
  203. package/build/refactor/vue/index.js +176 -0
  204. package/build/refactor/vue/index.js.map +1 -0
  205. package/build/refactor/vue/vendor-analyze-vue.js +271 -0
  206. package/build/refactor/vue/vendor-analyze-vue.js.map +1 -0
  207. package/build/refactor/vue/vite.js +216 -0
  208. package/build/refactor/vue/vite.js.map +1 -0
  209. package/build/report/utility/genHtml.js +15 -4
  210. package/build/report/utility/genHtml.js.map +1 -1
  211. package/build/run/bundler-detect.js +154 -0
  212. package/build/run/bundler-detect.js.map +1 -0
  213. package/build/run/index.js +208 -16
  214. package/build/run/index.js.map +1 -1
  215. package/build/sourcemaps/index.js +89 -0
  216. package/build/sourcemaps/index.js.map +1 -0
  217. package/build/strings/index.js +6 -2
  218. package/build/strings/index.js.map +1 -1
  219. package/build/strings/trufflehog.js +71 -0
  220. package/build/strings/trufflehog.js.map +1 -0
  221. package/build/utility/banner.js +68 -0
  222. package/build/utility/banner.js.map +1 -0
  223. package/build/utility/getChromiumPath.js +40 -0
  224. package/build/utility/getChromiumPath.js.map +1 -0
  225. package/build/utility/globals.js +7 -0
  226. package/build/utility/globals.js.map +1 -1
  227. package/build/utility/makeReq.js +21 -11
  228. package/build/utility/makeReq.js.map +1 -1
  229. package/build/utility/postmanGenerator.js +2 -2
  230. package/build/utility/postmanGenerator.js.map +1 -1
  231. package/build/utility/puppeteerInstance.js +7 -1
  232. package/build/utility/puppeteerInstance.js.map +1 -1
  233. package/package.json +14 -8
  234. package/scripts/smoke-test.js +74 -0
@@ -0,0 +1,432 @@
1
+ import chalk from "chalk";
2
+ const COMMANDS = [
3
+ "lazyload",
4
+ "endpoints",
5
+ "strings",
6
+ "api-gateway",
7
+ "map",
8
+ "refactor",
9
+ "analyze",
10
+ "report",
11
+ "run",
12
+ "load",
13
+ "fingerprint",
14
+ "mcp",
15
+ "cs-mast",
16
+ "sourcemaps",
17
+ "completion",
18
+ ];
19
+ const FLAGS = {
20
+ lazyload: [
21
+ "-u",
22
+ "--url",
23
+ "-o",
24
+ "--output",
25
+ "--strict-scope",
26
+ "-s",
27
+ "--scope",
28
+ "-t",
29
+ "--threads",
30
+ "--subsequent-requests",
31
+ "--urls-file",
32
+ "--api-gateway",
33
+ "--api-gateway-config",
34
+ "--cache-file",
35
+ "--disable-cache",
36
+ "--cache-only",
37
+ "-y",
38
+ "--yes",
39
+ "--timeout",
40
+ "-k",
41
+ "--insecure",
42
+ "--no-sandbox",
43
+ "--build-id",
44
+ "--sourcemap-dir",
45
+ "--research",
46
+ "--research-output",
47
+ "--max-iterations",
48
+ "--max-js-size",
49
+ "--lazyload-timeout",
50
+ "--max-pages",
51
+ "--include-methods",
52
+ "--exclude-methods",
53
+ "--list-methods",
54
+ ],
55
+ endpoints: [
56
+ "-u",
57
+ "--url",
58
+ "-d",
59
+ "--directory",
60
+ "-o",
61
+ "--output",
62
+ "--output-format",
63
+ "-t",
64
+ "--tech",
65
+ "-l",
66
+ "--list",
67
+ "--mapped-json",
68
+ ],
69
+ strings: [
70
+ "-d",
71
+ "--directory",
72
+ "-o",
73
+ "--output",
74
+ "-e",
75
+ "--extract-urls",
76
+ "--extracted-url-path",
77
+ "-p",
78
+ "--permutate",
79
+ "--openapi",
80
+ "-s",
81
+ "--scan-secrets",
82
+ "--trufflehog",
83
+ ],
84
+ "api-gateway": [
85
+ "-i",
86
+ "--init",
87
+ "-d",
88
+ "--destroy",
89
+ "--destroy-all",
90
+ "-r",
91
+ "--region",
92
+ "-a",
93
+ "--access-key",
94
+ "-s",
95
+ "--secret-key",
96
+ "-c",
97
+ "--config",
98
+ "-l",
99
+ "--list",
100
+ "--feasibility",
101
+ "--feasibility-url",
102
+ ],
103
+ map: [
104
+ "-d",
105
+ "--directory",
106
+ "-t",
107
+ "--tech",
108
+ "-l",
109
+ "--list",
110
+ "-o",
111
+ "--output",
112
+ "-f",
113
+ "--format",
114
+ "-i",
115
+ "--interactive",
116
+ "-c",
117
+ "--command",
118
+ "--ai",
119
+ "--ai-threads",
120
+ "--ai-provider",
121
+ "--ai-endpoint",
122
+ "--openai-api-key",
123
+ "--model",
124
+ "--openapi",
125
+ "--openapi-output",
126
+ "--openapi-chunk-tag",
127
+ "--no-graphql",
128
+ "--ngql",
129
+ "--max-recursion-depth",
130
+ "--max-heap",
131
+ ],
132
+ refactor: [
133
+ "-m",
134
+ "--mapped-json",
135
+ "-o",
136
+ "--output",
137
+ "-t",
138
+ "--tech",
139
+ "-l",
140
+ "--list",
141
+ "--collisions",
142
+ "--sq",
143
+ "--signature-quality",
144
+ "--refresh-cache",
145
+ "--skip-cache-checks",
146
+ "--no-remote",
147
+ "--remote-collisions",
148
+ "--scat",
149
+ "--detect-version",
150
+ "--detect-version-config",
151
+ "--detect-version-dynamic-threshold",
152
+ "--detect-version-dynamic-conf-purge",
153
+ ],
154
+ analyze: [
155
+ "-r",
156
+ "--rules",
157
+ "-m",
158
+ "--mapped-json",
159
+ "-t",
160
+ "--tech",
161
+ "--openapi",
162
+ "-l",
163
+ "--list",
164
+ "--validate",
165
+ "-o",
166
+ "--output",
167
+ ],
168
+ report: [
169
+ "-s",
170
+ "--sqlite-db",
171
+ "-m",
172
+ "--mapped-json",
173
+ "-a",
174
+ "--analyze-json",
175
+ "-e",
176
+ "--endpoints-json",
177
+ "--map-openapi",
178
+ "--mapped-openapi-json",
179
+ "-o",
180
+ "--output",
181
+ ],
182
+ run: [
183
+ "-u",
184
+ "--url",
185
+ "-r",
186
+ "--rules",
187
+ "-c",
188
+ "--command",
189
+ "-o",
190
+ "--output",
191
+ "--strict-scope",
192
+ "-s",
193
+ "--scope",
194
+ "-t",
195
+ "--threads",
196
+ "--api-gateway",
197
+ "--api-gateway-config",
198
+ "--cache-file",
199
+ "--disable-cache",
200
+ "--cache-only",
201
+ "-y",
202
+ "--yes",
203
+ "--secrets",
204
+ "--trufflehog",
205
+ "--ai",
206
+ "--ai-threads",
207
+ "--ai-provider",
208
+ "--ai-endpoint",
209
+ "--openai-api-key",
210
+ "--model",
211
+ "--map-openapi-chunk-tag",
212
+ "--no-graphql",
213
+ "--ngql",
214
+ "--timeout",
215
+ "-k",
216
+ "--insecure",
217
+ "--no-sandbox",
218
+ "--sourcemap-dir",
219
+ "--research",
220
+ "--research-output",
221
+ "--max-iterations",
222
+ "--max-js-size",
223
+ "--lazyload-timeout",
224
+ "--max-heap",
225
+ "--max-pages",
226
+ "--include-methods",
227
+ "--exclude-methods",
228
+ "--list-methods",
229
+ "--cs-mast-tech-detect-threshold",
230
+ ],
231
+ load: ["-c", "--caido", "-u", "--url", "--cache-file"],
232
+ fingerprint: [
233
+ "-u",
234
+ "--url",
235
+ "-o",
236
+ "--output",
237
+ "-f",
238
+ "--format",
239
+ "-t",
240
+ "--threads",
241
+ "--timeout",
242
+ "-k",
243
+ "--insecure",
244
+ "--no-sandbox",
245
+ ],
246
+ mcp: [
247
+ "--cli",
248
+ "--server",
249
+ "-c",
250
+ "--chat",
251
+ "--config",
252
+ "--api-key",
253
+ "--model",
254
+ "--provider",
255
+ "--no-refresh-claude-creds",
256
+ "--claude-client-id",
257
+ ],
258
+ "cs-mast": [
259
+ "-o",
260
+ "--output",
261
+ "--ct",
262
+ "--collision-table",
263
+ "--min-collisions",
264
+ "--co",
265
+ "--collision-output",
266
+ "--cf",
267
+ "--collision-format",
268
+ "--scat",
269
+ "--sinc",
270
+ "--all-scat-permutations",
271
+ "--perm-output",
272
+ "--perm-concurrency",
273
+ ],
274
+ sourcemaps: ["-i", "--input", "-o", "--output"],
275
+ completion: ["bash", "zsh", "fish"],
276
+ };
277
+ function generateBashCompletion() {
278
+ const cmdList = COMMANDS.join(" ");
279
+ const caseBranches = Object.entries(FLAGS)
280
+ .map(([cmd, flags]) => ` ${cmd})\n opts="${flags.join(" ")}"\n ;;`)
281
+ .join("\n");
282
+ return `# js-recon bash completion
283
+ # Add to ~/.bashrc: eval "$(js-recon completion bash)"
284
+ _js_recon_completion() {
285
+ local cur prev words cword opts
286
+ COMPREPLY=()
287
+ cur="\${COMP_WORDS[COMP_CWORD]}"
288
+ prev="\${COMP_WORDS[COMP_CWORD-1]}"
289
+ words=("\${COMP_WORDS[@]}")
290
+ cword=\${COMP_CWORD}
291
+
292
+ if [[ \${cword} -eq 1 ]]; then
293
+ COMPREPLY=( \$(compgen -W "${cmdList}" -- "\${cur}") )
294
+ return 0
295
+ fi
296
+
297
+ local cmd="\${words[1]}"
298
+ opts=""
299
+ case "\${cmd}" in
300
+ ${caseBranches}
301
+ esac
302
+
303
+ COMPREPLY=( \$(compgen -W "\${opts}" -- "\${cur}") )
304
+ return 0
305
+ }
306
+ complete -F _js_recon_completion js-recon
307
+ `;
308
+ }
309
+ function generateZshCompletion() {
310
+ const commandDescriptions = [
311
+ "'lazyload:Run lazy load module'",
312
+ "'endpoints:Extract client-side endpoints'",
313
+ "'strings:Extract strings from JS files'",
314
+ "'api-gateway:Configure AWS API Gateway to rotate IP addresses'",
315
+ "'map:Map all the functions'",
316
+ "'refactor:Refactor the code'",
317
+ "'analyze:Analyze the code'",
318
+ "'report:Generate a report'",
319
+ "'run:Run all modules'",
320
+ "'load:Populate response cache from a Caido/Burp request history export'",
321
+ "'fingerprint:Detect front-end frameworks across one or more URLs'",
322
+ "'mcp:AI-powered CLI / one-shot chat / MCP server'",
323
+ "'cs-mast:Compute CS-MAST hashes for downloaded JS files'",
324
+ "'sourcemaps:Extract source files from .map sourcemap file(s)'",
325
+ "'completion:Generate shell completion scripts'",
326
+ ].join("\n ");
327
+ const caseBranches = Object.entries(FLAGS)
328
+ .map(([cmd, flags]) => {
329
+ const flagArgs = flags.map((f) => `'${f}'`).join(" ");
330
+ return ` (${cmd})\n _arguments '*: :(${flagArgs})'\n ;;`;
331
+ })
332
+ .join("\n");
333
+ return `#compdef js-recon
334
+ # js-recon zsh completion
335
+ # Add to ~/.zshrc: eval "$(js-recon completion zsh)"
336
+ # Or: js-recon completion zsh > "\${fpath[1]}/_js-recon"
337
+
338
+ _js_recon() {
339
+ local state line
340
+ typeset -A opt_args
341
+
342
+ _arguments -C \\
343
+ '(-h --help)'{-h,--help}'[Show help]' \\
344
+ '(-V --version)'{-V,--version}'[Show version]' \\
345
+ '1: :->command' \\
346
+ '*: :->args'
347
+
348
+ case \$state in
349
+ command)
350
+ local -a commands
351
+ commands=(
352
+ ${commandDescriptions}
353
+ )
354
+ _describe -t commands 'js-recon command' commands
355
+ ;;
356
+ args)
357
+ case \$line[1] in
358
+ ${caseBranches}
359
+ esac
360
+ ;;
361
+ esac
362
+ }
363
+
364
+ _js_recon "\$@"
365
+ `;
366
+ }
367
+ function generateFishCompletion() {
368
+ const cmdCompletions = COMMANDS.map((cmd) => `complete -c js-recon -f -n '__fish_use_subcommand' -a ${cmd}`).join("\n");
369
+ const flagCompletions = Object.entries(FLAGS)
370
+ .flatMap(([cmd, flags]) => flags.map((flag) => {
371
+ if (flag.startsWith("--")) {
372
+ return `complete -c js-recon -n '__fish_seen_subcommand_from ${cmd}' -l ${flag.slice(2)}`;
373
+ }
374
+ else if (flag.startsWith("-") && flag.length === 2) {
375
+ return `complete -c js-recon -n '__fish_seen_subcommand_from ${cmd}' -s ${flag.slice(1)}`;
376
+ }
377
+ // positional (e.g. shell names for 'completion' subcommand)
378
+ return `complete -c js-recon -n '__fish_seen_subcommand_from ${cmd}' -a ${flag}`;
379
+ }))
380
+ .join("\n");
381
+ return `# js-recon fish completion
382
+ # Save to: ~/.config/fish/completions/js-recon.fish
383
+ # Or run: js-recon completion fish > ~/.config/fish/completions/js-recon.fish
384
+
385
+ function __fish_use_subcommand
386
+ set -l cmd (commandline -poc)
387
+ set -e cmd[1]
388
+ for c in $cmd
389
+ if string match -qr '^[^-]' -- $c
390
+ return 1
391
+ end
392
+ end
393
+ return 0
394
+ end
395
+
396
+ function __fish_seen_subcommand_from
397
+ set -l cmd (commandline -poc)
398
+ set -e cmd[1]
399
+ for subcmd in $argv
400
+ if contains -- $subcmd $cmd
401
+ return 0
402
+ end
403
+ end
404
+ return 1
405
+ end
406
+
407
+ ${cmdCompletions}
408
+
409
+ ${flagCompletions}
410
+ `;
411
+ }
412
+ export default function completion(shell) {
413
+ if (!shell) {
414
+ console.error(chalk.red("[!] Shell type required. Usage: js-recon completion <bash|zsh|fish>"));
415
+ process.exit(1);
416
+ }
417
+ switch (shell.toLowerCase()) {
418
+ case "bash":
419
+ process.stdout.write(generateBashCompletion());
420
+ break;
421
+ case "zsh":
422
+ process.stdout.write(generateZshCompletion());
423
+ break;
424
+ case "fish":
425
+ process.stdout.write(generateFishCompletion());
426
+ break;
427
+ default:
428
+ console.error(chalk.red(`[!] Unknown shell: "${shell}". Supported shells: bash, zsh, fish`));
429
+ process.exit(1);
430
+ }
431
+ }
432
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/completion/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,213 @@
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 { cs_mast_init, ParseError, buildSignatureFromConfig } from "@shriyanss/cs-mast";
11
+ import * as fs from "fs";
12
+ import * as path from "path";
13
+ import chalk from "chalk";
14
+ const CS_MAST_CONFIG = {
15
+ hash: "sha256",
16
+ lang: "js",
17
+ prsr: "@babel/parser",
18
+ scat: ["lit", "decl", "loop", "cond"],
19
+ sinc: [],
20
+ sourceType: "unambiguous",
21
+ };
22
+ function findJsFiles(dir) {
23
+ const results = [];
24
+ if (!fs.existsSync(dir))
25
+ return results;
26
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
27
+ for (const entry of entries) {
28
+ const full = path.join(dir, entry.name);
29
+ if (entry.isDirectory()) {
30
+ results.push(...findJsFiles(full));
31
+ }
32
+ else if (entry.isFile() && entry.name.endsWith(".js")) {
33
+ results.push(full);
34
+ }
35
+ }
36
+ return results;
37
+ }
38
+ const ALL_SCAT = ["lit", "decl", "loop", "cond", "id", "op", "name", "val", "op_name"];
39
+ function allScatSubsets() {
40
+ const result = [];
41
+ for (let mask = 1; mask < 1 << ALL_SCAT.length; mask++) {
42
+ const subset = [];
43
+ for (let i = 0; i < ALL_SCAT.length; i++) {
44
+ if (mask & (1 << i))
45
+ subset.push(ALL_SCAT[i]);
46
+ }
47
+ result.push(subset);
48
+ }
49
+ return result;
50
+ }
51
+ function runOnePermutation(jsFiles, scat, sinc, minCollisions, permOutput, collisionFormat) {
52
+ return __awaiter(this, void 0, void 0, function* () {
53
+ const cfg = {
54
+ hash: "sha256",
55
+ lang: "js",
56
+ prsr: "@babel/parser",
57
+ scat,
58
+ sinc,
59
+ sourceType: "unambiguous",
60
+ };
61
+ const sigMap = new Map();
62
+ for (const file of jsFiles) {
63
+ try {
64
+ const source = fs.readFileSync(file, "utf-8");
65
+ const tree = cs_mast_init(source, cfg);
66
+ const sig = buildSignatureFromConfig(cfg, tree.rootHash);
67
+ if (!sigMap.has(sig))
68
+ sigMap.set(sig, []);
69
+ sigMap.get(sig).push(file);
70
+ }
71
+ catch (_a) {
72
+ // parse errors are silent in permutation mode
73
+ }
74
+ }
75
+ const collisions = [...sigMap.entries()]
76
+ .filter(([, files]) => files.length >= minCollisions)
77
+ .sort(([, a], [, b]) => b.length - a.length)
78
+ .map(([signature, files]) => ({ signature, count: files.length, files }));
79
+ if (collisions.length === 0)
80
+ return;
81
+ const name = scat.join("-");
82
+ const outFile = path.join(permOutput, `${name}.${collisionFormat}`);
83
+ if (collisionFormat === "json") {
84
+ fs.writeFileSync(outFile, JSON.stringify(collisions, null, 2));
85
+ }
86
+ else {
87
+ const rows = ["signature,count,files"];
88
+ for (const entry of collisions)
89
+ rows.push(`"${entry.signature}",${entry.count},"${entry.files.join("|")}"`);
90
+ fs.writeFileSync(outFile, rows.join("\n"));
91
+ }
92
+ });
93
+ }
94
+ export default (outputDir_1, collisionTable_1, minCollisions_1, collisionOutput_1, collisionFormat_1, ...args_1) => __awaiter(void 0, [outputDir_1, collisionTable_1, minCollisions_1, collisionOutput_1, collisionFormat_1, ...args_1], void 0, function* (outputDir, collisionTable, minCollisions, collisionOutput, collisionFormat, scatOverride = "", sincOverride = "", allPermutations = false, permOutput = undefined, permConcurrency = 0) {
95
+ if (collisionOutput && !["json", "csv"].includes(collisionFormat)) {
96
+ console.log(chalk.red(`[!] Invalid format: "${collisionFormat}". Use "json" or "csv".`));
97
+ process.exit(1);
98
+ }
99
+ // Resolve output path: if it's an existing directory or has no extension,
100
+ // write collisions.<fmt> in the current working directory.
101
+ if (collisionOutput) {
102
+ if ((fs.existsSync(collisionOutput) && fs.statSync(collisionOutput).isDirectory()) ||
103
+ !path.extname(collisionOutput)) {
104
+ collisionOutput = `collisions.${collisionFormat}`;
105
+ }
106
+ }
107
+ if (!fs.existsSync(outputDir)) {
108
+ console.log(chalk.red(`[!] Output directory not found: ${outputDir}`));
109
+ process.exit(1);
110
+ }
111
+ // apply scat/sinc overrides
112
+ const activeScat = scatOverride
113
+ ? scatOverride
114
+ .split(",")
115
+ .map((s) => s.trim())
116
+ .filter(Boolean)
117
+ : CS_MAST_CONFIG.scat;
118
+ const activeSinc = sincOverride
119
+ ? sincOverride
120
+ .split(",")
121
+ .map((s) => s.trim())
122
+ .filter(Boolean)
123
+ : [];
124
+ const activeConfig = Object.assign(Object.assign({}, CS_MAST_CONFIG), { scat: activeScat, sinc: activeSinc });
125
+ console.log(chalk.cyan(`[*] Scanning JS files in: ${outputDir}`));
126
+ const jsFiles = findJsFiles(outputDir);
127
+ console.log(chalk.cyan(`[*] Found ${jsFiles.length} JS file(s)`));
128
+ // --all-scat-permutations mode
129
+ if (allPermutations) {
130
+ if (!permOutput) {
131
+ console.log(chalk.red("[!] --perm-output <dir> is required with --all-scat-permutations"));
132
+ process.exit(1);
133
+ }
134
+ if (!fs.existsSync(permOutput))
135
+ fs.mkdirSync(permOutput, { recursive: true });
136
+ const subsets = allScatSubsets();
137
+ const concurrency = permConcurrency > 0 ? permConcurrency : Math.max(1, Math.floor(require("os").cpus().length / 2));
138
+ console.log(chalk.cyan(`[*] Running ${subsets.length} scat permutations (concurrency: ${concurrency})`));
139
+ let done = 0;
140
+ for (let i = 0; i < subsets.length; i += concurrency) {
141
+ const batch = subsets.slice(i, i + concurrency);
142
+ yield Promise.all(batch.map((scat) => runOnePermutation(jsFiles, scat, activeSinc, minCollisions, permOutput, collisionFormat)));
143
+ done += batch.length;
144
+ process.stdout.write(`\r[*] ${done}/${subsets.length} permutations done`);
145
+ }
146
+ console.log(chalk.green(`\n[+] All permutations written to: ${permOutput}`));
147
+ return;
148
+ }
149
+ const sigMap = new Map();
150
+ let parsed = 0;
151
+ let skipped = 0;
152
+ for (const file of jsFiles) {
153
+ try {
154
+ const source = fs.readFileSync(file, "utf-8");
155
+ const tree = cs_mast_init(source, activeConfig);
156
+ // rootSignature is empty when the File node isn't actively hashed;
157
+ // build the full PHC string from rootHash + config instead.
158
+ const sig = buildSignatureFromConfig(activeConfig, tree.rootHash);
159
+ if (!sigMap.has(sig))
160
+ sigMap.set(sig, []);
161
+ sigMap.get(sig).push(file);
162
+ parsed++;
163
+ }
164
+ catch (e) {
165
+ if (e instanceof ParseError) {
166
+ console.log(chalk.yellow(`[!] Skipping (parse error): ${file}`));
167
+ }
168
+ skipped++;
169
+ }
170
+ }
171
+ console.log(chalk.green(`[+] Processed ${parsed} file(s), skipped ${skipped}, unique hashes: ${sigMap.size}`));
172
+ if (!collisionTable && !collisionOutput)
173
+ return;
174
+ const collisions = [...sigMap.entries()]
175
+ .filter(([, files]) => files.length >= minCollisions)
176
+ .sort(([, a], [, b]) => b.length - a.length)
177
+ .map(([signature, files]) => ({ signature, count: files.length, files }));
178
+ if (collisions.length === 0) {
179
+ console.log(chalk.yellow(`[!] No collisions found with --min-collisions ${minCollisions}`));
180
+ return;
181
+ }
182
+ if (collisionTable) {
183
+ console.log(chalk.green(`\n[+] ${collisions.length} collision group(s) found (min-collisions: ${minCollisions}):\n`));
184
+ const sigColWidth = 60;
185
+ const countColWidth = 7;
186
+ const header = "Signature".padEnd(sigColWidth) + "Count".padEnd(countColWidth) + "Files";
187
+ const separator = "─".repeat(sigColWidth) + "─".repeat(countColWidth) + "─".repeat(40);
188
+ console.log(chalk.bold(header));
189
+ console.log(separator);
190
+ for (const entry of collisions) {
191
+ // Truncate at the hash boundary: show params + first 12 hex chars
192
+ const truncated = entry.signature.length > sigColWidth - 1
193
+ ? entry.signature.slice(0, sigColWidth - 4) + "..."
194
+ : entry.signature;
195
+ const fileList = entry.files.join(", ");
196
+ console.log(truncated.padEnd(sigColWidth) + String(entry.count).padEnd(countColWidth) + fileList);
197
+ }
198
+ }
199
+ if (!collisionOutput)
200
+ return;
201
+ if (collisionFormat === "json") {
202
+ fs.writeFileSync(collisionOutput, JSON.stringify(collisions, null, 2));
203
+ }
204
+ else {
205
+ const rows = ["signature,count,files"];
206
+ for (const entry of collisions) {
207
+ rows.push(`"${entry.signature}",${entry.count},"${entry.files.join("|")}"`);
208
+ }
209
+ fs.writeFileSync(collisionOutput, rows.join("\n"));
210
+ }
211
+ console.log(chalk.green(`[+] Collision data written to: ${collisionOutput}`));
212
+ });
213
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cs_mast/index.ts"],"names":[],"mappings":"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"}