sales-frontend-utils 0.0.45 → 0.0.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/date-utils.ts","../../src/utils/age-utils.ts"],"names":["dayjs","customParseFormat"],"mappings":"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","file":"age-utils.cjs","sourcesContent":["\nimport dayjs from 'dayjs';\nimport customParseFormat from 'dayjs/plugin/customParseFormat.js';\n\n/*****************************\n * 날짜 관련 유틸\n ******************************/\ndayjs.locale('ko');\ndayjs.extend(customParseFormat);\n\n/**\n *\n * @param year\n * @param month\n * @returns\n */\nexport function getLastDay(year: number, month: number) {\n switch (month) {\n case 2:\n return year % 4 === 0 ? 29 : 28;\n case 4:\n case 6:\n case 9:\n case 11:\n return 30;\n default:\n return 31;\n }\n}\n\n/**\n * 한달뒤 날짜를 포맷형태로 리턴\n * @param 20200101 or 2020.01.01\n * @param 'YYYY.MM.DD'\n * @returns\n */\nexport const getOneMonthLater = (value?: string, format?: string): string => {\n const str = value ? value.split('.').join('') : '';\n const date = value\n ? new Date(Number(str.substring(0, 4)), Number(str.substring(4, 6)) - 1, Number(str.substring(6, 8)))\n : new Date();\n try {\n return dayjs(new Date(date.setMonth(date.getMonth() + 1))).format(format || 'YYYY.MM.DD');\n } catch (err) {\n console.warn(err);\n\n return '';\n }\n};\n\n/**\n * 날짜 차이를 구한다. 포맷에 맞지 않으면 Not a Number 리턴\n * @param date1 (yyyymmdd or yyyy.mm.dd or yyyy-mm-dd)\n * @param date2 (yyyymmdd or yyyy.mm.dd or yyyy-mm-dd)\n * @returns date1 - date2\n */\nexport const getDateDiff = (date1: string | number | dayjs.Dayjs | Date, date2: string | number | dayjs.Dayjs | Date): number => {\n const diff1 = dayjs(date1);\n const diff2 = dayjs(date2);\n\n /** diff1 - diff2: 현재: 0 */\n return diff1.diff(diff2, 'day');\n};\n\n/**\n * 입력되어진 생년월일 값이 당일 기준으로 미래시점인 경우 false를 반환합니다. (회원체계 기준 9, 0 일 경우 오류)\n * @param front 주민등록번호 앞 6자리\n * @param back 주민등록번호 뒤 첫자리\n * @returns boolean\n */\nexport const validateBirthdate = (front: string, back: string) => {\n const year = parseInt(front.slice(0, 2));\n const month = parseInt(front.slice(2, 4));\n const day = parseInt(front.slice(4, 6));\n let birthYear = 0;\n\n switch (back) {\n case '1':\n case '2':\n case '5':\n case '6':\n birthYear = 1900 + year;\n break;\n case '3':\n case '4':\n case '7':\n case '8':\n birthYear = 2000 + year;\n break;\n case '9':\n case '0':\n // birthYear = 1800 + year;\n return false;\n default:\n return false;\n }\n\n const birthdate = new Date(birthYear, month - 1, day);\n const currdate = new Date();\n\n return birthdate < currdate;\n};\n\n/**\n * 목표 날짜가 비교 날짜 이후 인지 확인하는 함수 (YYYYMMDD 형식)\n * @param targetDate\n * @param compareDate\n * @returns boolean\n */\nexport function isDateAfter(targetDate: string | number | dayjs.Dayjs | Date, compareDate: string | number | dayjs.Dayjs | Date) {\n const targetDateTime = new Date(convertDateFormat(targetDate, 'YYYY-MM-DD')).getTime();\n const compareDateTime = new Date(convertDateFormat(compareDate, 'YYYY-MM-DD')).getTime();\n\n return targetDateTime > compareDateTime;\n}\n\n/**\n * 날짜를 포맷형태로 리턴\n * @param 20200101 string\n * @param 'YYYY.MM.DD\n * @returns 포맷화된 날짜\n */\nexport const convertDateFormat = (value?: string | number | dayjs.Dayjs | Date, format?: string): string => {\n if (!value) {\n return '';\n }\n\n return dayjs(value).format(format || 'YYYY.MM.DD');\n};\n\n/**\n * 주어진 날짜가 오늘 날짜 이후인지 확인합니다.\n *\n * @param {string} dateString - 확인할 날짜 문자열입니다.\n * @param {dayjs.OptionType} [format] - 날짜 문자열의 형식입니다.\n * @returns {boolean} - 주어진 날짜가 오늘 이후라면 true를 반환합니다.\n */\nexport const isFutureDate = (dateString?: string | number | dayjs.Dayjs | Date, format?: dayjs.OptionType) => {\n if (!dateString) {\n return false;\n }\n\n const today = dayjs().startOf('day');\n const date = dayjs(dateString, format || 'YYYYMMDD', true);\n\n return date.isValid() && date.isAfter(today);\n};\n\n\n\n/**\n * 자주 사용하는 타입들 추가해두었습니다. 필요하신 형태 있으면 추가해주세요.\n */\nexport type DateFormat =\n | 'YYYY-MM-DD'\n | 'YYYY.MM.DD'\n | 'YYYY-MM'\n | 'YYYY-MM-DD HH:mm:ss'\n | 'YYYY.MM.DD HH:mm:ss'\n | 'YYYY-MM-DD HH:mm'\n | 'YYYYMMDD'\n | 'YYYY.M.D'\n | 'YYYY.M'\n | 'YYYY.MM.DD(dd) HH:mm:ss'\n | 'HH:mm:ss'\n | 'YYYY.M.D(dd)'\n | 'HH:mm';\n\ninterface Props {\n /** 날짜 문자열 */\n dateString: string | number | Date | dayjs.Dayjs;\n /** 현재 날짜 포맷 */\n fromFormat?: string;\n /** 컨버팅할 날짜 포맷 */\n toFormat: string;\n}\n\n/**\n * date string 을 입력받고 패턴에 맞게 포맷팅을 변경하는 유틸 함수\n * fromFormat 현재 날짜 포맷\n * toFormat 리턴 날짜 포맷\n */\nexport const convertDateString = ({ dateString, fromFormat, toFormat }: Props) => {\n return dayjs(dateString, fromFormat).format(toFormat);\n};\n\nexport const isDate = (value: unknown) => {\n return value instanceof Date && !isNaN(+value);\n};\n\n\n/**\n * 날짜 유효성 검사\n *\n * @param {string} dateString - 검사할 날짜 문자열.\n * @param {dayjs.OptionType} [format] - 날짜 문자열의 형식입니다.\n * @returns {boolean} - 유효한 날짜이면 true를 반환하고, 그렇지 않으면 false를 반환합니다.\n */\nexport const isValidDate = (dateString?: string | number | dayjs.Dayjs | Date, format?: dayjs.OptionType) => {\n if (!dateString) {\n return false;\n }\n\n const date = dayjs(dateString, format || 'YYYYMMDD', true);\n\n return date.isValid();\n};\n\n\nexport type PeriodType = 'thisWeek' | 'lastWeek' | 'last7Days' | 'thisMonth' | 'lastMonth' | 'last365Days' | 'week' | 'month' | 'today';\n/**\n * @description\n * today 당일\n * week 7일: 오늘 기준 7일 전\n * month 30: 오늘 기준 30일 전\n * thisWeek 이번 주 (일요일 ~ 토요일)\n * lastWeek 지난 주 (일요일 ~ 토요일)\n * last7Days 최근 7일 (오늘 포함)\n * thisMonth 이번 달 (1일 ~ 말일)\n * lastMonth 지난 달 (1일 ~ 말일)\n * last365Days 최근 365일 (오늘 포함)\n * @param periodType \n * @returns \n */\nexport const getPeriodDate = (periodType: PeriodType | 'today') => {\n\n const lastMonth = dayjs().subtract(1, 'M');\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n\n const endDate = new Date(today);\n let startDate: Date;\n\n switch (periodType) {\n case 'today':\n // 당일\n startDate = new Date(today);\n\n return { startDate, endDate };\n\n case 'week':\n // 7일: 오늘 기준 7일 전\n startDate = new Date(today);\n startDate.setDate(startDate.getDate() - 6);\n\n return { startDate, endDate };\n case 'month':\n // 30일: 오늘 기준 30일 전\n startDate = new Date(today);\n startDate.setDate(startDate.getDate() - 29);\n\n return { startDate, endDate };\n\n case 'thisWeek':\n // 이번 주 (일요일 ~ 토요일)\n return ({ startDate: dayjs().day(0).toDate(), endDate: dayjs().day(6).toDate() });\n case 'lastWeek':\n // 지난 주 (일요일 ~ 토요일)\n return ({\n startDate: dayjs().subtract(1, 'w').day(0).toDate(),\n endDate: dayjs().subtract(1, 'w').day(6).toDate()\n });\n case 'last7Days':\n // 최근 7일 (오늘 포함)\n return ({ startDate: dayjs().subtract(7, 'd').toDate(), endDate: dayjs().toDate() });\n case 'thisMonth':\n // 이번 달 (1일 ~ 말일)\n return ({\n startDate: dayjs().date(1).toDate(),\n endDate: dayjs().date(dayjs().daysInMonth()).toDate()\n });\n case 'lastMonth':\n // 지난 달 (1일 ~ 말일)\n return ({\n startDate: lastMonth.date(1).toDate(),\n endDate: lastMonth.date(lastMonth.daysInMonth()).toDate()\n });\n case 'last365Days':\n // 최근 365일 (오늘 포함)\n return ({ startDate: dayjs().subtract(365, 'd').toDate(), endDate: dayjs().toDate() });\n default:\n return null;\n }\n\n\n};\n\n\n","import { getLastDay } from './date-utils';\n\ninterface AgeOptions {\n type?: inputType;\n}\n\ninterface AgeProps {\n front: string;\n back?: number;\n options?: AgeOptions;\n}\n\ntype inputType = 'YYYYMMDD' | 'YYMMDD';\nexport class Age {\n /**\n * 주민번호 앞자리만 입력받는 케이스\n * residentNumber: \"880108\"\n *\n * 생년월일 YYYYMMDD 를 입력받는 케이스\n * residentNumber: \"19880108\"\n */\n front: string;\n\n /**\n * 주민번호 뒷자리 첫글자\n */\n back?: string;\n options?: AgeOptions;\n dataType: inputType | 'Unknown';\n\n constructor({ front, back, options }: AgeProps) {\n //정규표현식을 이용하여 숫자형 문자열로 필터링\n this.front = this.filter(front);\n this.back = this.filter(back);\n this.options = options;\n\n const checkDataType = this.findDataType();\n this.invalidType(checkDataType);\n this.dataType = options?.type || checkDataType;\n }\n\n invalidType(checkDataType: inputType | 'Unknown') {\n if (checkDataType === 'Unknown') {\n throw new Error('Invalid resident number');\n }\n }\n filter(val?: number | string) {\n if (!val) {\n return '';\n }\n\n return val.toString().replace(/[^0-9]/g, '');\n }\n\n /**\n * 주민번호의 타입을 찾는 메소드\n * 입력된 타입이 없는 경우, 데이터를 기반으로 유추한다.\n * @returns inputType\n */\n findDataType() {\n if (this.front.length === 8) {\n return 'YYYYMMDD';\n } else if (this.front.length === 6) {\n return 'YYMMDD';\n }\n\n return 'Unknown';\n }\n\n /**\n * 보험나이를 계산하여 리턴한다.\n * 기존 ageUtils를 참고하여 구현\n */\n getInsuranceAge() {\n let yBirth;\n let mBirth;\n let dBirth;\n\n if (this.dataType === 'YYYYMMDD') {\n yBirth = parseFloat(this.front.substring(0, 4));\n mBirth = parseFloat(this.front.substring(4, 6));\n dBirth = parseFloat(this.front.substring(6, 8));\n } else if (this.dataType === 'YYMMDD') {\n if (\n this.front.substring(0, 1) === '0' ||\n this.front.substring(0, 1) === '1' ||\n this.front.substring(0, 1) === '2'\n ) {\n yBirth = parseFloat(this.front.substring(0, 2)) + 2000; //생년월일\n } else {\n yBirth = parseFloat(this.front.substring(0, 2)) + 1900; //생년월일\n }\n mBirth = parseFloat(this.front.substring(2, 4));\n dBirth = parseFloat(this.front.substring(4, 6));\n } else {\n console.error('getInsuranceAge >> 나이 입력 포멧 오류');\n\n return -1;\n }\n\n const curDate = new Date(); // 오늘\n const yToday = curDate.getFullYear(); //getFullYear()는 ie, 파폭, 크롬에서 같은값 호출\n const mToday = curDate.getMonth() + 1;\n const dToday = curDate.getDate();\n\n let yDiff = yToday - yBirth;\n let mDiff = mToday - mBirth - (dToday < dBirth ? 1 : 0);\n\n if (mDiff < 0) {\n mDiff += 12;\n --yDiff;\n }\n if (yDiff < 0) {\n return -1;\n }\n\n if (mDiff === 5 && dToday < dBirth && dToday === getLastDay(yToday, mToday)) {\n ++mDiff;\n }\n\n return yDiff + (6 <= mDiff ? 1 : 0);\n }\n\n /**\n * 입력되어잔 생년월일 값과 주민등록번호 뒤 첫째자리 값을 통해 만나이를 반환합니다.\n * 에러: -1 반환\n * @param front 주민등록번호 앞 6자리\n * @param back 주민등록번호 뒤 첫자리\n * @returns number\n */\n getFullAge() {\n const month = parseInt(this.front.slice(2, 4));\n const day = parseInt(this.front.slice(4, 6));\n\n const birthYear = this.getBirthYear();\n if (!birthYear) {\n console.error('birthYear is not defined');\n\n return -1;\n }\n const currentDate = new Date();\n\n let yDiff = currentDate.getFullYear() - birthYear;\n console.log(yDiff, currentDate.getFullYear(), birthYear);\n let mDiff = currentDate.getMonth() + 1 - month - (currentDate.getDate() < day ? 1 : 0);\n\n if (mDiff < 0) {\n mDiff += 12;\n --yDiff;\n }\n if (yDiff < 0) {\n return -1;\n }\n\n return yDiff;\n }\n\n getBirthYear() {\n if (this.dataType === 'YYMMDD') {\n if (!this.back) {\n console.error('back is not defined');\n\n return -1;\n }\n const year = this.front.slice(0, 2);\n let centuryOffset;\n if (['1', '2', '5', '6'].includes(this.back)) {\n centuryOffset = 1900;\n } else if (['3', '4', '7', '8'].includes(this.back)) {\n centuryOffset = 2000;\n } else if (['9', '0'].includes(this.back)) {\n centuryOffset = 1800;\n } else {\n return -1;\n }\n\n const birthYear = centuryOffset + parseInt(year, 10);\n\n return birthYear;\n } else if (this.dataType === 'YYYYMMDD') {\n return parseInt(this.front.slice(0, 4));\n }\n\n\n }\n\n /**\n * 외국인 여부 판단\n * 주민등록번호 뒷자리의 첫번째 자리값 내려보내고 있어요.\n * 5, 6, 7, 8 -> 외국인\n */\n isForeigner() {\n if (!this.back) {\n console.error('back is not defined');\n\n return -1;\n }\n\n return ['5', '6', '7', '8'].includes(this.back.toString());\n }\n\n\n static isForeigner(value: string | number) {\n const str = String(value);\n const firstChar = str.charAt(0);\n\n return ['5', '6', '7', '8'].includes(firstChar);\n }\n\n\n /**\n * 외국인 여부 판단\n * 주민등록번호 전체로 판단\n * 5, 6, 7, 8 -> 외국인\n */\n static isForeignerFullNumber(regNo: string): boolean {\n if (!regNo) {\n console.error('regNo is not defined');\n\n return false;\n }\n\n // 숫자만 추출\n const cleaned = regNo.replace(/[^0-9]/g, '');\n\n // 최소 7자리 필요\n if (cleaned.length < 7) {\n console.error('cleaned.length < 7');\n\n return false;\n }\n\n const firstOfBack = cleaned[6]; // 뒤 7자리 중 첫 번째 숫자\n if (!firstOfBack) {\n console.error('firstOfBack is not defined');\n\n return false;\n }\n\n // 외국인 구분: 5,6,7,8\n return ['5', '6', '7', '8'].includes(firstOfBack);\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/utils/date-utils.ts","../../src/utils/age-utils.ts"],"names":["dayjs","customParseFormat"],"mappings":"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","file":"age-utils.cjs","sourcesContent":["import dayjs from 'dayjs';\nimport customParseFormat from 'dayjs/plugin/customParseFormat.js';\n\n/*****************************\n * 날짜 관련 유틸\n ******************************/\ndayjs.locale('ko');\ndayjs.extend(customParseFormat);\n\n/**\n *\n * @param year\n * @param month\n * @returns\n */\nexport function getLastDay(year: number, month: number) {\n switch (month) {\n case 2:\n return year % 4 === 0 ? 29 : 28;\n case 4:\n case 6:\n case 9:\n case 11:\n return 30;\n default:\n return 31;\n }\n}\n\n/**\n * 한달뒤 날짜를 포맷형태로 리턴\n * @param 20200101 or 2020.01.01\n * @param 'YYYY.MM.DD'\n * @returns\n */\nexport const getOneMonthLater = (value?: string, format?: string): string => {\n const str = value ? value.split('.').join('') : '';\n const date = value\n ? new Date(Number(str.substring(0, 4)), Number(str.substring(4, 6)) - 1, Number(str.substring(6, 8)))\n : new Date();\n try {\n return dayjs(new Date(date.setMonth(date.getMonth() + 1))).format(format || 'YYYY.MM.DD');\n } catch (err) {\n console.warn(err);\n\n return '';\n }\n};\n\n/**\n * 날짜 차이를 구한다. 포맷에 맞지 않으면 Not a Number 리턴\n * @param date1 (yyyymmdd or yyyy.mm.dd or yyyy-mm-dd)\n * @param date2 (yyyymmdd or yyyy.mm.dd or yyyy-mm-dd)\n * @returns date1 - date2\n */\nexport const getDateDiff = (\n date1: string | number | dayjs.Dayjs | Date,\n date2: string | number | dayjs.Dayjs | Date\n): number => {\n const diff1 = dayjs(date1);\n const diff2 = dayjs(date2);\n\n /** diff1 - diff2: 현재: 0 */\n return diff1.diff(diff2, 'day');\n};\n\n/**\n * 입력되어진 생년월일 값이 당일 기준으로 미래시점인 경우 false를 반환합니다. (회원체계 기준 9, 0 일 경우 오류)\n * @param front 주민등록번호 앞 6자리\n * @param back 주민등록번호 뒤 첫자리\n * @returns boolean\n */\nexport const validateBirthdate = (front: string, back: string) => {\n const year = parseInt(front.slice(0, 2));\n const month = parseInt(front.slice(2, 4));\n const day = parseInt(front.slice(4, 6));\n let birthYear = 0;\n\n switch (back) {\n case '1':\n case '2':\n case '5':\n case '6':\n birthYear = 1900 + year;\n break;\n case '3':\n case '4':\n case '7':\n case '8':\n birthYear = 2000 + year;\n break;\n case '9':\n case '0':\n // birthYear = 1800 + year;\n return false;\n default:\n return false;\n }\n\n const birthdate = new Date(birthYear, month - 1, day);\n const currdate = new Date();\n\n return birthdate < currdate;\n};\n\n/**\n * 목표 날짜가 비교 날짜 이후 인지 확인하는 함수 (YYYYMMDD 형식)\n * @param targetDate\n * @param compareDate\n * @returns boolean\n */\nexport function isDateAfter(\n targetDate: string | number | dayjs.Dayjs | Date,\n compareDate: string | number | dayjs.Dayjs | Date\n) {\n const targetDateTime = new Date(convertDateFormat(targetDate, 'YYYY-MM-DD')).getTime();\n const compareDateTime = new Date(convertDateFormat(compareDate, 'YYYY-MM-DD')).getTime();\n\n return targetDateTime > compareDateTime;\n}\n\n/**\n * 날짜를 포맷형태로 리턴\n * @param 20200101 string\n * @param 'YYYY.MM.DD\n * @returns 포맷화된 날짜\n */\nexport const convertDateFormat = (value?: string | number | dayjs.Dayjs | Date, format?: string): string => {\n if (!value) {\n return '';\n }\n\n return dayjs(value).format(format || 'YYYY.MM.DD');\n};\n\n/**\n * 주어진 날짜가 오늘 날짜 이후인지 확인합니다.\n *\n * @param {string} dateString - 확인할 날짜 문자열입니다.\n * @param {dayjs.OptionType} [format] - 날짜 문자열의 형식입니다.\n * @returns {boolean} - 주어진 날짜가 오늘 이후라면 true를 반환합니다.\n */\nexport const isFutureDate = (dateString?: string | number | dayjs.Dayjs | Date, format?: dayjs.OptionType) => {\n if (!dateString) {\n return false;\n }\n\n const today = dayjs().startOf('day');\n const date = dayjs(dateString, format || 'YYYYMMDD', true);\n\n return date.isValid() && date.isAfter(today);\n};\n\n/**\n * 자주 사용하는 타입들 추가해두었습니다. 필요하신 형태 있으면 추가해주세요.\n */\nexport type DateFormat =\n | 'YYYY-MM-DD'\n | 'YYYY.MM.DD'\n | 'YYYY-MM'\n | 'YYYY-MM-DD HH:mm:ss'\n | 'YYYY.MM.DD HH:mm:ss'\n | 'YYYY-MM-DD HH:mm'\n | 'YYYYMMDD'\n | 'YYYY.M.D'\n | 'YYYY.M'\n | 'YYYY.MM.DD(dd) HH:mm:ss'\n | 'HH:mm:ss'\n | 'YYYY.M.D(dd)'\n | 'HH:mm';\n\ninterface Props {\n /** 날짜 문자열 */\n dateString: string | number | Date | dayjs.Dayjs;\n /** 현재 날짜 포맷 */\n fromFormat?: string;\n /** 컨버팅할 날짜 포맷 */\n toFormat: string;\n}\n\n/**\n * date string 을 입력받고 패턴에 맞게 포맷팅을 변경하는 유틸 함수\n * fromFormat 현재 날짜 포맷\n * toFormat 리턴 날짜 포맷\n */\nexport const convertDateString = ({ dateString, fromFormat, toFormat }: Props) => {\n return dayjs(dateString, fromFormat).format(toFormat);\n};\n\nexport const isDate = (value: unknown) => {\n return value instanceof Date && !isNaN(+value);\n};\n\n/**\n * 날짜 유효성 검사\n *\n * @param {string} dateString - 검사할 날짜 문자열.\n * @param {dayjs.OptionType} [format] - 날짜 문자열의 형식입니다.\n * @returns {boolean} - 유효한 날짜이면 true를 반환하고, 그렇지 않으면 false를 반환합니다.\n */\nexport const isValidDate = (dateString?: string | number | dayjs.Dayjs | Date, format?: dayjs.OptionType) => {\n if (!dateString) {\n return false;\n }\n\n const date = dayjs(dateString, format || 'YYYYMMDD', true);\n\n return date.isValid();\n};\n\nexport type PeriodType =\n | 'thisWeek'\n | 'lastWeek'\n | 'last7Days'\n | 'thisMonth'\n | 'lastMonth'\n | 'last365Days'\n | 'week'\n | 'month'\n | 'today';\n/**\n * @description\n * today 당일\n * week 7일: 오늘 기준 7일 전\n * month 30: 오늘 기준 30일 전\n * thisWeek 이번 주 (일요일 ~ 토요일)\n * lastWeek 지난 주 (일요일 ~ 토요일)\n * last7Days 최근 7일 (오늘 포함)\n * thisMonth 이번 달 (1일 ~ 말일)\n * lastMonth 지난 달 (1일 ~ 말일)\n * last365Days 최근 365일 (오늘 포함)\n * @param periodType\n * @returns\n */\nexport const getPeriodDate = (periodType: PeriodType | 'today') => {\n const lastMonth = dayjs().subtract(1, 'M');\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n\n const endDate = new Date(today);\n let startDate: Date;\n\n switch (periodType) {\n case 'today':\n // 당일\n startDate = new Date(today);\n\n return { startDate, endDate };\n\n case 'week':\n // 7일: 오늘 기준 7일 전\n startDate = new Date(today);\n startDate.setDate(startDate.getDate() - 6);\n\n return { startDate, endDate };\n case 'month':\n // 30일: 오늘 기준 30일 전\n startDate = new Date(today);\n startDate.setDate(startDate.getDate() - 29);\n\n return { startDate, endDate };\n\n case 'thisWeek':\n // 이번 주 (일요일 ~ 토요일)\n return { startDate: dayjs().day(0).toDate(), endDate: dayjs().day(6).toDate() };\n case 'lastWeek':\n // 지난 주 (일요일 ~ 토요일)\n return {\n startDate: dayjs().subtract(1, 'w').day(0).toDate(),\n endDate: dayjs().subtract(1, 'w').day(6).toDate()\n };\n case 'last7Days':\n // 최근 7일 (오늘 포함)\n return { startDate: dayjs().subtract(7, 'd').toDate(), endDate: dayjs().toDate() };\n case 'thisMonth':\n // 이번 달 (1일 ~ 말일)\n return {\n startDate: dayjs().date(1).toDate(),\n endDate: dayjs().date(dayjs().daysInMonth()).toDate()\n };\n case 'lastMonth':\n // 지난 달 (1일 ~ 말일)\n return {\n startDate: lastMonth.date(1).toDate(),\n endDate: lastMonth.date(lastMonth.daysInMonth()).toDate()\n };\n case 'last365Days':\n // 최근 365일 (오늘 포함)\n return { startDate: dayjs().subtract(365, 'd').toDate(), endDate: dayjs().toDate() };\n default:\n return null;\n }\n};\n","import { getLastDay } from './date-utils';\n\ninterface AgeOptions {\n type?: inputType;\n}\n\ninterface AgeProps {\n front: string;\n back?: number;\n options?: AgeOptions;\n}\n\ntype inputType = 'YYYYMMDD' | 'YYMMDD';\nexport class Age {\n /**\n * 주민번호 앞자리만 입력받는 케이스\n * residentNumber: \"880108\"\n *\n * 생년월일 YYYYMMDD 를 입력받는 케이스\n * residentNumber: \"19880108\"\n */\n front: string;\n\n /**\n * 주민번호 뒷자리 첫글자\n */\n back?: string;\n options?: AgeOptions;\n dataType: inputType | 'Unknown';\n\n constructor({ front, back, options }: AgeProps) {\n //정규표현식을 이용하여 숫자형 문자열로 필터링\n this.front = this.filter(front);\n this.back = this.filter(back);\n this.options = options;\n\n const checkDataType = this.findDataType();\n this.invalidType(checkDataType);\n this.dataType = options?.type || checkDataType;\n }\n\n invalidType(checkDataType: inputType | 'Unknown') {\n if (checkDataType === 'Unknown') {\n throw new Error('Invalid resident number');\n }\n }\n filter(val?: number | string) {\n if (!val) {\n return '';\n }\n\n return val.toString().replace(/[^0-9]/g, '');\n }\n\n /**\n * 주민번호의 타입을 찾는 메소드\n * 입력된 타입이 없는 경우, 데이터를 기반으로 유추한다.\n * @returns inputType\n */\n findDataType() {\n if (this.front.length === 8) {\n return 'YYYYMMDD';\n } else if (this.front.length === 6) {\n return 'YYMMDD';\n }\n\n return 'Unknown';\n }\n\n /**\n * 보험나이를 계산하여 리턴한다.\n * 기존 ageUtils를 참고하여 구현\n */\n getInsuranceAge() {\n let yBirth;\n let mBirth;\n let dBirth;\n\n if (this.dataType === 'YYYYMMDD') {\n yBirth = parseFloat(this.front.substring(0, 4));\n mBirth = parseFloat(this.front.substring(4, 6));\n dBirth = parseFloat(this.front.substring(6, 8));\n } else if (this.dataType === 'YYMMDD') {\n if (\n this.front.substring(0, 1) === '0' ||\n this.front.substring(0, 1) === '1' ||\n this.front.substring(0, 1) === '2'\n ) {\n yBirth = parseFloat(this.front.substring(0, 2)) + 2000; //생년월일\n } else {\n yBirth = parseFloat(this.front.substring(0, 2)) + 1900; //생년월일\n }\n mBirth = parseFloat(this.front.substring(2, 4));\n dBirth = parseFloat(this.front.substring(4, 6));\n } else {\n console.error('getInsuranceAge >> 나이 입력 포멧 오류');\n\n return -1;\n }\n\n const curDate = new Date(); // 오늘\n const yToday = curDate.getFullYear(); //getFullYear()는 ie, 파폭, 크롬에서 같은값 호출\n const mToday = curDate.getMonth() + 1;\n const dToday = curDate.getDate();\n\n let yDiff = yToday - yBirth;\n let mDiff = mToday - mBirth - (dToday < dBirth ? 1 : 0);\n\n if (mDiff < 0) {\n mDiff += 12;\n --yDiff;\n }\n if (yDiff < 0) {\n return -1;\n }\n\n if (mDiff === 5 && dToday < dBirth && dToday === getLastDay(yToday, mToday)) {\n ++mDiff;\n }\n\n return yDiff + (6 <= mDiff ? 1 : 0);\n }\n\n /**\n * 입력되어잔 생년월일 값과 주민등록번호 뒤 첫째자리 값을 통해 만나이를 반환합니다.\n * 에러: -1 반환\n * @param front 주민등록번호 앞 6자리\n * @param back 주민등록번호 뒤 첫자리\n * @returns number\n */\n getFullAge() {\n const month = parseInt(this.front.slice(2, 4));\n const day = parseInt(this.front.slice(4, 6));\n\n const birthYear = this.getBirthYear();\n if (!birthYear) {\n console.error('birthYear is not defined');\n\n return -1;\n }\n const currentDate = new Date();\n\n let yDiff = currentDate.getFullYear() - birthYear;\n console.log(yDiff, currentDate.getFullYear(), birthYear);\n let mDiff = currentDate.getMonth() + 1 - month - (currentDate.getDate() < day ? 1 : 0);\n\n if (mDiff < 0) {\n mDiff += 12;\n --yDiff;\n }\n if (yDiff < 0) {\n return -1;\n }\n\n return yDiff;\n }\n\n getBirthYear() {\n if (this.dataType === 'YYMMDD') {\n if (!this.back) {\n console.error('back is not defined');\n\n return -1;\n }\n const year = this.front.slice(0, 2);\n let centuryOffset;\n if (['1', '2', '5', '6'].includes(this.back)) {\n centuryOffset = 1900;\n } else if (['3', '4', '7', '8'].includes(this.back)) {\n centuryOffset = 2000;\n } else if (['9', '0'].includes(this.back)) {\n centuryOffset = 1800;\n } else {\n return -1;\n }\n\n const birthYear = centuryOffset + parseInt(year, 10);\n\n return birthYear;\n } else if (this.dataType === 'YYYYMMDD') {\n return parseInt(this.front.slice(0, 4));\n }\n\n\n }\n\n /**\n * 외국인 여부 판단\n * 주민등록번호 뒷자리의 첫번째 자리값 내려보내고 있어요.\n * 5, 6, 7, 8 -> 외국인\n */\n isForeigner() {\n if (!this.back) {\n console.error('back is not defined');\n\n return -1;\n }\n\n return ['5', '6', '7', '8'].includes(this.back.toString());\n }\n\n\n static isForeigner(value: string | number) {\n const str = String(value);\n const firstChar = str.charAt(0);\n\n return ['5', '6', '7', '8'].includes(firstChar);\n }\n\n\n /**\n * 외국인 여부 판단\n * 주민등록번호 전체로 판단\n * 5, 6, 7, 8 -> 외국인\n */\n static isForeignerFullNumber(regNo: string): boolean {\n if (!regNo) {\n console.error('regNo is not defined');\n\n return false;\n }\n\n // 숫자만 추출\n const cleaned = regNo.replace(/[^0-9]/g, '');\n\n // 최소 7자리 필요\n if (cleaned.length < 7) {\n console.error('cleaned.length < 7');\n\n return false;\n }\n\n const firstOfBack = cleaned[6]; // 뒤 7자리 중 첫 번째 숫자\n if (!firstOfBack) {\n console.error('firstOfBack is not defined');\n\n return false;\n }\n\n // 외국인 구분: 5,6,7,8\n return ['5', '6', '7', '8'].includes(firstOfBack);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/date-utils.ts","../../src/utils/age-utils.ts"],"names":[],"mappings":"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","file":"age-utils.js","sourcesContent":["\nimport dayjs from 'dayjs';\nimport customParseFormat from 'dayjs/plugin/customParseFormat.js';\n\n/*****************************\n * 날짜 관련 유틸\n ******************************/\ndayjs.locale('ko');\ndayjs.extend(customParseFormat);\n\n/**\n *\n * @param year\n * @param month\n * @returns\n */\nexport function getLastDay(year: number, month: number) {\n switch (month) {\n case 2:\n return year % 4 === 0 ? 29 : 28;\n case 4:\n case 6:\n case 9:\n case 11:\n return 30;\n default:\n return 31;\n }\n}\n\n/**\n * 한달뒤 날짜를 포맷형태로 리턴\n * @param 20200101 or 2020.01.01\n * @param 'YYYY.MM.DD'\n * @returns\n */\nexport const getOneMonthLater = (value?: string, format?: string): string => {\n const str = value ? value.split('.').join('') : '';\n const date = value\n ? new Date(Number(str.substring(0, 4)), Number(str.substring(4, 6)) - 1, Number(str.substring(6, 8)))\n : new Date();\n try {\n return dayjs(new Date(date.setMonth(date.getMonth() + 1))).format(format || 'YYYY.MM.DD');\n } catch (err) {\n console.warn(err);\n\n return '';\n }\n};\n\n/**\n * 날짜 차이를 구한다. 포맷에 맞지 않으면 Not a Number 리턴\n * @param date1 (yyyymmdd or yyyy.mm.dd or yyyy-mm-dd)\n * @param date2 (yyyymmdd or yyyy.mm.dd or yyyy-mm-dd)\n * @returns date1 - date2\n */\nexport const getDateDiff = (date1: string | number | dayjs.Dayjs | Date, date2: string | number | dayjs.Dayjs | Date): number => {\n const diff1 = dayjs(date1);\n const diff2 = dayjs(date2);\n\n /** diff1 - diff2: 현재: 0 */\n return diff1.diff(diff2, 'day');\n};\n\n/**\n * 입력되어진 생년월일 값이 당일 기준으로 미래시점인 경우 false를 반환합니다. (회원체계 기준 9, 0 일 경우 오류)\n * @param front 주민등록번호 앞 6자리\n * @param back 주민등록번호 뒤 첫자리\n * @returns boolean\n */\nexport const validateBirthdate = (front: string, back: string) => {\n const year = parseInt(front.slice(0, 2));\n const month = parseInt(front.slice(2, 4));\n const day = parseInt(front.slice(4, 6));\n let birthYear = 0;\n\n switch (back) {\n case '1':\n case '2':\n case '5':\n case '6':\n birthYear = 1900 + year;\n break;\n case '3':\n case '4':\n case '7':\n case '8':\n birthYear = 2000 + year;\n break;\n case '9':\n case '0':\n // birthYear = 1800 + year;\n return false;\n default:\n return false;\n }\n\n const birthdate = new Date(birthYear, month - 1, day);\n const currdate = new Date();\n\n return birthdate < currdate;\n};\n\n/**\n * 목표 날짜가 비교 날짜 이후 인지 확인하는 함수 (YYYYMMDD 형식)\n * @param targetDate\n * @param compareDate\n * @returns boolean\n */\nexport function isDateAfter(targetDate: string | number | dayjs.Dayjs | Date, compareDate: string | number | dayjs.Dayjs | Date) {\n const targetDateTime = new Date(convertDateFormat(targetDate, 'YYYY-MM-DD')).getTime();\n const compareDateTime = new Date(convertDateFormat(compareDate, 'YYYY-MM-DD')).getTime();\n\n return targetDateTime > compareDateTime;\n}\n\n/**\n * 날짜를 포맷형태로 리턴\n * @param 20200101 string\n * @param 'YYYY.MM.DD\n * @returns 포맷화된 날짜\n */\nexport const convertDateFormat = (value?: string | number | dayjs.Dayjs | Date, format?: string): string => {\n if (!value) {\n return '';\n }\n\n return dayjs(value).format(format || 'YYYY.MM.DD');\n};\n\n/**\n * 주어진 날짜가 오늘 날짜 이후인지 확인합니다.\n *\n * @param {string} dateString - 확인할 날짜 문자열입니다.\n * @param {dayjs.OptionType} [format] - 날짜 문자열의 형식입니다.\n * @returns {boolean} - 주어진 날짜가 오늘 이후라면 true를 반환합니다.\n */\nexport const isFutureDate = (dateString?: string | number | dayjs.Dayjs | Date, format?: dayjs.OptionType) => {\n if (!dateString) {\n return false;\n }\n\n const today = dayjs().startOf('day');\n const date = dayjs(dateString, format || 'YYYYMMDD', true);\n\n return date.isValid() && date.isAfter(today);\n};\n\n\n\n/**\n * 자주 사용하는 타입들 추가해두었습니다. 필요하신 형태 있으면 추가해주세요.\n */\nexport type DateFormat =\n | 'YYYY-MM-DD'\n | 'YYYY.MM.DD'\n | 'YYYY-MM'\n | 'YYYY-MM-DD HH:mm:ss'\n | 'YYYY.MM.DD HH:mm:ss'\n | 'YYYY-MM-DD HH:mm'\n | 'YYYYMMDD'\n | 'YYYY.M.D'\n | 'YYYY.M'\n | 'YYYY.MM.DD(dd) HH:mm:ss'\n | 'HH:mm:ss'\n | 'YYYY.M.D(dd)'\n | 'HH:mm';\n\ninterface Props {\n /** 날짜 문자열 */\n dateString: string | number | Date | dayjs.Dayjs;\n /** 현재 날짜 포맷 */\n fromFormat?: string;\n /** 컨버팅할 날짜 포맷 */\n toFormat: string;\n}\n\n/**\n * date string 을 입력받고 패턴에 맞게 포맷팅을 변경하는 유틸 함수\n * fromFormat 현재 날짜 포맷\n * toFormat 리턴 날짜 포맷\n */\nexport const convertDateString = ({ dateString, fromFormat, toFormat }: Props) => {\n return dayjs(dateString, fromFormat).format(toFormat);\n};\n\nexport const isDate = (value: unknown) => {\n return value instanceof Date && !isNaN(+value);\n};\n\n\n/**\n * 날짜 유효성 검사\n *\n * @param {string} dateString - 검사할 날짜 문자열.\n * @param {dayjs.OptionType} [format] - 날짜 문자열의 형식입니다.\n * @returns {boolean} - 유효한 날짜이면 true를 반환하고, 그렇지 않으면 false를 반환합니다.\n */\nexport const isValidDate = (dateString?: string | number | dayjs.Dayjs | Date, format?: dayjs.OptionType) => {\n if (!dateString) {\n return false;\n }\n\n const date = dayjs(dateString, format || 'YYYYMMDD', true);\n\n return date.isValid();\n};\n\n\nexport type PeriodType = 'thisWeek' | 'lastWeek' | 'last7Days' | 'thisMonth' | 'lastMonth' | 'last365Days' | 'week' | 'month' | 'today';\n/**\n * @description\n * today 당일\n * week 7일: 오늘 기준 7일 전\n * month 30: 오늘 기준 30일 전\n * thisWeek 이번 주 (일요일 ~ 토요일)\n * lastWeek 지난 주 (일요일 ~ 토요일)\n * last7Days 최근 7일 (오늘 포함)\n * thisMonth 이번 달 (1일 ~ 말일)\n * lastMonth 지난 달 (1일 ~ 말일)\n * last365Days 최근 365일 (오늘 포함)\n * @param periodType \n * @returns \n */\nexport const getPeriodDate = (periodType: PeriodType | 'today') => {\n\n const lastMonth = dayjs().subtract(1, 'M');\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n\n const endDate = new Date(today);\n let startDate: Date;\n\n switch (periodType) {\n case 'today':\n // 당일\n startDate = new Date(today);\n\n return { startDate, endDate };\n\n case 'week':\n // 7일: 오늘 기준 7일 전\n startDate = new Date(today);\n startDate.setDate(startDate.getDate() - 6);\n\n return { startDate, endDate };\n case 'month':\n // 30일: 오늘 기준 30일 전\n startDate = new Date(today);\n startDate.setDate(startDate.getDate() - 29);\n\n return { startDate, endDate };\n\n case 'thisWeek':\n // 이번 주 (일요일 ~ 토요일)\n return ({ startDate: dayjs().day(0).toDate(), endDate: dayjs().day(6).toDate() });\n case 'lastWeek':\n // 지난 주 (일요일 ~ 토요일)\n return ({\n startDate: dayjs().subtract(1, 'w').day(0).toDate(),\n endDate: dayjs().subtract(1, 'w').day(6).toDate()\n });\n case 'last7Days':\n // 최근 7일 (오늘 포함)\n return ({ startDate: dayjs().subtract(7, 'd').toDate(), endDate: dayjs().toDate() });\n case 'thisMonth':\n // 이번 달 (1일 ~ 말일)\n return ({\n startDate: dayjs().date(1).toDate(),\n endDate: dayjs().date(dayjs().daysInMonth()).toDate()\n });\n case 'lastMonth':\n // 지난 달 (1일 ~ 말일)\n return ({\n startDate: lastMonth.date(1).toDate(),\n endDate: lastMonth.date(lastMonth.daysInMonth()).toDate()\n });\n case 'last365Days':\n // 최근 365일 (오늘 포함)\n return ({ startDate: dayjs().subtract(365, 'd').toDate(), endDate: dayjs().toDate() });\n default:\n return null;\n }\n\n\n};\n\n\n","import { getLastDay } from './date-utils';\n\ninterface AgeOptions {\n type?: inputType;\n}\n\ninterface AgeProps {\n front: string;\n back?: number;\n options?: AgeOptions;\n}\n\ntype inputType = 'YYYYMMDD' | 'YYMMDD';\nexport class Age {\n /**\n * 주민번호 앞자리만 입력받는 케이스\n * residentNumber: \"880108\"\n *\n * 생년월일 YYYYMMDD 를 입력받는 케이스\n * residentNumber: \"19880108\"\n */\n front: string;\n\n /**\n * 주민번호 뒷자리 첫글자\n */\n back?: string;\n options?: AgeOptions;\n dataType: inputType | 'Unknown';\n\n constructor({ front, back, options }: AgeProps) {\n //정규표현식을 이용하여 숫자형 문자열로 필터링\n this.front = this.filter(front);\n this.back = this.filter(back);\n this.options = options;\n\n const checkDataType = this.findDataType();\n this.invalidType(checkDataType);\n this.dataType = options?.type || checkDataType;\n }\n\n invalidType(checkDataType: inputType | 'Unknown') {\n if (checkDataType === 'Unknown') {\n throw new Error('Invalid resident number');\n }\n }\n filter(val?: number | string) {\n if (!val) {\n return '';\n }\n\n return val.toString().replace(/[^0-9]/g, '');\n }\n\n /**\n * 주민번호의 타입을 찾는 메소드\n * 입력된 타입이 없는 경우, 데이터를 기반으로 유추한다.\n * @returns inputType\n */\n findDataType() {\n if (this.front.length === 8) {\n return 'YYYYMMDD';\n } else if (this.front.length === 6) {\n return 'YYMMDD';\n }\n\n return 'Unknown';\n }\n\n /**\n * 보험나이를 계산하여 리턴한다.\n * 기존 ageUtils를 참고하여 구현\n */\n getInsuranceAge() {\n let yBirth;\n let mBirth;\n let dBirth;\n\n if (this.dataType === 'YYYYMMDD') {\n yBirth = parseFloat(this.front.substring(0, 4));\n mBirth = parseFloat(this.front.substring(4, 6));\n dBirth = parseFloat(this.front.substring(6, 8));\n } else if (this.dataType === 'YYMMDD') {\n if (\n this.front.substring(0, 1) === '0' ||\n this.front.substring(0, 1) === '1' ||\n this.front.substring(0, 1) === '2'\n ) {\n yBirth = parseFloat(this.front.substring(0, 2)) + 2000; //생년월일\n } else {\n yBirth = parseFloat(this.front.substring(0, 2)) + 1900; //생년월일\n }\n mBirth = parseFloat(this.front.substring(2, 4));\n dBirth = parseFloat(this.front.substring(4, 6));\n } else {\n console.error('getInsuranceAge >> 나이 입력 포멧 오류');\n\n return -1;\n }\n\n const curDate = new Date(); // 오늘\n const yToday = curDate.getFullYear(); //getFullYear()는 ie, 파폭, 크롬에서 같은값 호출\n const mToday = curDate.getMonth() + 1;\n const dToday = curDate.getDate();\n\n let yDiff = yToday - yBirth;\n let mDiff = mToday - mBirth - (dToday < dBirth ? 1 : 0);\n\n if (mDiff < 0) {\n mDiff += 12;\n --yDiff;\n }\n if (yDiff < 0) {\n return -1;\n }\n\n if (mDiff === 5 && dToday < dBirth && dToday === getLastDay(yToday, mToday)) {\n ++mDiff;\n }\n\n return yDiff + (6 <= mDiff ? 1 : 0);\n }\n\n /**\n * 입력되어잔 생년월일 값과 주민등록번호 뒤 첫째자리 값을 통해 만나이를 반환합니다.\n * 에러: -1 반환\n * @param front 주민등록번호 앞 6자리\n * @param back 주민등록번호 뒤 첫자리\n * @returns number\n */\n getFullAge() {\n const month = parseInt(this.front.slice(2, 4));\n const day = parseInt(this.front.slice(4, 6));\n\n const birthYear = this.getBirthYear();\n if (!birthYear) {\n console.error('birthYear is not defined');\n\n return -1;\n }\n const currentDate = new Date();\n\n let yDiff = currentDate.getFullYear() - birthYear;\n console.log(yDiff, currentDate.getFullYear(), birthYear);\n let mDiff = currentDate.getMonth() + 1 - month - (currentDate.getDate() < day ? 1 : 0);\n\n if (mDiff < 0) {\n mDiff += 12;\n --yDiff;\n }\n if (yDiff < 0) {\n return -1;\n }\n\n return yDiff;\n }\n\n getBirthYear() {\n if (this.dataType === 'YYMMDD') {\n if (!this.back) {\n console.error('back is not defined');\n\n return -1;\n }\n const year = this.front.slice(0, 2);\n let centuryOffset;\n if (['1', '2', '5', '6'].includes(this.back)) {\n centuryOffset = 1900;\n } else if (['3', '4', '7', '8'].includes(this.back)) {\n centuryOffset = 2000;\n } else if (['9', '0'].includes(this.back)) {\n centuryOffset = 1800;\n } else {\n return -1;\n }\n\n const birthYear = centuryOffset + parseInt(year, 10);\n\n return birthYear;\n } else if (this.dataType === 'YYYYMMDD') {\n return parseInt(this.front.slice(0, 4));\n }\n\n\n }\n\n /**\n * 외국인 여부 판단\n * 주민등록번호 뒷자리의 첫번째 자리값 내려보내고 있어요.\n * 5, 6, 7, 8 -> 외국인\n */\n isForeigner() {\n if (!this.back) {\n console.error('back is not defined');\n\n return -1;\n }\n\n return ['5', '6', '7', '8'].includes(this.back.toString());\n }\n\n\n static isForeigner(value: string | number) {\n const str = String(value);\n const firstChar = str.charAt(0);\n\n return ['5', '6', '7', '8'].includes(firstChar);\n }\n\n\n /**\n * 외국인 여부 판단\n * 주민등록번호 전체로 판단\n * 5, 6, 7, 8 -> 외국인\n */\n static isForeignerFullNumber(regNo: string): boolean {\n if (!regNo) {\n console.error('regNo is not defined');\n\n return false;\n }\n\n // 숫자만 추출\n const cleaned = regNo.replace(/[^0-9]/g, '');\n\n // 최소 7자리 필요\n if (cleaned.length < 7) {\n console.error('cleaned.length < 7');\n\n return false;\n }\n\n const firstOfBack = cleaned[6]; // 뒤 7자리 중 첫 번째 숫자\n if (!firstOfBack) {\n console.error('firstOfBack is not defined');\n\n return false;\n }\n\n // 외국인 구분: 5,6,7,8\n return ['5', '6', '7', '8'].includes(firstOfBack);\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/utils/date-utils.ts","../../src/utils/age-utils.ts"],"names":[],"mappings":"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","file":"age-utils.js","sourcesContent":["import dayjs from 'dayjs';\nimport customParseFormat from 'dayjs/plugin/customParseFormat.js';\n\n/*****************************\n * 날짜 관련 유틸\n ******************************/\ndayjs.locale('ko');\ndayjs.extend(customParseFormat);\n\n/**\n *\n * @param year\n * @param month\n * @returns\n */\nexport function getLastDay(year: number, month: number) {\n switch (month) {\n case 2:\n return year % 4 === 0 ? 29 : 28;\n case 4:\n case 6:\n case 9:\n case 11:\n return 30;\n default:\n return 31;\n }\n}\n\n/**\n * 한달뒤 날짜를 포맷형태로 리턴\n * @param 20200101 or 2020.01.01\n * @param 'YYYY.MM.DD'\n * @returns\n */\nexport const getOneMonthLater = (value?: string, format?: string): string => {\n const str = value ? value.split('.').join('') : '';\n const date = value\n ? new Date(Number(str.substring(0, 4)), Number(str.substring(4, 6)) - 1, Number(str.substring(6, 8)))\n : new Date();\n try {\n return dayjs(new Date(date.setMonth(date.getMonth() + 1))).format(format || 'YYYY.MM.DD');\n } catch (err) {\n console.warn(err);\n\n return '';\n }\n};\n\n/**\n * 날짜 차이를 구한다. 포맷에 맞지 않으면 Not a Number 리턴\n * @param date1 (yyyymmdd or yyyy.mm.dd or yyyy-mm-dd)\n * @param date2 (yyyymmdd or yyyy.mm.dd or yyyy-mm-dd)\n * @returns date1 - date2\n */\nexport const getDateDiff = (\n date1: string | number | dayjs.Dayjs | Date,\n date2: string | number | dayjs.Dayjs | Date\n): number => {\n const diff1 = dayjs(date1);\n const diff2 = dayjs(date2);\n\n /** diff1 - diff2: 현재: 0 */\n return diff1.diff(diff2, 'day');\n};\n\n/**\n * 입력되어진 생년월일 값이 당일 기준으로 미래시점인 경우 false를 반환합니다. (회원체계 기준 9, 0 일 경우 오류)\n * @param front 주민등록번호 앞 6자리\n * @param back 주민등록번호 뒤 첫자리\n * @returns boolean\n */\nexport const validateBirthdate = (front: string, back: string) => {\n const year = parseInt(front.slice(0, 2));\n const month = parseInt(front.slice(2, 4));\n const day = parseInt(front.slice(4, 6));\n let birthYear = 0;\n\n switch (back) {\n case '1':\n case '2':\n case '5':\n case '6':\n birthYear = 1900 + year;\n break;\n case '3':\n case '4':\n case '7':\n case '8':\n birthYear = 2000 + year;\n break;\n case '9':\n case '0':\n // birthYear = 1800 + year;\n return false;\n default:\n return false;\n }\n\n const birthdate = new Date(birthYear, month - 1, day);\n const currdate = new Date();\n\n return birthdate < currdate;\n};\n\n/**\n * 목표 날짜가 비교 날짜 이후 인지 확인하는 함수 (YYYYMMDD 형식)\n * @param targetDate\n * @param compareDate\n * @returns boolean\n */\nexport function isDateAfter(\n targetDate: string | number | dayjs.Dayjs | Date,\n compareDate: string | number | dayjs.Dayjs | Date\n) {\n const targetDateTime = new Date(convertDateFormat(targetDate, 'YYYY-MM-DD')).getTime();\n const compareDateTime = new Date(convertDateFormat(compareDate, 'YYYY-MM-DD')).getTime();\n\n return targetDateTime > compareDateTime;\n}\n\n/**\n * 날짜를 포맷형태로 리턴\n * @param 20200101 string\n * @param 'YYYY.MM.DD\n * @returns 포맷화된 날짜\n */\nexport const convertDateFormat = (value?: string | number | dayjs.Dayjs | Date, format?: string): string => {\n if (!value) {\n return '';\n }\n\n return dayjs(value).format(format || 'YYYY.MM.DD');\n};\n\n/**\n * 주어진 날짜가 오늘 날짜 이후인지 확인합니다.\n *\n * @param {string} dateString - 확인할 날짜 문자열입니다.\n * @param {dayjs.OptionType} [format] - 날짜 문자열의 형식입니다.\n * @returns {boolean} - 주어진 날짜가 오늘 이후라면 true를 반환합니다.\n */\nexport const isFutureDate = (dateString?: string | number | dayjs.Dayjs | Date, format?: dayjs.OptionType) => {\n if (!dateString) {\n return false;\n }\n\n const today = dayjs().startOf('day');\n const date = dayjs(dateString, format || 'YYYYMMDD', true);\n\n return date.isValid() && date.isAfter(today);\n};\n\n/**\n * 자주 사용하는 타입들 추가해두었습니다. 필요하신 형태 있으면 추가해주세요.\n */\nexport type DateFormat =\n | 'YYYY-MM-DD'\n | 'YYYY.MM.DD'\n | 'YYYY-MM'\n | 'YYYY-MM-DD HH:mm:ss'\n | 'YYYY.MM.DD HH:mm:ss'\n | 'YYYY-MM-DD HH:mm'\n | 'YYYYMMDD'\n | 'YYYY.M.D'\n | 'YYYY.M'\n | 'YYYY.MM.DD(dd) HH:mm:ss'\n | 'HH:mm:ss'\n | 'YYYY.M.D(dd)'\n | 'HH:mm';\n\ninterface Props {\n /** 날짜 문자열 */\n dateString: string | number | Date | dayjs.Dayjs;\n /** 현재 날짜 포맷 */\n fromFormat?: string;\n /** 컨버팅할 날짜 포맷 */\n toFormat: string;\n}\n\n/**\n * date string 을 입력받고 패턴에 맞게 포맷팅을 변경하는 유틸 함수\n * fromFormat 현재 날짜 포맷\n * toFormat 리턴 날짜 포맷\n */\nexport const convertDateString = ({ dateString, fromFormat, toFormat }: Props) => {\n return dayjs(dateString, fromFormat).format(toFormat);\n};\n\nexport const isDate = (value: unknown) => {\n return value instanceof Date && !isNaN(+value);\n};\n\n/**\n * 날짜 유효성 검사\n *\n * @param {string} dateString - 검사할 날짜 문자열.\n * @param {dayjs.OptionType} [format] - 날짜 문자열의 형식입니다.\n * @returns {boolean} - 유효한 날짜이면 true를 반환하고, 그렇지 않으면 false를 반환합니다.\n */\nexport const isValidDate = (dateString?: string | number | dayjs.Dayjs | Date, format?: dayjs.OptionType) => {\n if (!dateString) {\n return false;\n }\n\n const date = dayjs(dateString, format || 'YYYYMMDD', true);\n\n return date.isValid();\n};\n\nexport type PeriodType =\n | 'thisWeek'\n | 'lastWeek'\n | 'last7Days'\n | 'thisMonth'\n | 'lastMonth'\n | 'last365Days'\n | 'week'\n | 'month'\n | 'today';\n/**\n * @description\n * today 당일\n * week 7일: 오늘 기준 7일 전\n * month 30: 오늘 기준 30일 전\n * thisWeek 이번 주 (일요일 ~ 토요일)\n * lastWeek 지난 주 (일요일 ~ 토요일)\n * last7Days 최근 7일 (오늘 포함)\n * thisMonth 이번 달 (1일 ~ 말일)\n * lastMonth 지난 달 (1일 ~ 말일)\n * last365Days 최근 365일 (오늘 포함)\n * @param periodType\n * @returns\n */\nexport const getPeriodDate = (periodType: PeriodType | 'today') => {\n const lastMonth = dayjs().subtract(1, 'M');\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n\n const endDate = new Date(today);\n let startDate: Date;\n\n switch (periodType) {\n case 'today':\n // 당일\n startDate = new Date(today);\n\n return { startDate, endDate };\n\n case 'week':\n // 7일: 오늘 기준 7일 전\n startDate = new Date(today);\n startDate.setDate(startDate.getDate() - 6);\n\n return { startDate, endDate };\n case 'month':\n // 30일: 오늘 기준 30일 전\n startDate = new Date(today);\n startDate.setDate(startDate.getDate() - 29);\n\n return { startDate, endDate };\n\n case 'thisWeek':\n // 이번 주 (일요일 ~ 토요일)\n return { startDate: dayjs().day(0).toDate(), endDate: dayjs().day(6).toDate() };\n case 'lastWeek':\n // 지난 주 (일요일 ~ 토요일)\n return {\n startDate: dayjs().subtract(1, 'w').day(0).toDate(),\n endDate: dayjs().subtract(1, 'w').day(6).toDate()\n };\n case 'last7Days':\n // 최근 7일 (오늘 포함)\n return { startDate: dayjs().subtract(7, 'd').toDate(), endDate: dayjs().toDate() };\n case 'thisMonth':\n // 이번 달 (1일 ~ 말일)\n return {\n startDate: dayjs().date(1).toDate(),\n endDate: dayjs().date(dayjs().daysInMonth()).toDate()\n };\n case 'lastMonth':\n // 지난 달 (1일 ~ 말일)\n return {\n startDate: lastMonth.date(1).toDate(),\n endDate: lastMonth.date(lastMonth.daysInMonth()).toDate()\n };\n case 'last365Days':\n // 최근 365일 (오늘 포함)\n return { startDate: dayjs().subtract(365, 'd').toDate(), endDate: dayjs().toDate() };\n default:\n return null;\n }\n};\n","import { getLastDay } from './date-utils';\n\ninterface AgeOptions {\n type?: inputType;\n}\n\ninterface AgeProps {\n front: string;\n back?: number;\n options?: AgeOptions;\n}\n\ntype inputType = 'YYYYMMDD' | 'YYMMDD';\nexport class Age {\n /**\n * 주민번호 앞자리만 입력받는 케이스\n * residentNumber: \"880108\"\n *\n * 생년월일 YYYYMMDD 를 입력받는 케이스\n * residentNumber: \"19880108\"\n */\n front: string;\n\n /**\n * 주민번호 뒷자리 첫글자\n */\n back?: string;\n options?: AgeOptions;\n dataType: inputType | 'Unknown';\n\n constructor({ front, back, options }: AgeProps) {\n //정규표현식을 이용하여 숫자형 문자열로 필터링\n this.front = this.filter(front);\n this.back = this.filter(back);\n this.options = options;\n\n const checkDataType = this.findDataType();\n this.invalidType(checkDataType);\n this.dataType = options?.type || checkDataType;\n }\n\n invalidType(checkDataType: inputType | 'Unknown') {\n if (checkDataType === 'Unknown') {\n throw new Error('Invalid resident number');\n }\n }\n filter(val?: number | string) {\n if (!val) {\n return '';\n }\n\n return val.toString().replace(/[^0-9]/g, '');\n }\n\n /**\n * 주민번호의 타입을 찾는 메소드\n * 입력된 타입이 없는 경우, 데이터를 기반으로 유추한다.\n * @returns inputType\n */\n findDataType() {\n if (this.front.length === 8) {\n return 'YYYYMMDD';\n } else if (this.front.length === 6) {\n return 'YYMMDD';\n }\n\n return 'Unknown';\n }\n\n /**\n * 보험나이를 계산하여 리턴한다.\n * 기존 ageUtils를 참고하여 구현\n */\n getInsuranceAge() {\n let yBirth;\n let mBirth;\n let dBirth;\n\n if (this.dataType === 'YYYYMMDD') {\n yBirth = parseFloat(this.front.substring(0, 4));\n mBirth = parseFloat(this.front.substring(4, 6));\n dBirth = parseFloat(this.front.substring(6, 8));\n } else if (this.dataType === 'YYMMDD') {\n if (\n this.front.substring(0, 1) === '0' ||\n this.front.substring(0, 1) === '1' ||\n this.front.substring(0, 1) === '2'\n ) {\n yBirth = parseFloat(this.front.substring(0, 2)) + 2000; //생년월일\n } else {\n yBirth = parseFloat(this.front.substring(0, 2)) + 1900; //생년월일\n }\n mBirth = parseFloat(this.front.substring(2, 4));\n dBirth = parseFloat(this.front.substring(4, 6));\n } else {\n console.error('getInsuranceAge >> 나이 입력 포멧 오류');\n\n return -1;\n }\n\n const curDate = new Date(); // 오늘\n const yToday = curDate.getFullYear(); //getFullYear()는 ie, 파폭, 크롬에서 같은값 호출\n const mToday = curDate.getMonth() + 1;\n const dToday = curDate.getDate();\n\n let yDiff = yToday - yBirth;\n let mDiff = mToday - mBirth - (dToday < dBirth ? 1 : 0);\n\n if (mDiff < 0) {\n mDiff += 12;\n --yDiff;\n }\n if (yDiff < 0) {\n return -1;\n }\n\n if (mDiff === 5 && dToday < dBirth && dToday === getLastDay(yToday, mToday)) {\n ++mDiff;\n }\n\n return yDiff + (6 <= mDiff ? 1 : 0);\n }\n\n /**\n * 입력되어잔 생년월일 값과 주민등록번호 뒤 첫째자리 값을 통해 만나이를 반환합니다.\n * 에러: -1 반환\n * @param front 주민등록번호 앞 6자리\n * @param back 주민등록번호 뒤 첫자리\n * @returns number\n */\n getFullAge() {\n const month = parseInt(this.front.slice(2, 4));\n const day = parseInt(this.front.slice(4, 6));\n\n const birthYear = this.getBirthYear();\n if (!birthYear) {\n console.error('birthYear is not defined');\n\n return -1;\n }\n const currentDate = new Date();\n\n let yDiff = currentDate.getFullYear() - birthYear;\n console.log(yDiff, currentDate.getFullYear(), birthYear);\n let mDiff = currentDate.getMonth() + 1 - month - (currentDate.getDate() < day ? 1 : 0);\n\n if (mDiff < 0) {\n mDiff += 12;\n --yDiff;\n }\n if (yDiff < 0) {\n return -1;\n }\n\n return yDiff;\n }\n\n getBirthYear() {\n if (this.dataType === 'YYMMDD') {\n if (!this.back) {\n console.error('back is not defined');\n\n return -1;\n }\n const year = this.front.slice(0, 2);\n let centuryOffset;\n if (['1', '2', '5', '6'].includes(this.back)) {\n centuryOffset = 1900;\n } else if (['3', '4', '7', '8'].includes(this.back)) {\n centuryOffset = 2000;\n } else if (['9', '0'].includes(this.back)) {\n centuryOffset = 1800;\n } else {\n return -1;\n }\n\n const birthYear = centuryOffset + parseInt(year, 10);\n\n return birthYear;\n } else if (this.dataType === 'YYYYMMDD') {\n return parseInt(this.front.slice(0, 4));\n }\n\n\n }\n\n /**\n * 외국인 여부 판단\n * 주민등록번호 뒷자리의 첫번째 자리값 내려보내고 있어요.\n * 5, 6, 7, 8 -> 외국인\n */\n isForeigner() {\n if (!this.back) {\n console.error('back is not defined');\n\n return -1;\n }\n\n return ['5', '6', '7', '8'].includes(this.back.toString());\n }\n\n\n static isForeigner(value: string | number) {\n const str = String(value);\n const firstChar = str.charAt(0);\n\n return ['5', '6', '7', '8'].includes(firstChar);\n }\n\n\n /**\n * 외국인 여부 판단\n * 주민등록번호 전체로 판단\n * 5, 6, 7, 8 -> 외국인\n */\n static isForeignerFullNumber(regNo: string): boolean {\n if (!regNo) {\n console.error('regNo is not defined');\n\n return false;\n }\n\n // 숫자만 추출\n const cleaned = regNo.replace(/[^0-9]/g, '');\n\n // 최소 7자리 필요\n if (cleaned.length < 7) {\n console.error('cleaned.length < 7');\n\n return false;\n }\n\n const firstOfBack = cleaned[6]; // 뒤 7자리 중 첫 번째 숫자\n if (!firstOfBack) {\n console.error('firstOfBack is not defined');\n\n return false;\n }\n\n // 외국인 구분: 5,6,7,8\n return ['5', '6', '7', '8'].includes(firstOfBack);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/date-utils.ts"],"names":["dayjs","customParseFormat"],"mappings":"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","file":"date-utils.cjs","sourcesContent":["\nimport dayjs from 'dayjs';\nimport customParseFormat from 'dayjs/plugin/customParseFormat.js';\n\n/*****************************\n * 날짜 관련 유틸\n ******************************/\ndayjs.locale('ko');\ndayjs.extend(customParseFormat);\n\n/**\n *\n * @param year\n * @param month\n * @returns\n */\nexport function getLastDay(year: number, month: number) {\n switch (month) {\n case 2:\n return year % 4 === 0 ? 29 : 28;\n case 4:\n case 6:\n case 9:\n case 11:\n return 30;\n default:\n return 31;\n }\n}\n\n/**\n * 한달뒤 날짜를 포맷형태로 리턴\n * @param 20200101 or 2020.01.01\n * @param 'YYYY.MM.DD'\n * @returns\n */\nexport const getOneMonthLater = (value?: string, format?: string): string => {\n const str = value ? value.split('.').join('') : '';\n const date = value\n ? new Date(Number(str.substring(0, 4)), Number(str.substring(4, 6)) - 1, Number(str.substring(6, 8)))\n : new Date();\n try {\n return dayjs(new Date(date.setMonth(date.getMonth() + 1))).format(format || 'YYYY.MM.DD');\n } catch (err) {\n console.warn(err);\n\n return '';\n }\n};\n\n/**\n * 날짜 차이를 구한다. 포맷에 맞지 않으면 Not a Number 리턴\n * @param date1 (yyyymmdd or yyyy.mm.dd or yyyy-mm-dd)\n * @param date2 (yyyymmdd or yyyy.mm.dd or yyyy-mm-dd)\n * @returns date1 - date2\n */\nexport const getDateDiff = (date1: string | number | dayjs.Dayjs | Date, date2: string | number | dayjs.Dayjs | Date): number => {\n const diff1 = dayjs(date1);\n const diff2 = dayjs(date2);\n\n /** diff1 - diff2: 현재: 0 */\n return diff1.diff(diff2, 'day');\n};\n\n/**\n * 입력되어진 생년월일 값이 당일 기준으로 미래시점인 경우 false를 반환합니다. (회원체계 기준 9, 0 일 경우 오류)\n * @param front 주민등록번호 앞 6자리\n * @param back 주민등록번호 뒤 첫자리\n * @returns boolean\n */\nexport const validateBirthdate = (front: string, back: string) => {\n const year = parseInt(front.slice(0, 2));\n const month = parseInt(front.slice(2, 4));\n const day = parseInt(front.slice(4, 6));\n let birthYear = 0;\n\n switch (back) {\n case '1':\n case '2':\n case '5':\n case '6':\n birthYear = 1900 + year;\n break;\n case '3':\n case '4':\n case '7':\n case '8':\n birthYear = 2000 + year;\n break;\n case '9':\n case '0':\n // birthYear = 1800 + year;\n return false;\n default:\n return false;\n }\n\n const birthdate = new Date(birthYear, month - 1, day);\n const currdate = new Date();\n\n return birthdate < currdate;\n};\n\n/**\n * 목표 날짜가 비교 날짜 이후 인지 확인하는 함수 (YYYYMMDD 형식)\n * @param targetDate\n * @param compareDate\n * @returns boolean\n */\nexport function isDateAfter(targetDate: string | number | dayjs.Dayjs | Date, compareDate: string | number | dayjs.Dayjs | Date) {\n const targetDateTime = new Date(convertDateFormat(targetDate, 'YYYY-MM-DD')).getTime();\n const compareDateTime = new Date(convertDateFormat(compareDate, 'YYYY-MM-DD')).getTime();\n\n return targetDateTime > compareDateTime;\n}\n\n/**\n * 날짜를 포맷형태로 리턴\n * @param 20200101 string\n * @param 'YYYY.MM.DD\n * @returns 포맷화된 날짜\n */\nexport const convertDateFormat = (value?: string | number | dayjs.Dayjs | Date, format?: string): string => {\n if (!value) {\n return '';\n }\n\n return dayjs(value).format(format || 'YYYY.MM.DD');\n};\n\n/**\n * 주어진 날짜가 오늘 날짜 이후인지 확인합니다.\n *\n * @param {string} dateString - 확인할 날짜 문자열입니다.\n * @param {dayjs.OptionType} [format] - 날짜 문자열의 형식입니다.\n * @returns {boolean} - 주어진 날짜가 오늘 이후라면 true를 반환합니다.\n */\nexport const isFutureDate = (dateString?: string | number | dayjs.Dayjs | Date, format?: dayjs.OptionType) => {\n if (!dateString) {\n return false;\n }\n\n const today = dayjs().startOf('day');\n const date = dayjs(dateString, format || 'YYYYMMDD', true);\n\n return date.isValid() && date.isAfter(today);\n};\n\n\n\n/**\n * 자주 사용하는 타입들 추가해두었습니다. 필요하신 형태 있으면 추가해주세요.\n */\nexport type DateFormat =\n | 'YYYY-MM-DD'\n | 'YYYY.MM.DD'\n | 'YYYY-MM'\n | 'YYYY-MM-DD HH:mm:ss'\n | 'YYYY.MM.DD HH:mm:ss'\n | 'YYYY-MM-DD HH:mm'\n | 'YYYYMMDD'\n | 'YYYY.M.D'\n | 'YYYY.M'\n | 'YYYY.MM.DD(dd) HH:mm:ss'\n | 'HH:mm:ss'\n | 'YYYY.M.D(dd)'\n | 'HH:mm';\n\ninterface Props {\n /** 날짜 문자열 */\n dateString: string | number | Date | dayjs.Dayjs;\n /** 현재 날짜 포맷 */\n fromFormat?: string;\n /** 컨버팅할 날짜 포맷 */\n toFormat: string;\n}\n\n/**\n * date string 을 입력받고 패턴에 맞게 포맷팅을 변경하는 유틸 함수\n * fromFormat 현재 날짜 포맷\n * toFormat 리턴 날짜 포맷\n */\nexport const convertDateString = ({ dateString, fromFormat, toFormat }: Props) => {\n return dayjs(dateString, fromFormat).format(toFormat);\n};\n\nexport const isDate = (value: unknown) => {\n return value instanceof Date && !isNaN(+value);\n};\n\n\n/**\n * 날짜 유효성 검사\n *\n * @param {string} dateString - 검사할 날짜 문자열.\n * @param {dayjs.OptionType} [format] - 날짜 문자열의 형식입니다.\n * @returns {boolean} - 유효한 날짜이면 true를 반환하고, 그렇지 않으면 false를 반환합니다.\n */\nexport const isValidDate = (dateString?: string | number | dayjs.Dayjs | Date, format?: dayjs.OptionType) => {\n if (!dateString) {\n return false;\n }\n\n const date = dayjs(dateString, format || 'YYYYMMDD', true);\n\n return date.isValid();\n};\n\n\nexport type PeriodType = 'thisWeek' | 'lastWeek' | 'last7Days' | 'thisMonth' | 'lastMonth' | 'last365Days' | 'week' | 'month' | 'today';\n/**\n * @description\n * today 당일\n * week 7일: 오늘 기준 7일 전\n * month 30: 오늘 기준 30일 전\n * thisWeek 이번 주 (일요일 ~ 토요일)\n * lastWeek 지난 주 (일요일 ~ 토요일)\n * last7Days 최근 7일 (오늘 포함)\n * thisMonth 이번 달 (1일 ~ 말일)\n * lastMonth 지난 달 (1일 ~ 말일)\n * last365Days 최근 365일 (오늘 포함)\n * @param periodType \n * @returns \n */\nexport const getPeriodDate = (periodType: PeriodType | 'today') => {\n\n const lastMonth = dayjs().subtract(1, 'M');\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n\n const endDate = new Date(today);\n let startDate: Date;\n\n switch (periodType) {\n case 'today':\n // 당일\n startDate = new Date(today);\n\n return { startDate, endDate };\n\n case 'week':\n // 7일: 오늘 기준 7일 전\n startDate = new Date(today);\n startDate.setDate(startDate.getDate() - 6);\n\n return { startDate, endDate };\n case 'month':\n // 30일: 오늘 기준 30일 전\n startDate = new Date(today);\n startDate.setDate(startDate.getDate() - 29);\n\n return { startDate, endDate };\n\n case 'thisWeek':\n // 이번 주 (일요일 ~ 토요일)\n return ({ startDate: dayjs().day(0).toDate(), endDate: dayjs().day(6).toDate() });\n case 'lastWeek':\n // 지난 주 (일요일 ~ 토요일)\n return ({\n startDate: dayjs().subtract(1, 'w').day(0).toDate(),\n endDate: dayjs().subtract(1, 'w').day(6).toDate()\n });\n case 'last7Days':\n // 최근 7일 (오늘 포함)\n return ({ startDate: dayjs().subtract(7, 'd').toDate(), endDate: dayjs().toDate() });\n case 'thisMonth':\n // 이번 달 (1일 ~ 말일)\n return ({\n startDate: dayjs().date(1).toDate(),\n endDate: dayjs().date(dayjs().daysInMonth()).toDate()\n });\n case 'lastMonth':\n // 지난 달 (1일 ~ 말일)\n return ({\n startDate: lastMonth.date(1).toDate(),\n endDate: lastMonth.date(lastMonth.daysInMonth()).toDate()\n });\n case 'last365Days':\n // 최근 365일 (오늘 포함)\n return ({ startDate: dayjs().subtract(365, 'd').toDate(), endDate: dayjs().toDate() });\n default:\n return null;\n }\n\n\n};\n\n\n"]}
1
+ {"version":3,"sources":["../../src/utils/date-utils.ts"],"names":["dayjs","customParseFormat"],"mappings":"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","file":"date-utils.cjs","sourcesContent":["import dayjs from 'dayjs';\nimport customParseFormat from 'dayjs/plugin/customParseFormat.js';\n\n/*****************************\n * 날짜 관련 유틸\n ******************************/\ndayjs.locale('ko');\ndayjs.extend(customParseFormat);\n\n/**\n *\n * @param year\n * @param month\n * @returns\n */\nexport function getLastDay(year: number, month: number) {\n switch (month) {\n case 2:\n return year % 4 === 0 ? 29 : 28;\n case 4:\n case 6:\n case 9:\n case 11:\n return 30;\n default:\n return 31;\n }\n}\n\n/**\n * 한달뒤 날짜를 포맷형태로 리턴\n * @param 20200101 or 2020.01.01\n * @param 'YYYY.MM.DD'\n * @returns\n */\nexport const getOneMonthLater = (value?: string, format?: string): string => {\n const str = value ? value.split('.').join('') : '';\n const date = value\n ? new Date(Number(str.substring(0, 4)), Number(str.substring(4, 6)) - 1, Number(str.substring(6, 8)))\n : new Date();\n try {\n return dayjs(new Date(date.setMonth(date.getMonth() + 1))).format(format || 'YYYY.MM.DD');\n } catch (err) {\n console.warn(err);\n\n return '';\n }\n};\n\n/**\n * 날짜 차이를 구한다. 포맷에 맞지 않으면 Not a Number 리턴\n * @param date1 (yyyymmdd or yyyy.mm.dd or yyyy-mm-dd)\n * @param date2 (yyyymmdd or yyyy.mm.dd or yyyy-mm-dd)\n * @returns date1 - date2\n */\nexport const getDateDiff = (\n date1: string | number | dayjs.Dayjs | Date,\n date2: string | number | dayjs.Dayjs | Date\n): number => {\n const diff1 = dayjs(date1);\n const diff2 = dayjs(date2);\n\n /** diff1 - diff2: 현재: 0 */\n return diff1.diff(diff2, 'day');\n};\n\n/**\n * 입력되어진 생년월일 값이 당일 기준으로 미래시점인 경우 false를 반환합니다. (회원체계 기준 9, 0 일 경우 오류)\n * @param front 주민등록번호 앞 6자리\n * @param back 주민등록번호 뒤 첫자리\n * @returns boolean\n */\nexport const validateBirthdate = (front: string, back: string) => {\n const year = parseInt(front.slice(0, 2));\n const month = parseInt(front.slice(2, 4));\n const day = parseInt(front.slice(4, 6));\n let birthYear = 0;\n\n switch (back) {\n case '1':\n case '2':\n case '5':\n case '6':\n birthYear = 1900 + year;\n break;\n case '3':\n case '4':\n case '7':\n case '8':\n birthYear = 2000 + year;\n break;\n case '9':\n case '0':\n // birthYear = 1800 + year;\n return false;\n default:\n return false;\n }\n\n const birthdate = new Date(birthYear, month - 1, day);\n const currdate = new Date();\n\n return birthdate < currdate;\n};\n\n/**\n * 목표 날짜가 비교 날짜 이후 인지 확인하는 함수 (YYYYMMDD 형식)\n * @param targetDate\n * @param compareDate\n * @returns boolean\n */\nexport function isDateAfter(\n targetDate: string | number | dayjs.Dayjs | Date,\n compareDate: string | number | dayjs.Dayjs | Date\n) {\n const targetDateTime = new Date(convertDateFormat(targetDate, 'YYYY-MM-DD')).getTime();\n const compareDateTime = new Date(convertDateFormat(compareDate, 'YYYY-MM-DD')).getTime();\n\n return targetDateTime > compareDateTime;\n}\n\n/**\n * 날짜를 포맷형태로 리턴\n * @param 20200101 string\n * @param 'YYYY.MM.DD\n * @returns 포맷화된 날짜\n */\nexport const convertDateFormat = (value?: string | number | dayjs.Dayjs | Date, format?: string): string => {\n if (!value) {\n return '';\n }\n\n return dayjs(value).format(format || 'YYYY.MM.DD');\n};\n\n/**\n * 주어진 날짜가 오늘 날짜 이후인지 확인합니다.\n *\n * @param {string} dateString - 확인할 날짜 문자열입니다.\n * @param {dayjs.OptionType} [format] - 날짜 문자열의 형식입니다.\n * @returns {boolean} - 주어진 날짜가 오늘 이후라면 true를 반환합니다.\n */\nexport const isFutureDate = (dateString?: string | number | dayjs.Dayjs | Date, format?: dayjs.OptionType) => {\n if (!dateString) {\n return false;\n }\n\n const today = dayjs().startOf('day');\n const date = dayjs(dateString, format || 'YYYYMMDD', true);\n\n return date.isValid() && date.isAfter(today);\n};\n\n/**\n * 자주 사용하는 타입들 추가해두었습니다. 필요하신 형태 있으면 추가해주세요.\n */\nexport type DateFormat =\n | 'YYYY-MM-DD'\n | 'YYYY.MM.DD'\n | 'YYYY-MM'\n | 'YYYY-MM-DD HH:mm:ss'\n | 'YYYY.MM.DD HH:mm:ss'\n | 'YYYY-MM-DD HH:mm'\n | 'YYYYMMDD'\n | 'YYYY.M.D'\n | 'YYYY.M'\n | 'YYYY.MM.DD(dd) HH:mm:ss'\n | 'HH:mm:ss'\n | 'YYYY.M.D(dd)'\n | 'HH:mm';\n\ninterface Props {\n /** 날짜 문자열 */\n dateString: string | number | Date | dayjs.Dayjs;\n /** 현재 날짜 포맷 */\n fromFormat?: string;\n /** 컨버팅할 날짜 포맷 */\n toFormat: string;\n}\n\n/**\n * date string 을 입력받고 패턴에 맞게 포맷팅을 변경하는 유틸 함수\n * fromFormat 현재 날짜 포맷\n * toFormat 리턴 날짜 포맷\n */\nexport const convertDateString = ({ dateString, fromFormat, toFormat }: Props) => {\n return dayjs(dateString, fromFormat).format(toFormat);\n};\n\nexport const isDate = (value: unknown) => {\n return value instanceof Date && !isNaN(+value);\n};\n\n/**\n * 날짜 유효성 검사\n *\n * @param {string} dateString - 검사할 날짜 문자열.\n * @param {dayjs.OptionType} [format] - 날짜 문자열의 형식입니다.\n * @returns {boolean} - 유효한 날짜이면 true를 반환하고, 그렇지 않으면 false를 반환합니다.\n */\nexport const isValidDate = (dateString?: string | number | dayjs.Dayjs | Date, format?: dayjs.OptionType) => {\n if (!dateString) {\n return false;\n }\n\n const date = dayjs(dateString, format || 'YYYYMMDD', true);\n\n return date.isValid();\n};\n\nexport type PeriodType =\n | 'thisWeek'\n | 'lastWeek'\n | 'last7Days'\n | 'thisMonth'\n | 'lastMonth'\n | 'last365Days'\n | 'week'\n | 'month'\n | 'today';\n/**\n * @description\n * today 당일\n * week 7일: 오늘 기준 7일 전\n * month 30: 오늘 기준 30일 전\n * thisWeek 이번 주 (일요일 ~ 토요일)\n * lastWeek 지난 주 (일요일 ~ 토요일)\n * last7Days 최근 7일 (오늘 포함)\n * thisMonth 이번 달 (1일 ~ 말일)\n * lastMonth 지난 달 (1일 ~ 말일)\n * last365Days 최근 365일 (오늘 포함)\n * @param periodType\n * @returns\n */\nexport const getPeriodDate = (periodType: PeriodType | 'today') => {\n const lastMonth = dayjs().subtract(1, 'M');\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n\n const endDate = new Date(today);\n let startDate: Date;\n\n switch (periodType) {\n case 'today':\n // 당일\n startDate = new Date(today);\n\n return { startDate, endDate };\n\n case 'week':\n // 7일: 오늘 기준 7일 전\n startDate = new Date(today);\n startDate.setDate(startDate.getDate() - 6);\n\n return { startDate, endDate };\n case 'month':\n // 30일: 오늘 기준 30일 전\n startDate = new Date(today);\n startDate.setDate(startDate.getDate() - 29);\n\n return { startDate, endDate };\n\n case 'thisWeek':\n // 이번 주 (일요일 ~ 토요일)\n return { startDate: dayjs().day(0).toDate(), endDate: dayjs().day(6).toDate() };\n case 'lastWeek':\n // 지난 주 (일요일 ~ 토요일)\n return {\n startDate: dayjs().subtract(1, 'w').day(0).toDate(),\n endDate: dayjs().subtract(1, 'w').day(6).toDate()\n };\n case 'last7Days':\n // 최근 7일 (오늘 포함)\n return { startDate: dayjs().subtract(7, 'd').toDate(), endDate: dayjs().toDate() };\n case 'thisMonth':\n // 이번 달 (1일 ~ 말일)\n return {\n startDate: dayjs().date(1).toDate(),\n endDate: dayjs().date(dayjs().daysInMonth()).toDate()\n };\n case 'lastMonth':\n // 지난 달 (1일 ~ 말일)\n return {\n startDate: lastMonth.date(1).toDate(),\n endDate: lastMonth.date(lastMonth.daysInMonth()).toDate()\n };\n case 'last365Days':\n // 최근 365일 (오늘 포함)\n return { startDate: dayjs().subtract(365, 'd').toDate(), endDate: dayjs().toDate() };\n default:\n return null;\n }\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/date-utils.ts"],"names":[],"mappings":"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","file":"date-utils.js","sourcesContent":["\nimport dayjs from 'dayjs';\nimport customParseFormat from 'dayjs/plugin/customParseFormat.js';\n\n/*****************************\n * 날짜 관련 유틸\n ******************************/\ndayjs.locale('ko');\ndayjs.extend(customParseFormat);\n\n/**\n *\n * @param year\n * @param month\n * @returns\n */\nexport function getLastDay(year: number, month: number) {\n switch (month) {\n case 2:\n return year % 4 === 0 ? 29 : 28;\n case 4:\n case 6:\n case 9:\n case 11:\n return 30;\n default:\n return 31;\n }\n}\n\n/**\n * 한달뒤 날짜를 포맷형태로 리턴\n * @param 20200101 or 2020.01.01\n * @param 'YYYY.MM.DD'\n * @returns\n */\nexport const getOneMonthLater = (value?: string, format?: string): string => {\n const str = value ? value.split('.').join('') : '';\n const date = value\n ? new Date(Number(str.substring(0, 4)), Number(str.substring(4, 6)) - 1, Number(str.substring(6, 8)))\n : new Date();\n try {\n return dayjs(new Date(date.setMonth(date.getMonth() + 1))).format(format || 'YYYY.MM.DD');\n } catch (err) {\n console.warn(err);\n\n return '';\n }\n};\n\n/**\n * 날짜 차이를 구한다. 포맷에 맞지 않으면 Not a Number 리턴\n * @param date1 (yyyymmdd or yyyy.mm.dd or yyyy-mm-dd)\n * @param date2 (yyyymmdd or yyyy.mm.dd or yyyy-mm-dd)\n * @returns date1 - date2\n */\nexport const getDateDiff = (date1: string | number | dayjs.Dayjs | Date, date2: string | number | dayjs.Dayjs | Date): number => {\n const diff1 = dayjs(date1);\n const diff2 = dayjs(date2);\n\n /** diff1 - diff2: 현재: 0 */\n return diff1.diff(diff2, 'day');\n};\n\n/**\n * 입력되어진 생년월일 값이 당일 기준으로 미래시점인 경우 false를 반환합니다. (회원체계 기준 9, 0 일 경우 오류)\n * @param front 주민등록번호 앞 6자리\n * @param back 주민등록번호 뒤 첫자리\n * @returns boolean\n */\nexport const validateBirthdate = (front: string, back: string) => {\n const year = parseInt(front.slice(0, 2));\n const month = parseInt(front.slice(2, 4));\n const day = parseInt(front.slice(4, 6));\n let birthYear = 0;\n\n switch (back) {\n case '1':\n case '2':\n case '5':\n case '6':\n birthYear = 1900 + year;\n break;\n case '3':\n case '4':\n case '7':\n case '8':\n birthYear = 2000 + year;\n break;\n case '9':\n case '0':\n // birthYear = 1800 + year;\n return false;\n default:\n return false;\n }\n\n const birthdate = new Date(birthYear, month - 1, day);\n const currdate = new Date();\n\n return birthdate < currdate;\n};\n\n/**\n * 목표 날짜가 비교 날짜 이후 인지 확인하는 함수 (YYYYMMDD 형식)\n * @param targetDate\n * @param compareDate\n * @returns boolean\n */\nexport function isDateAfter(targetDate: string | number | dayjs.Dayjs | Date, compareDate: string | number | dayjs.Dayjs | Date) {\n const targetDateTime = new Date(convertDateFormat(targetDate, 'YYYY-MM-DD')).getTime();\n const compareDateTime = new Date(convertDateFormat(compareDate, 'YYYY-MM-DD')).getTime();\n\n return targetDateTime > compareDateTime;\n}\n\n/**\n * 날짜를 포맷형태로 리턴\n * @param 20200101 string\n * @param 'YYYY.MM.DD\n * @returns 포맷화된 날짜\n */\nexport const convertDateFormat = (value?: string | number | dayjs.Dayjs | Date, format?: string): string => {\n if (!value) {\n return '';\n }\n\n return dayjs(value).format(format || 'YYYY.MM.DD');\n};\n\n/**\n * 주어진 날짜가 오늘 날짜 이후인지 확인합니다.\n *\n * @param {string} dateString - 확인할 날짜 문자열입니다.\n * @param {dayjs.OptionType} [format] - 날짜 문자열의 형식입니다.\n * @returns {boolean} - 주어진 날짜가 오늘 이후라면 true를 반환합니다.\n */\nexport const isFutureDate = (dateString?: string | number | dayjs.Dayjs | Date, format?: dayjs.OptionType) => {\n if (!dateString) {\n return false;\n }\n\n const today = dayjs().startOf('day');\n const date = dayjs(dateString, format || 'YYYYMMDD', true);\n\n return date.isValid() && date.isAfter(today);\n};\n\n\n\n/**\n * 자주 사용하는 타입들 추가해두었습니다. 필요하신 형태 있으면 추가해주세요.\n */\nexport type DateFormat =\n | 'YYYY-MM-DD'\n | 'YYYY.MM.DD'\n | 'YYYY-MM'\n | 'YYYY-MM-DD HH:mm:ss'\n | 'YYYY.MM.DD HH:mm:ss'\n | 'YYYY-MM-DD HH:mm'\n | 'YYYYMMDD'\n | 'YYYY.M.D'\n | 'YYYY.M'\n | 'YYYY.MM.DD(dd) HH:mm:ss'\n | 'HH:mm:ss'\n | 'YYYY.M.D(dd)'\n | 'HH:mm';\n\ninterface Props {\n /** 날짜 문자열 */\n dateString: string | number | Date | dayjs.Dayjs;\n /** 현재 날짜 포맷 */\n fromFormat?: string;\n /** 컨버팅할 날짜 포맷 */\n toFormat: string;\n}\n\n/**\n * date string 을 입력받고 패턴에 맞게 포맷팅을 변경하는 유틸 함수\n * fromFormat 현재 날짜 포맷\n * toFormat 리턴 날짜 포맷\n */\nexport const convertDateString = ({ dateString, fromFormat, toFormat }: Props) => {\n return dayjs(dateString, fromFormat).format(toFormat);\n};\n\nexport const isDate = (value: unknown) => {\n return value instanceof Date && !isNaN(+value);\n};\n\n\n/**\n * 날짜 유효성 검사\n *\n * @param {string} dateString - 검사할 날짜 문자열.\n * @param {dayjs.OptionType} [format] - 날짜 문자열의 형식입니다.\n * @returns {boolean} - 유효한 날짜이면 true를 반환하고, 그렇지 않으면 false를 반환합니다.\n */\nexport const isValidDate = (dateString?: string | number | dayjs.Dayjs | Date, format?: dayjs.OptionType) => {\n if (!dateString) {\n return false;\n }\n\n const date = dayjs(dateString, format || 'YYYYMMDD', true);\n\n return date.isValid();\n};\n\n\nexport type PeriodType = 'thisWeek' | 'lastWeek' | 'last7Days' | 'thisMonth' | 'lastMonth' | 'last365Days' | 'week' | 'month' | 'today';\n/**\n * @description\n * today 당일\n * week 7일: 오늘 기준 7일 전\n * month 30: 오늘 기준 30일 전\n * thisWeek 이번 주 (일요일 ~ 토요일)\n * lastWeek 지난 주 (일요일 ~ 토요일)\n * last7Days 최근 7일 (오늘 포함)\n * thisMonth 이번 달 (1일 ~ 말일)\n * lastMonth 지난 달 (1일 ~ 말일)\n * last365Days 최근 365일 (오늘 포함)\n * @param periodType \n * @returns \n */\nexport const getPeriodDate = (periodType: PeriodType | 'today') => {\n\n const lastMonth = dayjs().subtract(1, 'M');\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n\n const endDate = new Date(today);\n let startDate: Date;\n\n switch (periodType) {\n case 'today':\n // 당일\n startDate = new Date(today);\n\n return { startDate, endDate };\n\n case 'week':\n // 7일: 오늘 기준 7일 전\n startDate = new Date(today);\n startDate.setDate(startDate.getDate() - 6);\n\n return { startDate, endDate };\n case 'month':\n // 30일: 오늘 기준 30일 전\n startDate = new Date(today);\n startDate.setDate(startDate.getDate() - 29);\n\n return { startDate, endDate };\n\n case 'thisWeek':\n // 이번 주 (일요일 ~ 토요일)\n return ({ startDate: dayjs().day(0).toDate(), endDate: dayjs().day(6).toDate() });\n case 'lastWeek':\n // 지난 주 (일요일 ~ 토요일)\n return ({\n startDate: dayjs().subtract(1, 'w').day(0).toDate(),\n endDate: dayjs().subtract(1, 'w').day(6).toDate()\n });\n case 'last7Days':\n // 최근 7일 (오늘 포함)\n return ({ startDate: dayjs().subtract(7, 'd').toDate(), endDate: dayjs().toDate() });\n case 'thisMonth':\n // 이번 달 (1일 ~ 말일)\n return ({\n startDate: dayjs().date(1).toDate(),\n endDate: dayjs().date(dayjs().daysInMonth()).toDate()\n });\n case 'lastMonth':\n // 지난 달 (1일 ~ 말일)\n return ({\n startDate: lastMonth.date(1).toDate(),\n endDate: lastMonth.date(lastMonth.daysInMonth()).toDate()\n });\n case 'last365Days':\n // 최근 365일 (오늘 포함)\n return ({ startDate: dayjs().subtract(365, 'd').toDate(), endDate: dayjs().toDate() });\n default:\n return null;\n }\n\n\n};\n\n\n"]}
1
+ {"version":3,"sources":["../../src/utils/date-utils.ts"],"names":[],"mappings":"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","file":"date-utils.js","sourcesContent":["import dayjs from 'dayjs';\nimport customParseFormat from 'dayjs/plugin/customParseFormat.js';\n\n/*****************************\n * 날짜 관련 유틸\n ******************************/\ndayjs.locale('ko');\ndayjs.extend(customParseFormat);\n\n/**\n *\n * @param year\n * @param month\n * @returns\n */\nexport function getLastDay(year: number, month: number) {\n switch (month) {\n case 2:\n return year % 4 === 0 ? 29 : 28;\n case 4:\n case 6:\n case 9:\n case 11:\n return 30;\n default:\n return 31;\n }\n}\n\n/**\n * 한달뒤 날짜를 포맷형태로 리턴\n * @param 20200101 or 2020.01.01\n * @param 'YYYY.MM.DD'\n * @returns\n */\nexport const getOneMonthLater = (value?: string, format?: string): string => {\n const str = value ? value.split('.').join('') : '';\n const date = value\n ? new Date(Number(str.substring(0, 4)), Number(str.substring(4, 6)) - 1, Number(str.substring(6, 8)))\n : new Date();\n try {\n return dayjs(new Date(date.setMonth(date.getMonth() + 1))).format(format || 'YYYY.MM.DD');\n } catch (err) {\n console.warn(err);\n\n return '';\n }\n};\n\n/**\n * 날짜 차이를 구한다. 포맷에 맞지 않으면 Not a Number 리턴\n * @param date1 (yyyymmdd or yyyy.mm.dd or yyyy-mm-dd)\n * @param date2 (yyyymmdd or yyyy.mm.dd or yyyy-mm-dd)\n * @returns date1 - date2\n */\nexport const getDateDiff = (\n date1: string | number | dayjs.Dayjs | Date,\n date2: string | number | dayjs.Dayjs | Date\n): number => {\n const diff1 = dayjs(date1);\n const diff2 = dayjs(date2);\n\n /** diff1 - diff2: 현재: 0 */\n return diff1.diff(diff2, 'day');\n};\n\n/**\n * 입력되어진 생년월일 값이 당일 기준으로 미래시점인 경우 false를 반환합니다. (회원체계 기준 9, 0 일 경우 오류)\n * @param front 주민등록번호 앞 6자리\n * @param back 주민등록번호 뒤 첫자리\n * @returns boolean\n */\nexport const validateBirthdate = (front: string, back: string) => {\n const year = parseInt(front.slice(0, 2));\n const month = parseInt(front.slice(2, 4));\n const day = parseInt(front.slice(4, 6));\n let birthYear = 0;\n\n switch (back) {\n case '1':\n case '2':\n case '5':\n case '6':\n birthYear = 1900 + year;\n break;\n case '3':\n case '4':\n case '7':\n case '8':\n birthYear = 2000 + year;\n break;\n case '9':\n case '0':\n // birthYear = 1800 + year;\n return false;\n default:\n return false;\n }\n\n const birthdate = new Date(birthYear, month - 1, day);\n const currdate = new Date();\n\n return birthdate < currdate;\n};\n\n/**\n * 목표 날짜가 비교 날짜 이후 인지 확인하는 함수 (YYYYMMDD 형식)\n * @param targetDate\n * @param compareDate\n * @returns boolean\n */\nexport function isDateAfter(\n targetDate: string | number | dayjs.Dayjs | Date,\n compareDate: string | number | dayjs.Dayjs | Date\n) {\n const targetDateTime = new Date(convertDateFormat(targetDate, 'YYYY-MM-DD')).getTime();\n const compareDateTime = new Date(convertDateFormat(compareDate, 'YYYY-MM-DD')).getTime();\n\n return targetDateTime > compareDateTime;\n}\n\n/**\n * 날짜를 포맷형태로 리턴\n * @param 20200101 string\n * @param 'YYYY.MM.DD\n * @returns 포맷화된 날짜\n */\nexport const convertDateFormat = (value?: string | number | dayjs.Dayjs | Date, format?: string): string => {\n if (!value) {\n return '';\n }\n\n return dayjs(value).format(format || 'YYYY.MM.DD');\n};\n\n/**\n * 주어진 날짜가 오늘 날짜 이후인지 확인합니다.\n *\n * @param {string} dateString - 확인할 날짜 문자열입니다.\n * @param {dayjs.OptionType} [format] - 날짜 문자열의 형식입니다.\n * @returns {boolean} - 주어진 날짜가 오늘 이후라면 true를 반환합니다.\n */\nexport const isFutureDate = (dateString?: string | number | dayjs.Dayjs | Date, format?: dayjs.OptionType) => {\n if (!dateString) {\n return false;\n }\n\n const today = dayjs().startOf('day');\n const date = dayjs(dateString, format || 'YYYYMMDD', true);\n\n return date.isValid() && date.isAfter(today);\n};\n\n/**\n * 자주 사용하는 타입들 추가해두었습니다. 필요하신 형태 있으면 추가해주세요.\n */\nexport type DateFormat =\n | 'YYYY-MM-DD'\n | 'YYYY.MM.DD'\n | 'YYYY-MM'\n | 'YYYY-MM-DD HH:mm:ss'\n | 'YYYY.MM.DD HH:mm:ss'\n | 'YYYY-MM-DD HH:mm'\n | 'YYYYMMDD'\n | 'YYYY.M.D'\n | 'YYYY.M'\n | 'YYYY.MM.DD(dd) HH:mm:ss'\n | 'HH:mm:ss'\n | 'YYYY.M.D(dd)'\n | 'HH:mm';\n\ninterface Props {\n /** 날짜 문자열 */\n dateString: string | number | Date | dayjs.Dayjs;\n /** 현재 날짜 포맷 */\n fromFormat?: string;\n /** 컨버팅할 날짜 포맷 */\n toFormat: string;\n}\n\n/**\n * date string 을 입력받고 패턴에 맞게 포맷팅을 변경하는 유틸 함수\n * fromFormat 현재 날짜 포맷\n * toFormat 리턴 날짜 포맷\n */\nexport const convertDateString = ({ dateString, fromFormat, toFormat }: Props) => {\n return dayjs(dateString, fromFormat).format(toFormat);\n};\n\nexport const isDate = (value: unknown) => {\n return value instanceof Date && !isNaN(+value);\n};\n\n/**\n * 날짜 유효성 검사\n *\n * @param {string} dateString - 검사할 날짜 문자열.\n * @param {dayjs.OptionType} [format] - 날짜 문자열의 형식입니다.\n * @returns {boolean} - 유효한 날짜이면 true를 반환하고, 그렇지 않으면 false를 반환합니다.\n */\nexport const isValidDate = (dateString?: string | number | dayjs.Dayjs | Date, format?: dayjs.OptionType) => {\n if (!dateString) {\n return false;\n }\n\n const date = dayjs(dateString, format || 'YYYYMMDD', true);\n\n return date.isValid();\n};\n\nexport type PeriodType =\n | 'thisWeek'\n | 'lastWeek'\n | 'last7Days'\n | 'thisMonth'\n | 'lastMonth'\n | 'last365Days'\n | 'week'\n | 'month'\n | 'today';\n/**\n * @description\n * today 당일\n * week 7일: 오늘 기준 7일 전\n * month 30: 오늘 기준 30일 전\n * thisWeek 이번 주 (일요일 ~ 토요일)\n * lastWeek 지난 주 (일요일 ~ 토요일)\n * last7Days 최근 7일 (오늘 포함)\n * thisMonth 이번 달 (1일 ~ 말일)\n * lastMonth 지난 달 (1일 ~ 말일)\n * last365Days 최근 365일 (오늘 포함)\n * @param periodType\n * @returns\n */\nexport const getPeriodDate = (periodType: PeriodType | 'today') => {\n const lastMonth = dayjs().subtract(1, 'M');\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n\n const endDate = new Date(today);\n let startDate: Date;\n\n switch (periodType) {\n case 'today':\n // 당일\n startDate = new Date(today);\n\n return { startDate, endDate };\n\n case 'week':\n // 7일: 오늘 기준 7일 전\n startDate = new Date(today);\n startDate.setDate(startDate.getDate() - 6);\n\n return { startDate, endDate };\n case 'month':\n // 30일: 오늘 기준 30일 전\n startDate = new Date(today);\n startDate.setDate(startDate.getDate() - 29);\n\n return { startDate, endDate };\n\n case 'thisWeek':\n // 이번 주 (일요일 ~ 토요일)\n return { startDate: dayjs().day(0).toDate(), endDate: dayjs().day(6).toDate() };\n case 'lastWeek':\n // 지난 주 (일요일 ~ 토요일)\n return {\n startDate: dayjs().subtract(1, 'w').day(0).toDate(),\n endDate: dayjs().subtract(1, 'w').day(6).toDate()\n };\n case 'last7Days':\n // 최근 7일 (오늘 포함)\n return { startDate: dayjs().subtract(7, 'd').toDate(), endDate: dayjs().toDate() };\n case 'thisMonth':\n // 이번 달 (1일 ~ 말일)\n return {\n startDate: dayjs().date(1).toDate(),\n endDate: dayjs().date(dayjs().daysInMonth()).toDate()\n };\n case 'lastMonth':\n // 지난 달 (1일 ~ 말일)\n return {\n startDate: lastMonth.date(1).toDate(),\n endDate: lastMonth.date(lastMonth.daysInMonth()).toDate()\n };\n case 'last365Days':\n // 최근 365일 (오늘 포함)\n return { startDate: dayjs().subtract(365, 'd').toDate(), endDate: dayjs().toDate() };\n default:\n return null;\n }\n};\n"]}
@@ -1,5 +1,14 @@
1
1
  'use strict';
2
2
 
3
+ // src/utils/cookie-utils.ts
4
+ var getCookie = (name) => {
5
+ if (typeof document === "undefined") {
6
+ return "";
7
+ }
8
+ const match = document.cookie.match(new RegExp(`(^|; *)${name}=([^;]*)`));
9
+ return match ? decodeURIComponent(match[2] || "") : "";
10
+ };
11
+
3
12
  // src/utils/file-utils.ts
4
13
  function base64ToBlob(base64String, contentType = "") {
5
14
  const regex = /^data:([a-zA-Z0-9/+.-]+);base64,/;
@@ -50,7 +59,7 @@ function getExt(data) {
50
59
  return data.split(".").pop();
51
60
  }
52
61
  if (data instanceof File) {
53
- return data.name.split(".").pop();
62
+ return data.name.split("/").pop();
54
63
  }
55
64
  if (data instanceof Blob) {
56
65
  return data.type.split("/").pop();
@@ -92,7 +101,7 @@ function downloadBlob(blob, filename) {
92
101
  document.body.removeChild(link);
93
102
  URL.revokeObjectURL(url);
94
103
  }
95
- async function imageUrlToFile(imageUrl) {
104
+ async function imageUrlToFileFetch(imageUrl) {
96
105
  const headers = new Headers();
97
106
  headers.append("cache-control", "no-cache");
98
107
  const resImage = await fetch(imageUrl, { headers });
@@ -102,6 +111,63 @@ async function imageUrlToFile(imageUrl) {
102
111
  const file = new File([blob], name, { type });
103
112
  return file;
104
113
  }
114
+ async function imageUrlToFile(imageUrl) {
115
+ const fileConvertTypeCookieKey = "dsp-debug-mode-file-convert-type";
116
+ const fileConvertType = getCookie(fileConvertTypeCookieKey);
117
+ if (fileConvertType === "fetch") {
118
+ return await imageUrlToFileFetch(imageUrl);
119
+ }
120
+ if (fileConvertType === "xhr") {
121
+ return await imageUrlToFileWithXMLHttpRequest(imageUrl);
122
+ }
123
+ return await imageUrlToFileWithCanvas(imageUrl);
124
+ }
125
+ async function imageUrlToFileWithCanvas(imageUrl) {
126
+ const newImage = new Image();
127
+ newImage.src = imageUrl;
128
+ newImage.crossOrigin = "Anonymous";
129
+ return new Promise((resolve, reject) => {
130
+ newImage.onload = () => {
131
+ const canvas = document.createElement("canvas");
132
+ canvas.width = newImage.width;
133
+ canvas.height = newImage.height;
134
+ const ctx = canvas.getContext("2d");
135
+ if (ctx) {
136
+ ctx.drawImage(newImage, 0, 0);
137
+ canvas.toBlob((blob) => {
138
+ if (blob) {
139
+ const ext = getExt(imageUrl);
140
+ const file = new File([blob], `image.${ext}`, { type: blob.type });
141
+ resolve(file);
142
+ }
143
+ });
144
+ }
145
+ };
146
+ newImage.onerror = (e) => {
147
+ reject(JSON.stringify(e));
148
+ };
149
+ });
150
+ }
151
+ async function imageUrlToFileWithXMLHttpRequest(imageUrl) {
152
+ const xhr = new XMLHttpRequest();
153
+ xhr.open("GET", imageUrl, true);
154
+ xhr.responseType = "blob";
155
+ xhr.send();
156
+ return new Promise((resolve, reject) => {
157
+ xhr.onload = () => {
158
+ if (xhr.status === 200) {
159
+ const blob = xhr.response;
160
+ const file = new File([blob], `image.${getExt(imageUrl)}`, { type: blob.type });
161
+ resolve(file);
162
+ } else {
163
+ reject(new Error(`Failed to load image: ${xhr.status}`));
164
+ }
165
+ };
166
+ xhr.onerror = (e) => {
167
+ reject(JSON.stringify(e));
168
+ };
169
+ });
170
+ }
105
171
 
106
172
  exports.base64ToBlob = base64ToBlob;
107
173
  exports.base64ToFile = base64ToFile;
@@ -110,6 +176,9 @@ exports.downloadBlob = downloadBlob;
110
176
  exports.fileToBase64 = fileToBase64;
111
177
  exports.getExt = getExt;
112
178
  exports.imageUrlToFile = imageUrlToFile;
179
+ exports.imageUrlToFileFetch = imageUrlToFileFetch;
180
+ exports.imageUrlToFileWithCanvas = imageUrlToFileWithCanvas;
181
+ exports.imageUrlToFileWithXMLHttpRequest = imageUrlToFileWithXMLHttpRequest;
113
182
  exports.objectUrlToBase64 = objectUrlToBase64;
114
183
  exports.objectUrlToBlob = objectUrlToBlob;
115
184
  //# sourceMappingURL=file-utils.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"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","file":"file-utils.cjs","sourcesContent":["export function base64ToBlob(base64String: string, contentType = '') {\n const regex = /^data:([a-zA-Z0-9/+.-]+);base64,/;\n const matches = base64String.match(regex);\n\n if (matches === null) {\n throw new Error('Invalid base64 string');\n }\n\n const contentTypeFinal = contentType || matches[1];\n const byteCharacters = atob(base64String.replace(regex, ''));\n const byteNumbers = new Array(byteCharacters.length);\n for (let i = 0; i < byteCharacters.length; i++) {\n byteNumbers[i] = byteCharacters.charCodeAt(i);\n }\n\n const byteArray = new Uint8Array(byteNumbers);\n\n return new Blob([byteArray], { type: contentTypeFinal });\n}\n\nexport function base64ToFile(base64String: string, fileName: string, contentType = '') {\n const blob = base64ToBlob(base64String, contentType);\n\n if (!blob) {\n throw new Error('Invalid base64 string');\n }\n\n return blobToFile(blob, fileName);\n}\n\nexport function blobToFile(blob: Blob, fileName: string) {\n return new File([blob], fileName, {\n type: blob.type,\n lastModified: Date.now()\n });\n}\n\nexport async function fileToBase64(file: File | Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n if (typeof reader.result === 'string') {\n resolve(reader.result);\n } else {\n reject(new Error('Invalid file type'));\n }\n };\n\n reader.onerror = (error) => {\n reject(error);\n };\n\n reader.readAsDataURL(file);\n });\n}\n\n/**\n * 파일확장자 리턴\n * @param data string File Blob\n */\nexport function getExt(data: string | File | Blob) {\n if (typeof data === 'string') {\n return data.split('.').pop();\n }\n\n if (data instanceof File) {\n return data.name.split('.').pop();\n }\n\n if (data instanceof Blob) {\n return data.type.split('/').pop();\n }\n}\n\nexport async function objectUrlToBlob(objectUrl: string) {\n try {\n const response = await fetch(objectUrl);\n const blob = await response.blob();\n\n return blob;\n } catch (error) {\n console.error('Error converting object URL to Blob:', error);\n throw error;\n }\n}\n\nexport async function objectUrlToBase64(objectUrl: string): Promise<string> {\n const blob = await objectUrlToBlob(objectUrl);\n\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n if (typeof reader.result === 'string') {\n resolve(reader.result);\n } else {\n reject(new Error('Invalid file type'));\n }\n };\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n}\n\nexport function downloadBlob(blob: Blob, filename: string) {\n // 1. Create a temporary URL for the Blob object\n const url = URL.createObjectURL(blob);\n\n // 2. Create a hidden anchor element\n const link = document.createElement('a');\n link.style.display = 'none';\n link.href = url;\n\n // 3. Set the 'download' attribute with the desired file name\n // This attribute forces the browser to download the URL content instead of navigating to it\n link.download = `${filename}.${getExt(blob)}`;\n\n // 4. Append the link to the body (necessary for the click to work in some browsers)\n document.body.appendChild(link);\n\n // 5. Simulate a click on the link to trigger the download\n link.click();\n\n // 6. Clean up: Remove the link and revoke the object URL\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n\n/**\n * image url을 File Object로 변경.\n * @param imageUrl fileObject로 변경할 image url\n * @return file object\n */\nexport async function imageUrlToFile(imageUrl: string): Promise<File> {\n const headers = new Headers();\n headers.append('cache-control', 'no-cache');\n const resImage = await fetch(imageUrl, { headers });\n const blob = await resImage.blob();\n const { type } = blob;\n const name = type.split('/').join('.');\n const file = new File([blob], name, { type });\n\n return file;\n}\n"]}
1
+ {"version":3,"sources":["../../src/utils/cookie-utils.ts","../../src/utils/file-utils.ts"],"names":[],"mappings":"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","file":"file-utils.cjs","sourcesContent":["export const getCookie = (name: string): string => {\n if (typeof document === 'undefined') {\n return '';\n }\n const match = document.cookie.match(new RegExp(`(^|; *)${name}=([^;]*)`));\n\n return match ? decodeURIComponent(match[2] || '') : '';\n};\n\nexport const setCookie = (\n name: string,\n value: string,\n options: {\n expires?: number | Date; // number of days\n path?: string;\n domain?: string;\n secure?: boolean;\n } = {}\n): void => {\n if (typeof document === 'undefined') {\n return;\n }\n\n let cookieString = `${name}=${encodeURIComponent(value)}`;\n\n if (options.expires) {\n let expiresDate: Date;\n if (typeof options.expires === 'number') {\n expiresDate = new Date();\n expiresDate.setDate(expiresDate.getDate() + options.expires);\n } else {\n expiresDate = options.expires;\n }\n cookieString += `; expires=${expiresDate.toUTCString()}`;\n }\n\n cookieString += `; path=${options.path || '/'}`;\n\n if (options.domain) {\n cookieString += `; domain=${options.domain}`;\n }\n\n if (options.secure) {\n cookieString += '; secure';\n }\n\n document.cookie = cookieString;\n};\n\nexport const deleteCookie = (name: string, options: { path?: string; domain?: string } = {}): void => {\n setCookie(name, '', { ...options, expires: -1 });\n};\n","import { getCookie } from \"./cookie-utils\";\n\nexport function base64ToBlob(base64String: string, contentType = '') {\n const regex = /^data:([a-zA-Z0-9/+.-]+);base64,/;\n const matches = base64String.match(regex);\n\n if (matches === null) {\n throw new Error('Invalid base64 string');\n }\n\n const contentTypeFinal = contentType || matches[1];\n const byteCharacters = atob(base64String.replace(regex, ''));\n const byteNumbers = new Array(byteCharacters.length);\n for (let i = 0; i < byteCharacters.length; i++) {\n byteNumbers[i] = byteCharacters.charCodeAt(i);\n }\n\n const byteArray = new Uint8Array(byteNumbers);\n\n return new Blob([byteArray], { type: contentTypeFinal });\n}\n\nexport function base64ToFile(base64String: string, fileName: string, contentType = '') {\n const blob = base64ToBlob(base64String, contentType);\n\n if (!blob) {\n throw new Error('Invalid base64 string');\n }\n\n return blobToFile(blob, fileName);\n}\n\nexport function blobToFile(blob: Blob, fileName: string) {\n return new File([blob], fileName, {\n type: blob.type,\n lastModified: Date.now()\n });\n}\n\nexport async function fileToBase64(file: File | Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n if (typeof reader.result === 'string') {\n resolve(reader.result);\n } else {\n reject(new Error('Invalid file type'));\n }\n };\n\n reader.onerror = (error) => {\n reject(error);\n };\n\n reader.readAsDataURL(file);\n });\n}\n\n/**\n * 파일확장자 리턴\n * @param data string File Blob\n */\nexport function getExt(data: string | File | Blob) {\n if (typeof data === 'string') {\n return data.split('.').pop();\n }\n\n if (data instanceof File) {\n return data.name.split('/').pop();\n }\n\n if (data instanceof Blob) {\n return data.type.split('/').pop();\n }\n}\n\nexport async function objectUrlToBlob(objectUrl: string) {\n try {\n const response = await fetch(objectUrl);\n const blob = await response.blob();\n\n return blob;\n } catch (error) {\n console.error('Error converting object URL to Blob:', error);\n throw error;\n }\n}\n\nexport async function objectUrlToBase64(objectUrl: string): Promise<string> {\n const blob = await objectUrlToBlob(objectUrl);\n\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n if (typeof reader.result === 'string') {\n resolve(reader.result);\n } else {\n reject(new Error('Invalid file type'));\n }\n };\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n}\n\nexport function downloadBlob(blob: Blob, filename: string) {\n // 1. Create a temporary URL for the Blob object\n const url = URL.createObjectURL(blob);\n\n // 2. Create a hidden anchor element\n const link = document.createElement('a');\n link.style.display = 'none';\n link.href = url;\n\n // 3. Set the 'download' attribute with the desired file name\n // This attribute forces the browser to download the URL content instead of navigating to it\n link.download = `${filename}.${getExt(blob)}`;\n\n // 4. Append the link to the body (necessary for the click to work in some browsers)\n document.body.appendChild(link);\n\n // 5. Simulate a click on the link to trigger the download\n link.click();\n\n // 6. Clean up: Remove the link and revoke the object URL\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n\n/**\n * image url을 File Object로 변경.\n * @param imageUrl fileObject로 변경할 image url\n * @note fetch를 이용하여 변환하기때문에, 앱내 커스텀스킴을 사용하는경우는 처리불가. imageUrlToFileWithCanvas사용\n * @return file object\n */\nexport async function imageUrlToFileFetch(imageUrl: string): Promise<File> {\n\n const headers = new Headers();\n headers.append('cache-control', 'no-cache');\n const resImage = await fetch(imageUrl, { headers });\n const blob = await resImage.blob();\n const { type } = blob;\n const name = type.split('/').join('.');\n const file = new File([blob], name, { type });\n\n return file;\n}\n\nexport async function imageUrlToFile(imageUrl: string): Promise<File> {\n const fileConvertTypeCookieKey = 'dsp-debug-mode-file-convert-type';\n const fileConvertType = getCookie(fileConvertTypeCookieKey);\n\n if (fileConvertType === 'fetch') {\n return await imageUrlToFileFetch(imageUrl);\n }\n\n if (fileConvertType === 'xhr') {\n return await imageUrlToFileWithXMLHttpRequest(imageUrl);\n }\n\n return await imageUrlToFileWithCanvas(imageUrl);\n}\n\n\n/**\n * imageUrlToFile버전을 사용할수 없는경우 대체하여 사용.\n * 메모리소모가 증가하고, 이미지손실가능성이 있음.\n * 이미지원본에 대한 보존이 필수인경우 비추\n * @param imageUrl \n * @returns \n */\nexport async function imageUrlToFileWithCanvas(imageUrl: string): Promise<File> {\n const newImage = new Image();\n newImage.src = imageUrl;\n newImage.crossOrigin = 'Anonymous';\n\n return new Promise((resolve, reject) => {\n newImage.onload = () => {\n const canvas = document.createElement('canvas');\n canvas.width = newImage.width;\n canvas.height = newImage.height;\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.drawImage(newImage, 0, 0);\n canvas.toBlob((blob) => {\n if (blob) {\n const ext = getExt(imageUrl);\n const file = new File([blob], `image.${ext}`, { type: blob.type });\n resolve(file);\n }\n });\n }\n };\n newImage.onerror = (e) => {\n reject(JSON.stringify(e));\n };\n });\n}\n\nexport async function imageUrlToFileWithXMLHttpRequest(imageUrl: string): Promise<File> {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', imageUrl, true);\n xhr.responseType = 'blob';\n xhr.send();\n\n return new Promise((resolve, reject) => {\n xhr.onload = () => {\n if (xhr.status === 200) {\n const blob = xhr.response; ``\n const file = new File([blob], `image.${getExt(imageUrl)}`, { type: blob.type });\n resolve(file);\n } else {\n reject(new Error(`Failed to load image: ${xhr.status}`));\n }\n };\n xhr.onerror = (e) => {\n reject(JSON.stringify(e));\n };\n });\n};"]}
@@ -13,8 +13,19 @@ declare function downloadBlob(blob: Blob, filename: string): void;
13
13
  /**
14
14
  * image url을 File Object로 변경.
15
15
  * @param imageUrl fileObject로 변경할 image url
16
+ * @note fetch를 이용하여 변환하기때문에, 앱내 커스텀스킴을 사용하는경우는 처리불가. imageUrlToFileWithCanvas사용
16
17
  * @return file object
17
18
  */
19
+ declare function imageUrlToFileFetch(imageUrl: string): Promise<File>;
18
20
  declare function imageUrlToFile(imageUrl: string): Promise<File>;
21
+ /**
22
+ * imageUrlToFile버전을 사용할수 없는경우 대체하여 사용.
23
+ * 메모리소모가 증가하고, 이미지손실가능성이 있음.
24
+ * 이미지원본에 대한 보존이 필수인경우 비추
25
+ * @param imageUrl
26
+ * @returns
27
+ */
28
+ declare function imageUrlToFileWithCanvas(imageUrl: string): Promise<File>;
29
+ declare function imageUrlToFileWithXMLHttpRequest(imageUrl: string): Promise<File>;
19
30
 
20
- export { base64ToBlob, base64ToFile, blobToFile, downloadBlob, fileToBase64, getExt, imageUrlToFile, objectUrlToBase64, objectUrlToBlob };
31
+ export { base64ToBlob, base64ToFile, blobToFile, downloadBlob, fileToBase64, getExt, imageUrlToFile, imageUrlToFileFetch, imageUrlToFileWithCanvas, imageUrlToFileWithXMLHttpRequest, objectUrlToBase64, objectUrlToBlob };
@@ -13,8 +13,19 @@ declare function downloadBlob(blob: Blob, filename: string): void;
13
13
  /**
14
14
  * image url을 File Object로 변경.
15
15
  * @param imageUrl fileObject로 변경할 image url
16
+ * @note fetch를 이용하여 변환하기때문에, 앱내 커스텀스킴을 사용하는경우는 처리불가. imageUrlToFileWithCanvas사용
16
17
  * @return file object
17
18
  */
19
+ declare function imageUrlToFileFetch(imageUrl: string): Promise<File>;
18
20
  declare function imageUrlToFile(imageUrl: string): Promise<File>;
21
+ /**
22
+ * imageUrlToFile버전을 사용할수 없는경우 대체하여 사용.
23
+ * 메모리소모가 증가하고, 이미지손실가능성이 있음.
24
+ * 이미지원본에 대한 보존이 필수인경우 비추
25
+ * @param imageUrl
26
+ * @returns
27
+ */
28
+ declare function imageUrlToFileWithCanvas(imageUrl: string): Promise<File>;
29
+ declare function imageUrlToFileWithXMLHttpRequest(imageUrl: string): Promise<File>;
19
30
 
20
- export { base64ToBlob, base64ToFile, blobToFile, downloadBlob, fileToBase64, getExt, imageUrlToFile, objectUrlToBase64, objectUrlToBlob };
31
+ export { base64ToBlob, base64ToFile, blobToFile, downloadBlob, fileToBase64, getExt, imageUrlToFile, imageUrlToFileFetch, imageUrlToFileWithCanvas, imageUrlToFileWithXMLHttpRequest, objectUrlToBase64, objectUrlToBlob };