@ryuyx/pvm 0.0.1 → 0.0.2
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/README.md +30 -4
- package/dist/commands/install.d.ts +3 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +210 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -4
package/README.md
CHANGED
|
@@ -94,9 +94,33 @@ pvm config reset
|
|
|
94
94
|
|
|
95
95
|
## Shell Integration
|
|
96
96
|
|
|
97
|
-
Since Node.js runs in a subprocess and cannot modify the parent shell's environment, you
|
|
97
|
+
Since Node.js runs in a subprocess and cannot modify the parent shell's environment, you have the following options:
|
|
98
98
|
|
|
99
|
-
### Option 1:
|
|
99
|
+
### Option 1: Automatic Installation (Recommended)
|
|
100
|
+
|
|
101
|
+
Simply run the install command to automatically add shell integration:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
pvm install
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
This will:
|
|
108
|
+
- Detect your shell type (Bash, Zsh, or PowerShell)
|
|
109
|
+
- Add the integration function to your shell config file
|
|
110
|
+
- Enable `pvm on` and `pvm off` to work automatically
|
|
111
|
+
|
|
112
|
+
Then reload your shell:
|
|
113
|
+
```bash
|
|
114
|
+
source ~/.bashrc # or ~/.zshrc for Zsh
|
|
115
|
+
# Or simply restart your terminal
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
To uninstall:
|
|
119
|
+
```bash
|
|
120
|
+
pvm uninstall
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Option 2: Manual Copy-Paste (Simple)
|
|
100
124
|
|
|
101
125
|
```bash
|
|
102
126
|
# 1. Run this to see the commands
|
|
@@ -108,9 +132,9 @@ export https_proxy="http://127.0.0.1:7890"
|
|
|
108
132
|
# ... etc
|
|
109
133
|
```
|
|
110
134
|
|
|
111
|
-
### Option
|
|
135
|
+
### Option 3: Manual Shell Function (Advanced)
|
|
112
136
|
|
|
113
|
-
|
|
137
|
+
If you prefer to add the function manually, add this to your shell profile:
|
|
114
138
|
|
|
115
139
|
**For Bash/Zsh** (~/.bashrc or ~/.zshrc):
|
|
116
140
|
```bash
|
|
@@ -180,6 +204,8 @@ Config is stored at:
|
|
|
180
204
|
| `pvm off` | Display commands to disable proxy |
|
|
181
205
|
| `pvm list` | Show configuration and status |
|
|
182
206
|
| `pvm set <url>` | Set proxy URL |
|
|
207
|
+
| `pvm install` | Auto-install shell integration |
|
|
208
|
+
| `pvm uninstall` | Remove shell integration |
|
|
183
209
|
| `pvm config show` | Show configuration |
|
|
184
210
|
| `pvm config set <key> <value>` | Set config value |
|
|
185
211
|
| `pvm config add no-proxy <item>` | Add to NO_PROXY list |
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAuFA,wBAAgB,aAAa,SA8D5B;AAED,wBAAgB,eAAe,SAgG9B"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
import { execSync } from 'child_process';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
const BASH_FUNCTION = `
|
|
7
|
+
# pvm - Proxy Manager shell integration
|
|
8
|
+
pvm() {
|
|
9
|
+
if [ "$1" = "on" ]; then
|
|
10
|
+
eval "$(command pvm on 2>/dev/null | grep -E '^(export|unset)')"
|
|
11
|
+
echo "✓ Proxy enabled"
|
|
12
|
+
elif [ "$1" = "off" ]; then
|
|
13
|
+
eval "$(command pvm off 2>/dev/null | grep -E '^(export|unset)')"
|
|
14
|
+
echo "✗ Proxy disabled"
|
|
15
|
+
else
|
|
16
|
+
command pvm "$@"
|
|
17
|
+
fi
|
|
18
|
+
}
|
|
19
|
+
`;
|
|
20
|
+
const ZSH_FUNCTION = BASH_FUNCTION; // Same as Bash
|
|
21
|
+
const POWERSHELL_FUNCTION = `
|
|
22
|
+
# pvm - Proxy Manager shell integration
|
|
23
|
+
function pvm {
|
|
24
|
+
if ($args[0] -eq "on") {
|
|
25
|
+
$commands = & (Get-Command pvm -CommandType Application).Source on 2>$null | Select-String '^\\$env:|^Remove-Item'
|
|
26
|
+
$commands | ForEach-Object { Invoke-Expression $_ }
|
|
27
|
+
Write-Host "✓ Proxy enabled" -ForegroundColor Green
|
|
28
|
+
} elseif ($args[0] -eq "off") {
|
|
29
|
+
$commands = & (Get-Command pvm -CommandType Application).Source off 2>$null | Select-String '^\\$env:|^Remove-Item'
|
|
30
|
+
$commands | ForEach-Object { Invoke-Expression $_ }
|
|
31
|
+
Write-Host "✗ Proxy disabled" -ForegroundColor Red
|
|
32
|
+
} else {
|
|
33
|
+
& (Get-Command pvm -CommandType Application).Source @args
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
`;
|
|
37
|
+
function detectShell() {
|
|
38
|
+
const homeDir = os.homedir();
|
|
39
|
+
// Check SHELL environment variable (Unix-like systems)
|
|
40
|
+
const shellEnv = process.env.SHELL || '';
|
|
41
|
+
if (shellEnv.includes('zsh')) {
|
|
42
|
+
return { shell: 'zsh', configFile: path.join(homeDir, '.zshrc') };
|
|
43
|
+
}
|
|
44
|
+
else if (shellEnv.includes('bash')) {
|
|
45
|
+
return { shell: 'bash', configFile: path.join(homeDir, '.bashrc') };
|
|
46
|
+
}
|
|
47
|
+
else if (os.platform() === 'win32') {
|
|
48
|
+
// PowerShell on Windows
|
|
49
|
+
try {
|
|
50
|
+
const profilePath = execSync('powershell -NoProfile -Command "echo $PROFILE"', { encoding: 'utf-8' }).trim();
|
|
51
|
+
return { shell: 'powershell', configFile: profilePath };
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
console.error(chalk.red('Failed to detect PowerShell profile path'));
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Default to bash if shell is not detected
|
|
59
|
+
return { shell: 'bash', configFile: path.join(homeDir, '.bashrc') };
|
|
60
|
+
}
|
|
61
|
+
function getShellFunction(shell) {
|
|
62
|
+
switch (shell) {
|
|
63
|
+
case 'zsh':
|
|
64
|
+
return ZSH_FUNCTION;
|
|
65
|
+
case 'bash':
|
|
66
|
+
return BASH_FUNCTION;
|
|
67
|
+
case 'powershell':
|
|
68
|
+
return POWERSHELL_FUNCTION;
|
|
69
|
+
default:
|
|
70
|
+
return BASH_FUNCTION;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function isAlreadyInstalled(configFile) {
|
|
74
|
+
if (!fs.existsSync(configFile)) {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
const content = fs.readFileSync(configFile, 'utf-8');
|
|
78
|
+
return content.includes('# pvm - Proxy Manager shell integration');
|
|
79
|
+
}
|
|
80
|
+
export function handleInstall() {
|
|
81
|
+
console.log(chalk.blue.bold('🔧 Installing pvm shell integration...\n'));
|
|
82
|
+
const detected = detectShell();
|
|
83
|
+
if (!detected) {
|
|
84
|
+
console.error(chalk.red('✗ Could not detect shell type'));
|
|
85
|
+
console.log(chalk.yellow('\nPlease manually add the shell function to your shell configuration file.'));
|
|
86
|
+
console.log(chalk.cyan('\nSee documentation: https://github.com/ryuyx/pvm#shell-integration'));
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
const { shell, configFile } = detected;
|
|
90
|
+
console.log(chalk.gray(`Detected shell: ${shell}`));
|
|
91
|
+
console.log(chalk.gray(`Config file: ${configFile}\n`));
|
|
92
|
+
// Check if already installed
|
|
93
|
+
if (isAlreadyInstalled(configFile)) {
|
|
94
|
+
console.log(chalk.yellow('⚠ Shell integration is already installed!'));
|
|
95
|
+
console.log(chalk.gray(`Found in: ${configFile}\n`));
|
|
96
|
+
console.log(chalk.cyan('To reinstall, please remove the existing function first.'));
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// Ensure config file directory exists (for PowerShell on Windows)
|
|
100
|
+
const configDir = path.dirname(configFile);
|
|
101
|
+
if (!fs.existsSync(configDir)) {
|
|
102
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
103
|
+
}
|
|
104
|
+
// Get the shell function
|
|
105
|
+
const shellFunction = getShellFunction(shell);
|
|
106
|
+
// Append to config file
|
|
107
|
+
try {
|
|
108
|
+
const separator = '\n' + '='.repeat(60) + '\n';
|
|
109
|
+
const content = fs.existsSync(configFile) ? fs.readFileSync(configFile, 'utf-8') : '';
|
|
110
|
+
const newContent = content + separator + shellFunction;
|
|
111
|
+
fs.writeFileSync(configFile, newContent, 'utf-8');
|
|
112
|
+
console.log(chalk.green('✓ Shell integration installed successfully!\n'));
|
|
113
|
+
console.log(chalk.cyan('To activate the changes, run:'));
|
|
114
|
+
if (shell === 'powershell') {
|
|
115
|
+
console.log(chalk.white(` . $PROFILE`));
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
console.log(chalk.white(` source ${configFile}`));
|
|
119
|
+
}
|
|
120
|
+
console.log(chalk.gray('\nOr restart your terminal.\n'));
|
|
121
|
+
console.log(chalk.cyan('Now you can use:'));
|
|
122
|
+
console.log(chalk.white(' pvm on # Automatically enables proxy'));
|
|
123
|
+
console.log(chalk.white(' pvm off # Automatically disables proxy'));
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
console.error(chalk.red('✗ Failed to write to config file:'), error);
|
|
127
|
+
process.exit(1);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
export function handleUninstall() {
|
|
131
|
+
console.log(chalk.blue.bold('🔧 Uninstalling pvm shell integration...\n'));
|
|
132
|
+
const detected = detectShell();
|
|
133
|
+
if (!detected) {
|
|
134
|
+
console.error(chalk.red('✗ Could not detect shell type'));
|
|
135
|
+
process.exit(1);
|
|
136
|
+
}
|
|
137
|
+
const { shell, configFile } = detected;
|
|
138
|
+
if (!fs.existsSync(configFile)) {
|
|
139
|
+
console.log(chalk.yellow('⚠ Config file does not exist'));
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
const content = fs.readFileSync(configFile, 'utf-8');
|
|
143
|
+
if (!isAlreadyInstalled(configFile)) {
|
|
144
|
+
console.log(chalk.yellow('⚠ Shell integration is not installed'));
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
// Find the start and end of the pvm block
|
|
148
|
+
const lines = content.split('\n');
|
|
149
|
+
let startIndex = -1;
|
|
150
|
+
let endIndex = -1;
|
|
151
|
+
// Find start (look for separator before comment)
|
|
152
|
+
for (let i = 0; i < lines.length; i++) {
|
|
153
|
+
if (lines[i].includes('# pvm - Proxy Manager shell integration')) {
|
|
154
|
+
startIndex = i;
|
|
155
|
+
// Look back for empty line before comment
|
|
156
|
+
if (i > 0 && lines[i - 1].trim() === '') {
|
|
157
|
+
startIndex = i - 1;
|
|
158
|
+
// Look back for separator before empty line
|
|
159
|
+
if (i > 1 && lines[i - 2].match(/^=+$/)) {
|
|
160
|
+
startIndex = i - 2;
|
|
161
|
+
// Look back for empty line before separator
|
|
162
|
+
if (i > 2 && lines[i - 3].trim() === '') {
|
|
163
|
+
startIndex = i - 3;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (startIndex === -1) {
|
|
171
|
+
console.log(chalk.yellow('⚠ Could not find pvm shell integration'));
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
// Find end (look for closing brace of pvm function)
|
|
175
|
+
// For PowerShell: closing brace at same indentation level
|
|
176
|
+
// For Bash/Zsh: closing brace at start of line
|
|
177
|
+
for (let i = startIndex; i < lines.length; i++) {
|
|
178
|
+
const line = lines[i];
|
|
179
|
+
// Match closing brace that's either at column 0 or has only whitespace before it
|
|
180
|
+
if (line.match(/^}\s*$/) && i > startIndex) {
|
|
181
|
+
endIndex = i;
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
if (endIndex === -1) {
|
|
186
|
+
console.log(chalk.yellow('⚠ Could not find end of pvm function'));
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
// Skip any trailing empty lines after the closing brace
|
|
190
|
+
while (endIndex + 1 < lines.length && lines[endIndex + 1].trim() === '') {
|
|
191
|
+
endIndex++;
|
|
192
|
+
}
|
|
193
|
+
// Remove the block
|
|
194
|
+
const newLines = [
|
|
195
|
+
...lines.slice(0, startIndex),
|
|
196
|
+
...lines.slice(endIndex + 1)
|
|
197
|
+
];
|
|
198
|
+
// Write back
|
|
199
|
+
fs.writeFileSync(configFile, newLines.join('\n'), 'utf-8');
|
|
200
|
+
console.log(chalk.green('✓ Shell integration uninstalled successfully!\n'));
|
|
201
|
+
console.log(chalk.cyan('To apply changes, run:'));
|
|
202
|
+
if (shell === 'powershell') {
|
|
203
|
+
console.log(chalk.white(` . $PROFILE`));
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
console.log(chalk.white(` source ${configFile}`));
|
|
207
|
+
}
|
|
208
|
+
console.log(chalk.gray('\nOr restart your terminal.'));
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -6,6 +6,7 @@ import { handleOff } from './commands/off.js';
|
|
|
6
6
|
import { handleList } from './commands/list.js';
|
|
7
7
|
import { handleSet } from './commands/set.js';
|
|
8
8
|
import { handleConfig } from './commands/config.js';
|
|
9
|
+
import { handleInstall, handleUninstall } from './commands/install.js';
|
|
9
10
|
import { getProxyStatus } from './core/proxy.js';
|
|
10
11
|
const program = new Command();
|
|
11
12
|
program
|
|
@@ -79,6 +80,20 @@ configCmd
|
|
|
79
80
|
.action(() => {
|
|
80
81
|
handleConfig('reset');
|
|
81
82
|
});
|
|
83
|
+
// pvm install
|
|
84
|
+
program
|
|
85
|
+
.command('install')
|
|
86
|
+
.description('Install shell integration (auto-enable/disable proxy)')
|
|
87
|
+
.action(() => {
|
|
88
|
+
handleInstall();
|
|
89
|
+
});
|
|
90
|
+
// pvm uninstall
|
|
91
|
+
program
|
|
92
|
+
.command('uninstall')
|
|
93
|
+
.description('Uninstall shell integration')
|
|
94
|
+
.action(() => {
|
|
95
|
+
handleUninstall();
|
|
96
|
+
});
|
|
82
97
|
// Default action (no command)
|
|
83
98
|
program.action(() => {
|
|
84
99
|
const status = getProxyStatus();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ryuyx/pvm",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
4
4
|
"description": "Cross-platform CLI tool for managing proxy environment variables",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -26,9 +26,6 @@
|
|
|
26
26
|
],
|
|
27
27
|
"author": "Liu Yuxuan <768442726@qq.com>",
|
|
28
28
|
"license": "MIT",
|
|
29
|
-
"publishConfig": {
|
|
30
|
-
"access": "public"
|
|
31
|
-
},
|
|
32
29
|
"repository": {
|
|
33
30
|
"type": "git",
|
|
34
31
|
"url": "git+https://github.com/ryuyx/pvm.git"
|