@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.
Files changed (162) hide show
  1. package/.github/workflows/build-and-prettify.yaml +15 -1
  2. package/.github/workflows/pr_checker.yml +9 -8
  3. package/.github/workflows/publish-js-recon.yml +13 -1
  4. package/CHANGELOG.md +96 -0
  5. package/CLAUDE.md +225 -0
  6. package/README.md +2 -0
  7. package/build/analyze/engine/astEngine.js +57 -29
  8. package/build/analyze/engine/astEngine.js.map +1 -1
  9. package/build/analyze/engine/index.js +2 -2
  10. package/build/analyze/engine/index.js.map +1 -1
  11. package/build/analyze/helpers/engineHelpers/taintFlow.js +32 -0
  12. package/build/analyze/helpers/engineHelpers/taintFlow.js.map +1 -1
  13. package/build/analyze/helpers/initRules.js +9 -0
  14. package/build/analyze/helpers/initRules.js.map +1 -1
  15. package/build/analyze/helpers/schemas.js +6 -1
  16. package/build/analyze/helpers/schemas.js.map +1 -1
  17. package/build/analyze/helpers/validate.js +49 -9
  18. package/build/analyze/helpers/validate.js.map +1 -1
  19. package/build/analyze/index.js +10 -4
  20. package/build/analyze/index.js.map +1 -1
  21. package/build/endpoints/next_js/client_mappedJsonFile.js +12 -5
  22. package/build/endpoints/next_js/client_mappedJsonFile.js.map +1 -1
  23. package/build/fingerprint/index.js +123 -0
  24. package/build/fingerprint/index.js.map +1 -0
  25. package/build/globalConfig.js +1 -1
  26. package/build/index.js +72 -5
  27. package/build/index.js.map +1 -1
  28. package/build/lazyLoad/downloadFilesUtil.js +3 -3
  29. package/build/lazyLoad/downloadFilesUtil.js.map +1 -1
  30. package/build/lazyLoad/downloadQueue.js +16 -11
  31. package/build/lazyLoad/downloadQueue.js.map +1 -1
  32. package/build/lazyLoad/index.js +260 -163
  33. package/build/lazyLoad/index.js.map +1 -1
  34. package/build/lazyLoad/next_js/NextJsCrawler.js +58 -16
  35. package/build/lazyLoad/next_js/NextJsCrawler.js.map +1 -1
  36. package/build/lazyLoad/next_js/next_GetJSScript.js +8 -4
  37. package/build/lazyLoad/next_js/next_GetJSScript.js.map +1 -1
  38. package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js +149 -139
  39. package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js.map +1 -1
  40. package/build/lazyLoad/next_js/next_SubsequentRequests.js +25 -4
  41. package/build/lazyLoad/next_js/next_SubsequentRequests.js.map +1 -1
  42. package/build/lazyLoad/next_js/next_scriptTagsSubsequentRequests.js +13 -5
  43. package/build/lazyLoad/next_js/next_scriptTagsSubsequentRequests.js.map +1 -1
  44. package/build/lazyLoad/react/react_followImports.js +105 -0
  45. package/build/lazyLoad/react/react_followImports.js.map +1 -0
  46. package/build/lazyLoad/react/react_getScriptTags.js +28 -5
  47. package/build/lazyLoad/react/react_getScriptTags.js.map +1 -1
  48. package/build/lazyLoad/svelte/svelte_discoverPagesFromJs.js +162 -0
  49. package/build/lazyLoad/svelte/svelte_discoverPagesFromJs.js.map +1 -0
  50. package/build/lazyLoad/svelte/svelte_getFromPageSource.js +15 -0
  51. package/build/lazyLoad/svelte/svelte_getFromPageSource.js.map +1 -1
  52. package/build/lazyLoad/svelte/svelte_recursivePageCrawl.js +180 -0
  53. package/build/lazyLoad/svelte/svelte_recursivePageCrawl.js.map +1 -0
  54. package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js +15 -1
  55. package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js.map +1 -1
  56. package/build/lazyLoad/techDetect/checkReact.js +67 -36
  57. package/build/lazyLoad/techDetect/checkReact.js.map +1 -1
  58. package/build/lazyLoad/techDetect/checkSvelte.js +35 -35
  59. package/build/lazyLoad/techDetect/checkSvelte.js.map +1 -1
  60. package/build/lazyLoad/techDetect/index.js +31 -25
  61. package/build/lazyLoad/techDetect/index.js.map +1 -1
  62. package/build/lazyLoad/vue/vue_getClientSidePaths.js +6 -0
  63. package/build/lazyLoad/vue/vue_getClientSidePaths.js.map +1 -1
  64. package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js +6 -0
  65. package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js.map +1 -1
  66. package/build/lazyLoad/vue/vue_stringJsFiles.js +6 -0
  67. package/build/lazyLoad/vue/vue_stringJsFiles.js.map +1 -1
  68. package/build/load/index.js +316 -0
  69. package/build/load/index.js.map +1 -0
  70. package/build/map/graphql/resolveGraphql.js +296 -0
  71. package/build/map/graphql/resolveGraphql.js.map +1 -0
  72. package/build/map/index.js +104 -6
  73. package/build/map/index.js.map +1 -1
  74. package/build/map/next_js/interactive.js +30 -0
  75. package/build/map/next_js/interactive.js.map +1 -1
  76. package/build/map/next_js/interactive_helpers/commandHandler.js +26 -0
  77. package/build/map/next_js/interactive_helpers/commandHandler.js.map +1 -1
  78. package/build/map/next_js/interactive_helpers/commandHelpers.js +28 -0
  79. package/build/map/next_js/interactive_helpers/commandHelpers.js.map +1 -1
  80. package/build/map/next_js/interactive_helpers/esqueryGen.js +370 -0
  81. package/build/map/next_js/interactive_helpers/esqueryGen.js.map +1 -0
  82. package/build/map/next_js/interactive_helpers/helpMenu.js +2 -1
  83. package/build/map/next_js/interactive_helpers/helpMenu.js.map +1 -1
  84. package/build/map/next_js/interactive_helpers/inputPatch.js +207 -0
  85. package/build/map/next_js/interactive_helpers/inputPatch.js.map +1 -0
  86. package/build/map/next_js/interactive_helpers/ui.js +0 -1
  87. package/build/map/next_js/interactive_helpers/ui.js.map +1 -1
  88. package/build/map/next_js/resolveServerActions.js +449 -0
  89. package/build/map/next_js/resolveServerActions.js.map +1 -0
  90. package/build/map/next_js/utils.js +89 -2
  91. package/build/map/next_js/utils.js.map +1 -1
  92. package/build/map/react_js/getReactConnections.js +298 -0
  93. package/build/map/react_js/getReactConnections.js.map +1 -0
  94. package/build/map/react_js/interactive.js +4 -0
  95. package/build/map/react_js/interactive.js.map +1 -0
  96. package/build/map/react_js/react_resolveFetch.js +6 -0
  97. package/build/map/react_js/react_resolveFetch.js.map +1 -0
  98. package/build/map/svelte_js/interactive.js +58 -0
  99. package/build/map/svelte_js/interactive.js.map +1 -0
  100. package/build/map/svelte_js/interactive_helpers/commandHandler.js +4 -0
  101. package/build/map/svelte_js/interactive_helpers/commandHandler.js.map +1 -0
  102. package/build/map/vue_js/bodyResolver.js +477 -0
  103. package/build/map/vue_js/bodyResolver.js.map +1 -0
  104. package/build/map/vue_js/crossFileResolver.js +438 -0
  105. package/build/map/vue_js/crossFileResolver.js.map +1 -0
  106. package/build/map/vue_js/getViteConnections.js +151 -106
  107. package/build/map/vue_js/getViteConnections.js.map +1 -1
  108. package/build/map/vue_js/interactive.js +28 -0
  109. package/build/map/vue_js/interactive.js.map +1 -1
  110. package/build/map/vue_js/interactive_helpers/commandHandler.js +22 -0
  111. package/build/map/vue_js/interactive_helpers/commandHandler.js.map +1 -1
  112. package/build/map/vue_js/interactive_helpers/helpMenu.js +1 -0
  113. package/build/map/vue_js/interactive_helpers/helpMenu.js.map +1 -1
  114. package/build/map/vue_js/taint_utils.js +621 -0
  115. package/build/map/vue_js/taint_utils.js.map +1 -0
  116. package/build/map/vue_js/vue_resolveFetch.js +279 -25
  117. package/build/map/vue_js/vue_resolveFetch.js.map +1 -1
  118. package/build/map/vue_js/vue_resolveHttpClient.js +733 -0
  119. package/build/map/vue_js/vue_resolveHttpClient.js.map +1 -0
  120. package/build/map/vue_js/vue_resolveXhr.js +279 -0
  121. package/build/map/vue_js/vue_resolveXhr.js.map +1 -0
  122. package/build/mcp/chatOneShot.js +101 -0
  123. package/build/mcp/chatOneShot.js.map +1 -0
  124. package/build/mcp/claudeCodeCreds.js +150 -0
  125. package/build/mcp/claudeCodeCreds.js.map +1 -0
  126. package/build/mcp/cli.js +140 -149
  127. package/build/mcp/cli.js.map +1 -1
  128. package/build/mcp/commands.js +80 -0
  129. package/build/mcp/commands.js.map +1 -1
  130. package/build/mcp/index.js +30 -9
  131. package/build/mcp/index.js.map +1 -1
  132. package/build/mcp/intent.js +204 -0
  133. package/build/mcp/intent.js.map +1 -0
  134. package/build/mcp/jobs.js +199 -0
  135. package/build/mcp/jobs.js.map +1 -0
  136. package/build/mcp/mcpServer.js +241 -0
  137. package/build/mcp/mcpServer.js.map +1 -0
  138. package/build/mcp/providers.js +18 -1
  139. package/build/mcp/providers.js.map +1 -1
  140. package/build/mcp/skills.js +115 -0
  141. package/build/mcp/skills.js.map +1 -0
  142. package/build/refactor/index.js +6 -0
  143. package/build/refactor/index.js.map +1 -1
  144. package/build/refactor/react/index.js +636 -0
  145. package/build/refactor/react/index.js.map +1 -0
  146. package/build/report/utility/populateDb/populateAnalysisFindings.js +1 -1
  147. package/build/report/utility/populateDb/populateAnalysisFindings.js.map +1 -1
  148. package/build/run/index.js +277 -60
  149. package/build/run/index.js.map +1 -1
  150. package/build/run/interruptHandler.js +93 -0
  151. package/build/run/interruptHandler.js.map +1 -0
  152. package/build/utility/globals.js +38 -0
  153. package/build/utility/globals.js.map +1 -1
  154. package/build/utility/makeReq.js +39 -5
  155. package/build/utility/makeReq.js.map +1 -1
  156. package/build/utility/openapiGenerator.js +61 -17
  157. package/build/utility/openapiGenerator.js.map +1 -1
  158. package/build/utility/postmanGenerator.js +69 -16
  159. package/build/utility/postmanGenerator.js.map +1 -1
  160. package/build/utility/progressLog.js +50 -0
  161. package/build/utility/progressLog.js.map +1 -0
  162. 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 = (directory) => __awaiter(void 0, void 0, void 0, function* () {
27
- console.log(chalk.cyan("[i] Resolving Vue.JS fetch instances"));
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
- let totalFetchCalls = 0;
40
- for (const file of files) {
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
- // Collect fetch aliases (const x = fetch)
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 (id.type !== "Identifier" || !init)
211
+ if (!init)
69
212
  return;
70
- if (init.type === "Identifier" && init.name === "fetch") {
71
- const binding = p.scope.getBinding(id.name);
72
- if (binding)
73
- fetchAliases.add(binding);
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
- globals.addOpenapiOutput({
140
- url: String(url),
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
- chunkId: file,
146
- functionFile: filePath,
147
- functionFileLine: fileLine,
320
+ enclosingFn,
148
321
  });
149
322
  },
150
323
  });
151
324
  }
152
- console.log(chalk.green(`[✓] Found and resolved ${totalFetchCalls} fetch call(s) across Vue.JS files`));
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":"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"}
1
+ {"version":3,"file":"vue_resolveFetch.js","sourceRoot":"","sources":["../../../src/map/vue_js/vue_resolveFetch.ts"],"names":[],"mappings":"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"}