sales-frontend-utils 0.0.45 → 0.0.47

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":";;;;;;;;;;;;;AAOAA,sBAAA,CAAM,OAAO,IAAI,CAAA;AACjBA,sBAAA,CAAM,OAAOC,kCAAiB,CAAA;AAQvB,SAAS,UAAA,CAAW,MAAc,KAAe,EAAA;AACtD,EAAA,QAAQ,KAAO;AAAA,IACb,KAAK,CAAA;AACH,MAAO,OAAA,IAAA,GAAO,CAAM,KAAA,CAAA,GAAI,EAAK,GAAA,EAAA;AAAA,IAC/B,KAAK,CAAA;AAAA,IACL,KAAK,CAAA;AAAA,IACL,KAAK,CAAA;AAAA,IACL,KAAK,EAAA;AACH,MAAO,OAAA,EAAA;AAAA,IACT;AACE,MAAO,OAAA,EAAA;AAAA;AAEb;;;ACfO,IAAM,MAAN,MAAU;AAAA,EAiBb,WAAY,CAAA,EAAE,KAAO,EAAA,IAAA,EAAM,SAAqB,EAAA;AAThD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,OAAA,CAAA;AAKA;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,MAAA,CAAA;AACA,IAAA,aAAA,CAAA,IAAA,EAAA,SAAA,CAAA;AACA,IAAA,aAAA,CAAA,IAAA,EAAA,UAAA,CAAA;AAII,IAAK,IAAA,CAAA,KAAA,GAAQ,IAAK,CAAA,MAAA,CAAO,KAAK,CAAA;AAC9B,IAAK,IAAA,CAAA,IAAA,GAAO,IAAK,CAAA,MAAA,CAAO,IAAI,CAAA;AAC5B,IAAA,IAAA,CAAK,OAAU,GAAA,OAAA;AAEf,IAAM,MAAA,aAAA,GAAgB,KAAK,YAAa,EAAA;AACxC,IAAA,IAAA,CAAK,YAAY,aAAa,CAAA;AAC9B,IAAK,IAAA,CAAA,QAAA,GAAW,SAAS,IAAQ,IAAA,aAAA;AAAA;AACrC,EAEA,YAAY,aAAsC,EAAA;AAC9C,IAAA,IAAI,kBAAkB,SAAW,EAAA;AAC7B,MAAM,MAAA,IAAI,MAAM,yBAAyB,CAAA;AAAA;AAC7C;AACJ,EACA,OAAO,GAAuB,EAAA;AAC1B,IAAA,IAAI,CAAC,GAAK,EAAA;AACN,MAAO,OAAA,EAAA;AAAA;AAGX,IAAA,OAAO,GAAI,CAAA,QAAA,EAAW,CAAA,OAAA,CAAQ,WAAW,EAAE,CAAA;AAAA;AAC/C;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAe,GAAA;AACX,IAAI,IAAA,IAAA,CAAK,KAAM,CAAA,MAAA,KAAW,CAAG,EAAA;AACzB,MAAO,OAAA,UAAA;AAAA,KACA,MAAA,IAAA,IAAA,CAAK,KAAM,CAAA,MAAA,KAAW,CAAG,EAAA;AAChC,MAAO,OAAA,QAAA;AAAA;AAGX,IAAO,OAAA,SAAA;AAAA;AACX;AAAA;AAAA;AAAA;AAAA,EAMA,eAAkB,GAAA;AACd,IAAI,IAAA,MAAA;AACJ,IAAI,IAAA,MAAA;AACJ,IAAI,IAAA,MAAA;AAEJ,IAAI,IAAA,IAAA,CAAK,aAAa,UAAY,EAAA;AAC9B,MAAA,MAAA,GAAS,WAAW,IAAK,CAAA,KAAA,CAAM,SAAU,CAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAC9C,MAAA,MAAA,GAAS,WAAW,IAAK,CAAA,KAAA,CAAM,SAAU,CAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAC9C,MAAA,MAAA,GAAS,WAAW,IAAK,CAAA,KAAA,CAAM,SAAU,CAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,KAClD,MAAA,IAAW,IAAK,CAAA,QAAA,KAAa,QAAU,EAAA;AACnC,MACI,IAAA,IAAA,CAAK,MAAM,SAAU,CAAA,CAAA,EAAG,CAAC,CAAM,KAAA,GAAA,IAC/B,KAAK,KAAM,CAAA,SAAA,CAAU,GAAG,CAAC,CAAA,KAAM,OAC/B,IAAK,CAAA,KAAA,CAAM,UAAU,CAAG,EAAA,CAAC,MAAM,GACjC,EAAA;AACE,QAAA,MAAA,GAAS,WAAW,IAAK,CAAA,KAAA,CAAM,UAAU,CAAG,EAAA,CAAC,CAAC,CAAI,GAAA,GAAA;AAAA,OAC/C,MAAA;AACH,QAAA,MAAA,GAAS,WAAW,IAAK,CAAA,KAAA,CAAM,UAAU,CAAG,EAAA,CAAC,CAAC,CAAI,GAAA,IAAA;AAAA;AAEtD,MAAA,MAAA,GAAS,WAAW,IAAK,CAAA,KAAA,CAAM,SAAU,CAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAC9C,MAAA,MAAA,GAAS,WAAW,IAAK,CAAA,KAAA,CAAM,SAAU,CAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,KAC3C,MAAA;AACH,MAAA,OAAA,CAAQ,MAAM,wEAAgC,CAAA;AAE9C,MAAO,OAAA,EAAA;AAAA;AAGX,IAAM,MAAA,OAAA,uBAAc,IAAK,EAAA;AACzB,IAAM,MAAA,MAAA,GAAS,QAAQ,WAAY,EAAA;AACnC,IAAM,MAAA,MAAA,GAAS,OAAQ,CAAA,QAAA,EAAa,GAAA,CAAA;AACpC,IAAM,MAAA,MAAA,GAAS,QAAQ,OAAQ,EAAA;AAE/B,IAAA,IAAI,QAAQ,MAAS,GAAA,MAAA;AACrB,IAAA,IAAI,KAAQ,GAAA,MAAA,GAAS,MAAU,IAAA,MAAA,GAAS,SAAS,CAAI,GAAA,CAAA,CAAA;AAErD,IAAA,IAAI,QAAQ,CAAG,EAAA;AACX,MAAS,KAAA,IAAA,EAAA;AACT,MAAE,EAAA,KAAA;AAAA;AAEN,IAAA,IAAI,QAAQ,CAAG,EAAA;AACX,MAAO,OAAA,EAAA;AAAA;AAGX,IAAI,IAAA,KAAA,KAAU,KAAK,MAAS,GAAA,MAAA,IAAU,WAAW,UAAW,CAAA,MAAA,EAAQ,MAAM,CAAG,EAAA;AACzE,MAAE,EAAA,KAAA;AAAA;AAGN,IAAO,OAAA,KAAA,IAAS,CAAK,IAAA,KAAA,GAAQ,CAAI,GAAA,CAAA,CAAA;AAAA;AACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAa,GAAA;AACT,IAAA,MAAM,QAAQ,QAAS,CAAA,IAAA,CAAK,MAAM,KAAM,CAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAC7C,IAAA,MAAM,MAAM,QAAS,CAAA,IAAA,CAAK,MAAM,KAAM,CAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAE3C,IAAM,MAAA,SAAA,GAAY,KAAK,YAAa,EAAA;AACpC,IAAA,IAAI,CAAC,SAAW,EAAA;AACZ,MAAA,OAAA,CAAQ,MAAM,0BAA0B,CAAA;AAExC,MAAO,OAAA,EAAA;AAAA;AAEX,IAAM,MAAA,WAAA,uBAAkB,IAAK,EAAA;AAE7B,IAAI,IAAA,KAAA,GAAQ,WAAY,CAAA,WAAA,EAAgB,GAAA,SAAA;AACxC,IAAA,OAAA,CAAQ,GAAI,CAAA,KAAA,EAAO,WAAY,CAAA,WAAA,IAAe,SAAS,CAAA;AACvD,IAAI,IAAA,KAAA,GAAQ,WAAY,CAAA,QAAA,EAAa,GAAA,CAAA,GAAI,SAAS,WAAY,CAAA,OAAA,EAAY,GAAA,GAAA,GAAM,CAAI,GAAA,CAAA,CAAA;AAEpF,IAAA,IAAI,QAAQ,CAAG,EAAA;AACX,MAAS,KAAA,IAAA,EAAA;AACT,MAAE,EAAA,KAAA;AAAA;AAEN,IAAA,IAAI,QAAQ,CAAG,EAAA;AACX,MAAO,OAAA,EAAA;AAAA;AAGX,IAAO,OAAA,KAAA;AAAA;AACX,EAEA,YAAe,GAAA;AACX,IAAI,IAAA,IAAA,CAAK,aAAa,QAAU,EAAA;AAC5B,MAAI,IAAA,CAAC,KAAK,IAAM,EAAA;AACZ,QAAA,OAAA,CAAQ,MAAM,qBAAqB,CAAA;AAEnC,QAAO,OAAA,EAAA;AAAA;AAEX,MAAA,MAAM,IAAO,GAAA,IAAA,CAAK,KAAM,CAAA,KAAA,CAAM,GAAG,CAAC,CAAA;AAClC,MAAI,IAAA,aAAA;AACJ,MAAI,IAAA,CAAC,KAAK,GAAK,EAAA,GAAA,EAAK,GAAG,CAAE,CAAA,QAAA,CAAS,IAAK,CAAA,IAAI,CAAG,EAAA;AAC1C,QAAgB,aAAA,GAAA,IAAA;AAAA,OACpB,MAAA,IAAW,CAAC,GAAA,EAAK,GAAK,EAAA,GAAA,EAAK,GAAG,CAAE,CAAA,QAAA,CAAS,IAAK,CAAA,IAAI,CAAG,EAAA;AACjD,QAAgB,aAAA,GAAA,GAAA;AAAA,OACpB,MAAA,IAAW,CAAC,GAAK,EAAA,GAAG,EAAE,QAAS,CAAA,IAAA,CAAK,IAAI,CAAG,EAAA;AACvC,QAAgB,aAAA,GAAA,IAAA;AAAA,OACb,MAAA;AACH,QAAO,OAAA,EAAA;AAAA;AAGX,MAAA,MAAM,SAAY,GAAA,aAAA,GAAgB,QAAS,CAAA,IAAA,EAAM,EAAE,CAAA;AAEnD,MAAO,OAAA,SAAA;AAAA,KACX,MAAA,IAAW,IAAK,CAAA,QAAA,KAAa,UAAY,EAAA;AACrC,MAAA,OAAO,SAAS,IAAK,CAAA,KAAA,CAAM,KAAM,CAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA;AAC1C;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAc,GAAA;AACV,IAAI,IAAA,CAAC,KAAK,IAAM,EAAA;AACZ,MAAA,OAAA,CAAQ,MAAM,qBAAqB,CAAA;AAEnC,MAAO,OAAA,EAAA;AAAA;AAGX,IAAO,OAAA,CAAC,GAAK,EAAA,GAAA,EAAK,GAAK,EAAA,GAAG,EAAE,QAAS,CAAA,IAAA,CAAK,IAAK,CAAA,QAAA,EAAU,CAAA;AAAA;AAC7D,EAGA,OAAO,YAAY,KAAwB,EAAA;AACvC,IAAM,MAAA,GAAA,GAAM,OAAO,KAAK,CAAA;AACxB,IAAM,MAAA,SAAA,GAAY,GAAI,CAAA,MAAA,CAAO,CAAC,CAAA;AAE9B,IAAA,OAAO,CAAC,GAAK,EAAA,GAAA,EAAK,KAAK,GAAG,CAAA,CAAE,SAAS,SAAS,CAAA;AAAA;AAClD;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,sBAAsB,KAAwB,EAAA;AACjD,IAAA,IAAI,CAAC,KAAO,EAAA;AACR,MAAA,OAAA,CAAQ,MAAM,sBAAsB,CAAA;AAEpC,MAAO,OAAA,KAAA;AAAA;AAIX,IAAA,MAAM,OAAU,GAAA,KAAA,CAAM,OAAQ,CAAA,SAAA,EAAW,EAAE,CAAA;AAG3C,IAAI,IAAA,OAAA,CAAQ,SAAS,CAAG,EAAA;AACpB,MAAA,OAAA,CAAQ,MAAM,oBAAoB,CAAA;AAElC,MAAO,OAAA,KAAA;AAAA;AAGX,IAAM,MAAA,WAAA,GAAc,QAAQ,CAAC,CAAA;AAC7B,IAAA,IAAI,CAAC,WAAa,EAAA;AACd,MAAA,OAAA,CAAQ,MAAM,4BAA4B,CAAA;AAE1C,MAAO,OAAA,KAAA;AAAA;AAIX,IAAA,OAAO,CAAC,GAAK,EAAA,GAAA,EAAK,KAAK,GAAG,CAAA,CAAE,SAAS,WAAW,CAAA;AAAA;AAExD","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":";;;;;;;;;;;;;AAMAA,sBAAA,CAAM,OAAO,IAAI,CAAA;AACjBA,sBAAA,CAAM,OAAOC,kCAAiB,CAAA;AAQvB,SAAS,UAAA,CAAW,MAAc,KAAe,EAAA;AACtD,EAAA,QAAQ,KAAO;AAAA,IACb,KAAK,CAAA;AACH,MAAO,OAAA,IAAA,GAAO,CAAM,KAAA,CAAA,GAAI,EAAK,GAAA,EAAA;AAAA,IAC/B,KAAK,CAAA;AAAA,IACL,KAAK,CAAA;AAAA,IACL,KAAK,CAAA;AAAA,IACL,KAAK,EAAA;AACH,MAAO,OAAA,EAAA;AAAA,IACT;AACE,MAAO,OAAA,EAAA;AAAA;AAEb;;;ACdO,IAAM,MAAN,MAAU;AAAA,EAiBb,WAAY,CAAA,EAAE,KAAO,EAAA,IAAA,EAAM,SAAqB,EAAA;AAThD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,OAAA,CAAA;AAKA;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,MAAA,CAAA;AACA,IAAA,aAAA,CAAA,IAAA,EAAA,SAAA,CAAA;AACA,IAAA,aAAA,CAAA,IAAA,EAAA,UAAA,CAAA;AAII,IAAK,IAAA,CAAA,KAAA,GAAQ,IAAK,CAAA,MAAA,CAAO,KAAK,CAAA;AAC9B,IAAK,IAAA,CAAA,IAAA,GAAO,IAAK,CAAA,MAAA,CAAO,IAAI,CAAA;AAC5B,IAAA,IAAA,CAAK,OAAU,GAAA,OAAA;AAEf,IAAM,MAAA,aAAA,GAAgB,KAAK,YAAa,EAAA;AACxC,IAAA,IAAA,CAAK,YAAY,aAAa,CAAA;AAC9B,IAAK,IAAA,CAAA,QAAA,GAAW,SAAS,IAAQ,IAAA,aAAA;AAAA;AACrC,EAEA,YAAY,aAAsC,EAAA;AAC9C,IAAA,IAAI,kBAAkB,SAAW,EAAA;AAC7B,MAAM,MAAA,IAAI,MAAM,yBAAyB,CAAA;AAAA;AAC7C;AACJ,EACA,OAAO,GAAuB,EAAA;AAC1B,IAAA,IAAI,CAAC,GAAK,EAAA;AACN,MAAO,OAAA,EAAA;AAAA;AAGX,IAAA,OAAO,GAAI,CAAA,QAAA,EAAW,CAAA,OAAA,CAAQ,WAAW,EAAE,CAAA;AAAA;AAC/C;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAe,GAAA;AACX,IAAI,IAAA,IAAA,CAAK,KAAM,CAAA,MAAA,KAAW,CAAG,EAAA;AACzB,MAAO,OAAA,UAAA;AAAA,KACA,MAAA,IAAA,IAAA,CAAK,KAAM,CAAA,MAAA,KAAW,CAAG,EAAA;AAChC,MAAO,OAAA,QAAA;AAAA;AAGX,IAAO,OAAA,SAAA;AAAA;AACX;AAAA;AAAA;AAAA;AAAA,EAMA,eAAkB,GAAA;AACd,IAAI,IAAA,MAAA;AACJ,IAAI,IAAA,MAAA;AACJ,IAAI,IAAA,MAAA;AAEJ,IAAI,IAAA,IAAA,CAAK,aAAa,UAAY,EAAA;AAC9B,MAAA,MAAA,GAAS,WAAW,IAAK,CAAA,KAAA,CAAM,SAAU,CAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAC9C,MAAA,MAAA,GAAS,WAAW,IAAK,CAAA,KAAA,CAAM,SAAU,CAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAC9C,MAAA,MAAA,GAAS,WAAW,IAAK,CAAA,KAAA,CAAM,SAAU,CAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,KAClD,MAAA,IAAW,IAAK,CAAA,QAAA,KAAa,QAAU,EAAA;AACnC,MACI,IAAA,IAAA,CAAK,MAAM,SAAU,CAAA,CAAA,EAAG,CAAC,CAAM,KAAA,GAAA,IAC/B,KAAK,KAAM,CAAA,SAAA,CAAU,GAAG,CAAC,CAAA,KAAM,OAC/B,IAAK,CAAA,KAAA,CAAM,UAAU,CAAG,EAAA,CAAC,MAAM,GACjC,EAAA;AACE,QAAA,MAAA,GAAS,WAAW,IAAK,CAAA,KAAA,CAAM,UAAU,CAAG,EAAA,CAAC,CAAC,CAAI,GAAA,GAAA;AAAA,OAC/C,MAAA;AACH,QAAA,MAAA,GAAS,WAAW,IAAK,CAAA,KAAA,CAAM,UAAU,CAAG,EAAA,CAAC,CAAC,CAAI,GAAA,IAAA;AAAA;AAEtD,MAAA,MAAA,GAAS,WAAW,IAAK,CAAA,KAAA,CAAM,SAAU,CAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAC9C,MAAA,MAAA,GAAS,WAAW,IAAK,CAAA,KAAA,CAAM,SAAU,CAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,KAC3C,MAAA;AACH,MAAA,OAAA,CAAQ,MAAM,wEAAgC,CAAA;AAE9C,MAAO,OAAA,EAAA;AAAA;AAGX,IAAM,MAAA,OAAA,uBAAc,IAAK,EAAA;AACzB,IAAM,MAAA,MAAA,GAAS,QAAQ,WAAY,EAAA;AACnC,IAAM,MAAA,MAAA,GAAS,OAAQ,CAAA,QAAA,EAAa,GAAA,CAAA;AACpC,IAAM,MAAA,MAAA,GAAS,QAAQ,OAAQ,EAAA;AAE/B,IAAA,IAAI,QAAQ,MAAS,GAAA,MAAA;AACrB,IAAA,IAAI,KAAQ,GAAA,MAAA,GAAS,MAAU,IAAA,MAAA,GAAS,SAAS,CAAI,GAAA,CAAA,CAAA;AAErD,IAAA,IAAI,QAAQ,CAAG,EAAA;AACX,MAAS,KAAA,IAAA,EAAA;AACT,MAAE,EAAA,KAAA;AAAA;AAEN,IAAA,IAAI,QAAQ,CAAG,EAAA;AACX,MAAO,OAAA,EAAA;AAAA;AAGX,IAAI,IAAA,KAAA,KAAU,KAAK,MAAS,GAAA,MAAA,IAAU,WAAW,UAAW,CAAA,MAAA,EAAQ,MAAM,CAAG,EAAA;AACzE,MAAE,EAAA,KAAA;AAAA;AAGN,IAAO,OAAA,KAAA,IAAS,CAAK,IAAA,KAAA,GAAQ,CAAI,GAAA,CAAA,CAAA;AAAA;AACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAa,GAAA;AACT,IAAA,MAAM,QAAQ,QAAS,CAAA,IAAA,CAAK,MAAM,KAAM,CAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAC7C,IAAA,MAAM,MAAM,QAAS,CAAA,IAAA,CAAK,MAAM,KAAM,CAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAE3C,IAAM,MAAA,SAAA,GAAY,KAAK,YAAa,EAAA;AACpC,IAAA,IAAI,CAAC,SAAW,EAAA;AACZ,MAAA,OAAA,CAAQ,MAAM,0BAA0B,CAAA;AAExC,MAAO,OAAA,EAAA;AAAA;AAEX,IAAM,MAAA,WAAA,uBAAkB,IAAK,EAAA;AAE7B,IAAI,IAAA,KAAA,GAAQ,WAAY,CAAA,WAAA,EAAgB,GAAA,SAAA;AACxC,IAAA,OAAA,CAAQ,GAAI,CAAA,KAAA,EAAO,WAAY,CAAA,WAAA,IAAe,SAAS,CAAA;AACvD,IAAI,IAAA,KAAA,GAAQ,WAAY,CAAA,QAAA,EAAa,GAAA,CAAA,GAAI,SAAS,WAAY,CAAA,OAAA,EAAY,GAAA,GAAA,GAAM,CAAI,GAAA,CAAA,CAAA;AAEpF,IAAA,IAAI,QAAQ,CAAG,EAAA;AACX,MAAS,KAAA,IAAA,EAAA;AACT,MAAE,EAAA,KAAA;AAAA;AAEN,IAAA,IAAI,QAAQ,CAAG,EAAA;AACX,MAAO,OAAA,EAAA;AAAA;AAGX,IAAO,OAAA,KAAA;AAAA;AACX,EAEA,YAAe,GAAA;AACX,IAAI,IAAA,IAAA,CAAK,aAAa,QAAU,EAAA;AAC5B,MAAI,IAAA,CAAC,KAAK,IAAM,EAAA;AACZ,QAAA,OAAA,CAAQ,MAAM,qBAAqB,CAAA;AAEnC,QAAO,OAAA,EAAA;AAAA;AAEX,MAAA,MAAM,IAAO,GAAA,IAAA,CAAK,KAAM,CAAA,KAAA,CAAM,GAAG,CAAC,CAAA;AAClC,MAAI,IAAA,aAAA;AACJ,MAAI,IAAA,CAAC,KAAK,GAAK,EAAA,GAAA,EAAK,GAAG,CAAE,CAAA,QAAA,CAAS,IAAK,CAAA,IAAI,CAAG,EAAA;AAC1C,QAAgB,aAAA,GAAA,IAAA;AAAA,OACpB,MAAA,IAAW,CAAC,GAAA,EAAK,GAAK,EAAA,GAAA,EAAK,GAAG,CAAE,CAAA,QAAA,CAAS,IAAK,CAAA,IAAI,CAAG,EAAA;AACjD,QAAgB,aAAA,GAAA,GAAA;AAAA,OACpB,MAAA,IAAW,CAAC,GAAK,EAAA,GAAG,EAAE,QAAS,CAAA,IAAA,CAAK,IAAI,CAAG,EAAA;AACvC,QAAgB,aAAA,GAAA,IAAA;AAAA,OACb,MAAA;AACH,QAAO,OAAA,EAAA;AAAA;AAGX,MAAA,MAAM,SAAY,GAAA,aAAA,GAAgB,QAAS,CAAA,IAAA,EAAM,EAAE,CAAA;AAEnD,MAAO,OAAA,SAAA;AAAA,KACX,MAAA,IAAW,IAAK,CAAA,QAAA,KAAa,UAAY,EAAA;AACrC,MAAA,OAAO,SAAS,IAAK,CAAA,KAAA,CAAM,KAAM,CAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA;AAC1C;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAc,GAAA;AACV,IAAI,IAAA,CAAC,KAAK,IAAM,EAAA;AACZ,MAAA,OAAA,CAAQ,MAAM,qBAAqB,CAAA;AAEnC,MAAO,OAAA,EAAA;AAAA;AAGX,IAAO,OAAA,CAAC,GAAK,EAAA,GAAA,EAAK,GAAK,EAAA,GAAG,EAAE,QAAS,CAAA,IAAA,CAAK,IAAK,CAAA,QAAA,EAAU,CAAA;AAAA;AAC7D,EAGA,OAAO,YAAY,KAAwB,EAAA;AACvC,IAAM,MAAA,GAAA,GAAM,OAAO,KAAK,CAAA;AACxB,IAAM,MAAA,SAAA,GAAY,GAAI,CAAA,MAAA,CAAO,CAAC,CAAA;AAE9B,IAAA,OAAO,CAAC,GAAK,EAAA,GAAA,EAAK,KAAK,GAAG,CAAA,CAAE,SAAS,SAAS,CAAA;AAAA;AAClD;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,sBAAsB,KAAwB,EAAA;AACjD,IAAA,IAAI,CAAC,KAAO,EAAA;AACR,MAAA,OAAA,CAAQ,MAAM,sBAAsB,CAAA;AAEpC,MAAO,OAAA,KAAA;AAAA;AAIX,IAAA,MAAM,OAAU,GAAA,KAAA,CAAM,OAAQ,CAAA,SAAA,EAAW,EAAE,CAAA;AAG3C,IAAI,IAAA,OAAA,CAAQ,SAAS,CAAG,EAAA;AACpB,MAAA,OAAA,CAAQ,MAAM,oBAAoB,CAAA;AAElC,MAAO,OAAA,KAAA;AAAA;AAGX,IAAM,MAAA,WAAA,GAAc,QAAQ,CAAC,CAAA;AAC7B,IAAA,IAAI,CAAC,WAAa,EAAA;AACd,MAAA,OAAA,CAAQ,MAAM,4BAA4B,CAAA;AAE1C,MAAO,OAAA,KAAA;AAAA;AAIX,IAAA,OAAO,CAAC,GAAK,EAAA,GAAA,EAAK,KAAK,GAAG,CAAA,CAAE,SAAS,WAAW,CAAA;AAAA;AAExD","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,7 +1,19 @@
1
1
  'use strict';
