@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.
- package/.github/workflows/build-and-prettify.yaml +187 -1
- package/.github/workflows/promote-js-recon.yml +116 -0
- package/.github/workflows/publish-js-recon.yml +7 -114
- package/.github/workflows/rules-smoke-test.yaml +79 -0
- package/CHANGELOG.md +46 -0
- package/CLAUDE.md +208 -14
- package/Dockerfile.release +29 -0
- package/README.md +18 -17
- 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/schemas.js +5 -1
- 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/completion/index.js +432 -0
- package/build/completion/index.js.map +1 -0
- package/build/cs_mast/index.js +94 -3
- package/build/cs_mast/index.js.map +1 -1
- 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 +1 -1
- package/build/index.js +67 -6
- 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 +56 -7
- package/build/lazyLoad/downloadLoadedJsUtil.js.map +1 -1
- package/build/lazyLoad/downloadQueue.js +9 -8
- package/build/lazyLoad/downloadQueue.js.map +1 -1
- package/build/lazyLoad/index.js +28 -1
- package/build/lazyLoad/index.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 +63 -15
- 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_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 +12 -9
- 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_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/checkReact.js +8 -0
- package/build/lazyLoad/techDetect/checkReact.js.map +1 -1
- package/build/lazyLoad/techDetect/index.js +23 -2
- 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 +22 -10
- 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_viteMapDeps.js +62 -54
- package/build/lazyLoad/vue/vue_viteMapDeps.js.map +1 -1
- package/build/map/angular_js/getAngularConnections.js +1 -1
- package/build/map/angular_js/getAngularConnections.js.map +1 -1
- package/build/map/graphql/resolveGraphql.js +2 -1
- package/build/map/graphql/resolveGraphql.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 +3 -2
- package/build/map/vue_js/vue_resolveHttpClient.js.map +1 -1
- package/build/map/vue_js/vue_resolveXhr.js +3 -2
- package/build/map/vue_js/vue_resolveXhr.js.map +1 -1
- package/build/refactor/index.js +399 -60
- package/build/refactor/index.js.map +1 -1
- package/build/refactor/next/helpers.js +194 -13
- package/build/refactor/next/helpers.js.map +1 -1
- package/build/refactor/next/index.js +223 -36
- package/build/refactor/next/index.js.map +1 -1
- package/build/refactor/next/transform.js +905 -55
- package/build/refactor/next/transform.js.map +1 -1
- package/build/refactor/react/index.js +3 -3
- package/build/refactor/react/index.js.map +1 -1
- package/build/refactor/react/transform.js +2 -1
- package/build/refactor/react/transform.js.map +1 -1
- package/build/refactor/react/validator.js +2 -1
- package/build/refactor/react/validator.js.map +1 -1
- package/build/refactor/react-vite/index.js +39 -5
- package/build/refactor/react-vite/index.js.map +1 -1
- package/build/refactor/react-vite/vendor-analyze.js +3 -3
- package/build/refactor/react-vite/vendor-analyze.js.map +1 -1
- package/build/refactor/remote/config.js +17 -1
- package/build/refactor/remote/config.js.map +1 -1
- package/build/refactor/remote/hf-client.js +27 -2
- package/build/refactor/remote/hf-client.js.map +1 -1
- 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 +14 -3
- package/build/report/utility/genHtml.js.map +1 -1
- package/build/run/bundler-detect.js +140 -0
- package/build/run/bundler-detect.js.map +1 -0
- package/build/run/index.js +91 -5
- package/build/run/index.js.map +1 -1
- 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/makeReq.js +10 -9
- 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 +9 -5
- package/scripts/smoke-test.js +74 -0
|
@@ -7,12 +7,132 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
+
var _a;
|
|
10
11
|
import makeRequest from "../../utility/makeReq.js";
|
|
11
12
|
import chalk from "chalk";
|
|
12
13
|
import _traverse from "@babel/traverse";
|
|
13
14
|
import parser from "@babel/parser";
|
|
14
15
|
import execFunc from "../../utility/runSandboxed.js";
|
|
15
|
-
const traverse = _traverse.default;
|
|
16
|
+
const traverse = ((_a = _traverse.default) !== null && _a !== void 0 ? _a : _traverse);
|
|
17
|
+
/**
|
|
18
|
+
* Pure parser: extracts `[chunkId, chunkName]` entries from webpack's
|
|
19
|
+
* FunctionExpression object-map pattern:
|
|
20
|
+
* function(e) { return ({123: "name", ...}[e] || e) + ".js"; }
|
|
21
|
+
* Returns entries from the first qualifying object map (≥ 3 numeric-keyed string entries).
|
|
22
|
+
*/
|
|
23
|
+
export const extractObjectMapChunkEntries = (jsContent) => {
|
|
24
|
+
const result = [];
|
|
25
|
+
let ast;
|
|
26
|
+
try {
|
|
27
|
+
ast = parser.parse(jsContent, {
|
|
28
|
+
sourceType: "unambiguous",
|
|
29
|
+
plugins: ["jsx", "typescript"],
|
|
30
|
+
errorRecovery: true,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
catch (_a) {
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
traverse(ast, {
|
|
37
|
+
FunctionExpression(path) {
|
|
38
|
+
var _a, _b;
|
|
39
|
+
const start = (_a = path.node.start) !== null && _a !== void 0 ? _a : 0;
|
|
40
|
+
const end = (_b = path.node.end) !== null && _b !== void 0 ? _b : jsContent.length;
|
|
41
|
+
const source = jsContent.slice(start, end);
|
|
42
|
+
if (!source.match(/\|\|\s*e/) || !source.includes('".js"'))
|
|
43
|
+
return;
|
|
44
|
+
path.traverse({
|
|
45
|
+
ObjectExpression(objPath) {
|
|
46
|
+
const props = objPath.node.properties;
|
|
47
|
+
if (props.length < 3)
|
|
48
|
+
return;
|
|
49
|
+
const entries = [];
|
|
50
|
+
for (const prop of props) {
|
|
51
|
+
if (prop.type !== "ObjectProperty")
|
|
52
|
+
continue;
|
|
53
|
+
const key = prop.key;
|
|
54
|
+
const value = prop.value;
|
|
55
|
+
if (value.type !== "StringLiteral")
|
|
56
|
+
continue;
|
|
57
|
+
let keyNum = null;
|
|
58
|
+
if (key.type === "NumericLiteral")
|
|
59
|
+
keyNum = key.value;
|
|
60
|
+
else if (key.type === "StringLiteral" && /^\d+$/.test(key.value))
|
|
61
|
+
keyNum = parseInt(key.value);
|
|
62
|
+
else if (key.type === "Identifier" && /^\d+$/.test(key.name))
|
|
63
|
+
keyNum = parseInt(key.name);
|
|
64
|
+
if (keyNum === null)
|
|
65
|
+
continue;
|
|
66
|
+
entries.push([keyNum, value.value]);
|
|
67
|
+
}
|
|
68
|
+
if (entries.length >= 3) {
|
|
69
|
+
result.push(...entries);
|
|
70
|
+
objPath.stop();
|
|
71
|
+
path.stop();
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
return result;
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Pure parser: extracts chunk filenames from webpack's ArrowFunctionExpression
|
|
81
|
+
* if-chain pattern:
|
|
82
|
+
* (e) => { if (123 === e) return "name.js"; if (456 === e) return "other.js"; ... }
|
|
83
|
+
* Returns filenames only when there are at least 3 qualifying if-statements.
|
|
84
|
+
*/
|
|
85
|
+
export const extractIfChainChunkFilenames = (jsContent) => {
|
|
86
|
+
const result = [];
|
|
87
|
+
let ast;
|
|
88
|
+
try {
|
|
89
|
+
ast = parser.parse(jsContent, {
|
|
90
|
+
sourceType: "unambiguous",
|
|
91
|
+
plugins: ["jsx", "typescript"],
|
|
92
|
+
errorRecovery: true,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
catch (_a) {
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
traverse(ast, {
|
|
99
|
+
ArrowFunctionExpression(path) {
|
|
100
|
+
var _a, _b;
|
|
101
|
+
const body = path.node.body;
|
|
102
|
+
if (body.type !== "BlockStatement")
|
|
103
|
+
return;
|
|
104
|
+
// skip expression-body arrows (handled by execFunc path)
|
|
105
|
+
const start = (_a = path.node.start) !== null && _a !== void 0 ? _a : 0;
|
|
106
|
+
const end = (_b = path.node.end) !== null && _b !== void 0 ? _b : jsContent.length;
|
|
107
|
+
const source = jsContent.slice(start, end);
|
|
108
|
+
if (source.match(/"\.js".{0,15}$/))
|
|
109
|
+
return;
|
|
110
|
+
const filenames = [];
|
|
111
|
+
for (const stmt of body.body) {
|
|
112
|
+
if (stmt.type !== "IfStatement")
|
|
113
|
+
continue;
|
|
114
|
+
const test = stmt.test;
|
|
115
|
+
if (test.type !== "BinaryExpression" || test.operator !== "===")
|
|
116
|
+
continue;
|
|
117
|
+
const { left, right } = test;
|
|
118
|
+
const isNumericEqParam = (left.type === "NumericLiteral" && right.type === "Identifier") ||
|
|
119
|
+
(right.type === "NumericLiteral" && left.type === "Identifier");
|
|
120
|
+
if (!isNumericEqParam)
|
|
121
|
+
continue;
|
|
122
|
+
const consequent = stmt.consequent;
|
|
123
|
+
if (consequent.type !== "ReturnStatement" || !consequent.argument)
|
|
124
|
+
continue;
|
|
125
|
+
const arg = consequent.argument;
|
|
126
|
+
if (arg.type !== "StringLiteral" || !arg.value.endsWith(".js"))
|
|
127
|
+
continue;
|
|
128
|
+
filenames.push(arg.value);
|
|
129
|
+
}
|
|
130
|
+
if (filenames.length >= 3)
|
|
131
|
+
result.push(...filenames);
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
return result;
|
|
135
|
+
};
|
|
16
136
|
// url param kept for API consistency with other react_* functions
|
|
17
137
|
const react_webpackChunkPaths = (_url, maxJsSizeMb, jsFiles) => __awaiter(void 0, void 0, void 0, function* () {
|
|
18
138
|
let toReturn = [];
|
|
@@ -21,7 +141,6 @@ const react_webpackChunkPaths = (_url, maxJsSizeMb, jsFiles) => __awaiter(void 0
|
|
|
21
141
|
const req = yield makeRequest(jsFile);
|
|
22
142
|
if (!req || req.status !== 200)
|
|
23
143
|
continue;
|
|
24
|
-
// check content-length before downloading body
|
|
25
144
|
const contentLength = req.headers.get("content-length");
|
|
26
145
|
if (contentLength && parseInt(contentLength) > maxJsSizeMb * 1024 * 1024) {
|
|
27
146
|
console.error(chalk.yellow(`[!] Skipping ${jsFile} (too large)`));
|
|
@@ -32,143 +151,76 @@ const react_webpackChunkPaths = (_url, maxJsSizeMb, jsFiles) => __awaiter(void 0
|
|
|
32
151
|
console.error(chalk.yellow(`[!] Skipping ${jsFile} (too large)`));
|
|
33
152
|
continue;
|
|
34
153
|
}
|
|
154
|
+
// pattern 3: FunctionExpression with object map
|
|
155
|
+
const objectMapEntries = extractObjectMapChunkEntries(jsContent);
|
|
156
|
+
if (objectMapEntries.length > 0) {
|
|
157
|
+
console.log(chalk.green(`[✓] Found webpack object-map chunk path builder in ${jsFile}`));
|
|
158
|
+
for (const [, chunkName] of objectMapEntries) {
|
|
159
|
+
try {
|
|
160
|
+
const finalUrl = new URL("../" + chunkName + ".js", jsFile).href;
|
|
161
|
+
toReturn.push(finalUrl);
|
|
162
|
+
}
|
|
163
|
+
catch (_a) {
|
|
164
|
+
// skip filenames that fail URL resolution
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// pattern 2: ArrowFunctionExpression if-chain
|
|
169
|
+
const ifChainFilenames = extractIfChainChunkFilenames(jsContent);
|
|
170
|
+
if (ifChainFilenames.length > 0) {
|
|
171
|
+
console.log(chalk.green(`[✓] Found webpack if-chain chunk path builder in ${jsFile}`));
|
|
172
|
+
for (const filename of ifChainFilenames) {
|
|
173
|
+
try {
|
|
174
|
+
const output = filename.startsWith("/") ||
|
|
175
|
+
filename.startsWith("http") ||
|
|
176
|
+
filename.startsWith("./") ||
|
|
177
|
+
filename.startsWith("../")
|
|
178
|
+
? filename
|
|
179
|
+
: "../" + filename;
|
|
180
|
+
const finalUrl = new URL(output, jsFile).href;
|
|
181
|
+
toReturn.push(finalUrl);
|
|
182
|
+
}
|
|
183
|
+
catch (_b) {
|
|
184
|
+
// skip filenames that fail URL resolution
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// pattern 1: ArrowFunctionExpression expression body via execFunc
|
|
35
189
|
const ast = parser.parse(jsContent, {
|
|
36
190
|
sourceType: "unambiguous",
|
|
37
191
|
plugins: ["jsx", "typescript"],
|
|
38
192
|
errorRecovery: true,
|
|
39
193
|
});
|
|
40
|
-
// find arrow functions that look like webpack chunk path builders:
|
|
41
|
-
// pattern 1: x.x = (e) => "prefix/" + ({...}[e] || e) + "." + {...}[e] + ".js"
|
|
42
|
-
// pattern 2: x.x = (e) => { if (N === e) return "file.js"; ... }
|
|
43
|
-
// pattern 3: x.x = function(e) { return ({N: "name", ...}[e] || e) + ".js"; }
|
|
44
194
|
traverse(ast, {
|
|
45
|
-
FunctionExpression(path) {
|
|
46
|
-
var _a, _b;
|
|
47
|
-
const start = (_a = path.node.start) !== null && _a !== void 0 ? _a : 0;
|
|
48
|
-
const end = (_b = path.node.end) !== null && _b !== void 0 ? _b : jsContent.length;
|
|
49
|
-
const source = jsContent.slice(start, end);
|
|
50
|
-
if (!source.match(/\|\|\s*e/) || !source.includes('".js"'))
|
|
51
|
-
return;
|
|
52
|
-
const chunkMap = [];
|
|
53
|
-
path.traverse({
|
|
54
|
-
ObjectExpression(objPath) {
|
|
55
|
-
const props = objPath.node.properties;
|
|
56
|
-
if (props.length < 3)
|
|
57
|
-
return;
|
|
58
|
-
const entries = [];
|
|
59
|
-
for (const prop of props) {
|
|
60
|
-
if (prop.type !== "ObjectProperty")
|
|
61
|
-
continue;
|
|
62
|
-
const key = prop.key;
|
|
63
|
-
const value = prop.value;
|
|
64
|
-
if (value.type !== "StringLiteral")
|
|
65
|
-
continue;
|
|
66
|
-
let keyNum = null;
|
|
67
|
-
if (key.type === "NumericLiteral")
|
|
68
|
-
keyNum = key.value;
|
|
69
|
-
else if (key.type === "StringLiteral" && /^\d+$/.test(key.value))
|
|
70
|
-
keyNum = parseInt(key.value);
|
|
71
|
-
else if (key.type === "Identifier" && /^\d+$/.test(key.name))
|
|
72
|
-
keyNum = parseInt(key.name);
|
|
73
|
-
if (keyNum === null)
|
|
74
|
-
continue;
|
|
75
|
-
entries.push([keyNum, value.value]);
|
|
76
|
-
}
|
|
77
|
-
if (entries.length >= 3) {
|
|
78
|
-
chunkMap.push(...entries);
|
|
79
|
-
objPath.stop();
|
|
80
|
-
}
|
|
81
|
-
},
|
|
82
|
-
});
|
|
83
|
-
if (chunkMap.length === 0)
|
|
84
|
-
return;
|
|
85
|
-
console.log(chalk.green(`[✓] Found webpack object-map chunk path builder in ${jsFile}`));
|
|
86
|
-
console.log(chalk.yellow(source.slice(0, 200) + (source.length > 200 ? "..." : "")));
|
|
87
|
-
for (const [, chunkName] of chunkMap) {
|
|
88
|
-
try {
|
|
89
|
-
const output = "../" + chunkName + ".js";
|
|
90
|
-
const finalUrl = new URL(output, jsFile).href;
|
|
91
|
-
toReturn.push(finalUrl);
|
|
92
|
-
}
|
|
93
|
-
catch (_c) {
|
|
94
|
-
// skip filenames that fail URL resolution
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
},
|
|
98
195
|
ArrowFunctionExpression(path) {
|
|
99
196
|
var _a, _b;
|
|
100
197
|
const start = (_a = path.node.start) !== null && _a !== void 0 ? _a : 0;
|
|
101
198
|
const end = (_b = path.node.end) !== null && _b !== void 0 ? _b : jsContent.length;
|
|
102
199
|
const source = jsContent.slice(start, end);
|
|
103
|
-
if (source.match(/"\.js".{0,15}$/))
|
|
104
|
-
// pattern 1: expression body returning computed path
|
|
105
|
-
console.log(chalk.green(`[✓] Found webpack chunk path builder in ${jsFile}`));
|
|
106
|
-
console.log(chalk.yellow(source.slice(0, 200) + (source.length > 200 ? "..." : "")));
|
|
107
|
-
const urlBuilderFunc = `(() => (${source}))()`;
|
|
108
|
-
const integers = source.match(/\d+/g);
|
|
109
|
-
if (!integers)
|
|
110
|
-
return;
|
|
111
|
-
for (const i of integers) {
|
|
112
|
-
try {
|
|
113
|
-
let output = execFunc(urlBuilderFunc, parseInt(i));
|
|
114
|
-
if (typeof output !== "string" || output.includes("undefined"))
|
|
115
|
-
continue;
|
|
116
|
-
if (!(output.startsWith("/") ||
|
|
117
|
-
output.startsWith("http") ||
|
|
118
|
-
output.startsWith("./") ||
|
|
119
|
-
output.startsWith("../"))) {
|
|
120
|
-
output = "../" + output;
|
|
121
|
-
}
|
|
122
|
-
const finalUrl = new URL(output, jsFile).href;
|
|
123
|
-
toReturn.push(finalUrl);
|
|
124
|
-
}
|
|
125
|
-
catch (_c) {
|
|
126
|
-
// skip integers that cause errors in sandboxed execution
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
// pattern 2: block body with if-chain of literal filename returns
|
|
132
|
-
const body = path.node.body;
|
|
133
|
-
if (body.type !== "BlockStatement")
|
|
200
|
+
if (!source.match(/"\.js".{0,15}$/))
|
|
134
201
|
return;
|
|
135
|
-
|
|
136
|
-
for (const stmt of body.body) {
|
|
137
|
-
if (stmt.type !== "IfStatement")
|
|
138
|
-
continue;
|
|
139
|
-
const test = stmt.test;
|
|
140
|
-
if (test.type !== "BinaryExpression" || test.operator !== "===")
|
|
141
|
-
continue;
|
|
142
|
-
const { left, right } = test;
|
|
143
|
-
const isNumericEqParam = (left.type === "NumericLiteral" && right.type === "Identifier") ||
|
|
144
|
-
(right.type === "NumericLiteral" && left.type === "Identifier");
|
|
145
|
-
if (!isNumericEqParam)
|
|
146
|
-
continue;
|
|
147
|
-
const consequent = stmt.consequent;
|
|
148
|
-
if (consequent.type !== "ReturnStatement" || !consequent.argument)
|
|
149
|
-
continue;
|
|
150
|
-
const arg = consequent.argument;
|
|
151
|
-
if (arg.type !== "StringLiteral" || !arg.value.endsWith(".js"))
|
|
152
|
-
continue;
|
|
153
|
-
filenames.push(arg.value);
|
|
154
|
-
}
|
|
155
|
-
if (filenames.length < 3)
|
|
156
|
-
return;
|
|
157
|
-
console.log(chalk.green(`[✓] Found webpack if-chain chunk path builder in ${jsFile}`));
|
|
202
|
+
console.log(chalk.green(`[✓] Found webpack chunk path builder in ${jsFile}`));
|
|
158
203
|
console.log(chalk.yellow(source.slice(0, 200) + (source.length > 200 ? "..." : "")));
|
|
159
|
-
|
|
204
|
+
const urlBuilderFunc = `(() => (${source}))()`;
|
|
205
|
+
const integers = source.match(/\d+/g);
|
|
206
|
+
if (!integers)
|
|
207
|
+
return;
|
|
208
|
+
for (const i of integers) {
|
|
160
209
|
try {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
210
|
+
let output = execFunc(urlBuilderFunc, parseInt(i));
|
|
211
|
+
if (typeof output !== "string" || output.includes("undefined"))
|
|
212
|
+
continue;
|
|
213
|
+
if (!(output.startsWith("/") ||
|
|
214
|
+
output.startsWith("http") ||
|
|
215
|
+
output.startsWith("./") ||
|
|
216
|
+
output.startsWith("../"))) {
|
|
217
|
+
output = "../" + output;
|
|
218
|
+
}
|
|
167
219
|
const finalUrl = new URL(output, jsFile).href;
|
|
168
220
|
toReturn.push(finalUrl);
|
|
169
221
|
}
|
|
170
|
-
catch (
|
|
171
|
-
// skip
|
|
222
|
+
catch (_c) {
|
|
223
|
+
// skip integers that cause errors in sandboxed execution
|
|
172
224
|
}
|
|
173
225
|
}
|
|
174
226
|
},
|
|
@@ -181,7 +233,7 @@ const react_webpackChunkPaths = (_url, maxJsSizeMb, jsFiles) => __awaiter(void 0
|
|
|
181
233
|
if (toReturn.length > 0) {
|
|
182
234
|
console.log(chalk.green(`[✓] Found ${toReturn.length} webpack chunk JS files`));
|
|
183
235
|
}
|
|
184
|
-
toReturn = [...new Set(toReturn)];
|
|
236
|
+
toReturn = [...new Set(toReturn)];
|
|
185
237
|
return toReturn;
|
|
186
238
|
});
|
|
187
239
|
export default react_webpackChunkPaths;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react_webpackChunkPaths.js","sourceRoot":"","sources":["../../../src/lazyLoad/react/react_webpackChunkPaths.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"react_webpackChunkPaths.js","sourceRoot":"","sources":["../../../src/lazyLoad/react/react_webpackChunkPaths.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
+
var _a;
|
|
10
11
|
import chalk from "chalk";
|
|
11
12
|
import makeRequest from "../../utility/makeReq.js";
|
|
12
13
|
import { getJsUrls, pushToJsUrls } from "../globals.js";
|
|
@@ -14,7 +15,7 @@ import resolvePath from "../../utility/resolvePath.js";
|
|
|
14
15
|
// for parsing
|
|
15
16
|
import parser from "@babel/parser";
|
|
16
17
|
import _traverse from "@babel/traverse";
|
|
17
|
-
const traverse = _traverse.default;
|
|
18
|
+
const traverse = ((_a = _traverse.default) !== null && _a !== void 0 ? _a : _traverse);
|
|
18
19
|
let analyzedFiles = [];
|
|
19
20
|
let filesFound = [];
|
|
20
21
|
let mapFilesFound = [];
|
|
@@ -26,7 +27,7 @@ let mapFilesFound = [];
|
|
|
26
27
|
* @returns {Promise<FoundJsFiles>} - A promise that resolves to an object containing
|
|
27
28
|
* all the strings that end with ".js".
|
|
28
29
|
*/
|
|
29
|
-
const parseJSFileContent = (content) => __awaiter(void 0, void 0, void 0, function* () {
|
|
30
|
+
export const parseJSFileContent = (content) => __awaiter(void 0, void 0, void 0, function* () {
|
|
30
31
|
try {
|
|
31
32
|
const ast = parser.parse(content, {
|
|
32
33
|
sourceType: "module",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"svelte_stringAnalysisJSFiles.js","sourceRoot":"","sources":["../../../src/lazyLoad/svelte/svelte_stringAnalysisJSFiles.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"svelte_stringAnalysisJSFiles.js","sourceRoot":"","sources":["../../../src/lazyLoad/svelte/svelte_stringAnalysisJSFiles.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,19 +11,40 @@ import makeRequest from "../../utility/makeReq.js";
|
|
|
11
11
|
const checkAngularJS = ($, url) => __awaiter(void 0, void 0, void 0, function* () {
|
|
12
12
|
let detected = false;
|
|
13
13
|
let evidence = "";
|
|
14
|
-
//
|
|
14
|
+
// Fast path: HTML-level Angular signals that require no extra network request.
|
|
15
|
+
// data-beasties-container is added by Angular's Beasties SSR/prerendering package.
|
|
16
|
+
if ($("html[data-beasties-container]").length > 0) {
|
|
17
|
+
return { detected: true, evidence: "data-beasties-container" };
|
|
18
|
+
}
|
|
19
|
+
// ng-version is set by the Angular runtime on the root component element after
|
|
20
|
+
// bootstrapping. Present only in the Puppeteer-rendered DOM, not raw static HTML.
|
|
21
|
+
const ngVersionEl = $("[ng-version]");
|
|
22
|
+
if (ngVersionEl.length > 0) {
|
|
23
|
+
const ver = ngVersionEl.attr("ng-version");
|
|
24
|
+
return { detected: true, evidence: `ng-version="${ver}"` };
|
|
25
|
+
}
|
|
26
|
+
// Angular view encapsulation adds _nghost-* attributes to host elements.
|
|
27
|
+
// This is reliable for rendered pages (Puppeteer) but absent in raw HTML.
|
|
28
|
+
const ngHostEl = $("[class]").filter((_, el) => {
|
|
29
|
+
const cls = $(el).attr("class") || "";
|
|
30
|
+
return /_nghost-/.test(cls);
|
|
31
|
+
});
|
|
32
|
+
if (ngHostEl.length > 0) {
|
|
33
|
+
return { detected: true, evidence: "_nghost-* view encapsulation attribute" };
|
|
34
|
+
}
|
|
35
|
+
// Second pass: look for main.js or main-HASH.js in script src and check its content
|
|
36
|
+
// for Angular runtime patterns. Matches both production (hashed) and development builds.
|
|
15
37
|
let hasMainJs = false;
|
|
16
38
|
let mainJsURL = undefined;
|
|
17
39
|
$("script").each((_, el) => {
|
|
18
|
-
const tag = $(el).get(0).tagName;
|
|
19
40
|
const attribs = el.attribs;
|
|
20
41
|
if (attribs) {
|
|
21
42
|
for (const [attrName, attrValue] of Object.entries(attribs)) {
|
|
22
43
|
if (attrName === "src") {
|
|
23
44
|
// @ts-ignore
|
|
24
|
-
|
|
45
|
+
// Match main.js (dev builds) and main-HASH.js (production builds)
|
|
46
|
+
if (/(?:^|\/)main(-[a-zA-Z0-9]+)?\.js(\?.*)?$/.test(attrValue)) {
|
|
25
47
|
hasMainJs = true;
|
|
26
|
-
// if the url starts with `main-...`, then build the full url
|
|
27
48
|
if (!attrValue.startsWith("http")) {
|
|
28
49
|
mainJsURL = new URL(attrValue, url).href;
|
|
29
50
|
}
|
|
@@ -41,11 +62,11 @@ const checkAngularJS = ($, url) => __awaiter(void 0, void 0, void 0, function* (
|
|
|
41
62
|
const mainJsBody = yield mainJsRes.text();
|
|
42
63
|
// check if the traces of angular js are present
|
|
43
64
|
// using regex for this, as this is simple and fast
|
|
44
|
-
//
|
|
45
|
-
// if lazyload enabled, need to check routerlink: `["routerLink",`
|
|
65
|
+
// Zone.js patterns (present in Zone.js-based Angular apps)
|
|
46
66
|
const isAngularZoneRegex = /isAngularZone\(\)/;
|
|
47
67
|
const isAngularZoneRegex2 = /"isAngularZone"/;
|
|
48
68
|
const ngZoneRegex = /this\.ngZone/;
|
|
69
|
+
// Angular router pattern
|
|
49
70
|
const routerLinkRegex = /"routerLink"/;
|
|
50
71
|
if (isAngularZoneRegex.test(mainJsBody)) {
|
|
51
72
|
detected = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkAngularJS.js","sourceRoot":"","sources":["../../../src/lazyLoad/techDetect/checkAngularJS.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,WAAW,MAAM,0BAA0B,CAAC;AAEnD,MAAM,cAAc,GAAG,CAAO,CAAqB,EAAE,GAAW,EAAE,EAAE;IAChE,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,QAAQ,GAAG,EAAE,CAAC;IAElB,
|
|
1
|
+
{"version":3,"file":"checkAngularJS.js","sourceRoot":"","sources":["../../../src/lazyLoad/techDetect/checkAngularJS.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,10 @@ const REACT_MARKERS = [
|
|
|
14
14
|
"react-jsx-runtime.production",
|
|
15
15
|
"react-dom.production",
|
|
16
16
|
"__reactRouterVersion",
|
|
17
|
+
// Vite React plugin dev-mode HMR runtime — present in the inline <script> block
|
|
18
|
+
// that @vitejs/plugin-react / plugin-react-swc injects into every dev-served page.
|
|
19
|
+
"@react-refresh",
|
|
20
|
+
"injectIntoGlobalHook",
|
|
17
21
|
];
|
|
18
22
|
const matchesReact = (body) => {
|
|
19
23
|
for (const marker of REACT_MARKERS) {
|
|
@@ -36,6 +40,10 @@ const fetchAndCheck = (src, url) => __awaiter(void 0, void 0, void 0, function*
|
|
|
36
40
|
if (/react/i.test(filename)) {
|
|
37
41
|
return `React-named file referenced: ${src}`;
|
|
38
42
|
}
|
|
43
|
+
// Fast path: Vite React plugin dev-mode HMR endpoint (/@react-refresh)
|
|
44
|
+
if (resolvedUrl.includes("/@react-refresh")) {
|
|
45
|
+
return `Vite React dev HMR endpoint referenced: ${src}`;
|
|
46
|
+
}
|
|
39
47
|
const res = yield makeRequest(resolvedUrl, {});
|
|
40
48
|
if (!res)
|
|
41
49
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkReact.js","sourceRoot":"","sources":["../../../src/lazyLoad/techDetect/checkReact.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"checkReact.js","sourceRoot":"","sources":["../../../src/lazyLoad/techDetect/checkReact.ts"],"names":[],"mappings":"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"}
|
|
@@ -62,19 +62,36 @@ const frameworkDetect = (url) => __awaiter(void 0, void 0, void 0, function* ()
|
|
|
62
62
|
});
|
|
63
63
|
const page = yield browser.newPage();
|
|
64
64
|
page.setDefaultNavigationTimeout(30000);
|
|
65
|
+
const cdp = yield page.createCDPSession();
|
|
66
|
+
yield cdp.send("Page.setDownloadBehavior", { behavior: "deny" });
|
|
65
67
|
// Intercept all requests so framework-specific URL patterns (e.g. /_nuxt/, /_next/)
|
|
66
68
|
// can be used as a detection signal even when they don't appear in parsed HTML.
|
|
67
69
|
yield page.setRequestInterception(true);
|
|
68
70
|
page.on("request", (req) => {
|
|
69
71
|
interceptedUrls.push(req.url());
|
|
70
|
-
|
|
72
|
+
// Abort non-http/s schemes (mailto:, data:, etc.) — continue() throws for them.
|
|
73
|
+
if (/^https?:\/\//i.test(req.url())) {
|
|
74
|
+
req.continue().catch(() => { });
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
req.abort().catch(() => { });
|
|
78
|
+
}
|
|
71
79
|
});
|
|
72
80
|
try {
|
|
73
81
|
yield page.goto(url, {
|
|
74
82
|
waitUntil: "load",
|
|
75
83
|
timeout: 30000,
|
|
76
84
|
});
|
|
77
|
-
//
|
|
85
|
+
// If no framework URL was intercepted yet, we may have landed on a
|
|
86
|
+
// bot-challenge page (e.g. Vercel's challenge.v2.min.js) that fires
|
|
87
|
+
// its own load event before JS-redirecting to the real app. Wait for
|
|
88
|
+
// that redirect navigation; on sites with no redirect this times out
|
|
89
|
+
// quickly and we continue with what we have.
|
|
90
|
+
const hasFrameworkSignal = interceptedUrls.some((u) => u.includes("/_next/") || u.includes("/_nuxt/") || u.includes("/_app/immutable/"));
|
|
91
|
+
if (!hasFrameworkSignal) {
|
|
92
|
+
yield page.waitForNavigation({ waitUntil: "load", timeout: 5000 }).catch(() => { });
|
|
93
|
+
}
|
|
94
|
+
// Give client-side frameworks a brief window to settle
|
|
78
95
|
yield new Promise((resolve) => setTimeout(resolve, 2000));
|
|
79
96
|
pageSource = yield page.content();
|
|
80
97
|
}
|
|
@@ -161,6 +178,10 @@ const frameworkDetect = (url) => __awaiter(void 0, void 0, void 0, function* ()
|
|
|
161
178
|
if (interceptedUrl.includes("/_app/immutable/")) {
|
|
162
179
|
return { name: "svelte", evidence: `intercepted request: ${interceptedUrl}` };
|
|
163
180
|
}
|
|
181
|
+
// Vite React plugin dev-mode HMR runtime — requested by every Vite/React dev server.
|
|
182
|
+
if (interceptedUrl.includes("/@react-refresh")) {
|
|
183
|
+
return { name: "react", evidence: `intercepted request: ${interceptedUrl}` };
|
|
184
|
+
}
|
|
164
185
|
}
|
|
165
186
|
return null;
|
|
166
187
|
});
|