refactor(release-cleanup): 收斂錯誤輸出並抽出驗證規則常數

- 新增 logger.failError 集中處理 Error/非 Error 的 stderr 輸出與堆疊,
  index.js 改用之,移除重複的 reportFatal
- validate.js 將允許協定與 repository 格式抽為模組常數,便於維護擴充

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jeffery
2026-06-26 11:04:29 +08:00
co-authored by Claude Opus 4.8
parent 0f4354bd01
commit f6d2ebeab2
3 changed files with 26 additions and 20 deletions
+7 -2
View File
@@ -1,6 +1,11 @@
// 參數驗證,對應原本 entrypoint.sh 的 is_empty_or_null/require_value/require_integer。
// 驗證失敗時丟出 Error,由進入點統一捕捉後以非零狀態結束。
// 允許的 URL 協定;集中為常數,方便檢視系統允許的協定與日後擴充。
const ALLOWED_URL_PROTOCOLS = ['http:', 'https:']
// 合法 repository 形式:owner/repo,僅允許英數字與 . _ -,且恰好一個 /。
const REPOSITORY_PATTERN = /^[A-Za-z0-9._-]+\/[A-Za-z0-9._-]+$/
/**
* 判斷值是否視為「空」。使用嚴格相等,因此 `0`、`false`、字串 `"0"` 都不算空。
* @param {*} value 待判斷的值
@@ -49,7 +54,7 @@ export function requireUrl(name, value) {
} catch {
throw new Error(`${name} must be a valid URL`)
}
if (url.protocol !== 'http:' && url.protocol !== 'https:') {
if (!ALLOWED_URL_PROTOCOLS.includes(url.protocol)) {
throw new Error(`${name} must use http or https protocol`)
}
}
@@ -62,7 +67,7 @@ export function requireUrl(name, value) {
* @throws {Error} 格式不符或含 `..` 時丟出 `${name} must be in the form owner/repo without path traversal`
*/
export function requireRepository(name, value) {
if (String(value).includes('..') || !/^[A-Za-z0-9._-]+\/[A-Za-z0-9._-]+$/.test(value)) {
if (String(value).includes('..') || !REPOSITORY_PATTERN.test(value)) {
throw new Error(`${name} must be in the form owner/repo without path traversal`)
}
}