grf-cli 1.0.0 → 1.0.3

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 (104) hide show
  1. package/README.md +5 -5
  2. package/README.zh-CN.md +5 -5
  3. package/dist/cli.js +2 -14
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/add.d.ts +5 -0
  6. package/dist/commands/add.d.ts.map +1 -1
  7. package/dist/commands/add.js +15 -16
  8. package/dist/commands/add.js.map +1 -1
  9. package/dist/commands/clean.d.ts +5 -0
  10. package/dist/commands/clean.d.ts.map +1 -1
  11. package/dist/commands/clean.js +15 -33
  12. package/dist/commands/clean.js.map +1 -1
  13. package/dist/commands/config.d.ts +5 -0
  14. package/dist/commands/config.d.ts.map +1 -1
  15. package/dist/commands/config.js +19 -39
  16. package/dist/commands/config.js.map +1 -1
  17. package/dist/commands/index.d.ts +27 -0
  18. package/dist/commands/index.d.ts.map +1 -0
  19. package/dist/commands/index.js +52 -0
  20. package/dist/commands/index.js.map +1 -0
  21. package/dist/commands/list.d.ts +5 -0
  22. package/dist/commands/list.d.ts.map +1 -1
  23. package/dist/commands/list.js +27 -59
  24. package/dist/commands/list.js.map +1 -1
  25. package/dist/commands/load.d.ts +5 -0
  26. package/dist/commands/load.d.ts.map +1 -1
  27. package/dist/commands/load.js +23 -61
  28. package/dist/commands/load.js.map +1 -1
  29. package/dist/commands/unload.d.ts +6 -1
  30. package/dist/commands/unload.d.ts.map +1 -1
  31. package/dist/commands/unload.js +157 -162
  32. package/dist/commands/unload.js.map +1 -1
  33. package/dist/commands/update.d.ts +6 -1
  34. package/dist/commands/update.d.ts.map +1 -1
  35. package/dist/commands/update.js +66 -74
  36. package/dist/commands/update.js.map +1 -1
  37. package/dist/core/config-manager.d.ts +83 -0
  38. package/dist/core/config-manager.d.ts.map +1 -0
  39. package/dist/core/config-manager.js +170 -0
  40. package/dist/core/config-manager.js.map +1 -0
  41. package/dist/core/config.d.ts +22 -2
  42. package/dist/core/config.d.ts.map +1 -1
  43. package/dist/core/config.js +71 -35
  44. package/dist/core/config.js.map +1 -1
  45. package/dist/core/loading-state.d.ts +125 -0
  46. package/dist/core/loading-state.d.ts.map +1 -0
  47. package/dist/core/loading-state.js +212 -0
  48. package/dist/core/loading-state.js.map +1 -0
  49. package/dist/core/loading.d.ts +21 -26
  50. package/dist/core/loading.d.ts.map +1 -1
  51. package/dist/core/loading.js +124 -87
  52. package/dist/core/loading.js.map +1 -1
  53. package/dist/core/migration.d.ts +54 -0
  54. package/dist/core/migration.d.ts.map +1 -0
  55. package/dist/core/migration.js +279 -0
  56. package/dist/core/migration.js.map +1 -0
  57. package/dist/core/paths.d.ts +58 -0
  58. package/dist/core/paths.d.ts.map +1 -0
  59. package/dist/core/paths.js +103 -0
  60. package/dist/core/paths.js.map +1 -0
  61. package/dist/core/repos-index.d.ts +113 -0
  62. package/dist/core/repos-index.d.ts.map +1 -0
  63. package/dist/core/repos-index.js +206 -0
  64. package/dist/core/repos-index.js.map +1 -0
  65. package/dist/core/sync.d.ts.map +1 -1
  66. package/dist/core/sync.js +3 -3
  67. package/dist/core/sync.js.map +1 -1
  68. package/dist/ui/format.d.ts +159 -0
  69. package/dist/ui/format.d.ts.map +1 -0
  70. package/dist/ui/format.js +300 -0
  71. package/dist/ui/format.js.map +1 -0
  72. package/dist/ui/index.d.ts +9 -0
  73. package/dist/ui/index.d.ts.map +1 -0
  74. package/dist/ui/index.js +53 -0
  75. package/dist/ui/index.js.map +1 -0
  76. package/dist/ui/prompt.d.ts +94 -0
  77. package/dist/ui/prompt.d.ts.map +1 -0
  78. package/dist/ui/prompt.js +223 -0
  79. package/dist/ui/prompt.js.map +1 -0
  80. package/dist/ui/spinner.d.ts +99 -0
  81. package/dist/ui/spinner.d.ts.map +1 -0
  82. package/dist/ui/spinner.js +136 -0
  83. package/dist/ui/spinner.js.map +1 -0
  84. package/dist/ui/table.d.ts +142 -0
  85. package/dist/ui/table.d.ts.map +1 -0
  86. package/dist/ui/table.js +213 -0
  87. package/dist/ui/table.js.map +1 -0
  88. package/dist/utils/constants.d.ts +152 -0
  89. package/dist/utils/constants.d.ts.map +1 -0
  90. package/dist/utils/constants.js +160 -0
  91. package/dist/utils/constants.js.map +1 -0
  92. package/dist/utils/error.d.ts +109 -0
  93. package/dist/utils/error.d.ts.map +1 -0
  94. package/dist/utils/error.js +212 -0
  95. package/dist/utils/error.js.map +1 -0
  96. package/dist/utils/index.d.ts +8 -0
  97. package/dist/utils/index.d.ts.map +1 -0
  98. package/dist/utils/index.js +44 -0
  99. package/dist/utils/index.js.map +1 -0
  100. package/dist/utils/validation.d.ts +122 -0
  101. package/dist/utils/validation.d.ts.map +1 -0
  102. package/dist/utils/validation.js +248 -0
  103. package/dist/utils/validation.js.map +1 -0
  104. package/package.json +4 -4
