needware-cli 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 (93) hide show
  1. package/.editorconfig +21 -0
  2. package/AGENT_COMMAND_SUMMARY.md +364 -0
  3. package/CHANGELOG.md +138 -0
  4. package/FEATURE_INTERACTIVE_MODE.md +303 -0
  5. package/INTERACTIVE_EXAMPLE.md +305 -0
  6. package/LICENSE +22 -0
  7. package/PROJECT_SUMMARY.md +435 -0
  8. package/QUICK_START.md +216 -0
  9. package/README.md +310 -0
  10. package/SETUP.md +315 -0
  11. package/bin/cli.js +49 -0
  12. package/config/default.json +20 -0
  13. package/dist/commands/agent.d.ts +38 -0
  14. package/dist/commands/agent.d.ts.map +1 -0
  15. package/dist/commands/agent.js +444 -0
  16. package/dist/commands/agent.js.map +1 -0
  17. package/dist/commands/config.d.ts +48 -0
  18. package/dist/commands/config.d.ts.map +1 -0
  19. package/dist/commands/config.js +197 -0
  20. package/dist/commands/config.js.map +1 -0
  21. package/dist/commands/example.d.ts +32 -0
  22. package/dist/commands/example.d.ts.map +1 -0
  23. package/dist/commands/example.js +154 -0
  24. package/dist/commands/example.js.map +1 -0
  25. package/dist/commands/index.d.ts +8 -0
  26. package/dist/commands/index.d.ts.map +1 -0
  27. package/dist/commands/index.js +15 -0
  28. package/dist/commands/index.js.map +1 -0
  29. package/dist/commands/init.d.ts +25 -0
  30. package/dist/commands/init.d.ts.map +1 -0
  31. package/dist/commands/init.js +158 -0
  32. package/dist/commands/init.js.map +1 -0
  33. package/dist/core/cli.d.ts +37 -0
  34. package/dist/core/cli.d.ts.map +1 -0
  35. package/dist/core/cli.js +160 -0
  36. package/dist/core/cli.js.map +1 -0
  37. package/dist/core/command.d.ts +41 -0
  38. package/dist/core/command.d.ts.map +1 -0
  39. package/dist/core/command.js +87 -0
  40. package/dist/core/command.js.map +1 -0
  41. package/dist/core/logger.d.ts +30 -0
  42. package/dist/core/logger.d.ts.map +1 -0
  43. package/dist/core/logger.js +163 -0
  44. package/dist/core/logger.js.map +1 -0
  45. package/dist/index.d.ts +15 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +125 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/sdk/base-sdk.d.ts +61 -0
  50. package/dist/sdk/base-sdk.d.ts.map +1 -0
  51. package/dist/sdk/base-sdk.js +71 -0
  52. package/dist/sdk/base-sdk.js.map +1 -0
  53. package/dist/sdk/example-sdk.d.ts +40 -0
  54. package/dist/sdk/example-sdk.d.ts.map +1 -0
  55. package/dist/sdk/example-sdk.js +168 -0
  56. package/dist/sdk/example-sdk.js.map +1 -0
  57. package/dist/sdk/index.d.ts +59 -0
  58. package/dist/sdk/index.d.ts.map +1 -0
  59. package/dist/sdk/index.js +169 -0
  60. package/dist/sdk/index.js.map +1 -0
  61. package/dist/types/command.d.ts +34 -0
  62. package/dist/types/command.d.ts.map +1 -0
  63. package/dist/types/command.js +13 -0
  64. package/dist/types/command.js.map +1 -0
  65. package/dist/types/config.d.ts +30 -0
  66. package/dist/types/config.d.ts.map +1 -0
  67. package/dist/types/config.js +6 -0
  68. package/dist/types/config.js.map +1 -0
  69. package/dist/types/error.d.ts +24 -0
  70. package/dist/types/error.d.ts.map +1 -0
  71. package/dist/types/error.js +33 -0
  72. package/dist/types/error.js.map +1 -0
  73. package/dist/types/index.d.ts +8 -0
  74. package/dist/types/index.d.ts.map +1 -0
  75. package/dist/types/index.js +23 -0
  76. package/dist/types/index.js.map +1 -0
  77. package/dist/types/sdk.d.ts +21 -0
  78. package/dist/types/sdk.d.ts.map +1 -0
  79. package/dist/types/sdk.js +6 -0
  80. package/dist/types/sdk.js.map +1 -0
  81. package/dist/utils/config.d.ts +59 -0
  82. package/dist/utils/config.d.ts.map +1 -0
  83. package/dist/utils/config.js +237 -0
  84. package/dist/utils/config.js.map +1 -0
  85. package/dist/utils/file.d.ts +66 -0
  86. package/dist/utils/file.d.ts.map +1 -0
  87. package/dist/utils/file.js +162 -0
  88. package/dist/utils/file.js.map +1 -0
  89. package/dist/utils/validator.d.ts +66 -0
  90. package/dist/utils/validator.d.ts.map +1 -0
  91. package/dist/utils/validator.js +120 -0
  92. package/dist/utils/validator.js.map +1 -0
  93. package/package.json +61 -0
