@js-recon/js-recon 1.4.1-beta.1 → 1.4.1
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/.claude-sync/capture-new.sh +61 -0
- package/.claude-sync/capture-scan.sh +55 -0
- package/.claude-sync/hooks/post-checkout +16 -0
- package/.claude-sync/hooks/post-merge +4 -0
- package/.claude-sync/hooks/pre-commit +3 -0
- package/.claude-sync/merge-agentic.sh +77 -0
- package/.claude-sync/setup.sh +17 -0
- package/.claude-sync/sync.sh +64 -0
- package/.claude-sync/watch.sh +17 -0
- package/.github/workflows/build-and-prettify.yaml +40 -0
- package/.github/workflows/promote-js-recon.yml +154 -10
- package/.vscode/tasks.json +42 -0
- package/CHANGELOG.md +27 -0
- package/Dockerfile.w-rules +13 -0
- package/README.md +1 -1
- package/build/analyze/helpers/initRules.js +27 -5
- package/build/analyze/helpers/initRules.js.map +1 -1
- package/build/analyze/index.js +3 -2
- package/build/analyze/index.js.map +1 -1
- package/build/completion/index.js +17 -11
- package/build/completion/index.js.map +1 -1
- package/build/globalConfig.js +1 -1
- package/build/globalConfig.js.map +1 -1
- package/build/index.js +55 -23
- package/build/index.js.map +1 -1
- package/build/lazyLoad/angular/angular_getFromMainJs.js +11 -29
- package/build/lazyLoad/angular/angular_getFromMainJs.js.map +1 -1
- package/build/lazyLoad/angular/angular_recursiveChunkImports.js +104 -0
- package/build/lazyLoad/angular/angular_recursiveChunkImports.js.map +1 -0
- package/build/lazyLoad/generic/generic_jsMimeTypes.js +19 -0
- package/build/lazyLoad/generic/generic_jsMimeTypes.js.map +1 -0
- package/build/lazyLoad/index.js +16 -9
- package/build/lazyLoad/index.js.map +1 -1
- package/build/lazyLoad/methodFilter.js +1 -1
- package/build/lazyLoad/methodFilter.js.map +1 -1
- package/build/lazyLoad/next_js/NextJsCrawler.js +5 -5
- package/build/lazyLoad/next_js/NextJsCrawler.js.map +1 -1
- package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js +17 -10
- package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js.map +1 -1
- package/build/lazyLoad/next_js/next_bruteForceJsFiles.js +4 -3
- package/build/lazyLoad/next_js/next_bruteForceJsFiles.js.map +1 -1
- package/build/lazyLoad/next_js/next_parseLayoutJs.js +31 -31
- package/build/lazyLoad/next_js/next_parseLayoutJs.js.map +1 -1
- package/build/lazyLoad/next_js/next_promiseResolve.js +4 -3
- package/build/lazyLoad/next_js/next_promiseResolve.js.map +1 -1
- package/build/lazyLoad/next_js/next_scriptTagsSubsequentRequests.js +7 -8
- package/build/lazyLoad/next_js/next_scriptTagsSubsequentRequests.js.map +1 -1
- package/build/lazyLoad/nuxt_js/nuxt_stringAnalysisJSFiles.js +6 -7
- package/build/lazyLoad/nuxt_js/nuxt_stringAnalysisJSFiles.js.map +1 -1
- package/build/lazyLoad/react/react_followImports.js +9 -8
- package/build/lazyLoad/react/react_followImports.js.map +1 -1
- package/build/lazyLoad/react/react_sourcemapUrls.js +5 -11
- package/build/lazyLoad/react/react_sourcemapUrls.js.map +1 -1
- package/build/lazyLoad/react/react_webpackChunkPaths.js +7 -6
- package/build/lazyLoad/react/react_webpackChunkPaths.js.map +1 -1
- package/build/lazyLoad/svelte/svelte_discoverPagesFromJs.js +13 -12
- package/build/lazyLoad/svelte/svelte_discoverPagesFromJs.js.map +1 -1
- package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js +6 -7
- package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js.map +1 -1
- package/build/lazyLoad/techDetect/checkInterceptedEvidence.js +18 -0
- package/build/lazyLoad/techDetect/checkInterceptedEvidence.js.map +1 -0
- package/build/lazyLoad/techDetect/index.js +58 -13
- package/build/lazyLoad/techDetect/index.js.map +1 -1
- package/build/lazyLoad/vue/vue_discoverJsFiles.js +6 -6
- package/build/lazyLoad/vue/vue_discoverJsFiles.js.map +1 -1
- package/build/lazyLoad/vue/vue_getClientSidePaths.js +8 -7
- package/build/lazyLoad/vue/vue_getClientSidePaths.js.map +1 -1
- package/build/lazyLoad/vue/vue_jsImports.js +16 -16
- package/build/lazyLoad/vue/vue_jsImports.js.map +1 -1
- package/build/lazyLoad/vue/vue_reconstructSourceMaps.js +5 -4
- package/build/lazyLoad/vue/vue_reconstructSourceMaps.js.map +1 -1
- package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js +8 -1
- package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js.map +1 -1
- package/build/lazyLoad/vue/vue_stringJsFiles.js +15 -8
- package/build/lazyLoad/vue/vue_stringJsFiles.js.map +1 -1
- package/build/lazyLoad/vue/vue_viteMapDeps.js +6 -5
- package/build/lazyLoad/vue/vue_viteMapDeps.js.map +1 -1
- package/build/mcp/mcpServer.js +1 -2
- package/build/mcp/mcpServer.js.map +1 -1
- package/build/mcp/tools.js +1 -2
- package/build/mcp/tools.js.map +1 -1
- package/build/proxy/awsConfig.js +45 -0
- package/build/proxy/awsConfig.js.map +1 -0
- package/build/proxy/checkFeasibility.js.map +1 -0
- package/build/proxy/checkFireWallBlocking.js.map +1 -0
- package/build/proxy/configFile.js +31 -0
- package/build/proxy/configFile.js.map +1 -0
- package/build/{api_gateway → proxy}/genReq.js +4 -5
- package/build/proxy/genReq.js.map +1 -0
- package/build/proxy/genericProxy.js +21 -0
- package/build/proxy/genericProxy.js.map +1 -0
- package/build/proxy/index.js +421 -0
- package/build/proxy/index.js.map +1 -0
- package/build/proxy/oxylabsProxy.js +34 -0
- package/build/proxy/oxylabsProxy.js.map +1 -0
- package/build/proxy/resolveProxyConfig.js +38 -0
- package/build/proxy/resolveProxyConfig.js.map +1 -0
- package/build/refactor/index.js +23 -28
- package/build/refactor/index.js.map +1 -1
- package/build/report/utility/initGlobalReportDb.js +111 -0
- package/build/report/utility/initGlobalReportDb.js.map +1 -0
- package/build/report/utility/mergeDomainIntoGlobalDb.js +39 -0
- package/build/report/utility/mergeDomainIntoGlobalDb.js.map +1 -0
- package/build/run/index.js +129 -75
- package/build/run/index.js.map +1 -1
- package/build/run/interruptHandler.js +17 -1
- package/build/run/interruptHandler.js.map +1 -1
- package/build/utility/concurrency.js +35 -0
- package/build/utility/concurrency.js.map +1 -0
- package/build/utility/configureProxy.js +60 -0
- package/build/utility/configureProxy.js.map +1 -0
- package/build/utility/globals.js +108 -13
- package/build/utility/globals.js.map +1 -1
- package/build/utility/makeReq.js +103 -10
- package/build/utility/makeReq.js.map +1 -1
- package/package.json +9 -2
- package/patches/puppeteer-extra-plugin-user-data-dir+2.4.1.patch +31 -0
- package/CLAUDE.md +0 -641
- package/build/api_gateway/checkFeasibility.js.map +0 -1
- package/build/api_gateway/checkFireWallBlocking.js.map +0 -1
- package/build/api_gateway/genReq.js.map +0 -1
- package/build/api_gateway/index.js +0 -291
- package/build/api_gateway/index.js.map +0 -1
- /package/build/{api_gateway → proxy}/checkFeasibility.js +0 -0
- /package/build/{api_gateway → proxy}/checkFireWallBlocking.js +0 -0
|
@@ -0,0 +1,421 @@
|
|
|
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 inquirer from "inquirer";
|
|
12
|
+
import { APIGatewayClient, CreateRestApiCommand, DeleteRestApiCommand } from "@aws-sdk/client-api-gateway";
|
|
13
|
+
import checkFeasibility from "./checkFeasibility.js";
|
|
14
|
+
import { readAwsGatewayMap, writeAwsGatewayMap } from "./awsConfig.js";
|
|
15
|
+
import { setActiveProxyMethod, writeMethodConfig } from "./configFile.js";
|
|
16
|
+
import { parseProxyUrl } from "./genericProxy.js";
|
|
17
|
+
import { composeOxylabsUsername } from "./oxylabsProxy.js";
|
|
18
|
+
const VALID_PROXY_METHODS = ["aws", "socks", "http", "oxylabs"];
|
|
19
|
+
// read the docs for all the methods for api gateway at https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/api-gateway/
|
|
20
|
+
// for the rate limits, refer to https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html
|
|
21
|
+
/**
|
|
22
|
+
* Selects a random AWS region from the available API Gateway regions.
|
|
23
|
+
*
|
|
24
|
+
* @returns A randomly selected AWS region identifier
|
|
25
|
+
*/
|
|
26
|
+
const randomRegion = () => {
|
|
27
|
+
const apiGatewayRegions = [
|
|
28
|
+
"us-east-2", // US East (Ohio)
|
|
29
|
+
"us-east-1", // US East (N. Virginia)
|
|
30
|
+
"us-west-1", // US West (N. California)
|
|
31
|
+
"us-west-2", // US West (Oregon)
|
|
32
|
+
"af-south-1", // Africa (Cape Town)
|
|
33
|
+
"ap-east-1", // Asia Pacific (Hong Kong)
|
|
34
|
+
"ap-south-2", // Asia Pacific (Hyderabad)
|
|
35
|
+
"ap-southeast-3", // Asia Pacific (Jakarta)
|
|
36
|
+
"ap-southeast-5", // Asia Pacific (Malaysia)
|
|
37
|
+
"ap-southeast-4", // Asia Pacific (Melbourne)
|
|
38
|
+
"ap-south-1", // Asia Pacific (Mumbai)
|
|
39
|
+
"ap-northeast-3", // Asia Pacific (Osaka)
|
|
40
|
+
"ap-northeast-2", // Asia Pacific (Seoul)
|
|
41
|
+
"ap-southeast-1", // Asia Pacific (Singapore)
|
|
42
|
+
"ap-southeast-2", // Asia Pacific (Sydney)
|
|
43
|
+
"ap-east-2", // Asia Pacific (Taipei)
|
|
44
|
+
"ap-southeast-7", // Asia Pacific (Thailand)
|
|
45
|
+
"ap-northeast-1", // Asia Pacific (Tokyo)
|
|
46
|
+
"ca-central-1", // Canada (Central)
|
|
47
|
+
"ca-west-1", // Canada West (Calgary)
|
|
48
|
+
"eu-central-1", // Europe (Frankfurt)
|
|
49
|
+
"eu-west-1", // Europe (Ireland)
|
|
50
|
+
"eu-west-2", // Europe (London)
|
|
51
|
+
"eu-south-1", // Europe (Milan)
|
|
52
|
+
"eu-west-3", // Europe (Paris)
|
|
53
|
+
"eu-south-2", // Europe (Spain)
|
|
54
|
+
"eu-north-1", // Europe (Stockholm)
|
|
55
|
+
"eu-central-2", // Europe (Zurich)
|
|
56
|
+
"il-central-1", // Israel (Tel Aviv)
|
|
57
|
+
"mx-central-1", // Mexico (Central)
|
|
58
|
+
"me-south-1", // Middle East (Bahrain)
|
|
59
|
+
"me-central-1", // Middle East (UAE)
|
|
60
|
+
"sa-east-1", // South America (São Paulo)
|
|
61
|
+
];
|
|
62
|
+
return apiGatewayRegions[Math.floor(Math.random() * apiGatewayRegions.length)];
|
|
63
|
+
};
|
|
64
|
+
let aws_access_key;
|
|
65
|
+
let aws_secret_key;
|
|
66
|
+
let region;
|
|
67
|
+
let configFile = "";
|
|
68
|
+
/**
|
|
69
|
+
* Utility function to pause execution for a specified duration.
|
|
70
|
+
*
|
|
71
|
+
* @param ms - Number of milliseconds to sleep
|
|
72
|
+
* @returns Promise that resolves after the specified delay
|
|
73
|
+
*/
|
|
74
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
75
|
+
/**
|
|
76
|
+
* Create a new API Gateway.
|
|
77
|
+
*
|
|
78
|
+
* @async
|
|
79
|
+
* @returns {Promise<void>}
|
|
80
|
+
*/
|
|
81
|
+
const createGateway = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
82
|
+
console.log(chalk.cyan("[i] Creating API Gateway"));
|
|
83
|
+
const client = new APIGatewayClient({
|
|
84
|
+
region,
|
|
85
|
+
credentials: {
|
|
86
|
+
accessKeyId: aws_access_key,
|
|
87
|
+
secretAccessKey: aws_secret_key,
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
const apigw_created_at = Date.now();
|
|
91
|
+
const apigw_name = `js_recon-${apigw_created_at}-${Math.floor(Math.random() * 1000)}`;
|
|
92
|
+
const command = new CreateRestApiCommand({
|
|
93
|
+
name: apigw_name,
|
|
94
|
+
description: `API Gateway for JS Recon created at ${new Intl.DateTimeFormat("en-US", {
|
|
95
|
+
year: "numeric",
|
|
96
|
+
month: "long",
|
|
97
|
+
day: "2-digit",
|
|
98
|
+
hour: "2-digit",
|
|
99
|
+
minute: "2-digit",
|
|
100
|
+
second: "2-digit",
|
|
101
|
+
timeZoneName: "short",
|
|
102
|
+
}).format(apigw_created_at)}`,
|
|
103
|
+
endpointConfiguration: {
|
|
104
|
+
ipAddressType: "dualstack",
|
|
105
|
+
types: ["REGIONAL"],
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
const response = yield client.send(command);
|
|
109
|
+
yield sleep(3000);
|
|
110
|
+
console.log(chalk.green(`[✓] Created API Gateway`));
|
|
111
|
+
console.log(chalk.bgGreen("ID:"), chalk.green(response.id));
|
|
112
|
+
console.log(chalk.bgGreen("Name:"), chalk.green(apigw_name));
|
|
113
|
+
console.log(chalk.bgGreen("Region:"), chalk.green(region));
|
|
114
|
+
// load the existing aws gateway map, if any
|
|
115
|
+
const config = readAwsGatewayMap(configFile);
|
|
116
|
+
config[apigw_name] = {
|
|
117
|
+
id: response.id,
|
|
118
|
+
name: apigw_name,
|
|
119
|
+
description: response.description,
|
|
120
|
+
created_at: apigw_created_at,
|
|
121
|
+
region: region,
|
|
122
|
+
access_key: aws_access_key,
|
|
123
|
+
secret_key: aws_secret_key,
|
|
124
|
+
};
|
|
125
|
+
writeAwsGatewayMap(configFile, config);
|
|
126
|
+
console.log(chalk.green(`[✓] Config saved to ${configFile}`));
|
|
127
|
+
});
|
|
128
|
+
/**
|
|
129
|
+
* Destroy an API Gateway.
|
|
130
|
+
*
|
|
131
|
+
* @async
|
|
132
|
+
* @param {string} id - The ID of the API Gateway to destroy.
|
|
133
|
+
* @returns {Promise<void>}
|
|
134
|
+
*/
|
|
135
|
+
const destroyGateway = (id) => __awaiter(void 0, void 0, void 0, function* () {
|
|
136
|
+
console.log(chalk.cyan("[i] Destroying API Gateway"));
|
|
137
|
+
if (!id) {
|
|
138
|
+
console.error(chalk.red("[!] Please provide an API Gateway ID"));
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
// read the aws gateway map
|
|
142
|
+
let config = readAwsGatewayMap(configFile);
|
|
143
|
+
// get the name of the api gateway
|
|
144
|
+
let name = Object.keys(config).find((key) => config[key].id === id);
|
|
145
|
+
console.log(chalk.bgGreen("Name:"), chalk.green(name));
|
|
146
|
+
console.log(chalk.bgGreen("ID:"), chalk.green(id));
|
|
147
|
+
console.log(chalk.bgGreen("Region:"), chalk.green(config[name].region));
|
|
148
|
+
region = config[name].region;
|
|
149
|
+
const client = new APIGatewayClient({
|
|
150
|
+
region,
|
|
151
|
+
credentials: {
|
|
152
|
+
accessKeyId: aws_access_key,
|
|
153
|
+
secretAccessKey: aws_secret_key,
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
const command = new DeleteRestApiCommand({
|
|
157
|
+
restApiId: id,
|
|
158
|
+
});
|
|
159
|
+
yield client.send(command);
|
|
160
|
+
// remove from the config file
|
|
161
|
+
delete config[name];
|
|
162
|
+
writeAwsGatewayMap(configFile, config);
|
|
163
|
+
yield sleep(30000);
|
|
164
|
+
console.log(chalk.green(`[✓] Destroyed API Gateway: ${id}`));
|
|
165
|
+
});
|
|
166
|
+
/**
|
|
167
|
+
* Destroy all API Gateways.
|
|
168
|
+
*
|
|
169
|
+
* @async
|
|
170
|
+
* @returns {Promise<void>}
|
|
171
|
+
*/
|
|
172
|
+
const destroyAllGateways = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
173
|
+
console.log(chalk.cyan("[i] Destroying all API Gateways"));
|
|
174
|
+
// read the aws gateway map
|
|
175
|
+
let config = readAwsGatewayMap(configFile);
|
|
176
|
+
// destroy all the gateways
|
|
177
|
+
for (const [key, value] of Object.entries(config)) {
|
|
178
|
+
const client = new APIGatewayClient({
|
|
179
|
+
region: value.region,
|
|
180
|
+
credentials: {
|
|
181
|
+
accessKeyId: aws_access_key,
|
|
182
|
+
secretAccessKey: aws_secret_key,
|
|
183
|
+
},
|
|
184
|
+
});
|
|
185
|
+
console.log(chalk.cyan(`[i] Destroying API Gateway: ${key} : ${value.id} : ${value.region}`));
|
|
186
|
+
const command = new DeleteRestApiCommand({
|
|
187
|
+
restApiId: value.id,
|
|
188
|
+
});
|
|
189
|
+
yield sleep(30000);
|
|
190
|
+
yield client.send(command);
|
|
191
|
+
console.log(chalk.green(`[✓] Destroyed API Gateway: ${key} : ${value.id} : ${value.region}`));
|
|
192
|
+
}
|
|
193
|
+
// nullify the aws gateway map
|
|
194
|
+
writeAwsGatewayMap(configFile, {});
|
|
195
|
+
console.log(chalk.green("[✓] Destroyed all API Gateways"));
|
|
196
|
+
});
|
|
197
|
+
/**
|
|
198
|
+
* List all API Gateways.
|
|
199
|
+
*
|
|
200
|
+
* @async
|
|
201
|
+
* @returns {Promise<void>}
|
|
202
|
+
*/
|
|
203
|
+
const listGateways = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
204
|
+
console.log(chalk.cyan("[i] Listing all API Gateways"));
|
|
205
|
+
// read the aws gateway map
|
|
206
|
+
const config = readAwsGatewayMap(configFile);
|
|
207
|
+
// if list is empty
|
|
208
|
+
if (Object.keys(config).length === 0) {
|
|
209
|
+
console.error(chalk.red("[!] No API Gateways found"));
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
console.log(chalk.green("[✓] List of API Gateways"));
|
|
213
|
+
for (const [key, value] of Object.entries(config)) {
|
|
214
|
+
console.log(chalk.bgGreen("Name:"), chalk.green(key));
|
|
215
|
+
console.log(chalk.bgGreen("ID:"), chalk.green(value.id));
|
|
216
|
+
console.log(chalk.bgGreen("Region:"), chalk.green(value.region));
|
|
217
|
+
console.log("\n");
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
/** Masks a credential for secure display by showing only the first and last 4 characters. */
|
|
221
|
+
const keyMask = (key) => {
|
|
222
|
+
if (key.length < 6)
|
|
223
|
+
return key;
|
|
224
|
+
return key.slice(0, 4) + "..." + key.slice(-4);
|
|
225
|
+
};
|
|
226
|
+
/** Resolves the proxy method to configure: the `--proxy-method` flag if given, otherwise an interactive prompt. */
|
|
227
|
+
const promptProxyMethod = (methodInput) => __awaiter(void 0, void 0, void 0, function* () {
|
|
228
|
+
if (methodInput) {
|
|
229
|
+
if (!VALID_PROXY_METHODS.includes(methodInput)) {
|
|
230
|
+
throw new Error(`Invalid proxy method: ${methodInput}. Expected one of: ${VALID_PROXY_METHODS.join(", ")}`);
|
|
231
|
+
}
|
|
232
|
+
return methodInput;
|
|
233
|
+
}
|
|
234
|
+
const { method } = yield inquirer.prompt([
|
|
235
|
+
{
|
|
236
|
+
type: "list",
|
|
237
|
+
name: "method",
|
|
238
|
+
message: "Select proxy method to configure",
|
|
239
|
+
choices: [
|
|
240
|
+
{ name: "aws - AWS API Gateway IP rotation", value: "aws" },
|
|
241
|
+
{ name: "socks - Generic SOCKS5 proxy", value: "socks" },
|
|
242
|
+
{ name: "http - Generic HTTP proxy", value: "http" },
|
|
243
|
+
{ name: "oxylabs - Oxylabs datacenter proxy", value: "oxylabs" },
|
|
244
|
+
],
|
|
245
|
+
},
|
|
246
|
+
]);
|
|
247
|
+
return method;
|
|
248
|
+
});
|
|
249
|
+
/** Resolves the socks/http proxy URL: the `--proxy` flag if given (validated), otherwise an interactive prompt. */
|
|
250
|
+
const promptProxyUrl = (method, urlInput) => __awaiter(void 0, void 0, void 0, function* () {
|
|
251
|
+
if (urlInput) {
|
|
252
|
+
parseProxyUrl(urlInput);
|
|
253
|
+
return urlInput;
|
|
254
|
+
}
|
|
255
|
+
const example = method === "socks" ? "socks5://user:pass@host:1080" : "http://user:pass@host:8080";
|
|
256
|
+
const { url } = yield inquirer.prompt([
|
|
257
|
+
{
|
|
258
|
+
type: "input",
|
|
259
|
+
name: "url",
|
|
260
|
+
message: `${method === "socks" ? "SOCKS5" : "HTTP"} proxy URL (e.g. ${example})`,
|
|
261
|
+
validate: (value) => {
|
|
262
|
+
try {
|
|
263
|
+
parseProxyUrl(value);
|
|
264
|
+
return true;
|
|
265
|
+
}
|
|
266
|
+
catch (err) {
|
|
267
|
+
return err.message;
|
|
268
|
+
}
|
|
269
|
+
},
|
|
270
|
+
},
|
|
271
|
+
]);
|
|
272
|
+
return url;
|
|
273
|
+
});
|
|
274
|
+
/** Resolves the oxylabs config field-by-field: CLI flags where given, otherwise interactive prompts. */
|
|
275
|
+
const promptOxylabsConfig = (opts) => __awaiter(void 0, void 0, void 0, function* () {
|
|
276
|
+
const answers = yield inquirer.prompt([
|
|
277
|
+
{
|
|
278
|
+
type: "input",
|
|
279
|
+
name: "username",
|
|
280
|
+
message: "Oxylabs username",
|
|
281
|
+
when: !opts.oxylabsUsername,
|
|
282
|
+
validate: (value) => !!value || "Username is required",
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
type: "password",
|
|
286
|
+
name: "password",
|
|
287
|
+
mask: "*",
|
|
288
|
+
message: "Oxylabs password",
|
|
289
|
+
when: !opts.oxylabsPassword,
|
|
290
|
+
validate: (value) => !!value || "Password is required",
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
type: "input",
|
|
294
|
+
name: "country",
|
|
295
|
+
message: "Country code (optional, e.g. US)",
|
|
296
|
+
when: opts.oxylabsCountry === undefined,
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
type: "input",
|
|
300
|
+
name: "city",
|
|
301
|
+
message: "City (optional, requires country)",
|
|
302
|
+
when: (currentAnswers) => opts.oxylabsCity === undefined && !!(opts.oxylabsCountry || currentAnswers.country),
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
type: "input",
|
|
306
|
+
name: "sessionId",
|
|
307
|
+
message: "Sticky session id (optional)",
|
|
308
|
+
when: opts.oxylabsSessionId === undefined,
|
|
309
|
+
},
|
|
310
|
+
]);
|
|
311
|
+
const cfg = {
|
|
312
|
+
username: opts.oxylabsUsername || answers.username,
|
|
313
|
+
password: opts.oxylabsPassword || answers.password,
|
|
314
|
+
country: opts.oxylabsCountry || answers.country || undefined,
|
|
315
|
+
city: opts.oxylabsCity || answers.city || undefined,
|
|
316
|
+
sessionId: opts.oxylabsSessionId || answers.sessionId || undefined,
|
|
317
|
+
};
|
|
318
|
+
composeOxylabsUsername(cfg); // throws if city was given without country
|
|
319
|
+
return cfg;
|
|
320
|
+
});
|
|
321
|
+
/** Resolves AWS credentials/region for the interactive `--init` flow: flags/env first, prompts for whatever's missing. */
|
|
322
|
+
const resolveAwsCredentialsInteractive = (opts) => __awaiter(void 0, void 0, void 0, function* () {
|
|
323
|
+
aws_access_key = opts.awsAccessKey || process.env.AWS_ACCESS_KEY_ID || undefined;
|
|
324
|
+
aws_secret_key = opts.awsSecretKey || process.env.AWS_SECRET_ACCESS_KEY || undefined;
|
|
325
|
+
region = opts.region || undefined;
|
|
326
|
+
const answers = yield inquirer.prompt([
|
|
327
|
+
{
|
|
328
|
+
type: "input",
|
|
329
|
+
name: "accessKey",
|
|
330
|
+
message: "AWS access key",
|
|
331
|
+
when: !aws_access_key,
|
|
332
|
+
validate: (value) => !!value || "Required",
|
|
333
|
+
},
|
|
334
|
+
{
|
|
335
|
+
type: "password",
|
|
336
|
+
name: "secretKey",
|
|
337
|
+
mask: "*",
|
|
338
|
+
message: "AWS secret key",
|
|
339
|
+
when: !aws_secret_key,
|
|
340
|
+
validate: (value) => !!value || "Required",
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
type: "input",
|
|
344
|
+
name: "region",
|
|
345
|
+
message: "AWS region (leave blank for random)",
|
|
346
|
+
when: !region,
|
|
347
|
+
},
|
|
348
|
+
]);
|
|
349
|
+
aws_access_key = aws_access_key || answers.accessKey;
|
|
350
|
+
aws_secret_key = aws_secret_key || answers.secretKey;
|
|
351
|
+
region = region || answers.region || randomRegion();
|
|
352
|
+
});
|
|
353
|
+
/**
|
|
354
|
+
* Main entry point for the `proxy` module.
|
|
355
|
+
*
|
|
356
|
+
* `-i/--init` runs the interactive config wizard covering all 4 methods (aws/socks/http/oxylabs),
|
|
357
|
+
* writing the result to `.proxy_config.json`. `-d/--destroy`, `--destroy-all`, and `-l/--list`
|
|
358
|
+
* remain AWS-only lifecycle actions, unchanged from the original api-gateway module.
|
|
359
|
+
*
|
|
360
|
+
* @async
|
|
361
|
+
* @param opts - Resolved CLI options for the `proxy` command.
|
|
362
|
+
* @returns {Promise<void>}
|
|
363
|
+
*/
|
|
364
|
+
const proxy = (opts) => __awaiter(void 0, void 0, void 0, function* () {
|
|
365
|
+
configFile = opts.config || ".proxy_config.json";
|
|
366
|
+
// if feasibility is true, check feasibility
|
|
367
|
+
if (opts.feasibility) {
|
|
368
|
+
if (!opts.feasibilityUrl) {
|
|
369
|
+
console.error(chalk.red("[!] Please provide a URL to check feasibility of"));
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
yield checkFeasibility(opts.feasibilityUrl);
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
if (opts.init) {
|
|
376
|
+
const method = yield promptProxyMethod(opts.proxyMethod);
|
|
377
|
+
if (method === "aws") {
|
|
378
|
+
console.log(chalk.cyan("[i] Configuring 'Proxy' module (aws method)"));
|
|
379
|
+
yield resolveAwsCredentialsInteractive(opts);
|
|
380
|
+
console.log(chalk.cyan(`[i] Using region: ${region}`));
|
|
381
|
+
console.log(chalk.cyan(`[i] Using access key: ${keyMask(aws_access_key)}`));
|
|
382
|
+
yield createGateway();
|
|
383
|
+
setActiveProxyMethod(configFile, "aws");
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
if (method === "socks" || method === "http") {
|
|
387
|
+
const url = yield promptProxyUrl(method, opts.proxyUrl);
|
|
388
|
+
writeMethodConfig(configFile, method, { url });
|
|
389
|
+
console.log(chalk.green(`[✓] Saved ${method} proxy config to ${configFile}`));
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
// method === "oxylabs"
|
|
393
|
+
const oxylabsConfig = yield promptOxylabsConfig(opts);
|
|
394
|
+
writeMethodConfig(configFile, "oxylabs", oxylabsConfig);
|
|
395
|
+
console.log(chalk.green(`[✓] Saved oxylabs proxy config to ${configFile}`));
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
// destroy / destroy-all / list remain AWS-only, non-interactive
|
|
399
|
+
if (opts.destroy || opts.destroyAll || opts.list) {
|
|
400
|
+
aws_access_key = opts.awsAccessKey || process.env.AWS_ACCESS_KEY_ID || undefined;
|
|
401
|
+
aws_secret_key = opts.awsSecretKey || process.env.AWS_SECRET_ACCESS_KEY || undefined;
|
|
402
|
+
region = opts.region || randomRegion();
|
|
403
|
+
if (!aws_access_key || !aws_secret_key) {
|
|
404
|
+
console.error(chalk.red("[!] AWS Access Key or Secret Key not found. Run with -h to see help"));
|
|
405
|
+
process.exit(1);
|
|
406
|
+
}
|
|
407
|
+
if (opts.destroy) {
|
|
408
|
+
yield destroyGateway(opts.destroy);
|
|
409
|
+
}
|
|
410
|
+
else if (opts.destroyAll) {
|
|
411
|
+
yield destroyAllGateways();
|
|
412
|
+
}
|
|
413
|
+
else {
|
|
414
|
+
yield listGateways();
|
|
415
|
+
}
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
console.error(chalk.red("[!] Please provide a valid action (-i/--init, -d/--destroy, --destroy-all, or -l/--list)"));
|
|
419
|
+
});
|
|
420
|
+
export default proxy;
|
|
421
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/proxy/index.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAC3G,OAAO,gBAAgB,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAsB,MAAM,mBAAmB,CAAC;AAG/E,MAAM,mBAAmB,GAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AAE/E,kIAAkI;AAClI,yGAAyG;AAEzG;;;;GAIG;AACH,MAAM,YAAY,GAAG,GAAW,EAAE;IAC9B,MAAM,iBAAiB,GAAG;QACtB,WAAW,EAAE,iBAAiB;QAC9B,WAAW,EAAE,wBAAwB;QACrC,WAAW,EAAE,0BAA0B;QACvC,WAAW,EAAE,mBAAmB;QAChC,YAAY,EAAE,qBAAqB;QACnC,WAAW,EAAE,2BAA2B;QACxC,YAAY,EAAE,2BAA2B;QACzC,gBAAgB,EAAE,yBAAyB;QAC3C,gBAAgB,EAAE,0BAA0B;QAC5C,gBAAgB,EAAE,2BAA2B;QAC7C,YAAY,EAAE,wBAAwB;QACtC,gBAAgB,EAAE,uBAAuB;QACzC,gBAAgB,EAAE,uBAAuB;QACzC,gBAAgB,EAAE,2BAA2B;QAC7C,gBAAgB,EAAE,wBAAwB;QAC1C,WAAW,EAAE,wBAAwB;QACrC,gBAAgB,EAAE,0BAA0B;QAC5C,gBAAgB,EAAE,uBAAuB;QACzC,cAAc,EAAE,mBAAmB;QACnC,WAAW,EAAE,wBAAwB;QACrC,cAAc,EAAE,qBAAqB;QACrC,WAAW,EAAE,mBAAmB;QAChC,WAAW,EAAE,kBAAkB;QAC/B,YAAY,EAAE,iBAAiB;QAC/B,WAAW,EAAE,iBAAiB;QAC9B,YAAY,EAAE,iBAAiB;QAC/B,YAAY,EAAE,qBAAqB;QACnC,cAAc,EAAE,kBAAkB;QAClC,cAAc,EAAE,oBAAoB;QACpC,cAAc,EAAE,mBAAmB;QACnC,YAAY,EAAE,wBAAwB;QACtC,cAAc,EAAE,oBAAoB;QACpC,WAAW,EAAE,4BAA4B;KAC5C,CAAC;IACF,OAAO,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;AACnF,CAAC,CAAC;AAEF,IAAI,cAAc,CAAC;AACnB,IAAI,cAAc,CAAC;AACnB,IAAI,MAAM,CAAC;AACX,IAAI,UAAU,GAAG,EAAE,CAAC;AAEpB;;;;;GAKG;AACH,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAE/F;;;;;GAKG;AACH,MAAM,aAAa,GAAG,GAAS,EAAE;IAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC;QAChC,MAAM;QACN,WAAW,EAAE;YACT,WAAW,EAAE,cAAc;YAC3B,eAAe,EAAE,cAAc;SAClC;KACJ,CAAC,CAAC;IAEH,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,YAAY,gBAAgB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;IACtF,MAAM,OAAO,GAAG,IAAI,oBAAoB,CAAC;QACrC,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,uCAAuC,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;YACjF,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,MAAM;YACb,GAAG,EAAE,SAAS;YACd,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,SAAS;YACjB,YAAY,EAAE,OAAO;SACxB,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE;QAC7B,qBAAqB,EAAE;YACnB,aAAa,EAAE,WAAW;YAC1B,KAAK,EAAE,CAAC,UAAU,CAAC;SACtB;KACJ,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;IAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAE3D,4CAA4C;IAC5C,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAE7C,MAAM,CAAC,UAAU,CAAC,GAAG;QACjB,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,UAAU,EAAE,gBAAgB;QAC5B,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,cAAc;QAC1B,UAAU,EAAE,cAAc;KAC7B,CAAC;IAEF,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC,CAAC;AAClE,CAAC,CAAA,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,cAAc,GAAG,CAAO,EAAU,EAAiB,EAAE;IACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;IACtD,IAAI,CAAC,EAAE,EAAE,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAC;QACjE,OAAO;IACX,CAAC;IACD,6BAA6B;IAC7B,IAAI,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAC3C,oCAAoC;IACpC,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAEpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACxE,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAE7B,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC;QAChC,MAAM;QACN,WAAW,EAAE;YACT,WAAW,EAAE,cAAc;YAC3B,eAAe,EAAE,cAAc;SAClC;KACJ,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,IAAI,oBAAoB,CAAC;QACrC,SAAS,EAAE,EAAE;KAChB,CAAC,CAAC;IACH,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAE3B,8BAA8B;IAC9B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IACpB,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAEvC,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;IAEnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,8BAA8B,EAAE,EAAE,CAAC,CAAC,CAAC;AACjE,CAAC,CAAA,CAAC;AAEF;;;;;GAKG;AACH,MAAM,kBAAkB,GAAG,GAAS,EAAE;IAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAC3D,6BAA6B;IAC7B,IAAI,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAE3C,6BAA6B;IAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC;YAChC,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,WAAW,EAAE;gBACT,WAAW,EAAE,cAAc;gBAC3B,eAAe,EAAE,cAAc;aAClC;SACJ,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+BAA+B,GAAG,MAAM,KAAK,CAAC,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAE9F,MAAM,OAAO,GAAG,IAAI,oBAAoB,CAAC;YACrC,SAAS,EAAE,KAAK,CAAC,EAAE;SACtB,CAAC,CAAC;QACH,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;QACnB,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,8BAA8B,GAAG,MAAM,KAAK,CAAC,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAClG,CAAC;IAED,8BAA8B;IAC9B,kBAAkB,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;AAC/D,CAAC,CAAA,CAAC;AAEF;;;;;GAKG;AACH,MAAM,YAAY,GAAG,GAAS,EAAE;IAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;IAExD,2BAA2B;IAC3B,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAE7C,qBAAqB;IACrB,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACtD,OAAO;IACX,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;IAErD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;AACL,CAAC,CAAA,CAAC;AAEF,6FAA6F;AAC7F,MAAM,OAAO,GAAG,CAAC,GAAW,EAAU,EAAE;IACpC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IAC/B,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF,mHAAmH;AACnH,MAAM,iBAAiB,GAAG,CAAO,WAAoB,EAAwB,EAAE;IAC3E,IAAI,WAAW,EAAE,CAAC;QACd,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,WAA0B,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,KAAK,CAAC,yBAAyB,WAAW,sBAAsB,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChH,CAAC;QACD,OAAO,WAA0B,CAAC;IACtC,CAAC;IACD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QACrC;YACI,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,kCAAkC;YAC3C,OAAO,EAAE;gBACL,EAAE,IAAI,EAAE,uCAAuC,EAAE,KAAK,EAAE,KAAK,EAAE;gBAC/D,EAAE,IAAI,EAAE,gCAAgC,EAAE,KAAK,EAAE,OAAO,EAAE;gBAC1D,EAAE,IAAI,EAAE,8BAA8B,EAAE,KAAK,EAAE,MAAM,EAAE;gBACvD,EAAE,IAAI,EAAE,oCAAoC,EAAE,KAAK,EAAE,SAAS,EAAE;aACnE;SACJ;KACJ,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAClB,CAAC,CAAA,CAAC;AAEF,mHAAmH;AACnH,MAAM,cAAc,GAAG,CAAO,MAAwB,EAAE,QAAiB,EAAmB,EAAE;IAC1F,IAAI,QAAQ,EAAE,CAAC;QACX,aAAa,CAAC,QAAQ,CAAC,CAAC;QACxB,OAAO,QAAQ,CAAC;IACpB,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,4BAA4B,CAAC;IACnG,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QAClC;YACI,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,GAAG,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,oBAAoB,OAAO,GAAG;YAChF,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;gBACxB,IAAI,CAAC;oBACD,aAAa,CAAC,KAAK,CAAC,CAAC;oBACrB,OAAO,IAAI,CAAC;gBAChB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACX,OAAO,GAAG,CAAC,OAAO,CAAC;gBACvB,CAAC;YACL,CAAC;SACJ;KACJ,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACf,CAAC,CAAA,CAAC;AAEF,wGAAwG;AACxG,MAAM,mBAAmB,GAAG,CAAO,IAAqB,EAA0B,EAAE;IAChF,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QAClC;YACI,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,kBAAkB;YAC3B,IAAI,EAAE,CAAC,IAAI,CAAC,eAAe;YAC3B,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,sBAAsB;SACjE;QACD;YACI,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,GAAG;YACT,OAAO,EAAE,kBAAkB;YAC3B,IAAI,EAAE,CAAC,IAAI,CAAC,eAAe;YAC3B,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,sBAAsB;SACjE;QACD;YACI,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,kCAAkC;YAC3C,IAAI,EAAE,IAAI,CAAC,cAAc,KAAK,SAAS;SAC1C;QACD;YACI,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,mCAAmC;YAC5C,IAAI,EAAE,CAAC,cAAoC,EAAE,EAAE,CAC3C,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,OAAO,CAAC;SAC1F;QACD;YACI,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,8BAA8B;YACvC,IAAI,EAAE,IAAI,CAAC,gBAAgB,KAAK,SAAS;SAC5C;KACJ,CAAC,CAAC;IAEH,MAAM,GAAG,GAAkB;QACvB,QAAQ,EAAE,IAAI,CAAC,eAAe,IAAI,OAAO,CAAC,QAAQ;QAClD,QAAQ,EAAE,IAAI,CAAC,eAAe,IAAI,OAAO,CAAC,QAAQ;QAClD,OAAO,EAAE,IAAI,CAAC,cAAc,IAAI,OAAO,CAAC,OAAO,IAAI,SAAS;QAC5D,IAAI,EAAE,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,IAAI,IAAI,SAAS;QACnD,SAAS,EAAE,IAAI,CAAC,gBAAgB,IAAI,OAAO,CAAC,SAAS,IAAI,SAAS;KACrE,CAAC;IACF,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,2CAA2C;IACxE,OAAO,GAAG,CAAC;AACf,CAAC,CAAA,CAAC;AAEF,0HAA0H;AAC1H,MAAM,gCAAgC,GAAG,CAAO,IAAqB,EAAiB,EAAE;IACpF,cAAc,GAAG,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,SAAS,CAAC;IACjF,cAAc,GAAG,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,SAAS,CAAC;IACrF,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC;IAElC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QAClC;YACI,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,gBAAgB;YACzB,IAAI,EAAE,CAAC,cAAc;YACrB,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,UAAU;SACrD;QACD;YACI,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,GAAG;YACT,OAAO,EAAE,gBAAgB;YACzB,IAAI,EAAE,CAAC,cAAc;YACrB,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,UAAU;SACrD;QACD;YACI,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,qCAAqC;YAC9C,IAAI,EAAE,CAAC,MAAM;SAChB;KACJ,CAAC,CAAC;IAEH,cAAc,GAAG,cAAc,IAAI,OAAO,CAAC,SAAS,CAAC;IACrD,cAAc,GAAG,cAAc,IAAI,OAAO,CAAC,SAAS,CAAC;IACrD,MAAM,GAAG,MAAM,IAAI,OAAO,CAAC,MAAM,IAAI,YAAY,EAAE,CAAC;AACxD,CAAC,CAAA,CAAC;AAsBF;;;;;;;;;;GAUG;AACH,MAAM,KAAK,GAAG,CAAO,IAAqB,EAAiB,EAAE;IACzD,UAAU,GAAG,IAAI,CAAC,MAAM,IAAI,oBAAoB,CAAC;IAEjD,4CAA4C;IAC5C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC,CAAC;YAC7E,OAAO;QACX,CAAC;QACD,MAAM,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5C,OAAO;IACX,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEzD,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC,CAAC;YACvE,MAAM,gCAAgC,CAAC,IAAI,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,MAAM,EAAE,CAAC,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC;YAE5E,MAAM,aAAa,EAAE,CAAC;YACtB,oBAAoB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YACxC,OAAO;QACX,CAAC;QAED,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YAC1C,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxD,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,MAAM,oBAAoB,UAAU,EAAE,CAAC,CAAC,CAAC;YAC9E,OAAO;QACX,CAAC;QAED,uBAAuB;QACvB,MAAM,aAAa,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACtD,iBAAiB,CAAC,UAAU,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qCAAqC,UAAU,EAAE,CAAC,CAAC,CAAC;QAC5E,OAAO;IACX,CAAC;IAED,gEAAgE;IAChE,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/C,cAAc,GAAG,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,SAAS,CAAC;QACjF,cAAc,GAAG,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,SAAS,CAAC;QACrF,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,YAAY,EAAE,CAAC;QAEvC,IAAI,CAAC,cAAc,IAAI,CAAC,cAAc,EAAE,CAAC;YACrC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC,CAAC;YAChG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,MAAM,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACzB,MAAM,kBAAkB,EAAE,CAAC;QAC/B,CAAC;aAAM,CAAC;YACJ,MAAM,YAAY,EAAE,CAAC;QACzB,CAAC;QACD,OAAO;IACX,CAAC;IAED,OAAO,CAAC,KAAK,CACT,KAAK,CAAC,GAAG,CAAC,0FAA0F,CAAC,CACxG,CAAC;AACN,CAAC,CAAA,CAAC;AAEF,eAAe,KAAK,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composes the Oxylabs datacenter-proxy username: auth is entirely encoded here, no separate API.
|
|
3
|
+
* user-USERNAME[-country-XX]
|
|
4
|
+
*
|
|
5
|
+
* Verified against a live Oxylabs datacenter account (dc.oxylabs.io:8000) — the previous
|
|
6
|
+
* `customer-USERNAME-cc-XX` residential-style scheme returns a 407 Proxy Authentication Required
|
|
7
|
+
* against real datacenter credentials; this is the confirmed-working format per
|
|
8
|
+
* https://developers.oxylabs.io/products/proxies/datacenter-proxies/select-country.
|
|
9
|
+
*
|
|
10
|
+
* `city` and `sessionId` are not supported here: Oxylabs' datacenter tier has no documented
|
|
11
|
+
* username-level city targeting, and sticky sessions are selected by port number, not by a
|
|
12
|
+
* username suffix — silently encoding either into the username would produce a wrong username
|
|
13
|
+
* that fails auth, so both are rejected explicitly instead.
|
|
14
|
+
*/
|
|
15
|
+
export const composeOxylabsUsername = (cfg) => {
|
|
16
|
+
if (cfg.city) {
|
|
17
|
+
throw new Error("Oxylabs config: `city` is not supported (no documented username-level city targeting for datacenter proxies). Omit `city`.");
|
|
18
|
+
}
|
|
19
|
+
if (cfg.sessionId) {
|
|
20
|
+
throw new Error("Oxylabs config: `sessionId` is not supported via username for datacenter proxies (sticky sessions are selected by port, not username). Omit `sessionId`.");
|
|
21
|
+
}
|
|
22
|
+
let username = `user-${cfg.username}`;
|
|
23
|
+
if (cfg.country) {
|
|
24
|
+
username += `-country-${cfg.country}`;
|
|
25
|
+
}
|
|
26
|
+
return username;
|
|
27
|
+
};
|
|
28
|
+
const OXYLABS_ENTRY_ENDPOINT = "dc.oxylabs.io:8000";
|
|
29
|
+
/** Composes the full Oxylabs datacenter proxy URL. */
|
|
30
|
+
export const buildOxylabsProxyUrl = (cfg) => {
|
|
31
|
+
const username = composeOxylabsUsername(cfg);
|
|
32
|
+
return `http://${encodeURIComponent(username)}:${encodeURIComponent(cfg.password)}@${OXYLABS_ENTRY_ENDPOINT}`;
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=oxylabsProxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oxylabsProxy.js","sourceRoot":"","sources":["../../src/proxy/oxylabsProxy.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,GAAkB,EAAU,EAAE;IACjE,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACX,4HAA4H,CAC/H,CAAC;IACN,CAAC;IACD,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACX,0JAA0J,CAC7J,CAAC;IACN,CAAC;IAED,IAAI,QAAQ,GAAG,QAAQ,GAAG,CAAC,QAAQ,EAAE,CAAC;IACtC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QACd,QAAQ,IAAI,YAAY,GAAG,CAAC,OAAO,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAEpD,sDAAsD;AACtD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAkB,EAAU,EAAE;IAC/D,MAAM,QAAQ,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC7C,OAAO,UAAU,kBAAkB,CAAC,QAAQ,CAAC,IAAI,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,sBAAsB,EAAE,CAAC;AAClH,CAAC,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
const isValidMethod = (value) => {
|
|
2
|
+
return value === "aws" || value === "socks" || value === "http" || value === "oxylabs";
|
|
3
|
+
};
|
|
4
|
+
export const resolveProxyConfig = (input) => {
|
|
5
|
+
var _a;
|
|
6
|
+
const { cli, env, ignoreEnv, configFileParsed } = input;
|
|
7
|
+
const envMethod = ignoreEnv ? undefined : env.JS_RECON_PROXY_METHOD;
|
|
8
|
+
const rawMethod = cli.proxyMethod || envMethod || configFileParsed.method;
|
|
9
|
+
const method = isValidMethod(rawMethod) ? rawMethod : null;
|
|
10
|
+
if (method === null) {
|
|
11
|
+
return { method: null };
|
|
12
|
+
}
|
|
13
|
+
if (method === "socks" || method === "http") {
|
|
14
|
+
const envUrl = ignoreEnv ? undefined : env.JS_RECON_PROXY_URL;
|
|
15
|
+
const url = cli.proxyUrl || envUrl || ((_a = configFileParsed[method]) === null || _a === void 0 ? void 0 : _a.url);
|
|
16
|
+
return { method, url };
|
|
17
|
+
}
|
|
18
|
+
if (method === "oxylabs") {
|
|
19
|
+
const envUsername = ignoreEnv ? undefined : env.JS_RECON_OXYLABS_USERNAME;
|
|
20
|
+
const envPassword = ignoreEnv ? undefined : env.JS_RECON_OXYLABS_PASSWORD;
|
|
21
|
+
const envCountry = ignoreEnv ? undefined : env.JS_RECON_OXYLABS_COUNTRY;
|
|
22
|
+
const envCity = ignoreEnv ? undefined : env.JS_RECON_OXYLABS_CITY;
|
|
23
|
+
const envSessionId = ignoreEnv ? undefined : env.JS_RECON_OXYLABS_SESSION_ID;
|
|
24
|
+
const fileOxylabs = configFileParsed.oxylabs || {};
|
|
25
|
+
const username = cli.oxylabsUsername || envUsername || fileOxylabs.username;
|
|
26
|
+
const password = cli.oxylabsPassword || envPassword || fileOxylabs.password;
|
|
27
|
+
const country = cli.oxylabsCountry || envCountry || fileOxylabs.country;
|
|
28
|
+
const city = cli.oxylabsCity || envCity || fileOxylabs.city;
|
|
29
|
+
const sessionId = cli.oxylabsSessionId || envSessionId || fileOxylabs.sessionId;
|
|
30
|
+
if (!username || !password) {
|
|
31
|
+
return { method: null };
|
|
32
|
+
}
|
|
33
|
+
return { method, oxylabs: { username, password, country, city, sessionId } };
|
|
34
|
+
}
|
|
35
|
+
// method === "aws"
|
|
36
|
+
return { method, awsGatewayMap: configFileParsed.aws || {} };
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=resolveProxyConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveProxyConfig.js","sourceRoot":"","sources":["../../src/proxy/resolveProxyConfig.ts"],"names":[],"mappings":"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"}
|
package/build/refactor/index.js
CHANGED
|
@@ -27,30 +27,22 @@ import { loadRefactorConfig, validateRefactorConfig, purgeDynamicVersionDetectio
|
|
|
27
27
|
import { loadListCache, saveListCache, shouldRefreshListCache, loadCachedSignature, saveSignatureToCache, isSignatureCacheFresh, validateCaches, } from "./remote/cache.js";
|
|
28
28
|
import { detectReactVersion, VERSION_TECH_TO_BUNDLER, listAvailableVersions, selectDynamicScatConfigs, validateStaticScatConfig, } from "./remote/version-detect.js";
|
|
29
29
|
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
30
|
+
* Locates the assets directory holding vendor chunk files not present in `mapped.json`.
|
|
31
|
+
* `explicitAssetsDir` (the actual download dir + host, known by the `run` orchestrator)
|
|
32
|
+
* is used when given — `mapped.json` isn't always co-located with the downloaded assets
|
|
33
|
+
* (e.g. single-target `run` writes `mapped.json` to cwd but assets to `<-o>/<host>/assets`).
|
|
34
|
+
* Falls back to `<mapped.json's dir>/assets`, which holds for manual/CLI refactor
|
|
35
|
+
* invocations where `-m` points at a `mapped.json` living inside the host output dir.
|
|
36
|
+
* Returns null if the resolved directory does not exist.
|
|
33
37
|
*/
|
|
34
|
-
function findAssetsDir(
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
try {
|
|
42
|
-
const url = new URL(urlMatch[1]);
|
|
43
|
-
const port = url.port;
|
|
44
|
-
const hostname = url.hostname + (port ? `_${port}` : "");
|
|
45
|
-
const assetsDir = path.join(path.dirname(path.resolve(mappedJsonPath)), "output", hostname, "assets");
|
|
46
|
-
if (fs.existsSync(assetsDir))
|
|
47
|
-
return assetsDir;
|
|
48
|
-
}
|
|
49
|
-
catch (_b) {
|
|
50
|
-
continue;
|
|
51
|
-
}
|
|
38
|
+
export function findAssetsDir(mappedJsonPath, explicitAssetsDir) {
|
|
39
|
+
const assetsDir = explicitAssetsDir !== null && explicitAssetsDir !== void 0 ? explicitAssetsDir : path.join(path.dirname(path.resolve(mappedJsonPath)), "assets");
|
|
40
|
+
try {
|
|
41
|
+
return fs.statSync(assetsDir).isDirectory() ? assetsDir : null;
|
|
42
|
+
}
|
|
43
|
+
catch (_a) {
|
|
44
|
+
return null;
|
|
52
45
|
}
|
|
53
|
-
return null;
|
|
54
46
|
}
|
|
55
47
|
/**
|
|
56
48
|
* Returns paths to .js files in `assetsDir` that are NOT covered by any chunk in `chunks`.
|
|
@@ -626,9 +618,12 @@ function resolveVersionDetectionScatDirs(bundler, opts) {
|
|
|
626
618
|
* @param outputDir - Directory where refactored code files will be written
|
|
627
619
|
* @param tech - Technology stack identifier (e.g., 'next' for Next.js)
|
|
628
620
|
* @param list - Whether to list available technologies instead of running refactoring
|
|
621
|
+
* @param assetsDir - Directory holding downloaded vendor chunk files not present in
|
|
622
|
+
* `mapped.json` (react-webpack/react-vite only). Defaults to `<mapped.json's dir>/assets`
|
|
623
|
+
* when omitted; pass explicitly when `mapped.json` isn't co-located with the assets dir.
|
|
629
624
|
* @returns Promise that resolves when refactoring is complete
|
|
630
625
|
*/
|
|
631
|
-
const refactor = (mappedJson, outputDir, tech, list, collisionsFile, remoteOpts) => __awaiter(void 0, void 0, void 0, function* () {
|
|
626
|
+
const refactor = (mappedJson, outputDir, tech, list, collisionsFile, remoteOpts, assetsDir) => __awaiter(void 0, void 0, void 0, function* () {
|
|
632
627
|
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
633
628
|
console.log(chalk.cyan("[i] Loading refactor module..."));
|
|
634
629
|
if (list) {
|
|
@@ -771,9 +766,9 @@ const refactor = (mappedJson, outputDir, tech, list, collisionsFile, remoteOpts)
|
|
|
771
766
|
// Pre-scan vendor chunks from the assets directory that are not in mapped.json.
|
|
772
767
|
// These files (e.g. vendor-router.*.js, vendor-react-dom.*.js) contain library
|
|
773
768
|
// modules whose export maps must be classified before processing application chunks.
|
|
774
|
-
const
|
|
775
|
-
if (
|
|
776
|
-
const vendorFiles = findVendorChunkFiles(chunks,
|
|
769
|
+
const preScanAssetsDir = findAssetsDir(mappedJson, assetsDir);
|
|
770
|
+
if (preScanAssetsDir) {
|
|
771
|
+
const vendorFiles = findVendorChunkFiles(chunks, preScanAssetsDir);
|
|
777
772
|
for (const vendorFile of vendorFiles) {
|
|
778
773
|
console.log(chalk.cyan(`[i] Pre-scanning vendor chunk: ${path.basename(vendorFile)}`));
|
|
779
774
|
const vendorCode = fs.readFileSync(vendorFile, "utf8");
|
|
@@ -835,7 +830,7 @@ const refactor = (mappedJson, outputDir, tech, list, collisionsFile, remoteOpts)
|
|
|
835
830
|
// signature set contains only app-level code and misses version-specific React
|
|
836
831
|
// library signatures.
|
|
837
832
|
const vendorCodes = [];
|
|
838
|
-
const vDetectAssetsDir = findAssetsDir(
|
|
833
|
+
const vDetectAssetsDir = findAssetsDir(mappedJson, assetsDir);
|
|
839
834
|
if (vDetectAssetsDir) {
|
|
840
835
|
for (const vendorFile of findVendorChunkFiles(chunks, vDetectAssetsDir)) {
|
|
841
836
|
try {
|
|
@@ -865,7 +860,7 @@ const refactor = (mappedJson, outputDir, tech, list, collisionsFile, remoteOpts)
|
|
|
865
860
|
// Vendor chunks (vendor-react-*.js) are referenced by app chunks but are typically
|
|
866
861
|
// absent from mapped.json. Without them, vendorExportMaps is empty and vendor
|
|
867
862
|
// import statements are never rewritten — leaving unresolvable references in output.
|
|
868
|
-
const vitAssetsDir = findAssetsDir(
|
|
863
|
+
const vitAssetsDir = findAssetsDir(mappedJson, assetsDir);
|
|
869
864
|
if (vitAssetsDir) {
|
|
870
865
|
const missingFiles = findVendorChunkFiles(chunks, vitAssetsDir);
|
|
871
866
|
for (const vendorFile of missingFiles) {
|