@js-recon/js-recon 1.3.2 → 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.
- package/.github/workflows/build-and-prettify.yaml +207 -14
- package/.github/workflows/pr_checker.yml +2 -2
- package/.github/workflows/promote-js-recon.yml +104 -0
- package/.github/workflows/publish-js-recon.yml +22 -80
- package/.github/workflows/rules-smoke-test.yaml +79 -0
- package/CHANGELOG.md +177 -4
- package/CLAUDE.md +350 -16
- package/Dockerfile.release +29 -0
- package/README.md +48 -19
- package/build/analyze/engine/csMastSEngine.js +129 -0
- package/build/analyze/engine/csMastSEngine.js.map +1 -0
- package/build/analyze/engine/index.js +15 -0
- package/build/analyze/engine/index.js.map +1 -1
- package/build/analyze/helpers/engineHelpers/findDirectAssignment.js +2 -1
- package/build/analyze/helpers/engineHelpers/findDirectAssignment.js.map +1 -1
- package/build/analyze/helpers/engineHelpers/findMemberExpressionAssignment.js +2 -1
- package/build/analyze/helpers/engineHelpers/findMemberExpressionAssignment.js.map +1 -1
- package/build/analyze/helpers/engineHelpers/resolveFunctionIdentifier.js +2 -1
- package/build/analyze/helpers/engineHelpers/resolveFunctionIdentifier.js.map +1 -1
- package/build/analyze/helpers/engineHelpers/taintFlow.js +11 -2
- package/build/analyze/helpers/engineHelpers/taintFlow.js.map +1 -1
- package/build/analyze/helpers/initRules.js.map +1 -1
- package/build/analyze/helpers/schemas.js +6 -2
- package/build/analyze/helpers/schemas.js.map +1 -1
- package/build/analyze/helpers/validate.js +3 -3
- package/build/analyze/helpers/validate.js.map +1 -1
- package/build/analyze/index.js +1 -0
- package/build/analyze/index.js.map +1 -1
- package/build/completion/index.js +432 -0
- package/build/completion/index.js.map +1 -0
- package/build/cs_mast/index.js +213 -0
- package/build/cs_mast/index.js.map +1 -0
- package/build/endpoints/next_js/client_jsFilesHref.js +2 -1
- package/build/endpoints/next_js/client_jsFilesHref.js.map +1 -1
- package/build/endpoints/next_js/client_jsonParse.js +2 -1
- package/build/endpoints/next_js/client_jsonParse.js.map +1 -1
- package/build/endpoints/next_js/client_mappedJsonFile.js +2 -1
- package/build/endpoints/next_js/client_mappedJsonFile.js.map +1 -1
- package/build/endpoints/next_js/client_subsequentRequests.js +2 -1
- package/build/endpoints/next_js/client_subsequentRequests.js.map +1 -1
- package/build/fingerprint/index.js +56 -33
- package/build/fingerprint/index.js.map +1 -1
- package/build/globalConfig.js +3 -3
- package/build/globalConfig.js.map +1 -1
- package/build/index.js +210 -10
- package/build/index.js.map +1 -1
- package/build/lazyLoad/angular/angular_getFromMainJs.js +2 -1
- package/build/lazyLoad/angular/angular_getFromMainJs.js.map +1 -1
- package/build/lazyLoad/downloadFilesUtil.js +6 -5
- package/build/lazyLoad/downloadFilesUtil.js.map +1 -1
- package/build/lazyLoad/downloadLoadedJsUtil.js +59 -5
- package/build/lazyLoad/downloadLoadedJsUtil.js.map +1 -1
- package/build/lazyLoad/downloadQueue.js +10 -9
- package/build/lazyLoad/downloadQueue.js.map +1 -1
- package/build/lazyLoad/index.js +127 -85
- package/build/lazyLoad/index.js.map +1 -1
- package/build/lazyLoad/methodFilter.js +50 -0
- package/build/lazyLoad/methodFilter.js.map +1 -0
- package/build/lazyLoad/next_js/NextJsCrawler.js +69 -48
- package/build/lazyLoad/next_js/NextJsCrawler.js.map +1 -1
- package/build/lazyLoad/next_js/next_GetLazyResourcesBuildManifestJs.js +36 -34
- package/build/lazyLoad/next_js/next_GetLazyResourcesBuildManifestJs.js.map +1 -1
- package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js +66 -13
- package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js.map +1 -1
- package/build/lazyLoad/next_js/next_parseLayoutJs.js +80 -68
- package/build/lazyLoad/next_js/next_parseLayoutJs.js.map +1 -1
- package/build/lazyLoad/next_js/next_promiseResolve.js +22 -16
- package/build/lazyLoad/next_js/next_promiseResolve.js.map +1 -1
- package/build/lazyLoad/nuxt_js/nuxt_astParse.js +49 -47
- package/build/lazyLoad/nuxt_js/nuxt_astParse.js.map +1 -1
- package/build/lazyLoad/nuxt_js/nuxt_getBuildsManifest.js +64 -0
- package/build/lazyLoad/nuxt_js/nuxt_getBuildsManifest.js.map +1 -0
- package/build/lazyLoad/nuxt_js/nuxt_getFromPageSource.js +3 -1
- package/build/lazyLoad/nuxt_js/nuxt_getFromPageSource.js.map +1 -1
- package/build/lazyLoad/nuxt_js/nuxt_stringAnalysisJSFiles.js +3 -2
- package/build/lazyLoad/nuxt_js/nuxt_stringAnalysisJSFiles.js.map +1 -1
- package/build/lazyLoad/react/react_followImports.js +16 -7
- package/build/lazyLoad/react/react_followImports.js.map +1 -1
- package/build/lazyLoad/react/react_webpackChunkPaths.js +175 -123
- package/build/lazyLoad/react/react_webpackChunkPaths.js.map +1 -1
- package/build/lazyLoad/svelte/svelte_getFromPageSource.js +16 -0
- package/build/lazyLoad/svelte/svelte_getFromPageSource.js.map +1 -1
- package/build/lazyLoad/svelte/svelte_getVersionJson.js +40 -0
- package/build/lazyLoad/svelte/svelte_getVersionJson.js.map +1 -0
- package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js +3 -2
- package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js.map +1 -1
- package/build/lazyLoad/techDetect/checkAngularJS.js +27 -6
- package/build/lazyLoad/techDetect/checkAngularJS.js.map +1 -1
- package/build/lazyLoad/techDetect/checkNextJS.js +24 -15
- package/build/lazyLoad/techDetect/checkNextJS.js.map +1 -1
- package/build/lazyLoad/techDetect/checkReact.js +8 -0
- package/build/lazyLoad/techDetect/checkReact.js.map +1 -1
- package/build/lazyLoad/techDetect/checkSvelte.js +17 -0
- package/build/lazyLoad/techDetect/checkSvelte.js.map +1 -1
- package/build/lazyLoad/techDetect/index.js +33 -5
- package/build/lazyLoad/techDetect/index.js.map +1 -1
- package/build/lazyLoad/vue/vue_RuntimeJs.js +2 -1
- package/build/lazyLoad/vue/vue_RuntimeJs.js.map +1 -1
- package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js +2 -1
- package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js.map +1 -1
- package/build/lazyLoad/vue/vue_discoverJsFiles.js +59 -25
- package/build/lazyLoad/vue/vue_discoverJsFiles.js.map +1 -1
- package/build/lazyLoad/vue/vue_getClientSidePaths.js +2 -1
- package/build/lazyLoad/vue/vue_getClientSidePaths.js.map +1 -1
- package/build/lazyLoad/vue/vue_jsImports.js +2 -1
- package/build/lazyLoad/vue/vue_jsImports.js.map +1 -1
- package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js +2 -2
- package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js.map +1 -1
- package/build/lazyLoad/vue/vue_viteMapDeps.js +62 -54
- package/build/lazyLoad/vue/vue_viteMapDeps.js.map +1 -1
- package/build/map/angular_js/getAngularConnections.js +88 -0
- package/build/map/angular_js/getAngularConnections.js.map +1 -0
- package/build/map/angular_js/interactive.js +4 -0
- package/build/map/angular_js/interactive.js.map +1 -0
- package/build/map/graphql/resolveGraphql.js +2 -1
- package/build/map/graphql/resolveGraphql.js.map +1 -1
- package/build/map/index.js +38 -0
- package/build/map/index.js.map +1 -1
- package/build/map/next_js/getExports.js +2 -1
- package/build/map/next_js/getExports.js.map +1 -1
- package/build/map/next_js/getFetchInstances.js +2 -1
- package/build/map/next_js/getFetchInstances.js.map +1 -1
- package/build/map/next_js/getTurbopackConnections.js +2 -1
- package/build/map/next_js/getTurbopackConnections.js.map +1 -1
- package/build/map/next_js/getWebpackConnections.js +2 -1
- package/build/map/next_js/getWebpackConnections.js.map +1 -1
- package/build/map/next_js/resolveAxios.js +2 -1
- package/build/map/next_js/resolveAxios.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/directCallsWithoutAssignment.js +2 -1
- package/build/map/next_js/resolveAxiosHelpers/directCallsWithoutAssignment.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/findAxiosInstance.js +2 -1
- package/build/map/next_js/resolveAxiosHelpers/findAxiosInstance.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js +2 -1
- package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/handleAxiosCreate.js +2 -1
- package/build/map/next_js/resolveAxiosHelpers/handleAxiosCreate.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/handleZDotCreate.js +2 -1
- package/build/map/next_js/resolveAxiosHelpers/handleZDotCreate.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/interceptorHeaders.js +2 -1
- package/build/map/next_js/resolveAxiosHelpers/interceptorHeaders.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/processExportedEndpoints.js +2 -1
- package/build/map/next_js/resolveAxiosHelpers/processExportedEndpoints.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/traceAxiosInstanceExports.js +2 -1
- package/build/map/next_js/resolveAxiosHelpers/traceAxiosInstanceExports.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/traceBody.js +2 -1
- package/build/map/next_js/resolveAxiosHelpers/traceBody.js.map +1 -1
- package/build/map/next_js/resolveFetch.js +2 -1
- package/build/map/next_js/resolveFetch.js.map +1 -1
- package/build/map/next_js/resolveNewRequest.js +2 -1
- package/build/map/next_js/resolveNewRequest.js.map +1 -1
- package/build/map/next_js/resolveServerActions.js +2 -1
- package/build/map/next_js/resolveServerActions.js.map +1 -1
- package/build/map/next_js/utils.js +2 -1
- package/build/map/next_js/utils.js.map +1 -1
- package/build/map/react_js/getReactConnections.js +5 -4
- package/build/map/react_js/getReactConnections.js.map +1 -1
- package/build/map/vue_js/crossFileResolver.js +3 -2
- package/build/map/vue_js/crossFileResolver.js.map +1 -1
- package/build/map/vue_js/getViteConnections.js +5 -4
- package/build/map/vue_js/getViteConnections.js.map +1 -1
- package/build/map/vue_js/taint_utils.js +2 -1
- package/build/map/vue_js/taint_utils.js.map +1 -1
- package/build/map/vue_js/vue_resolveFetch.js +3 -2
- package/build/map/vue_js/vue_resolveFetch.js.map +1 -1
- package/build/map/vue_js/vue_resolveHttpClient.js +5 -3
- package/build/map/vue_js/vue_resolveHttpClient.js.map +1 -1
- package/build/map/vue_js/vue_resolveXhr.js +5 -3
- package/build/map/vue_js/vue_resolveXhr.js.map +1 -1
- package/build/mcp/cli.js.map +1 -1
- package/build/refactor/index.js +973 -27
- package/build/refactor/index.js.map +1 -1
- package/build/refactor/next/helpers.js +395 -0
- package/build/refactor/next/helpers.js.map +1 -0
- package/build/refactor/next/index.js +261 -71
- package/build/refactor/next/index.js.map +1 -1
- package/build/refactor/next/transform.js +1027 -0
- package/build/refactor/next/transform.js.map +1 -0
- package/build/refactor/next/validator.js +119 -0
- package/build/refactor/next/validator.js.map +1 -0
- package/build/refactor/react/helpers.js +106 -0
- package/build/refactor/react/helpers.js.map +1 -0
- package/build/refactor/react/index.js +290 -585
- package/build/refactor/react/index.js.map +1 -1
- package/build/refactor/react/library-classify.js +397 -0
- package/build/refactor/react/library-classify.js.map +1 -0
- package/build/refactor/react/transform.js +1852 -0
- package/build/refactor/react/transform.js.map +1 -0
- package/build/refactor/react/validator.js +123 -0
- package/build/refactor/react/validator.js.map +1 -0
- package/build/refactor/react-vite/index.js +652 -0
- package/build/refactor/react-vite/index.js.map +1 -0
- package/build/refactor/react-vite/vendor-analyze.js +336 -0
- package/build/refactor/react-vite/vendor-analyze.js.map +1 -0
- package/build/refactor/remote/cache.js +250 -0
- package/build/refactor/remote/cache.js.map +1 -0
- package/build/refactor/remote/config.js +63 -0
- package/build/refactor/remote/config.js.map +1 -0
- package/build/refactor/remote/hf-client.js +202 -0
- package/build/refactor/remote/hf-client.js.map +1 -0
- package/build/refactor/remote/version-detect.js +355 -0
- package/build/refactor/remote/version-detect.js.map +1 -0
- package/build/refactor/vue/index.js +176 -0
- package/build/refactor/vue/index.js.map +1 -0
- package/build/refactor/vue/vendor-analyze-vue.js +271 -0
- package/build/refactor/vue/vendor-analyze-vue.js.map +1 -0
- package/build/refactor/vue/vite.js +216 -0
- package/build/refactor/vue/vite.js.map +1 -0
- package/build/report/utility/genHtml.js +15 -4
- package/build/report/utility/genHtml.js.map +1 -1
- package/build/run/bundler-detect.js +154 -0
- package/build/run/bundler-detect.js.map +1 -0
- package/build/run/index.js +208 -16
- package/build/run/index.js.map +1 -1
- package/build/sourcemaps/index.js +89 -0
- package/build/sourcemaps/index.js.map +1 -0
- package/build/strings/index.js +6 -2
- package/build/strings/index.js.map +1 -1
- package/build/strings/trufflehog.js +71 -0
- package/build/strings/trufflehog.js.map +1 -0
- package/build/utility/banner.js +68 -0
- package/build/utility/banner.js.map +1 -0
- package/build/utility/getChromiumPath.js +40 -0
- package/build/utility/getChromiumPath.js.map +1 -0
- package/build/utility/globals.js +7 -0
- package/build/utility/globals.js.map +1 -1
- package/build/utility/makeReq.js +21 -11
- package/build/utility/makeReq.js.map +1 -1
- package/build/utility/postmanGenerator.js +2 -2
- package/build/utility/postmanGenerator.js.map +1 -1
- package/build/utility/puppeteerInstance.js +7 -1
- package/build/utility/puppeteerInstance.js.map +1 -1
- package/package.json +14 -8
- package/scripts/smoke-test.js +74 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/refactor/remote/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import os from "os";
|
|
3
|
+
import path from "path";
|
|
4
|
+
const DEFAULT_CONFIG = {
|
|
5
|
+
maxCacheSizeMb: 512,
|
|
6
|
+
};
|
|
7
|
+
export const getRefactorConfigDir = () => path.join(os.homedir(), ".js-recon", "refactor");
|
|
8
|
+
const getConfigFilePath = () => path.join(getRefactorConfigDir(), "config.json");
|
|
9
|
+
export const loadRefactorConfig = () => {
|
|
10
|
+
const dir = getRefactorConfigDir();
|
|
11
|
+
if (!fs.existsSync(dir))
|
|
12
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
13
|
+
const configPath = getConfigFilePath();
|
|
14
|
+
if (!fs.existsSync(configPath)) {
|
|
15
|
+
fs.writeFileSync(configPath, JSON.stringify(DEFAULT_CONFIG, null, 2));
|
|
16
|
+
return Object.assign({}, DEFAULT_CONFIG);
|
|
17
|
+
}
|
|
18
|
+
let raw;
|
|
19
|
+
try {
|
|
20
|
+
raw = JSON.parse(fs.readFileSync(configPath, "utf8"));
|
|
21
|
+
}
|
|
22
|
+
catch (_a) {
|
|
23
|
+
return Object.assign({}, DEFAULT_CONFIG);
|
|
24
|
+
}
|
|
25
|
+
if (typeof raw !== "object" || raw === null)
|
|
26
|
+
return Object.assign({}, DEFAULT_CONFIG);
|
|
27
|
+
const cfg = raw;
|
|
28
|
+
const maxCacheSizeMb = typeof cfg.maxCacheSizeMb === "number" && cfg.maxCacheSizeMb > 0
|
|
29
|
+
? cfg.maxCacheSizeMb
|
|
30
|
+
: DEFAULT_CONFIG.maxCacheSizeMb;
|
|
31
|
+
const dynamicVersionDetectionScatConfig = Array.isArray(cfg.dynamicVersionDetectionScatConfig) &&
|
|
32
|
+
cfg.dynamicVersionDetectionScatConfig.every((v) => typeof v === "string")
|
|
33
|
+
? cfg.dynamicVersionDetectionScatConfig
|
|
34
|
+
: undefined;
|
|
35
|
+
return { maxCacheSizeMb, dynamicVersionDetectionScatConfig };
|
|
36
|
+
};
|
|
37
|
+
export const saveRefactorConfig = (config) => {
|
|
38
|
+
const dir = getRefactorConfigDir();
|
|
39
|
+
if (!fs.existsSync(dir))
|
|
40
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
41
|
+
fs.writeFileSync(getConfigFilePath(), JSON.stringify(config, null, 2));
|
|
42
|
+
};
|
|
43
|
+
// Clears the cached dynamic version detection scat config, forcing re-selection on next run.
|
|
44
|
+
export const purgeDynamicVersionDetectionScatConfig = () => {
|
|
45
|
+
const cfg = loadRefactorConfig();
|
|
46
|
+
delete cfg.dynamicVersionDetectionScatConfig;
|
|
47
|
+
saveRefactorConfig(cfg);
|
|
48
|
+
};
|
|
49
|
+
// Saves the selected dynamic scat configs to the persistent config file.
|
|
50
|
+
export const saveDynamicVersionDetectionScatConfig = (scatDirs) => {
|
|
51
|
+
const cfg = loadRefactorConfig();
|
|
52
|
+
cfg.dynamicVersionDetectionScatConfig = scatDirs;
|
|
53
|
+
saveRefactorConfig(cfg);
|
|
54
|
+
};
|
|
55
|
+
// Validates config and returns a list of warning strings (empty = valid).
|
|
56
|
+
export const validateRefactorConfig = (config) => {
|
|
57
|
+
const warnings = [];
|
|
58
|
+
if (typeof config.maxCacheSizeMb !== "number" || config.maxCacheSizeMb <= 0) {
|
|
59
|
+
warnings.push(`config.maxCacheSizeMb must be a positive number (got ${config.maxCacheSizeMb})`);
|
|
60
|
+
}
|
|
61
|
+
return warnings;
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/refactor/remote/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
// HuggingFace bucket client for CS-MAST-S signature retrieval.
|
|
2
|
+
// All remote interaction is isolated here so the storage backend can be swapped
|
|
3
|
+
// without touching the rest of the refactor pipeline.
|
|
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
|
+
export const HF_BUCKET = "shriyanss/cs-mast-s-dataset";
|
|
14
|
+
// Maps refactor tech identifier to the HuggingFace bucket path prefix that holds its signatures.
|
|
15
|
+
export const TECH_TO_BRANCH = {
|
|
16
|
+
"react-webpack": "react/webpack/large-0.1.8",
|
|
17
|
+
"react-vite": "react/vite/large-0.1.8",
|
|
18
|
+
"next-webpack": "next/webpack/large-0.1.8",
|
|
19
|
+
};
|
|
20
|
+
// --- URL builders ---
|
|
21
|
+
// Bucket resolve URL: fetches raw file content.
|
|
22
|
+
// The full path (prefix + subpath) is URL-encoded as one component per the bucket API contract.
|
|
23
|
+
export const getHfRawUrl = (prefix, subpath) => {
|
|
24
|
+
const fullPath = encodeURIComponent(`${prefix}/${subpath}`);
|
|
25
|
+
return `https://huggingface.co/buckets/${HF_BUCKET}/resolve/${fullPath}`;
|
|
26
|
+
};
|
|
27
|
+
// Bucket tree URL: lists immediate children of a prefix (non-recursive by default).
|
|
28
|
+
// Returns items whose `path` field is the full path from bucket root.
|
|
29
|
+
export const getHfApiTreeUrl = (prefix) => `https://huggingface.co/api/buckets/${HF_BUCKET}/tree/${encodeURIComponent(prefix)}`;
|
|
30
|
+
// --- Low-level fetch helpers ---
|
|
31
|
+
// Returns the response text, or null on 404 / non-OK responses.
|
|
32
|
+
// Throws on HTTP 429 (rate limit) so callers can surface the error.
|
|
33
|
+
export const fetchText = (url) => __awaiter(void 0, void 0, void 0, function* () {
|
|
34
|
+
let resp;
|
|
35
|
+
try {
|
|
36
|
+
resp = yield fetch(url);
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
if (resp.status === 429)
|
|
42
|
+
throw new Error(`Rate limited by HuggingFace (url: ${url})`);
|
|
43
|
+
if (!resp.ok)
|
|
44
|
+
return null;
|
|
45
|
+
return resp.text();
|
|
46
|
+
});
|
|
47
|
+
// --- Branch metadata ---
|
|
48
|
+
export const getSampleSize = (branch) => __awaiter(void 0, void 0, void 0, function* () {
|
|
49
|
+
const text = yield fetchText(getHfRawUrl(branch, "sample_size"));
|
|
50
|
+
if (text === null)
|
|
51
|
+
throw new Error(`Branch "${branch}": could not fetch sample_size`);
|
|
52
|
+
const n = parseInt(text.trim(), 10);
|
|
53
|
+
if (isNaN(n))
|
|
54
|
+
throw new Error(`Branch "${branch}": sample_size is not a number ("${text.trim()}")`);
|
|
55
|
+
return n;
|
|
56
|
+
});
|
|
57
|
+
export const getTechnology = (branch) => __awaiter(void 0, void 0, void 0, function* () {
|
|
58
|
+
const text = yield fetchText(getHfRawUrl(branch, "technology"));
|
|
59
|
+
if (text === null)
|
|
60
|
+
throw new Error(`Branch "${branch}": could not fetch technology`);
|
|
61
|
+
return text.trim();
|
|
62
|
+
});
|
|
63
|
+
// Validates that the remote branch has the required metadata files.
|
|
64
|
+
// Returns true when valid, false when either file is missing/unreachable.
|
|
65
|
+
export const validateRemoteBranch = (branch) => __awaiter(void 0, void 0, void 0, function* () {
|
|
66
|
+
const [sampleSizeText, technologyText] = yield Promise.all([
|
|
67
|
+
fetchText(getHfRawUrl(branch, "sample_size")),
|
|
68
|
+
fetchText(getHfRawUrl(branch, "technology")),
|
|
69
|
+
]);
|
|
70
|
+
return sampleSizeText !== null && technologyText !== null;
|
|
71
|
+
});
|
|
72
|
+
// Validates that a bucket path exists by checking the tree API returns at least one entry.
|
|
73
|
+
// Use this for user-supplied paths that may not have metadata files.
|
|
74
|
+
export const validateRemotePath = (prefix) => __awaiter(void 0, void 0, void 0, function* () {
|
|
75
|
+
const url = getHfApiTreeUrl(prefix);
|
|
76
|
+
let resp;
|
|
77
|
+
try {
|
|
78
|
+
resp = yield fetch(url);
|
|
79
|
+
}
|
|
80
|
+
catch (_a) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
if (resp.status === 429)
|
|
84
|
+
throw new Error(`Rate limited by HuggingFace (url: ${url})`);
|
|
85
|
+
if (!resp.ok)
|
|
86
|
+
return false;
|
|
87
|
+
try {
|
|
88
|
+
const text = yield resp.text();
|
|
89
|
+
const entries = JSON.parse(text);
|
|
90
|
+
return Array.isArray(entries) && entries.length > 0;
|
|
91
|
+
}
|
|
92
|
+
catch (_b) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
// --- File listing ---
|
|
97
|
+
// Extracts the next-page URL from a `Link: <url>; rel="next"` header, or null if absent.
|
|
98
|
+
const parseNextLink = (linkHeader) => {
|
|
99
|
+
if (!linkHeader)
|
|
100
|
+
return null;
|
|
101
|
+
const match = linkHeader.match(/<([^>]+)>;\s*rel="next"/);
|
|
102
|
+
return match ? match[1] : null;
|
|
103
|
+
};
|
|
104
|
+
// Lists feature subdirectory names immediately under a bucket prefix.
|
|
105
|
+
// The bucket tree API returns a flat list of file entries (no directory-type entries) and
|
|
106
|
+
// paginates at 1000 entries. We follow Link: rel="next" headers to collect all pages, then
|
|
107
|
+
// extract unique first-level path segments from all file paths after stripping the prefix.
|
|
108
|
+
const listTopLevelDirs = (prefix) => __awaiter(void 0, void 0, void 0, function* () {
|
|
109
|
+
const dirs = new Set();
|
|
110
|
+
const prefixSlash = prefix.endsWith("/") ? prefix : `${prefix}/`;
|
|
111
|
+
let url = getHfApiTreeUrl(prefix);
|
|
112
|
+
while (url) {
|
|
113
|
+
let resp;
|
|
114
|
+
try {
|
|
115
|
+
resp = yield fetch(url);
|
|
116
|
+
}
|
|
117
|
+
catch (_a) {
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
if (resp.status === 429)
|
|
121
|
+
throw new Error(`Rate limited by HuggingFace (url: ${url})`);
|
|
122
|
+
if (!resp.ok)
|
|
123
|
+
break;
|
|
124
|
+
const text = yield resp.text();
|
|
125
|
+
try {
|
|
126
|
+
const entries = JSON.parse(text);
|
|
127
|
+
for (const e of entries) {
|
|
128
|
+
const rel = e.path.startsWith(prefixSlash) ? e.path.slice(prefixSlash.length) : e.path;
|
|
129
|
+
const parts = rel.split("/");
|
|
130
|
+
// Only treat as a feature dir if the entry is nested (parts.length > 1),
|
|
131
|
+
// skipping top-level files like sample_size, technology, README.md.
|
|
132
|
+
if (parts.length > 1 && parts[0])
|
|
133
|
+
dirs.add(parts[0]);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch (_b) {
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
url = parseNextLink(resp.headers.get("link"));
|
|
140
|
+
}
|
|
141
|
+
return Array.from(dirs);
|
|
142
|
+
});
|
|
143
|
+
// Returns relative paths of all collisions.json files under `<featureDir>/<scatDir>/collisions.json`
|
|
144
|
+
// for every top-level feature directory in the branch. Does NOT require recursive tree traversal.
|
|
145
|
+
export const listCollisionsFiles = (branch, scatDir) => __awaiter(void 0, void 0, void 0, function* () {
|
|
146
|
+
const featureDirs = yield listTopLevelDirs(branch);
|
|
147
|
+
return featureDirs.map((dir) => `${dir}/${scatDir}/collisions.json`);
|
|
148
|
+
});
|
|
149
|
+
// Returns a map of relative `<feature>/<scatDir>/collisions.json` path -> remote content hash
|
|
150
|
+
// (`xetHash`) for every matching file under a branch. This is the upstream-change detection
|
|
151
|
+
// signal: two calls with different results for the same subpath mean the dataset content
|
|
152
|
+
// changed, regardless of how recently the local cache entry was written. Paginates the same
|
|
153
|
+
// way as `listTopLevelDirs`.
|
|
154
|
+
export const listCollisionsFileHashes = (branch, scatDir) => __awaiter(void 0, void 0, void 0, function* () {
|
|
155
|
+
const hashes = new Map();
|
|
156
|
+
const prefixSlash = branch.endsWith("/") ? branch : `${branch}/`;
|
|
157
|
+
let url = getHfApiTreeUrl(branch);
|
|
158
|
+
while (url) {
|
|
159
|
+
let resp;
|
|
160
|
+
try {
|
|
161
|
+
resp = yield fetch(url);
|
|
162
|
+
}
|
|
163
|
+
catch (_a) {
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
if (resp.status === 429)
|
|
167
|
+
throw new Error(`Rate limited by HuggingFace (url: ${url})`);
|
|
168
|
+
if (!resp.ok)
|
|
169
|
+
break;
|
|
170
|
+
const text = yield resp.text();
|
|
171
|
+
try {
|
|
172
|
+
const entries = JSON.parse(text);
|
|
173
|
+
for (const e of entries) {
|
|
174
|
+
if (e.type !== "file" || !e.xetHash)
|
|
175
|
+
continue;
|
|
176
|
+
if (!e.path.endsWith(`/${scatDir}/collisions.json`))
|
|
177
|
+
continue;
|
|
178
|
+
const rel = e.path.startsWith(prefixSlash) ? e.path.slice(prefixSlash.length) : e.path;
|
|
179
|
+
hashes.set(rel, e.xetHash);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
catch (_b) {
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
url = parseNextLink(resp.headers.get("link"));
|
|
186
|
+
}
|
|
187
|
+
return hashes;
|
|
188
|
+
});
|
|
189
|
+
// Fetches and parses a collisions.json from a raw HF URL.
|
|
190
|
+
// Returns null on 404 / non-OK; throws on rate limit.
|
|
191
|
+
export const fetchCollisionsJson = (url) => __awaiter(void 0, void 0, void 0, function* () {
|
|
192
|
+
const text = yield fetchText(url);
|
|
193
|
+
if (text === null)
|
|
194
|
+
return null;
|
|
195
|
+
try {
|
|
196
|
+
return JSON.parse(text);
|
|
197
|
+
}
|
|
198
|
+
catch (_a) {
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
//# sourceMappingURL=hf-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hf-client.js","sourceRoot":"","sources":["../../../src/refactor/remote/hf-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|