@@ -0,0 +1,237 @@
1
+ "use strict";
2
+ /**
3
+ * 配置管理器
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.ConfigManager = void 0;
40
+ const path = __importStar(require("path"));
41
+ const file_1 = require("./file");
42
+ const error_1 = require("../types/error");
43
+ class ConfigManager {
44
+ configPath;
45
+ config;
46
+ defaultConfig;
47
+ constructor(options = {}) {
48
+ this.configPath = options.configPath || this.getDefaultConfigPath();
49
+ this.defaultConfig = this.createDefaultConfig();
50
+ if (options.defaultConfig) {
51
+ this.defaultConfig = this.merge(this.defaultConfig, options.defaultConfig);
52
+ }
53
+ this.config = this.load();
54
+ }
55
+ /**
56
+ * 获取默认配置文件路径
57
+ */
58
+ getDefaultConfigPath() {
59
+ const configDir = file_1.FileUtils.getConfigDir();
60
+ return path.join(configDir, 'config.json');
61
+ }
62
+ /**
63
+ * 创建默认配置
64
+ */
65
+ createDefaultConfig() {
66
+ return {
67
+ version: '1.0.0',
68
+ logging: {
69
+ level: 'info',
70
+ file: path.join(file_1.FileUtils.getConfigDir(), 'logs', 'cli.log'),
71
+ },
72
+ sdks: {
73
+ example: {
74
+ apiKey: '',
75
+ endpoint: 'https://api.example.com',
76
+ timeout: 30000,
77
+ retries: 3,
78
+ },
79
+ },
80
+ preferences: {
81
+ colorOutput: true,
82
+ interactive: true,
83
+ },
84
+ };
85
+ }
86
+ /**
87
+ * 加载配置
88
+ */
89
+ load() {
90
+ try {
91
+ // 从环境变量加载配置
92
+ const envConfig = this.loadFromEnv();
93
+ // 如果配置文件不存在,使用默认配置
94
+ if (!file_1.FileUtils.exists(this.configPath)) {
95
+ const config = this.merge(this.defaultConfig, envConfig);
96
+ this.save(config);
97
+ return config;
98
+ }
99
+ // 读取用户配置文件
100
+ const userConfig = file_1.FileUtils.readJSON(this.configPath);
101
+ // 合并配置:默认 < 用户 < 环境变量
102
+ return this.merge(this.merge(this.defaultConfig, userConfig), envConfig);
103
+ }
104
+ catch (error) {
105
+ throw new error_1.CLIError('Failed to load configuration', error_1.ErrorType.CONFIG, [
106
+ 'Check if the config file is valid JSON',
107
+ 'Try resetting config: needware-cli config reset',
108
+ ], { configPath: this.configPath, error });
109
+ }
110
+ }
111
+ /**
112
+ * 从环境变量加载配置
113
+ */
114
+ loadFromEnv() {
115
+ const envConfig = {};
116
+ // 日志级别
117
+ if (process.env.NEEDWARE_LOG_LEVEL) {
118
+ envConfig.logging = {
119
+ ...(envConfig.logging || this.defaultConfig.logging),
120
+ level: process.env.NEEDWARE_LOG_LEVEL,
121
+ };
122
+ }
123
+ // SDK 配置
124
+ if (process.env.NEEDWARE_API_KEY || process.env.NEEDWARE_ENDPOINT) {
125
+ envConfig.sdks = {
126
+ example: {
127
+ apiKey: process.env.NEEDWARE_API_KEY || '',
128
+ endpoint: process.env.NEEDWARE_ENDPOINT || this.defaultConfig.sdks.example.endpoint,
129
+ timeout: this.defaultConfig.sdks.example.timeout,
130
+ },
131
+ };
132
+ }
133
+ // 偏好设置
134
+ if (process.env.NEEDWARE_COLOR_OUTPUT !== undefined) {
135
+ envConfig.preferences = {
136
+ ...(envConfig.preferences || this.defaultConfig.preferences),
137
+ colorOutput: process.env.NEEDWARE_COLOR_OUTPUT === 'true',
138
+ };
139
+ }
140
+ return envConfig;
141
+ }
142
+ /**
143
+ * 保存配置
144
+ */
145
+ save(config) {
146
+ try {
147
+ const configToSave = config || this.config;
148
+ file_1.FileUtils.writeJSON(this.configPath, configToSave);
149
+ this.config = configToSave;
150
+ }
151
+ catch (error) {
152
+ throw new error_1.CLIError('Failed to save configuration', error_1.ErrorType.CONFIG, ['Check file permissions', 'Check if the directory exists'], { configPath: this.configPath, error });
153
+ }
154
+ }
155
+ /**
156
+ * 获取配置项
157
+ */
158
+ get(key) {
159
+ const keys = key.split('.');
160
+ let value = this.config;
161
+ for (const k of keys) {
162
+ if (value && typeof value === 'object' && k in value) {
163
+ value = value[k];
164
+ }
165
+ else {
166
+ return undefined;
167
+ }
168
+ }
169
+ return value;
170
+ }
171
+ /**
172
+ * 设置配置项
173
+ */
174
+ set(key, value) {
175
+ const keys = key.split('.');
176
+ let target = this.config;
177
+ for (let i = 0; i < keys.length - 1; i++) {
178
+ const k = keys[i];
179
+ if (!(k in target) || typeof target[k] !== 'object') {
180
+ target[k] = {};
181
+ }
182
+ target = target[k];
183
+ }
184
+ target[keys[keys.length - 1]] = value;
185
+ this.save();
186
+ }
187
+ /**
188
+ * 合并配置
189
+ */
190
+ merge(base, override) {
191
+ const result = { ...base };
192
+ for (const key in override) {
193
+ const value = override[key];
194
+ if (value !== undefined) {
195
+ if (typeof value === 'object' && !Array.isArray(value) && value !== null) {
196
+ result[key] = {
197
+ ...result[key],
198
+ ...value,
199
+ };
200
+ }
201
+ else {
202
+ result[key] = value;
203
+ }
204
+ }
205
+ }
206
+ return result;
207
+ }
208
+ /**
209
+ * 重置配置为默认值
210
+ */
211
+ reset() {
212
+ this.config = { ...this.defaultConfig };
213
+ this.save();
214
+ }
215
+ /**
216
+ * 获取当前配置
217
+ */
218
+ getConfig() {
219
+ return { ...this.config };
220
+ }
221
+ /**
222
+ * 获取配置文件路径
223
+ */
224
+ getConfigPath() {
225
+ return this.configPath;
226
+ }
227
+ /**
228
+ * 删除配置文件
229
+ */
230
+ deleteConfig() {
231
+ if (file_1.FileUtils.exists(this.configPath)) {
232
+ file_1.FileUtils.deleteFile(this.configPath);
233
+ }
234
+ }
235
+ }
236
+ exports.ConfigManager = ConfigManager;
237
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * 文件操作工具
3
+ */
4
+ export declare class FileUtils {
5
+ /**
6
+ * 确保目录存在
7
+ */
8
+ static ensureDir(dirPath: string): void;
9
+ /**
10
+ * 读取文件内容
11
+ */
12
+ static readFile(filePath: string, encoding?: BufferEncoding): string;
13
+ /**
14
+ * 写入文件内容
15
+ */
16
+ static writeFile(filePath: string, content: string, encoding?: BufferEncoding): void;
17
+ /**
18
+ * 读取 JSON 文件
19
+ */
20
+ static readJSON<T = any>(filePath: string): T;
21
+ /**
22
+ * 写入 JSON 文件
23
+ */
24
+ static writeJSON(filePath: string, data: any, pretty?: boolean): void;
25
+ /**
26
+ * 检查文件是否存在
27
+ */
28
+ static exists(filePath: string): boolean;
29
+ /**
30
+ * 删除文件
31
+ */
32
+ static deleteFile(filePath: string): void;
33
+ /**
34
+ * 删除目录
35
+ */
36
+ static deleteDir(dirPath: string): void;
37
+ /**
38
+ * 获取用户主目录
39
+ */
40
+ static getHomeDir(): string;
41
+ /**
42
+ * 解析路径中的 ~ 为用户主目录
43
+ */
44
+ static resolvePath(filePath: string): string;
45
+ /**
46
+ * 获取配置目录路径
47
+ */
48
+ static getConfigDir(): string;
49
+ /**
50
+ * 复制文件
51
+ */
52
+ static copyFile(src: string, dest: string): void;
53
+ /**
54
+ * 获取文件大小
55
+ */
56
+ static getFileSize(filePath: string): number;
57
+ /**
58
+ * 检查是否为目录
59
+ */
60
+ static isDirectory(dirPath: string): boolean;
61
+ /**
62
+ * 列出目录内容
63
+ */
64
+ static listDir(dirPath: string): string[];
65
+ }
66
+ //# sourceMappingURL=file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/utils/file.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,qBAAa,SAAS;IACpB;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMvC;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,cAAuB,GAAG,MAAM;IAI5E;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,cAAuB,GAAG,IAAI;IAM5F;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC;IAK7C;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,UAAO,GAAG,IAAI;IAKlE;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIxC;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMzC;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMvC;;OAEG;IACH,MAAM,CAAC,UAAU,IAAI,MAAM;IAI3B;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAO5C;;OAEG;IACH,MAAM,CAAC,YAAY,IAAI,MAAM;IAK7B;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAMhD;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAK5C;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAS5C;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;CAM1C"}
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+ /**
3
+ * 文件操作工具
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.FileUtils = void 0;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const os = __importStar(require("os"));
43
+ class FileUtils {
44
+ /**
45
+ * 确保目录存在
46
+ */
47
+ static ensureDir(dirPath) {
48
+ if (!fs.existsSync(dirPath)) {
49
+ fs.mkdirSync(dirPath, { recursive: true });
50
+ }
51
+ }
52
+ /**
53
+ * 读取文件内容
54
+ */
55
+ static readFile(filePath, encoding = 'utf8') {
56
+ return fs.readFileSync(filePath, encoding);
57
+ }
58
+ /**
59
+ * 写入文件内容
60
+ */
61
+ static writeFile(filePath, content, encoding = 'utf8') {
62
+ const dir = path.dirname(filePath);
63
+ this.ensureDir(dir);
64
+ fs.writeFileSync(filePath, content, encoding);
65
+ }
66
+ /**
67
+ * 读取 JSON 文件
68
+ */
69
+ static readJSON(filePath) {
70
+ const content = this.readFile(filePath);
71
+ return JSON.parse(content);
72
+ }
73
+ /**
74
+ * 写入 JSON 文件
75
+ */
76
+ static writeJSON(filePath, data, pretty = true) {
77
+ const content = pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);
78
+ this.writeFile(filePath, content);
79
+ }
80
+ /**
81
+ * 检查文件是否存在
82
+ */
83
+ static exists(filePath) {
84
+ return fs.existsSync(filePath);
85
+ }
86
+ /**
87
+ * 删除文件
88
+ */
89
+ static deleteFile(filePath) {
90
+ if (this.exists(filePath)) {
91
+ fs.unlinkSync(filePath);
92
+ }
93
+ }
94
+ /**
95
+ * 删除目录
96
+ */
97
+ static deleteDir(dirPath) {
98
+ if (this.exists(dirPath)) {
99
+ fs.rmSync(dirPath, { recursive: true, force: true });
100
+ }
101
+ }
102
+ /**
103
+ * 获取用户主目录
104
+ */
105
+ static getHomeDir() {
106
+ return os.homedir();
107
+ }
108
+ /**
109
+ * 解析路径中的 ~ 为用户主目录
110
+ */
111
+ static resolvePath(filePath) {
112
+ if (filePath.startsWith('~/') || filePath === '~') {
113
+ return path.join(this.getHomeDir(), filePath.slice(1));
114
+ }
115
+ return path.resolve(filePath);
116
+ }
117
+ /**
118
+ * 获取配置目录路径
119
+ */
120
+ static getConfigDir() {
121
+ const homeDir = this.getHomeDir();
122
+ return path.join(homeDir, '.needware');
123
+ }
124
+ /**
125
+ * 复制文件
126
+ */
127
+ static copyFile(src, dest) {
128
+ const destDir = path.dirname(dest);
129
+ this.ensureDir(destDir);
130
+ fs.copyFileSync(src, dest);
131
+ }
132
+ /**
133
+ * 获取文件大小
134
+ */
135
+ static getFileSize(filePath) {
136
+ const stats = fs.statSync(filePath);
137
+ return stats.size;
138
+ }
139
+ /**
140
+ * 检查是否为目录
141
+ */
142
+ static isDirectory(dirPath) {
143
+ try {
144
+ const stats = fs.statSync(dirPath);
145
+ return stats.isDirectory();
146
+ }
147
+ catch {
148
+ return false;
149
+ }
150
+ }
151
+ /**
152
+ * 列出目录内容
153
+ */
154
+ static listDir(dirPath) {
155
+ if (!this.exists(dirPath) || !this.isDirectory(dirPath)) {
156
+ return [];
157
+ }
158
+ return fs.readdirSync(dirPath);
159
+ }
160
+ }
161
+ exports.FileUtils = FileUtils;
162
+ //# sourceMappingURL=file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/utils/file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * 输入验证工具
3
+ */
4
+ export declare class Validator {
5
+ /**
6
+ * 验证字符串非空
7
+ */
8
+ static isNonEmpty(value: string): boolean;
9
+ /**
10
+ * 验证邮箱格式
11
+ */
12
+ static isEmail(value: string): boolean;
13
+ /**
14
+ * 验证 URL 格式
15
+ */
16
+ static isURL(value: string): boolean;
17
+ /**
18
+ * 验证端口号
19
+ */
20
+ static isPort(value: number | string): boolean;
21
+ /**
22
+ * 验证 IP 地址
23
+ */
24
+ static isIP(value: string): boolean;
25
+ /**
26
+ * 验证路径格式
27
+ */
28
+ static isPath(value: string): boolean;
29
+ /**
30
+ * 验证 API Key 格式(基本验证)
31
+ */
32
+ static isAPIKey(value: string): boolean;
33
+ /**
34
+ * 验证数字范围
35
+ */
36
+ static isInRange(value: number, min: number, max: number): boolean;
37
+ /**
38
+ * 验证字符串长度范围
39
+ */
40
+ static isLengthInRange(value: string, min: number, max: number): boolean;
41
+ /**
42
+ * 验证是否为有效的 JSON
43
+ */
44
+ static isJSON(value: string): boolean;
45
+ /**
46
+ * 验证对象是否包含必需的键
47
+ */
48
+ static hasRequiredKeys(obj: any, keys: string[]): boolean;
49
+ /**
50
+ * 验证枚举值
51
+ */
52
+ static isInEnum<T>(value: T, enumValues: T[]): boolean;
53
+ /**
54
+ * 验证正整数
55
+ */
56
+ static isPositiveInteger(value: number): boolean;
57
+ /**
58
+ * 验证布尔值
59
+ */
60
+ static isBoolean(value: any): boolean;
61
+ /**
62
+ * 自定义验证器
63
+ */
64
+ static custom(value: any, validator: (val: any) => boolean): boolean;
65
+ }
66
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,SAAS;IACpB;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIzC;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAKtC;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IASpC;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO;IAK9C;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAMnC;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAKrC;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAKvC;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO;IAIlE;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO;IAIxE;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IASrC;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO;IAQzD;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,GAAG,OAAO;IAItD;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIhD;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO;IAIrC;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,GAAG,OAAO;CAGrE"}
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ /**
3
+ * 输入验证工具
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Validator = void 0;
7
+ class Validator {
8
+ /**
9
+ * 验证字符串非空
10
+ */
11
+ static isNonEmpty(value) {
12
+ return typeof value === 'string' && value.trim().length > 0;
13
+ }
14
+ /**
15
+ * 验证邮箱格式
16
+ */
17
+ static isEmail(value) {
18
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
19
+ return emailRegex.test(value);
20
+ }
21
+ /**
22
+ * 验证 URL 格式
23
+ */
24
+ static isURL(value) {
25
+ try {
26
+ new URL(value);
27
+ return true;
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ }
33
+ /**
34
+ * 验证端口号
35
+ */
36
+ static isPort(value) {
37
+ const port = typeof value === 'string' ? parseInt(value, 10) : value;
38
+ return !isNaN(port) && port >= 1 && port <= 65535;
39
+ }
40
+ /**
41
+ * 验证 IP 地址
42
+ */
43
+ static isIP(value) {
44
+ const ipv4Regex = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
45
+ return ipv4Regex.test(value);
46
+ }
47
+ /**
48
+ * 验证路径格式
49
+ */
50
+ static isPath(value) {
51
+ // 基本路径格式验证
52
+ return typeof value === 'string' && value.length > 0 && !value.includes('\0');
53
+ }
54
+ /**
55
+ * 验证 API Key 格式(基本验证)
56
+ */
57
+ static isAPIKey(value) {
58
+ // 基本验证:非空且长度合理
59
+ return this.isNonEmpty(value) && value.length >= 10;
60
+ }
61
+ /**
62
+ * 验证数字范围
63
+ */
64
+ static isInRange(value, min, max) {
65
+ return typeof value === 'number' && value >= min && value <= max;
66
+ }
67
+ /**
68
+ * 验证字符串长度范围
69
+ */
70
+ static isLengthInRange(value, min, max) {
71
+ return typeof value === 'string' && value.length >= min && value.length <= max;
72
+ }
73
+ /**
74
+ * 验证是否为有效的 JSON
75
+ */
76
+ static isJSON(value) {
77
+ try {
78
+ JSON.parse(value);
79
+ return true;
80
+ }
81
+ catch {
82
+ return false;
83
+ }
84
+ }
85
+ /**
86
+ * 验证对象是否包含必需的键
87
+ */
88
+ static hasRequiredKeys(obj, keys) {
89
+ if (typeof obj !== 'object' || obj === null) {
90
+ return false;
91
+ }
92
+ return keys.every((key) => key in obj);
93
+ }
94
+ /**
95
+ * 验证枚举值
96
+ */
97
+ static isInEnum(value, enumValues) {
98
+ return enumValues.includes(value);
99
+ }
100
+ /**
101
+ * 验证正整数
102
+ */
103
+ static isPositiveInteger(value) {
104
+ return Number.isInteger(value) && value > 0;
105
+ }
106
+ /**
107
+ * 验证布尔值
108
+ */
109
+ static isBoolean(value) {
110
+ return typeof value === 'boolean';
111
+ }
112
+ /**
113
+ * 自定义验证器
114
+ */
115
+ static custom(value, validator) {
116
+ return validator(value);
117
+ }
118
+ }
119
+ exports.Validator = Validator;
120
+ //# 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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"}