@shriyanss/js-recon 1.3.1-alpha.2 → 1.3.1-alpha.4
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/pr_checker.yml +9 -8
- package/.github/workflows/publish-js-recon.yml +13 -1
- package/CHANGELOG.md +96 -0
- package/CLAUDE.md +225 -0
- package/README.md +2 -0
- package/build/analyze/engine/astEngine.js +57 -29
- package/build/analyze/engine/astEngine.js.map +1 -1
- package/build/analyze/engine/index.js +2 -2
- 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 +6 -1
- package/build/analyze/helpers/schemas.js.map +1 -1
- package/build/analyze/helpers/validate.js +49 -9
- package/build/analyze/helpers/validate.js.map +1 -1
- package/build/analyze/index.js +10 -4
- 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/index.js +72 -5
- package/build/index.js.map +1 -1
- package/build/lazyLoad/downloadFilesUtil.js +3 -3
- package/build/lazyLoad/downloadFilesUtil.js.map +1 -1
- package/build/lazyLoad/downloadQueue.js +16 -11
- 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_GetJSScript.js +8 -4
- package/build/lazyLoad/next_js/next_GetJSScript.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 +31 -25
- 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/load/index.js +316 -0
- package/build/load/index.js.map +1 -0
- package/build/map/graphql/resolveGraphql.js +296 -0
- package/build/map/graphql/resolveGraphql.js.map +1 -0
- package/build/map/index.js +104 -6
- package/build/map/index.js.map +1 -1
- package/build/map/next_js/interactive.js +30 -0
- package/build/map/next_js/interactive.js.map +1 -1
- package/build/map/next_js/interactive_helpers/commandHandler.js +26 -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/esqueryGen.js +370 -0
- package/build/map/next_js/interactive_helpers/esqueryGen.js.map +1 -0
- package/build/map/next_js/interactive_helpers/helpMenu.js +2 -1
- package/build/map/next_js/interactive_helpers/helpMenu.js.map +1 -1
- package/build/map/next_js/interactive_helpers/inputPatch.js +207 -0
- package/build/map/next_js/interactive_helpers/inputPatch.js.map +1 -0
- package/build/map/next_js/interactive_helpers/ui.js +0 -1
- package/build/map/next_js/interactive_helpers/ui.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 +89 -2
- 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 +151 -106
- package/build/map/vue_js/getViteConnections.js.map +1 -1
- package/build/map/vue_js/interactive.js +28 -0
- package/build/map/vue_js/interactive.js.map +1 -1
- package/build/map/vue_js/interactive_helpers/commandHandler.js +22 -0
- package/build/map/vue_js/interactive_helpers/commandHandler.js.map +1 -1
- package/build/map/vue_js/interactive_helpers/helpMenu.js +1 -0
- package/build/map/vue_js/interactive_helpers/helpMenu.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 +279 -25
- 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/report/utility/populateDb/populateAnalysisFindings.js +1 -1
- package/build/report/utility/populateDb/populateAnalysisFindings.js.map +1 -1
- package/build/run/index.js +277 -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 +38 -0
- package/build/utility/globals.js.map +1 -1
- package/build/utility/makeReq.js +39 -5
- package/build/utility/makeReq.js.map +1 -1
- package/build/utility/openapiGenerator.js +61 -17
- package/build/utility/openapiGenerator.js.map +1 -1
- package/build/utility/postmanGenerator.js +69 -16
- 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 +7 -4
|
@@ -14,7 +14,83 @@ import fs from "fs";
|
|
|
14
14
|
import path from "path";
|
|
15
15
|
import { resolveNodeValue, substituteVariablesInString } from "../next_js/utils.js";
|
|
16
16
|
import * as globals from "../../utility/globals.js";
|
|
17
|
+
import { inferEnclosingFn, substituteCallerPlaceholders, substituteCallerHeaders, makeGetCallers, } from "./taint_utils.js";
|
|
18
|
+
import { deepSubstituteBodyValue } from "./bodyResolver.js";
|
|
17
19
|
const traverse = _traverse.default;
|
|
20
|
+
/**
|
|
21
|
+
* Checks whether invoking the given function body would directly execute a
|
|
22
|
+
* `fetch(...)` call (as a bare Identifier callee). Used to recognise functions
|
|
23
|
+
* that wrap the native fetch API so destructured aliases of those wrappers can
|
|
24
|
+
* be resolved as fetch calls.
|
|
25
|
+
*
|
|
26
|
+
* The walk stops at nested function boundaries so a factory function that
|
|
27
|
+
* RETURNS a fetch-wrapping arrow isn't itself classified as a wrapper — only
|
|
28
|
+
* the arrow it returns is.
|
|
29
|
+
*/
|
|
30
|
+
const NESTED_FN_TYPES = new Set(["ArrowFunctionExpression", "FunctionExpression", "FunctionDeclaration"]);
|
|
31
|
+
/**
|
|
32
|
+
* A function is treated as a "transparent" fetch wrapper only if its first
|
|
33
|
+
* argument is forwarded as-is to fetch as the URL. Wrappers that construct the
|
|
34
|
+
* URL from a property of their input object have a different calling convention
|
|
35
|
+
* than `fetch(url, options)` — treating callsites of those as fetch calls
|
|
36
|
+
* produces garbage URLs. So we require that fetch's first arg is the function's
|
|
37
|
+
* first param (an Identifier match).
|
|
38
|
+
*/
|
|
39
|
+
const bodyCallsFetch = (functionNode) => {
|
|
40
|
+
var _a;
|
|
41
|
+
if (!functionNode || typeof functionNode !== "object")
|
|
42
|
+
return false;
|
|
43
|
+
const params = Array.isArray(functionNode.params) ? functionNode.params : [];
|
|
44
|
+
const firstParamName = params[0] && params[0].type === "Identifier"
|
|
45
|
+
? params[0].name
|
|
46
|
+
: params[0] && params[0].type === "AssignmentPattern" && ((_a = params[0].left) === null || _a === void 0 ? void 0 : _a.type) === "Identifier"
|
|
47
|
+
? params[0].left.name
|
|
48
|
+
: null;
|
|
49
|
+
if (!firstParamName)
|
|
50
|
+
return false;
|
|
51
|
+
let found = false;
|
|
52
|
+
const visit = (n, depth) => {
|
|
53
|
+
if (found || !n || typeof n !== "object")
|
|
54
|
+
return;
|
|
55
|
+
if (Array.isArray(n)) {
|
|
56
|
+
for (const child of n)
|
|
57
|
+
visit(child, depth);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (typeof n.type !== "string")
|
|
61
|
+
return;
|
|
62
|
+
// Don't descend into nested functions — they have their own invocation context.
|
|
63
|
+
if (depth > 0 && NESTED_FN_TYPES.has(n.type))
|
|
64
|
+
return;
|
|
65
|
+
if (n.type === "CallExpression" &&
|
|
66
|
+
n.callee &&
|
|
67
|
+
n.callee.type === "Identifier" &&
|
|
68
|
+
n.callee.name === "fetch" &&
|
|
69
|
+
Array.isArray(n.arguments) &&
|
|
70
|
+
n.arguments.length > 0 &&
|
|
71
|
+
n.arguments[0].type === "Identifier" &&
|
|
72
|
+
n.arguments[0].name === firstParamName) {
|
|
73
|
+
found = true;
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
for (const key of Object.keys(n)) {
|
|
77
|
+
if (key === "loc" ||
|
|
78
|
+
key === "start" ||
|
|
79
|
+
key === "end" ||
|
|
80
|
+
key === "leadingComments" ||
|
|
81
|
+
key === "trailingComments") {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
visit(n[key], depth + 1);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
visit(functionNode, 0);
|
|
88
|
+
return found;
|
|
89
|
+
};
|
|
90
|
+
const isFunctionLike = (node) => !!node &&
|
|
91
|
+
(node.type === "ArrowFunctionExpression" ||
|
|
92
|
+
node.type === "FunctionExpression" ||
|
|
93
|
+
node.type === "FunctionDeclaration");
|
|
18
94
|
/**
|
|
19
95
|
* Scans all JS files in the given directory for fetch() calls,
|
|
20
96
|
* resolves their URL / method / headers / body, and registers each
|
|
@@ -23,8 +99,8 @@ const traverse = _traverse.default;
|
|
|
23
99
|
* Designed for Vite-bundled Vue.JS applications where HTTP calls are
|
|
24
100
|
* made with the native fetch() API rather than via webpack chunks.
|
|
25
101
|
*/
|
|
26
|
-
const vue_resolveFetch = (
|
|
27
|
-
console.log(chalk.cyan(
|
|
102
|
+
const vue_resolveFetch = (directory_1, ...args_1) => __awaiter(void 0, [directory_1, ...args_1], void 0, function* (directory, frameworkName = "Vue.JS") {
|
|
103
|
+
console.log(chalk.cyan(`[i] Resolving ${frameworkName} fetch instances`));
|
|
28
104
|
let files;
|
|
29
105
|
try {
|
|
30
106
|
files = fs.readdirSync(directory, { recursive: true, encoding: "utf8" });
|
|
@@ -36,8 +112,23 @@ const vue_resolveFetch = (directory) => __awaiter(void 0, void 0, void 0, functi
|
|
|
36
112
|
files = files
|
|
37
113
|
.filter((f) => f.endsWith(".js") && !f.includes("___subsequent_requests"))
|
|
38
114
|
.filter((f) => !fs.lstatSync(path.join(directory, f)).isDirectory());
|
|
39
|
-
|
|
40
|
-
|
|
115
|
+
// Pre-pass: scan every file for object-literal properties whose value is a
|
|
116
|
+
// function that ultimately calls fetch(). Their property names are the
|
|
117
|
+
// fetch-wrapper keys downstream code destructures and invokes in place of
|
|
118
|
+
// fetch — so we need to recognise those aliases.
|
|
119
|
+
//
|
|
120
|
+
// ASTs are parsed on-demand and discarded after each file — only
|
|
121
|
+
// `wrapperKeyNames` (a small string set) and `fetchFilePaths` (a path list)
|
|
122
|
+
// are retained so that the full pre-pass AST set never lives in memory
|
|
123
|
+
// simultaneously.
|
|
124
|
+
const wrapperKeyNames = new Set();
|
|
125
|
+
const fetchFilePaths = [];
|
|
126
|
+
for (let _pi = 0; _pi < files.length; _pi++) {
|
|
127
|
+
// Yield to the event loop every 50 files so V8 GC can reclaim ASTs
|
|
128
|
+
// from completed iterations before the next batch begins.
|
|
129
|
+
if (_pi > 0 && _pi % 50 === 0)
|
|
130
|
+
yield new Promise((r) => setImmediate(r));
|
|
131
|
+
const file = files[_pi];
|
|
41
132
|
const filePath = path.join(directory, file);
|
|
42
133
|
let fileContent;
|
|
43
134
|
try {
|
|
@@ -46,9 +137,9 @@ const vue_resolveFetch = (directory) => __awaiter(void 0, void 0, void 0, functi
|
|
|
46
137
|
catch (_b) {
|
|
47
138
|
continue;
|
|
48
139
|
}
|
|
49
|
-
// Fast path: skip files with no fetch keyword at all
|
|
50
140
|
if (!fileContent.includes("fetch"))
|
|
51
141
|
continue;
|
|
142
|
+
fetchFilePaths.push(filePath);
|
|
52
143
|
let fileAst;
|
|
53
144
|
try {
|
|
54
145
|
fileAst = parser.parse(fileContent, {
|
|
@@ -60,17 +151,97 @@ const vue_resolveFetch = (directory) => __awaiter(void 0, void 0, void 0, functi
|
|
|
60
151
|
catch (_c) {
|
|
61
152
|
continue;
|
|
62
153
|
}
|
|
63
|
-
|
|
154
|
+
traverse(fileAst, {
|
|
155
|
+
ObjectProperty(p) {
|
|
156
|
+
const key = p.node.key;
|
|
157
|
+
const value = p.node.value;
|
|
158
|
+
if (!isFunctionLike(value))
|
|
159
|
+
return;
|
|
160
|
+
if (!bodyCallsFetch(value))
|
|
161
|
+
return;
|
|
162
|
+
const keyName = key.type === "Identifier" ? key.name : key.type === "StringLiteral" ? key.value : null;
|
|
163
|
+
if (keyName)
|
|
164
|
+
wrapperKeyNames.add(keyName);
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
// fileAst and fileContent go out of scope here — GC can reclaim them.
|
|
168
|
+
}
|
|
169
|
+
const getCallers = makeGetCallers(fetchFilePaths);
|
|
170
|
+
let totalFetchCalls = 0;
|
|
171
|
+
// Counter for per-callsite uniqueness so two callsites at the same path+method
|
|
172
|
+
// are kept distinct in mapped.json and downstream specs.
|
|
173
|
+
let callsiteCounter = 0;
|
|
174
|
+
const entries = [];
|
|
175
|
+
for (let _mi = 0; _mi < files.length; _mi++) {
|
|
176
|
+
// Yield every 50 files so V8 GC can run between batches.
|
|
177
|
+
if (_mi > 0 && _mi % 50 === 0)
|
|
178
|
+
yield new Promise((r) => setImmediate(r));
|
|
179
|
+
const file = files[_mi];
|
|
180
|
+
const filePath = path.join(directory, file);
|
|
181
|
+
// Parse each file fresh — no persistent cache. The AST goes out of scope
|
|
182
|
+
// at the end of this loop body so the GC can reclaim it.
|
|
183
|
+
let fileContent;
|
|
184
|
+
let fileAst;
|
|
185
|
+
try {
|
|
186
|
+
fileContent = fs.readFileSync(filePath, "utf-8");
|
|
187
|
+
}
|
|
188
|
+
catch (_d) {
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
if (!fileContent.includes("fetch"))
|
|
192
|
+
continue;
|
|
193
|
+
try {
|
|
194
|
+
fileAst = parser.parse(fileContent, {
|
|
195
|
+
sourceType: "unambiguous",
|
|
196
|
+
plugins: ["jsx", "typescript"],
|
|
197
|
+
errorRecovery: true,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
catch (_e) {
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
// Collect fetch aliases:
|
|
204
|
+
// 1. `const x = fetch` (direct identifier aliasing)
|
|
205
|
+
// 2. `const x = (i, l) => fetch(i, l)` (function-literal wrappers)
|
|
206
|
+
// 3. `const { wrapperKey: x } = factory({...})` (destructured wrapper keys)
|
|
64
207
|
const fetchAliases = new Set();
|
|
65
208
|
traverse(fileAst, {
|
|
66
209
|
VariableDeclarator(p) {
|
|
67
210
|
const { id, init } = p.node;
|
|
68
|
-
if (
|
|
211
|
+
if (!init)
|
|
69
212
|
return;
|
|
70
|
-
if (
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
213
|
+
if (id.type === "Identifier") {
|
|
214
|
+
if (init.type === "Identifier" && init.name === "fetch") {
|
|
215
|
+
const binding = p.scope.getBinding(id.name);
|
|
216
|
+
if (binding)
|
|
217
|
+
fetchAliases.add(binding);
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
if (isFunctionLike(init) && bodyCallsFetch(init)) {
|
|
221
|
+
const binding = p.scope.getBinding(id.name);
|
|
222
|
+
if (binding)
|
|
223
|
+
fetchAliases.add(binding);
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
if (id.type === "ObjectPattern") {
|
|
228
|
+
for (const prop of id.properties) {
|
|
229
|
+
if (prop.type !== "ObjectProperty")
|
|
230
|
+
continue;
|
|
231
|
+
const keyName = prop.key.type === "Identifier"
|
|
232
|
+
? prop.key.name
|
|
233
|
+
: prop.key.type === "StringLiteral"
|
|
234
|
+
? prop.key.value
|
|
235
|
+
: null;
|
|
236
|
+
if (!keyName || !wrapperKeyNames.has(keyName))
|
|
237
|
+
continue;
|
|
238
|
+
const valueName = prop.value.type === "Identifier" ? prop.value.name : null;
|
|
239
|
+
if (!valueName)
|
|
240
|
+
continue;
|
|
241
|
+
const binding = p.scope.getBinding(valueName);
|
|
242
|
+
if (binding)
|
|
243
|
+
fetchAliases.add(binding);
|
|
244
|
+
}
|
|
74
245
|
}
|
|
75
246
|
},
|
|
76
247
|
});
|
|
@@ -94,7 +265,6 @@ const vue_resolveFetch = (directory) => __awaiter(void 0, void 0, void 0, functi
|
|
|
94
265
|
if (args.length === 0)
|
|
95
266
|
return;
|
|
96
267
|
const fileLine = (_b = (_a = callPath.node.loc) === null || _a === void 0 ? void 0 : _a.start.line) !== null && _b !== void 0 ? _b : 0;
|
|
97
|
-
console.log(chalk.blue(`[+] Found fetch call in "${filePath}":${fileLine}`));
|
|
98
268
|
totalFetchCalls++;
|
|
99
269
|
// Resolve URL (first argument)
|
|
100
270
|
const urlArgCode = fileContent
|
|
@@ -108,7 +278,6 @@ const vue_resolveFetch = (directory) => __awaiter(void 0, void 0, void 0, functi
|
|
|
108
278
|
url = substituted;
|
|
109
279
|
}
|
|
110
280
|
}
|
|
111
|
-
console.log(chalk.green(` URL: ${url}`));
|
|
112
281
|
let method = "GET";
|
|
113
282
|
let headers = {};
|
|
114
283
|
let body = "";
|
|
@@ -129,27 +298,112 @@ const vue_resolveFetch = (directory) => __awaiter(void 0, void 0, void 0, functi
|
|
|
129
298
|
body =
|
|
130
299
|
typeof options.body === "object" ? JSON.stringify(options.body) : String(options.body);
|
|
131
300
|
}
|
|
132
|
-
console.log(chalk.green(` Method: ${method}`));
|
|
133
|
-
if (Object.keys(headers).length > 0)
|
|
134
|
-
console.log(chalk.green(` Headers: ${JSON.stringify(headers)}`));
|
|
135
|
-
if (body)
|
|
136
|
-
console.log(chalk.green(` Body: ${body}`));
|
|
137
301
|
}
|
|
138
302
|
}
|
|
139
|
-
|
|
140
|
-
|
|
303
|
+
const rawEnclosingFn = inferEnclosingFn(callPath, filePath);
|
|
304
|
+
// Null out the AST node reference — it is never read in the
|
|
305
|
+
// second pass, but keeping it alive would pin the entire file
|
|
306
|
+
// AST in memory through the entries array.
|
|
307
|
+
const enclosingFn = rawEnclosingFn ? Object.assign(Object.assign({}, rawEnclosingFn), { node: null }) : null;
|
|
308
|
+
entries.push({
|
|
309
|
+
file,
|
|
310
|
+
filePath,
|
|
311
|
+
// fileContent is not used in the second pass; store an empty
|
|
312
|
+
// string so the full file content is not kept alive in memory
|
|
313
|
+
// through the entries array.
|
|
314
|
+
fileContent: "",
|
|
315
|
+
fileLine,
|
|
316
|
+
url: typeof url === "string" ? url : "",
|
|
141
317
|
method,
|
|
142
|
-
path: String(url),
|
|
143
318
|
headers,
|
|
144
319
|
body,
|
|
145
|
-
|
|
146
|
-
functionFile: filePath,
|
|
147
|
-
functionFileLine: fileLine,
|
|
320
|
+
enclosingFn,
|
|
148
321
|
});
|
|
149
322
|
},
|
|
150
323
|
});
|
|
151
324
|
}
|
|
152
|
-
|
|
325
|
+
// Second pass: walk back to each fetch's enclosing function callers and
|
|
326
|
+
// substitute markers we couldn't resolve in the first pass. This is where
|
|
327
|
+
// `?[urlsearchparams:p.q]` turns into `?k1={k1}&k2={k2}`, and where
|
|
328
|
+
// `...p.q: <spread>` gets expanded if a literal object was passed.
|
|
329
|
+
//
|
|
330
|
+
const MARKER_RE = /\[(urlsearchparams|member|param):/;
|
|
331
|
+
const headersHaveMarkers = (h) => {
|
|
332
|
+
for (const [k, v] of Object.entries(h)) {
|
|
333
|
+
if (k.startsWith("...") && v === "<spread>")
|
|
334
|
+
return true;
|
|
335
|
+
if (MARKER_RE.test(v))
|
|
336
|
+
return true;
|
|
337
|
+
}
|
|
338
|
+
return false;
|
|
339
|
+
};
|
|
340
|
+
for (const entry of entries) {
|
|
341
|
+
if (entry.enclosingFn &&
|
|
342
|
+
entry.enclosingFn.bindingName &&
|
|
343
|
+
entry.enclosingFn.firstParamName &&
|
|
344
|
+
entry.enclosingFn.bindingName.length > 2 &&
|
|
345
|
+
(MARKER_RE.test(entry.url) || MARKER_RE.test(entry.body) || headersHaveMarkers(entry.headers))) {
|
|
346
|
+
entry.url = substituteCallerPlaceholders(entry.url, entry.enclosingFn, getCallers);
|
|
347
|
+
entry.headers = substituteCallerHeaders(entry.headers, entry.enclosingFn, getCallers);
|
|
348
|
+
entry.body = substituteCallerPlaceholders(entry.body, entry.enclosingFn, getCallers);
|
|
349
|
+
}
|
|
350
|
+
// Deep body resolution: when the body JSON contains [param:X] string
|
|
351
|
+
// values that map to structured objects at the call site, replace them.
|
|
352
|
+
// This runs even for short binding names (e.g. single-char minifier
|
|
353
|
+
// locals) because makeGetCallers uses the alias map internally and will
|
|
354
|
+
// find callers via a meaningful exported name (e.g. postSOA → O).
|
|
355
|
+
if (entry.enclosingFn && entry.enclosingFn.bindingName && /\[param:/.test(entry.body)) {
|
|
356
|
+
try {
|
|
357
|
+
const parsed = JSON.parse(entry.body);
|
|
358
|
+
if (parsed !== null && typeof parsed === "object") {
|
|
359
|
+
const substituted = deepSubstituteBodyValue(parsed, entry.enclosingFn, getCallers);
|
|
360
|
+
entry.body = JSON.stringify(substituted);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
catch (_f) {
|
|
364
|
+
// body is not valid JSON; fall back to string-level substitution
|
|
365
|
+
if (entry.enclosingFn.bindingName.length <= 2) {
|
|
366
|
+
entry.body = substituteCallerPlaceholders(entry.body, entry.enclosingFn, getCallers);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
console.log(chalk.blue(`[+] Found fetch call in "${entry.filePath}":${entry.fileLine}`));
|
|
371
|
+
console.log(chalk.green(` URL: ${entry.url}`));
|
|
372
|
+
if (entry.method !== "GET" || Object.keys(entry.headers).length > 0 || entry.body) {
|
|
373
|
+
console.log(chalk.green(` Method: ${entry.method}`));
|
|
374
|
+
}
|
|
375
|
+
if (Object.keys(entry.headers).length > 0)
|
|
376
|
+
console.log(chalk.green(` Headers: ${JSON.stringify(entry.headers)}`));
|
|
377
|
+
if (entry.body)
|
|
378
|
+
console.log(chalk.green(` Body: ${entry.body}`));
|
|
379
|
+
// Skip the openapi/postman registration for callsites where the URL
|
|
380
|
+
// never resolved to anything URL-shaped. Examples:
|
|
381
|
+
// - inner wrapper bodies like `fetch(i, l)` where `i` is a param
|
|
382
|
+
// - non-string AST nodes (objects, member expressions) that have
|
|
383
|
+
// no chance of being a real path
|
|
384
|
+
const urlStr = entry.url;
|
|
385
|
+
const looksLikeUrl = urlStr.length > 0 &&
|
|
386
|
+
!urlStr.startsWith("[") &&
|
|
387
|
+
urlStr !== "[object Object]" &&
|
|
388
|
+
(urlStr.startsWith("http://") ||
|
|
389
|
+
urlStr.startsWith("https://") ||
|
|
390
|
+
urlStr.startsWith("/") ||
|
|
391
|
+
/^[A-Za-z0-9_\-.]+\//.test(urlStr));
|
|
392
|
+
if (!looksLikeUrl)
|
|
393
|
+
continue;
|
|
394
|
+
callsiteCounter++;
|
|
395
|
+
globals.addOpenapiOutput({
|
|
396
|
+
url: urlStr,
|
|
397
|
+
method: entry.method,
|
|
398
|
+
path: urlStr,
|
|
399
|
+
headers: entry.headers,
|
|
400
|
+
body: entry.body,
|
|
401
|
+
chunkId: `${entry.file}:${entry.fileLine}`,
|
|
402
|
+
functionFile: entry.filePath,
|
|
403
|
+
functionFileLine: entry.fileLine,
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
console.log(chalk.green(`[✓] Found and resolved ${totalFetchCalls} fetch call(s) across ${frameworkName} files`));
|
|
153
407
|
});
|
|
154
408
|
export default vue_resolveFetch;
|
|
155
409
|
//# sourceMappingURL=vue_resolveFetch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vue_resolveFetch.js","sourceRoot":"","sources":["../../../src/map/vue_js/vue_resolveFetch.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,MAAM,MAAM,eAAe,CAAC;AACnC,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AAEpD,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC;AAEnC;;;;;;;GAOG;AACH,MAAM,gBAAgB,GAAG,CAAO,SAAiB,EAAiB,EAAE;IAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAC;IAEhE,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACD,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAa,CAAC;IACzF,CAAC;IAAC,WAAM,CAAC;QACL,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,SAAS,EAAE,CAAC,CAAC,CAAC;QACrE,OAAO;IACX,CAAC;IAED,KAAK,GAAG,KAAK;SACR,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC;SACzE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAEzE,IAAI,eAAe,GAAG,CAAC,CAAC;IAExB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC5C,IAAI,WAAmB,CAAC;QACxB,IAAI,CAAC;YACD,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,CAAC;QAAC,WAAM,CAAC;YACL,SAAS;QACb,CAAC;QAED,qDAAqD;QACrD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAS;QAE7C,IAAI,OAAY,CAAC;QACjB,IAAI,CAAC;YACD,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE;gBAChC,UAAU,EAAE,aAAa;gBACzB,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC;gBAC9B,aAAa,EAAE,IAAI;aACtB,CAAC,CAAC;QACP,CAAC;QAAC,WAAM,CAAC;YACL,SAAS;QACb,CAAC;QAED,0CAA0C;QAC1C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAO,CAAC;QACpC,QAAQ,CAAC,OAAO,EAAE;YACd,kBAAkB,CAAC,CAAC;gBAChB,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC5B,IAAI,EAAE,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,IAAI;oBAAE,OAAO;gBAC9C,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBACtD,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;oBAC5C,IAAI,OAAO;wBAAE,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC3C,CAAC;YACL,CAAC;SACJ,CAAC,CAAC;QAEH,0BAA0B;QAC1B,QAAQ,CAAC,OAAO,EAAE;YACd,cAAc,CAAC,QAAQ;;gBACnB,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;gBACpC,IAAI,WAAW,GAAG,KAAK,CAAC;gBAExB,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC1D,WAAW,GAAG,IAAI,CAAC;gBACvB,CAAC;qBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBACvD,IAAI,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;wBAAE,WAAW,GAAG,IAAI,CAAC;gBACjE,CAAC;gBAED,IAAI,CAAC,WAAW;oBAAE,OAAO;gBAEzB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;gBACrC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO;gBAE9B,MAAM,QAAQ,GAAG,MAAA,MAAA,QAAQ,CAAC,IAAI,CAAC,GAAG,0CAAE,KAAK,CAAC,IAAI,mCAAI,CAAC,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,QAAQ,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC;gBAC7E,eAAe,EAAE,CAAC;gBAElB,+BAA+B;gBAC/B,MAAM,UAAU,GAAG,WAAW;qBACzB,KAAK,CAAE,IAAI,CAAC,CAAC,CAAS,CAAC,KAAK,EAAG,IAAI,CAAC,CAAC,CAAS,CAAC,GAAG,CAAC;qBACnD,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBAE3B,IAAI,GAAG,GAAQ,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;gBAE3F,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC;oBAC1F,MAAM,WAAW,GAAG,2BAA2B,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;oBAClE,IAAI,WAAW,KAAK,GAAG,EAAE,CAAC;wBACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sCAAsC,GAAG,OAAO,WAAW,EAAE,CAAC,CAAC,CAAC;wBACvF,GAAG,GAAG,WAAW,CAAC;oBACtB,CAAC;gBACL,CAAC;gBAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC,CAAC;gBAE5C,IAAI,MAAM,GAAG,KAAK,CAAC;gBACnB,IAAI,OAAO,GAA2B,EAAE,CAAC;gBACzC,IAAI,IAAI,GAAG,EAAE,CAAC;gBAEd,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAClB,MAAM,OAAO,GAAQ,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;oBAEzF,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;wBAClD,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;wBAEjC,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;4BACzD,MAAM,eAAe,GAA2B,EAAE,CAAC;4BACnD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gCACnD,MAAM,EAAE,GACJ,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gCACpF,MAAM,EAAE,GACJ,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gCACpF,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;4BAC7B,CAAC;4BACD,OAAO,GAAG,eAAe,CAAC;wBAC9B,CAAC;wBAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;4BACf,IAAI;gCACA,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;wBAC/F,CAAC;wBAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,MAAM,EAAE,CAAC,CAAC,CAAC;wBAClD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC;4BAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;wBACxE,IAAI,IAAI;4BAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,CAAC;oBAC5D,CAAC;gBACL,CAAC;gBAED,OAAO,CAAC,gBAAgB,CAAC;oBACrB,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;oBAChB,MAAM;oBACN,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC;oBACjB,OAAO;oBACP,IAAI;oBACJ,OAAO,EAAE,IAAI;oBACb,YAAY,EAAE,QAAQ;oBACtB,gBAAgB,EAAE,QAAQ;iBAC7B,CAAC,CAAC;YACP,CAAC;SACJ,CAAC,CAAC;IACP,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,eAAe,oCAAoC,CAAC,CAAC,CAAC;AAC5G,CAAC,CAAA,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"vue_resolveFetch.js","sourceRoot":"","sources":["../../../src/map/vue_js/vue_resolveFetch.ts"],"names":[],"mappings":"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"}
|