diff --git a/package.json b/package.json index 7922465..fd57da7 100644 --- a/package.json +++ b/package.json @@ -1,41 +1,41 @@ { - "name": "badminton-scoreboard", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "gen:changelog": "node scripts/generate-changelog.mjs", - "predev": "node scripts/generate-changelog.mjs", - "dev": "concurrently \"npm:dev:server\" \"npm:dev:client\"", - "dev:client": "vite", - "dev:server": "node server/server.mjs", - "prebuild": "node scripts/generate-changelog.mjs", - "build": "tsc -b && vite build", - "lint": "eslint .", - "preview": "vite preview", - "start": "node server/server.mjs" - }, - "dependencies": { - "concurrently": "^9.2.1", - "dotenv": "^17.4.2", - "express": "^5.2.1", - "mysql2": "^3.22.0", - "react": "^19.2.4", - "react-dom": "^19.2.4", - "react-router-dom": "^7.14.1" - }, - "devDependencies": { - "@eslint/js": "^9.39.4", - "@types/node": "^24.12.2", - "@types/react": "^19.2.14", - "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^6.0.1", - "eslint": "^9.39.4", - "eslint-plugin-react-hooks": "^7.0.1", - "eslint-plugin-react-refresh": "^0.5.2", - "globals": "^17.4.0", - "typescript": "~6.0.2", - "typescript-eslint": "^8.58.0", - "vite": "^8.0.4" - } -} + "name": "badminton-scoreboard", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "gen:changelog": "node scripts/generate-changelog.mjs", + "predev": "node scripts/generate-changelog.mjs", + "dev": "concurrently \"npm:dev:server\" \"npm:dev:client\"", + "dev:client": "vite", + "dev:server": "node server/server.mjs", + "prebuild": "node scripts/generate-changelog.mjs", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview", + "start": "npm run dev" + }, + "dependencies": { + "concurrently": "^9.2.1", + "dotenv": "^17.4.2", + "express": "^5.2.1", + "mysql2": "^3.22.0", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-router-dom": "^7.14.1" + }, + "devDependencies": { + "@eslint/js": "^9.39.4", + "@types/node": "^24.12.2", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^9.39.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.4.0", + "typescript": "~6.0.2", + "typescript-eslint": "^8.58.0", + "vite": "^8.0.4" + } +} \ No newline at end of file diff --git a/scripts/generate-changelog.mjs b/scripts/generate-changelog.mjs index 638d5c5..47a4a07 100644 --- a/scripts/generate-changelog.mjs +++ b/scripts/generate-changelog.mjs @@ -1,7 +1,7 @@ // 從 git log 產生更新紀錄資料,輸出到 src/data/changelog.json // 正式版(build 後)沒有 git 也能直接讀 JSON 顯示;dev 與 build 前會自動重新產生。 import { execFileSync } from 'node:child_process' -import { mkdirSync, writeFileSync } from 'node:fs' +import { mkdirSync, readFileSync, writeFileSync } from 'node:fs' import { dirname, resolve } from 'node:path' import { fileURLToPath } from 'node:url' @@ -35,13 +35,33 @@ function readGitLog() { }) } +// 讀取既有的 changelog.json(Docker build 內由 COPY . . 帶進來),取不到時回傳 null。 +function readExisting() { + try { + const data = JSON.parse(readFileSync(outFile, 'utf8')) + return Array.isArray(data.entries) ? data.entries : null + } catch { + return null + } +} + function main() { let entries = [] try { entries = readGitLog() } catch (error) { - console.warn('[generate-changelog] 讀取 git log 失敗,輸出空清單:', error.message) + console.warn('[generate-changelog] 讀取 git log 失敗:', error.message) + } + + // git 取不到(或拿到 0 筆,常見於 Docker build 內沒有 .git)時, + // 若已有非空的 changelog.json 就沿用,避免把好資料覆蓋成空清單。 + if (entries.length === 0) { + const existing = readExisting() + if (existing && existing.length > 0) { + console.log(`[generate-changelog] git 無資料,保留既有 ${existing.length} 筆更新紀錄不覆蓋`) + return + } } const payload = {