refactor(calculate-version): 將版本計算邏輯由 bash 改寫為 Node.js 並依功能分檔

保留 entrypoint.sh 作為容器進入點,改為啟動 app/ 下的 Node.js 程式;
依功能拆分為 logger/config/version/releases/output/index,並更新 Dockerfile 改用 node:lts-alpine。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jeffery
2026-06-26 10:41:34 +08:00
co-authored by Claude Opus 4.8
parent 4983a72524
commit bd6b6017ab
13 changed files with 734 additions and 264 deletions
+68
View File
@@ -0,0 +1,68 @@
'use strict';
const { test } = require('node:test');
const assert = require('node:assert/strict');
const {
isUnset,
requireEnv,
normalizeBetaFlag,
loadConfig,
} = require('../config');
test('isUnset 對未設定值回傳 true', () => {
assert.equal(isUnset(undefined), true);
assert.equal(isUnset(null), true);
assert.equal(isUnset(''), true);
assert.equal(isUnset('null'), true);
});
test('isUnset 對有效值回傳 false', () => {
assert.equal(isUnset('value'), false);
assert.equal(isUnset('false'), false);
});
test('requireEnv 對未設定值丟出錯誤', () => {
assert.throws(() => requireEnv('NAME', ''), /NAME 未設定/);
assert.throws(() => requireEnv('NAME', 'null'), /NAME 未設定/);
});
test('requireEnv 對有效值回傳原值', () => {
assert.equal(requireEnv('NAME', 'value'), 'value');
});
test('normalizeBetaFlag 僅將字面值 "true" 視為啟用', () => {
assert.equal(normalizeBetaFlag('true'), true);
assert.equal(normalizeBetaFlag('false'), false);
assert.equal(normalizeBetaFlag('yes'), false);
assert.equal(normalizeBetaFlag(undefined), false);
assert.equal(normalizeBetaFlag('null'), false);
});
test('loadConfig 從環境變數組出設定', () => {
const config = loadConfig({
GITEA_SERVER_URL: 'https://gitea.example.com',
GITEA_REPOSITORY: 'owner/repo',
GITEA_TOKEN: 'secret',
IS_BETA: 'true',
});
assert.deepEqual(config, {
serverUrl: 'https://gitea.example.com',
repository: 'owner/repo',
token: 'secret',
isBeta: true,
});
});
test('loadConfig 將未提供的 token 正規化為 nullbeta 預設 false', () => {
const config = loadConfig({
GITEA_SERVER_URL: 'https://gitea.example.com',
GITEA_REPOSITORY: 'owner/repo',
});
assert.equal(config.token, null);
assert.equal(config.isBeta, false);
});
test('loadConfig 在缺少必填環境變數時丟出錯誤', () => {
assert.throws(() => loadConfig({ GITEA_REPOSITORY: 'owner/repo' }), /GITEA_SERVER_URL 未設定/);
assert.throws(() => loadConfig({ GITEA_SERVER_URL: 'https://x' }), /GITEA_REPOSITORY 未設定/);
});