feat: Stage 2 TypeScript 타입 안전성 개선 - any 타입 83개 → 62개 대폭 감소
✨ 주요 개선사항: - 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>
This commit is contained in:
220
scripts/update-store-metadata.cjs
Normal file
220
scripts/update-store-metadata.cjs
Normal file
@@ -0,0 +1,220 @@
|
||||
#!/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 };
|
||||
Reference in New Issue
Block a user