2
2
 
3
+ // src/utils/environment-utils.ts
4
+ var isClient = () => {
5
+ try {
6
+ return !!window;
7
+ } catch {
8
+ return false;
9
+ }
10
+ };
11
+
3
12
  // src/utils/cookie-utils.ts
4
13
  var getCookie = (name) => {
14
+ if (!isClient()) {
15
+ return "";
16
+ }
5
17
  if (typeof document === "undefined") {
6
18
  return "";
7
19
  }
@@ -9,6 +21,9 @@ var getCookie = (name) => {
9
21
  return match ? decodeURIComponent(match[2] || "") : "";
10
22
  };
11
23
  var setCookie = (name, value, options = {}) => {
24
+ if (!isClient()) {
25
+ return;
26
+ }
12
27
  if (typeof document === "undefined") {
13
28
  return;
14
29
  }
@@ -33,6 +48,9 @@ var setCookie = (name, value, options = {}) => {
33
48
  document.cookie = cookieString;
34
49
  };
35
50
  var deleteCookie = (name, options = {}) => {
51
+ if (!isClient()) {
52
+ return;
53
+ }
36
54
  setCookie(name, "", { ...options, expires: -1 });
37
55
  };
38
56
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/cookie-utils.ts"],"names":[],"mappings":";;;AAAa,IAAA,SAAA,GAAY,CAAC,IAAyB,KAAA;AACjD,EAAI,IAAA,OAAO,aAAa,WAAa,EAAA;AACnC,IAAO,OAAA,EAAA;AAAA;AAET,EAAM,MAAA,KAAA,GAAQ,SAAS,MAAO,CAAA,KAAA,CAAM,IAAI,MAAO,CAAA,CAAA,OAAA,EAAU,IAAI,CAAA,QAAA,CAAU,CAAC,CAAA;AAExE,EAAA,OAAO,QAAQ,kBAAmB,CAAA,KAAA,CAAM,CAAC,CAAA,IAAK,EAAE,CAAI,GAAA,EAAA;AACtD;AAEO,IAAM,YAAY,CACvB,IAAA,EACA,KACA,EAAA,OAAA,GAKI,EACK,KAAA;AACT,EAAI,IAAA,OAAO,aAAa,WAAa,EAAA;AACnC,IAAA;AAAA;AAGF,EAAA,IAAI,eAAe,CAAG,EAAA,IAAI,CAAI,CAAA,EAAA,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAEvD,EAAA,IAAI,QAAQ,OAAS,EAAA;AACnB,IAAI,IAAA,WAAA;AACJ,IAAI,IAAA,OAAO,OAAQ,CAAA,OAAA,KAAY,QAAU,EAAA;AACvC,MAAA,WAAA,uBAAkB,IAAK,EAAA;AACvB,MAAA,WAAA,CAAY,OAAQ,CAAA,WAAA,CAAY,OAAQ,EAAA,GAAI,QAAQ,OAAO,CAAA;AAAA,KACtD,MAAA;AACL,MAAA,WAAA,GAAc,OAAQ,CAAA,OAAA;AAAA;AAExB,IAAgB,YAAA,IAAA,CAAA,UAAA,EAAa,WAAY,CAAA,WAAA,EAAa,CAAA,CAAA;AAAA;AAGxD,EAAgB,YAAA,IAAA,CAAA,OAAA,EAAU,OAAQ,CAAA,IAAA,IAAQ,GAAG,CAAA,CAAA;AAE7C,EAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,IAAgB,YAAA,IAAA,CAAA,SAAA,EAAY,QAAQ,MAAM,CAAA,CAAA;AAAA;AAG5C,EAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,IAAgB,YAAA,IAAA,UAAA;AAAA;AAGlB,EAAA,QAAA,CAAS,MAAS,GAAA,YAAA;AACpB;AAEO,IAAM,YAAe,GAAA,CAAC,IAAc,EAAA,OAAA,GAA8C,EAAa,KAAA;AACpG,EAAA,SAAA,CAAU,MAAM,EAAI,EAAA,EAAE,GAAG,OAAS,EAAA,OAAA,EAAS,IAAI,CAAA;AACjD","file":"cookie-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"]}
1
+ {"version":3,"sources":["../../src/utils/environment-utils.ts","../../src/utils/cookie-utils.ts"],"names":[],"mappings":";;;AA0DO,IAAM,WAAW,MAAM;AAC5B,EAAI,IAAA;AACF,IAAA,OAAO,CAAC,CAAC,MAAA;AAAA,GACH,CAAA,MAAA;AACN,IAAO,OAAA,KAAA;AAAA;AAEX,CAAA;;;AC9Da,IAAA,SAAA,GAAY,CAAC,IAAyB,KAAA;AACjD,EAAI,IAAA,CAAC,UAAY,EAAA;AACf,IAAO,OAAA,EAAA;AAAA;AAET,EAAI,IAAA,OAAO,aAAa,WAAa,EAAA;AACnC,IAAO,OAAA,EAAA;AAAA;AAET,EAAM,MAAA,KAAA,GAAQ,SAAS,MAAO,CAAA,KAAA,CAAM,IAAI,MAAO,CAAA,CAAA,OAAA,EAAU,IAAI,CAAA,QAAA,CAAU,CAAC,CAAA;AAExE,EAAA,OAAO,QAAQ,kBAAmB,CAAA,KAAA,CAAM,CAAC,CAAA,IAAK,EAAE,CAAI,GAAA,EAAA;AACtD;AAEO,IAAM,YAAY,CACvB,IAAA,EACA,KACA,EAAA,OAAA,GAKI,EACK,KAAA;AACT,EAAI,IAAA,CAAC,UAAY,EAAA;AACf,IAAA;AAAA;AAEF,EAAI,IAAA,OAAO,aAAa,WAAa,EAAA;AACnC,IAAA;AAAA;AAGF,EAAA,IAAI,eAAe,CAAG,EAAA,IAAI,CAAI,CAAA,EAAA,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAEvD,EAAA,IAAI,QAAQ,OAAS,EAAA;AACnB,IAAI,IAAA,WAAA;AACJ,IAAI,IAAA,OAAO,OAAQ,CAAA,OAAA,KAAY,QAAU,EAAA;AACvC,MAAA,WAAA,uBAAkB,IAAK,EAAA;AACvB,MAAA,WAAA,CAAY,OAAQ,CAAA,WAAA,CAAY,OAAQ,EAAA,GAAI,QAAQ,OAAO,CAAA;AAAA,KACtD,MAAA;AACL,MAAA,WAAA,GAAc,OAAQ,CAAA,OAAA;AAAA;AAExB,IAAgB,YAAA,IAAA,CAAA,UAAA,EAAa,WAAY,CAAA,WAAA,EAAa,CAAA,CAAA;AAAA;AAGxD,EAAgB,YAAA,IAAA,CAAA,OAAA,EAAU,OAAQ,CAAA,IAAA,IAAQ,GAAG,CAAA,CAAA;AAE7C,EAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,IAAgB,YAAA,IAAA,CAAA,SAAA,EAAY,QAAQ,MAAM,CAAA,CAAA;AAAA;AAG5C,EAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,IAAgB,YAAA,IAAA,UAAA;AAAA;AAGlB,EAAA,QAAA,CAAS,MAAS,GAAA,YAAA;AACpB;AAEO,IAAM,YAAe,GAAA,CAAC,IAAc,EAAA,OAAA,GAA8C,EAAa,KAAA;AACpG,EAAI,IAAA,CAAC,UAAY,EAAA;AACf,IAAA;AAAA;AAEF,EAAA,SAAA,CAAU,MAAM,EAAI,EAAA,EAAE,GAAG,OAAS,EAAA,OAAA,EAAS,IAAI,CAAA;AACjD","file":"cookie-utils.cjs","sourcesContent":["import { getCookie } from './cookie-utils';\n\n/**\n * 호스트명에서 서브도메인을 추출합니다.\n * @param hostname 호스트명\n * @returns 서브도메인 (예: nxl-dsp-dev)\n */\nexport const getSubdomain = (hostname: string): string => {\n if (!hostname || hostname === 'localhost' || hostname === '127.0.0.1') {\n return '';\n }\n\n const parts = hostname.split('.');\n\n // 최소 3개 부분이 있어야 서브도메인 존재 (subdomain.domain.com)\n if (parts.length < 3) {\n return '';\n }\n\n // 첫 번째 부분이 서브도메인\n return parts[0] ?? '';\n};\n\n/**\n * 호스트명을 기반으로 환경을 판단합니다.\n * @param hostname 호스트명\n * @returns 환경 구분 문자열 ('local' | 'dev' | 'stg' | 'prd')\n */\nexport const getEnvironmentFromHostname = (hostname: string): 'local' | 'dev' | 'stg' | 'prd' => {\n const debugModeEnv = getCookie('dsp-debug-mode-env')?.toLowerCase();\n if (debugModeEnv) {\n return debugModeEnv as 'local' | 'dev' | 'stg' | 'prd';\n }\n const subDomain = getSubdomain(hostname);\n\n // localhost 판단\n if (hostname === 'localhost' || hostname === '127.0.0.1' || hostname.startsWith('localhost')) {\n return 'local';\n }\n\n // dev 환경 판단\n if (subDomain.includes(`dev`)) {\n return 'dev';\n }\n\n // stg 환경 판단\n if (subDomain.includes('stg')) {\n return 'stg';\n }\n\n // 기본 운영\n return 'prd';\n};\n\n/**\n * @see https://github.com/storybookjs/storybook/issues/32028#issuecomment-3298982086\n * @note 스토리북에서 버그로인해 window객체를 정상적으로 탐지하지 못하는 이슈우회\n */\nexport const isClient = () => {\n try {\n return !!window;\n } catch {\n return false;\n }\n};\n\n// window.isStorybookEnv 접근을 위한 타입캐스팅\ndeclare const window: Window & { isStorybookEnv?: boolean };\n/**\n * 현재 실행 환경이 Storybook인지 확인하는 함수\n *\n * 사용 전, `viteFinal` 설정에서 `window.isStorybookEnv`를 `true`로 정의해야 정상 동작합니다.\n *\n * 예시:\n * ```ts\n * const config: StorybookConfig = {\n * viteFinal: (config) => {\n * // window.isStorybookEnv를 true로 설정 (boolean 값으로 처리됨)\n * config.define = {\n * ...config.define,\n * 'window.isStorybookEnv': 'true',\n * };\n *\n * return config;\n * },\n * };\n * ```\n */\nexport const isStorybookEnv = () => {\n try {\n return window.isStorybookEnv === true;\n } catch {\n // window가 존재하지 않는 등 예외 상황에서는 false 반환\n return false;\n }\n};\n\n/**\n * 현재 업무구분 코드 구하기\n * 원칙: pathname의 첫 번째가 업무구분코드를 사용할 경우 해당 값을 반환\n * @returns\n */\nexport const getBusinessWorkDivisionCode = () => {\n return location.pathname.split('/')[1] ?? '';\n};\n\n/**\n * @description storybook에서 동작을 고려하여 수정한 버전\n * @returns\n */\nexport const getServicePath = () => {\n if (typeof window.isStorybookEnv === 'boolean') {\n return '';\n } else {\n return `/${getBusinessWorkDivisionCode()}`;\n }\n};\n\n/**\n * 환경에 맞는 API 호스트명을 반환합니다.\n * 호스트명을 강제하고 싶으면 두 번째 파라미터로 넘기세요.\n * @param currentHostname\n * @param forceApiHostName\n * @returns\n */\n\nexport const getApiHostNameFromEnvironment = (currentHostname: string, forceApiHostName?: string) => {\n if (forceApiHostName) {\n return forceApiHostName;\n }\n\n const environment = getEnvironmentFromHostname(currentHostname);\n\n switch (environment) {\n case 'dev':\n return `https://nxl-dsp-dev.hanwhalife.com`;\n\n case 'local':\n case 'stg':\n return `https://nxl-dsp-stg.hanwhalife.com`;\n\n case 'prd':\n return `https://nxl-dsp.hanwhalife.com`;\n\n default:\n console.warn('DSP API environment is not defined');\n\n return '';\n }\n};\n\n/**\n * 환경에 맞는 CDN 호스트명을 반환합니다.\n * 호스트명을 강제하고 싶으면 두 번째 파라미터로 넘기세요.\n * @param currentHostname\n * @param forceApiHostName\n * @returns\n */\nexport const getCdnHostNameFromEnvironment = (currentHostname: string, forceApiHostName?: string) => {\n if (!isClient()) {\n return '';\n }\n\n if (forceApiHostName) {\n return forceApiHostName;\n }\n\n const environment = getEnvironmentFromHostname(currentHostname);\n\n switch (environment) {\n case 'dev':\n return `https://dev-dsp-static.hanwhalife.com`;\n\n case 'local':\n case 'stg':\n return `https://stg-dsp-static.hanwhalife.com`;\n\n case 'prd':\n return `https://dsp-static.hanwhalife.com'`;\n\n default:\n console.warn('DSP environment is not defined');\n\n return '';\n }\n};\n\n/**\n * @description\n * 환경에 맞는 비정형PI 호스트명을 반환합니다.\n * client side에서 사용하는 함수입니다.\n * @param serviceCode dea,dis,dcm\n * @param hostname window.location.hostname\n * @returns\n */\nexport const getDudApiBasePathFromEnvironment = (hostname?: string) => {\n if (!isClient()) {\n return '';\n }\n const environment = getEnvironmentFromHostname(hostname || location.hostname);\n\n switch (environment) {\n /**\n * local에서 호출시, rewrite동작을 위해 상대주소를 호출합니다.\n * (cors이슈 해결을 위해 필수)\n */\n case 'local':\n return `${getServicePath()}/api/dud`;\n /**\n * local 이 아닌 환경에서는 전체주소를 호출합니다.\n */\n case 'dev':\n return `https://dsp-dud-dev.hanwhalife.com:10101/api`;\n\n case 'stg':\n return `https://dsp-dud-stg.hanwhalife.com:10102/api`;\n\n case 'prd':\n return `https://dsp-dud.hanwhalife.com/api`;\n\n default:\n console.warn('DUD API environment is not defined');\n\n return '';\n }\n};\n\n/**\n * @description\n * 환경에 맞는 Dsp 호스트명을 반환합니다.\n * client side에서 사용하는 함수입니다.\n * @param serviceCodeTo dea,dis 같은 api서버명\n * @param hostname window.location.hostname\n * @returns\n */\nexport const getDspApiBasePathFromEnvironment = (serviceCodeTo: string, hostname?: string) => {\n if (!isClient()) {\n return '';\n }\n const environment = getEnvironmentFromHostname(hostname || location.hostname);\n\n switch (environment) {\n /**\n * local에서 호출시, rewrite동작을 위해 상대주소를 호출합니다.\n * (cors이슈 해결을 위해 필수)\n */\n case 'local':\n return `${getServicePath()}/api/${serviceCodeTo}`;\n /**\n * local 이 아닌 환경에서는 전체주소를 호출합니다.\n */\n case 'dev':\n return `https://nxl-dsp-dev.hanwhalife.com/api/${serviceCodeTo}`;\n\n case 'stg':\n return `https://nxl-dsp-stg.hanwhalife.com/api/${serviceCodeTo}`;\n\n case 'prd':\n return `https://nxl-dsp.hanwhalife.com/api/${serviceCodeTo}`;\n\n default:\n console.warn('DSP API environment is not defined');\n\n return '';\n }\n};\n\n\n/**\n * @description\n * 환경에 맞는 NLC 호스트명을 반환합니다.\n * client side에서 사용하는 함수입니다.\n * @param hostname window.location.hostname\n * @returns\n */\nexport const getNlcHostFromEnvironment = (hostname?: string) => {\n if (!isClient()) {\n return '';\n }\n\n const environment = getEnvironmentFromHostname(hostname || location.hostname);\n\n switch (environment) {\n case 'local':\n return `https://nxl-nlc-stg.hanwhalife.com`;\n\n case 'dev':\n return `https://nxl-nlc-dev.hanwhalife.com`;\n\n case 'stg':\n return `https://nxl-nlc-stg.hanwhalife.com`;\n\n case 'prd':\n return `https://nxl-nlc.hanwhalife.com`;\n\n default:\n console.warn('NLC environment is not defined');\n\n return '';\n }\n};\n\n","import { isClient } from \"./environment-utils\";\n\nexport const getCookie = (name: string): string => {\n if (!isClient()) {\n return '';\n }\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 (!isClient()) {\n return;\n }\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 if (!isClient()) {\n return;\n }\n setCookie(name, '', { ...options, expires: -1 });\n};\n"]}
@@ -1,5 +1,17 @@
1
+ // src/utils/environment-utils.ts
2
+ var isClient = () => {
3
+ try {
4
+ return !!window;
5
+ } catch {
6
+ return false;
7
+ }
8
+ };
9
+
1
10
  // src/utils/cookie-utils.ts
2
11
  var getCookie = (name) => {
12
+ if (!isClient()) {
13
+ return "";
14
+ }
3
15
  if (typeof document === "undefined") {
4
16
  return "";
5
17
  }
@@ -7,6 +19,9 @@ var getCookie = (name) => {
7
19
  return match ? decodeURIComponent(match[2] || "") : "";
8
20
  };
9
21
  var setCookie = (name, value, options = {}) => {
22
+ if (!isClient()) {
23
+ return;
24
+ }
10
25
  if (typeof document === "undefined") {
11
26
  return;
12
27
  }
@@ -31,6 +46,9 @@ var setCookie = (name, value, options = {}) => {
31
46
  document.cookie = cookieString;
32
47
  };
33
48
  var deleteCookie = (name, options = {}) => {
49
+ if (!isClient()) {
50
+ return;
51
+ }
34
52
  setCookie(name, "", { ...options, expires: -1 });
35
53
  };
36
54
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/cookie-utils.ts"],"names":[],"mappings":";AAAa,IAAA,SAAA,GAAY,CAAC,IAAyB,KAAA;AACjD,EAAI,IAAA,OAAO,aAAa,WAAa,EAAA;AACnC,IAAO,OAAA,EAAA;AAAA;AAET,EAAM,MAAA,KAAA,GAAQ,SAAS,MAAO,CAAA,KAAA,CAAM,IAAI,MAAO,CAAA,CAAA,OAAA,EAAU,IAAI,CAAA,QAAA,CAAU,CAAC,CAAA;AAExE,EAAA,OAAO,QAAQ,kBAAmB,CAAA,KAAA,CAAM,CAAC,CAAA,IAAK,EAAE,CAAI,GAAA,EAAA;AACtD;AAEO,IAAM,YAAY,CACvB,IAAA,EACA,KACA,EAAA,OAAA,GAKI,EACK,KAAA;AACT,EAAI,IAAA,OAAO,aAAa,WAAa,EAAA;AACnC,IAAA;AAAA;AAGF,EAAA,IAAI,eAAe,CAAG,EAAA,IAAI,CAAI,CAAA,EAAA,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAEvD,EAAA,IAAI,QAAQ,OAAS,EAAA;AACnB,IAAI,IAAA,WAAA;AACJ,IAAI,IAAA,OAAO,OAAQ,CAAA,OAAA,KAAY,QAAU,EAAA;AACvC,MAAA,WAAA,uBAAkB,IAAK,EAAA;AACvB,MAAA,WAAA,CAAY,OAAQ,CAAA,WAAA,CAAY,OAAQ,EAAA,GAAI,QAAQ,OAAO,CAAA;AAAA,KACtD,MAAA;AACL,MAAA,WAAA,GAAc,OAAQ,CAAA,OAAA;AAAA;AAExB,IAAgB,YAAA,IAAA,CAAA,UAAA,EAAa,WAAY,CAAA,WAAA,EAAa,CAAA,CAAA;AAAA;AAGxD,EAAgB,YAAA,IAAA,CAAA,OAAA,EAAU,OAAQ,CAAA,IAAA,IAAQ,GAAG,CAAA,CAAA;AAE7C,EAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,IAAgB,YAAA,IAAA,CAAA,SAAA,EAAY,QAAQ,MAAM,CAAA,CAAA;AAAA;AAG5C,EAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,IAAgB,YAAA,IAAA,UAAA;AAAA;AAGlB,EAAA,QAAA,CAAS,MAAS,GAAA,YAAA;AACpB;AAEO,IAAM,YAAe,GAAA,CAAC,IAAc,EAAA,OAAA,GAA8C,EAAa,KAAA;AACpG,EAAA,SAAA,CAAU,MAAM,EAAI,EAAA,EAAE,GAAG,OAAS,EAAA,OAAA,EAAS,IAAI,CAAA;AACjD","file":"cookie-utils.js","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"]}
1
+ {"version":3,"sources":["../../src/utils/environment-utils.ts","../../src/utils/cookie-utils.ts"],"names":[],"mappings":";AA0DO,IAAM,WAAW,MAAM;AAC5B,EAAI,IAAA;AACF,IAAA,OAAO,CAAC,CAAC,MAAA;AAAA,GACH,CAAA,MAAA;AACN,IAAO,OAAA,KAAA;AAAA;AAEX,CAAA;;;AC9Da,IAAA,SAAA,GAAY,CAAC,IAAyB,KAAA;AACjD,EAAI,IAAA,CAAC,UAAY,EAAA;AACf,IAAO,OAAA,EAAA;AAAA;AAET,EAAI,IAAA,OAAO,aAAa,WAAa,EAAA;AACnC,IAAO,OAAA,EAAA;AAAA;AAET,EAAM,MAAA,KAAA,GAAQ,SAAS,MAAO,CAAA,KAAA,CAAM,IAAI,MAAO,CAAA,CAAA,OAAA,EAAU,IAAI,CAAA,QAAA,CAAU,CAAC,CAAA;AAExE,EAAA,OAAO,QAAQ,kBAAmB,CAAA,KAAA,CAAM,CAAC,CAAA,IAAK,EAAE,CAAI,GAAA,EAAA;AACtD;AAEO,IAAM,YAAY,CACvB,IAAA,EACA,KACA,EAAA,OAAA,GAKI,EACK,KAAA;AACT,EAAI,IAAA,CAAC,UAAY,EAAA;AACf,IAAA;AAAA;AAEF,EAAI,IAAA,OAAO,aAAa,WAAa,EAAA;AACnC,IAAA;AAAA;AAGF,EAAA,IAAI,eAAe,CAAG,EAAA,IAAI,CAAI,CAAA,EAAA,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAEvD,EAAA,IAAI,QAAQ,OAAS,EAAA;AACnB,IAAI,IAAA,WAAA;AACJ,IAAI,IAAA,OAAO,OAAQ,CAAA,OAAA,KAAY,QAAU,EAAA;AACvC,MAAA,WAAA,uBAAkB,IAAK,EAAA;AACvB,MAAA,WAAA,CAAY,OAAQ,CAAA,WAAA,CAAY,OAAQ,EAAA,GAAI,QAAQ,OAAO,CAAA;AAAA,KACtD,MAAA;AACL,MAAA,WAAA,GAAc,OAAQ,CAAA,OAAA;AAAA;AAExB,IAAgB,YAAA,IAAA,CAAA,UAAA,EAAa,WAAY,CAAA,WAAA,EAAa,CAAA,CAAA;AAAA;AAGxD,EAAgB,YAAA,IAAA,CAAA,OAAA,EAAU,OAAQ,CAAA,IAAA,IAAQ,GAAG,CAAA,CAAA;AAE7C,EAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,IAAgB,YAAA,IAAA,CAAA,SAAA,EAAY,QAAQ,MAAM,CAAA,CAAA;AAAA;AAG5C,EAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,IAAgB,YAAA,IAAA,UAAA;AAAA;AAGlB,EAAA,QAAA,CAAS,MAAS,GAAA,YAAA;AACpB;AAEO,IAAM,YAAe,GAAA,CAAC,IAAc,EAAA,OAAA,GAA8C,EAAa,KAAA;AACpG,EAAI,IAAA,CAAC,UAAY,EAAA;AACf,IAAA;AAAA;AAEF,EAAA,SAAA,CAAU,MAAM,EAAI,EAAA,EAAE,GAAG,OAAS,EAAA,OAAA,EAAS,IAAI,CAAA;AACjD","file":"cookie-utils.js","sourcesContent":["import { getCookie } from './cookie-utils';\n\n/**\n * 호스트명에서 서브도메인을 추출합니다.\n * @param hostname 호스트명\n * @returns 서브도메인 (예: nxl-dsp-dev)\n */\nexport const getSubdomain = (hostname: string): string => {\n if (!hostname || hostname === 'localhost' || hostname === '127.0.0.1') {\n return '';\n }\n\n const parts = hostname.split('.');\n\n // 최소 3개 부분이 있어야 서브도메인 존재 (subdomain.domain.com)\n if (parts.length < 3) {\n return '';\n }\n\n // 첫 번째 부분이 서브도메인\n return parts[0] ?? '';\n};\n\n/**\n * 호스트명을 기반으로 환경을 판단합니다.\n * @param hostname 호스트명\n * @returns 환경 구분 문자열 ('local' | 'dev' | 'stg' | 'prd')\n */\nexport const getEnvironmentFromHostname = (hostname: string): 'local' | 'dev' | 'stg' | 'prd' => {\n const debugModeEnv = getCookie('dsp-debug-mode-env')?.toLowerCase();\n if (debugModeEnv) {\n return debugModeEnv as 'local' | 'dev' | 'stg' | 'prd';\n }\n const subDomain = getSubdomain(hostname);\n\n // localhost 판단\n if (hostname === 'localhost' || hostname === '127.0.0.1' || hostname.startsWith('localhost')) {\n return 'local';\n }\n\n // dev 환경 판단\n if (subDomain.includes(`dev`)) {\n return 'dev';\n }\n\n // stg 환경 판단\n if (subDomain.includes('stg')) {\n return 'stg';\n }\n\n // 기본 운영\n return 'prd';\n};\n\n/**\n * @see https://github.com/storybookjs/storybook/issues/32028#issuecomment-3298982086\n * @note 스토리북에서 버그로인해 window객체를 정상적으로 탐지하지 못하는 이슈우회\n */\nexport const isClient = () => {\n try {\n return !!window;\n } catch {\n return false;\n }\n};\n\n// window.isStorybookEnv 접근을 위한 타입캐스팅\ndeclare const window: Window & { isStorybookEnv?: boolean };\n/**\n * 현재 실행 환경이 Storybook인지 확인하는 함수\n *\n * 사용 전, `viteFinal` 설정에서 `window.isStorybookEnv`를 `true`로 정의해야 정상 동작합니다.\n *\n * 예시:\n * ```ts\n * const config: StorybookConfig = {\n * viteFinal: (config) => {\n * // window.isStorybookEnv를 true로 설정 (boolean 값으로 처리됨)\n * config.define = {\n * ...config.define,\n * 'window.isStorybookEnv': 'true',\n * };\n *\n * return config;\n * },\n * };\n * ```\n */\nexport const isStorybookEnv = () => {\n try {\n return window.isStorybookEnv === true;\n } catch {\n // window가 존재하지 않는 등 예외 상황에서는 false 반환\n return false;\n }\n};\n\n/**\n * 현재 업무구분 코드 구하기\n * 원칙: pathname의 첫 번째가 업무구분코드를 사용할 경우 해당 값을 반환\n * @returns\n */\nexport const getBusinessWorkDivisionCode = () => {\n return location.pathname.split('/')[1] ?? '';\n};\n\n/**\n * @description storybook에서 동작을 고려하여 수정한 버전\n * @returns\n */\nexport const getServicePath = () => {\n if (typeof window.isStorybookEnv === 'boolean') {\n return '';\n } else {\n return `/${getBusinessWorkDivisionCode()}`;\n }\n};\n\n/**\n * 환경에 맞는 API 호스트명을 반환합니다.\n * 호스트명을 강제하고 싶으면 두 번째 파라미터로 넘기세요.\n * @param currentHostname\n * @param forceApiHostName\n * @returns\n */\n\nexport const getApiHostNameFromEnvironment = (currentHostname: string, forceApiHostName?: string) => {\n if (forceApiHostName) {\n return forceApiHostName;\n }\n\n const environment = getEnvironmentFromHostname(currentHostname);\n\n switch (environment) {\n case 'dev':\n return `https://nxl-dsp-dev.hanwhalife.com`;\n\n case 'local':\n case 'stg':\n return `https://nxl-dsp-stg.hanwhalife.com`;\n\n case 'prd':\n return `https://nxl-dsp.hanwhalife.com`;\n\n default:\n console.warn('DSP API environment is not defined');\n\n return '';\n }\n};\n\n/**\n * 환경에 맞는 CDN 호스트명을 반환합니다.\n * 호스트명을 강제하고 싶으면 두 번째 파라미터로 넘기세요.\n * @param currentHostname\n * @param forceApiHostName\n * @returns\n */\nexport const getCdnHostNameFromEnvironment = (currentHostname: string, forceApiHostName?: string) => {\n if (!isClient()) {\n return '';\n }\n\n if (forceApiHostName) {\n return forceApiHostName;\n }\n\n const environment = getEnvironmentFromHostname(currentHostname);\n\n switch (environment) {\n case 'dev':\n return `https://dev-dsp-static.hanwhalife.com`;\n\n case 'local':\n case 'stg':\n return `https://stg-dsp-static.hanwhalife.com`;\n\n case 'prd':\n return `https://dsp-static.hanwhalife.com'`;\n\n default:\n console.warn('DSP environment is not defined');\n\n return '';\n }\n};\n\n/**\n * @description\n * 환경에 맞는 비정형PI 호스트명을 반환합니다.\n * client side에서 사용하는 함수입니다.\n * @param serviceCode dea,dis,dcm\n * @param hostname window.location.hostname\n * @returns\n */\nexport const getDudApiBasePathFromEnvironment = (hostname?: string) => {\n if (!isClient()) {\n return '';\n }\n const environment = getEnvironmentFromHostname(hostname || location.hostname);\n\n switch (environment) {\n /**\n * local에서 호출시, rewrite동작을 위해 상대주소를 호출합니다.\n * (cors이슈 해결을 위해 필수)\n */\n case 'local':\n return `${getServicePath()}/api/dud`;\n /**\n * local 이 아닌 환경에서는 전체주소를 호출합니다.\n */\n case 'dev':\n return `https://dsp-dud-dev.hanwhalife.com:10101/api`;\n\n case 'stg':\n return `https://dsp-dud-stg.hanwhalife.com:10102/api`;\n\n case 'prd':\n return `https://dsp-dud.hanwhalife.com/api`;\n\n default:\n console.warn('DUD API environment is not defined');\n\n return '';\n }\n};\n\n/**\n * @description\n * 환경에 맞는 Dsp 호스트명을 반환합니다.\n * client side에서 사용하는 함수입니다.\n * @param serviceCodeTo dea,dis 같은 api서버명\n * @param hostname window.location.hostname\n * @returns\n */\nexport const getDspApiBasePathFromEnvironment = (serviceCodeTo: string, hostname?: string) => {\n if (!isClient()) {\n return '';\n }\n const environment = getEnvironmentFromHostname(hostname || location.hostname);\n\n switch (environment) {\n /**\n * local에서 호출시, rewrite동작을 위해 상대주소를 호출합니다.\n * (cors이슈 해결을 위해 필수)\n */\n case 'local':\n return `${getServicePath()}/api/${serviceCodeTo}`;\n /**\n * local 이 아닌 환경에서는 전체주소를 호출합니다.\n */\n case 'dev':\n return `https://nxl-dsp-dev.hanwhalife.com/api/${serviceCodeTo}`;\n\n case 'stg':\n return `https://nxl-dsp-stg.hanwhalife.com/api/${serviceCodeTo}`;\n\n case 'prd':\n return `https://nxl-dsp.hanwhalife.com/api/${serviceCodeTo}`;\n\n default:\n console.warn('DSP API environment is not defined');\n\n return '';\n }\n};\n\n\n/**\n * @description\n * 환경에 맞는 NLC 호스트명을 반환합니다.\n * client side에서 사용하는 함수입니다.\n * @param hostname window.location.hostname\n * @returns\n */\nexport const getNlcHostFromEnvironment = (hostname?: string) => {\n if (!isClient()) {\n return '';\n }\n\n const environment = getEnvironmentFromHostname(hostname || location.hostname);\n\n switch (environment) {\n case 'local':\n return `https://nxl-nlc-stg.hanwhalife.com`;\n\n case 'dev':\n return `https://nxl-nlc-dev.hanwhalife.com`;\n\n case 'stg':\n return `https://nxl-nlc-stg.hanwhalife.com`;\n\n case 'prd':\n return `https://nxl-nlc.hanwhalife.com`;\n\n default:\n console.warn('NLC environment is not defined');\n\n return '';\n }\n};\n\n","import { isClient } from \"./environment-utils\";\n\nexport const getCookie = (name: string): string => {\n if (!isClient()) {\n return '';\n }\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 (!isClient()) {\n return;\n }\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 if (!isClient()) {\n return;\n }\n setCookie(name, '', { ...options, expires: -1 });\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"]}
@@ -2,6 +2,9 @@
2
2
 
3
3
  // src/utils/cookie-utils.ts
4
4
  var getCookie = (name) => {
5
+ if (!isClient()) {
6
+ return "";
7
+ }
5
8
  if (typeof document === "undefined") {
6
9
  return "";
7
10
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/cookie-utils.ts","../../src/utils/environment-utils.ts"],"names":[],"mappings":"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","file":"environment-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\n/**\n * 호스트명에서 서브도메인을 추출합니다.\n * @param hostname 호스트명\n * @returns 서브도메인 (예: nxl-dsp-dev)\n */\nexport const getSubdomain = (hostname: string): string => {\n if (!hostname || hostname === 'localhost' || hostname === '127.0.0.1') {\n return '';\n }\n\n const parts = hostname.split('.');\n\n // 최소 3개 부분이 있어야 서브도메인 존재 (subdomain.domain.com)\n if (parts.length < 3) {\n return '';\n }\n\n // 첫 번째 부분이 서브도메인\n return parts[0] ?? '';\n};\n\n/**\n * 호스트명을 기반으로 환경을 판단합니다.\n * @param hostname 호스트명\n * @returns 환경 구분 문자열 ('local' | 'dev' | 'stg' | 'prd')\n */\nexport const getEnvironmentFromHostname = (hostname: string): 'local' | 'dev' | 'stg' | 'prd' => {\n const debugModeEnv = getCookie('dsp-debug-mode-env')?.toLowerCase();\n if (debugModeEnv) {\n return debugModeEnv as 'local' | 'dev' | 'stg' | 'prd';\n }\n const subDomain = getSubdomain(hostname);\n\n // localhost 판단\n if (hostname === 'localhost' || hostname === '127.0.0.1' || hostname.startsWith('localhost')) {\n return 'local';\n }\n\n // dev 환경 판단\n if (subDomain.includes(`dev`)) {\n return 'dev';\n }\n\n // stg 환경 판단\n if (subDomain.includes('stg')) {\n return 'stg';\n }\n\n // 기본 운영\n return 'prd';\n};\n\n/**\n * @see https://github.com/storybookjs/storybook/issues/32028#issuecomment-3298982086\n * @note 스토리북에서 버그로인해 window객체를 정상적으로 탐지하지 못하는 이슈우회\n */\nexport const isClient = () => {\n try {\n return !!window;\n } catch {\n return false;\n }\n};\n\n// window.isStorybookEnv 접근을 위한 타입캐스팅\ndeclare const window: Window & { isStorybookEnv?: boolean };\n/**\n * 현재 실행 환경이 Storybook인지 확인하는 함수\n *\n * 사용 전, `viteFinal` 설정에서 `window.isStorybookEnv`를 `true`로 정의해야 정상 동작합니다.\n *\n * 예시:\n * ```ts\n * const config: StorybookConfig = {\n * viteFinal: (config) => {\n * // window.isStorybookEnv를 true로 설정 (boolean 값으로 처리됨)\n * config.define = {\n * ...config.define,\n * 'window.isStorybookEnv': 'true',\n * };\n *\n * return config;\n * },\n * };\n * ```\n */\nexport const isStorybookEnv = () => {\n try {\n return window.isStorybookEnv === true;\n } catch {\n // window가 존재하지 않는 등 예외 상황에서는 false 반환\n return false;\n }\n};\n\n/**\n * 현재 업무구분 코드 구하기\n * 원칙: pathname의 첫 번째가 업무구분코드를 사용할 경우 해당 값을 반환\n * @returns\n */\nexport const getBusinessWorkDivisionCode = () => {\n return location.pathname.split('/')[1] ?? '';\n};\n\n/**\n * @description storybook에서 동작을 고려하여 수정한 버전\n * @returns\n */\nexport const getServicePath = () => {\n if (typeof window.isStorybookEnv === 'boolean') {\n return '';\n } else {\n return `/${getBusinessWorkDivisionCode()}`;\n }\n};\n\n/**\n * 환경에 맞는 API 호스트명을 반환합니다.\n * 호스트명을 강제하고 싶으면 두 번째 파라미터로 넘기세요.\n * @param currentHostname\n * @param forceApiHostName\n * @returns\n */\n\nexport const getApiHostNameFromEnvironment = (currentHostname: string, forceApiHostName?: string) => {\n if (forceApiHostName) {\n return forceApiHostName;\n }\n\n const environment = getEnvironmentFromHostname(currentHostname);\n\n switch (environment) {\n case 'dev':\n return `https://nxl-dsp-dev.hanwhalife.com`;\n\n case 'local':\n case 'stg':\n return `https://nxl-dsp-stg.hanwhalife.com`;\n\n case 'prd':\n return `https://nxl-dsp.hanwhalife.com`;\n\n default:\n console.warn('DSP API environment is not defined');\n\n return '';\n }\n};\n\n/**\n * 환경에 맞는 CDN 호스트명을 반환합니다.\n * 호스트명을 강제하고 싶으면 두 번째 파라미터로 넘기세요.\n * @param currentHostname\n * @param forceApiHostName\n * @returns\n */\nexport const getCdnHostNameFromEnvironment = (currentHostname: string, forceApiHostName?: string) => {\n if (!isClient()) {\n return '';\n }\n\n if (forceApiHostName) {\n return forceApiHostName;\n }\n\n const environment = getEnvironmentFromHostname(currentHostname);\n\n switch (environment) {\n case 'dev':\n return `https://dev-dsp-static.hanwhalife.com`;\n\n case 'local':\n case 'stg':\n return `https://stg-dsp-static.hanwhalife.com`;\n\n case 'prd':\n return `https://dsp-static.hanwhalife.com'`;\n\n default:\n console.warn('DSP environment is not defined');\n\n return '';\n }\n};\n\n/**\n * @description\n * 환경에 맞는 비정형PI 호스트명을 반환합니다.\n * client side에서 사용하는 함수입니다.\n * @param serviceCode dea,dis,dcm\n * @param hostname window.location.hostname\n * @returns\n */\nexport const getDudApiBasePathFromEnvironment = (hostname?: string) => {\n if (!isClient()) {\n return '';\n }\n const environment = getEnvironmentFromHostname(hostname || location.hostname);\n\n switch (environment) {\n /**\n * local에서 호출시, rewrite동작을 위해 상대주소를 호출합니다.\n * (cors이슈 해결을 위해 필수)\n */\n case 'local':\n return `${getServicePath()}/api/dud`;\n /**\n * local 이 아닌 환경에서는 전체주소를 호출합니다.\n */\n case 'dev':\n return `https://dsp-dud-dev.hanwhalife.com:10101/api`;\n\n case 'stg':\n return `https://dsp-dud-stg.hanwhalife.com:10102/api`;\n\n case 'prd':\n return `https://dsp-dud.hanwhalife.com/api`;\n\n default:\n console.warn('DUD API environment is not defined');\n\n return '';\n }\n};\n\n/**\n * @description\n * 환경에 맞는 Dsp 호스트명을 반환합니다.\n * client side에서 사용하는 함수입니다.\n * @param serviceCodeTo dea,dis 같은 api서버명\n * @param hostname window.location.hostname\n * @returns\n */\nexport const getDspApiBasePathFromEnvironment = (serviceCodeTo: string, hostname?: string) => {\n if (!isClient()) {\n return '';\n }\n const environment = getEnvironmentFromHostname(hostname || location.hostname);\n\n switch (environment) {\n /**\n * local에서 호출시, rewrite동작을 위해 상대주소를 호출합니다.\n * (cors이슈 해결을 위해 필수)\n */\n case 'local':\n return `${getServicePath()}/api/${serviceCodeTo}`;\n /**\n * local 이 아닌 환경에서는 전체주소를 호출합니다.\n */\n case 'dev':\n return `https://nxl-dsp-dev.hanwhalife.com/api/${serviceCodeTo}`;\n\n case 'stg':\n return `https://nxl-dsp-stg.hanwhalife.com/api/${serviceCodeTo}`;\n\n case 'prd':\n return `https://nxl-dsp.hanwhalife.com/api/${serviceCodeTo}`;\n\n default:\n console.warn('DSP API environment is not defined');\n\n return '';\n }\n};\n\n\n/**\n * @description\n * 환경에 맞는 NLC 호스트명을 반환합니다.\n * client side에서 사용하는 함수입니다.\n * @param hostname window.location.hostname\n * @returns\n */\nexport const getNlcHostFromEnvironment = (hostname?: string) => {\n if (!isClient()) {\n return '';\n }\n\n const environment = getEnvironmentFromHostname(hostname || location.hostname);\n\n switch (environment) {\n case 'local':\n return `https://nxl-nlc-stg.hanwhalife.com`;\n\n case 'dev':\n return `https://nxl-nlc-dev.hanwhalife.com`;\n\n case 'stg':\n return `https://nxl-nlc-stg.hanwhalife.com`;\n\n case 'prd':\n return `https://nxl-nlc.hanwhalife.com`;\n\n default:\n console.warn('NLC environment is not defined');\n\n return '';\n }\n};\n\n"]}
1
+ {"version":3,"sources":["../../src/utils/cookie-utils.ts","../../src/utils/environment-utils.ts"],"names":[],"mappings":"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","file":"environment-utils.cjs","sourcesContent":["import { isClient } from \"./environment-utils\";\n\nexport const getCookie = (name: string): string => {\n if (!isClient()) {\n return '';\n }\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 (!isClient()) {\n return;\n }\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 if (!isClient()) {\n return;\n }\n setCookie(name, '', { ...options, expires: -1 });\n};\n","import { getCookie } from './cookie-utils';\n\n/**\n * 호스트명에서 서브도메인을 추출합니다.\n * @param hostname 호스트명\n * @returns 서브도메인 (예: nxl-dsp-dev)\n */\nexport const getSubdomain = (hostname: string): string => {\n if (!hostname || hostname === 'localhost' || hostname === '127.0.0.1') {\n return '';\n }\n\n const parts = hostname.split('.');\n\n // 최소 3개 부분이 있어야 서브도메인 존재 (subdomain.domain.com)\n if (parts.length < 3) {\n return '';\n }\n\n // 첫 번째 부분이 서브도메인\n return parts[0] ?? '';\n};\n\n/**\n * 호스트명을 기반으로 환경을 판단합니다.\n * @param hostname 호스트명\n * @returns 환경 구분 문자열 ('local' | 'dev' | 'stg' | 'prd')\n */\nexport const getEnvironmentFromHostname = (hostname: string): 'local' | 'dev' | 'stg' | 'prd' => {\n const debugModeEnv = getCookie('dsp-debug-mode-env')?.toLowerCase();\n if (debugModeEnv) {\n return debugModeEnv as 'local' | 'dev' | 'stg' | 'prd';\n }\n const subDomain = getSubdomain(hostname);\n\n // localhost 판단\n if (hostname === 'localhost' || hostname === '127.0.0.1' || hostname.startsWith('localhost')) {\n return 'local';\n }\n\n // dev 환경 판단\n if (subDomain.includes(`dev`)) {\n return 'dev';\n }\n\n // stg 환경 판단\n if (subDomain.includes('stg')) {\n return 'stg';\n }\n\n // 기본 운영\n return 'prd';\n};\n\n/**\n * @see https://github.com/storybookjs/storybook/issues/32028#issuecomment-3298982086\n * @note 스토리북에서 버그로인해 window객체를 정상적으로 탐지하지 못하는 이슈우회\n */\nexport const isClient = () => {\n try {\n return !!window;\n } catch {\n return false;\n }\n};\n\n// window.isStorybookEnv 접근을 위한 타입캐스팅\ndeclare const window: Window & { isStorybookEnv?: boolean };\n/**\n * 현재 실행 환경이 Storybook인지 확인하는 함수\n *\n * 사용 전, `viteFinal` 설정에서 `window.isStorybookEnv`를 `true`로 정의해야 정상 동작합니다.\n *\n * 예시:\n * ```ts\n * const config: StorybookConfig = {\n * viteFinal: (config) => {\n * // window.isStorybookEnv를 true로 설정 (boolean 값으로 처리됨)\n * config.define = {\n * ...config.define,\n * 'window.isStorybookEnv': 'true',\n * };\n *\n * return config;\n * },\n * };\n * ```\n */\nexport const isStorybookEnv = () => {\n try {\n return window.isStorybookEnv === true;\n } catch {\n // window가 존재하지 않는 등 예외 상황에서는 false 반환\n return false;\n }\n};\n\n/**\n * 현재 업무구분 코드 구하기\n * 원칙: pathname의 첫 번째가 업무구분코드를 사용할 경우 해당 값을 반환\n * @returns\n */\nexport const getBusinessWorkDivisionCode = () => {\n return location.pathname.split('/')[1] ?? '';\n};\n\n/**\n * @description storybook에서 동작을 고려하여 수정한 버전\n * @returns\n */\nexport const getServicePath = () => {\n if (typeof window.isStorybookEnv === 'boolean') {\n return '';\n } else {\n return `/${getBusinessWorkDivisionCode()}`;\n }\n};\n\n/**\n * 환경에 맞는 API 호스트명을 반환합니다.\n * 호스트명을 강제하고 싶으면 두 번째 파라미터로 넘기세요.\n * @param currentHostname\n * @param forceApiHostName\n * @returns\n */\n\nexport const getApiHostNameFromEnvironment = (currentHostname: string, forceApiHostName?: string) => {\n if (forceApiHostName) {\n return forceApiHostName;\n }\n\n const environment = getEnvironmentFromHostname(currentHostname);\n\n switch (environment) {\n case 'dev':\n return `https://nxl-dsp-dev.hanwhalife.com`;\n\n case 'local':\n case 'stg':\n return `https://nxl-dsp-stg.hanwhalife.com`;\n\n case 'prd':\n return `https://nxl-dsp.hanwhalife.com`;\n\n default:\n console.warn('DSP API environment is not defined');\n\n return '';\n }\n};\n\n/**\n * 환경에 맞는 CDN 호스트명을 반환합니다.\n * 호스트명을 강제하고 싶으면 두 번째 파라미터로 넘기세요.\n * @param currentHostname\n * @param forceApiHostName\n * @returns\n */\nexport const getCdnHostNameFromEnvironment = (currentHostname: string, forceApiHostName?: string) => {\n if (!isClient()) {\n return '';\n }\n\n if (forceApiHostName) {\n return forceApiHostName;\n }\n\n const environment = getEnvironmentFromHostname(currentHostname);\n\n switch (environment) {\n case 'dev':\n return `https://dev-dsp-static.hanwhalife.com`;\n\n case 'local':\n case 'stg':\n return `https://stg-dsp-static.hanwhalife.com`;\n\n case 'prd':\n return `https://dsp-static.hanwhalife.com'`;\n\n default:\n console.warn('DSP environment is not defined');\n\n return '';\n }\n};\n\n/**\n * @description\n * 환경에 맞는 비정형PI 호스트명을 반환합니다.\n * client side에서 사용하는 함수입니다.\n * @param serviceCode dea,dis,dcm\n * @param hostname window.location.hostname\n * @returns\n */\nexport const getDudApiBasePathFromEnvironment = (hostname?: string) => {\n if (!isClient()) {\n return '';\n }\n const environment = getEnvironmentFromHostname(hostname || location.hostname);\n\n switch (environment) {\n /**\n * local에서 호출시, rewrite동작을 위해 상대주소를 호출합니다.\n * (cors이슈 해결을 위해 필수)\n */\n case 'local':\n return `${getServicePath()}/api/dud`;\n /**\n * local 이 아닌 환경에서는 전체주소를 호출합니다.\n */\n case 'dev':\n return `https://dsp-dud-dev.hanwhalife.com:10101/api`;\n\n case 'stg':\n return `https://dsp-dud-stg.hanwhalife.com:10102/api`;\n\n case 'prd':\n return `https://dsp-dud.hanwhalife.com/api`;\n\n default:\n console.warn('DUD API environment is not defined');\n\n return '';\n }\n};\n\n/**\n * @description\n * 환경에 맞는 Dsp 호스트명을 반환합니다.\n * client side에서 사용하는 함수입니다.\n * @param serviceCodeTo dea,dis 같은 api서버명\n * @param hostname window.location.hostname\n * @returns\n */\nexport const getDspApiBasePathFromEnvironment = (serviceCodeTo: string, hostname?: string) => {\n if (!isClient()) {\n return '';\n }\n const environment = getEnvironmentFromHostname(hostname || location.hostname);\n\n switch (environment) {\n /**\n * local에서 호출시, rewrite동작을 위해 상대주소를 호출합니다.\n * (cors이슈 해결을 위해 필수)\n */\n case 'local':\n return `${getServicePath()}/api/${serviceCodeTo}`;\n /**\n * local 이 아닌 환경에서는 전체주소를 호출합니다.\n */\n case 'dev':\n return `https://nxl-dsp-dev.hanwhalife.com/api/${serviceCodeTo}`;\n\n case 'stg':\n return `https://nxl-dsp-stg.hanwhalife.com/api/${serviceCodeTo}`;\n\n case 'prd':\n return `https://nxl-dsp.hanwhalife.com/api/${serviceCodeTo}`;\n\n default:\n console.warn('DSP API environment is not defined');\n\n return '';\n }\n};\n\n\n/**\n * @description\n * 환경에 맞는 NLC 호스트명을 반환합니다.\n * client side에서 사용하는 함수입니다.\n * @param hostname window.location.hostname\n * @returns\n */\nexport const getNlcHostFromEnvironment = (hostname?: string) => {\n if (!isClient()) {\n return '';\n }\n\n const environment = getEnvironmentFromHostname(hostname || location.hostname);\n\n switch (environment) {\n case 'local':\n return `https://nxl-nlc-stg.hanwhalife.com`;\n\n case 'dev':\n return `https://nxl-nlc-dev.hanwhalife.com`;\n\n case 'stg':\n return `https://nxl-nlc-stg.hanwhalife.com`;\n\n case 'prd':\n return `https://nxl-nlc.hanwhalife.com`;\n\n default:\n console.warn('NLC environment is not defined');\n\n return '';\n }\n};\n\n"]}
@@ -1,5 +1,8 @@
1
1
  // src/utils/cookie-utils.ts
2
2
  var getCookie = (name) => {
3
+ if (!isClient()) {
4
+ return "";
5
+ }
3
6
  if (typeof document === "undefined") {
4
7
  return "";
5
8
  }