- Add GitHub Actions workflow for automated CI/CD - Configure Node.js 18.x and 20.x matrix testing - Add TypeScript type checking step - Add ESLint code quality checks with enhanced rules - Add Prettier formatting verification - Add production build validation - Upload build artifacts for deployment - Set up automated testing on push/PR - Replace console.log with environment-aware logger - Add pre-commit hooks for code quality - Exclude archive folder from linting 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
104 lines
2.4 KiB
TypeScript
104 lines
2.4 KiB
TypeScript
import { format, parse, addMonths, subMonths } from "date-fns";
|
|
import { logger } from "@/utils/logger";
|
|
import { ko } from "date-fns/locale";
|
|
|
|
/**
|
|
* 월 이름 배열 (한국어)
|
|
*/
|
|
export const MONTHS_KR = [
|
|
"1월",
|
|
"2월",
|
|
"3월",
|
|
"4월",
|
|
"5월",
|
|
"6월",
|
|
"7월",
|
|
"8월",
|
|
"9월",
|
|
"10월",
|
|
"11월",
|
|
"12월",
|
|
];
|
|
|
|
/**
|
|
* 월 형식 검증 함수 (YYYY-MM 형식)
|
|
*/
|
|
export const isValidMonth = (month: string): boolean => {
|
|
const regex = /^\d{4}-(0[1-9]|1[0-2])$/;
|
|
return regex.test(month);
|
|
};
|
|
|
|
/**
|
|
* 현재 년월 가져오기
|
|
*/
|
|
export const getCurrentMonth = (): string => {
|
|
return format(new Date(), "yyyy-MM");
|
|
};
|
|
|
|
/**
|
|
* 이전 월 가져오기
|
|
*/
|
|
export const getPrevMonth = (month: string): string => {
|
|
// 입력값 검증
|
|
if (!isValidMonth(month)) {
|
|
logger.warn("유효하지 않은 월 형식:", month);
|
|
return getCurrentMonth();
|
|
}
|
|
|
|
try {
|
|
// 월 문자열을 날짜로 파싱
|
|
const date = parse(month, "yyyy-MM", new Date());
|
|
// 한 달 이전
|
|
const prevMonth = subMonths(date, 1);
|
|
// yyyy-MM 형식으로 반환
|
|
return format(prevMonth, "yyyy-MM");
|
|
} catch (error) {
|
|
logger.error("이전 월 계산 중 오류:", error);
|
|
return getCurrentMonth();
|
|
}
|
|
};
|
|
|
|
/**
|
|
* 다음 월 가져오기
|
|
*/
|
|
export const getNextMonth = (month: string): string => {
|
|
// 입력값 검증
|
|
if (!isValidMonth(month)) {
|
|
logger.warn("유효하지 않은 월 형식:", month);
|
|
return getCurrentMonth();
|
|
}
|
|
|
|
try {
|
|
// 월 문자열을 날짜로 파싱
|
|
const date = parse(month, "yyyy-MM", new Date());
|
|
// 한 달 이후
|
|
const nextMonth = addMonths(date, 1);
|
|
// yyyy-MM 형식으로 반환
|
|
return format(nextMonth, "yyyy-MM");
|
|
} catch (error) {
|
|
logger.error("다음 월 계산 중 오류:", error);
|
|
return getCurrentMonth();
|
|
}
|
|
};
|
|
|
|
/**
|
|
* 표시 형식으로 변환 (yyyy년 MM월)
|
|
*/
|
|
export const formatMonthForDisplay = (month: string): string => {
|
|
try {
|
|
// 입력값 검증
|
|
if (!isValidMonth(month)) {
|
|
logger.warn("유효하지 않은 월 형식:", month);
|
|
return format(new Date(), "yyyy년 MM월", { locale: ko });
|
|
}
|
|
|
|
// 월 문자열을 날짜로 파싱
|
|
const date = parse(month, "yyyy-MM", new Date());
|
|
// yyyy년 MM월 형식으로 반환 (한국어 로케일)
|
|
return format(date, "yyyy년 MM월", { locale: ko });
|
|
} catch (error) {
|
|
logger.error("월 형식 변환 중 오류:", error);
|
|
return month;
|
|
}
|
|
};
|