xray-manager 1.0.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.
Files changed (91) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +798 -0
  3. package/dist/cli.d.ts +11 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +113 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/config.d.ts +49 -0
  8. package/dist/commands/config.d.ts.map +1 -0
  9. package/dist/commands/config.js +295 -0
  10. package/dist/commands/config.js.map +1 -0
  11. package/dist/commands/interactive.d.ts +83 -0
  12. package/dist/commands/interactive.d.ts.map +1 -0
  13. package/dist/commands/interactive.js +362 -0
  14. package/dist/commands/interactive.js.map +1 -0
  15. package/dist/commands/logs.d.ts +43 -0
  16. package/dist/commands/logs.d.ts.map +1 -0
  17. package/dist/commands/logs.js +257 -0
  18. package/dist/commands/logs.js.map +1 -0
  19. package/dist/commands/service.d.ts +43 -0
  20. package/dist/commands/service.d.ts.map +1 -0
  21. package/dist/commands/service.js +177 -0
  22. package/dist/commands/service.js.map +1 -0
  23. package/dist/commands/user.d.ts +43 -0
  24. package/dist/commands/user.d.ts.map +1 -0
  25. package/dist/commands/user.js +212 -0
  26. package/dist/commands/user.js.map +1 -0
  27. package/dist/constants/exit-codes.d.ts +49 -0
  28. package/dist/constants/exit-codes.d.ts.map +1 -0
  29. package/dist/constants/exit-codes.js +100 -0
  30. package/dist/constants/exit-codes.js.map +1 -0
  31. package/dist/constants/paths.d.ts +57 -0
  32. package/dist/constants/paths.d.ts.map +1 -0
  33. package/dist/constants/paths.js +72 -0
  34. package/dist/constants/paths.js.map +1 -0
  35. package/dist/constants/timeouts.d.ts +84 -0
  36. package/dist/constants/timeouts.d.ts.map +1 -0
  37. package/dist/constants/timeouts.js +111 -0
  38. package/dist/constants/timeouts.js.map +1 -0
  39. package/dist/services/config-manager.d.ts +66 -0
  40. package/dist/services/config-manager.d.ts.map +1 -0
  41. package/dist/services/config-manager.js +206 -0
  42. package/dist/services/config-manager.js.map +1 -0
  43. package/dist/services/log-manager.d.ts +113 -0
  44. package/dist/services/log-manager.d.ts.map +1 -0
  45. package/dist/services/log-manager.js +288 -0
  46. package/dist/services/log-manager.js.map +1 -0
  47. package/dist/services/systemd-manager.d.ts +197 -0
  48. package/dist/services/systemd-manager.d.ts.map +1 -0
  49. package/dist/services/systemd-manager.js +458 -0
  50. package/dist/services/systemd-manager.js.map +1 -0
  51. package/dist/services/user-manager.d.ts +63 -0
  52. package/dist/services/user-manager.d.ts.map +1 -0
  53. package/dist/services/user-manager.js +219 -0
  54. package/dist/services/user-manager.js.map +1 -0
  55. package/dist/types/config.d.ts +256 -0
  56. package/dist/types/config.d.ts.map +1 -0
  57. package/dist/types/config.js +7 -0
  58. package/dist/types/config.js.map +1 -0
  59. package/dist/types/service.d.ts +96 -0
  60. package/dist/types/service.d.ts.map +1 -0
  61. package/dist/types/service.js +7 -0
  62. package/dist/types/service.js.map +1 -0
  63. package/dist/types/user.d.ts +114 -0
  64. package/dist/types/user.d.ts.map +1 -0
  65. package/dist/types/user.js +7 -0
  66. package/dist/types/user.js.map +1 -0
  67. package/dist/utils/clipboard.d.ts +21 -0
  68. package/dist/utils/clipboard.d.ts.map +1 -0
  69. package/dist/utils/clipboard.js +45 -0
  70. package/dist/utils/clipboard.js.map +1 -0
  71. package/dist/utils/format.d.ts +93 -0
  72. package/dist/utils/format.d.ts.map +1 -0
  73. package/dist/utils/format.js +242 -0
  74. package/dist/utils/format.js.map +1 -0
  75. package/dist/utils/logger.d.ts +113 -0
  76. package/dist/utils/logger.d.ts.map +1 -0
  77. package/dist/utils/logger.js +260 -0
  78. package/dist/utils/logger.js.map +1 -0
  79. package/dist/utils/preflight.d.ts +57 -0
  80. package/dist/utils/preflight.d.ts.map +1 -0
  81. package/dist/utils/preflight.js +215 -0
  82. package/dist/utils/preflight.js.map +1 -0
  83. package/dist/utils/validator.d.ts +102 -0
  84. package/dist/utils/validator.d.ts.map +1 -0
  85. package/dist/utils/validator.js +238 -0
  86. package/dist/utils/validator.js.map +1 -0
  87. package/dist/utils/which.d.ts +13 -0
  88. package/dist/utils/which.d.ts.map +1 -0
  89. package/dist/utils/which.js +28 -0
  90. package/dist/utils/which.js.map +1 -0
  91. package/package.json +69 -0
