@shriyanss/js-recon 1.4.1-alpha.4 → 1.4.1-alpha.6

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 (191) hide show
  1. package/.github/workflows/build-and-prettify.yaml +187 -1
  2. package/.github/workflows/promote-js-recon.yml +116 -0
  3. package/.github/workflows/publish-js-recon.yml +7 -114
  4. package/.github/workflows/rules-smoke-test.yaml +79 -0
  5. package/CHANGELOG.md +46 -0
  6. package/CLAUDE.md +208 -14
  7. package/Dockerfile.release +29 -0
  8. package/README.md +18 -17
  9. package/build/analyze/engine/csMastSEngine.js +129 -0
  10. package/build/analyze/engine/csMastSEngine.js.map +1 -0
  11. package/build/analyze/engine/index.js +15 -0
  12. package/build/analyze/engine/index.js.map +1 -1
  13. package/build/analyze/helpers/engineHelpers/findDirectAssignment.js +2 -1
  14. package/build/analyze/helpers/engineHelpers/findDirectAssignment.js.map +1 -1
  15. package/build/analyze/helpers/engineHelpers/findMemberExpressionAssignment.js +2 -1
  16. package/build/analyze/helpers/engineHelpers/findMemberExpressionAssignment.js.map +1 -1
  17. package/build/analyze/helpers/engineHelpers/resolveFunctionIdentifier.js +2 -1
  18. package/build/analyze/helpers/engineHelpers/resolveFunctionIdentifier.js.map +1 -1
  19. package/build/analyze/helpers/engineHelpers/taintFlow.js +11 -2
  20. package/build/analyze/helpers/engineHelpers/taintFlow.js.map +1 -1
  21. package/build/analyze/helpers/schemas.js +5 -1
  22. package/build/analyze/helpers/schemas.js.map +1 -1
  23. package/build/analyze/helpers/validate.js +3 -3
  24. package/build/analyze/helpers/validate.js.map +1 -1
  25. package/build/completion/index.js +432 -0
  26. package/build/completion/index.js.map +1 -0
  27. package/build/cs_mast/index.js +94 -3
  28. package/build/cs_mast/index.js.map +1 -1
  29. package/build/endpoints/next_js/client_jsFilesHref.js +2 -1
  30. package/build/endpoints/next_js/client_jsFilesHref.js.map +1 -1
  31. package/build/endpoints/next_js/client_jsonParse.js +2 -1
  32. package/build/endpoints/next_js/client_jsonParse.js.map +1 -1
  33. package/build/endpoints/next_js/client_mappedJsonFile.js +2 -1
  34. package/build/endpoints/next_js/client_mappedJsonFile.js.map +1 -1
  35. package/build/endpoints/next_js/client_subsequentRequests.js +2 -1
  36. package/build/endpoints/next_js/client_subsequentRequests.js.map +1 -1
  37. package/build/fingerprint/index.js +56 -33
  38. package/build/fingerprint/index.js.map +1 -1
  39. package/build/globalConfig.js +1 -1
  40. package/build/index.js +67 -6
  41. package/build/index.js.map +1 -1
  42. package/build/lazyLoad/angular/angular_getFromMainJs.js +2 -1
  43. package/build/lazyLoad/angular/angular_getFromMainJs.js.map +1 -1
  44. package/build/lazyLoad/downloadFilesUtil.js +6 -5
  45. package/build/lazyLoad/downloadFilesUtil.js.map +1 -1
  46. package/build/lazyLoad/downloadLoadedJsUtil.js +56 -7
  47. package/build/lazyLoad/downloadLoadedJsUtil.js.map +1 -1
  48. package/build/lazyLoad/downloadQueue.js +9 -8
  49. package/build/lazyLoad/downloadQueue.js.map +1 -1
  50. package/build/lazyLoad/index.js +28 -1
  51. package/build/lazyLoad/index.js.map +1 -1
  52. package/build/lazyLoad/next_js/next_GetLazyResourcesBuildManifestJs.js +36 -34
  53. package/build/lazyLoad/next_js/next_GetLazyResourcesBuildManifestJs.js.map +1 -1
  54. package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js +63 -15
  55. package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js.map +1 -1
  56. package/build/lazyLoad/next_js/next_parseLayoutJs.js +80 -68
  57. package/build/lazyLoad/next_js/next_parseLayoutJs.js.map +1 -1
  58. package/build/lazyLoad/next_js/next_promiseResolve.js +22 -16
  59. package/build/lazyLoad/next_js/next_promiseResolve.js.map +1 -1
  60. package/build/lazyLoad/nuxt_js/nuxt_astParse.js +49 -47
  61. package/build/lazyLoad/nuxt_js/nuxt_astParse.js.map +1 -1
  62. package/build/lazyLoad/nuxt_js/nuxt_getFromPageSource.js +3 -1
  63. package/build/lazyLoad/nuxt_js/nuxt_getFromPageSource.js.map +1 -1
  64. package/build/lazyLoad/nuxt_js/nuxt_stringAnalysisJSFiles.js +3 -2
  65. package/build/lazyLoad/nuxt_js/nuxt_stringAnalysisJSFiles.js.map +1 -1
  66. package/build/lazyLoad/react/react_followImports.js +12 -9
  67. package/build/lazyLoad/react/react_followImports.js.map +1 -1
  68. package/build/lazyLoad/react/react_webpackChunkPaths.js +175 -123
  69. package/build/lazyLoad/react/react_webpackChunkPaths.js.map +1 -1
  70. package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js +3 -2
  71. package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js.map +1 -1
  72. package/build/lazyLoad/techDetect/checkAngularJS.js +27 -6
  73. package/build/lazyLoad/techDetect/checkAngularJS.js.map +1 -1
  74. package/build/lazyLoad/techDetect/checkReact.js +8 -0
  75. package/build/lazyLoad/techDetect/checkReact.js.map +1 -1
  76. package/build/lazyLoad/techDetect/index.js +23 -2
  77. package/build/lazyLoad/techDetect/index.js.map +1 -1
  78. package/build/lazyLoad/vue/vue_RuntimeJs.js +2 -1
  79. package/build/lazyLoad/vue/vue_RuntimeJs.js.map +1 -1
  80. package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js +2 -1
  81. package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js.map +1 -1
  82. package/build/lazyLoad/vue/vue_discoverJsFiles.js +22 -10
  83. package/build/lazyLoad/vue/vue_discoverJsFiles.js.map +1 -1
  84. package/build/lazyLoad/vue/vue_getClientSidePaths.js +2 -1
  85. package/build/lazyLoad/vue/vue_getClientSidePaths.js.map +1 -1
  86. package/build/lazyLoad/vue/vue_jsImports.js +2 -1
  87. package/build/lazyLoad/vue/vue_jsImports.js.map +1 -1
  88. package/build/lazyLoad/vue/vue_viteMapDeps.js +62 -54
  89. package/build/lazyLoad/vue/vue_viteMapDeps.js.map +1 -1
  90. package/build/map/angular_js/getAngularConnections.js +1 -1
  91. package/build/map/angular_js/getAngularConnections.js.map +1 -1
  92. package/build/map/graphql/resolveGraphql.js +2 -1
  93. package/build/map/graphql/resolveGraphql.js.map +1 -1
  94. package/build/map/next_js/getExports.js +2 -1
  95. package/build/map/next_js/getExports.js.map +1 -1
  96. package/build/map/next_js/getFetchInstances.js +2 -1
  97. package/build/map/next_js/getFetchInstances.js.map +1 -1
  98. package/build/map/next_js/getTurbopackConnections.js +2 -1
  99. package/build/map/next_js/getTurbopackConnections.js.map +1 -1
  100. package/build/map/next_js/getWebpackConnections.js +2 -1
  101. package/build/map/next_js/getWebpackConnections.js.map +1 -1
  102. package/build/map/next_js/resolveAxios.js +2 -1
  103. package/build/map/next_js/resolveAxios.js.map +1 -1
  104. package/build/map/next_js/resolveAxiosHelpers/directCallsWithoutAssignment.js +2 -1
  105. package/build/map/next_js/resolveAxiosHelpers/directCallsWithoutAssignment.js.map +1 -1
  106. package/build/map/next_js/resolveAxiosHelpers/findAxiosInstance.js +2 -1
  107. package/build/map/next_js/resolveAxiosHelpers/findAxiosInstance.js.map +1 -1
  108. package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js +2 -1
  109. package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js.map +1 -1
  110. package/build/map/next_js/resolveAxiosHelpers/handleAxiosCreate.js +2 -1
  111. package/build/map/next_js/resolveAxiosHelpers/handleAxiosCreate.js.map +1 -1
  112. package/build/map/next_js/resolveAxiosHelpers/handleZDotCreate.js +2 -1
  113. package/build/map/next_js/resolveAxiosHelpers/handleZDotCreate.js.map +1 -1
  114. package/build/map/next_js/resolveAxiosHelpers/interceptorHeaders.js +2 -1
  115. package/build/map/next_js/resolveAxiosHelpers/interceptorHeaders.js.map +1 -1
  116. package/build/map/next_js/resolveAxiosHelpers/processExportedEndpoints.js +2 -1
  117. package/build/map/next_js/resolveAxiosHelpers/processExportedEndpoints.js.map +1 -1
  118. package/build/map/next_js/resolveAxiosHelpers/traceAxiosInstanceExports.js +2 -1
  119. package/build/map/next_js/resolveAxiosHelpers/traceAxiosInstanceExports.js.map +1 -1
  120. package/build/map/next_js/resolveAxiosHelpers/traceBody.js +2 -1
  121. package/build/map/next_js/resolveAxiosHelpers/traceBody.js.map +1 -1
  122. package/build/map/next_js/resolveFetch.js +2 -1
  123. package/build/map/next_js/resolveFetch.js.map +1 -1
  124. package/build/map/next_js/resolveNewRequest.js +2 -1
  125. package/build/map/next_js/resolveNewRequest.js.map +1 -1
  126. package/build/map/next_js/resolveServerActions.js +2 -1
  127. package/build/map/next_js/resolveServerActions.js.map +1 -1
  128. package/build/map/next_js/utils.js +2 -1
  129. package/build/map/next_js/utils.js.map +1 -1
  130. package/build/map/react_js/getReactConnections.js +5 -4
  131. package/build/map/react_js/getReactConnections.js.map +1 -1
  132. package/build/map/vue_js/crossFileResolver.js +3 -2
  133. package/build/map/vue_js/crossFileResolver.js.map +1 -1
  134. package/build/map/vue_js/getViteConnections.js +5 -4
  135. package/build/map/vue_js/getViteConnections.js.map +1 -1
  136. package/build/map/vue_js/taint_utils.js +2 -1
  137. package/build/map/vue_js/taint_utils.js.map +1 -1
  138. package/build/map/vue_js/vue_resolveFetch.js +3 -2
  139. package/build/map/vue_js/vue_resolveFetch.js.map +1 -1
  140. package/build/map/vue_js/vue_resolveHttpClient.js +3 -2
  141. package/build/map/vue_js/vue_resolveHttpClient.js.map +1 -1
  142. package/build/map/vue_js/vue_resolveXhr.js +3 -2
  143. package/build/map/vue_js/vue_resolveXhr.js.map +1 -1
  144. package/build/refactor/index.js +399 -60
  145. package/build/refactor/index.js.map +1 -1
  146. package/build/refactor/next/helpers.js +194 -13
  147. package/build/refactor/next/helpers.js.map +1 -1
  148. package/build/refactor/next/index.js +223 -36
  149. package/build/refactor/next/index.js.map +1 -1
  150. package/build/refactor/next/transform.js +905 -55
  151. package/build/refactor/next/transform.js.map +1 -1
  152. package/build/refactor/react/index.js +3 -3
  153. package/build/refactor/react/index.js.map +1 -1
  154. package/build/refactor/react/transform.js +2 -1
  155. package/build/refactor/react/transform.js.map +1 -1
  156. package/build/refactor/react/validator.js +2 -1
  157. package/build/refactor/react/validator.js.map +1 -1
  158. package/build/refactor/react-vite/index.js +39 -5
  159. package/build/refactor/react-vite/index.js.map +1 -1
  160. package/build/refactor/react-vite/vendor-analyze.js +3 -3
  161. package/build/refactor/react-vite/vendor-analyze.js.map +1 -1
  162. package/build/refactor/remote/config.js +17 -1
  163. package/build/refactor/remote/config.js.map +1 -1
  164. package/build/refactor/remote/hf-client.js +27 -2
  165. package/build/refactor/remote/hf-client.js.map +1 -1
  166. package/build/refactor/remote/version-detect.js +355 -0
  167. package/build/refactor/remote/version-detect.js.map +1 -0
  168. package/build/refactor/vue/index.js +176 -0
  169. package/build/refactor/vue/index.js.map +1 -0
  170. package/build/refactor/vue/vendor-analyze-vue.js +271 -0
  171. package/build/refactor/vue/vendor-analyze-vue.js.map +1 -0
  172. package/build/refactor/vue/vite.js +216 -0
  173. package/build/refactor/vue/vite.js.map +1 -0
  174. package/build/report/utility/genHtml.js +14 -3
  175. package/build/report/utility/genHtml.js.map +1 -1
  176. package/build/run/bundler-detect.js +140 -0
  177. package/build/run/bundler-detect.js.map +1 -0
  178. package/build/run/index.js +91 -5
  179. package/build/run/index.js.map +1 -1
  180. package/build/strings/index.js +6 -2
  181. package/build/strings/index.js.map +1 -1
  182. package/build/strings/trufflehog.js +71 -0
  183. package/build/strings/trufflehog.js.map +1 -0
  184. package/build/utility/makeReq.js +10 -9
  185. package/build/utility/makeReq.js.map +1 -1
  186. package/build/utility/postmanGenerator.js +2 -2
  187. package/build/utility/postmanGenerator.js.map +1 -1
  188. package/build/utility/puppeteerInstance.js +7 -1
  189. package/build/utility/puppeteerInstance.js.map +1 -1
  190. package/package.json +9 -5
  191. package/scripts/smoke-test.js +74 -0
