@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
@@ -0,0 +1,449 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import chalk from "chalk";
11
+ import parser from "@babel/parser";
12
+ import _traverse from "@babel/traverse";
13
+ const traverse = _traverse.default;
14
+ import path from "path";
15
+ import * as globals from "../../utility/globals.js";
16
+ /**
17
+ * Derives the Next.js App Router page route from a chunk file path.
18
+ *
19
+ * File paths from Next.js static chunks look like:
20
+ * _next/static/chunks/app/page-HASH.js → /
21
+ * _next/static/chunks/app/products/page-HASH.js → /products
22
+ * _next/static/chunks/app/products/list/detail/page-HASH.js → /products/list/detail
23
+ *
24
+ * Route group segments like "(marketing)" are stripped.
25
+ * Dynamic segments like [id] are converted to {id} for OpenAPI compatibility.
26
+ */
27
+ const deriveRouteFromFile = (filePath) => {
28
+ const normalized = filePath.replace(/\\/g, "/");
29
+ const match = normalized.match(/(?:_next\/static\/chunks\/)?app\/(.+)/);
30
+ if (!match)
31
+ return null;
32
+ const relPath = match[1];
33
+ const segments = relPath.split("/");
34
+ segments.pop();
35
+ const routeSegments = segments.filter((seg) => !(seg.startsWith("(") && seg.endsWith(")")));
36
+ if (routeSegments.length === 0)
37
+ return "/";
38
+ const processedSegments = routeSegments.map((seg) => {
39
+ if (seg.startsWith("[[...") && seg.endsWith("]]"))
40
+ return `{${seg.slice(5, -2)}}`;
41
+ if (seg.startsWith("[...") && seg.endsWith("]"))
42
+ return `{${seg.slice(4, -1)}}`;
43
+ if (seg.startsWith("[") && seg.endsWith("]"))
44
+ return `{${seg.slice(1, -1)}}`;
45
+ return seg;
46
+ });
47
+ return "/" + processedSegments.join("/");
48
+ };
49
+ /**
50
+ * Returns true when the node is a createServerReference invocation.
51
+ *
52
+ * (0, X.createServerReference)(actionId, ...) — sequence expression
53
+ * X.createServerReference(actionId, ...) — direct member call
54
+ */
55
+ const isCreateServerReferenceCall = (node) => {
56
+ const callee = node.callee;
57
+ if (callee.type === "MemberExpression" &&
58
+ callee.property.type === "Identifier" &&
59
+ callee.property.name === "createServerReference") {
60
+ return true;
61
+ }
62
+ if (callee.type === "SequenceExpression" && callee.expressions.length === 2) {
63
+ const second = callee.expressions[1];
64
+ if (second.type === "MemberExpression" &&
65
+ second.property.type === "Identifier" &&
66
+ second.property.name === "createServerReference") {
67
+ return true;
68
+ }
69
+ }
70
+ return false;
71
+ };
72
+ /**
73
+ * Extracts a human-readable hint from a call-site argument AST node.
74
+ *
75
+ * Literals are returned verbatim. For dynamic expressions the most meaningful
76
+ * identifier or property name is used, e.g.:
77
+ * a.userId → "<string:userId>"
78
+ * t.getName() → "<string:getName>"
79
+ * firstName + lastName → "<string:firstName+lastName>"
80
+ * e.get("key") → "<string:key>"
81
+ * cond ? x : y → first non-placeholder branch
82
+ */
83
+ // Extracts just the variable name portion from a hint that may already carry
84
+ // a <type:name> prefix (e.g. "<string:userId>" → "userId", "someValue" → "someValue").
85
+ const hintName = (hint) => {
86
+ const typed = /^<[^:>]+:(.+)>$/.exec(hint);
87
+ if (typed)
88
+ return typed[1];
89
+ if (hint.startsWith("<") && hint.endsWith(">"))
90
+ return hint.slice(1, -1);
91
+ return hint;
92
+ };
93
+ const getArgHint = (node) => {
94
+ if (!node)
95
+ return "<string:arg>";
96
+ switch (node.type) {
97
+ case "StringLiteral":
98
+ return node.value;
99
+ case "NumericLiteral":
100
+ return String(node.value);
101
+ case "BooleanLiteral":
102
+ return String(node.value);
103
+ case "NullLiteral":
104
+ return "null";
105
+ case "Identifier":
106
+ return `<string:${node.name}>`;
107
+ case "MemberExpression": {
108
+ const prop = node.property;
109
+ const name = prop.type === "Identifier" ? prop.name : prop.type === "StringLiteral" ? prop.value : null;
110
+ return name ? `<string:${name}>` : "<string:member>";
111
+ }
112
+ case "CallExpression": {
113
+ const { callee, arguments: callArgs } = node;
114
+ if (callee.type === "MemberExpression") {
115
+ const methodName = callee.property.type === "Identifier" ? callee.property.name : null;
116
+ // e.get("key") → <string:key>
117
+ if (methodName === "get" && callArgs.length > 0 && callArgs[0].type === "StringLiteral") {
118
+ return `<string:${callArgs[0].value}>`;
119
+ }
120
+ // No-arg method calls: prefer a meaningful method name over the object name,
121
+ // except for trivial converters like toString/valueOf.
122
+ if (callArgs.length === 0) {
123
+ if (methodName && methodName !== "toString" && methodName !== "valueOf") {
124
+ return `<string:${methodName}>`;
125
+ }
126
+ return getArgHint(callee.object);
127
+ }
128
+ return methodName ? `<string:${methodName}>` : "<string:call>";
129
+ }
130
+ if (callee.type === "Identifier")
131
+ return `<string:${callee.name}>`;
132
+ return "<string:call>";
133
+ }
134
+ case "BinaryExpression": {
135
+ if (node.operator === "+") {
136
+ const l = getArgHint(node.left);
137
+ const r = getArgHint(node.right);
138
+ const lname = hintName(l);
139
+ const rname = hintName(r);
140
+ if (!lname)
141
+ return `<string:${rname}>`;
142
+ if (!rname)
143
+ return `<string:${lname}>`;
144
+ return `<string:${lname}+${rname}>`;
145
+ }
146
+ return "<number>";
147
+ }
148
+ case "LogicalExpression": {
149
+ // a || b — prefer a non-empty literal on the right, otherwise recurse left
150
+ const { left, right } = node;
151
+ if (right.type === "StringLiteral" && right.value)
152
+ return right.value;
153
+ return getArgHint(left);
154
+ }
155
+ case "ConditionalExpression": {
156
+ const c = getArgHint(node.consequent);
157
+ if (!c.startsWith("<"))
158
+ return c;
159
+ const a = getArgHint(node.alternate);
160
+ if (!a.startsWith("<"))
161
+ return a;
162
+ return c;
163
+ }
164
+ case "AwaitExpression":
165
+ return getArgHint(node.argument);
166
+ case "AssignmentExpression":
167
+ return getArgHint(node.right);
168
+ case "TemplateLiteral":
169
+ return "<string:template>";
170
+ default:
171
+ return "<string:value>";
172
+ }
173
+ };
174
+ /**
175
+ * Returns the variable name assigned from a createServerReference call by
176
+ * walking up to the VariableDeclarator parent.
177
+ */
178
+ const getAssignedVarName = (nodePath) => {
179
+ var _a;
180
+ const parent = nodePath.parentPath;
181
+ if ((parent === null || parent === void 0 ? void 0 : parent.isVariableDeclarator()) && ((_a = parent.node.id) === null || _a === void 0 ? void 0 : _a.type) === "Identifier") {
182
+ return parent.node.id.name;
183
+ }
184
+ return null;
185
+ };
186
+ /**
187
+ * Looks for n.d(t, { exportName: () => varName }) patterns and returns the
188
+ * export name for the specified variable, or null.
189
+ */
190
+ const findExportNameForVar = (ast, varName) => {
191
+ let exportName = null;
192
+ traverse(ast, {
193
+ CallExpression(p) {
194
+ if (exportName)
195
+ return;
196
+ const callee = p.node.callee;
197
+ if (callee.type === "MemberExpression" &&
198
+ callee.property.type === "Identifier" &&
199
+ callee.property.name === "d" &&
200
+ p.node.arguments.length >= 2) {
201
+ const second = p.node.arguments[1];
202
+ if (second.type !== "ObjectExpression")
203
+ return;
204
+ for (const prop of second.properties) {
205
+ if (prop.type !== "ObjectProperty")
206
+ continue;
207
+ const value = prop.value;
208
+ if (value.type === "ArrowFunctionExpression" &&
209
+ value.body.type === "Identifier" &&
210
+ value.body.name === varName) {
211
+ exportName =
212
+ prop.key.type === "Identifier"
213
+ ? prop.key.name
214
+ : prop.key.type === "StringLiteral"
215
+ ? prop.key.value
216
+ : null;
217
+ if (exportName)
218
+ p.stop();
219
+ return;
220
+ }
221
+ }
222
+ }
223
+ },
224
+ });
225
+ return exportName;
226
+ };
227
+ /**
228
+ * Searches a chunk's AST for direct calls to a named variable:
229
+ * varName(...) or (0, varName)(...)
230
+ */
231
+ const findInChunkCallArgs = (ast, varName, chunkId, absFile) => {
232
+ let foundArgs = null;
233
+ let foundLine = 0;
234
+ traverse(ast, {
235
+ CallExpression(p) {
236
+ var _a, _b, _c, _d;
237
+ if (foundArgs)
238
+ return;
239
+ const callee = p.node.callee;
240
+ if (callee.type === "Identifier" && callee.name === varName) {
241
+ foundArgs = p.node.arguments;
242
+ foundLine = (_b = (_a = p.node.loc) === null || _a === void 0 ? void 0 : _a.start.line) !== null && _b !== void 0 ? _b : 0;
243
+ p.stop();
244
+ return;
245
+ }
246
+ if (callee.type === "SequenceExpression" &&
247
+ callee.expressions.length === 2 &&
248
+ callee.expressions[1].type === "Identifier" &&
249
+ callee.expressions[1].name === varName) {
250
+ foundArgs = p.node.arguments;
251
+ foundLine = (_d = (_c = p.node.loc) === null || _c === void 0 ? void 0 : _c.start.line) !== null && _d !== void 0 ? _d : 0;
252
+ p.stop();
253
+ }
254
+ },
255
+ });
256
+ if (!foundArgs)
257
+ return null;
258
+ return { args: foundArgs, line: foundLine, chunkId, absFile };
259
+ };
260
+ /**
261
+ * Searches chunks that import chunkId for calls to exportName:
262
+ * moduleVar.exportName(...) or (0, moduleVar.exportName)(...)
263
+ */
264
+ const findCrossChunkCallArgs = (chunkId, exportName, chunks, directory) => {
265
+ for (const [callerId, callerChunk] of Object.entries(chunks)) {
266
+ if (!callerChunk.imports.includes(chunkId))
267
+ continue;
268
+ if (!callerChunk.code.includes(exportName))
269
+ continue;
270
+ let callerAst;
271
+ try {
272
+ callerAst = parser.parse(callerChunk.code, {
273
+ sourceType: "module",
274
+ plugins: ["jsx", "typescript"],
275
+ errorRecovery: true,
276
+ });
277
+ }
278
+ catch (_a) {
279
+ continue;
280
+ }
281
+ let foundArgs = null;
282
+ let foundLine = 0;
283
+ traverse(callerAst, {
284
+ CallExpression(p) {
285
+ var _a, _b, _c, _d;
286
+ if (foundArgs)
287
+ return;
288
+ const callee = p.node.callee;
289
+ if (callee.type === "MemberExpression" &&
290
+ callee.property.type === "Identifier" &&
291
+ callee.property.name === exportName) {
292
+ foundArgs = p.node.arguments;
293
+ foundLine = (_b = (_a = p.node.loc) === null || _a === void 0 ? void 0 : _a.start.line) !== null && _b !== void 0 ? _b : 0;
294
+ p.stop();
295
+ return;
296
+ }
297
+ if (callee.type === "SequenceExpression" && callee.expressions.length === 2) {
298
+ const second = callee.expressions[1];
299
+ if (second.type === "MemberExpression" &&
300
+ second.property.type === "Identifier" &&
301
+ second.property.name === exportName) {
302
+ foundArgs = p.node.arguments;
303
+ foundLine = (_d = (_c = p.node.loc) === null || _c === void 0 ? void 0 : _c.start.line) !== null && _d !== void 0 ? _d : 0;
304
+ p.stop();
305
+ }
306
+ }
307
+ },
308
+ });
309
+ if (foundArgs) {
310
+ return {
311
+ args: foundArgs,
312
+ line: foundLine,
313
+ chunkId: callerId,
314
+ absFile: path.resolve(directory, callerChunk.file),
315
+ };
316
+ }
317
+ }
318
+ return null;
319
+ };
320
+ /**
321
+ * Scans all chunks for Next.js Server Action registrations and records each
322
+ * discovered action in the global OpenAPI output.
323
+ *
324
+ * For each action:
325
+ * - The route is derived from the chunk's App Router file path, or resolved
326
+ * via one level of the importer graph for shared/lazy chunks.
327
+ * - Arguments are traced from the first call site found in the same chunk or
328
+ * in importer chunks via the exported symbol. Each argument is reduced to
329
+ * a named hint (e.g. "<string:userId>", "<string:token>") using identifier/property
330
+ * names from the call-site AST.
331
+ * - Definition and call-site locations (chunk ID + absolute file path + line)
332
+ * are recorded for reference.
333
+ */
334
+ const resolveServerActions = (chunks, directory) => __awaiter(void 0, void 0, void 0, function* () {
335
+ var _a, _b, _c;
336
+ console.log(chalk.cyan("[i] Resolving Next.js Server Actions"));
337
+ const importedBy = new Map();
338
+ for (const [id, chunk] of Object.entries(chunks)) {
339
+ for (const dep of chunk.imports || []) {
340
+ if (!importedBy.has(dep))
341
+ importedBy.set(dep, new Set());
342
+ importedBy.get(dep).add(id);
343
+ }
344
+ }
345
+ const seenActionIds = new Set();
346
+ for (const chunk of Object.values(chunks)) {
347
+ if (!chunk.code || !chunk.file)
348
+ continue;
349
+ if (!chunk.code.includes("createServerReference"))
350
+ continue;
351
+ let route = deriveRouteFromFile(chunk.file);
352
+ if (!route) {
353
+ const importers = (_a = importedBy.get(chunk.id)) !== null && _a !== void 0 ? _a : new Set();
354
+ for (const importerId of importers) {
355
+ const importerRoute = deriveRouteFromFile((_c = (_b = chunks[importerId]) === null || _b === void 0 ? void 0 : _b.file) !== null && _c !== void 0 ? _c : "");
356
+ if (importerRoute) {
357
+ route = importerRoute;
358
+ break;
359
+ }
360
+ }
361
+ }
362
+ if (!route)
363
+ route = "/";
364
+ let ast;
365
+ try {
366
+ ast = parser.parse(chunk.code, {
367
+ sourceType: "module",
368
+ plugins: ["jsx", "typescript"],
369
+ errorRecovery: true,
370
+ });
371
+ }
372
+ catch (_d) {
373
+ continue;
374
+ }
375
+ const defAbsFile = path.resolve(directory, chunk.file);
376
+ // First pass: collect all server action definitions in this chunk.
377
+ const entries = [];
378
+ traverse(ast, {
379
+ CallExpression(nodePath) {
380
+ var _a, _b;
381
+ if (!isCreateServerReferenceCall(nodePath.node))
382
+ return;
383
+ const args = nodePath.node.arguments;
384
+ if (args.length < 1)
385
+ return;
386
+ const firstArg = args[0];
387
+ if (firstArg.type !== "StringLiteral")
388
+ return;
389
+ const actionId = firstArg.value;
390
+ if (!/^[0-9a-f]{40,}$/i.test(actionId))
391
+ return;
392
+ if (seenActionIds.has(actionId))
393
+ return;
394
+ seenActionIds.add(actionId);
395
+ let actionName;
396
+ if (args.length >= 5 && args[4].type === "StringLiteral") {
397
+ actionName = args[4].value;
398
+ }
399
+ entries.push({
400
+ actionId,
401
+ actionName,
402
+ varName: getAssignedVarName(nodePath),
403
+ line: (_b = (_a = nodePath.node.loc) === null || _a === void 0 ? void 0 : _a.start.line) !== null && _b !== void 0 ? _b : 0,
404
+ });
405
+ },
406
+ });
407
+ // Second pass: trace call sites and build the request body for each action.
408
+ for (const entry of entries) {
409
+ let callSite = null;
410
+ if (entry.varName) {
411
+ callSite = findInChunkCallArgs(ast, entry.varName, chunk.id, defAbsFile);
412
+ if (!callSite) {
413
+ const exportName = findExportNameForVar(ast, entry.varName);
414
+ if (exportName) {
415
+ callSite = findCrossChunkCallArgs(chunk.id, exportName, chunks, directory);
416
+ }
417
+ }
418
+ }
419
+ let body = "";
420
+ if (callSite && callSite.args.length > 0) {
421
+ const hints = callSite.args.map(getArgHint);
422
+ body = JSON.stringify(hints);
423
+ console.log(chalk.cyan(` [i] Args for '${entry.actionName || entry.actionId}': ${body}`));
424
+ }
425
+ const logLabel = entry.actionName ? `${entry.actionName} (${entry.actionId})` : entry.actionId;
426
+ console.log(chalk.blue(`[+] Server Action '${logLabel}' at route '${route}' (chunk ${chunk.id})`));
427
+ globals.addOpenapiOutput({
428
+ url: route,
429
+ method: "POST",
430
+ path: route,
431
+ headers: {
432
+ Accept: "text/x-component",
433
+ "next-action": entry.actionId,
434
+ "Content-Type": "text/plain;charset=UTF-8",
435
+ },
436
+ body,
437
+ chunkId: chunk.id,
438
+ functionFile: defAbsFile,
439
+ functionFileLine: entry.line,
440
+ summary: entry.actionName,
441
+ serverActionCallChunkId: callSite === null || callSite === void 0 ? void 0 : callSite.chunkId,
442
+ serverActionCallFile: callSite === null || callSite === void 0 ? void 0 : callSite.absFile,
443
+ serverActionCallLine: callSite === null || callSite === void 0 ? void 0 : callSite.line,
444
+ });
445
+ }
446
+ }
447
+ });
448
+ export default resolveServerActions;
449
+ //# sourceMappingURL=resolveServerActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveServerActions.js","sourceRoot":"","sources":["../../../src/map/next_js/resolveServerActions.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,63 @@
1
1
  import parser from "@babel/parser";
