dev-alias 0.1.0
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/dist/cli.d.ts +2 -0
- package/dist/cli.js +125 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +7 -0
- package/dist/config.js +146 -0
- package/dist/config.js.map +1 -0
- package/dist/hosts.d.ts +2 -0
- package/dist/hosts.js +120 -0
- package/dist/hosts.js.map +1 -0
- package/dist/port-detector.d.ts +24 -0
- package/dist/port-detector.js +110 -0
- package/dist/port-detector.js.map +1 -0
- package/dist/process-runner.d.ts +5 -0
- package/dist/process-runner.js +90 -0
- package/dist/process-runner.js.map +1 -0
- package/dist/proxy.d.ts +31 -0
- package/dist/proxy.js +132 -0
- package/dist/proxy.js.map +1 -0
- package/dist/terminal.d.ts +8 -0
- package/dist/terminal.js +37 -0
- package/dist/terminal.js.map +1 -0
- package/dist/tls-manager.d.ts +7 -0
- package/dist/tls-manager.js +30 -0
- package/dist/tls-manager.js.map +1 -0
- package/dist/types.d.ts +66 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +64 -0
package/dist/cli.d.ts
ADDED
package/dist/cli.js
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const string_argv_1 = __importDefault(require("string-argv"));
|
|
10
|
+
const config_1 = require("./config");
|
|
11
|
+
const process_runner_1 = require("./process-runner");
|
|
12
|
+
const terminal_1 = require("./terminal");
|
|
13
|
+
async function main() {
|
|
14
|
+
const { cliArgs, commandArgs } = splitArguments(process.argv);
|
|
15
|
+
const program = new commander_1.Command();
|
|
16
|
+
program
|
|
17
|
+
.name('/alias')
|
|
18
|
+
.description('Zero-touch local domain proxy by @launchaddict')
|
|
19
|
+
.option('-s, --script <name>', 'script key inside alias.commands')
|
|
20
|
+
.option('-d, --domain <domain>', 'domain override (defaults to alias.domain)')
|
|
21
|
+
.option('--proxy-port <port>', 'http proxy port override')
|
|
22
|
+
.option('--https-port <port>', 'https proxy port override')
|
|
23
|
+
.option('--target-port <port>', 'hint for the dev server port')
|
|
24
|
+
.option('--https', 'force HTTPS proxying')
|
|
25
|
+
.option('--disable-https', 'disable HTTPS proxying even if config enables it')
|
|
26
|
+
.option('--persist-hosts', 'keep hosts entries after exit')
|
|
27
|
+
.option('--cleanup-hosts', 'remove hosts entries on exit')
|
|
28
|
+
.option('-e, --env <pair...>', 'environment variables in KEY=VALUE format');
|
|
29
|
+
program.parse(cliArgs);
|
|
30
|
+
const options = program.opts();
|
|
31
|
+
const { config, packagePath } = await (0, config_1.loadConfig)(process.cwd());
|
|
32
|
+
const cwd = path_1.default.dirname(packagePath);
|
|
33
|
+
const scriptName = options.script ?? process.env.npm_lifecycle_event ?? undefined;
|
|
34
|
+
const scriptConfig = scriptName ? config.commands?.[scriptName] : undefined;
|
|
35
|
+
const domain = (options.domain ?? scriptConfig?.domain ?? config.domain).toLowerCase();
|
|
36
|
+
const https = resolveBoolean(options.https, options.disableHttps, scriptConfig?.https, config.https ?? false);
|
|
37
|
+
const persistHosts = resolveBoolean(options.persistHosts, options.cleanupHosts, undefined, config.persistHosts ?? true);
|
|
38
|
+
const proxyPort = parsePort(options.proxyPort ?? String(config.proxyPort ?? 80));
|
|
39
|
+
const httpsPort = https ? parsePort(options.httpsPort ?? String(config.httpsPort ?? 443)) : undefined;
|
|
40
|
+
const targetHint = parseOptionalPort(options.targetPort ?? scriptConfig?.targetPort);
|
|
41
|
+
const portScan = scriptConfig?.portScan ?? config.portScan ?? { start: 3000, end: 3100 };
|
|
42
|
+
const logPatterns = mergePatterns(config.logPatterns ?? [], scriptConfig?.logPatterns ?? []);
|
|
43
|
+
const env = mergeEnv(scriptConfig?.env, options.env);
|
|
44
|
+
const commandParts = commandArgs.length > 0 ? commandArgs : parseConfiguredCommand(scriptConfig);
|
|
45
|
+
if (commandParts.length === 0) {
|
|
46
|
+
throw new Error('No dev command provided. Append it after -- or set commands.<name>.command in package.json');
|
|
47
|
+
}
|
|
48
|
+
const [command, ...args] = commandParts;
|
|
49
|
+
(0, terminal_1.logCredit)();
|
|
50
|
+
const context = {
|
|
51
|
+
cwd,
|
|
52
|
+
domain,
|
|
53
|
+
command,
|
|
54
|
+
args,
|
|
55
|
+
https,
|
|
56
|
+
targetHint,
|
|
57
|
+
logPatterns,
|
|
58
|
+
portScan,
|
|
59
|
+
proxyPort,
|
|
60
|
+
httpsPort,
|
|
61
|
+
persistHosts
|
|
62
|
+
};
|
|
63
|
+
await (0, process_runner_1.runWithProxy)({
|
|
64
|
+
...context,
|
|
65
|
+
env
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
function splitArguments(argv) {
|
|
69
|
+
const index = argv.indexOf('--');
|
|
70
|
+
if (index === -1) {
|
|
71
|
+
return { cliArgs: argv, commandArgs: [] };
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
cliArgs: argv.slice(0, index),
|
|
75
|
+
commandArgs: argv.slice(index + 1)
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function resolveBoolean(enable, disable, scriptValue, defaultValue = false) {
|
|
79
|
+
if (enable === true)
|
|
80
|
+
return true;
|
|
81
|
+
if (disable === true)
|
|
82
|
+
return false;
|
|
83
|
+
if (typeof scriptValue === 'boolean')
|
|
84
|
+
return scriptValue;
|
|
85
|
+
return defaultValue;
|
|
86
|
+
}
|
|
87
|
+
function parsePort(value) {
|
|
88
|
+
const num = typeof value === 'number' ? value : Number(value);
|
|
89
|
+
if (!Number.isInteger(num) || num <= 0) {
|
|
90
|
+
throw new Error(`Invalid port value: ${value}`);
|
|
91
|
+
}
|
|
92
|
+
return num;
|
|
93
|
+
}
|
|
94
|
+
function parseOptionalPort(value) {
|
|
95
|
+
if (value === undefined || value === null)
|
|
96
|
+
return undefined;
|
|
97
|
+
return parsePort(value);
|
|
98
|
+
}
|
|
99
|
+
function mergePatterns(base, extra) {
|
|
100
|
+
return Array.from(new Set([...base, ...extra]));
|
|
101
|
+
}
|
|
102
|
+
function mergeEnv(scriptEnv, cliEnv) {
|
|
103
|
+
const env = { ...(scriptEnv ?? {}) };
|
|
104
|
+
(cliEnv ?? []).forEach((entry) => {
|
|
105
|
+
const [key, ...rest] = entry.split('=');
|
|
106
|
+
if (!key || rest.length === 0) {
|
|
107
|
+
throw new Error(`Invalid env entry: ${entry}. Use KEY=VALUE.`);
|
|
108
|
+
}
|
|
109
|
+
env[key] = rest.join('=');
|
|
110
|
+
});
|
|
111
|
+
return Object.keys(env).length > 0 ? env : undefined;
|
|
112
|
+
}
|
|
113
|
+
function parseConfiguredCommand(scriptConfig) {
|
|
114
|
+
if (!scriptConfig?.command)
|
|
115
|
+
return [];
|
|
116
|
+
return (0, string_argv_1.default)(scriptConfig.command);
|
|
117
|
+
}
|
|
118
|
+
main().catch((error) => {
|
|
119
|
+
console.error((0, terminal_1.colorize)(error.message, 'red'));
|
|
120
|
+
if (process.env.DEBUG) {
|
|
121
|
+
console.error(error);
|
|
122
|
+
}
|
|
123
|
+
process.exit(1);
|
|
124
|
+
});
|
|
125
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { LoadedConfig } from './types';
|
|
2
|
+
export declare const STATE_DIR: string;
|
|
3
|
+
export declare const CERTS_DIR: string;
|
|
4
|
+
export declare function loadConfig(cwd?: string): Promise<LoadedConfig>;
|
|
5
|
+
export declare function ensureStateDirectories(): Promise<void>;
|
|
6
|
+
export declare function statePath(...segments: string[]): string;
|
|
7
|
+
export declare function isValidDomain(domain: string): boolean;
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CERTS_DIR = exports.STATE_DIR = void 0;
|
|
7
|
+
exports.loadConfig = loadConfig;
|
|
8
|
+
exports.ensureStateDirectories = ensureStateDirectories;
|
|
9
|
+
exports.statePath = statePath;
|
|
10
|
+
exports.isValidDomain = isValidDomain;
|
|
11
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
12
|
+
const os_1 = __importDefault(require("os"));
|
|
13
|
+
const path_1 = __importDefault(require("path"));
|
|
14
|
+
const DEFAULT_SCAN_RANGE = { start: 3000, end: 3100 };
|
|
15
|
+
const DEFAULT_LOG_PATTERNS = [
|
|
16
|
+
'http://(?:localhost|127\.0\.0\.1):(\\d+)',
|
|
17
|
+
'https://(?:localhost|127\.0\.0\.1):(\\d+)',
|
|
18
|
+
'ready in .*:(\\d+)',
|
|
19
|
+
'listening on .*:(\\d+)',
|
|
20
|
+
'dev server running at .*:(\\d+)'
|
|
21
|
+
];
|
|
22
|
+
const DOMAIN_REGEX = /^(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z]{2,}$/i;
|
|
23
|
+
const ALLOWED_TLDS = ['local', 'localhost', 'test'];
|
|
24
|
+
exports.STATE_DIR = path_1.default.join(os_1.default.homedir(), '.alias-runner');
|
|
25
|
+
exports.CERTS_DIR = path_1.default.join(exports.STATE_DIR, 'certs');
|
|
26
|
+
async function loadConfig(cwd = process.cwd()) {
|
|
27
|
+
const packagePath = await findPackageJson(cwd);
|
|
28
|
+
if (!packagePath) {
|
|
29
|
+
throw new Error('Could not locate package.json. Run this command inside a Node project.');
|
|
30
|
+
}
|
|
31
|
+
const pkg = await fs_extra_1.default.readJson(packagePath);
|
|
32
|
+
const rawConfig = pkg.alias;
|
|
33
|
+
if (!rawConfig || typeof rawConfig !== 'object') {
|
|
34
|
+
throw new Error('Missing alias configuration inside package.json.');
|
|
35
|
+
}
|
|
36
|
+
if (!rawConfig.domain || typeof rawConfig.domain !== 'string') {
|
|
37
|
+
throw new Error('alias.domain is required (e.g. "app.local").');
|
|
38
|
+
}
|
|
39
|
+
if (!isValidDomain(rawConfig.domain)) {
|
|
40
|
+
throw new Error('alias.domain must be a .local, .localhost, or .test domain.');
|
|
41
|
+
}
|
|
42
|
+
const config = {
|
|
43
|
+
domain: rawConfig.domain.trim().toLowerCase(),
|
|
44
|
+
https: Boolean(rawConfig.https ?? false),
|
|
45
|
+
proxyPort: rawConfig.proxyPort ?? 80,
|
|
46
|
+
httpsPort: rawConfig.httpsPort ?? 443,
|
|
47
|
+
persistHosts: rawConfig.persistHosts ?? true,
|
|
48
|
+
portScan: normalizeRange(rawConfig.portScan),
|
|
49
|
+
logPatterns: normalizePatterns(rawConfig.logPatterns),
|
|
50
|
+
commands: normalizeCommands(rawConfig.commands)
|
|
51
|
+
};
|
|
52
|
+
config.portScan ?? (config.portScan = { ...DEFAULT_SCAN_RANGE });
|
|
53
|
+
config.logPatterns ?? (config.logPatterns = [...DEFAULT_LOG_PATTERNS]);
|
|
54
|
+
return { packagePath, config };
|
|
55
|
+
}
|
|
56
|
+
async function ensureStateDirectories() {
|
|
57
|
+
await fs_extra_1.default.ensureDir(exports.STATE_DIR);
|
|
58
|
+
await fs_extra_1.default.ensureDir(exports.CERTS_DIR);
|
|
59
|
+
}
|
|
60
|
+
function statePath(...segments) {
|
|
61
|
+
return path_1.default.join(exports.STATE_DIR, ...segments);
|
|
62
|
+
}
|
|
63
|
+
function isValidDomain(domain) {
|
|
64
|
+
const normalized = domain.trim().toLowerCase();
|
|
65
|
+
if (!DOMAIN_REGEX.test(normalized)) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
const tld = normalized.split('.').pop();
|
|
69
|
+
return !!tld && ALLOWED_TLDS.includes(tld);
|
|
70
|
+
}
|
|
71
|
+
function normalizeRange(range) {
|
|
72
|
+
if (!range || typeof range !== 'object')
|
|
73
|
+
return undefined;
|
|
74
|
+
const start = Number(range.start);
|
|
75
|
+
const end = Number(range.end);
|
|
76
|
+
if (!Number.isInteger(start) || !Number.isInteger(end) || start <= 0 || end <= start) {
|
|
77
|
+
throw new Error('alias.portScan must contain a valid numeric start/end.');
|
|
78
|
+
}
|
|
79
|
+
return { start, end };
|
|
80
|
+
}
|
|
81
|
+
function normalizePatterns(patterns) {
|
|
82
|
+
if (!patterns)
|
|
83
|
+
return undefined;
|
|
84
|
+
if (!Array.isArray(patterns)) {
|
|
85
|
+
throw new Error('alias.logPatterns must be an array of strings.');
|
|
86
|
+
}
|
|
87
|
+
patterns.forEach((pattern) => {
|
|
88
|
+
if (typeof pattern !== 'string') {
|
|
89
|
+
throw new Error('alias.logPatterns entries must be strings.');
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
return [...patterns];
|
|
93
|
+
}
|
|
94
|
+
function normalizeCommands(commands) {
|
|
95
|
+
if (!commands)
|
|
96
|
+
return undefined;
|
|
97
|
+
if (typeof commands !== 'object' || Array.isArray(commands)) {
|
|
98
|
+
throw new Error('alias.commands must be an object keyed by script name.');
|
|
99
|
+
}
|
|
100
|
+
const normalized = {};
|
|
101
|
+
Object.entries(commands).forEach(([key, value]) => {
|
|
102
|
+
if (!value || typeof value !== 'object') {
|
|
103
|
+
throw new Error(`alias.commands.${key} must be an object.`);
|
|
104
|
+
}
|
|
105
|
+
const entry = { ...value };
|
|
106
|
+
if (entry.domain && !isValidDomain(entry.domain)) {
|
|
107
|
+
throw new Error(`alias.commands.${key}.domain must be a .local/.localhost/.test domain.`);
|
|
108
|
+
}
|
|
109
|
+
if (entry.targetPort && !Number.isInteger(entry.targetPort)) {
|
|
110
|
+
throw new Error(`alias.commands.${key}.targetPort must be an integer.`);
|
|
111
|
+
}
|
|
112
|
+
if (entry.logPatterns) {
|
|
113
|
+
entry.logPatterns = normalizePatterns(entry.logPatterns) ?? undefined;
|
|
114
|
+
}
|
|
115
|
+
if (entry.portScan) {
|
|
116
|
+
entry.portScan = normalizeRange(entry.portScan) ?? undefined;
|
|
117
|
+
}
|
|
118
|
+
if (entry.env) {
|
|
119
|
+
if (typeof entry.env !== 'object') {
|
|
120
|
+
throw new Error(`alias.commands.${key}.env must be an object of key/value pairs.`);
|
|
121
|
+
}
|
|
122
|
+
Object.entries(entry.env).forEach(([envKey, envValue]) => {
|
|
123
|
+
if (typeof envValue !== 'string') {
|
|
124
|
+
throw new Error(`alias.commands.${key}.env.${envKey} must be a string.`);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
normalized[key] = entry;
|
|
129
|
+
});
|
|
130
|
+
return normalized;
|
|
131
|
+
}
|
|
132
|
+
async function findPackageJson(start) {
|
|
133
|
+
let current = path_1.default.resolve(start);
|
|
134
|
+
while (true) {
|
|
135
|
+
const candidate = path_1.default.join(current, 'package.json');
|
|
136
|
+
if (await fs_extra_1.default.pathExists(candidate)) {
|
|
137
|
+
return candidate;
|
|
138
|
+
}
|
|
139
|
+
const parent = path_1.default.dirname(current);
|
|
140
|
+
if (parent === current) {
|
|
141
|
+
return undefined;
|
|
142
|
+
}
|
|
143
|
+
current = parent;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/hosts.d.ts
ADDED
package/dist/hosts.js
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ensureHostEntry = ensureHostEntry;
|
|
7
|
+
exports.removeHostEntry = removeHostEntry;
|
|
8
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
9
|
+
const os_1 = __importDefault(require("os"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const sudo_prompt_1 = __importDefault(require("sudo-prompt"));
|
|
12
|
+
const config_1 = require("./config");
|
|
13
|
+
const APP_NAME = 'alias-runner';
|
|
14
|
+
async function ensureHostEntry(domain, address = '127.0.0.1') {
|
|
15
|
+
if (!requiresHostsChange(domain))
|
|
16
|
+
return;
|
|
17
|
+
await updateHosts((lines) => {
|
|
18
|
+
const filtered = removeLines(lines, domain);
|
|
19
|
+
filtered.push(`${address}\t${domain}`);
|
|
20
|
+
return filtered;
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
async function removeHostEntry(domain) {
|
|
24
|
+
if (!requiresHostsChange(domain))
|
|
25
|
+
return;
|
|
26
|
+
await updateHosts((lines) => removeLines(lines, domain));
|
|
27
|
+
}
|
|
28
|
+
async function updateHosts(mutator) {
|
|
29
|
+
const hostsPath = getHostsPath();
|
|
30
|
+
await ensureBackup(hostsPath);
|
|
31
|
+
const content = await fs_extra_1.default.readFile(hostsPath, 'utf8');
|
|
32
|
+
const lines = toLines(content);
|
|
33
|
+
const nextLines = mutator(lines);
|
|
34
|
+
if (linesEqual(lines, nextLines)) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const finalContent = `${nextLines.join(os_1.default.EOL)}${os_1.default.EOL}`;
|
|
38
|
+
await writeHostsContent(hostsPath, finalContent);
|
|
39
|
+
}
|
|
40
|
+
function toLines(content) {
|
|
41
|
+
return content.replace(/\r/g, '').split('\n').filter((line, index, arr) => !(index === arr.length - 1 && line === ''));
|
|
42
|
+
}
|
|
43
|
+
function removeLines(lines, domain) {
|
|
44
|
+
const domainRegex = new RegExp(`(?:^|\s)${escapeRegex(domain)}(?:\s|$)`, 'i');
|
|
45
|
+
return lines.filter((line) => {
|
|
46
|
+
const trimmed = line.trim();
|
|
47
|
+
if (!trimmed || trimmed.startsWith('#')) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
return !domainRegex.test(trimmed);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
function linesEqual(a, b) {
|
|
54
|
+
if (a.length !== b.length)
|
|
55
|
+
return false;
|
|
56
|
+
return a.every((value, index) => value === b[index]);
|
|
57
|
+
}
|
|
58
|
+
function escapeRegex(value) {
|
|
59
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
60
|
+
}
|
|
61
|
+
function getHostsPath() {
|
|
62
|
+
if (process.platform === 'win32') {
|
|
63
|
+
const systemRoot = process.env.SystemRoot ?? 'C:/Windows';
|
|
64
|
+
return path_1.default.join(systemRoot, 'System32', 'drivers', 'etc', 'hosts');
|
|
65
|
+
}
|
|
66
|
+
return '/etc/hosts';
|
|
67
|
+
}
|
|
68
|
+
async function ensureBackup(hostsPath) {
|
|
69
|
+
const backupPath = (0, config_1.statePath)('hosts.backup');
|
|
70
|
+
if (await fs_extra_1.default.pathExists(backupPath))
|
|
71
|
+
return;
|
|
72
|
+
await fs_extra_1.default.ensureDir(path_1.default.dirname(backupPath));
|
|
73
|
+
await fs_extra_1.default.copy(hostsPath, backupPath);
|
|
74
|
+
}
|
|
75
|
+
async function writeHostsContent(hostsPath, content) {
|
|
76
|
+
try {
|
|
77
|
+
await fs_extra_1.default.writeFile(hostsPath, content, 'utf8');
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
if (isPermissionError(error)) {
|
|
81
|
+
await writeWithPrivileges(hostsPath, content);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function isPermissionError(error) {
|
|
89
|
+
return Boolean(typeof error === 'object' &&
|
|
90
|
+
error &&
|
|
91
|
+
'code' in error &&
|
|
92
|
+
error.code &&
|
|
93
|
+
['EACCES', 'EPERM'].includes(error.code));
|
|
94
|
+
}
|
|
95
|
+
async function writeWithPrivileges(hostsPath, content) {
|
|
96
|
+
const tempFile = path_1.default.join(os_1.default.tmpdir(), `alias-hosts-${Date.now()}.txt`);
|
|
97
|
+
await fs_extra_1.default.writeFile(tempFile, content, 'utf8');
|
|
98
|
+
const command = buildCopyCommand(tempFile, hostsPath);
|
|
99
|
+
await new Promise((resolve, reject) => {
|
|
100
|
+
sudo_prompt_1.default.exec(command, { name: APP_NAME }, (error) => {
|
|
101
|
+
if (error) {
|
|
102
|
+
reject(error);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
resolve();
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
await fs_extra_1.default.remove(tempFile).catch(() => undefined);
|
|
110
|
+
}
|
|
111
|
+
function buildCopyCommand(source, target) {
|
|
112
|
+
if (process.platform === 'win32') {
|
|
113
|
+
return `powershell -Command "Copy-Item -Path '${source.replace(/'/g, "''")}' -Destination '${target.replace(/'/g, "''")}' -Force"`;
|
|
114
|
+
}
|
|
115
|
+
return `/bin/sh -c "cp '${source.replace(/'/g, "'\\''")}' '${target.replace(/'/g, "'\\''")}'"`;
|
|
116
|
+
}
|
|
117
|
+
function requiresHostsChange(domain) {
|
|
118
|
+
return !domain.endsWith('.localhost');
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=hosts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosts.js","sourceRoot":"","sources":["../src/hosts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ChildProcess } from 'child_process';
|
|
2
|
+
import type { PortScanRange } from './types';
|
|
3
|
+
export declare class PortDetector {
|
|
4
|
+
private readonly options;
|
|
5
|
+
private readonly regexes;
|
|
6
|
+
private resolvedPort?;
|
|
7
|
+
private resolveFn?;
|
|
8
|
+
private rejectFn?;
|
|
9
|
+
private timeout?;
|
|
10
|
+
private readonly listeners;
|
|
11
|
+
constructor(options: {
|
|
12
|
+
patterns: string[];
|
|
13
|
+
range: PortScanRange;
|
|
14
|
+
timeoutMs?: number;
|
|
15
|
+
});
|
|
16
|
+
attach(child: ChildProcess): void;
|
|
17
|
+
waitForPort(portHint?: number): Promise<number>;
|
|
18
|
+
onPort(listener: (port: number) => void): void;
|
|
19
|
+
private inspectBuffer;
|
|
20
|
+
private awaitPortUsage;
|
|
21
|
+
private scanRange;
|
|
22
|
+
private setPort;
|
|
23
|
+
private startTimeout;
|
|
24
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PortDetector = void 0;
|
|
7
|
+
const tcp_port_used_1 = __importDefault(require("tcp-port-used"));
|
|
8
|
+
const HOST = '127.0.0.1';
|
|
9
|
+
class PortDetector {
|
|
10
|
+
constructor(options) {
|
|
11
|
+
this.options = options;
|
|
12
|
+
this.listeners = [];
|
|
13
|
+
this.regexes = options.patterns.map((pattern) => new RegExp(pattern, 'i'));
|
|
14
|
+
}
|
|
15
|
+
attach(child) {
|
|
16
|
+
child.stdout?.on('data', (data) => this.inspectBuffer(data.toString()));
|
|
17
|
+
child.stderr?.on('data', (data) => this.inspectBuffer(data.toString()));
|
|
18
|
+
}
|
|
19
|
+
async waitForPort(portHint) {
|
|
20
|
+
if (this.resolvedPort) {
|
|
21
|
+
return this.resolvedPort;
|
|
22
|
+
}
|
|
23
|
+
return await new Promise((resolve, reject) => {
|
|
24
|
+
this.resolveFn = resolve;
|
|
25
|
+
this.rejectFn = reject;
|
|
26
|
+
this.startTimeout();
|
|
27
|
+
if (portHint) {
|
|
28
|
+
this.awaitPortUsage(portHint).catch(() => this.scanRange());
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
this.scanRange();
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
onPort(listener) {
|
|
36
|
+
this.listeners.push(listener);
|
|
37
|
+
if (this.resolvedPort) {
|
|
38
|
+
listener(this.resolvedPort);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
inspectBuffer(buffer) {
|
|
42
|
+
for (const regex of this.regexes) {
|
|
43
|
+
const match = buffer.match(regex);
|
|
44
|
+
if (match && match[1]) {
|
|
45
|
+
const detected = Number(match[1]);
|
|
46
|
+
if (Number.isInteger(detected) && detected > 0) {
|
|
47
|
+
this.setPort(detected);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async awaitPortUsage(port) {
|
|
54
|
+
try {
|
|
55
|
+
await tcp_port_used_1.default.waitUntilUsedOnHost(port, HOST, 200, 15000);
|
|
56
|
+
this.setPort(port);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
if (!this.resolvedPort) {
|
|
60
|
+
this.scanRange();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async scanRange() {
|
|
65
|
+
const { start, end } = this.options.range;
|
|
66
|
+
for (let port = start; port <= end; port += 1) {
|
|
67
|
+
if (this.resolvedPort)
|
|
68
|
+
return;
|
|
69
|
+
const inUse = await tcp_port_used_1.default.check(port, HOST);
|
|
70
|
+
if (inUse) {
|
|
71
|
+
this.setPort(port);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (!this.resolvedPort) {
|
|
76
|
+
setTimeout(() => this.scanRange(), 400);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
setPort(port) {
|
|
80
|
+
const firstDetection = !this.resolvedPort;
|
|
81
|
+
const changed = this.resolvedPort !== port;
|
|
82
|
+
this.resolvedPort = port;
|
|
83
|
+
if (firstDetection && this.timeout) {
|
|
84
|
+
clearTimeout(this.timeout);
|
|
85
|
+
}
|
|
86
|
+
if (firstDetection) {
|
|
87
|
+
this.resolveFn?.(port);
|
|
88
|
+
}
|
|
89
|
+
if (firstDetection || changed) {
|
|
90
|
+
this.listeners.forEach((listener) => {
|
|
91
|
+
try {
|
|
92
|
+
listener(port);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
console.error('Error inside port listener', error);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
startTimeout() {
|
|
101
|
+
const timeoutMs = this.options.timeoutMs ?? 60000;
|
|
102
|
+
this.timeout = setTimeout(() => {
|
|
103
|
+
if (this.rejectFn && !this.resolvedPort) {
|
|
104
|
+
this.rejectFn(new Error('Timed out waiting for dev server port.'));
|
|
105
|
+
}
|
|
106
|
+
}, timeoutMs);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
exports.PortDetector = PortDetector;
|
|
110
|
+
//# sourceMappingURL=port-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-detector.js","sourceRoot":"","sources":["../src/port-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runWithProxy = runWithProxy;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const config_1 = require("./config");
|
|
6
|
+
const hosts_1 = require("./hosts");
|
|
7
|
+
const port_detector_1 = require("./port-detector");
|
|
8
|
+
const proxy_1 = require("./proxy");
|
|
9
|
+
const tls_manager_1 = require("./tls-manager");
|
|
10
|
+
const terminal_1 = require("./terminal");
|
|
11
|
+
async function runWithProxy(options) {
|
|
12
|
+
await (0, config_1.ensureStateDirectories)();
|
|
13
|
+
await (0, hosts_1.ensureHostEntry)(options.domain);
|
|
14
|
+
const detector = new port_detector_1.PortDetector({
|
|
15
|
+
patterns: options.logPatterns,
|
|
16
|
+
range: options.portScan,
|
|
17
|
+
timeoutMs: 60000
|
|
18
|
+
});
|
|
19
|
+
const proxy = new proxy_1.ProxyService();
|
|
20
|
+
const httpsCredentials = options.https ? await (0, tls_manager_1.ensureCertificate)(options.domain) : undefined;
|
|
21
|
+
await proxy.start({
|
|
22
|
+
httpPort: options.proxyPort,
|
|
23
|
+
fallbackHttpPort: options.proxyPort === 80 ? 8080 : options.proxyPort + 1,
|
|
24
|
+
httpsPort: options.https ? options.httpsPort ?? 443 : undefined,
|
|
25
|
+
fallbackHttpsPort: options.https ? ((options.httpsPort ?? 443) === 443 ? 8443 : (options.httpsPort ?? 443) + 1) : undefined,
|
|
26
|
+
httpsCredentials: httpsCredentials ? { key: httpsCredentials.key, cert: httpsCredentials.cert } : undefined
|
|
27
|
+
});
|
|
28
|
+
detector.onPort((port) => {
|
|
29
|
+
proxy.upsertRoute(options.domain, `http://127.0.0.1:${port}`);
|
|
30
|
+
(0, terminal_1.logHighlight)(`mapped ${options.https ? 'https' : 'http'}://${options.domain} -> http://localhost:${port}`);
|
|
31
|
+
});
|
|
32
|
+
const child = spawnProcess(options, detector);
|
|
33
|
+
const exitPromise = waitForExit(child);
|
|
34
|
+
const cleanup = createCleanup(child, proxy, options);
|
|
35
|
+
try {
|
|
36
|
+
await detector.waitForPort(options.targetHint);
|
|
37
|
+
await exitPromise;
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
await cleanup();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function spawnProcess(options, detector) {
|
|
44
|
+
const child = (0, child_process_1.spawn)(options.command, options.args, {
|
|
45
|
+
cwd: options.cwd,
|
|
46
|
+
shell: process.platform === 'win32',
|
|
47
|
+
env: { ...process.env, ...options.env },
|
|
48
|
+
stdio: ['inherit', 'pipe', 'pipe']
|
|
49
|
+
});
|
|
50
|
+
detector.attach(child);
|
|
51
|
+
child.stdout?.on('data', (chunk) => process.stdout.write(chunk));
|
|
52
|
+
child.stderr?.on('data', (chunk) => process.stderr.write(chunk));
|
|
53
|
+
return child;
|
|
54
|
+
}
|
|
55
|
+
function waitForExit(child) {
|
|
56
|
+
return new Promise((resolve, reject) => {
|
|
57
|
+
child.once('exit', (code) => {
|
|
58
|
+
if (code === 0) {
|
|
59
|
+
resolve();
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
reject(new Error(`Dev server exited with code ${code ?? 'unknown'}`));
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
child.once('error', reject);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
function createCleanup(child, proxy, options) {
|
|
69
|
+
const signals = ['SIGINT', 'SIGTERM'];
|
|
70
|
+
const handlers = signals.map((signal) => {
|
|
71
|
+
const handler = () => {
|
|
72
|
+
if (!child.killed) {
|
|
73
|
+
child.kill(signal);
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
process.on(signal, handler);
|
|
77
|
+
return { signal, handler };
|
|
78
|
+
});
|
|
79
|
+
return async () => {
|
|
80
|
+
handlers.forEach(({ signal, handler }) => process.off(signal, handler));
|
|
81
|
+
if (!child.killed) {
|
|
82
|
+
child.kill();
|
|
83
|
+
}
|
|
84
|
+
await proxy.stop().catch(() => undefined);
|
|
85
|
+
if (!options.persistHosts) {
|
|
86
|
+
await (0, hosts_1.removeHostEntry)(options.domain).catch(() => undefined);
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=process-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-runner.js","sourceRoot":"","sources":["../src/process-runner.ts"],"names":[],"mappings":"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"}
|
package/dist/proxy.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
interface ProxyOptions {
|
|
2
|
+
httpPort: number;
|
|
3
|
+
fallbackHttpPort?: number;
|
|
4
|
+
httpsPort?: number;
|
|
5
|
+
fallbackHttpsPort?: number;
|
|
6
|
+
httpsCredentials?: {
|
|
7
|
+
key: Buffer;
|
|
8
|
+
cert: Buffer;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export declare class ProxyService {
|
|
12
|
+
private readonly proxy;
|
|
13
|
+
private readonly routes;
|
|
14
|
+
private httpServer?;
|
|
15
|
+
private httpsServer?;
|
|
16
|
+
start(options: ProxyOptions): Promise<void>;
|
|
17
|
+
stop(): Promise<void>;
|
|
18
|
+
getBoundPorts(): {
|
|
19
|
+
http?: number;
|
|
20
|
+
https?: number;
|
|
21
|
+
};
|
|
22
|
+
upsertRoute(domain: string, target: string): void;
|
|
23
|
+
removeRoute(domain: string): void;
|
|
24
|
+
private createHttpServer;
|
|
25
|
+
private createHttpsServer;
|
|
26
|
+
private listen;
|
|
27
|
+
private closeServer;
|
|
28
|
+
private handleRequest;
|
|
29
|
+
private handleUpgrade;
|
|
30
|
+
}
|
|
31
|
+
export {};
|
package/dist/proxy.js
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ProxyService = void 0;
|
|
7
|
+
const http_1 = __importDefault(require("http"));
|
|
8
|
+
const https_1 = __importDefault(require("https"));
|
|
9
|
+
const http_proxy_1 = __importDefault(require("http-proxy"));
|
|
10
|
+
const terminal_1 = require("./terminal");
|
|
11
|
+
class ProxyService {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.proxy = http_proxy_1.default.createProxyServer({ xfwd: true, ws: true });
|
|
14
|
+
this.routes = new Map();
|
|
15
|
+
}
|
|
16
|
+
async start(options) {
|
|
17
|
+
this.httpServer = await this.createHttpServer(options.httpPort, options.fallbackHttpPort);
|
|
18
|
+
this.httpServer.on('upgrade', (req, socket, head) => this.handleUpgrade(req, socket, head));
|
|
19
|
+
if (options.httpsPort && options.httpsCredentials) {
|
|
20
|
+
this.httpsServer = await this.createHttpsServer(options, options.httpsPort, options.fallbackHttpsPort);
|
|
21
|
+
this.httpsServer.on('upgrade', (req, socket, head) => this.handleUpgrade(req, socket, head));
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async stop() {
|
|
25
|
+
await Promise.all([
|
|
26
|
+
this.httpServer ? this.closeServer(this.httpServer) : Promise.resolve(),
|
|
27
|
+
this.httpsServer ? this.closeServer(this.httpsServer) : Promise.resolve()
|
|
28
|
+
]);
|
|
29
|
+
this.routes.clear();
|
|
30
|
+
}
|
|
31
|
+
getBoundPorts() {
|
|
32
|
+
return {
|
|
33
|
+
http: extractPort(this.httpServer),
|
|
34
|
+
https: extractPort(this.httpsServer)
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
upsertRoute(domain, target) {
|
|
38
|
+
const normalized = domain.toLowerCase();
|
|
39
|
+
this.routes.set(normalized, target);
|
|
40
|
+
}
|
|
41
|
+
removeRoute(domain) {
|
|
42
|
+
this.routes.delete(domain.toLowerCase());
|
|
43
|
+
}
|
|
44
|
+
async createHttpServer(port, fallback) {
|
|
45
|
+
try {
|
|
46
|
+
return (await this.listen(port, (req, res) => this.handleRequest(req, res)));
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
if (fallback && fallback !== port && isPortError(error)) {
|
|
50
|
+
(0, terminal_1.logWarn)(`Port ${port} unavailable. Falling back to ${fallback}.`);
|
|
51
|
+
return (await this.listen(fallback, (req, res) => this.handleRequest(req, res)));
|
|
52
|
+
}
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async createHttpsServer(options, port, fallback) {
|
|
57
|
+
const listener = () => https_1.default.createServer({
|
|
58
|
+
key: options.httpsCredentials?.key,
|
|
59
|
+
cert: options.httpsCredentials?.cert
|
|
60
|
+
}, (req, res) => this.handleRequest(req, res));
|
|
61
|
+
try {
|
|
62
|
+
return (await this.listen(port, undefined, listener));
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
if (fallback && fallback !== port && isPortError(error)) {
|
|
66
|
+
(0, terminal_1.logWarn)(`HTTPS port ${port} unavailable. Falling back to ${fallback}.`);
|
|
67
|
+
return (await this.listen(fallback, undefined, listener));
|
|
68
|
+
}
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async listen(port, handler, factory) {
|
|
73
|
+
const server = factory ? factory() : http_1.default.createServer(handler);
|
|
74
|
+
return await new Promise((resolve, reject) => {
|
|
75
|
+
server.once('error', reject);
|
|
76
|
+
server.listen(port, () => {
|
|
77
|
+
server.removeListener('error', reject);
|
|
78
|
+
const actualPort = extractPort(server) ?? port;
|
|
79
|
+
(0, terminal_1.logInfo)(`proxy listening on port ${actualPort}`);
|
|
80
|
+
resolve(server);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
async closeServer(server) {
|
|
85
|
+
await new Promise((resolve) => server.close(() => resolve()));
|
|
86
|
+
}
|
|
87
|
+
handleRequest(req, res) {
|
|
88
|
+
const domain = (req.headers.host ?? '').split(':')[0].toLowerCase();
|
|
89
|
+
const route = this.routes.get(domain);
|
|
90
|
+
if (!route) {
|
|
91
|
+
res.statusCode = 502;
|
|
92
|
+
res.end(`/alias: no route configured for ${domain}`);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
this.proxy.web(req, res, { target: route }, (error) => {
|
|
96
|
+
(0, terminal_1.logError)(`Proxy error for ${domain}: ${error.message}`);
|
|
97
|
+
if (!res.headersSent) {
|
|
98
|
+
res.statusCode = 502;
|
|
99
|
+
}
|
|
100
|
+
res.end('/alias proxy error');
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
handleUpgrade(req, socket, head) {
|
|
104
|
+
const domain = (req.headers.host ?? '').split(':')[0].toLowerCase();
|
|
105
|
+
const route = this.routes.get(domain);
|
|
106
|
+
if (!route) {
|
|
107
|
+
socket.destroy();
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
this.proxy.ws(req, socket, head, { target: route }, (error) => {
|
|
111
|
+
(0, terminal_1.logError)(`Proxy websocket error for ${domain}: ${error.message}`);
|
|
112
|
+
socket.destroy();
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
exports.ProxyService = ProxyService;
|
|
117
|
+
function isPortError(error) {
|
|
118
|
+
return Boolean(typeof error === 'object' &&
|
|
119
|
+
error &&
|
|
120
|
+
'code' in error &&
|
|
121
|
+
['EACCES', 'EADDRINUSE'].includes(error.code ?? ''));
|
|
122
|
+
}
|
|
123
|
+
function extractPort(server) {
|
|
124
|
+
if (!server)
|
|
125
|
+
return undefined;
|
|
126
|
+
const address = server.address();
|
|
127
|
+
if (typeof address === 'object' && address) {
|
|
128
|
+
return address.port;
|
|
129
|
+
}
|
|
130
|
+
return undefined;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
type Color = 'red' | 'green' | 'yellow' | 'cyan' | 'blue' | 'magenta';
|
|
2
|
+
export declare function colorize(text: string, color: Color, bold?: boolean): string;
|
|
3
|
+
export declare function logInfo(message: string): void;
|
|
4
|
+
export declare function logWarn(message: string): void;
|
|
5
|
+
export declare function logError(message: string): void;
|
|
6
|
+
export declare function logHighlight(message: string): void;
|
|
7
|
+
export declare function logCredit(): void;
|
|
8
|
+
export {};
|
package/dist/terminal.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.colorize = colorize;
|
|
4
|
+
exports.logInfo = logInfo;
|
|
5
|
+
exports.logWarn = logWarn;
|
|
6
|
+
exports.logError = logError;
|
|
7
|
+
exports.logHighlight = logHighlight;
|
|
8
|
+
exports.logCredit = logCredit;
|
|
9
|
+
const codes = {
|
|
10
|
+
reset: '\u001B[0m',
|
|
11
|
+
bold: '\u001B[1m',
|
|
12
|
+
red: '\u001B[31m',
|
|
13
|
+
green: '\u001B[32m',
|
|
14
|
+
yellow: '\u001B[33m',
|
|
15
|
+
cyan: '\u001B[36m',
|
|
16
|
+
blue: '\u001B[34m',
|
|
17
|
+
magenta: '\u001B[35m'
|
|
18
|
+
};
|
|
19
|
+
function colorize(text, color, bold = false) {
|
|
20
|
+
return `${bold ? codes.bold : ''}${codes[color]}${text}${codes.reset}`;
|
|
21
|
+
}
|
|
22
|
+
function logInfo(message) {
|
|
23
|
+
console.log(`${colorize('/alias', 'magenta', true)} ${colorize(message, 'green')}`);
|
|
24
|
+
}
|
|
25
|
+
function logWarn(message) {
|
|
26
|
+
console.warn(`${colorize('/alias', 'magenta', true)} ${colorize(message, 'yellow')}`);
|
|
27
|
+
}
|
|
28
|
+
function logError(message) {
|
|
29
|
+
console.error(`${colorize('/alias', 'magenta', true)} ${colorize(message, 'red')}`);
|
|
30
|
+
}
|
|
31
|
+
function logHighlight(message) {
|
|
32
|
+
console.log(`${colorize('/alias', 'magenta', true)} ${colorize(message, 'cyan')}`);
|
|
33
|
+
}
|
|
34
|
+
function logCredit() {
|
|
35
|
+
console.log(`\n${colorize('/alias', 'magenta', true)} by ${colorize('@launchaddict', 'blue', true)}\n`);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=terminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":";;AAaA,4BAEC;AAED,0BAEC;AAED,0BAEC;AAED,4BAEC;AAED,oCAEC;AAED,8BAEC;AAnCD,MAAM,KAAK,GAA2B;IACpC,KAAK,EAAE,WAAW;IAClB,IAAI,EAAE,WAAW;IACjB,GAAG,EAAE,YAAY;IACjB,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,YAAY;IACpB,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,YAAY;CACtB,CAAC;AAIF,SAAgB,QAAQ,CAAC,IAAY,EAAE,KAAY,EAAE,IAAI,GAAG,KAAK;IAC/D,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;AACzE,CAAC;AAED,SAAgB,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;AACtF,CAAC;AAED,SAAgB,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;AACxF,CAAC;AAED,SAAgB,QAAQ,CAAC,OAAe;IACtC,OAAO,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;AACtF,CAAC;AAED,SAAgB,YAAY,CAAC,OAAe;IAC1C,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;AACrF,CAAC;AAED,SAAgB,SAAS;IACvB,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,QAAQ,CAAC,eAAe,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1G,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ensureCertificate = ensureCertificate;
|
|
7
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const selfsigned_1 = __importDefault(require("selfsigned"));
|
|
10
|
+
const config_1 = require("./config");
|
|
11
|
+
async function ensureCertificate(domain) {
|
|
12
|
+
await (0, config_1.ensureStateDirectories)();
|
|
13
|
+
const safeName = domain.replace(/[^a-z0-9.-]/gi, '_');
|
|
14
|
+
const keyPath = path_1.default.join(config_1.CERTS_DIR, `${safeName}.key.pem`);
|
|
15
|
+
const certPath = path_1.default.join(config_1.CERTS_DIR, `${safeName}.cert.pem`);
|
|
16
|
+
if (await fs_extra_1.default.pathExists(keyPath) && await fs_extra_1.default.pathExists(certPath)) {
|
|
17
|
+
const [key, cert] = await Promise.all([fs_extra_1.default.readFile(keyPath), fs_extra_1.default.readFile(certPath)]);
|
|
18
|
+
return { key, cert, keyPath, certPath };
|
|
19
|
+
}
|
|
20
|
+
const attrs = [{ name: 'commonName', value: domain }];
|
|
21
|
+
const pems = selfsigned_1.default.generate(attrs, {
|
|
22
|
+
days: 30,
|
|
23
|
+
keySize: 2048,
|
|
24
|
+
algorithm: 'sha256'
|
|
25
|
+
});
|
|
26
|
+
await fs_extra_1.default.writeFile(keyPath, pems.private, 'utf8');
|
|
27
|
+
await fs_extra_1.default.writeFile(certPath, pems.cert, 'utf8');
|
|
28
|
+
return { key: Buffer.from(pems.private), cert: Buffer.from(pems.cert), keyPath, certPath };
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=tls-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tls-manager.js","sourceRoot":"","sources":["../src/tls-manager.ts"],"names":[],"mappings":";;;;;AAYA,8CAsBC;AAlCD,wDAA0B;AAC1B,gDAAwB;AACxB,4DAAoC;AACpC,qCAA6D;AAStD,KAAK,UAAU,iBAAiB,CAAC,MAAc;IACpD,MAAM,IAAA,+BAAsB,GAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,kBAAS,EAAE,GAAG,QAAQ,UAAU,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,kBAAS,EAAE,GAAG,QAAQ,WAAW,CAAC,CAAC;IAE9D,IAAI,MAAM,kBAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,MAAM,kBAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,kBAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,kBAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACrF,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,oBAAU,CAAC,QAAQ,CAAC,KAAK,EAAE;QACtC,IAAI,EAAE,EAAE;QACR,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,QAAQ;KACpB,CAAC,CAAC;IAEH,MAAM,kBAAE,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,kBAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAEhD,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC7F,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
export interface PortScanRange {
|
|
2
|
+
start: number;
|
|
3
|
+
end: number;
|
|
4
|
+
}
|
|
5
|
+
export interface AliasCommandConfig {
|
|
6
|
+
/**
|
|
7
|
+
* Optional domain override for this script. Defaults to the root config domain.
|
|
8
|
+
*/
|
|
9
|
+
domain?: string;
|
|
10
|
+
/**
|
|
11
|
+
* Preferred port if the dev server always uses the same value.
|
|
12
|
+
*/
|
|
13
|
+
targetPort?: number;
|
|
14
|
+
/**
|
|
15
|
+
* Whether this script should force HTTPS proxying.
|
|
16
|
+
*/
|
|
17
|
+
https?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Custom log patterns that can reveal the listening port.
|
|
20
|
+
*/
|
|
21
|
+
logPatterns?: string[];
|
|
22
|
+
/**
|
|
23
|
+
* Custom scan range that overrides the root setting.
|
|
24
|
+
*/
|
|
25
|
+
portScan?: PortScanRange;
|
|
26
|
+
/**
|
|
27
|
+
* Command string to execute if the runner was not invoked with `-- <command>`.
|
|
28
|
+
*/
|
|
29
|
+
command?: string;
|
|
30
|
+
/**
|
|
31
|
+
* Additional environment variables passed to the spawned process.
|
|
32
|
+
*/
|
|
33
|
+
env?: Record<string, string>;
|
|
34
|
+
}
|
|
35
|
+
export interface AliasConfig {
|
|
36
|
+
domain: string;
|
|
37
|
+
https?: boolean;
|
|
38
|
+
proxyPort?: number;
|
|
39
|
+
httpsPort?: number;
|
|
40
|
+
persistHosts?: boolean;
|
|
41
|
+
portScan?: PortScanRange;
|
|
42
|
+
logPatterns?: string[];
|
|
43
|
+
commands?: Record<string, AliasCommandConfig>;
|
|
44
|
+
}
|
|
45
|
+
export interface LoadedConfig {
|
|
46
|
+
packagePath: string;
|
|
47
|
+
config: AliasConfig;
|
|
48
|
+
}
|
|
49
|
+
export interface ProxyRoute {
|
|
50
|
+
domain: string;
|
|
51
|
+
target: string;
|
|
52
|
+
https?: boolean;
|
|
53
|
+
}
|
|
54
|
+
export interface RunnerContext {
|
|
55
|
+
cwd: string;
|
|
56
|
+
domain: string;
|
|
57
|
+
command: string;
|
|
58
|
+
args: string[];
|
|
59
|
+
https: boolean;
|
|
60
|
+
targetHint?: number;
|
|
61
|
+
logPatterns: string[];
|
|
62
|
+
portScan: PortScanRange;
|
|
63
|
+
proxyPort: number;
|
|
64
|
+
httpsPort?: number;
|
|
65
|
+
persistHosts: boolean;
|
|
66
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "dev-alias",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Zero-touch local domain proxy by @launchaddict",
|
|
5
|
+
"type": "commonjs",
|
|
6
|
+
"bin": {
|
|
7
|
+
"alias": "dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"main": "dist/cli.js",
|
|
13
|
+
"types": "dist/cli.d.ts",
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc -p tsconfig.json",
|
|
16
|
+
"dev": "ts-node src/cli.ts --",
|
|
17
|
+
"test": "jest"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"dev",
|
|
21
|
+
"proxy",
|
|
22
|
+
"local-domain",
|
|
23
|
+
"developer-experience"
|
|
24
|
+
],
|
|
25
|
+
"author": "",
|
|
26
|
+
"license": "MIT",
|
|
27
|
+
"homepage": "https://github.com/launchaddict/dev-alias#readme",
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "git+https://github.com/launchaddict/dev-alias.git"
|
|
31
|
+
},
|
|
32
|
+
"bugs": {
|
|
33
|
+
"url": "https://github.com/launchaddict/dev-alias/issues"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"commander": "^14.0.2",
|
|
37
|
+
"fs-extra": "^11.3.2",
|
|
38
|
+
"http-proxy": "^1.18.1",
|
|
39
|
+
"selfsigned": "^4.0.0",
|
|
40
|
+
"string-argv": "^0.3.2",
|
|
41
|
+
"sudo-prompt": "^9.2.1",
|
|
42
|
+
"tcp-port-used": "^1.0.2"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/fs-extra": "^11.0.4",
|
|
46
|
+
"@types/http-proxy": "^1.17.17",
|
|
47
|
+
"@types/jest": "^30.0.0",
|
|
48
|
+
"@types/node": "^24.10.1",
|
|
49
|
+
"@types/selfsigned": "^2.0.4",
|
|
50
|
+
"@types/string-argv": "^0.1.0",
|
|
51
|
+
"jest": "^29.7.0",
|
|
52
|
+
"ts-jest": "^29.2.5",
|
|
53
|
+
"ts-node": "^10.9.2",
|
|
54
|
+
"typescript": "^5.9.3"
|
|
55
|
+
},
|
|
56
|
+
"alias": {
|
|
57
|
+
"domain": "dev-runner.localhost",
|
|
58
|
+
"proxyPort": 8050,
|
|
59
|
+
"portScan": {
|
|
60
|
+
"start": 4100,
|
|
61
|
+
"end": 4200
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|