@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
|
@@ -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
|
-
//
|
|
971
|
-
//
|
|
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) {
|