@shriyanss/js-recon 1.2.2-alpha.2 → 1.2.2-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/CHANGELOG.md +35 -0
- package/build/endpoints/index.js +1 -0
- package/build/endpoints/index.js.map +1 -1
- package/build/globalConfig.js +2 -1
- package/build/globalConfig.js.map +1 -1
- package/build/index.js +3 -1
- package/build/index.js.map +1 -1
- package/build/lazyLoad/downloadFilesUtil.js +7 -4
- package/build/lazyLoad/downloadFilesUtil.js.map +1 -1
- package/build/lazyLoad/index.js +87 -2
- package/build/lazyLoad/index.js.map +1 -1
- package/build/lazyLoad/next_js/next_GetLazyResourcesBuildManifestJs.js +32 -23
- package/build/lazyLoad/next_js/next_GetLazyResourcesBuildManifestJs.js.map +1 -1
- package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js +1 -1
- package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js.map +1 -1
- package/build/lazyLoad/next_js/next_buildId.js +9 -1
- package/build/lazyLoad/next_js/next_buildId.js.map +1 -1
- package/build/lazyLoad/sourcemap.js +188 -0
- package/build/lazyLoad/sourcemap.js.map +1 -0
- package/build/lazyLoad/techDetect/index.js +49 -3
- package/build/lazyLoad/techDetect/index.js.map +1 -1
- package/build/lazyLoad/vue/vue_RuntimeJs.js +101 -0
- package/build/lazyLoad/vue/vue_RuntimeJs.js.map +1 -0
- package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js +96 -0
- package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js.map +1 -0
- package/build/lazyLoad/vue/vue_jsImports.js +65 -0
- package/build/lazyLoad/vue/vue_jsImports.js.map +1 -0
- package/build/lazyLoad/vue/vue_reconstructSourceMaps.js +56 -0
- package/build/lazyLoad/vue/vue_reconstructSourceMaps.js.map +1 -0
- package/build/lazyLoad/vue/vue_sourcemapExtract.js +166 -0
- package/build/lazyLoad/vue/vue_sourcemapExtract.js.map +1 -0
- package/build/map/next_js/getAxiosInstances.js +1 -1
- package/build/map/next_js/getAxiosInstances.js.map +1 -1
- package/build/map/next_js/getWebpackConnections.js +1 -1
- package/build/map/next_js/getWebpackConnections.js.map +1 -1
- package/build/map/next_js/interactive_helpers/commandHelpers.js +1 -1
- package/build/map/next_js/interactive_helpers/commandHelpers.js.map +1 -1
- package/build/map/next_js/resolveAxios.js +61 -17
- package/build/map/next_js/resolveAxios.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/directCallsWithoutAssignment.js +48 -0
- package/build/map/next_js/resolveAxiosHelpers/directCallsWithoutAssignment.js.map +1 -0
- package/build/map/next_js/resolveAxiosHelpers/findAxiosClients.js +8 -8
- package/build/map/next_js/resolveAxiosHelpers/findAxiosClients.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js +302 -0
- package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js.map +1 -0
- package/build/map/next_js/resolveAxiosHelpers/handleAxiosCreate.js +48 -8
- package/build/map/next_js/resolveAxiosHelpers/handleAxiosCreate.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/handleZDotCreate.js +261 -0
- package/build/map/next_js/resolveAxiosHelpers/handleZDotCreate.js.map +1 -0
- package/build/map/next_js/resolveAxiosHelpers/processAxiosCall.js +10 -3
- package/build/map/next_js/resolveAxiosHelpers/processAxiosCall.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/processDirectAxiosCall.js +113 -0
- package/build/map/next_js/resolveAxiosHelpers/processDirectAxiosCall.js.map +1 -0
- package/build/map/next_js/resolveAxiosHelpers/processExportedEndpoints.js +274 -0
- package/build/map/next_js/resolveAxiosHelpers/processExportedEndpoints.js.map +1 -0
- package/build/map/next_js/resolveAxiosHelpers/traceAxiosInstanceExports.js +506 -0
- package/build/map/next_js/resolveAxiosHelpers/traceAxiosInstanceExports.js.map +1 -0
- package/build/map/next_js/resolveFetch.js +243 -4
- package/build/map/next_js/resolveFetch.js.map +1 -1
- package/build/map/next_js/utils.js +867 -11
- package/build/map/next_js/utils.js.map +1 -1
- package/build/run/index.js +11 -6
- package/build/run/index.js.map +1 -1
- package/build/utility/globals.js.map +1 -1
- package/build/utility/makeReq.js +4 -0
- package/build/utility/makeReq.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import _traverse from "@babel/traverse";
|
|
2
|
+
import { getHttpMethodWithForm } from "./handleZDotCreate.js";
|
|
3
|
+
import { astNodeToJsonString } from "./astNodeToJsonString.js";
|
|
4
|
+
import * as fs from "fs";
|
|
5
|
+
import * as globals from "../../../utility/globals.js";
|
|
6
|
+
import chalk from "chalk";
|
|
7
|
+
import { findCrossChunkParameters } from "./findCrossChunkParams.js";
|
|
8
|
+
const traverse = _traverse.default;
|
|
9
|
+
/**
|
|
10
|
+
* Process exported functions that wrap axios HTTP methods.
|
|
11
|
+
* This function looks for patterns where exported functions call axios methods with endpoints.
|
|
12
|
+
*
|
|
13
|
+
* @param {string} axiosInstance - The variable name of the axios instance created with Z.create().
|
|
14
|
+
* @param {string} chunkCode - The code of the chunk.
|
|
15
|
+
* @param {string} directory - The directory of the chunk file.
|
|
16
|
+
* @param {string} chunkName - The name of the chunk.
|
|
17
|
+
* @param {Chunks} chunks - A dictionary of chunk names to chunk objects.
|
|
18
|
+
* @param {any} ast - The abstract syntax tree of the chunk.
|
|
19
|
+
*/
|
|
20
|
+
export const processExportedEndpoints = (axiosInstance, chunkCode, directory, chunkName, chunks, ast) => {
|
|
21
|
+
// Variables to track exports and their corresponding function variables
|
|
22
|
+
const exportMap = {};
|
|
23
|
+
const axiosMethodVars = {};
|
|
24
|
+
let axiosMethodsFound = false;
|
|
25
|
+
// Step 1: Find the destructuring assignment for axios methods
|
|
26
|
+
// Example: let {request: s, get: o, post: a} = i
|
|
27
|
+
traverse(ast, {
|
|
28
|
+
VariableDeclarator(path) {
|
|
29
|
+
if (path.node.init &&
|
|
30
|
+
path.node.init.type === "Identifier" &&
|
|
31
|
+
path.node.init.name === axiosInstance &&
|
|
32
|
+
path.node.id.type === "ObjectPattern") {
|
|
33
|
+
// Found the destructuring of the axios instance
|
|
34
|
+
axiosMethodsFound = true;
|
|
35
|
+
for (const prop of path.node.id.properties) {
|
|
36
|
+
if (prop.type === "ObjectProperty" &&
|
|
37
|
+
prop.key.type === "Identifier" &&
|
|
38
|
+
prop.value.type === "Identifier") {
|
|
39
|
+
const methodName = prop.key.name; // e.g., "get", "post"
|
|
40
|
+
const varName = prop.value.name; // e.g., "o", "a"
|
|
41
|
+
// Store the mapping of variable names to HTTP methods
|
|
42
|
+
axiosMethodVars[varName] = methodName;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
if (!axiosMethodsFound) {
|
|
49
|
+
return; // No axios method destructuring found
|
|
50
|
+
}
|
|
51
|
+
// Step 2: Find the exports and their corresponding variable names
|
|
52
|
+
// Example: n.d(t, { FX: function() { return l } })
|
|
53
|
+
traverse(ast, {
|
|
54
|
+
CallExpression(path) {
|
|
55
|
+
const callee = path.node.callee;
|
|
56
|
+
if (callee.type === "MemberExpression" &&
|
|
57
|
+
callee.object.type === "Identifier" &&
|
|
58
|
+
callee.property.type === "Identifier" &&
|
|
59
|
+
callee.property.name === "d" &&
|
|
60
|
+
path.node.arguments.length >= 2 &&
|
|
61
|
+
path.node.arguments[1].type === "ObjectExpression") {
|
|
62
|
+
// This is likely the n.d(t, {exports}) pattern
|
|
63
|
+
const exportsObj = path.node.arguments[1];
|
|
64
|
+
for (const prop of exportsObj.properties) {
|
|
65
|
+
if (prop.type === "ObjectProperty" &&
|
|
66
|
+
(prop.value.type === "FunctionExpression" || prop.value.type === "ArrowFunctionExpression")) {
|
|
67
|
+
// Get the export name
|
|
68
|
+
let exportName = "";
|
|
69
|
+
if (prop.key.type === "Identifier") {
|
|
70
|
+
exportName = prop.key.name;
|
|
71
|
+
}
|
|
72
|
+
else if (prop.key.type === "StringLiteral") {
|
|
73
|
+
exportName = prop.key.value;
|
|
74
|
+
}
|
|
75
|
+
// Find the return statement in the function body
|
|
76
|
+
if (prop.value.body && prop.value.body.type === "BlockStatement") {
|
|
77
|
+
for (const stmt of prop.value.body.body) {
|
|
78
|
+
if (stmt.type === "ReturnStatement" &&
|
|
79
|
+
stmt.argument &&
|
|
80
|
+
stmt.argument.type === "Identifier") {
|
|
81
|
+
// Map the export name to its returned variable
|
|
82
|
+
exportMap[exportName] = stmt.argument.name;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else if (prop.value.body && prop.value.body.type === "Identifier") {
|
|
87
|
+
// Arrow function with implicit return
|
|
88
|
+
exportMap[exportName] = prop.value.body.name;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
// Step 3: Find the variable declarations for the exported functions
|
|
96
|
+
// Example: l = () => o("/something")
|
|
97
|
+
for (const exportKey in exportMap) {
|
|
98
|
+
const varName = exportMap[exportKey];
|
|
99
|
+
traverse(ast, {
|
|
100
|
+
AssignmentExpression(path) {
|
|
101
|
+
if (path.node.left.type === "Identifier" &&
|
|
102
|
+
path.node.left.name === varName &&
|
|
103
|
+
(path.node.right.type === "ArrowFunctionExpression" ||
|
|
104
|
+
path.node.right.type === "FunctionExpression")) {
|
|
105
|
+
const funcExpr = path.node.right;
|
|
106
|
+
let callExpr;
|
|
107
|
+
// Handle different function body types
|
|
108
|
+
if (funcExpr.body.type === "BlockStatement") {
|
|
109
|
+
// Function with block body, look for return statement
|
|
110
|
+
for (const stmt of funcExpr.body.body) {
|
|
111
|
+
if (stmt.type === "ReturnStatement" &&
|
|
112
|
+
stmt.argument &&
|
|
113
|
+
stmt.argument.type === "CallExpression") {
|
|
114
|
+
callExpr = stmt.argument;
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
else if (funcExpr.body.type === "CallExpression") {
|
|
120
|
+
// Arrow function with implicit return
|
|
121
|
+
callExpr = funcExpr.body;
|
|
122
|
+
}
|
|
123
|
+
if (callExpr && callExpr.callee.type === "Identifier" && axiosMethodVars[callExpr.callee.name]) {
|
|
124
|
+
// Found an axios method call, extract endpoint details
|
|
125
|
+
const axiosMethodVar = callExpr.callee.name;
|
|
126
|
+
const axiosMethod = axiosMethodVars[axiosMethodVar];
|
|
127
|
+
const httpMethod = getHttpMethodWithForm(axiosMethod);
|
|
128
|
+
if (!httpMethod) {
|
|
129
|
+
return; // Skip if HTTP method is not recognized
|
|
130
|
+
}
|
|
131
|
+
let endpoint = "";
|
|
132
|
+
let params = "";
|
|
133
|
+
// Extract the URL/endpoint
|
|
134
|
+
if (callExpr.arguments.length > 0) {
|
|
135
|
+
if (callExpr.arguments[0].type === "StringLiteral") {
|
|
136
|
+
endpoint = callExpr.arguments[0].value;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
endpoint = astNodeToJsonString(callExpr.arguments[0], chunkCode);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Extract parameters/body if present
|
|
143
|
+
if (callExpr.arguments.length > 1) {
|
|
144
|
+
params = astNodeToJsonString(callExpr.arguments[1], chunkCode);
|
|
145
|
+
}
|
|
146
|
+
// Find line number in source file
|
|
147
|
+
const functionFile = `${directory}/${chunks[chunkName].file}`;
|
|
148
|
+
const codeFileContent = fs.readFileSync(functionFile, "utf-8");
|
|
149
|
+
let functionFileLine = -1;
|
|
150
|
+
// Extract the code snippet for this arrow function
|
|
151
|
+
const arrowFuncSnippet = chunkCode.substring(path.node.start, path.node.end);
|
|
152
|
+
// Look for this snippet in the file
|
|
153
|
+
const lines = codeFileContent.split("\n");
|
|
154
|
+
for (let i = 0; i < lines.length; i++) {
|
|
155
|
+
if (lines[i].includes(arrowFuncSnippet.trim().substring(0, Math.min(arrowFuncSnippet.length, 30)))) {
|
|
156
|
+
functionFileLine = i + 1;
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// Log the found exported endpoint
|
|
161
|
+
console.log(chalk.cyan(`[+] Found exported endpoint '${exportKey}' in chunk ${chunkName} ("${functionFile}":${functionFileLine})`));
|
|
162
|
+
console.log(chalk.yellow(` Export: ${exportKey} => ${varName}`));
|
|
163
|
+
console.log(chalk.green(` URL: ${endpoint}`));
|
|
164
|
+
console.log(chalk.green(` Method: ${httpMethod}`));
|
|
165
|
+
if (params) {
|
|
166
|
+
console.log(chalk.green(` Params/Body: ${params}`));
|
|
167
|
+
}
|
|
168
|
+
// Find cross-chunk parameters for this endpoint
|
|
169
|
+
const crossChunkParams = findCrossChunkParameters(chunkName, exportKey, chunks, directory);
|
|
170
|
+
// Add to the API collection
|
|
171
|
+
globals.addOpenapiOutput({
|
|
172
|
+
url: endpoint || "",
|
|
173
|
+
method: httpMethod || "",
|
|
174
|
+
path: endpoint || "",
|
|
175
|
+
headers: {}, // Headers would typically be set at the axios instance level
|
|
176
|
+
body: params || "",
|
|
177
|
+
chunkId: chunkName,
|
|
178
|
+
functionFile: functionFile,
|
|
179
|
+
functionFileLine: functionFileLine,
|
|
180
|
+
crossChunkParams: crossChunkParams,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
VariableDeclarator(path) {
|
|
186
|
+
if (path.node.id.type === "Identifier" &&
|
|
187
|
+
path.node.id.name === varName &&
|
|
188
|
+
path.node.init &&
|
|
189
|
+
(path.node.init.type === "ArrowFunctionExpression" || path.node.init.type === "FunctionExpression")) {
|
|
190
|
+
const funcExpr = path.node.init;
|
|
191
|
+
let callExpr;
|
|
192
|
+
// Handle different function body types
|
|
193
|
+
if (funcExpr.body.type === "BlockStatement") {
|
|
194
|
+
// Function with block body, look for return statement
|
|
195
|
+
for (const stmt of funcExpr.body.body) {
|
|
196
|
+
if (stmt.type === "ReturnStatement" &&
|
|
197
|
+
stmt.argument &&
|
|
198
|
+
stmt.argument.type === "CallExpression") {
|
|
199
|
+
callExpr = stmt.argument;
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
else if (funcExpr.body.type === "CallExpression") {
|
|
205
|
+
// Arrow function with implicit return
|
|
206
|
+
callExpr = funcExpr.body;
|
|
207
|
+
}
|
|
208
|
+
if (callExpr && callExpr.callee.type === "Identifier" && axiosMethodVars[callExpr.callee.name]) {
|
|
209
|
+
// Found an axios method call, extract endpoint details
|
|
210
|
+
const axiosMethodVar = callExpr.callee.name;
|
|
211
|
+
const axiosMethod = axiosMethodVars[axiosMethodVar];
|
|
212
|
+
const httpMethod = getHttpMethodWithForm(axiosMethod);
|
|
213
|
+
if (!httpMethod) {
|
|
214
|
+
return; // Skip if HTTP method is not recognized
|
|
215
|
+
}
|
|
216
|
+
let endpoint = "";
|
|
217
|
+
let params = "";
|
|
218
|
+
// Extract the URL/endpoint
|
|
219
|
+
if (callExpr.arguments.length > 0) {
|
|
220
|
+
if (callExpr.arguments[0].type === "StringLiteral") {
|
|
221
|
+
endpoint = callExpr.arguments[0].value;
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
endpoint = astNodeToJsonString(callExpr.arguments[0], chunkCode);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// Extract parameters/body if present
|
|
228
|
+
if (callExpr.arguments.length > 1) {
|
|
229
|
+
params = astNodeToJsonString(callExpr.arguments[1], chunkCode);
|
|
230
|
+
}
|
|
231
|
+
// Find line number in source file
|
|
232
|
+
const functionFile = `${directory}/${chunks[chunkName].file}`;
|
|
233
|
+
const codeFileContent = fs.readFileSync(functionFile, "utf-8");
|
|
234
|
+
let functionFileLine = -1;
|
|
235
|
+
// Extract the code snippet for this variable declaration
|
|
236
|
+
const varDeclSnippet = chunkCode.substring(path.node.start, path.node.end);
|
|
237
|
+
// Look for this snippet in the file
|
|
238
|
+
const lines = codeFileContent.split("\n");
|
|
239
|
+
for (let i = 0; i < lines.length; i++) {
|
|
240
|
+
if (lines[i].includes(varDeclSnippet.trim().substring(0, Math.min(varDeclSnippet.length, 30)))) {
|
|
241
|
+
functionFileLine = i + 1;
|
|
242
|
+
break;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// Log the found exported endpoint
|
|
246
|
+
console.log(chalk.cyan(`[+] Found exported endpoint '${exportKey}' in chunk ${chunkName} ("${functionFile}":${functionFileLine})`));
|
|
247
|
+
console.log(chalk.yellow(` Export: ${exportKey} => ${varName}`));
|
|
248
|
+
console.log(chalk.green(` URL: ${endpoint}`));
|
|
249
|
+
console.log(chalk.green(` Method: ${httpMethod}`));
|
|
250
|
+
if (params) {
|
|
251
|
+
console.log(chalk.green(` Params/Body: ${params}`));
|
|
252
|
+
}
|
|
253
|
+
// Find cross-chunk parameters for this endpoint
|
|
254
|
+
const crossChunkParams = findCrossChunkParameters(chunkName, exportKey, chunks, directory);
|
|
255
|
+
// Add to the API collection
|
|
256
|
+
globals.addOpenapiOutput({
|
|
257
|
+
url: endpoint || "",
|
|
258
|
+
method: httpMethod || "",
|
|
259
|
+
path: endpoint || "",
|
|
260
|
+
headers: {}, // Headers would typically be set at the axios instance level
|
|
261
|
+
body: params || "",
|
|
262
|
+
chunkId: chunkName,
|
|
263
|
+
functionFile: functionFile,
|
|
264
|
+
functionFileLine: functionFileLine,
|
|
265
|
+
crossChunkParams: crossChunkParams,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
},
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
export default processExportedEndpoints;
|
|
274
|
+
//# sourceMappingURL=processExportedEndpoints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processExportedEndpoints.js","sourceRoot":"","sources":["../../../../src/map/next_js/resolveAxiosHelpers/processExportedEndpoints.ts"],"names":[],"mappings":"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"}
|