@@ -0,0 +1,238 @@
1
+ "use strict";
2
+ /**
3
+ * 输入验证工具函数
4
+ * @module utils/validator
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.validators = void 0;
8
+ exports.isValidEmail = isValidEmail;
9
+ exports.isValidUuid = isValidUuid;
10
+ exports.isValidPort = isValidPort;
11
+ exports.isValidDomain = isValidDomain;
12
+ exports.isValidServiceName = isValidServiceName;
13
+ exports.isValidIPv4 = isValidIPv4;
14
+ exports.isValidPath = isValidPath;
15
+ exports.isValidUrl = isValidUrl;
16
+ exports.validate = validate;
17
+ exports.validateMultiple = validateMultiple;
18
+ exports.allValid = allValid;
19
+ exports.getErrors = getErrors;
20
+ /**
21
+ * 邮箱验证正则表达式
22
+ */
23
+ const EMAIL_REGEX = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
24
+ /**
25
+ * UUID v4 验证正则表达式
26
+ */
27
+ const UUID_V4_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
28
+ /**
29
+ * 端口号验证正则表达式(1-65535)
30
+ */
31
+ const _PORT_REGEX = /^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$/;
32
+ /**
33
+ * 域名验证正则表达式
34
+ */
35
+ const DOMAIN_REGEX = /^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$/;
36
+ /**
37
+ * 服务名验证正则表达式(仅字母数字、@、._-)
38
+ */
39
+ const SERVICE_NAME_REGEX = /^[a-zA-Z0-9@._-]+$/;
40
+ /**
41
+ * IPv4 地址验证正则表达式
42
+ */
43
+ const IPV4_REGEX = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
44
+ /**
45
+ * 路径验证正则表达式(Unix 路径)
46
+ */
47
+ const PATH_REGEX = /^\/(?:[^/\0]+\/)*[^/\0]*$/;
48
+ /**
49
+ * 验证邮箱地址
50
+ * @param email 邮箱地址
51
+ * @returns 是否有效
52
+ */
53
+ function isValidEmail(email) {
54
+ if (!email || typeof email !== 'string') {
55
+ return false;
56
+ }
57
+ return EMAIL_REGEX.test(email);
58
+ }
59
+ /**
60
+ * 验证 UUID v4 格式
61
+ * @param uuid UUID 字符串
62
+ * @returns 是否有效
63
+ */
64
+ function isValidUuid(uuid) {
65
+ if (!uuid || typeof uuid !== 'string') {
66
+ return false;
67
+ }
68
+ return UUID_V4_REGEX.test(uuid);
69
+ }
70
+ /**
71
+ * 验证端口号(1-65535)
72
+ * @param port 端口号(数字或字符串)
73
+ * @returns 是否有效
74
+ */
75
+ function isValidPort(port) {
76
+ const num = typeof port === 'string' ? parseInt(port, 10) : port;
77
+ if (isNaN(num) || !Number.isInteger(num)) {
78
+ return false;
79
+ }
80
+ return num >= 1 && num <= 65535;
81
+ }
82
+ /**
83
+ * 验证域名
84
+ * @param domain 域名
85
+ * @returns 是否有效
86
+ */
87
+ function isValidDomain(domain) {
88
+ if (!domain || typeof domain !== 'string') {
89
+ return false;
90
+ }
91
+ return DOMAIN_REGEX.test(domain);
92
+ }
93
+ /**
94
+ * 验证服务名称
95
+ * @param serviceName 服务名称
96
+ * @returns 是否有效
97
+ */
98
+ function isValidServiceName(serviceName) {
99
+ if (!serviceName || typeof serviceName !== 'string') {
100
+ return false;
101
+ }
102
+ return SERVICE_NAME_REGEX.test(serviceName);
103
+ }
104
+ /**
105
+ * 验证 IPv4 地址
106
+ * @param ip IP 地址
107
+ * @returns 是否有效
108
+ */
109
+ function isValidIPv4(ip) {
110
+ if (!ip || typeof ip !== 'string') {
111
+ return false;
112
+ }
113
+ return IPV4_REGEX.test(ip);
114
+ }
115
+ /**
116
+ * 验证 Unix 路径
117
+ * @param path 路径字符串
118
+ * @returns 是否有效
119
+ */
120
+ function isValidPath(path) {
121
+ if (!path || typeof path !== 'string') {
122
+ return false;
123
+ }
124
+ return PATH_REGEX.test(path);
125
+ }
126
+ /**
127
+ * 验证 URL
128
+ * @param url URL 字符串
129
+ * @returns 是否有效
130
+ */
131
+ function isValidUrl(url) {
132
+ try {
133
+ new URL(url);
134
+ return true;
135
+ }
136
+ catch {
137
+ return false;
138
+ }
139
+ }
140
+ /**
141
+ * 验证器映射
142
+ */
143
+ exports.validators = {
144
+ email: {
145
+ validate: isValidEmail,
146
+ errorMessage: '请输入有效的邮箱地址(如 user@example.com)',
147
+ },
148
+ uuid: {
149
+ validate: isValidUuid,
150
+ errorMessage: '请输入有效的 UUID v4 格式',
151
+ },
152
+ port: {
153
+ validate: (value) => {
154
+ const num = parseInt(value, 10);
155
+ return !isNaN(num) && isValidPort(num);
156
+ },
157
+ errorMessage: '端口号必须在 1-65535 之间',
158
+ },
159
+ domain: {
160
+ validate: isValidDomain,
161
+ errorMessage: '请输入有效的域名(如 example.com)',
162
+ },
163
+ serviceName: {
164
+ validate: isValidServiceName,
165
+ errorMessage: '服务名只能包含字母、数字和 @._- 字符',
166
+ },
167
+ ipv4: {
168
+ validate: isValidIPv4,
169
+ errorMessage: '请输入有效的 IPv4 地址',
170
+ },
171
+ path: {
172
+ validate: isValidPath,
173
+ errorMessage: '请输入有效的 Unix 路径(以 / 开头)',
174
+ },
175
+ url: {
176
+ validate: isValidUrl,
177
+ errorMessage: '请输入有效的 URL',
178
+ },
179
+ };
180
+ /**
181
+ * 通用验证函数
182
+ * @param value 待验证的值
183
+ * @param validatorName 验证器名称
184
+ * @param fieldName 字段名称(用于错误消息)
185
+ * @returns 验证结果
186
+ */
187
+ function validate(value, validatorName, fieldName) {
188
+ const validator = exports.validators[validatorName];
189
+ if (!validator) {
190
+ return {
191
+ valid: false,
192
+ error: `未知的验证器: ${validatorName}`,
193
+ field: fieldName,
194
+ };
195
+ }
196
+ const valid = validator.validate(value);
197
+ if (!valid) {
198
+ return {
199
+ valid: false,
200
+ error: validator.errorMessage,
201
+ field: fieldName,
202
+ };
203
+ }
204
+ return { valid: true };
205
+ }
206
+ /**
207
+ * 批量验证
208
+ * @param values 字段和值的映射
209
+ * @param validatorMap 字段和验证器的映射
210
+ * @returns 验证结果列表
211
+ */
212
+ function validateMultiple(values, validatorMap) {
213
+ const results = [];
214
+ for (const [field, value] of Object.entries(values)) {
215
+ const validatorName = validatorMap[field];
216
+ if (validatorName) {
217
+ results.push(validate(value, validatorName, field));
218
+ }
219
+ }
220
+ return results;
221
+ }
222
+ /**
223
+ * 检查所有验证是否通过
224
+ * @param results 验证结果列表
225
+ * @returns 是否全部通过
226
+ */
227
+ function allValid(results) {
228
+ return results.every((result) => result.valid);
229
+ }
230
+ /**
231
+ * 获取所有错误消息
232
+ * @param results 验证结果列表
233
+ * @returns 错误消息列表
234
+ */
235
+ function getErrors(results) {
236
+ return results.filter((result) => !result.valid).map((result) => result.error || '未知错误');
237
+ }
238
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Which utility - Find executable in PATH
3
+ *
4
+ * @module utils/which
5
+ */
6
+ /**
7
+ * Find executable in PATH
8
+ *
9
+ * @param command - Command name to find
10
+ * @returns Path to executable or null if not found
11
+ */
12
+ export declare function which(command: string): string | null;
13
+ //# sourceMappingURL=which.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"which.d.ts","sourceRoot":"","sources":["../../src/utils/which.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWpD"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ /**
3
+ * Which utility - Find executable in PATH
4
+ *
5
+ * @module utils/which
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.which = which;
9
+ const child_process_1 = require("child_process");
10
+ /**
11
+ * Find executable in PATH
12
+ *
13
+ * @param command - Command name to find
14
+ * @returns Path to executable or null if not found
15
+ */
16
+ function which(command) {
17
+ try {
18
+ const result = (0, child_process_1.execSync)(`which ${command}`, {
19
+ encoding: 'utf-8',
20
+ stdio: ['ignore', 'pipe', 'ignore'],
21
+ });
22
+ return result.trim() || null;
23
+ }
24
+ catch {
25
+ return null;
26
+ }
27
+ }
28
+ //# sourceMappingURL=which.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"which.js","sourceRoot":"","sources":["../../src/utils/which.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAUH,sBAWC;AAnBD,iDAAyC;AAEzC;;;;;GAKG;AACH,SAAgB,KAAK,CAAC,OAAe;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,wBAAQ,EAAC,SAAS,OAAO,EAAE,EAAE;YAC1C,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACpC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "xray-manager",
3
+ "version": "1.0.0",
4
+ "description": "Xray VPN 服务管理 CLI 工具 - npm installable interactive CLI tool for Xray service management",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "xray-manager": "./dist/cli.js",
9
+ "xm": "./dist/cli.js"
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "dev": "tsc --watch",
17
+ "test": "vitest run",
18
+ "test:watch": "vitest",
19
+ "test:coverage": "vitest run --coverage",
20
+ "test:ui": "vitest --ui",
21
+ "lint": "eslint src tests --ext .ts",
22
+ "format": "prettier --write \"src/**/*.ts\" \"tests/**/*.ts\"",
23
+ "prepublishOnly": "npm run build"
24
+ },
25
+ "keywords": [
26
+ "xray",
27
+ "vpn",
28
+ "cli",
29
+ "systemd",
30
+ "interactive",
31
+ "service-management",
32
+ "vless",
33
+ "reality",
34
+ "proxy",
35
+ "server-management"
36
+ ],
37
+ "author": "DanOps-1",
38
+ "license": "MIT",
39
+ "repository": {
40
+ "type": "git",
41
+ "url": "https://github.com/DanOps-1/Xray-VPN-OneClick.git"
42
+ },
43
+ "bugs": {
44
+ "url": "https://github.com/DanOps-1/Xray-VPN-OneClick/issues"
45
+ },
46
+ "homepage": "https://github.com/DanOps-1/Xray-VPN-OneClick#readme",
47
+ "engines": {
48
+ "node": ">=18.0.0"
49
+ },
50
+ "dependencies": {
51
+ "@inquirer/prompts": "^8.1.0",
52
+ "chalk": "^4.1.2",
53
+ "clipboardy": "^5.0.2",
54
+ "commander": "^14.0.2",
55
+ "ora": "^9.0.0"
56
+ },
57
+ "devDependencies": {
58
+ "@types/node": "^25.0.3",
59
+ "@typescript-eslint/eslint-plugin": "^8.52.0",
60
+ "@typescript-eslint/parser": "^8.52.0",
61
+ "@vitest/coverage-v8": "^4.0.16",
62
+ "@vitest/ui": "^4.0.16",
63
+ "c8": "^10.1.3",
64
+ "eslint": "^9.39.2",
65
+ "prettier": "^3.7.4",
66
+ "typescript": "^5.9.3",
67
+ "vitest": "^4.0.16"
68
+ }
69
+ }