✨ 주요 개선사항: - any 타입 83개에서 62개로 21개 수정 (25% 감소) - 모든 ESLint 에러 11개 → 0개 완전 해결 - 타입 안전성 대폭 향상으로 런타임 오류 가능성 감소 🔧 수정된 파일들: • PWADebug.tsx - 사용하지 않는 import들에 _ prefix 추가 • categoryUtils.ts - 불필요한 any 캐스트 제거 • TransactionsHeader.tsx - BudgetData 인터페이스 정의 • storageUtils.ts - generic 타입과 unknown 타입 적용 • 각종 error handler들 - Error | {message?: string} 타입 적용 • test 파일들 - 적절한 mock 인터페이스 정의 • 유틸리티 파일들 - any → unknown 또는 적절한 타입으로 교체 🏆 성과: - 코드 품질 크게 향상 (280 → 80 문제로 71% 감소) - TypeScript 컴파일러의 타입 체크 효과성 증대 - 개발자 경험 개선 (IDE 자동완성, 타입 추론 등) 🧹 추가 정리: - ESLint no-console/no-alert 경고 해결 - Prettier 포맷팅 적용으로 코드 스타일 통일 🎯 다음 단계: 남은 62개 any 타입 계속 개선 예정 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
221 lines
5.7 KiB
JavaScript
221 lines
5.7 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
|
|
/**
|
|
* 스토어 메타데이터 자동 업데이트 스크립트
|
|
* CHANGELOG.md 기반으로 Google Play Store 및 TestFlight 릴리즈 노트 생성
|
|
*/
|
|
|
|
// 설정
|
|
const config = {
|
|
changelogPath: "CHANGELOG.md",
|
|
androidMetadataDir: "android/metadata/ko-KR/changelogs",
|
|
|
|
// 제한사항
|
|
googlePlayLimit: 500, // Google Play Store 릴리즈 노트 최대 길이
|
|
testFlightLimit: 4000, // TestFlight 릴리즈 노트 최대 길이
|
|
};
|
|
|
|
/**
|
|
* 메인 함수
|
|
*/
|
|
async function updateStoreMetadata() {
|
|
console.log("📝 스토어 메타데이터 업데이트 시작...");
|
|
|
|
// CHANGELOG.md에서 최신 버전 정보 추출
|
|
const changelogContent = readChangelog();
|
|
const latestVersion = extractLatestVersion(changelogContent);
|
|
|
|
if (!latestVersion) {
|
|
console.warn(
|
|
"⚠️ CHANGELOG.md에서 버전 정보를 찾을 수 없습니다. 기본 메시지를 사용합니다."
|
|
);
|
|
await createDefaultMetadata();
|
|
return;
|
|
}
|
|
|
|
console.log(`📋 최신 버전 추출: ${latestVersion.version}`);
|
|
|
|
// Google Play Store 메타데이터 생성
|
|
await createGooglePlayMetadata(latestVersion);
|
|
|
|
// TestFlight 메타데이터는 GitHub Actions에서 직접 처리
|
|
console.log(
|
|
"✅ iOS TestFlight 메타데이터는 CI 파이프라인에서 자동 생성됩니다."
|
|
);
|
|
|
|
console.log("✅ 스토어 메타데이터 업데이트 완료");
|
|
}
|
|
|
|
/**
|
|
* CHANGELOG.md 읽기
|
|
*/
|
|
function readChangelog() {
|
|
if (!fs.existsSync(config.changelogPath)) {
|
|
console.warn(
|
|
`⚠️ CHANGELOG.md 파일을 찾을 수 없습니다: ${config.changelogPath}`
|
|
);
|
|
return "";
|
|
}
|
|
|
|
return fs.readFileSync(config.changelogPath, "utf8");
|
|
}
|
|
|
|
/**
|
|
* 최신 버전 정보 추출
|
|
*/
|
|
function extractLatestVersion(content) {
|
|
if (!content) return null;
|
|
|
|
// ## [1.0.0] - 2024-01-01 또는 ## 1.0.0 형식 매칭
|
|
const versionRegex = /^## \[?([^\]]+)\]?.*?\n(.*?)(?=\n## |$)/ms;
|
|
const match = content.match(versionRegex);
|
|
|
|
if (!match) return null;
|
|
|
|
const version = match[1];
|
|
let changes = match[2].trim();
|
|
|
|
// 마크다운 형식 정리
|
|
changes = changes
|
|
.replace(/### (.+)/g, "• $1") // ### 제목을 • 로 변환
|
|
.replace(/- (.+)/g, "• $1") // - 리스트를 • 로 변환
|
|
.replace(/\n\n+/g, "\n\n") // 연속된 빈 줄 정리
|
|
.trim();
|
|
|
|
return { version, changes };
|
|
}
|
|
|
|
/**
|
|
* Google Play Store 메타데이터 생성
|
|
*/
|
|
async function createGooglePlayMetadata(versionInfo) {
|
|
console.log("🟢 Google Play Store 메타데이터 생성...");
|
|
|
|
// 디렉토리 생성
|
|
const metadataDir = config.androidMetadataDir;
|
|
if (!fs.existsSync(metadataDir)) {
|
|
fs.mkdirSync(metadataDir, { recursive: true });
|
|
}
|
|
|
|
// 릴리즈 노트 생성 (Google Play 500자 제한)
|
|
let releaseNotes = `Zellyy Finance v${versionInfo.version}\n\n${versionInfo.changes}`;
|
|
|
|
// 길이 제한 처리
|
|
if (releaseNotes.length > config.googlePlayLimit) {
|
|
releaseNotes =
|
|
releaseNotes.substring(0, config.googlePlayLimit - 3) + "...";
|
|
}
|
|
|
|
// 파일 저장
|
|
const changelogFile = path.join(metadataDir, "default.txt");
|
|
fs.writeFileSync(changelogFile, releaseNotes);
|
|
|
|
console.log(
|
|
`✅ Google Play 릴리즈 노트 저장: ${changelogFile} (${releaseNotes.length}자)`
|
|
);
|
|
|
|
// 버전별 체인지로그도 생성 (선택사항)
|
|
const versionFile = path.join(metadataDir, `${versionInfo.version}.txt`);
|
|
fs.writeFileSync(versionFile, releaseNotes);
|
|
|
|
console.log(`✅ 버전별 체인지로그 저장: ${versionFile}`);
|
|
}
|
|
|
|
/**
|
|
* 기본 메타데이터 생성
|
|
*/
|
|
async function createDefaultMetadata() {
|
|
console.log("📝 기본 메타데이터 생성...");
|
|
|
|
const defaultMessage = `Zellyy Finance 새 버전이 출시되었습니다.
|
|
|
|
✨ 새로운 기능
|
|
• 향상된 사용자 인터페이스
|
|
• 성능 최적화 및 안정성 개선
|
|
|
|
🔧 개선사항
|
|
• 빠른 로딩 시간
|
|
• 더 나은 사용자 경험
|
|
|
|
자세한 내용은 앱 내에서 확인하세요!`;
|
|
|
|
// Google Play Store
|
|
const metadataDir = config.androidMetadataDir;
|
|
if (!fs.existsSync(metadataDir)) {
|
|
fs.mkdirSync(metadataDir, { recursive: true });
|
|
}
|
|
|
|
fs.writeFileSync(path.join(metadataDir, "default.txt"), defaultMessage);
|
|
console.log("✅ Google Play 기본 메타데이터 생성 완료");
|
|
}
|
|
|
|
/**
|
|
* TestFlight 릴리즈 노트 생성 (미리보기)
|
|
*/
|
|
function generateTestFlightNotes(versionInfo) {
|
|
let notes = `Zellyy Finance v${versionInfo.version}
|
|
|
|
${versionInfo.changes}
|
|
|
|
문의사항이 있으시면 개발팀에 연락주세요.
|
|
이메일: support@zellyy.finance`;
|
|
|
|
// 길이 제한 처리
|
|
if (notes.length > config.testFlightLimit) {
|
|
notes = notes.substring(0, config.testFlightLimit - 3) + "...";
|
|
}
|
|
|
|
return notes;
|
|
}
|
|
|
|
/**
|
|
* 사용 예시 출력
|
|
*/
|
|
function printUsage() {
|
|
console.log(`
|
|
📝 Store Metadata Updater Usage:
|
|
|
|
# 기본 실행 (CHANGELOG.md 기반)
|
|
node scripts/update-store-metadata.cjs
|
|
|
|
파일 구조:
|
|
- CHANGELOG.md # 소스 파일
|
|
- android/metadata/ko-KR/changelogs/default.txt # Google Play 릴리즈 노트
|
|
- android/metadata/ko-KR/changelogs/[버전].txt # 버전별 체인지로그
|
|
|
|
CHANGELOG.md 형식:
|
|
## [1.0.0] - 2024-01-01
|
|
### 새로운 기능
|
|
- 기능 1
|
|
- 기능 2
|
|
|
|
### 버그 수정
|
|
- 수정 1
|
|
- 수정 2
|
|
|
|
제한사항:
|
|
- Google Play Store: 최대 ${config.googlePlayLimit}자
|
|
- TestFlight: 최대 ${config.testFlightLimit}자
|
|
`);
|
|
}
|
|
|
|
// 메인 실행
|
|
if (require.main === module) {
|
|
const args = process.argv.slice(2);
|
|
|
|
if (args.includes("--help") || args.includes("-h")) {
|
|
printUsage();
|
|
process.exit(0);
|
|
}
|
|
|
|
updateStoreMetadata().catch((error) => {
|
|
console.error("메타데이터 업데이트 실패:", error);
|
|
process.exit(1);
|
|
});
|
|
}
|
|
|
|
module.exports = { updateStoreMetadata, extractLatestVersion };
|