2
2
  import _traverse from "@babel/traverse";
3
3
  const traverse = _traverse.default;
4
+ /**
5
+ * Builds a dotted identifier path from a chain of MemberExpression nodes
6
+ * rooted at an Identifier. Returns null when the chain contains computed
7
+ * properties, non-Identifier nodes, or anything we can't render as `a.b.c`.
8
+ */
9
+ export const memberChainToString = (node) => {
10
+ var _a;
11
+ if (!node)
12
+ return null;
13
+ if (node.type === "Identifier")
14
+ return node.name;
15
+ if (node.type === "MemberExpression" && !node.computed && ((_a = node.property) === null || _a === void 0 ? void 0 : _a.type) === "Identifier") {
16
+ const obj = memberChainToString(node.object);
17
+ if (!obj)
18
+ return null;
19
+ return `${obj}.${node.property.name}`;
20
+ }
21
+ return null;
22
+ };
23
+ /**
24
+ * Produces a short human-readable label for a spread argument we couldn't fully
25
+ * resolve. Identifiers keep their name; member chains collapse into `a.b.c`;
26
+ * call expressions show their callee name with `()`. Anything else falls back
27
+ * to the AST node type so the placeholder still signals *something* was there.
28
+ */
29
+ const describeSpreadArg = (arg) => {
30
+ var _a, _b, _c, _d;
31
+ if (!arg)
32
+ return "unknown";
33
+ if (arg.type === "Identifier")
34
+ return arg.name;
35
+ if (arg.type === "MemberExpression") {
36
+ const parts = [];
37
+ let walker = arg;
38
+ while (walker &&
39
+ walker.type === "MemberExpression" &&
40
+ !walker.computed &&
41
+ ((_a = walker.property) === null || _a === void 0 ? void 0 : _a.type) === "Identifier") {
42
+ parts.unshift(walker.property.name);
43
+ walker = walker.object;
44
+ }
45
+ if (walker && walker.type === "Identifier")
46
+ parts.unshift(walker.name);
47
+ if (parts.length > 0)
48
+ return parts.join(".");
49
+ return "member";
50
+ }
51
+ if (arg.type === "CallExpression") {
52
+ if (((_b = arg.callee) === null || _b === void 0 ? void 0 : _b.type) === "Identifier")
53
+ return `${arg.callee.name}()`;
54
+ if (((_c = arg.callee) === null || _c === void 0 ? void 0 : _c.type) === "MemberExpression" && ((_d = arg.callee.property) === null || _d === void 0 ? void 0 : _d.type) === "Identifier") {
55
+ return `${arg.callee.property.name}()`;
56
+ }
57
+ return "call()";
58
+ }
59
+ return arg.type;
60
+ };
4
61
  /**
5
62
  * Resolves a variable in a chunk by finding its declaration/assignment.
6
63
  *
@@ -967,8 +1024,23 @@ export const resolveNodeValue = (initialNode, scope, nodeCode, callType, chunkCo
967
1024
  }
968
1025
  }
969
1026
  else if (prop.type === "SpreadElement") {
970
- // Skip unresolvable spread elements they're code artifacts,
971
- // not actual body fields.
1027
+ // Resolve the spread argument; if it's a known object, merge its
1028
+ // keys. Otherwise surface the spread as a sentinel key so the
1029
+ // downstream body shape advertises that there are unresolvable
1030
+ // additional fields, rather than silently shrinking the body.
1031
+ const spreadResolved = resolveNodeValue(prop.argument, scope, "", callType, chunkCode, chunks, thirdArgName);
1032
+ if (spreadResolved &&
1033
+ typeof spreadResolved === "object" &&
1034
+ !Array.isArray(spreadResolved)) {
1035
+ for (const [sk, sv] of Object.entries(spreadResolved)) {
1036
+ if (!(sk in obj))
1037
+ obj[sk] = sv;
1038
+ }
1039
+ }
1040
+ else {
1041
+ const argName = describeSpreadArg(prop.argument);
1042
+ obj[`...${argName}`] = "<spread>";
1043
+ }
972
1044
  }
973
1045
  }
974
1046
  return obj;
@@ -1061,10 +1133,17 @@ export const resolveNodeValue = (initialNode, scope, nodeCode, callType, chunkCo
1061
1133
  if (typeof spreadObj === "object" && spreadObj !== null) {
1062
1134
  Object.assign(obj, spreadObj);
1063
1135
  }
1136
+ else {
1137
+ // Couldn't resolve to a concrete object — keep the spread visible
1138
+ // in the output so callers know fields are missing.
1139
+ const argName = describeSpreadArg(prop.argument);
1140
+ obj[`...${argName}`] = "<spread>";
1141
+ }
1064
1142
  }
1065
1143
  }
1066
1144
  return obj;
1067
1145
  }
1146
+ case "OptionalMemberExpression":
1068
1147
  case "MemberExpression": {
1069
1148
  // Handle deeply-nested webpack chunk imports by flattening the chain:
1070
1149
  // s.h.NEXT_OKTA_VALIDATE_USER -> resolveWebpackChunkImport("s", ..., ["h", "NEXT_OKTA_VALIDATE_USER"])
@@ -1289,6 +1368,14 @@ export const resolveNodeValue = (initialNode, scope, nodeCode, callType, chunkCo
1289
1368
  currentNode.callee.name === "URLSearchParams" &&
1290
1369
  currentNode.arguments.length > 0) {
1291
1370
  const spArg = currentNode.arguments[0];
1371
+ // If the argument is a plain MemberExpression like `a.b`,
1372
+ // emit a typed marker so the downstream caller-substitution
1373
+ // pass knows this part of the URL is a query expansion of
1374
+ // an object reference, not just an inert placeholder.
1375
+ const memberChain = memberChainToString(spArg);
1376
+ if (memberChain && spArg.type === "MemberExpression" && !spArg.computed) {
1377
+ return `[urlsearchparams:${memberChain}]`;
1378
+ }
1292
1379
  if (spArg.type === "ObjectExpression") {
1293
1380
  const params = [];
1294
1381
  for (const prop of spArg.properties) {