@@ -0,0 +1,212 @@
1
+ "use strict";
2
+ /**
3
+ * 错误处理模块
4
+ * 提供统一的错误处理工具
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.handleError = handleError;
11
+ exports.getErrorMessage = getErrorMessage;
12
+ exports.createError = createError;
13
+ exports.wrapAsync = wrapAsync;
14
+ exports.assertCondition = assertCondition;
15
+ exports.assertNotNull = assertNotNull;
16
+ exports.isGrfError = isGrfError;
17
+ exports.isErrorCode = isErrorCode;
18
+ const chalk_1 = __importDefault(require("chalk"));
19
+ const index_js_1 = require("../types/index.js");
20
+ /**
21
+ * 统一处理错误并输出到控制台
22
+ * @param error 错误对象
23
+ * @param options 处理选项
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * try {
28
+ * await someOperation();
29
+ * } catch (error) {
30
+ * handleError(error, { exit: true });
31
+ * }
32
+ * ```
33
+ */
34
+ function handleError(error, options = {}) {
35
+ const { exit = false, exitCode = 1, verbose = false, hints = [] } = options;
36
+ // 格式化并输出错误消息
37
+ const message = getErrorMessage(error);
38
+ console.error(chalk_1.default.red(`${chalk_1.default.bold("✗")} ${message}`));
39
+ // 如果是 GrfError,提供更具体的错误提示
40
+ if (error instanceof index_js_1.GrfError) {
41
+ const errorHints = getErrorHints(error);
42
+ for (const hint of errorHints) {
43
+ console.error(chalk_1.default.gray(` ${hint}`));
44
+ }
45
+ }
46
+ // 显示额外的提示信息
47
+ for (const hint of hints) {
48
+ console.error(chalk_1.default.gray(` ${hint}`));
49
+ }
50
+ // 在详细模式下显示堆栈信息
51
+ if (verbose && error instanceof Error && error.stack) {
52
+ console.error();
53
+ console.error(chalk_1.default.gray("Stack trace:"));
54
+ console.error(chalk_1.default.gray(error.stack));
55
+ }
56
+ // 退出进程
57
+ if (exit) {
58
+ process.exit(exitCode);
59
+ }
60
+ }
61
+ /**
62
+ * 获取错误消息
63
+ * @param error 错误对象
64
+ * @returns 错误消息字符串
65
+ */
66
+ function getErrorMessage(error) {
67
+ if (error instanceof index_js_1.GrfError) {
68
+ return error.message;
69
+ }
70
+ if (error instanceof Error) {
71
+ return error.message;
72
+ }
73
+ if (typeof error === "string") {
74
+ return error;
75
+ }
76
+ return "An unknown error occurred";
77
+ }
78
+ /**
79
+ * 根据错误码获取提示信息
80
+ * @param error GrfError 实例
81
+ * @returns 提示信息数组
82
+ */
83
+ function getErrorHints(error) {
84
+ const hints = [];
85
+ switch (error.code) {
86
+ case index_js_1.ErrorCode.REPO_NOT_FOUND:
87
+ hints.push(`Use ${chalk_1.default.cyan("grf add <url>")} to add a repository first.`);
88
+ hints.push(`Or use ${chalk_1.default.cyan("grf list")} to see all cached repositories.`);
89
+ break;
90
+ case index_js_1.ErrorCode.REPO_ALREADY_EXISTS:
91
+ hints.push(`Use ${chalk_1.default.cyan("grf update <name>")} to update the existing repository.`);
92
+ hints.push(`Or use ${chalk_1.default.cyan("grf clean <name>")} to remove it first.`);
93
+ break;
94
+ case index_js_1.ErrorCode.FS_PATH_NOT_FOUND:
95
+ hints.push("The source path does not exist. Please check the repository or subdirectory.");
96
+ break;
97
+ case index_js_1.ErrorCode.FS_PERMISSION_DENIED:
98
+ hints.push("Permission denied. Please check your file permissions.");
99
+ break;
100
+ case index_js_1.ErrorCode.GIT_CLONE_FAILED:
101
+ hints.push("Failed to clone repository. Please check the URL and your network connection.");
102
+ hints.push("Please check your network connection and try again.");
103
+ break;
104
+ case index_js_1.ErrorCode.GIT_CHECKOUT_FAILED:
105
+ hints.push(`The branch may not exist. Use ${chalk_1.default.cyan("git branch -r")} to list available branches.`);
106
+ break;
107
+ case index_js_1.ErrorCode.CONFIG_PARSE_ERROR:
108
+ hints.push("The configuration file may be corrupted. Try deleting it and reconfiguring.");
109
+ break;
110
+ case index_js_1.ErrorCode.GIT_PULL_FAILED:
111
+ hints.push("Please check your network connection and try again.");
112
+ break;
113
+ }
114
+ return hints;
115
+ }
116
+ /**
117
+ * 创建一个 GrfError 实例
118
+ * @param code 错误码
119
+ * @param message 错误消息
120
+ * @returns GrfError 实例
121
+ *
122
+ * @example
123
+ * ```typescript
124
+ * throw createError(ErrorCode.REPO_NOT_FOUND, "Repository 'my-repo' not found");
125
+ * ```
126
+ */
127
+ function createError(code, message) {
128
+ return new index_js_1.GrfError(code, message);
129
+ }
130
+ /**
131
+ * 包装异步操作,统一处理错误
132
+ * @param operation 异步操作
133
+ * @param options 错误处理选项
134
+ * @returns 操作结果或 undefined(如果发生错误且不退出)
135
+ *
136
+ * @example
137
+ * ```typescript
138
+ * const result = await wrapAsync(
139
+ * async () => await fetchData(),
140
+ * { exit: true }
141
+ * );
142
+ * ```
143
+ */
144
+ async function wrapAsync(operation, options = {}) {
145
+ try {
146
+ return await operation();
147
+ }
148
+ catch (error) {
149
+ handleError(error, options);
150
+ if (!options.exit) {
151
+ return undefined;
152
+ }
153
+ // 如果设置了 exit,handleError 会调用 process.exit,不会到达这里
154
+ throw error;
155
+ }
156
+ }
157
+ /**
158
+ * 断言条件为真,否则抛出错误
159
+ * @param condition 条件
160
+ * @param code 错误码
161
+ * @param message 错误消息
162
+ *
163
+ * @example
164
+ * ```typescript
165
+ * assertCondition(repo !== null, ErrorCode.REPO_NOT_FOUND, "Repository not found");
166
+ * ```
167
+ */
168
+ function assertCondition(condition, code, message) {
169
+ if (!condition) {
170
+ throw createError(code, message);
171
+ }
172
+ }
173
+ /**
174
+ * 断言值不为 null 或 undefined
175
+ * @param value 要检查的值
176
+ * @param code 错误码
177
+ * @param message 错误消息
178
+ * @returns 非空值
179
+ *
180
+ * @example
181
+ * ```typescript
182
+ * const repo = assertNotNull(
183
+ * await repository.get(name),
184
+ * ErrorCode.REPO_NOT_FOUND,
185
+ * `Repository '${name}' not found`
186
+ * );
187
+ * ```
188
+ */
189
+ function assertNotNull(value, code, message) {
190
+ if (value === null || value === undefined) {
191
+ throw createError(code, message);
192
+ }
193
+ return value;
194
+ }
195
+ /**
196
+ * 检查是否为 GrfError
197
+ * @param error 错误对象
198
+ * @returns 是否为 GrfError
199
+ */
200
+ function isGrfError(error) {
201
+ return error instanceof index_js_1.GrfError;
202
+ }
203
+ /**
204
+ * 检查错误是否为特定错误码
205
+ * @param error 错误对象
206
+ * @param code 错误码
207
+ * @returns 是否匹配
208
+ */
209
+ function isErrorCode(error, code) {
210
+ return error instanceof index_js_1.GrfError && error.code === code;
211
+ }
212
+ //# sourceMappingURL=error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/utils/error.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Utils 模块统一导出
3
+ * 提供工具函数和常量
4
+ */
5
+ export { handleError, getErrorMessage, createError, wrapAsync, assertCondition, assertNotNull, isGrfError, isErrorCode, type HandleErrorOptions, } from "./error.js";
6
+ export { validateRepoName, validateGitUrl, isGitUrl, validateBranchName, validatePath, validatePositiveInteger, validateConfigKey, combineValidations, createValidator, assertValid, type ValidationResult, } from "./validation.js";
7
+ export { DIR_NAMES, FILE_NAMES, DEFAULTS, TABLE_COLUMNS, COPY_EXCLUDES, GIT, TIMEOUTS, LIMITS, PATTERNS, MESSAGES, HINTS, APP_INFO, } from "./constants.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,WAAW,EACX,eAAe,EACf,WAAW,EACX,SAAS,EACT,eAAe,EACf,aAAa,EACb,UAAU,EACV,WAAW,EACX,KAAK,kBAAkB,GACxB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,kBAAkB,EAClB,YAAY,EACZ,uBAAuB,EACvB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,SAAS,EACT,UAAU,EACV,QAAQ,EACR,aAAa,EACb,aAAa,EACb,GAAG,EACH,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,QAAQ,GACT,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ /**
3
+ * Utils 模块统一导出
4
+ * 提供工具函数和常量
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.APP_INFO = exports.HINTS = exports.MESSAGES = exports.PATTERNS = exports.LIMITS = exports.TIMEOUTS = exports.GIT = exports.COPY_EXCLUDES = exports.TABLE_COLUMNS = exports.DEFAULTS = exports.FILE_NAMES = exports.DIR_NAMES = exports.assertValid = exports.createValidator = exports.combineValidations = exports.validateConfigKey = exports.validatePositiveInteger = exports.validatePath = exports.validateBranchName = exports.isGitUrl = exports.validateGitUrl = exports.validateRepoName = exports.isErrorCode = exports.isGrfError = exports.assertNotNull = exports.assertCondition = exports.wrapAsync = exports.createError = exports.getErrorMessage = exports.handleError = void 0;
8
+ // 错误处理相关
9
+ var error_js_1 = require("./error.js");
10
+ Object.defineProperty(exports, "handleError", { enumerable: true, get: function () { return error_js_1.handleError; } });
11
+ Object.defineProperty(exports, "getErrorMessage", { enumerable: true, get: function () { return error_js_1.getErrorMessage; } });
12
+ Object.defineProperty(exports, "createError", { enumerable: true, get: function () { return error_js_1.createError; } });
13
+ Object.defineProperty(exports, "wrapAsync", { enumerable: true, get: function () { return error_js_1.wrapAsync; } });
14
+ Object.defineProperty(exports, "assertCondition", { enumerable: true, get: function () { return error_js_1.assertCondition; } });
15
+ Object.defineProperty(exports, "assertNotNull", { enumerable: true, get: function () { return error_js_1.assertNotNull; } });
16
+ Object.defineProperty(exports, "isGrfError", { enumerable: true, get: function () { return error_js_1.isGrfError; } });
17
+ Object.defineProperty(exports, "isErrorCode", { enumerable: true, get: function () { return error_js_1.isErrorCode; } });
18
+ // 输入验证相关
19
+ var validation_js_1 = require("./validation.js");
20
+ Object.defineProperty(exports, "validateRepoName", { enumerable: true, get: function () { return validation_js_1.validateRepoName; } });
21
+ Object.defineProperty(exports, "validateGitUrl", { enumerable: true, get: function () { return validation_js_1.validateGitUrl; } });
22
+ Object.defineProperty(exports, "isGitUrl", { enumerable: true, get: function () { return validation_js_1.isGitUrl; } });
23
+ Object.defineProperty(exports, "validateBranchName", { enumerable: true, get: function () { return validation_js_1.validateBranchName; } });
24
+ Object.defineProperty(exports, "validatePath", { enumerable: true, get: function () { return validation_js_1.validatePath; } });
25
+ Object.defineProperty(exports, "validatePositiveInteger", { enumerable: true, get: function () { return validation_js_1.validatePositiveInteger; } });
26
+ Object.defineProperty(exports, "validateConfigKey", { enumerable: true, get: function () { return validation_js_1.validateConfigKey; } });
27
+ Object.defineProperty(exports, "combineValidations", { enumerable: true, get: function () { return validation_js_1.combineValidations; } });
28
+ Object.defineProperty(exports, "createValidator", { enumerable: true, get: function () { return validation_js_1.createValidator; } });
29
+ Object.defineProperty(exports, "assertValid", { enumerable: true, get: function () { return validation_js_1.assertValid; } });
30
+ // 常量
31
+ var constants_js_1 = require("./constants.js");
32
+ Object.defineProperty(exports, "DIR_NAMES", { enumerable: true, get: function () { return constants_js_1.DIR_NAMES; } });
33
+ Object.defineProperty(exports, "FILE_NAMES", { enumerable: true, get: function () { return constants_js_1.FILE_NAMES; } });
34
+ Object.defineProperty(exports, "DEFAULTS", { enumerable: true, get: function () { return constants_js_1.DEFAULTS; } });
35
+ Object.defineProperty(exports, "TABLE_COLUMNS", { enumerable: true, get: function () { return constants_js_1.TABLE_COLUMNS; } });
36
+ Object.defineProperty(exports, "COPY_EXCLUDES", { enumerable: true, get: function () { return constants_js_1.COPY_EXCLUDES; } });
37
+ Object.defineProperty(exports, "GIT", { enumerable: true, get: function () { return constants_js_1.GIT; } });
38
+ Object.defineProperty(exports, "TIMEOUTS", { enumerable: true, get: function () { return constants_js_1.TIMEOUTS; } });
39
+ Object.defineProperty(exports, "LIMITS", { enumerable: true, get: function () { return constants_js_1.LIMITS; } });
40
+ Object.defineProperty(exports, "PATTERNS", { enumerable: true, get: function () { return constants_js_1.PATTERNS; } });
41
+ Object.defineProperty(exports, "MESSAGES", { enumerable: true, get: function () { return constants_js_1.MESSAGES; } });
42
+ Object.defineProperty(exports, "HINTS", { enumerable: true, get: function () { return constants_js_1.HINTS; } });
43
+ Object.defineProperty(exports, "APP_INFO", { enumerable: true, get: function () { return constants_js_1.APP_INFO; } });
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,SAAS;AACT,uCAUoB;AATlB,uGAAA,WAAW,OAAA;AACX,2GAAA,eAAe,OAAA;AACf,uGAAA,WAAW,OAAA;AACX,qGAAA,SAAS,OAAA;AACT,2GAAA,eAAe,OAAA;AACf,yGAAA,aAAa,OAAA;AACb,sGAAA,UAAU,OAAA;AACV,uGAAA,WAAW,OAAA;AAIb,SAAS;AACT,iDAYyB;AAXvB,iHAAA,gBAAgB,OAAA;AAChB,+GAAA,cAAc,OAAA;AACd,yGAAA,QAAQ,OAAA;AACR,mHAAA,kBAAkB,OAAA;AAClB,6GAAA,YAAY,OAAA;AACZ,wHAAA,uBAAuB,OAAA;AACvB,kHAAA,iBAAiB,OAAA;AACjB,mHAAA,kBAAkB,OAAA;AAClB,gHAAA,eAAe,OAAA;AACf,4GAAA,WAAW,OAAA;AAIb,KAAK;AACL,+CAawB;AAZtB,yGAAA,SAAS,OAAA;AACT,0GAAA,UAAU,OAAA;AACV,wGAAA,QAAQ,OAAA;AACR,6GAAA,aAAa,OAAA;AACb,6GAAA,aAAa,OAAA;AACb,mGAAA,GAAG,OAAA;AACH,wGAAA,QAAQ,OAAA;AACR,sGAAA,MAAM,OAAA;AACN,wGAAA,QAAQ,OAAA;AACR,wGAAA,QAAQ,OAAA;AACR,qGAAA,KAAK,OAAA;AACL,wGAAA,QAAQ,OAAA"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * 输入验证模块
3
+ * 提供各种输入验证工具函数
4
+ */
5
+ /**
6
+ * 验证结果
7
+ */
8
+ export interface ValidationResult {
9
+ /** 是否有效 */
10
+ valid: boolean;
11
+ /** 错误消息(如果无效) */
12
+ message?: string;
13
+ }
14
+ /**
15
+ * 验证仓库名称
16
+ * @param name 仓库名称
17
+ * @returns 验证结果
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * const result = validateRepoName("my-repo");
22
+ * if (!result.valid) {
23
+ * console.error(result.message);
24
+ * }
25
+ * ```
26
+ */
27
+ export declare function validateRepoName(name: string): ValidationResult;
28
+ /**
29
+ * 验证 Git URL
30
+ * @param url URL 字符串
31
+ * @returns 验证结果
32
+ *
33
+ * @example
34
+ * ```typescript
35
+ * const result = validateGitUrl("https://github.com/user/repo.git");
36
+ * if (!result.valid) {
37
+ * console.error(result.message);
38
+ * }
39
+ * ```
40
+ */
41
+ export declare function validateGitUrl(url: string): ValidationResult;
42
+ /**
43
+ * 检查字符串是否为 Git URL
44
+ * @param str 字符串
45
+ * @returns 是否为 Git URL
46
+ *
47
+ * @example
48
+ * ```typescript
49
+ * if (isGitUrl(input)) {
50
+ * // 处理 URL
51
+ * } else {
52
+ * // 处理仓库名称
53
+ * }
54
+ * ```
55
+ */
56
+ export declare function isGitUrl(str: string): boolean;
57
+ /**
58
+ * 验证分支名称
59
+ * @param branch 分支名称
60
+ * @returns 验证结果
61
+ */
62
+ export declare function validateBranchName(branch: string): ValidationResult;
63
+ /**
64
+ * 验证路径
65
+ * @param path 路径字符串
66
+ * @returns 验证结果
67
+ */
68
+ export declare function validatePath(path: string): ValidationResult;
69
+ /**
70
+ * 验证正整数
71
+ * @param value 值
72
+ * @param options 选项
73
+ * @returns 验证结果
74
+ */
75
+ export declare function validatePositiveInteger(value: string | number, options?: {
76
+ min?: number;
77
+ max?: number;
78
+ fieldName?: string;
79
+ }): ValidationResult;
80
+ /**
81
+ * 验证配置键名
82
+ * @param key 键名
83
+ * @param validKeys 有效的键名列表
84
+ * @returns 验证结果
85
+ */
86
+ export declare function validateConfigKey(key: string, validKeys: readonly string[]): ValidationResult;
87
+ /**
88
+ * 组合多个验证器
89
+ * @param validators 验证器数组
90
+ * @returns 组合后的验证结果
91
+ *
92
+ * @example
93
+ * ```typescript
94
+ * const result = combineValidations([
95
+ * validateRepoName(name),
96
+ * validatePath(path)
97
+ * ]);
98
+ * ```
99
+ */
100
+ export declare function combineValidations(validators: ValidationResult[]): ValidationResult;
101
+ /**
102
+ * 创建自定义验证器
103
+ * @param predicate 验证函数
104
+ * @param message 错误消息
105
+ * @returns 验证函数
106
+ *
107
+ * @example
108
+ * ```typescript
109
+ * const validateEmail = createValidator(
110
+ * (value) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value),
111
+ * "Invalid email format"
112
+ * );
113
+ * ```
114
+ */
115
+ export declare function createValidator(predicate: (value: string) => boolean, message: string): (value: string) => ValidationResult;
116
+ /**
117
+ * 验证并抛出错误(如果无效)
118
+ * @param result 验证结果
119
+ * @throws Error 如果验证失败
120
+ */
121
+ export declare function assertValid(result: ValidationResult): void;
122
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,WAAW;IACX,KAAK,EAAE,OAAO,CAAC;IACf,iBAAiB;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAuB/D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAmB5D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAO7C;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAiCnE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAiB3D;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/D,gBAAgB,CA0BlB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,SAAS,MAAM,EAAE,GAC3B,gBAAgB,CAalB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,gBAAgB,EAAE,GAC7B,gBAAgB,CAOlB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,EACrC,OAAO,EAAE,MAAM,GACd,CAAC,KAAK,EAAE,MAAM,KAAK,gBAAgB,CAOrC;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAI1D"}
@@ -0,0 +1,248 @@
1
+ "use strict";
2
+ /**
3
+ * 输入验证模块
4
+ * 提供各种输入验证工具函数
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.validateRepoName = validateRepoName;
8
+ exports.validateGitUrl = validateGitUrl;
9
+ exports.isGitUrl = isGitUrl;
10
+ exports.validateBranchName = validateBranchName;
11
+ exports.validatePath = validatePath;
12
+ exports.validatePositiveInteger = validatePositiveInteger;
13
+ exports.validateConfigKey = validateConfigKey;
14
+ exports.combineValidations = combineValidations;
15
+ exports.createValidator = createValidator;
16
+ exports.assertValid = assertValid;
17
+ /**
18
+ * 验证仓库名称
19
+ * @param name 仓库名称
20
+ * @returns 验证结果
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * const result = validateRepoName("my-repo");
25
+ * if (!result.valid) {
26
+ * console.error(result.message);
27
+ * }
28
+ * ```
29
+ */
30
+ function validateRepoName(name) {
31
+ if (!name || name.trim() === "") {
32
+ return { valid: false, message: "Repository name cannot be empty" };
33
+ }
34
+ // 检查是否包含非法字符
35
+ const invalidChars = /[<>:"|?*\x00-\x1f]/;
36
+ if (invalidChars.test(name)) {
37
+ return {
38
+ valid: false,
39
+ message: "Repository name contains invalid characters",
40
+ };
41
+ }
42
+ // 检查长度
43
+ if (name.length > 255) {
44
+ return {
45
+ valid: false,
46
+ message: "Repository name is too long (max 255 characters)",
47
+ };
48
+ }
49
+ return { valid: true };
50
+ }
51
+ /**
52
+ * 验证 Git URL
53
+ * @param url URL 字符串
54
+ * @returns 验证结果
55
+ *
56
+ * @example
57
+ * ```typescript
58
+ * const result = validateGitUrl("https://github.com/user/repo.git");
59
+ * if (!result.valid) {
60
+ * console.error(result.message);
61
+ * }
62
+ * ```
63
+ */
64
+ function validateGitUrl(url) {
65
+ if (!url || url.trim() === "") {
66
+ return { valid: false, message: "URL cannot be empty" };
67
+ }
68
+ // HTTPS 格式: https://github.com/user/repo.git
69
+ const httpsRegex = /^https?:\/\/[^/]+\/[^/]+\/[^/]+/;
70
+ // SSH 格式: git@github.com:user/repo.git
71
+ const sshRegex = /^git@[^:]+:[^/]+\/[^/]+/;
72
+ if (!httpsRegex.test(url) && !sshRegex.test(url)) {
73
+ return {
74
+ valid: false,
75
+ message: "Invalid Git URL format. Expected HTTPS (https://...) or SSH (git@...) format",
76
+ };
77
+ }
78
+ return { valid: true };
79
+ }
80
+ /**
81
+ * 检查字符串是否为 Git URL
82
+ * @param str 字符串
83
+ * @returns 是否为 Git URL
84
+ *
85
+ * @example
86
+ * ```typescript
87
+ * if (isGitUrl(input)) {
88
+ * // 处理 URL
89
+ * } else {
90
+ * // 处理仓库名称
91
+ * }
92
+ * ```
93
+ */
94
+ function isGitUrl(str) {
95
+ // HTTPS 格式: https://github.com/user/repo.git
96
+ const httpsRegex = /^https?:\/\/[^/]+\/[^/]+\/[^/]+/;
97
+ // SSH 格式: git@github.com:user/repo.git
98
+ const sshRegex = /^git@[^:]+:[^/]+\/[^/]+/;
99
+ return httpsRegex.test(str) || sshRegex.test(str);
100
+ }
101
+ /**
102
+ * 验证分支名称
103
+ * @param branch 分支名称
104
+ * @returns 验证结果
105
+ */
106
+ function validateBranchName(branch) {
107
+ if (!branch || branch.trim() === "") {
108
+ return { valid: false, message: "Branch name cannot be empty" };
109
+ }
110
+ // Git 分支名称规则
111
+ // 不能以 . 开头
112
+ if (branch.startsWith(".")) {
113
+ return { valid: false, message: "Branch name cannot start with '.'" };
114
+ }
115
+ // 不能包含连续的 ..
116
+ if (branch.includes("..")) {
117
+ return { valid: false, message: "Branch name cannot contain '..'" };
118
+ }
119
+ // 不能包含特殊字符
120
+ const invalidChars = /[\s~^:?*\[\]\\@{}\x00-\x1f\x7f]/;
121
+ if (invalidChars.test(branch)) {
122
+ return { valid: false, message: "Branch name contains invalid characters" };
123
+ }
124
+ // 不能以 / 结尾
125
+ if (branch.endsWith("/")) {
126
+ return { valid: false, message: "Branch name cannot end with '/'" };
127
+ }
128
+ // 不能以 .lock 结尾
129
+ if (branch.endsWith(".lock")) {
130
+ return { valid: false, message: "Branch name cannot end with '.lock'" };
131
+ }
132
+ return { valid: true };
133
+ }
134
+ /**
135
+ * 验证路径
136
+ * @param path 路径字符串
137
+ * @returns 验证结果
138
+ */
139
+ function validatePath(path) {
140
+ if (!path || path.trim() === "") {
141
+ return { valid: false, message: "Path cannot be empty" };
142
+ }
143
+ // 检查是否包含非法字符(Windows)
144
+ const invalidChars = /[<>:"|?*\x00-\x1f]/;
145
+ if (invalidChars.test(path)) {
146
+ return { valid: false, message: "Path contains invalid characters" };
147
+ }
148
+ // 检查路径长度
149
+ if (path.length > 260) {
150
+ return { valid: false, message: "Path is too long (max 260 characters)" };
151
+ }
152
+ return { valid: true };
153
+ }
154
+ /**
155
+ * 验证正整数
156
+ * @param value 值
157
+ * @param options 选项
158
+ * @returns 验证结果
159
+ */
160
+ function validatePositiveInteger(value, options = {}) {
161
+ const { min = 1, max = Number.MAX_SAFE_INTEGER, fieldName = "Value", } = options;
162
+ const num = typeof value === "string" ? parseInt(value, 10) : value;
163
+ if (isNaN(num)) {
164
+ return { valid: false, message: `${fieldName} must be a number` };
165
+ }
166
+ if (!Number.isInteger(num)) {
167
+ return { valid: false, message: `${fieldName} must be an integer` };
168
+ }
169
+ if (num < min) {
170
+ return { valid: false, message: `${fieldName} must be at least ${min}` };
171
+ }
172
+ if (num > max) {
173
+ return { valid: false, message: `${fieldName} must be at most ${max}` };
174
+ }
175
+ return { valid: true };
176
+ }
177
+ /**
178
+ * 验证配置键名
179
+ * @param key 键名
180
+ * @param validKeys 有效的键名列表
181
+ * @returns 验证结果
182
+ */
183
+ function validateConfigKey(key, validKeys) {
184
+ if (!key || key.trim() === "") {
185
+ return { valid: false, message: "Configuration key cannot be empty" };
186
+ }
187
+ if (!validKeys.includes(key)) {
188
+ return {
189
+ valid: false,
190
+ message: `Unknown configuration key: ${key}. Valid keys: ${validKeys.join(", ")}`,
191
+ };
192
+ }
193
+ return { valid: true };
194
+ }
195
+ /**
196
+ * 组合多个验证器
197
+ * @param validators 验证器数组
198
+ * @returns 组合后的验证结果
199
+ *
200
+ * @example
201
+ * ```typescript
202
+ * const result = combineValidations([
203
+ * validateRepoName(name),
204
+ * validatePath(path)
205
+ * ]);
206
+ * ```
207
+ */
208
+ function combineValidations(validators) {
209
+ for (const result of validators) {
210
+ if (!result.valid) {
211
+ return result;
212
+ }
213
+ }
214
+ return { valid: true };
215
+ }
216
+ /**
217
+ * 创建自定义验证器
218
+ * @param predicate 验证函数
219
+ * @param message 错误消息
220
+ * @returns 验证函数
221
+ *
222
+ * @example
223
+ * ```typescript
224
+ * const validateEmail = createValidator(
225
+ * (value) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value),
226
+ * "Invalid email format"
227
+ * );
228
+ * ```
229
+ */
230
+ function createValidator(predicate, message) {
231
+ return (value) => {
232
+ if (predicate(value)) {
233
+ return { valid: true };
234
+ }
235
+ return { valid: false, message };
236
+ };
237
+ }
238
+ /**
239
+ * 验证并抛出错误(如果无效)
240
+ * @param result 验证结果
241
+ * @throws Error 如果验证失败
242
+ */
243
+ function assertValid(result) {
244
+ if (!result.valid) {
245
+ throw new Error(result.message);
246
+ }
247
+ }
248
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}