@shriyanss/js-recon 1.3.1-alpha.3 → 1.3.1-beta.1
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 +15 -1
- package/.github/workflows/publish-js-recon.yml +13 -1
- package/CHANGELOG.md +84 -0
- package/CLAUDE.md +104 -11
- package/Dockerfile +16 -2
- package/README.md +4 -0
- package/build/analyze/engine/astEngine.js +57 -29
- package/build/analyze/engine/astEngine.js.map +1 -1
- package/build/analyze/engine/index.js.map +1 -1
- package/build/analyze/helpers/engineHelpers/taintFlow.js +32 -0
- package/build/analyze/helpers/engineHelpers/taintFlow.js.map +1 -1
- package/build/analyze/helpers/initRules.js +9 -0
- package/build/analyze/helpers/initRules.js.map +1 -1
- package/build/analyze/helpers/schemas.js +5 -1
- package/build/analyze/helpers/schemas.js.map +1 -1
- package/build/analyze/index.js +7 -2
- package/build/analyze/index.js.map +1 -1
- package/build/endpoints/next_js/client_mappedJsonFile.js +12 -5
- package/build/endpoints/next_js/client_mappedJsonFile.js.map +1 -1
- package/build/fingerprint/index.js +123 -0
- package/build/fingerprint/index.js.map +1 -0
- package/build/globalConfig.js +1 -1
- package/build/globalConfig.js.map +1 -1
- package/build/index.js +51 -4
- package/build/index.js.map +1 -1
- package/build/lazyLoad/downloadQueue.js +9 -8
- package/build/lazyLoad/downloadQueue.js.map +1 -1
- package/build/lazyLoad/index.js +260 -163
- package/build/lazyLoad/index.js.map +1 -1
- package/build/lazyLoad/next_js/NextJsCrawler.js +58 -16
- package/build/lazyLoad/next_js/NextJsCrawler.js.map +1 -1
- package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js +149 -139
- package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js.map +1 -1
- package/build/lazyLoad/next_js/next_SubsequentRequests.js +25 -4
- package/build/lazyLoad/next_js/next_SubsequentRequests.js.map +1 -1
- package/build/lazyLoad/next_js/next_scriptTagsSubsequentRequests.js +13 -5
- package/build/lazyLoad/next_js/next_scriptTagsSubsequentRequests.js.map +1 -1
- package/build/lazyLoad/react/react_followImports.js +105 -0
- package/build/lazyLoad/react/react_followImports.js.map +1 -0
- package/build/lazyLoad/react/react_getScriptTags.js +28 -5
- package/build/lazyLoad/react/react_getScriptTags.js.map +1 -1
- package/build/lazyLoad/svelte/svelte_discoverPagesFromJs.js +162 -0
- package/build/lazyLoad/svelte/svelte_discoverPagesFromJs.js.map +1 -0
- package/build/lazyLoad/svelte/svelte_getFromPageSource.js +15 -0
- package/build/lazyLoad/svelte/svelte_getFromPageSource.js.map +1 -1
- package/build/lazyLoad/svelte/svelte_recursivePageCrawl.js +180 -0
- package/build/lazyLoad/svelte/svelte_recursivePageCrawl.js.map +1 -0
- package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js +15 -1
- package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js.map +1 -1
- package/build/lazyLoad/techDetect/checkReact.js +67 -36
- package/build/lazyLoad/techDetect/checkReact.js.map +1 -1
- package/build/lazyLoad/techDetect/checkSvelte.js +35 -35
- package/build/lazyLoad/techDetect/checkSvelte.js.map +1 -1
- package/build/lazyLoad/techDetect/index.js +10 -6
- package/build/lazyLoad/techDetect/index.js.map +1 -1
- package/build/lazyLoad/vue/vue_getClientSidePaths.js +6 -0
- package/build/lazyLoad/vue/vue_getClientSidePaths.js.map +1 -1
- package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js +6 -0
- package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js.map +1 -1
- package/build/lazyLoad/vue/vue_stringJsFiles.js +6 -0
- package/build/lazyLoad/vue/vue_stringJsFiles.js.map +1 -1
- package/build/map/graphql/resolveGraphql.js +296 -0
- package/build/map/graphql/resolveGraphql.js.map +1 -0
- package/build/map/index.js +93 -1
- package/build/map/index.js.map +1 -1
- package/build/map/next_js/interactive_helpers/commandHandler.js +4 -0
- package/build/map/next_js/interactive_helpers/commandHandler.js.map +1 -1
- package/build/map/next_js/interactive_helpers/commandHelpers.js +28 -0
- package/build/map/next_js/interactive_helpers/commandHelpers.js.map +1 -1
- package/build/map/next_js/interactive_helpers/helpMenu.js +1 -1
- package/build/map/next_js/interactive_helpers/helpMenu.js.map +1 -1
- package/build/map/next_js/resolveServerActions.js +449 -0
- package/build/map/next_js/resolveServerActions.js.map +1 -0
- package/build/map/next_js/utils.js +1 -0
- package/build/map/next_js/utils.js.map +1 -1
- package/build/map/react_js/getReactConnections.js +298 -0
- package/build/map/react_js/getReactConnections.js.map +1 -0
- package/build/map/react_js/interactive.js +4 -0
- package/build/map/react_js/interactive.js.map +1 -0
- package/build/map/react_js/react_resolveFetch.js +6 -0
- package/build/map/react_js/react_resolveFetch.js.map +1 -0
- package/build/map/svelte_js/interactive.js +58 -0
- package/build/map/svelte_js/interactive.js.map +1 -0
- package/build/map/svelte_js/interactive_helpers/commandHandler.js +4 -0
- package/build/map/svelte_js/interactive_helpers/commandHandler.js.map +1 -0
- package/build/map/vue_js/bodyResolver.js +477 -0
- package/build/map/vue_js/bodyResolver.js.map +1 -0
- package/build/map/vue_js/crossFileResolver.js +438 -0
- package/build/map/vue_js/crossFileResolver.js.map +1 -0
- package/build/map/vue_js/getViteConnections.js +150 -129
- package/build/map/vue_js/getViteConnections.js.map +1 -1
- package/build/map/vue_js/taint_utils.js +621 -0
- package/build/map/vue_js/taint_utils.js.map +1 -0
- package/build/map/vue_js/vue_resolveFetch.js +79 -392
- package/build/map/vue_js/vue_resolveFetch.js.map +1 -1
- package/build/map/vue_js/vue_resolveHttpClient.js +733 -0
- package/build/map/vue_js/vue_resolveHttpClient.js.map +1 -0
- package/build/map/vue_js/vue_resolveXhr.js +279 -0
- package/build/map/vue_js/vue_resolveXhr.js.map +1 -0
- package/build/mcp/chatOneShot.js +101 -0
- package/build/mcp/chatOneShot.js.map +1 -0
- package/build/mcp/claudeCodeCreds.js +150 -0
- package/build/mcp/claudeCodeCreds.js.map +1 -0
- package/build/mcp/cli.js +140 -149
- package/build/mcp/cli.js.map +1 -1
- package/build/mcp/commands.js +80 -0
- package/build/mcp/commands.js.map +1 -1
- package/build/mcp/index.js +30 -9
- package/build/mcp/index.js.map +1 -1
- package/build/mcp/intent.js +204 -0
- package/build/mcp/intent.js.map +1 -0
- package/build/mcp/jobs.js +199 -0
- package/build/mcp/jobs.js.map +1 -0
- package/build/mcp/mcpServer.js +241 -0
- package/build/mcp/mcpServer.js.map +1 -0
- package/build/mcp/providers.js +18 -1
- package/build/mcp/providers.js.map +1 -1
- package/build/mcp/skills.js +115 -0
- package/build/mcp/skills.js.map +1 -0
- package/build/refactor/index.js +6 -0
- package/build/refactor/index.js.map +1 -1
- package/build/refactor/react/index.js +636 -0
- package/build/refactor/react/index.js.map +1 -0
- package/build/run/index.js +260 -60
- package/build/run/index.js.map +1 -1
- package/build/run/interruptHandler.js +93 -0
- package/build/run/interruptHandler.js.map +1 -0
- package/build/utility/globals.js +29 -0
- package/build/utility/globals.js.map +1 -1
- package/build/utility/makeReq.js +14 -2
- package/build/utility/makeReq.js.map +1 -1
- package/build/utility/openapiGenerator.js +46 -14
- package/build/utility/openapiGenerator.js.map +1 -1
- package/build/utility/postmanGenerator.js +62 -13
- package/build/utility/postmanGenerator.js.map +1 -1
- package/build/utility/progressLog.js +50 -0
- package/build/utility/progressLog.js.map +1 -0
- package/package.json +12 -9
|
@@ -0,0 +1,621 @@
|
|
|
1
|
+
import parser from "@babel/parser";
|
|
2
|
+
import _traverse from "@babel/traverse";
|
|
3
|
+
import fs from "fs";
|
|
4
|
+
import { resolveNodeValue, memberChainToString } from "../next_js/utils.js";
|
|
5
|
+
const traverse = _traverse.default;
|
|
6
|
+
const getParamName = (paramNode) => {
|
|
7
|
+
var _a;
|
|
8
|
+
if (!paramNode)
|
|
9
|
+
return null;
|
|
10
|
+
if (paramNode.type === "Identifier")
|
|
11
|
+
return paramNode.name;
|
|
12
|
+
if (paramNode.type === "AssignmentPattern" && ((_a = paramNode.left) === null || _a === void 0 ? void 0 : _a.type) === "Identifier")
|
|
13
|
+
return paramNode.left.name;
|
|
14
|
+
return null;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Pulls out the function binding name from the surrounding declarator /
|
|
18
|
+
* assignment so we can later match callsites by identifier. Handles four
|
|
19
|
+
* common shapes seen in Vite-bundled code:
|
|
20
|
+
* const fn = (arg) => { ... }
|
|
21
|
+
* fn = (arg) => { ... }
|
|
22
|
+
* function fn(arg) { ... }
|
|
23
|
+
* { fn: (arg) => { ... } } // object-literal property value
|
|
24
|
+
*/
|
|
25
|
+
const inferOneEnclosingFn = (fnPath, file) => {
|
|
26
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
27
|
+
const fnNode = fnPath.node;
|
|
28
|
+
const paramNames = ((_a = fnNode.params) !== null && _a !== void 0 ? _a : []).map(getParamName);
|
|
29
|
+
const firstParamName = (_b = paramNames[0]) !== null && _b !== void 0 ? _b : null;
|
|
30
|
+
let bindingName = null;
|
|
31
|
+
if (fnNode.type === "FunctionDeclaration" && ((_c = fnNode.id) === null || _c === void 0 ? void 0 : _c.type) === "Identifier") {
|
|
32
|
+
bindingName = fnNode.id.name;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
const parentNode = (_d = fnPath.parentPath) === null || _d === void 0 ? void 0 : _d.node;
|
|
36
|
+
if (parentNode) {
|
|
37
|
+
if (parentNode.type === "VariableDeclarator" && ((_e = parentNode.id) === null || _e === void 0 ? void 0 : _e.type) === "Identifier") {
|
|
38
|
+
bindingName = parentNode.id.name;
|
|
39
|
+
}
|
|
40
|
+
else if (parentNode.type === "AssignmentExpression" && ((_f = parentNode.left) === null || _f === void 0 ? void 0 : _f.type) === "Identifier") {
|
|
41
|
+
bindingName = parentNode.left.name;
|
|
42
|
+
}
|
|
43
|
+
else if (parentNode.type === "ObjectProperty" &&
|
|
44
|
+
!parentNode.computed &&
|
|
45
|
+
((_g = parentNode.key) === null || _g === void 0 ? void 0 : _g.type) === "Identifier") {
|
|
46
|
+
bindingName = parentNode.key.name;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return { bindingName, firstParamName, paramNames, node: fnNode, file };
|
|
51
|
+
};
|
|
52
|
+
export const inferEnclosingFn = (callPath, file) => {
|
|
53
|
+
let fnPath = callPath.getFunctionParent();
|
|
54
|
+
if (!fnPath)
|
|
55
|
+
return null;
|
|
56
|
+
const innermost = inferOneEnclosingFn(fnPath, file);
|
|
57
|
+
let chainTail = innermost;
|
|
58
|
+
let outerPath = fnPath.getFunctionParent();
|
|
59
|
+
let depth = 0;
|
|
60
|
+
while (outerPath && depth < 6) {
|
|
61
|
+
const outer = inferOneEnclosingFn(outerPath, file);
|
|
62
|
+
chainTail.parent = outer;
|
|
63
|
+
chainTail = outer;
|
|
64
|
+
outerPath = outerPath.getFunctionParent();
|
|
65
|
+
depth++;
|
|
66
|
+
}
|
|
67
|
+
return innermost;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Walks an ObjectExpression and returns the property value node for the given
|
|
71
|
+
* dotted property path (e.g. ["data"] → the value node of `data: ...`).
|
|
72
|
+
*/
|
|
73
|
+
const lookupObjectExpressionProp = (objExpr, propPath) => {
|
|
74
|
+
if (!objExpr || objExpr.type !== "ObjectExpression")
|
|
75
|
+
return null;
|
|
76
|
+
let current = objExpr;
|
|
77
|
+
for (const segment of propPath) {
|
|
78
|
+
if (!current || current.type !== "ObjectExpression")
|
|
79
|
+
return null;
|
|
80
|
+
let next = null;
|
|
81
|
+
for (const prop of current.properties) {
|
|
82
|
+
if (prop.type !== "ObjectProperty")
|
|
83
|
+
continue;
|
|
84
|
+
const key = prop.key.type === "Identifier"
|
|
85
|
+
? prop.key.name
|
|
86
|
+
: prop.key.type === "StringLiteral"
|
|
87
|
+
? prop.key.value
|
|
88
|
+
: null;
|
|
89
|
+
if (key === segment) {
|
|
90
|
+
next = prop.value;
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (!next)
|
|
95
|
+
return null;
|
|
96
|
+
current = next;
|
|
97
|
+
}
|
|
98
|
+
return current;
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* Resolves the value of `paramName.propPath` by walking back through the
|
|
102
|
+
* enclosing function's callers. If a caller's argument is itself an Identifier
|
|
103
|
+
* pointing to a constant initializer, we follow that binding; if it's the
|
|
104
|
+
* caller's own first parameter, we recurse to that function's callers.
|
|
105
|
+
*/
|
|
106
|
+
export const resolveParamProperty = (paramName, propPath, enclosingFn, getCallers, depth = 0) => {
|
|
107
|
+
var _a, _b, _c, _d, _e;
|
|
108
|
+
if (!enclosingFn || depth > 6)
|
|
109
|
+
return null;
|
|
110
|
+
// Walk outward through nested anonymous callbacks until we find the fn
|
|
111
|
+
// that actually declares paramName.
|
|
112
|
+
let fn = enclosingFn;
|
|
113
|
+
while (fn && (!fn.bindingName || !((_a = fn.paramNames) !== null && _a !== void 0 ? _a : []).includes(paramName))) {
|
|
114
|
+
fn = (_b = fn.parent) !== null && _b !== void 0 ? _b : null;
|
|
115
|
+
}
|
|
116
|
+
if (!fn || !fn.bindingName)
|
|
117
|
+
return null;
|
|
118
|
+
const paramIndex = ((_c = fn.paramNames) !== null && _c !== void 0 ? _c : []).indexOf(paramName);
|
|
119
|
+
if (paramIndex < 0)
|
|
120
|
+
return null;
|
|
121
|
+
const callers = getCallers(fn.bindingName, fn.file);
|
|
122
|
+
if (!callers || callers.length === 0)
|
|
123
|
+
return null;
|
|
124
|
+
for (const caller of callers) {
|
|
125
|
+
const arg = caller.args[paramIndex];
|
|
126
|
+
if (!arg)
|
|
127
|
+
continue;
|
|
128
|
+
if (arg.type === "ObjectExpression") {
|
|
129
|
+
const node = lookupObjectExpressionProp(arg, propPath);
|
|
130
|
+
if (node)
|
|
131
|
+
return { node, scope: caller.scope, fileContent: caller.fileContent };
|
|
132
|
+
}
|
|
133
|
+
if (arg.type === "Identifier") {
|
|
134
|
+
const binding = caller.scope.getBinding(arg.name);
|
|
135
|
+
const initNode = (_e = (_d = binding === null || binding === void 0 ? void 0 : binding.path) === null || _d === void 0 ? void 0 : _d.node) === null || _e === void 0 ? void 0 : _e.init;
|
|
136
|
+
if (initNode && initNode.type === "ObjectExpression") {
|
|
137
|
+
const node = lookupObjectExpressionProp(initNode, propPath);
|
|
138
|
+
if (node)
|
|
139
|
+
return { node, scope: caller.scope, fileContent: caller.fileContent };
|
|
140
|
+
}
|
|
141
|
+
if (enclosingFnChainHasParam(caller.enclosingFn, arg.name)) {
|
|
142
|
+
const result = resolveParamProperty(arg.name, propPath, caller.enclosingFn, getCallers, depth + 1);
|
|
143
|
+
if (result)
|
|
144
|
+
return result;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return null;
|
|
149
|
+
};
|
|
150
|
+
const enclosingFnChainHasParam = (fn, name) => {
|
|
151
|
+
var _a, _b;
|
|
152
|
+
let cur = fn;
|
|
153
|
+
while (cur) {
|
|
154
|
+
if (((_a = cur.paramNames) !== null && _a !== void 0 ? _a : []).includes(name))
|
|
155
|
+
return true;
|
|
156
|
+
cur = (_b = cur.parent) !== null && _b !== void 0 ? _b : null;
|
|
157
|
+
}
|
|
158
|
+
return false;
|
|
159
|
+
};
|
|
160
|
+
export const enclosingFnChainHasBinding = (fn) => {
|
|
161
|
+
var _a;
|
|
162
|
+
let cur = fn;
|
|
163
|
+
while (cur) {
|
|
164
|
+
if (cur.bindingName)
|
|
165
|
+
return true;
|
|
166
|
+
cur = (_a = cur.parent) !== null && _a !== void 0 ? _a : null;
|
|
167
|
+
}
|
|
168
|
+
return false;
|
|
169
|
+
};
|
|
170
|
+
/**
|
|
171
|
+
* Resolves [param:P] where P is the first param of enclosingFn — returns
|
|
172
|
+
* the direct string value passed by the caller (not a property of it).
|
|
173
|
+
*/
|
|
174
|
+
const resolveFirstArg = (paramName, enclosingFn, getCallers, depth = 0) => {
|
|
175
|
+
var _a, _b, _c, _d, _e;
|
|
176
|
+
if (depth > 4)
|
|
177
|
+
return null;
|
|
178
|
+
let fn = enclosingFn;
|
|
179
|
+
while (fn && (!fn.bindingName || !((_a = fn.paramNames) !== null && _a !== void 0 ? _a : []).includes(paramName))) {
|
|
180
|
+
fn = (_b = fn.parent) !== null && _b !== void 0 ? _b : null;
|
|
181
|
+
}
|
|
182
|
+
if (!fn || !fn.bindingName)
|
|
183
|
+
return null;
|
|
184
|
+
const paramIndex = ((_c = fn.paramNames) !== null && _c !== void 0 ? _c : []).indexOf(paramName);
|
|
185
|
+
if (paramIndex < 0)
|
|
186
|
+
return null;
|
|
187
|
+
const callers = getCallers(fn.bindingName, fn.file);
|
|
188
|
+
for (const caller of callers) {
|
|
189
|
+
const arg = caller.args[paramIndex];
|
|
190
|
+
if (!arg)
|
|
191
|
+
continue;
|
|
192
|
+
const resolved = resolveNodeValue(arg, caller.scope, "", "fetch", caller.fileContent);
|
|
193
|
+
if (typeof resolved === "string" && !resolved.startsWith("[") && resolved.length > 0) {
|
|
194
|
+
return resolved;
|
|
195
|
+
}
|
|
196
|
+
if (arg.type === "Identifier") {
|
|
197
|
+
const binding = caller.scope.getBinding(arg.name);
|
|
198
|
+
const initNode = (_e = (_d = binding === null || binding === void 0 ? void 0 : binding.path) === null || _d === void 0 ? void 0 : _d.node) === null || _e === void 0 ? void 0 : _e.init;
|
|
199
|
+
if (initNode) {
|
|
200
|
+
const initResolved = resolveNodeValue(initNode, caller.scope, "", "fetch", caller.fileContent);
|
|
201
|
+
if (typeof initResolved === "string" && !initResolved.startsWith("[") && initResolved.length > 0) {
|
|
202
|
+
return initResolved;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (caller.enclosingFn && enclosingFnChainHasParam(caller.enclosingFn, arg.name)) {
|
|
206
|
+
const r = resolveFirstArg(arg.name, caller.enclosingFn, getCallers, depth + 1);
|
|
207
|
+
if (r)
|
|
208
|
+
return r;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return null;
|
|
213
|
+
};
|
|
214
|
+
/**
|
|
215
|
+
* Renders an ObjectExpression as a `k1={k1}&k2={k2}` query-string fragment.
|
|
216
|
+
*/
|
|
217
|
+
const renderObjectAsQuery = (objExpr, scope, fileContent) => {
|
|
218
|
+
if (!objExpr || objExpr.type !== "ObjectExpression")
|
|
219
|
+
return null;
|
|
220
|
+
const parts = [];
|
|
221
|
+
for (const prop of objExpr.properties) {
|
|
222
|
+
if (prop.type !== "ObjectProperty")
|
|
223
|
+
continue;
|
|
224
|
+
const key = prop.key.type === "Identifier" ? prop.key.name : prop.key.type === "StringLiteral" ? prop.key.value : null;
|
|
225
|
+
if (!key)
|
|
226
|
+
continue;
|
|
227
|
+
let valStr;
|
|
228
|
+
try {
|
|
229
|
+
const resolved = resolveNodeValue(prop.value, scope, "", "fetch", fileContent);
|
|
230
|
+
if (resolved !== null && resolved !== undefined && !String(resolved).startsWith("[")) {
|
|
231
|
+
valStr = encodeURIComponent(String(resolved));
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
valStr = `{${key}}`;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
catch (_a) {
|
|
238
|
+
valStr = `{${key}}`;
|
|
239
|
+
}
|
|
240
|
+
parts.push(`${key}=${valStr}`);
|
|
241
|
+
}
|
|
242
|
+
return parts.length > 0 ? parts.join("&") : null;
|
|
243
|
+
};
|
|
244
|
+
/**
|
|
245
|
+
* Returns a plain object derived from an ObjectExpression's properties.
|
|
246
|
+
* Spread elements are merged when they themselves resolve to a literal object;
|
|
247
|
+
* otherwise the spread is preserved as a sentinel key.
|
|
248
|
+
*/
|
|
249
|
+
export const renderObjectExpression = (objExpr, scope, fileContent) => {
|
|
250
|
+
if (!objExpr || objExpr.type !== "ObjectExpression")
|
|
251
|
+
return null;
|
|
252
|
+
const out = {};
|
|
253
|
+
for (const prop of objExpr.properties) {
|
|
254
|
+
if (prop.type === "ObjectProperty") {
|
|
255
|
+
const key = prop.key.type === "Identifier"
|
|
256
|
+
? prop.key.name
|
|
257
|
+
: prop.key.type === "StringLiteral"
|
|
258
|
+
? prop.key.value
|
|
259
|
+
: null;
|
|
260
|
+
if (!key)
|
|
261
|
+
continue;
|
|
262
|
+
try {
|
|
263
|
+
const resolved = resolveNodeValue(prop.value, scope, "", "fetch", fileContent);
|
|
264
|
+
out[key] = resolved === undefined || resolved === null ? "" : String(resolved);
|
|
265
|
+
}
|
|
266
|
+
catch (_a) {
|
|
267
|
+
out[key] = "";
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
else if (prop.type === "SpreadElement") {
|
|
271
|
+
try {
|
|
272
|
+
const resolved = resolveNodeValue(prop.argument, scope, "", "fetch", fileContent);
|
|
273
|
+
if (resolved && typeof resolved === "object") {
|
|
274
|
+
for (const [k, v] of Object.entries(resolved)) {
|
|
275
|
+
if (!(k in out))
|
|
276
|
+
out[k] = v === undefined || v === null ? "" : String(v);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
const chain = memberChainToString(prop.argument);
|
|
281
|
+
out[`...${chain !== null && chain !== void 0 ? chain : "spread"}`] = "<spread>";
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
catch (_b) {
|
|
285
|
+
const chain = memberChainToString(prop.argument);
|
|
286
|
+
out[`...${chain !== null && chain !== void 0 ? chain : "spread"}`] = "<spread>";
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return out;
|
|
291
|
+
};
|
|
292
|
+
export const renderValueNode = (node, scope, fileContent) => {
|
|
293
|
+
if (!node)
|
|
294
|
+
return null;
|
|
295
|
+
try {
|
|
296
|
+
const resolved = resolveNodeValue(node, scope, "", "fetch", fileContent);
|
|
297
|
+
if (resolved === null || resolved === undefined)
|
|
298
|
+
return null;
|
|
299
|
+
if (typeof resolved === "object")
|
|
300
|
+
return null;
|
|
301
|
+
const s = String(resolved);
|
|
302
|
+
if (s.startsWith("[unresolved"))
|
|
303
|
+
return null;
|
|
304
|
+
return s;
|
|
305
|
+
}
|
|
306
|
+
catch (_a) {
|
|
307
|
+
return null;
|
|
308
|
+
}
|
|
309
|
+
};
|
|
310
|
+
/**
|
|
311
|
+
* Substitutes [member:P.X], [urlsearchparams:P.X], and [param:P] markers in a
|
|
312
|
+
* string by walking back to the enclosing function's caller(s).
|
|
313
|
+
*/
|
|
314
|
+
export const substituteCallerPlaceholders = (input, enclosingFn, getCallers) => {
|
|
315
|
+
if (!input || !enclosingFn)
|
|
316
|
+
return input;
|
|
317
|
+
let output = input;
|
|
318
|
+
output = output.replace(/\[urlsearchparams:([A-Za-z_$][\w$.]*)\]/g, (match, chain) => {
|
|
319
|
+
const parts = chain.split(".");
|
|
320
|
+
const paramName = parts[0];
|
|
321
|
+
const propPath = parts.slice(1);
|
|
322
|
+
const resolved = resolveParamProperty(paramName, propPath, enclosingFn, getCallers);
|
|
323
|
+
if (!resolved)
|
|
324
|
+
return match;
|
|
325
|
+
const rendered = renderObjectAsQuery(resolved.node, resolved.scope, resolved.fileContent);
|
|
326
|
+
return rendered !== null && rendered !== void 0 ? rendered : match;
|
|
327
|
+
});
|
|
328
|
+
output = output.replace(/\[member:([A-Za-z_$][\w$.]*)\]/g, (match, chain) => {
|
|
329
|
+
const parts = chain.split(".");
|
|
330
|
+
const paramName = parts[0];
|
|
331
|
+
const propPath = parts.slice(1);
|
|
332
|
+
const resolved = resolveParamProperty(paramName, propPath, enclosingFn, getCallers);
|
|
333
|
+
if (!resolved)
|
|
334
|
+
return match;
|
|
335
|
+
const rendered = renderValueNode(resolved.node, resolved.scope, resolved.fileContent);
|
|
336
|
+
return rendered !== null && rendered !== void 0 ? rendered : match;
|
|
337
|
+
});
|
|
338
|
+
// [param:P] — the URL/value IS the function parameter directly (not a property of it)
|
|
339
|
+
output = output.replace(/\[param:([A-Za-z_$][\w$]*)\]/g, (match, paramName) => {
|
|
340
|
+
const resolved = resolveFirstArg(paramName, enclosingFn, getCallers);
|
|
341
|
+
return resolved !== null && resolved !== void 0 ? resolved : match;
|
|
342
|
+
});
|
|
343
|
+
return output;
|
|
344
|
+
};
|
|
345
|
+
/**
|
|
346
|
+
* Substitutes placeholders in a header bag. `...P.X: <spread>` entries are
|
|
347
|
+
* expanded when the corresponding caller-side value is a literal object.
|
|
348
|
+
*/
|
|
349
|
+
export const substituteCallerHeaders = (headers, enclosingFn, getCallers) => {
|
|
350
|
+
if (!enclosingFn)
|
|
351
|
+
return headers;
|
|
352
|
+
const out = {};
|
|
353
|
+
for (const [k, v] of Object.entries(headers)) {
|
|
354
|
+
if (k.startsWith("...") && v === "<spread>") {
|
|
355
|
+
const chain = k.slice(3);
|
|
356
|
+
const parts = chain.split(".");
|
|
357
|
+
const paramName = parts[0];
|
|
358
|
+
const propPath = parts.slice(1);
|
|
359
|
+
const resolved = resolveParamProperty(paramName, propPath, enclosingFn, getCallers);
|
|
360
|
+
if (resolved && resolved.node.type === "ObjectExpression") {
|
|
361
|
+
const obj = renderObjectExpression(resolved.node, resolved.scope, resolved.fileContent);
|
|
362
|
+
if (obj) {
|
|
363
|
+
for (const [hk, hv] of Object.entries(obj)) {
|
|
364
|
+
if (!(hk in out))
|
|
365
|
+
out[hk] = hv;
|
|
366
|
+
}
|
|
367
|
+
continue;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
out[k] = v;
|
|
371
|
+
}
|
|
372
|
+
else {
|
|
373
|
+
out[k] = substituteCallerPlaceholders(v, enclosingFn, getCallers);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
return out;
|
|
377
|
+
};
|
|
378
|
+
/**
|
|
379
|
+
* Returns a getCallers function that searches the given file paths for call
|
|
380
|
+
* sites of a named binding. Files are parsed on demand with a text pre-filter;
|
|
381
|
+
* no ASTs are cached, so CallerInfo objects are only alive during the caller's
|
|
382
|
+
* resolution pass and are then released to GC.
|
|
383
|
+
*
|
|
384
|
+
* Binding names with length ≤ 2 are skipped — they are minifier locals that
|
|
385
|
+
* match too many call sites to be useful.
|
|
386
|
+
*/
|
|
387
|
+
/**
|
|
388
|
+
* Builds a binding→alias map by scanning every file for export-style object
|
|
389
|
+
* literals that rebind a function under a more meaningful key. Three patterns
|
|
390
|
+
* are recognized — they cover the common webpack/Vite output shapes:
|
|
391
|
+
*
|
|
392
|
+
* { aliasName: localBinding } // direct re-export
|
|
393
|
+
* { aliasName: () => localBinding } // webpack `a.d(b, {…})` getter export
|
|
394
|
+
* { aliasName: function () { return localBinding(arguments…) } } // wrapper
|
|
395
|
+
*
|
|
396
|
+
* Each alias is recorded both ways so getCallers can look up callsites either
|
|
397
|
+
* by the local binding or by the externally-visible export name. Computed
|
|
398
|
+
* only once and cached on first access.
|
|
399
|
+
*/
|
|
400
|
+
const buildAliasMap = (filePaths) => {
|
|
401
|
+
// file -> bindingName -> set of aliases observed in that file
|
|
402
|
+
const aliasesByFile = new Map();
|
|
403
|
+
const addAlias = (file, binding, alias) => {
|
|
404
|
+
if (!binding || !alias || binding === alias)
|
|
405
|
+
return;
|
|
406
|
+
let perFile = aliasesByFile.get(file);
|
|
407
|
+
if (!perFile) {
|
|
408
|
+
perFile = new Map();
|
|
409
|
+
aliasesByFile.set(file, perFile);
|
|
410
|
+
}
|
|
411
|
+
let set = perFile.get(binding);
|
|
412
|
+
if (!set) {
|
|
413
|
+
set = new Set();
|
|
414
|
+
perFile.set(binding, set);
|
|
415
|
+
}
|
|
416
|
+
set.add(alias);
|
|
417
|
+
};
|
|
418
|
+
for (const filePath of filePaths) {
|
|
419
|
+
let fileContent;
|
|
420
|
+
try {
|
|
421
|
+
fileContent = fs.readFileSync(filePath, "utf-8");
|
|
422
|
+
}
|
|
423
|
+
catch (_a) {
|
|
424
|
+
continue;
|
|
425
|
+
}
|
|
426
|
+
let fileAst;
|
|
427
|
+
try {
|
|
428
|
+
fileAst = parser.parse(fileContent, {
|
|
429
|
+
sourceType: "unambiguous",
|
|
430
|
+
plugins: ["jsx", "typescript"],
|
|
431
|
+
errorRecovery: true,
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
catch (_b) {
|
|
435
|
+
continue;
|
|
436
|
+
}
|
|
437
|
+
traverse(fileAst, {
|
|
438
|
+
ObjectProperty(propPath) {
|
|
439
|
+
const node = propPath.node;
|
|
440
|
+
if (node.computed)
|
|
441
|
+
return;
|
|
442
|
+
const key = node.key.type === "Identifier"
|
|
443
|
+
? node.key.name
|
|
444
|
+
: node.key.type === "StringLiteral"
|
|
445
|
+
? node.key.value
|
|
446
|
+
: null;
|
|
447
|
+
if (!key)
|
|
448
|
+
return;
|
|
449
|
+
const val = node.value;
|
|
450
|
+
if (val.type === "Identifier") {
|
|
451
|
+
addAlias(filePath, val.name, key);
|
|
452
|
+
}
|
|
453
|
+
else if (val.type === "ArrowFunctionExpression" &&
|
|
454
|
+
val.params.length === 0 &&
|
|
455
|
+
val.body.type === "Identifier") {
|
|
456
|
+
// `key: () => Binding` (webpack getter export)
|
|
457
|
+
addAlias(filePath, val.body.name, key);
|
|
458
|
+
}
|
|
459
|
+
},
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
return aliasesByFile;
|
|
463
|
+
};
|
|
464
|
+
const loadFileCached = (filePath, cache) => {
|
|
465
|
+
var _a;
|
|
466
|
+
if (cache.has(filePath))
|
|
467
|
+
return (_a = cache.get(filePath)) !== null && _a !== void 0 ? _a : null;
|
|
468
|
+
let content;
|
|
469
|
+
try {
|
|
470
|
+
content = fs.readFileSync(filePath, "utf-8");
|
|
471
|
+
}
|
|
472
|
+
catch (_b) {
|
|
473
|
+
cache.set(filePath, null);
|
|
474
|
+
return null;
|
|
475
|
+
}
|
|
476
|
+
let ast = null;
|
|
477
|
+
try {
|
|
478
|
+
ast = parser.parse(content, {
|
|
479
|
+
sourceType: "unambiguous",
|
|
480
|
+
plugins: ["jsx", "typescript"],
|
|
481
|
+
errorRecovery: true,
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
catch (_c) {
|
|
485
|
+
ast = null;
|
|
486
|
+
}
|
|
487
|
+
const entry = { content, ast };
|
|
488
|
+
cache.set(filePath, entry);
|
|
489
|
+
return entry;
|
|
490
|
+
};
|
|
491
|
+
export const makeGetCallers = (filePaths, maxCallers = 128) => {
|
|
492
|
+
let aliasMap = null;
|
|
493
|
+
const fileCache = new Map();
|
|
494
|
+
return (bindingName, sourceFile) => {
|
|
495
|
+
var _a;
|
|
496
|
+
if (!bindingName)
|
|
497
|
+
return [];
|
|
498
|
+
if (aliasMap === null)
|
|
499
|
+
aliasMap = buildAliasMap(filePaths);
|
|
500
|
+
// Use only the aliases defined in the file where `bindingName` lives;
|
|
501
|
+
// otherwise minifier name collisions across modules (`Se` may name
|
|
502
|
+
// different functions in different files) pollute the alias set.
|
|
503
|
+
const aliases = (sourceFile && ((_a = aliasMap.get(sourceFile)) === null || _a === void 0 ? void 0 : _a.get(bindingName))) || new Set();
|
|
504
|
+
// Only match by names that are long enough to be distinctive. Short
|
|
505
|
+
// minifier locals (≤ 2 chars) alone match too many sites; longer
|
|
506
|
+
// alias names — usually the exported function names — are safe.
|
|
507
|
+
const candidates = new Set([bindingName, ...aliases].filter((n) => n.length > 2));
|
|
508
|
+
if (candidates.size === 0)
|
|
509
|
+
return [];
|
|
510
|
+
const needles = Array.from(candidates).map((n) => `${n}(`);
|
|
511
|
+
const out = [];
|
|
512
|
+
let overflowed = false;
|
|
513
|
+
for (const filePath of filePaths) {
|
|
514
|
+
if (overflowed)
|
|
515
|
+
break;
|
|
516
|
+
const cached = loadFileCached(filePath, fileCache);
|
|
517
|
+
if (!cached)
|
|
518
|
+
continue;
|
|
519
|
+
const fileContent = cached.content;
|
|
520
|
+
if (!needles.some((n) => fileContent.includes(n)))
|
|
521
|
+
continue;
|
|
522
|
+
const fileAst = cached.ast;
|
|
523
|
+
if (!fileAst)
|
|
524
|
+
continue;
|
|
525
|
+
traverse(fileAst, {
|
|
526
|
+
CallExpression(callPath) {
|
|
527
|
+
if (overflowed) {
|
|
528
|
+
callPath.stop();
|
|
529
|
+
return;
|
|
530
|
+
}
|
|
531
|
+
const callee = callPath.node.callee;
|
|
532
|
+
const isDirect = callee.type === "Identifier" && candidates.has(callee.name);
|
|
533
|
+
// Registry-style exports re-bind functions onto an object
|
|
534
|
+
// (e.g. `const ae = { request: Me }; ae.request(...)`), so we
|
|
535
|
+
// accept member-expression callsites where the property name
|
|
536
|
+
// matches the binding (or one of its aliases) too.
|
|
537
|
+
const isMember = callee.type === "MemberExpression" &&
|
|
538
|
+
!callee.computed &&
|
|
539
|
+
callee.property.type === "Identifier" &&
|
|
540
|
+
candidates.has(callee.property.name);
|
|
541
|
+
if (!isDirect && !isMember)
|
|
542
|
+
return;
|
|
543
|
+
if (out.length >= maxCallers) {
|
|
544
|
+
overflowed = true;
|
|
545
|
+
callPath.stop();
|
|
546
|
+
return;
|
|
547
|
+
}
|
|
548
|
+
out.push({
|
|
549
|
+
file: filePath,
|
|
550
|
+
fileContent,
|
|
551
|
+
callNode: callPath.node,
|
|
552
|
+
scope: callPath.scope,
|
|
553
|
+
args: callPath.node.arguments,
|
|
554
|
+
enclosingFn: inferEnclosingFn(callPath, filePath),
|
|
555
|
+
});
|
|
556
|
+
},
|
|
557
|
+
});
|
|
558
|
+
}
|
|
559
|
+
// On overflow keep the callers we already collected: the alias map is
|
|
560
|
+
// file-scoped so an oversized result usually reflects a genuinely
|
|
561
|
+
// popular wrapper, and partial coverage beats none.
|
|
562
|
+
return out;
|
|
563
|
+
};
|
|
564
|
+
};
|
|
565
|
+
/**
|
|
566
|
+
* Like makeGetCallers but searches only the source file and does NOT filter by
|
|
567
|
+
* name length. Used as a fallback for body-param resolution when the binding is
|
|
568
|
+
* a short minifier local (e.g. `O`) and the caller in the same file uses the
|
|
569
|
+
* raw name rather than an exported alias.
|
|
570
|
+
*
|
|
571
|
+
* Never call this for URL fan-out — the short-name matches are file-scoped and
|
|
572
|
+
* won't flood cross-file call graphs.
|
|
573
|
+
*/
|
|
574
|
+
export const makeGetCallersSameFile = () => {
|
|
575
|
+
return (bindingName, sourceFile) => {
|
|
576
|
+
if (!bindingName || !sourceFile)
|
|
577
|
+
return [];
|
|
578
|
+
let fileContent;
|
|
579
|
+
try {
|
|
580
|
+
fileContent = fs.readFileSync(sourceFile, "utf-8");
|
|
581
|
+
}
|
|
582
|
+
catch (_a) {
|
|
583
|
+
return [];
|
|
584
|
+
}
|
|
585
|
+
if (!fileContent.includes(`${bindingName}(`))
|
|
586
|
+
return [];
|
|
587
|
+
let fileAst;
|
|
588
|
+
try {
|
|
589
|
+
fileAst = parser.parse(fileContent, {
|
|
590
|
+
sourceType: "unambiguous",
|
|
591
|
+
plugins: ["jsx", "typescript"],
|
|
592
|
+
errorRecovery: true,
|
|
593
|
+
});
|
|
594
|
+
}
|
|
595
|
+
catch (_b) {
|
|
596
|
+
return [];
|
|
597
|
+
}
|
|
598
|
+
const out = [];
|
|
599
|
+
traverse(fileAst, {
|
|
600
|
+
CallExpression(callPath) {
|
|
601
|
+
const callee = callPath.node.callee;
|
|
602
|
+
if (callee.type !== "Identifier" || callee.name !== bindingName)
|
|
603
|
+
return;
|
|
604
|
+
if (out.length >= 32) {
|
|
605
|
+
callPath.stop();
|
|
606
|
+
return;
|
|
607
|
+
}
|
|
608
|
+
out.push({
|
|
609
|
+
file: sourceFile,
|
|
610
|
+
fileContent,
|
|
611
|
+
callNode: callPath.node,
|
|
612
|
+
scope: callPath.scope,
|
|
613
|
+
args: callPath.node.arguments,
|
|
614
|
+
enclosingFn: inferEnclosingFn(callPath, sourceFile),
|
|
615
|
+
});
|
|
616
|
+
},
|
|
617
|
+
});
|
|
618
|
+
return out;
|
|
619
|
+
};
|
|
620
|
+
};
|
|
621
|
+
//# sourceMappingURL=taint_utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taint_utils.js","sourceRoot":"","sources":["../../../src/map/vue_js/taint_utils.ts"],"names":[],"mappings":"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"}
|