@@ -0,0 +1,355 @@
1
+ // Version detection for React bundles using CS-MAST-S reliable signatures.
2
+ // Fetches per-version reliable_signatures.json from the HuggingFace dataset and
3
+ // matches them against CS-MAST signatures generated from the target bundle's chunks.
4
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
5
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
6
+ return new (P || (P = Promise))(function (resolve, reject) {
7
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
8
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
9
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
10
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
11
+ });
12
+ };
13
+ import fs from "fs";
14
+ import path from "path";
15
+ import os from "os";
16
+ import chalk from "chalk";
17
+ import { cs_mast_init } from "@shriyanss/cs-mast";
18
+ import { getHfRawUrl, getHfApiTreeUrl, fetchText } from "./hf-client.js";
19
+ // Maps refactor tech identifier to the bundler name used in the HF version bucket path.
20
+ export const VERSION_TECH_TO_BUNDLER = {
21
+ "react-webpack": "webpack",
22
+ "react-vite": "vite",
23
+ };
24
+ // Maps HF version folder name to npm semver strings for package.json generation.
25
+ // react-dom is absent for React versions that predated the react-dom split (< 0.14).
26
+ const REACT_VERSION_TO_NPM = {
27
+ "react-0.11": { react: "0.11.2" },
28
+ "react-0.12": { react: "0.12.2" },
29
+ "react-0.13": { react: "0.13.3" },
30
+ "react-0.14": { react: "0.14.10", reactDom: "0.14.10" },
31
+ "react-15": { react: "15.7.0", reactDom: "15.7.0" },
32
+ "react-16": { react: "16.14.0", reactDom: "16.14.0" },
33
+ "react-17": { react: "17.0.2", reactDom: "17.0.2" },
34
+ "react-18": { react: "18.3.1", reactDom: "18.3.1" },
35
+ "react-19": { react: "19.1.0", reactDom: "19.1.0" },
36
+ };
37
+ const VERSION_CACHE_DIR = path.join(os.homedir(), ".js-recon", "refactor", "version_sigs_cache");
38
+ // Cache TTL: 7 days (matches the list-cache TTL for collisions.json files).
39
+ const CACHE_TTL_MS = 7 * 24 * 60 * 60 * 1000;
40
+ function getVersionCachePath(bundler, version, scatDir) {
41
+ return path.join(VERSION_CACHE_DIR, bundler, version, scatDir, "reliable_signatures.json");
42
+ }
43
+ function loadCachedReliableSigs(bundler, version, scatDir) {
44
+ const filePath = getVersionCachePath(bundler, version, scatDir);
45
+ const cachedAtPath = filePath + ".cached_at";
46
+ if (!fs.existsSync(filePath) || !fs.existsSync(cachedAtPath))
47
+ return null;
48
+ try {
49
+ const cachedAt = parseInt(fs.readFileSync(cachedAtPath, "utf8").trim(), 10);
50
+ if (isNaN(cachedAt) || Date.now() - cachedAt > CACHE_TTL_MS)
51
+ return null;
52
+ return JSON.parse(fs.readFileSync(filePath, "utf8"));
53
+ }
54
+ catch (_a) {
55
+ return null;
56
+ }
57
+ }
58
+ function saveCachedReliableSigs(bundler, version, scatDir, sigs) {
59
+ const filePath = getVersionCachePath(bundler, version, scatDir);
60
+ const cachedAtPath = filePath + ".cached_at";
61
+ try {
62
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
63
+ fs.writeFileSync(filePath, JSON.stringify(sigs));
64
+ fs.writeFileSync(cachedAtPath, String(Date.now()));
65
+ }
66
+ catch (_a) {
67
+ // Non-fatal — next run will re-fetch
68
+ }
69
+ }
70
+ // Lists available React version directories under version/react/<bundler>/ in the HF bucket.
71
+ // Returns an array of version folder names like ["react-16", "react-17", "react-18"].
72
+ export function listAvailableVersions(bundler) {
73
+ return __awaiter(this, void 0, void 0, function* () {
74
+ const prefix = `version/react/${bundler}`;
75
+ const dirs = new Set();
76
+ let nextUrl = getHfApiTreeUrl(prefix);
77
+ while (nextUrl) {
78
+ let resp;
79
+ try {
80
+ resp = yield fetch(nextUrl);
81
+ }
82
+ catch (_a) {
83
+ break;
84
+ }
85
+ if (resp.status === 429)
86
+ throw new Error(`Rate limited by HuggingFace`);
87
+ if (!resp.ok)
88
+ break;
89
+ const text = yield resp.text();
90
+ try {
91
+ const entries = JSON.parse(text);
92
+ const prefixSlash = prefix.endsWith("/") ? prefix : `${prefix}/`;
93
+ for (const e of entries) {
94
+ const rel = e.path.startsWith(prefixSlash) ? e.path.slice(prefixSlash.length) : e.path;
95
+ const parts = rel.split("/");
96
+ if (parts.length > 1 && parts[0].startsWith("react-"))
97
+ dirs.add(parts[0]);
98
+ }
99
+ }
100
+ catch (_b) {
101
+ break;
102
+ }
103
+ const linkHeader = resp.headers.get("link");
104
+ const match = linkHeader === null || linkHeader === void 0 ? void 0 : linkHeader.match(/<([^>]+)>;\s*rel="next"/);
105
+ nextUrl = match ? match[1] : null;
106
+ }
107
+ return Array.from(dirs).sort();
108
+ });
109
+ }
110
+ // Lists scat config directory names immediately under version/react/<bundler>/<version>/ in the HF bucket.
111
+ // Returns strings like ["cond-name-op_name", "id-cond-name-op_name", "lit-decl-loop-cond", ...].
112
+ function listScatDirsForVersion(bundler, version) {
113
+ return __awaiter(this, void 0, void 0, function* () {
114
+ const prefix = `version/react/${bundler}/${version}`;
115
+ const dirs = new Set();
116
+ let nextUrl = getHfApiTreeUrl(prefix);
117
+ while (nextUrl) {
118
+ let resp;
119
+ try {
120
+ resp = yield fetch(nextUrl);
121
+ }
122
+ catch (_a) {
123
+ break;
124
+ }
125
+ if (resp.status === 429)
126
+ throw new Error(`Rate limited by HuggingFace`);
127
+ if (!resp.ok)
128
+ break;
129
+ const text = yield resp.text();
130
+ try {
131
+ const entries = JSON.parse(text);
132
+ const prefixSlash = `${prefix}/`;
133
+ for (const e of entries) {
134
+ const rel = e.path.startsWith(prefixSlash) ? e.path.slice(prefixSlash.length) : e.path;
135
+ const parts = rel.split("/");
136
+ if (parts.length > 1 && parts[0])
137
+ dirs.add(parts[0]);
138
+ }
139
+ }
140
+ catch (_b) {
141
+ break;
142
+ }
143
+ const linkHeader = resp.headers.get("link");
144
+ const match = linkHeader === null || linkHeader === void 0 ? void 0 : linkHeader.match(/<([^>]+)>;\s*rel="next"/);
145
+ nextUrl = match ? match[1] : null;
146
+ }
147
+ return Array.from(dirs).sort();
148
+ });
149
+ }
150
+ /**
151
+ * Dynamically selects up to `threshold` scat configs that have non-empty reliable_signatures.json
152
+ * for ALL known versions of the given bundler. A scat config is only selected if every version's
153
+ * reliable_signatures.json for that config is non-empty — ensuring it can be used for detection
154
+ * across the full version range.
155
+ *
156
+ * @param bundler - Bundler name (e.g. "webpack", "vite")
157
+ * @param versions - Available version folder names from listAvailableVersions()
158
+ * @param threshold - Maximum number of scat configs to select (must be positive)
159
+ * @returns Array of selected scatDir strings (may be shorter than threshold if insufficient data)
160
+ */
161
+ export function selectDynamicScatConfigs(bundler, versions, threshold) {
162
+ return __awaiter(this, void 0, void 0, function* () {
163
+ if (versions.length === 0)
164
+ return [];
165
+ // Use the first version to enumerate available scat dirs; all versions share the same set.
166
+ const referenceVersion = versions[0];
167
+ console.log(chalk.cyan(`[i] Dynamic scat config selection: listing scat dirs for ${bundler}/${referenceVersion}...`));
168
+ let scatDirs;
169
+ try {
170
+ scatDirs = yield listScatDirsForVersion(bundler, referenceVersion);
171
+ }
172
+ catch (e) {
173
+ console.log(chalk.yellow(`[!] Dynamic scat selection: could not list scat dirs (${String(e)})`));
174
+ return [];
175
+ }
176
+ if (scatDirs.length === 0) {
177
+ console.log(chalk.yellow(`[!] Dynamic scat selection: no scat dirs found for ${bundler}/${referenceVersion}`));
178
+ return [];
179
+ }
180
+ const selected = [];
181
+ for (const scatDir of scatDirs) {
182
+ if (selected.length >= threshold)
183
+ break;
184
+ // A config is usable only if reliable_signatures.json is non-empty for every known version.
185
+ let allNonEmpty = true;
186
+ for (const version of versions) {
187
+ const sigs = yield fetchReliableSignatures(bundler, version, scatDir);
188
+ if (!sigs || sigs.length === 0) {
189
+ allNonEmpty = false;
190
+ break;
191
+ }
192
+ }
193
+ if (allNonEmpty) {
194
+ selected.push(scatDir);
195
+ console.log(chalk.cyan(`[i] Dynamic scat config selected: ${scatDir} (${selected.length}/${threshold})`));
196
+ }
197
+ }
198
+ return selected;
199
+ });
200
+ }
201
+ /**
202
+ * Validates that a static (user-supplied) scat config has non-empty reliable_signatures.json
203
+ * for every known version. Returns true when the config is usable; false if any version is empty.
204
+ */
205
+ export function validateStaticScatConfig(bundler, versions, scatDir) {
206
+ return __awaiter(this, void 0, void 0, function* () {
207
+ for (const version of versions) {
208
+ const sigs = yield fetchReliableSignatures(bundler, version, scatDir);
209
+ if (!sigs || sigs.length === 0)
210
+ return false;
211
+ }
212
+ return true;
213
+ });
214
+ }
215
+ // Fetches (or loads from cache) reliable_signatures.json for one (bundler, version, scatDir) combo.
216
+ // Returns an array of PHC signature strings, or null if not available.
217
+ function fetchReliableSignatures(bundler, version, scatDir) {
218
+ return __awaiter(this, void 0, void 0, function* () {
219
+ const cached = loadCachedReliableSigs(bundler, version, scatDir);
220
+ if (cached !== null)
221
+ return cached;
222
+ const hfSubpath = `${version}/${scatDir}/reliable_signatures.json`;
223
+ const url = getHfRawUrl(`version/react/${bundler}`, hfSubpath);
224
+ const text = yield fetchText(url);
225
+ if (text === null)
226
+ return null;
227
+ try {
228
+ const sigs = JSON.parse(text);
229
+ if (!Array.isArray(sigs))
230
+ return null;
231
+ saveCachedReliableSigs(bundler, version, scatDir, sigs);
232
+ return sigs;
233
+ }
234
+ catch (_a) {
235
+ return null;
236
+ }
237
+ });
238
+ }
239
+ // Generates the set of all CS-MAST sub-tree signatures from every chunk in the mapped JSON,
240
+ // plus any extra code snippets (e.g. vendor chunk file contents not included in mapped.json).
241
+ // Uses the same scat categories that drove library stripping so detection uses a consistent
242
+ // signature space.
243
+ export function generateBundleSignatures(chunks, scat, extraCodes) {
244
+ const allSigs = new Set();
245
+ const codesToHash = [
246
+ ...Object.values(chunks)
247
+ .map((c) => c.code)
248
+ .filter(Boolean),
249
+ ...(extraCodes !== null && extraCodes !== void 0 ? extraCodes : []),
250
+ ];
251
+ for (const code of codesToHash) {
252
+ try {
253
+ const tree = cs_mast_init(code, {
254
+ hash: "sha256",
255
+ scat,
256
+ sinc: [],
257
+ lang: "js",
258
+ prsr: "@babel/parser",
259
+ sourceType: "unambiguous",
260
+ });
261
+ for (const sig of tree._signatureMap.keys()) {
262
+ allSigs.add(sig);
263
+ }
264
+ }
265
+ catch (_a) {
266
+ // Unparseable chunk (e.g. CSS-in-JS string, syntax error) — skip silently
267
+ }
268
+ }
269
+ return allSigs;
270
+ }
271
+ /**
272
+ * Detects the React version used in a bundle by matching its CS-MAST signatures against
273
+ * per-version reliable_signatures.json files from the HuggingFace dataset.
274
+ *
275
+ * @param chunks - Parsed mapped.json chunks from the target bundle
276
+ * @param tech - Refactor tech identifier (e.g. "react-webpack")
277
+ * @param scatDirs - Scat directory names to use (e.g. ["lit-decl-loop-cond", "id-cond"]). Match
278
+ * counts across all scat dirs are summed per version; the version with the
279
+ * highest total wins.
280
+ * @param extraCodes - Additional raw JS code strings to include in signature generation
281
+ * (e.g. vendor chunk files that contain React library code but are
282
+ * not present in mapped.json)
283
+ * @returns The best-matching version result, or null if no version data available or no match found
284
+ */
285
+ export function detectReactVersion(chunks, tech, scatDirs, extraCodes) {
286
+ return __awaiter(this, void 0, void 0, function* () {
287
+ var _a, _b;
288
+ const bundler = VERSION_TECH_TO_BUNDLER[tech];
289
+ if (!bundler)
290
+ return null;
291
+ if (scatDirs.length === 0)
292
+ return null;
293
+ // List available versions for this bundler
294
+ console.log(chalk.cyan(`[i] Version detection: listing available React versions for ${bundler}...`));
295
+ let versions;
296
+ try {
297
+ versions = yield listAvailableVersions(bundler);
298
+ }
299
+ catch (e) {
300
+ console.log(chalk.yellow(`[!] Version detection: could not list versions (${String(e)})`));
301
+ return null;
302
+ }
303
+ if (versions.length === 0) {
304
+ console.log(chalk.yellow(`[!] Version detection: no version data found for ${bundler} in the dataset`));
305
+ return null;
306
+ }
307
+ console.log(chalk.cyan(`[i] Version detection: using ${scatDirs.length} scat config(s): ${scatDirs.join(", ")}`));
308
+ const totalCodeUnits = Object.keys(chunks).length + ((_a = extraCodes === null || extraCodes === void 0 ? void 0 : extraCodes.length) !== null && _a !== void 0 ? _a : 0);
309
+ // Accumulate match counts per version across all scat dirs.
310
+ // Each scat config contributes independent signature evidence; summing gives a stronger signal.
311
+ const matchesPerVersion = new Map();
312
+ for (const scatDir of scatDirs) {
313
+ // Derive ScatCategory[] from scatDir for signature generation.
314
+ // scatDir uses hyphens as separators and op_name uses an underscore internally —
315
+ // splitting on "-" yields valid ScatCategory values for all 511 combos.
316
+ const scat = scatDir.split("-");
317
+ console.log(chalk.cyan(`[i] Version detection: generating signatures from ${totalCodeUnits} code unit(s) (scat: ${scatDir})...`));
318
+ const bundleSigs = generateBundleSignatures(chunks, scat, extraCodes);
319
+ if (bundleSigs.size === 0) {
320
+ console.log(chalk.yellow(`[!] Version detection: no signatures generated for scat "${scatDir}", skipping`));
321
+ continue;
322
+ }
323
+ console.log(chalk.cyan(`[i] Version detection: checking ${versions.length} versions for scat "${scatDir}"...`));
324
+ for (const version of versions) {
325
+ const reliableSigs = yield fetchReliableSignatures(bundler, version, scatDir);
326
+ if (!reliableSigs || reliableSigs.length === 0)
327
+ continue;
328
+ let matchCount = 0;
329
+ for (const sig of reliableSigs) {
330
+ if (bundleSigs.has(sig))
331
+ matchCount++;
332
+ }
333
+ if (matchCount > 0) {
334
+ matchesPerVersion.set(version, ((_b = matchesPerVersion.get(version)) !== null && _b !== void 0 ? _b : 0) + matchCount);
335
+ }
336
+ }
337
+ }
338
+ let bestMatch = null;
339
+ for (const [version, totalMatches] of matchesPerVersion.entries()) {
340
+ const npmInfo = REACT_VERSION_TO_NPM[version];
341
+ if (!npmInfo)
342
+ continue;
343
+ if (!bestMatch || totalMatches > bestMatch.matchCount) {
344
+ bestMatch = {
345
+ versionKey: version,
346
+ reactNpm: npmInfo.react,
347
+ reactDomNpm: npmInfo.reactDom,
348
+ matchCount: totalMatches,
349
+ };
350
+ }
351
+ }
352
+ return bestMatch;
353
+ });
354
+ }
355
+ //# sourceMappingURL=version-detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-detect.js","sourceRoot":"","sources":["../../../src/refactor/remote/version-detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,176 @@
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
+ var _a;
11
+ import chalk from "chalk";
12
+ import parser from "@babel/parser";
13
+ import _traverse from "@babel/traverse";
14
+ import * as t from "@babel/types";
15
+ import { transformWebpackModule } from "../next/transform.js";
16
+ import { validateAndFix } from "../next/validator.js";
17
+ const traverse = ((_a = _traverse.default) !== null && _a !== void 0 ? _a : _traverse);
18
+ /**
19
+ * Extracts the numeric module map from a webpack chunk container.
20
+ *
21
+ * Handles both webpack 4 (webpackJsonp) and webpack 5 (webpackChunk) formats:
22
+ *
23
+ * webpack 4: (window.webpackJsonp = window.webpackJsonp || []).push([[chunkIds], {moduleId: fn, ...}])
24
+ * webpack 5: (self.webpackChunk_APP = self.webpackChunk_APP || []).push([[chunkIds], {moduleId: fn, ...}, runtimeFn])
25
+ *
26
+ * Returns an array of { id, fnNode } pairs for all module functions in the chunk,
27
+ * or an empty array if the container format is not recognised.
28
+ */
29
+ function extractModulesFromWebpackChunk(ast) {
30
+ const results = [];
31
+ traverse(ast, {
32
+ CallExpression(callPath) {
33
+ const node = callPath.node;
34
+ const callee = node.callee;
35
+ // Must be a member expression ending in `.push`
36
+ if (!t.isMemberExpression(callee) || callee.computed)
37
+ return;
38
+ if (!t.isIdentifier(callee.property, { name: "push" }))
39
+ return;
40
+ if (node.arguments.length < 1)
41
+ return;
42
+ // The single argument is an array: [[chunkIds], {moduleMap}, ?runtimeFn]
43
+ const arg = node.arguments[0];
44
+ if (!t.isArrayExpression(arg))
45
+ return;
46
+ if (arg.elements.length < 2)
47
+ return;
48
+ const moduleMapNode = arg.elements[1];
49
+ if (!moduleMapNode || !t.isObjectExpression(moduleMapNode))
50
+ return;
51
+ // Confirm the object contains at least one numeric or string key
52
+ const props = moduleMapNode.properties;
53
+ const hasModuleProps = props.some((p) => t.isObjectProperty(p) &&
54
+ (t.isNumericLiteral(p.key) || t.isStringLiteral(p.key)));
55
+ if (!hasModuleProps)
56
+ return;
57
+ // Extract all module functions
58
+ for (const prop of props) {
59
+ if (!t.isObjectProperty(prop))
60
+ continue;
61
+ const key = prop.key;
62
+ const val = prop.value;
63
+ const moduleId = t.isNumericLiteral(key)
64
+ ? String(key.value)
65
+ : t.isStringLiteral(key)
66
+ ? key.value
67
+ : null;
68
+ if (!moduleId)
69
+ continue;
70
+ if (!t.isFunctionExpression(val) && !t.isArrowFunctionExpression(val))
71
+ continue;
72
+ results.push({
73
+ id: moduleId,
74
+ fnNode: val,
75
+ path: callPath,
76
+ });
77
+ }
78
+ callPath.stop();
79
+ },
80
+ });
81
+ return results;
82
+ }
83
+ /**
84
+ * Refactors a Vue webpack chunk into per-module ES module files.
85
+ *
86
+ * Input: a Chunk whose `code` field is a full webpack chunk file:
87
+ * - Possibly starts with `// File Source: <url>\n` (js-recon annotation)
88
+ * - Then the webpackJsonp / webpackChunk push expression
89
+ *
90
+ * Each module in the chunk's module map becomes a separate output file `<id>.js`.
91
+ *
92
+ * Module function format (webpack 4, FunctionExpression):
93
+ * { 429: function(module, exports, require) { ... } }
94
+ * Module function format (webpack 5, ArrowFunctionExpression):
95
+ * { 429: (module, exports, require) => { ... } }
96
+ *
97
+ * Both formats use identical param semantics:
98
+ * params[0] = module — module object (e.exports = X for CJS exports)
99
+ * params[1] = exports — exports target (ODP, require.d for named exports)
100
+ * params[2] = require — require function (r(N) for cross-module imports)
101
+ */
102
+ export const refactorVueWebpack = (chunk) => __awaiter(void 0, void 0, void 0, function* () {
103
+ // Strip the js-recon file-source annotation if present
104
+ const code = chunk.code.replace(/^\/\/ File Source:[^\n]*\n/, "");
105
+ if (!code.trim())
106
+ return {};
107
+ let ast;
108
+ try {
109
+ ast = parser.parse(code, {
110
+ sourceType: "unambiguous",
111
+ plugins: ["jsx", "typescript"],
112
+ errorRecovery: true,
113
+ });
114
+ }
115
+ catch (_a) {
116
+ console.log(chalk.yellow(`[!] Failed to parse Vue webpack chunk ${chunk.id} — skipping`));
117
+ return {};
118
+ }
119
+ const modules = extractModulesFromWebpackChunk(ast);
120
+ if (modules.length === 0) {
121
+ console.log(chalk.yellow(`[~] No webpack module map found in chunk ${chunk.id} — skipping`));
122
+ return {};
123
+ }
124
+ // Re-parse each module function in its own traversal so fnPath has correct scope.
125
+ // We need NodePath objects, which requires re-traversing with a visitor.
126
+ const results = {};
127
+ // Build a per-module-id lookup from the extracted fnNodes (by reference)
128
+ const fnNodeToId = new Map();
129
+ for (const { id, fnNode } of modules) {
130
+ fnNodeToId.set(fnNode, id);
131
+ }
132
+ // Collect NodePaths by traversing the AST
133
+ const capturedPaths = new Map();
134
+ traverse(ast, {
135
+ FunctionExpression(path) {
136
+ const id = fnNodeToId.get(path.node);
137
+ if (id)
138
+ capturedPaths.set(id, path);
139
+ },
140
+ ArrowFunctionExpression(path) {
141
+ const id = fnNodeToId.get(path.node);
142
+ if (id)
143
+ capturedPaths.set(id, path);
144
+ },
145
+ });
146
+ for (const { id, fnNode } of modules) {
147
+ console.log(chalk.cyan(`[i] Processing Vue (webpack) module: ${id}`));
148
+ const fnPath = capturedPaths.get(id);
149
+ if (!fnPath) {
150
+ console.log(chalk.yellow(`[!] Could not get NodePath for module ${id} — skipping`));
151
+ continue;
152
+ }
153
+ const params = fnNode.params;
154
+ const moduleParam = params[0] && t.isIdentifier(params[0]) ? params[0].name : "";
155
+ const exportsParam = params[1] && t.isIdentifier(params[1]) ? params[1].name : "";
156
+ const requireParam = params[2] && t.isIdentifier(params[2]) ? params[2].name : "";
157
+ const entry = {
158
+ id,
159
+ fnPath: fnPath,
160
+ runtimeParam: "",
161
+ moduleParam,
162
+ exportsParam,
163
+ requireParam,
164
+ };
165
+ const statements = transformWebpackModule(entry);
166
+ const rawCode = validateAndFix(statements, id);
167
+ if (rawCode === null) {
168
+ console.log(chalk.yellow(`[~] Module ${id} skipped due to unresolvable syntax errors`));
169
+ continue;
170
+ }
171
+ results[id] = rawCode;
172
+ }
173
+ return results;
174
+ });
175
+ export default refactorVueWebpack;
176
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/refactor/vue/index.ts"],"names":[],"mappings":"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"}