@uniai-fe/util-functions 0.2.6 → 0.2.7
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.
- package/dist/index.cjs +13 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.mjs +13 -1
- package/dist/index.mjs.map +1 -1
- package/dist/route/index.cjs +13 -0
- package/dist/route/index.cjs.map +1 -1
- package/dist/route/index.d.cts +8 -1
- package/dist/route/index.d.ts +8 -1
- package/dist/route/index.mjs +13 -1
- package/dist/route/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -550,6 +550,18 @@ var getMatchRoute = (routes, currentPath) => {
|
|
|
550
550
|
}
|
|
551
551
|
return res;
|
|
552
552
|
};
|
|
553
|
+
var getSafePathname = (fallback = "") => {
|
|
554
|
+
if (typeof window !== "undefined" && window.location?.pathname) {
|
|
555
|
+
return window.location.pathname;
|
|
556
|
+
}
|
|
557
|
+
if (typeof globalThis !== "undefined") {
|
|
558
|
+
const globalLocation = globalThis.location;
|
|
559
|
+
if (globalLocation?.pathname) {
|
|
560
|
+
return globalLocation.pathname;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
return fallback;
|
|
564
|
+
};
|
|
553
565
|
|
|
554
566
|
// src/sort/module.ts
|
|
555
567
|
var sortAsc = (a, b) => {
|
|
@@ -962,6 +974,7 @@ exports.getPrevDay = getPrevDay;
|
|
|
962
974
|
exports.getPwaRuntimeInfo = getPwaRuntimeInfo;
|
|
963
975
|
exports.getQueryString = getQueryString;
|
|
964
976
|
exports.getRepeatCycleUnit = getRepeatCycleUnit;
|
|
977
|
+
exports.getSafePathname = getSafePathname;
|
|
965
978
|
exports.getToday = getToday;
|
|
966
979
|
exports.getValueByKeyChain = getValueByKeyChain;
|
|
967
980
|
exports.isValidArray = isValidArray;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/reg-exp/module.ts","../src/validation/module.ts","../src/mask/module.ts","../src/format/module.ts","../src/convert/module.ts","../src/date/module.ts","../src/route/module.ts","../src/sort/module.ts","../src/api/util.ts","../src/api/module.ts","../src/runtime-env/device.ts","../src/runtime-env/pwa.ts","../src/form/checkbox/module.ts","../src/style/size/module.ts"],"names":["d","date","mobile","tablet","apple"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { EscapeTarget } from \"./type\";\n\n/**\n * 정규식 패턴으로 특수기호 제거\n * @util\n * @param {string} text\n * @return {string}\n */\nexport const escapeSymbol = (text: EscapeTarget): string => {\n // 정규식 패턴. 특수 문자를 찾습니다.\n const specialCharPattern = /([.*+?^${}()|[\\]\\\\])/g;\n\n // 텍스트에서 특수 문자를 찾아서 escape 처리합니다.\n const escapedText = text.replace(specialCharPattern, \"\\\\$1\");\n\n return escapedText;\n};\n\n/**\n * 정규식 패턴으로 따옴표 제거\n * @util\n * @param {string} text\n * @return {string}\n */\nexport const escapeQuotes = (text: EscapeTarget): string => {\n const quotesPattern = /[\"']/g;\n return text.replace(quotesPattern, \"\");\n};\n","/**\n * validation; 인덱스 데이터 체크\n * @util\n * @validation\n * @param {string | number} idxValue 인덱스 데이터\n * @return {boolean}\n */\nimport type {\n BuildingNoListString,\n NullableNumericIdentifier,\n NumericIdentifier,\n TimeFormatString,\n} from \"./type\";\n\nexport const isValidIdx = (idxValue?: NumericIdentifier): boolean =>\n typeof idxValue !== \"undefined\" &&\n idxValue !== \"\" &&\n !isNaN(Number(idxValue)) &&\n Number(idxValue) > 0;\n\n/**\n * validation; 배열 데이터 체크\n * @util\n * @validation\n * @param {unknown} array 배열 데이터\n * @return {boolean}\n */\nexport const isValidArray = (array?: unknown): boolean =>\n typeof array !== \"undefined\" && Array.isArray(array);\n\n/**\n * validation; 사업자등록번호 데이터 체크\n * @util\n * @validation\n * @param {unknown} businessCode 농장 사업자등록번호\n * @return {boolean}\n */\nexport const isValidBusinessCode = (businessCode: unknown): boolean => {\n if (!businessCode) return false;\n if (String(businessCode).length === 10) return !isNaN(Number(businessCode));\n return false;\n};\n\n/**\n * validation; 날짜 변환을 허용할 유효 number 시간값 체크\n * @util\n * @validation\n * @param {number} dateNumber\n * @return {boolean}\n */\nexport const isValidDateNumber = (dateNumber: number): boolean => {\n const DATE_MIN = 1672498800000; // 2023-01-01T00:00:00\n const DATE_MAX = 4828172400000; // 2123-01-01T00:00:00\n return DATE_MIN < dateNumber && dateNumber < DATE_MAX;\n};\n\n/**\n * validation; 날짜 데이터 체크\n * @util\n * @validation\n * @param {unknown} date 날짜\n * @return {boolean}\n */\nexport const isValidDateType = (date: unknown): boolean => {\n if (!date) return false;\n if (\n typeof date === \"string\" ||\n (typeof date === \"number\" && isValidDateNumber(date)) ||\n date instanceof Date\n )\n return new Date(date) instanceof Date && !isNaN(new Date(date).valueOf());\n return false;\n};\n\n/**\n * validation; uuidx 계군 식별코드 데이터 체크\n * @util\n * @validation\n * @param {string} uuidx 계군 식별코드\n * @return {boolean}\n */\nexport const isValidUuidx = (uuidx?: string): boolean =>\n typeof uuidx !== \"undefined\" && uuidx !== \"\";\n\n/**\n * validation; 사육동 번호 데이터 체크\n * @util\n * @validation\n * @param {string | number} buildingNo 사육동 번호\n * @return {boolean}\n */\nexport const isValidBuildingNo = (\n buildingNo?: NullableNumericIdentifier,\n): boolean =>\n typeof buildingNo !== \"undefined\" &&\n buildingNo !== \"\" &&\n !isNaN(Number(buildingNo)) &&\n Number(buildingNo) > 0;\n\n/**\n * validation; building_no_s 사육동 번호 복수형 데이터 체크\n * @util\n * @validation\n * @param {string} buildingNoList 사육동 번호 1,2,4,...\n * @return {boolean}\n */\nexport const isValidBuildingNoList = (\n buildingNoList?: BuildingNoListString,\n): boolean =>\n typeof buildingNoList === \"string\" &&\n buildingNoList !== \"\" &&\n buildingNoList.split(\",\").length > 0;\n\n/**\n * validation; 숫자 데이터 체크\n * @util\n * @validation\n * @param {unknown} value 숫자 확인 데이터\n * @return {boolean}\n */\nexport const isValidNumber = (value: unknown): boolean =>\n typeof value !== \"undefined\" && !isNaN(Number(value)) && value !== \"\";\n\n/**\n * validation; 카테고리 이름이 업체인지 여부\n * @util\n * @validation\n * @param {string} categoryName 카테고리 이름\n * @return {boolean}\n */\nexport const isValidFirmCategory = (categoryName?: string): boolean =>\n typeof categoryName === \"string\" &&\n /[농장|정부기관|유통사|수의사|병성기관|부화장|도계장|사료|약품|유니아이]/.test(\n categoryName,\n );\n\n/**\n * validation; 카테고리 이름이 약품/사료인지 여부\n * @util\n * @validation\n * @param {string} categoryName 카테고리 이름\n * @return {boolean}\n */\nexport const isValidFeedMedicineCategory = (categoryName?: string): boolean =>\n typeof categoryName === \"string\" && /[약품|사료]/.test(categoryName);\n\n/**\n * validation; 시간 데이터 HH:MM:SS 포맷 체크\n * @util\n * @validation\n * @param {string} time\n * @return {boolean}\n */\nexport const isValidTimeStringFormat = (time: TimeFormatString): boolean => {\n const hms = time.split(\":\");\n if (hms.length !== 3 || hms.some(t => isNaN(Number(t)))) return false;\n\n // hour\n if (Number(hms[0]) < 0 || Number(hms[0]) > 24) return false;\n // minutes\n if (Number(hms[1]) < 0 || Number(hms[1]) > 59) return false;\n // seconds\n if (Number(hms[2]) < 0 || Number(hms[2]) > 59) return false;\n\n return true;\n};\n","import type { MaskDecimalSeparatorOptions, MaskNumericValue } from \"./type\";\n\n/**\n * 전화번호 포맷 마스크\n * @util\n * @param {string | number} value\n * @return {string}\n * @desc\n * - 규칙: [\n * 999-9999(7),\n * 9999-9999(8),\n * 99-999-9999(9),\n * 99-9999-9999(10),\n * 999-999-9999(10),\n * 999-9999-9999(11),\n * ];\n * - 지역번호 구분:\n * 01X: 휴대전화\n * 02 ~ 0XX: 지역번호\n */\nexport function maskPhone(value: MaskNumericValue): string {\n // 입력값\n const originValue = String(value).replace(/[^0-9]/g, \"\");\n\n if (isNaN(Number(originValue))) return originValue;\n\n // 11자리 제한\n const v = originValue.length > 11 ? originValue.slice(0, 11) : originValue;\n\n let maskValue = v;\n\n // 999-9999\n if (3 < v.length && v.length <= 7) {\n maskValue = `${v.slice(0, 3)}-${v.slice(3)}`;\n }\n // 9999-9999\n else if (v.length === 8) {\n maskValue = `${v.slice(0, 4)}-${v.slice(4)}`;\n }\n // 99-999-9999\n else if (v.length === 9) {\n maskValue = `${v.slice(0, 2)}-${v.slice(2, 5)}-${v.slice(5)}`;\n }\n // 99-9999-9999, 999-999-9999\n else if (v.length === 10) {\n const firstDigits = v.startsWith(\"02\") ? 2 : 3;\n // 02-9999-9999\n if (firstDigits === 2) {\n maskValue = `${v.slice(0, 2)}-${v.slice(2, 6)}-${v.slice(6)}`;\n }\n // 0XX-999-9999\n else {\n maskValue = `${v.slice(0, 3)}-${v.slice(3, 6)}-${v.slice(6)}`;\n }\n } else if (v.length > 10) {\n maskValue = `${v.slice(0, 3)}-${v.slice(3, 7)}-${v.slice(7)}`;\n }\n\n return maskValue;\n}\n\n/**\n * 주민등록번호 포맷 마스크\n * @util\n * @param {string | number} value\n * @return {string}\n * @desc\n * - 규칙: 999999-9999999\n */\nexport function maskResidentCode(value: MaskNumericValue): string {\n // 입력값\n const originValue = String(value).replace(/[^0-9]/g, \"\");\n\n if (isNaN(Number(originValue))) return originValue;\n\n // 11자리 제한\n const v = originValue.length > 6 ? originValue.slice(0, 6) : originValue;\n return v.length > 6 ? v.slice(0, 6) : v;\n\n let maskValue = v;\n\n // 999999-9999999\n if (6 < v.length) {\n maskValue = `${v.slice(0, 6)}-${v.slice(6)}`;\n }\n\n return maskValue;\n}\n\n/**\n * 사업자등록번호 포맷 마스크\n * @util\n * @param {string | number} value\n * @return {string}\n * @desc\n * - 규칙: 999-99-99999\n */\nexport function maskBusinessCode(value: MaskNumericValue): string {\n // 입력값\n const originValue = String(value).replace(/[^0-9]/g, \"\");\n\n if (isNaN(Number(originValue))) return originValue;\n\n // 11자리 제한\n const v = originValue.length > 10 ? originValue.slice(0, 10) : originValue;\n\n let maskValue = v;\n\n // 999-99-99999\n if (3 < v.length && v.length < 6) {\n maskValue = `${v.slice(0, 3)}-${v.slice(3)}`;\n } else if (6 <= v.length) {\n maskValue = `${v.slice(0, 3)}-${v.slice(3, 5)}-${v.slice(5)}`;\n }\n\n return maskValue;\n}\n\n/**\n * 1,000단위 숫자 구분 comma (decimal separator)\n * @util\n * @param {string | number} value\n * @param {Intl.NumberFormatOptions} options\n * @return {string}\n */\nexport function maskDecimalSeparator(\n value: MaskNumericValue,\n options?: MaskDecimalSeparatorOptions,\n): string {\n // 입력값\n const pureNumberValue = String(value).replace(/[^0-9.-]/g, \"\");\n\n if (isNaN(Number(pureNumberValue))) return pureNumberValue;\n\n const originValue = String(value).replace(/[^0-9,.-]/g, \"\");\n const isPoint =\n originValue !== \"\" && originValue.indexOf(\".\") === originValue.length - 1;\n\n const v = String(value).replace(/[^0-9.-]/g, \"\");\n if (isNaN(Number(v))) return String(originValue);\n\n return v === \"\"\n ? \"\"\n : `${new Intl.NumberFormat(\"en-US\", {\n style: \"decimal\",\n ...options,\n }).format(Number(v))}${isPoint ? \".\" : \"\"}`;\n}\n\n/**\n * 날짜 표현\n * @util\n * @param {string | number} value\n * @return {string}\n * @desc\n * - 규칙 : 9999-99-99\n */\nexport function maskDate(value: MaskNumericValue): string {\n // 입력값\n const originValue = String(value).replace(/[^0-9]/g, \"\");\n\n if (isNaN(Number(originValue))) return originValue;\n\n // 8자리 제한\n const v = originValue.length > 8 ? originValue.slice(0, 8) : originValue;\n\n let maskValue = v;\n\n // 9999.99.99.\n if (4 < v.length && v.length < 7) {\n maskValue = `${v.slice(0, 4)}-${v.slice(4)}`;\n } else if (7 <= v.length) {\n maskValue = `${v.slice(0, 4)}-${v.slice(4, 6)}-${v.slice(6)}`;\n }\n\n return maskValue;\n}\n","import { convert2Digit } from \"../convert/module\";\nimport { maskPhone } from \"../mask/module\";\nimport { isValidDateType } from \"../validation/module\";\nimport type { DateTimeFormatOptionsType, DurationFormatOptions } from \"./type\";\n\n/**\n * comma 마스킹된 숫자 Number 타입으로 변환\n * @util\n * @param {number | string} value 타입 변환 값\n * @param {boolean} [isString]\n * @return {number | string}\n */\nexport const getNumberReplaceComma = (\n value: unknown,\n isString?: boolean,\n): number | string => {\n if (\n ![\"number\", \"string\"].includes(typeof value) ||\n value === null ||\n value === \"\"\n )\n return \"\";\n\n if (typeof value === \"number\") return value;\n\n const v = Number(String(value).replace(/[^0-9.-]/g, \"\"));\n if (isNaN(Number(v))) return isString ? \"\" : 0;\n\n return isString ? String(v) : v;\n};\n\n/**\n * 수량을 1000단위로 comma표기\n * @util\n * @param {unknown} value 숫자\n * @param {number} [digit] 소수점 자리수 고정 옵션\n * @return {string}\n */\nexport const lengthFormat = (value: unknown, digit?: number): string => {\n if (\n ![\"number\", \"string\"].includes(typeof value) ||\n value === null ||\n value === \"\"\n )\n return \"-\";\n\n if (isNaN(Number(getNumberReplaceComma(value)))) return String(value);\n\n // 소수점 고정 옵션\n const digitOptions: Intl.NumberFormatOptions =\n typeof digit === \"number\"\n ? { minimumFractionDigits: digit, maximumFractionDigits: digit }\n : {};\n\n return new Intl.NumberFormat(\"en-US\", digitOptions).format(Number(value));\n};\n\n/**\n * 날짜 사용 옵션\n */\nconst DATE_FULL_OPTION: Intl.DateTimeFormatOptions = {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n};\n\n/**\n * 날짜 사용 안함 옵션\n */\nconst NO_DATE_OPTION: Intl.DateTimeFormatOptions = {\n year: undefined,\n month: undefined,\n day: undefined,\n};\n\n/**\n * 24시간 사용 옵션\n */\nconst TIME_FULL_OPTION: Intl.DateTimeFormatOptions = {\n hour12: false,\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n};\n\n/**\n * 시간 사용 안함 옵션\n */\nconst NO_TIME_OPTION: Intl.DateTimeFormatOptions = {\n hour: undefined,\n minute: undefined,\n second: undefined,\n};\n\n/**\n * 접속위치에 따른 시간대 보정\n * @util\n * @param {Date} date 보정할 시간\n * @return {Date} 보정된 시간\n */\n// 변경: correctTimezone 함수를 UTC 산출 후 KST로 변경\nexport const correctTimezone = (date: string | Date): Date => {\n const utc =\n new Date(date).getTime() + new Date(date).getTimezoneOffset() * 60000;\n return new Date(utc + 9 * 60 * 60000);\n};\n\n/**\n * Date 타입 데이터를 yyyy-mm-dd로 변환\n * @util\n * @param {unknown} date\n * @param {DateTimeFormatOptionsType} [options]\n * @param {Intl.LocalesArgument} [options.formatTimezone] 시간 기준; 기본값 ko-KR\n * @param {Intl.DateTimeFormatOptions} [options.formatOptions]\n * @param {boolean | boolean[]} [options.isKorean] // ymd 또는 [year, month?, day?]\n * @param {boolean} [options.isCorrection] 시간 보정\n * @param {boolean} [options.isISOString] ISO 문자열\n * @return {string} yyyy-mm-dd 또는 각 옵션에 대한 날짜포맷\n */\n// 변경: dateFormat 함수에서 isCorrection 옵션 사용 시 toISOString()의 결과를 슬라이스하여 \"YYYY-MM-DDTHH:MM:SS\" 형식 반환\nexport const dateFormat = (\n date: unknown,\n options?: Partial<DateTimeFormatOptionsType>,\n): string => {\n if (isValidDateType(date)) {\n const d = new Date(date as string | number | Date);\n const corrDate = correctTimezone(d);\n\n // toISOString()으로 변환 시, KST 적용되지 않음\n const defaultDateFormat = options?.isCorrection\n ? `${corrDate.getFullYear()}-${convert2Digit(corrDate.getMonth() + 1)}-${convert2Digit(corrDate.getDate())}`\n : `${d.getFullYear()}-${convert2Digit(d.getMonth() + 1)}-${convert2Digit(d.getDate())}`;\n\n if (options?.isISOString) return defaultDateFormat;\n\n const onlyDate = defaultDateFormat || \"\";\n\n if (options?.isKorean) {\n const [y, m, d] = onlyDate.split(\"-\");\n if (options.isKorean === true) return `${y}년 ${m}월 ${d}일`;\n const __ymd = options.isKorean.map((apply, index) => {\n switch (index) {\n case 0:\n return apply ? `${y}년` : \"\";\n case 1:\n return apply ? `${m}월` : \"\";\n case 2:\n return apply ? `${d}일` : \"\";\n default:\n return \"\";\n }\n });\n return __ymd.join(\" \");\n }\n\n if (typeof options?.formatOptions !== \"undefined\")\n return new Intl.DateTimeFormat(\n options?.formatTimezone ? options.formatTimezone : \"ko-KR\",\n { ...DATE_FULL_OPTION, ...options.formatOptions, ...NO_TIME_OPTION },\n ).format(d);\n return onlyDate;\n }\n return String(date);\n};\n\n/**\n * Date 타입 데이터를 HH:MM:SS 시간으로 변환\n * @util\n * @param {unknown} date\n * @param {DateTimeFormatOptionsType} [options]\n * @param {Intl.LocalesArgument} [options.formatTimezone] 시간 기준; 기본값 ko-KR\n * @param {Intl.DateTimeFormatOptions} [options.formatOptions]\n * @param {boolean | boolean[]} [options.isKorean] // ymd 또는 [year, month?, day?]\n * @param {boolean} [options.isCorrection] 시간 보정\n * @param {boolean} [options.isISOString] ISO 문자열\n * @return {string} HH:MM:SS\n */\n// 변경: timeFormat 함수에서 isCorrection 옵션 사용 시 toISOString()의 시간 부분만 슬라이스하여 \"HH:MM:SS\" 형식 반환\nexport const timeFormat = (\n date: unknown,\n options?: Partial<DateTimeFormatOptionsType>,\n): string => {\n if (isValidDateType(date)) {\n const d = new Date(date as string | number | Date);\n\n if (options?.isKST) {\n const utc = d.getTime() + 60 * 60 * 1000 * 9;\n d.setTime(utc);\n }\n\n const defaultDateFormat = options?.isCorrection\n ? correctTimezone(d).toISOString().split(\"T\")[1].split(\".\")[0]\n : new Intl.DateTimeFormat(\"en-US\", {\n ...TIME_FULL_OPTION,\n ...NO_DATE_OPTION,\n }).format(d);\n\n if (options?.isISOString) return defaultDateFormat;\n\n const onlyDate = defaultDateFormat || \"\";\n\n if (options?.isKorean) {\n const [hr, min, sec] = onlyDate.split(\":\");\n if (options.isKorean === true) return `${hr}시간 ${min}분 ${sec}초`;\n const __hms = options.isKorean.map((apply, index) => {\n switch (index) {\n case 0:\n return apply ? `${hr}시간` : \"\";\n case 1:\n return apply ? `${min}분` : \"\";\n case 2:\n return apply ? `${d}초` : \"\";\n default:\n return \"\";\n }\n });\n return __hms.join(\" \");\n }\n\n if (typeof options?.formatOptions !== \"undefined\") {\n const res = new Intl.DateTimeFormat(\n options?.formatTimezone ? options.formatTimezone : \"ko-KR\",\n { ...TIME_FULL_OPTION, ...options.formatOptions, ...NO_DATE_OPTION },\n ).format(d);\n\n // console.log(\"res\", res);\n return res;\n }\n\n return onlyDate;\n }\n return String(date);\n};\n\n/**\n * 소요시간 변환\n * @util\n * @param {number | null} duration 초 단위 시간값\n */\nexport const durationFormat = (\n duration: number | null,\n options?: Partial<DurationFormatOptions>,\n): string => {\n if (duration === null) return String(duration);\n\n const hours: number | null =\n options?.hours === false ? null : Math.floor(duration / (60 * 60));\n const minutes: number | null =\n options?.minutes === false ? null : Math.floor((duration % (60 * 60)) / 60);\n const seconds: number | null =\n options?.seconds === false ? null : duration % 60;\n\n const HH = hours !== null ? `${hours}시간 ` : \"\";\n const MM = minutes !== null ? `${minutes}분 ` : \"\";\n const SS = seconds !== null ? `${seconds}초` : \"\";\n\n return `${HH}${MM}${SS}`.trim();\n};\n\n/**\n * 전화번호 타입 데이터로 변환\n * @util\n * @param {string | number} value\n * @return {string}\n * @desc\n * - 규칙: [\n * 999-9999(7),\n * 9999-9999(8),\n * 99-999-9999(9),\n * 99-9999-9999(10),\n * 999-999-9999(10),\n * 999-9999-9999(11),\n * ];\n * - 지역번호 구분:\n * 01X: 휴대전화\n * 02 ~ 0XX: 지역번호\n */\nexport const phoneNumberFormat = maskPhone;\n\n/**\n * 정수 숫자를 +/-를 붙인 형태로 변환\n * @util\n * @param {unknown} value\n * @param {boolean} [isMaskLength] 길이 마스킹 여부\n * @return {string}\n */\nexport const deltaFormat = (\n value: unknown,\n digit: number = 0,\n isMaskLength: boolean = true,\n): string => {\n if (typeof value === \"undefined\" || value === null || isNaN(Number(value)))\n return \"-\";\n\n const v = Number(value);\n\n if (v > 0) return isMaskLength ? `+${lengthFormat(v, digit)}` : `+${v}`;\n return lengthFormat(v, digit);\n};\n\n/**\n * 거리를 m 또는 km로 변환\n * @util\n * @param {number | null} distance\n * @return {string}\n */\nexport const distanceFormat = (\n distance: number | null,\n isUseUnit: boolean = true,\n): string => {\n if (distance === null) return \"-\";\n if (distance < 1000) return `${distance}${isUseUnit ? \"m\" : \"\"}`;\n return `${Math.floor(distance / 1000)}${isUseUnit ? \"km\" : \"\"}`;\n};\n","import { isValidDateType } from \"../validation/module\";\nimport { dateFormat } from \"../format/module\";\nimport type { KeyChainRecord } from \"./type\";\n\nconst isKeyChainRecord = (value: unknown): value is KeyChainRecord =>\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n typeof value !== \"function\";\n\n/**\n * 데이터를 스트링으로 변환\n * @util\n * @param {unknown} value\n * @return {string}\n */\nexport const string = (value: unknown): string => {\n if (typeof value === \"string\") return value;\n return JSON.stringify(value);\n};\n\n/**\n * 세션/로컬 스토리지 데이터 parsing\n * @util\n * @param {string} data 세션/로컬 스토리지 데이터\n * @return {unknown}\n */\nexport const parseData = (data: string): unknown => {\n // 괄호 여부 -> object | array\n if (/^(\\{|\\[)/.test(data)) return JSON.parse(data);\n // 숫자 여부 -> number\n else if (!isNaN(Number(data))) return Number(data);\n // 불리언 여부 -> boolean\n else if (data === \"true\" || data === \"false\") return JSON.parse(data);\n // undefined\n else if (data === \"undefined\") return undefined;\n\n return data; // string\n};\n\n/**\n * 키체인에 해당하는 데이터 추출\n * @util\n * @param {unknown} data 세션/로컬 스토리지 데이터\n * @param {string} keyChain 키체인\n * @return {unknown}\n */\nexport const getValueByKeyChain = (\n data: unknown,\n keyChain: string,\n): unknown => {\n // 프로퍼티를 가진 객체인지 확인\n if (isKeyChainRecord(data)) {\n // 키 체인이 남았는지 확인\n const firstChainIndex: number = keyChain.indexOf(\".\");\n if (firstChainIndex === -1) return data[keyChain as keyof KeyChainRecord];\n\n // 키 체인이 끝나지 않은 경우\n const currentKey: string = keyChain.slice(0, firstChainIndex);\n const remainKeyChain: string = keyChain.slice(firstChainIndex + 1);\n const foundData = data[currentKey as keyof KeyChainRecord];\n return isKeyChainRecord(foundData)\n ? getValueByKeyChain(foundData, remainKeyChain)\n : undefined;\n }\n\n return data;\n};\n\n/**\n * object -> URLSearchParams 데이터 변환\n * @param {unknown} data\n * @return {URLSearchParams | string}\n */\nexport const convertObjectToSearchParams = (data: unknown): URLSearchParams => {\n if (!data) {\n console.log(\"[convertObjectToSearchParams] 데이터가 유효하지 않음\", {\n data,\n });\n return new URLSearchParams();\n }\n if (data instanceof URLSearchParams) {\n return data;\n }\n\n if (isKeyChainRecord(data) && Object.keys(data).length > 0) {\n const d = Object.fromEntries(\n Object.entries(data).map(([key, value]) => [key, string(value)]),\n );\n return new URLSearchParams(d);\n }\n\n console.log(\"[convertObjectToSearchParams] 데이터가 객체가 아님\", {\n data,\n type: typeof data,\n key: isKeyChainRecord(data) ? Object.keys(data) : [],\n array: Array.isArray(data),\n });\n return new URLSearchParams();\n};\n\n// /**\n// * 배열 추가형 입력 테이블 register rule 필터링\n// * @util\n// * @param {RegisterOptionsType} ruleCollection\n// * @param {boolean} isActive\n// * @return {RegisterOptionsType}\n// */\n// export function getFieldArrayValidOptions(\n// ruleCollection: RegisterOptionsType,\n// isActive: boolean,\n// ): RegisterOptionsType {\n// const entries = Object.entries(ruleCollection);\n// const filtered = entries.map(([dataName, rule]) => {\n// const ruleEntries = Object.entries(rule).filter(\n// ([ruleKey]) => ruleKey !== \"required\",\n// );\n// return [dataName, Object.fromEntries(ruleEntries)];\n// });\n\n// return isActive ? ruleCollection : Object.fromEntries(filtered);\n// }\n\n/**\n * 텍스트 capitalize 첫글자 대문자 변환\n * @util\n * @param {string} value 텍스트\n * @return {string}\n */\nexport const capitalize = (value: string): string => {\n const first = value.charAt(0).toUpperCase();\n const others = value.slice(1);\n return `${first}${others}`;\n};\n\n/**\n * kg -> g 변환\n * @util\n * @param {number | string} kg\n * @return {number} gram\n */\nexport const covertGram = (kg: number | string): number => Number(kg) * 1000;\n\n/**\n * g -> kg 변환\n * @util\n * @param {number | string} gram\n * @return {number} kg\n */\nexport const covertKilogram = (gram: number | string): number =>\n Number(gram) / 1000;\n\n/**\n * ml -> L 변환\n * @util\n * @param {number | string} ml\n * @return {number} liter\n */\nexport const convertLiter = (ml: number | string): number => Number(ml) / 1000;\n\n/**\n * L -> ml 변환\n * @util\n * @param {number | string} liter\n * @return {number} ml\n */\nexport const convertMilliliter = (liter: number | string): number =>\n Number(liter) * 1000;\n\n/**\n * 데이터 가공\n * @util\n * @param {unknown} value\n * @return {unknown}\n * @desc\n * - 빈칸 또는 줄바꿈 텍스트 모두 제거\n * - 날짜 데이터 yyyy-mm-ddTHH:MM:SS 변환\n */\nexport function extractCoreValue<TOriginType>(value: TOriginType): TOriginType {\n if (isValidDateType(value)) return dateFormat(value) as TOriginType;\n if (typeof value === \"string\")\n return value.replace(/[\\s\\n\\t]+/g, \"\") as TOriginType;\n return value;\n}\n\n/**\n * 자연수로 된 숫자를, 지정된 자리수만큼 0을 채워서 반환\n * @util\n * @param {number} v 소수점 제외\n * @param {number} [digitLength] 자릿수 (기본값 2)\n * @return {string}\n */\nexport function convertDigit(v: number, digitLength: number = 2): string {\n const valueLength = String(Math.floor(v)).length;\n const restLength = digitLength - valueLength;\n const fill = Array(restLength).fill(0).join(\"\");\n\n return `${fill}${v}`;\n}\n\n/**\n * 날짜 시간을 2-digit으로 맞춤\n * @util\n * @param {number} date_time\n * @return {string}\n */\nexport const convert2Digit = (date_time: number): string =>\n date_time < 10 ? `0${date_time}` : String(date_time);\n","import { isValidDateType, isValidTimeStringFormat } from \"../validation/module\";\nimport { dateFormat } from \"../format/module\";\nimport type {\n CheckDateMomentType,\n ScheduleBYDAY,\n ScheduleFREQ,\n ScheduleRepeatCycleDateType,\n} from \"./type\";\n\n/**\n * 오늘 날짜를 yyyy-mm-dd 포맷 string으로 추출\n * @util\n * @param {string} [time] HH:MM:SS\n * @return {string} yyyy-mm-dd\n */\nexport const getToday = (time?: string): string =>\n `${dateFormat(new Date())}${time && isValidTimeStringFormat(time) ? `T${time}` : \"\"}`;\n\n/**\n * 과거 특정날짜 추출\n * @util\n * @param {string | Date} date\n * @param {number} [weeks] 과거 몇 주 전\n * @param {number} [days] 과거 며칠 전\n * @return {Date | undefined}\n */\nexport function getPrevDay(\n date: string | Date,\n weeks?: number,\n days?: number,\n): Date | undefined {\n if (!isValidDateType(date)) return undefined;\n const standardDate = new Date(date);\n\n const prevWeekDay: number = typeof weeks === \"undefined\" ? 0 : 7 * weeks;\n const prevDays: number = typeof days === \"undefined\" ? 1 : days;\n const prevDayAmount: number = prevWeekDay !== 0 ? prevWeekDay : prevDays;\n\n standardDate.setDate(standardDate.getDate() - prevDayAmount);\n\n return new Date(standardDate);\n}\n\n/**\n * 미래 특정날짜 추출\n * @util\n * @param {string | Date} date\n * @param {number} [weeks] 미래 몇 주 후\n * @param {number} [days] 미래 며칠 후\n * @return {Date | undefined}\n */\nexport function getNextDay(\n date: string | Date,\n weeks?: number,\n days?: number,\n): Date | undefined {\n if (!isValidDateType(date)) return undefined;\n const standardDate = new Date(date);\n\n const nextWeekDay: number = typeof weeks === \"undefined\" ? 0 : 7 * weeks;\n const nextDays: number = typeof days === \"undefined\" ? 1 : days;\n const nextDayAmount: number = nextWeekDay !== 0 ? nextWeekDay : nextDays;\n\n standardDate.setDate(standardDate.getDate() + nextDayAmount);\n\n return new Date(standardDate);\n}\n\n/**\n * 과거 특정시점의 주간 날짜 배열 추출\n * @util\n * @param {string | Date} date\n * @param {number} weeks 과거 몇 주 전\n * @return {Date[]}\n */\nexport function getLastWeeks(date: string | Date, weeks: number = 1): Date[] {\n if (!isValidDateType(date)) return [];\n const lastWeeks: Date[] = [];\n for (let d = 1; d <= 7 * weeks; d++) {\n const prevDate = new Date(date);\n lastWeeks.unshift(new Date(prevDate.setDate(prevDate.getDate() - d)));\n }\n return lastWeeks;\n}\n\n/**\n * 미래 특정시점의 주간 날짜 배열 추출\n * @util\n * @param {string | Date} date\n * @param {number} weeks 미래 몇 주 전\n * @return {Date[]}\n */\nexport function getNextWeeks(date: string | Date, weeks: number = 1): Date[] {\n if (!isValidDateType(date)) return [];\n const startDate = new Date(date);\n return new Array(weeks * 7)\n .fill(startDate)\n .map((date: Date, index: number) => {\n const nextDate = new Date(date);\n return new Date(nextDate.setDate(nextDate.getDate() + index));\n });\n}\n\n/**\n * 지정된 범위 내의 모든 날짜 배열 추출\n * @util\n * @param {string | Date} startDate\n * @param {string | Date} endDate\n * @param {boolean} [isFormat] 날짜 배열을 yyyy-mm-dd string으로 생성할지 여부\n * @return {(Date | string)[]}\n */\nexport function getDateArray(\n startDate: string | Date,\n endDate: string | Date,\n isFormat?: boolean,\n): (Date | string)[] {\n if (!isValidDateType(startDate) || !isValidDateType(endDate)) return [];\n\n const dayUnit = 1000 * 60 * 60 * 24;\n const start = new Date(dateFormat(startDate));\n const end = new Date(dateFormat(endDate));\n const array: (Date | string)[] = [];\n for (let day = start.getTime(); day <= end.getTime(); day += dayUnit) {\n const d = isFormat ? dateFormat(new Date(day)) : new Date(day);\n array.push(d);\n }\n return array;\n}\n\n/**\n * 현재 시점을 기준으로 한 특정 날짜의 시점 추출\n * @util\n * @param {string | Date} date\n * @return {CheckDateMomentType}\n */\nexport function checkDateMoment(date: string | Date): CheckDateMomentType {\n const res: CheckDateMomentType = {\n isToday: false,\n isPast: false,\n isFuture: false,\n moment: \"\",\n };\n\n if (!isValidDateType(date)) return res;\n\n const standardDate = dateFormat(date);\n const standardTime = new Date(standardDate).getTime();\n const today = getToday();\n const todayTime = new Date(today).getTime();\n\n if (standardDate === today) {\n res.isToday = true;\n res.moment = \"today\";\n } else if (standardTime < todayTime) {\n res.isPast = true;\n res.moment = \"past\";\n } else if (standardTime > todayTime) {\n res.isFuture = true;\n res.moment = \"future\";\n }\n\n return res;\n}\n\n/**\n * 특정 날짜의 해당 월 주차 수\n * @util\n * @param {string|Date} date\n * @return {number} 몇주차\n */\nexport function weekOrderIndex(date: string | Date): number {\n if (date && new Date(date) instanceof Date) {\n const standardDate = new Date(date).getDate();\n const firstWeekday = new Date(new Date(date).setDate(1)).getDay();\n return Math.ceil((standardDate + firstWeekday) / 7);\n }\n return 0;\n}\n\n/**\n * 반복 주기의 명칭 한글표기로 변환\n * @util\n * @param {ScheduleFREQ} FREQ \"DAILY\" | \"WEEKLY\" | \"MONTHLY\" | \"YEARLY\"\n * @return {string} \"일\" | \"주\" | \"개월\" | \"년\"\n */\nexport function getRepeatCycleUnit(FREQ: ScheduleFREQ): string {\n switch (FREQ) {\n case \"DAILY\":\n return \"일\";\n case \"WEEKLY\":\n return \"주\";\n case \"MONTHLY\":\n return \"개월\";\n case \"YEARLY\":\n return \"년\";\n default:\n return \"주기\";\n }\n}\n\n/**\n * weekOrderIdx()의 index값을 \"N번째\"로 텍스트 변환\n * @util\n * @param {number|string} [weekIndex] 몇주차 인덱스\n * @return {string}\n */\nexport function weekOrderKo(weekIndex?: string | number): string {\n if (typeof weekIndex === \"undefined\") return \"\";\n switch (String(weekIndex)) {\n case \"1\":\n return \"첫번째\";\n case \"2\":\n return \"두번째\";\n case \"3\":\n return \"세번째\";\n case \"4\":\n return \"네번째\";\n case \"5\":\n return \"다섯번째\";\n case \"6\":\n return \"여섯번째\";\n default:\n return \"\";\n }\n}\n\n/**\n * 요일 인덱스에서 요일 코드 추출\n * @util\n * @param {number|string} weekdayIndex\n * @return {ScheduleBYDAY} \"MO\"|\"TU\"|\"WE\"|\"TH\"|\"FR\"|\"SA\"|\"SU\"|\"\"\n */\nexport function weekdayCodeByWeekdayIndex(\n weekdayIndex?: number | string,\n): ScheduleBYDAY {\n if (typeof weekdayIndex === \"undefined\") return \"\";\n\n switch (String(weekdayIndex)) {\n case \"0\":\n return \"SU\";\n case \"1\":\n return \"MO\";\n case \"2\":\n return \"TU\";\n case \"3\":\n return \"WE\";\n case \"4\":\n return \"TH\";\n case \"5\":\n return \"FR\";\n case \"6\":\n return \"SA\";\n default:\n return \"\";\n }\n}\n\n/**\n * 요일 인덱스에서 \"N요일\" 텍스트 생성\n * @util\n * @param {string|number|ScheduleBYDAY} [dayCode] 요일 인덱스 또는 R-rule 요일 코드\n * @param {boolean} [isFull] \"요일\"까지 붙은 전체 명칭생성 여부\n * @return {string} \"일(요일)\",\"월(요일)\", ..., \"토(요일)\"\n */\nexport function weekdayByDayCode(\n dayCode?: string | number | ScheduleBYDAY,\n isFull?: boolean,\n): string {\n if (typeof dayCode === \"undefined\") return \"\";\n\n const fullName = isFull ? \"요일\" : \"\";\n const code = String(dayCode);\n\n if (code === \"0\" || code.includes(\"SU\")) return `일${fullName}`;\n else if (code === \"1\" || code.includes(\"MO\")) return `월${fullName}`;\n else if (code === \"2\" || code.includes(\"TU\")) return `화${fullName}`;\n else if (code === \"3\" || code.includes(\"WE\")) return `수${fullName}`;\n else if (code === \"4\" || code.includes(\"TH\")) return `목${fullName}`;\n else if (code === \"5\" || code.includes(\"FR\")) return `금${fullName}`;\n else if (code === \"6\" || code.includes(\"SA\")) return `토${fullName}`;\n\n return ``;\n}\n\n/**\n * 월간/연간 반복에 대한 지정 날짜 코드 parsing\n * @util\n * @param {string} cycleDateString 전체 명칭생성 여부\n * @return {ScheduleRepeatCycleDateType | undefined}\n */\nexport function generateRepeatCycleDate(\n cycleDateString: string,\n): ScheduleRepeatCycleDateType | undefined {\n const isRepeatDate = cycleDateString?.startsWith(\"date,\") || false;\n const isRepeatWeek = cycleDateString?.startsWith(\"weekday,\") || false;\n\n if (cycleDateString === \"\" || !(isRepeatDate || isRepeatWeek))\n return undefined;\n\n const selected = cycleDateString.split(\",\");\n\n const repeatCycleDate: ScheduleRepeatCycleDateType = {\n cycleDateUnit: selected[0] as \"date\" | \"weekday\",\n };\n\n if (selected[0] === \"date\") {\n const repeatDay = selected[1]?.split(\"_\")?.[1] || \"\";\n Object.assign(repeatCycleDate, { repeatDay });\n\n if (selected[2] !== \"\" && selected[2]?.startsWith(\"month_\")) {\n const repeatMonth = selected[2].split(\"_\")?.[1] || \"\";\n Object.assign(repeatCycleDate, { repeatMonth });\n }\n } else if (selected[0] === \"weekday\") {\n const repeatWeekOrder = selected[1]?.split(\"_\")?.[1] || \"\";\n const repeatWeekDayIndex = selected[2]?.split(\"_\")?.[1] || \"\";\n Object.assign(repeatCycleDate, { repeatWeekOrder, repeatWeekDayIndex });\n }\n\n return repeatCycleDate;\n}\n\n/**\n * 반복 지정 주기/날짜/요일에 대해, 코드에서 한글로 변환\n * @util\n * @param {string} repeatCycleDate 반복 주기/날짜/요일 코드\n * @return {string}\n */\nexport function repeatCycleDateKo(repeatCycleDate?: string): string {\n if (typeof repeatCycleDate === \"undefined\" || repeatCycleDate === \"\")\n return \"\";\n\n const option = generateRepeatCycleDate(repeatCycleDate as string);\n if (option === undefined) return \"\";\n\n if (option.cycleDateUnit === \"date\") {\n const repeatMonthKo = option.repeatMonth ? `${option.repeatMonth}월 ` : \"\";\n const repeatDayKo = option.repeatDay ? `${option.repeatDay}일` : \"\";\n return `${repeatMonthKo}${repeatDayKo}`;\n } else if (option.cycleDateUnit === \"weekday\") {\n const repeatWeekOrderKo = weekOrderKo(option.repeatWeekOrder);\n const repeatWeekDayKo = weekdayByDayCode(option.repeatWeekDayIndex, true);\n return `${repeatWeekOrderKo} ${repeatWeekDayKo}`;\n }\n\n return \"\";\n}\n\n/**\n * 반복 지정 정보 전체를 한글표현으로 생성\n * @util\n * @param {ScheduleFREQ | undefined} repeatUnit\n * @param {string | number | undefined} repeatCycle\n * @param {string | undefined} repeatCycleDate\n * @param {string | undefined} repeatWeekly\n * @return {string}\n */\nexport function convertSelectedRepeatInfo(\n repeatUnit: ScheduleFREQ | undefined,\n repeatCycle: string | number | undefined,\n repeatCycleDate: string | undefined,\n repeatWeekly: string | undefined,\n): string {\n const weekdayKorean: string =\n repeatUnit === \"WEEKLY\" &&\n typeof repeatWeekly !== \"undefined\" &&\n repeatWeekly !== \"\"\n ? String(repeatWeekly)\n .split(\",\")\n .map((dayIndex: string) => weekdayByDayCode(dayIndex as string, true))\n .join(\",\")\n : \"\";\n\n switch (repeatUnit) {\n case \"DAILY\":\n return `${repeatCycle}일마다`;\n case \"WEEKLY\":\n return `매주 ${weekdayKorean}`;\n case \"MONTHLY\":\n return `${repeatCycle}개월마다 ${repeatCycleDateKo(repeatCycleDate)}`;\n case \"YEARLY\":\n return `${repeatCycle}년마다 ${repeatCycleDateKo(repeatCycleDate)}`;\n default:\n return \"--\";\n }\n}\n","import type { SitemapBase, SitemapMatchBase } from \"./type\";\n\n/**\n * 현재 경로와 가장 근접한 경로 데이터 추출\n * @param {SitemapBase[]} routes 사이트맵 배열 데이터\n * @param {string} currentPath 현재 경로\n * @return {SitemapBase | null} 경로 데이터\n */\nexport const getClosestRoute = <Sitemap extends SitemapBase>(\n routes: Sitemap[],\n currentPath: string,\n): Sitemap | null => {\n let deepestMatch: Sitemap | null = null;\n for (const route of routes) {\n if (currentPath.startsWith(route.path)) {\n if (!deepestMatch || route.path.length > deepestMatch.path.length) {\n deepestMatch = route;\n }\n }\n }\n return deepestMatch;\n};\n\n/**\n * 경로 일치 데이터 추출\n * @util\n * @param {SitemapBase[]} routes 사이트맵 배열 데이터\n * @param {string} currentPath 현재 경로\n * @return {SitemapBase | undefined} 경로 데이터\n */\nexport const getMatchRoute = <\n Sitemap extends SitemapBase,\n SitemapMatched extends SitemapMatchBase,\n>(\n routes: Sitemap[],\n currentPath: string,\n): SitemapMatched => {\n const res: SitemapMatched = { category: null, depth: null } as SitemapMatched;\n\n // 1 depth\n res.category = getClosestRoute<Sitemap>(routes, currentPath);\n\n // 2 depth\n if (res.category && res.category.depth) {\n res.depth = getClosestRoute<Sitemap>(\n res.category.depth as Sitemap[],\n currentPath,\n );\n }\n\n return res;\n};\n","/**\n * 오름차순 정렬\n * @util\n * @param {string | number | null} a\n * @param {string | number | null} b\n */\nimport type { SortableDateValue, SortableValue } from \"./type\";\n\nexport const sortAsc = (a: SortableValue, b: SortableValue) => {\n if (a === null || b === null) {\n if (a === null && b !== null) return 1;\n if (a !== null && b === null) return -1;\n return 0;\n }\n return a < b ? -1 : a > b ? 1 : 0;\n};\n\n/**\n * 내림차순 정렬\n * @util\n * @param {string | number | null} a\n * @param {string | number | null} b\n */\nexport const sortDesc = (a: SortableValue, b: SortableValue) => {\n if (a === null || b === null) {\n if (a === null && b !== null) return 1;\n if (a !== null && b === null) return -1;\n return 0;\n }\n return a > b ? -1 : a < b ? 1 : 0;\n};\n\n/**\n * 날짜순 오름차순 정렬\n * @util\n * @param {Date | number | string | null} a\n * @param {Date | number | string | null} b\n */\nexport const sortDateAsc = (a: SortableDateValue, b: SortableDateValue) => {\n if (a === null || b === null) {\n if (a === null && b !== null) return 1;\n if (a !== null && b === null) return -1;\n return 0;\n }\n return sortAsc(new Date(a).getTime(), new Date(b).getTime());\n};\n\n/**\n * 날짜순 내림차순 정렬\n * @util\n * @param {Date | number | string | null} a\n * @param {Date | number | string | null} b\n */\nexport const sortDateDesc = (a: SortableDateValue, b: SortableDateValue) => {\n if (a === null || b === null) {\n if (a === null && b !== null) return 1;\n if (a !== null && b === null) return -1;\n return 0;\n }\n return sortDesc(new Date(a).getTime(), new Date(b).getTime());\n};\n","import { convertObjectToSearchParams } from \"../convert\";\nimport { dateFormat } from \"../format\";\n\n/**\n * 콘솔로그; Next.js API Route 디버깅용\n * @util\n * @param {string} method GET, POST, DELETE\n * @param {string} routeUrl Next.js route API route URL\n * @param {string} [queryUrl] DB API route URL\n * @param {unknown[]} [messages] 로그 데이터\n */\nexport const nextAPILog = (\n method: string,\n routeUrl: string,\n queryUrl?: string,\n ...messages: unknown[]\n) => {\n if (process.env.NODE_ENV === \"production\") return;\n\n const DATE = dateFormat(new Date());\n const TIME =\n new Intl.DateTimeFormat(\"en-US\", {\n hour: \"numeric\",\n minute: \"numeric\",\n second: \"numeric\",\n hour12: false,\n }).format(new Date()) +\n \".\" +\n new Date().getMilliseconds();\n\n const REQUEST_METHOD = method.split(\"-\")[0]?.toUpperCase() || \"-\";\n const RESPONSE_METHOD = method.split(\"-\")[1]\n ? method.split(\"-\")[1]?.toUpperCase() || \"-\"\n : REQUEST_METHOD;\n\n return console.log(\n // `⚡️`,\n `\\n`,\n `[Next Server API] ⏱ ${DATE} ( ${TIME} )`,\n `\\n λ [${REQUEST_METHOD}] FE route`,\n `\\n ${routeUrl}`,\n ...(queryUrl\n ? [`\\n ═⏵ Ω [${RESPONSE_METHOD}] BE url`, `\\n ${queryUrl}`, `\\n`]\n : []),\n ...(messages?.[0] ? [` ◇-`, ...messages] : []),\n `\\n`,\n );\n};\n\n/**\n * API; 쿼리스트링 생성\n * @util\n * @param {unknown} [searchParams] 쿼리스트링으로 변환할 객체\n * @return {string} 쿼리스트링\n */\nexport const getQueryString = (searchParams?: unknown): string =>\n typeof searchParams !== \"undefined\" &&\n convertObjectToSearchParams(searchParams).toString()\n ? `?${convertObjectToSearchParams(searchParams).toString()}`\n : \"\";\n\n/**\n * API; POST/DELETE method option\n */\nexport const getFetchOptions = ({\n method,\n headers,\n body,\n}: {\n method: string;\n} & Partial<{\n headers: HeadersInit;\n body: BodyInit | null;\n}>): RequestInit => {\n const option: RequestInit = { method };\n // API fetch Headers\n if (typeof headers !== \"undefined\") Object.assign(option, { headers });\n // API fetch Body\n if (typeof body !== \"undefined\") Object.assign(option, { body });\n return option;\n};\n","import { convertObjectToSearchParams } from \"../convert\";\nimport { getFetchOptions, getQueryString, nextAPILog } from \"./util\";\nimport type { CommonPostResponseType } from \"./types\";\n\n/**\n * API 요청 url 생성; GET 타입\n * @util\n * @param {object} props\n * @param {\"ai\" | \"db\" | string} props.domain API 인프라\n * @param {string} props.routeUrl Next.js /app/api 라우트 주소\n * @param {string} props.queryUrl 백엔드 API url\n * @param {URLSearchParams} [props.searchParams] 쿼리 스트링 추출\n * @param {object} [props.log] 디버깅용 서버 로그 정보\n * @param {boolean} [props.logDisabled] 로그 비활성화\n * @return {string} GET API 요청 full url\n */\nexport const generateBackendQueryUrl_GET = ({\n domain,\n routeUrl,\n queryUrl,\n searchParams, // 가공이 완료된 파라미터\n log,\n logDisabled,\n}: {\n /**\n * API 도메인\n */\n domain: string;\n /**\n * Next.js /app/api 라우트 주소\n */\n routeUrl: string;\n /**\n * 백엔드 API url\n */\n queryUrl: string;\n} & Partial<{\n /**\n * 쿼리 스트링\n * @desc\n * - URLSearchParams 객체로 가공된 파라미터\n */\n searchParams: URLSearchParams | object;\n /**\n * 디버깅용 서버 로그 정보\n */\n log: object;\n /**\n * 로그 비활성화\n * @default false\n */\n logDisabled: boolean;\n}>): string => {\n // url 생성\n const url = `${domain}${queryUrl}${getQueryString(searchParams)}`;\n\n // 서버 로그 출력\n if (!logDisabled)\n nextAPILog(\"get\", routeUrl, url, {\n ...log,\n ...(searchParams ? searchParams : {}),\n });\n\n return url;\n};\n\n/**\n * API fetch 요청; POST/DELETE 타입\n * @util\n * @param {object} props\n * @param {\"ai\" | \"db\" | string} props.infra API 인프라\n * @param {\"POST\" | \"DELETE\"} props.method POST, DELETE\n * @param {string} props.routeUrl Next.js /app/api 라우트 주소\n * @param {string} props.queryUrl 백엔드 API url\n * @param {HeadersInit} [props.headers] fetch Headers\n * @param {BodyInit | null} [props.body] post/delete body (이대로 바로 전송됨)\n * @param {object} [props.bodyData] body로 전송하기 위해 가공이 필요한 데이터 객체\n * @param {object} [props.queryStringData] url에 쿼리스트링으로 요청하는 경우에 대한 데이터 객체\n * @param {object} [props.log] 디버깅용 서버 로그 정보\n * @param {boolean} [props.logDisabled] 로그 비활성화\n * @param {boolean} [props.fetchDisabled] fetch 실행 비활성화\n * @return {Promise<MutateAPICommonResponseType>} POST, DELETE 응답\n */\nexport const fetchBackendQuery = async <\n FetchRequestType extends object,\n FetchResponseType extends CommonPostResponseType,\n>({\n domain,\n method,\n routeUrl,\n queryUrl,\n headers,\n body,\n bodyOriginData,\n queryStringData,\n log,\n logDisabled,\n fetchDisabled,\n}: {\n /**\n * API 도메인\n */\n domain: string;\n /**\n * 요청 방식\n * POST, DELETE\n */\n method: \"POST\" | \"DELETE\";\n /**\n * 프론트 API URL\n */\n routeUrl: string;\n /**\n * 백엔드 API 요청 URL\n */\n queryUrl: string;\n} & Partial<{\n /**\n * fetch Headers\n */\n headers: HeadersInit;\n /**\n * fetch Body\n */\n body: BodyInit | null;\n /**\n * fetch Body 를 SearchParams 전환할 데이터\n */\n bodyOriginData: FetchRequestType;\n /**\n * URL 쿼리 스트링\n */\n queryStringData: FetchRequestType;\n /**\n * 디버그용 로그 객체\n */\n log: object;\n /**\n * 로그 비활성화\n */\n logDisabled: boolean;\n /**\n * fetch 비활성화\n */\n fetchDisabled: boolean;\n}>): Promise<FetchResponseType> => {\n // 쿼리 url 생성\n const url = `${domain}${queryUrl}${getQueryString(queryStringData)}`;\n\n // 에러 응답\n const errRes: FetchResponseType = {\n is_ok: false,\n idx: \"\",\n error: \"\",\n } as FetchResponseType;\n\n const bodyData = convertObjectToSearchParams(bodyOriginData);\n\n // bodyOriginData가 undefined가 아닌데도, bodyOriginData의 데이터가 유효하지 않은 경우\n if (typeof bodyOriginData !== \"undefined\" && bodyData.toString() === \"\") {\n if (!logDisabled) {\n nextAPILog(method.toLowerCase(), routeUrl, url, {\n state: \"ERROR (BODY - ORIGIN DATA)\",\n error: \"데이터가 유효하지 않습니다.\",\n bodyOriginData,\n ...log,\n });\n }\n errRes.error = \"데이터가 유효하지 않습니다.\";\n return errRes;\n }\n\n // 쿼리 옵션 생성\n const option: RequestInit = getFetchOptions({\n method,\n headers,\n body,\n });\n if (!body && typeof bodyOriginData !== \"undefined\")\n Object.assign(option, { body: bodyData });\n\n // 로그 옵션\n if (!logDisabled) {\n // 쿼리 전 로그 출력\n nextAPILog(method.toLowerCase(), routeUrl, url, {\n state: \"READY\",\n ...option,\n ...log,\n });\n }\n\n // 디버깅을 위한 fetch 요청 제한\n if (fetchDisabled) {\n errRes.error = \"API 요청제한 활성화됨.\";\n return errRes;\n }\n\n try {\n const res: FetchResponseType = await (await fetch(url, option)).json();\n\n if (!logDisabled) {\n // API 응답 성공 여부\n const isSuccess =\n \"is_ok\" in res && typeof res?.is_ok === \"boolean\" && res.is_ok === true;\n\n nextAPILog(method.toLowerCase(), routeUrl, url, {\n state: isSuccess ? \"SUCCESS\" : \"FAIL\",\n ...res,\n });\n }\n\n return res;\n } catch (error: unknown) {\n errRes.error =\n error instanceof Error\n ? error.message || \"알 수 없는 오류가 발생하였습니다.\"\n : String(error);\n\n if (!logDisabled) {\n nextAPILog(method.toLowerCase(), routeUrl, url, {\n state: \"ERROR (RESPONSE)\",\n error,\n ...log,\n });\n }\n\n return errRes;\n }\n};\n\n/**\n * API; POST/DELETE method fetch\n * @util\n * @param {object} props\n * @param {\"ai\" | \"db\" | string} props.domain\n * @param {\"POST\" | \"DELETE\"} props.method POST, DELETE\n * @param {string} props.routeUrl Next.js /app/api 라우트 주소\n * @param {string} props.queryUrl 백엔드 API url\n * @param {HeadersInit} [props.headers] fetch Headers\n * @param {BodyInit | null} [props.body] post/delete body (이대로 바로 전송됨)\n * @param {object} [props.bodyData] body로 전송하기 위해 가공이 필요한 데이터 객체\n * @param {object} [props.log] 디버깅용 서버 로그 정보\n * @param {boolean} [props.logDisabled] 로그 비활성화\n * @param {boolean} [props.fetchDisabled] fetch 실행 비활성화\n * @param {object} [props.alternateResponse] fetch 실패 시 대체 응답\n * @return {Promise<ResponseType>} POST, DELETE 응답\n */\nexport const fetchWithBody = async <\n BodyDataType = object,\n ResponseType extends object | Response = Response,\n>({\n domain,\n method,\n routeUrl,\n queryUrl,\n searchParams,\n headers,\n body,\n bodyData,\n isRawResponse,\n alternateResponse,\n debug,\n disabled,\n disabledLog,\n}: {\n /**\n * API 도메인\n */\n domain: string;\n /**\n * 요청 방식\n * POST, DELETE\n */\n method: string;\n /**\n * 프론트 API URL\n */\n routeUrl: string;\n /**\n * 백엔드 API 요청 URL\n */\n queryUrl: string;\n /**\n * fetch 실패 시 대체 응답\n */\n alternateResponse: ResponseType;\n} & Partial<{\n searchParams: URLSearchParams | object;\n /**\n * fetch Headers\n */\n headers: HeadersInit;\n /**\n * fetch Body\n */\n body: BodyInit | null;\n /**\n * fetch Body Data\n */\n bodyData: BodyDataType;\n /**\n * 응답값 원본으로 return\n * const responseRaw = await fetch(api);\n */\n isRawResponse: boolean;\n /**\n * 디버그용 로그 객체\n */\n debug: object;\n /**\n * fetch 비활성화\n */\n disabled: boolean;\n /**\n * 로그 비활성화\n */\n disabledLog: boolean;\n}>): Promise<ResponseType> => {\n // ------------------------------------- API 요청 URL 생성\n\n // url 생성\n const url = `${domain}${queryUrl}${getQueryString(searchParams)}`;\n\n // ------------------------------------- 쿼리 옵션 생성\n const option: RequestInit = getFetchOptions({\n method,\n headers,\n body,\n });\n\n // ------------------------------------- body data 적용\n // 완성된 body가 없고, body 데이터는 있는 경우\n if (!body && typeof bodyData !== \"undefined\") {\n // bodyData가 undefined가 아닌데도, bodyData의 데이터가 유효하지 않은 경우\n if (typeof bodyData !== \"undefined\" && String(bodyData) === \"\") {\n nextAPILog(method.toLowerCase(), routeUrl, url, {\n state: \"ERROR (BODY - DATA)\",\n error: \"데이터가 유효하지 않습니다.\",\n bodyData,\n ...debug,\n });\n\n return alternateResponse;\n }\n\n // option에 bodyData 적용\n Object.assign(option, { body: bodyData });\n }\n\n // option 준비가 완료되면, READY 상태\n if (!disabledLog)\n nextAPILog(method.toLowerCase(), routeUrl, url, {\n state: \"READY\",\n ...option,\n ...debug,\n });\n\n // ------------------------------------- fetch 요청\n if (disabled) {\n // fetch 요청 비활성화\n nextAPILog(method.toLowerCase(), routeUrl, url, {\n state: \"FETCH DISABLED\",\n message: \"API 요청제한 활성화됨.\",\n });\n return alternateResponse;\n }\n\n try {\n const responseRaw = await fetch(url, option);\n\n // API 응답 상태 코드\n const resCode = responseRaw.status;\n\n // API 응답 성공 여부\n if (!disabledLog) {\n nextAPILog(method.toLowerCase(), routeUrl, url, {\n state: resCode === 200 ? \"SUCCESS\" : \"FAIL\",\n code: resCode,\n });\n }\n\n if (isRawResponse) return responseRaw as ResponseType;\n\n const res = await responseRaw.json();\n return res;\n } catch (error: unknown) {\n // 에러 응답\n if (!disabledLog)\n nextAPILog(method.toLowerCase(), routeUrl, url, {\n state: \"ERROR (RESPONSE)\",\n error,\n ...debug,\n });\n\n return alternateResponse;\n }\n};\n","import type { BreakPointType, DeviceCategoryType } from \"./types\";\n\n/**\n * Apple 디바이스\n */\nconst apple: string[] = [\"iPhone\", \"iPad\", \"iPod\", \"Mac\", \"Macintosh\"];\n/**\n * 태블릿 디바이스\n */\nconst tablet: string[] = [\"Tablet\", \"iPad\", \"playbook\", \"silk\"];\n/**\n * 모바일 디바이스\n */\nconst mobile: string[] = [\n \"Android\",\n \"Mobile\",\n \"iPhone\",\n \"iPod\",\n \"iPad\",\n \"BlackBerry\",\n \"IEMobile\",\n \"Kindle\",\n \"NetFront\",\n \"Silk-Accelerated\",\n \"hpwOS\",\n \"webOS\",\n \"Fennec\",\n \"Minimo\",\n \"Opera Mobi\",\n \"Opera Mini\",\n \"Blazer\",\n \"Dolfin\",\n \"Dolphin\",\n \"Skyfire\",\n \"Zune\",\n];\n\nexport const userAgentCollection: Record<DeviceCategoryType, string[]> = {\n apple,\n tablet,\n mobile,\n};\n\nconst setLowerCase = (v: unknown): string => String(v).toLowerCase();\nconst deviceLowerCasePatterns: Record<DeviceCategoryType, string[]> = {\n apple: apple.map(setLowerCase),\n tablet: tablet.map(setLowerCase),\n mobile: mobile.map(setLowerCase),\n};\n\n/**\n * 반응형 웹 breakpoint 감지\n */\nexport const checkResponsiveDevice = (userAgent: string): BreakPointType => {\n const { mobile, tablet } = deviceLowerCasePatterns;\n const clientAgent = setLowerCase(userAgent);\n const isTablet = tablet.some(agent => clientAgent.includes(agent));\n const isMobile = mobile.some(agent => clientAgent.includes(agent));\n\n if (isMobile) return isTablet ? \"tablet\" : \"mobile\";\n\n return \"desktop\";\n};\n\n/**\n * 애플 디바이스 감지\n */\nexport const checkAppleDevice = (userAgent: string): boolean => {\n const { apple } = deviceLowerCasePatterns;\n const clientAgent = setLowerCase(userAgent);\n return apple.some(agent => clientAgent.includes(agent));\n};\n","import type { DisplayMode, PwaRuntimeInfo } from \"./types\";\n\nconst DISPLAY_MODE_QUERIES: Array<{ mode: DisplayMode; query: string }> = [\n { mode: \"standalone\", query: \"(display-mode: standalone)\" },\n { mode: \"fullscreen\", query: \"(display-mode: fullscreen)\" },\n { mode: \"minimal-ui\", query: \"(display-mode: minimal-ui)\" },\n { mode: \"browser\", query: \"(display-mode: browser)\" },\n];\n\nconst STANDALONE_DISPLAY_MODES: ReadonlySet<DisplayMode> = new Set([\n \"standalone\",\n \"fullscreen\",\n \"minimal-ui\",\n]);\n\nconst isWindowAvailable = (): boolean => typeof window !== \"undefined\";\n\nconst detectDisplayMode = (): DisplayMode => {\n if (!isWindowAvailable() || typeof window.matchMedia !== \"function\") {\n return \"unknown\";\n }\n\n for (const { mode, query } of DISPLAY_MODE_QUERIES) {\n if (window.matchMedia(query).matches) {\n return mode;\n }\n }\n\n return \"unknown\";\n};\n\nconst detectNavigatorStandalone = (): boolean => {\n if (!isWindowAvailable()) {\n return false;\n }\n\n const nav = window.navigator as Navigator & { standalone?: boolean };\n return typeof nav.standalone === \"boolean\" ? Boolean(nav.standalone) : false;\n};\n\nexport const getPwaRuntimeInfo = (): PwaRuntimeInfo => {\n const displayMode = detectDisplayMode();\n const navigatorStandalone = detectNavigatorStandalone();\n\n if (displayMode === \"unknown\" && navigatorStandalone) {\n return { isStandalone: true, displayMode: \"standalone\" };\n }\n\n return {\n displayMode,\n isStandalone:\n displayMode === \"unknown\"\n ? navigatorStandalone\n : STANDALONE_DISPLAY_MODES.has(displayMode),\n };\n};\n\nexport const checkStandaloneApp = getPwaRuntimeInfo;\n","import type { CheckboxStateMap } from \"./type\";\n\n/**\n * \"전체\" 항목 선택에 따른 단일 항목 업데이트\n * @util\n * @param {Record<string, boolean>} checkStateObject 체크 상태관리 객체\n * @param {boolean} allCheckState 동기화할 \"전체\" 선택 상태\n * @return {Record<string, boolean>} 업데이트된 체크 상태관리 객체\n */\n\nexport const syncAllToEach = (\n checkStateObject: CheckboxStateMap,\n allCheckState: boolean,\n): CheckboxStateMap =>\n Object.fromEntries(\n Object.entries(checkStateObject).map(([key]) => [key, allCheckState]),\n );\n\n/**\n * 단일 항목 선택에 따른 \"전체\" 항목 업데이트\n * @util\n * @param {Record<string, boolean>} checkStateObject 체크 상태관리 객체\n * @param {string} eachKey 선택한 단일 항목 키\n * @param {boolean} eachChecked 선택한 단일 항목 선택 상태\n * @return {Record<string, boolean>} 업데이트된 체크 상태관리 객체\n */\nexport const syncEachToAll = (\n checkStateObject: CheckboxStateMap,\n eachKey: string,\n eachChecked: boolean,\n): CheckboxStateMap => {\n const res = { ...checkStateObject, [eachKey]: eachChecked };\n const exceptStateAll = Object.entries(res)\n .filter(([key]) => key !== \"all\")\n .map(([, checked]) => checked);\n\n const isAllEachChecked = Object.values(exceptStateAll).every(\n checked => checked,\n );\n\n res.all = isAllEachChecked;\n\n return res;\n};\n","import type { StyleSpacingArray, StyleSpacingType } from \"./type\";\n\n/**\n * 스타일 변수; rem 단위\n * @util\n */\nexport const styleRemAmount = 10;\n\n/**\n * 스타일 함수; px 단위를 rem 단위로 변환\n * @util\n * @param {number} v - px\n */\nexport const styleRem = (v: number): string => `${v / styleRemAmount}rem`;\n\n/**\n * 스타일 함수; px 또는 string을 유효한 스타일 문자열로 변환\n * @util\n * @param {\"px\" | \"rem\"} unit - 단위 (px 또는 rem)\n * @param {unknown} v - px 또는 string\n * @param {number | string} [alt] - 대체 값 (px 또는 string)\n * @returns {string} 유효한 스타일 문자열\n */\nexport const styleBaseSize = (\n unit: \"px\" | \"rem\",\n v: unknown,\n alt?: number | string,\n): string => {\n // 유효하지 않은 값인 경우 \"auto\"\n if (![\"number\", \"string\"].includes(typeof v) && typeof alt === \"undefined\")\n return \"auto\";\n\n if (typeof v === \"number\")\n return unit === \"rem\" ? styleRem(v) : `${v}${unit}`;\n // 유효한 스타일 문자인 경우\n if (typeof v === \"string\" && v) return v;\n\n // 대체 값이 있는 경우\n if (typeof alt === \"number\")\n return unit === \"rem\" ? styleRem(alt) : `${alt}${unit}`;\n else if (typeof alt === \"string\" && alt) return alt;\n\n return String(v);\n};\n\n/**\n * 스타일 함수; padding, margin 배열을 스타일 문자열로 변환\n * @util\n * @param {\"px\" | \"rem\"} unit - 단위 (px 또는 rem)\n * @param {FixedLengthArray<number | string, 2 | 3 | 4>} v - 스타일 배열\n * @returns {string} 스타일 문자열\n * @desc\n * 파라미터 패턴\n * - [상하좌우]: 일괄적용 처리\n * - [상하, 좌우]: [top-bottom, left-right]\n * - [상, 좌우, 하]: [top, left-right, bottom]\n * - [상, 우, 하, 좌]: [top, right, bottom, left\n */\nexport const styleSpacingArray = (\n unit: \"px\" | \"rem\",\n v: StyleSpacingArray,\n): string => v.map(space => styleBaseSize(unit, space)).join(\" \");\n\n/**\n * 스타일 함수; padding, margin 옵션을 스타일 문자열로 변환\n * @util\n * @param {\"px\" | \"rem\"} unit - 단위 (px 또는 rem)\n * @param {StyleSpacingType} spacing - 스타일 패딩 타입\n * @param {StyleSpacingType} [alt] - 대체 값 (px 또는 string)\n * @desc\n * - number | string: 단일 값\n * - [상하좌우]: 일괄적용 처리\n * - [상하, 좌우]: [top-bottom, left-right]\n * - [상, 좌우, 하]: [top, left-right, bottom]\n * - [상, 우, 하, 좌]: [top, right, bottom, left\n */\nexport const styleSpacingSize = (\n unit: \"px\" | \"rem\",\n spacing: StyleSpacingType | undefined,\n alt?: StyleSpacingType,\n): string => {\n if (typeof spacing === \"undefined\") {\n if (typeof alt === \"undefined\") return \"0\";\n\n // 대체 값이 있는 경우\n if (Array.isArray(alt)) return styleSpacingArray(unit, alt);\n else if ([\"number\", \"string\"].includes(typeof alt) && alt !== \"\")\n return styleBaseSize(unit, alt as number | string);\n }\n // 단일 값인 경우\n if ([\"number\", \"string\"].includes(typeof spacing) && spacing !== \"\")\n return styleBaseSize(unit, spacing as number | string);\n\n // 배열 지정하는 경우\n if (Array.isArray(spacing)) return styleSpacingArray(unit, spacing);\n\n return String(spacing);\n};\n\n/**\n * 스타일 함수; padding 옵션을 스타일 문자열로 변환\n * @util\n * @param {\"px\" | \"rem\"} unit - 단위 (px 또는 rem)\n * @param {StyleSpacingType} padding - 스타일 패딩 타입\n * @param {StyleSpacingType} [alt] - 대체 값 (px 또는 string)\n * @desc\n * - number | string: 단일 값\n * - [상하좌우]: 일괄적용 처리\n * - [상하, 좌우]: [top-bottom, left-right]\n * - [상, 좌우, 하]: [top, left-right, bottom]\n * - [상, 우, 하, 좌]: [top, right, bottom, left]\n */\nexport const stylePaddingSize = styleSpacingSize;\n\n/**\n * 스타일 함수; margin 옵션을 스타일 문자열로 변환\n * @util\n * @param {\"px\" | \"rem\"} unit - 단위 (px 또는 rem)\n * @param {StyleSpacingType} margin - 스타일 마진 타입\n * @param {StyleSpacingType} [alt] - 대체 값 (px 또는 string)\n * @desc\n * - number | string: 단일 값\n * - [상하좌우]: 일괄적용 처리\n * - [상하, 좌우]: [top-bottom, left-right]\n * - [상, 좌우, 하]: [top, left-right, bottom]\n * - [상, 우, 하, 좌]: [top, right, bottom, left]\n */\nexport const styleMarginSize = styleSpacingSize;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/reg-exp/module.ts","../src/validation/module.ts","../src/mask/module.ts","../src/format/module.ts","../src/convert/module.ts","../src/date/module.ts","../src/route/module.ts","../src/sort/module.ts","../src/api/util.ts","../src/api/module.ts","../src/runtime-env/device.ts","../src/runtime-env/pwa.ts","../src/form/checkbox/module.ts","../src/style/size/module.ts"],"names":["d","date","mobile","tablet","apple"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { EscapeTarget } from \"./type\";\n\n/**\n * 정규식 패턴으로 특수기호 제거\n * @util\n * @param {string} text\n * @return {string}\n */\nexport const escapeSymbol = (text: EscapeTarget): string => {\n // 정규식 패턴. 특수 문자를 찾습니다.\n const specialCharPattern = /([.*+?^${}()|[\\]\\\\])/g;\n\n // 텍스트에서 특수 문자를 찾아서 escape 처리합니다.\n const escapedText = text.replace(specialCharPattern, \"\\\\$1\");\n\n return escapedText;\n};\n\n/**\n * 정규식 패턴으로 따옴표 제거\n * @util\n * @param {string} text\n * @return {string}\n */\nexport const escapeQuotes = (text: EscapeTarget): string => {\n const quotesPattern = /[\"']/g;\n return text.replace(quotesPattern, \"\");\n};\n","/**\n * validation; 인덱스 데이터 체크\n * @util\n * @validation\n * @param {string | number} idxValue 인덱스 데이터\n * @return {boolean}\n */\nimport type {\n BuildingNoListString,\n NullableNumericIdentifier,\n NumericIdentifier,\n TimeFormatString,\n} from \"./type\";\n\nexport const isValidIdx = (idxValue?: NumericIdentifier): boolean =>\n typeof idxValue !== \"undefined\" &&\n idxValue !== \"\" &&\n !isNaN(Number(idxValue)) &&\n Number(idxValue) > 0;\n\n/**\n * validation; 배열 데이터 체크\n * @util\n * @validation\n * @param {unknown} array 배열 데이터\n * @return {boolean}\n */\nexport const isValidArray = (array?: unknown): boolean =>\n typeof array !== \"undefined\" && Array.isArray(array);\n\n/**\n * validation; 사업자등록번호 데이터 체크\n * @util\n * @validation\n * @param {unknown} businessCode 농장 사업자등록번호\n * @return {boolean}\n */\nexport const isValidBusinessCode = (businessCode: unknown): boolean => {\n if (!businessCode) return false;\n if (String(businessCode).length === 10) return !isNaN(Number(businessCode));\n return false;\n};\n\n/**\n * validation; 날짜 변환을 허용할 유효 number 시간값 체크\n * @util\n * @validation\n * @param {number} dateNumber\n * @return {boolean}\n */\nexport const isValidDateNumber = (dateNumber: number): boolean => {\n const DATE_MIN = 1672498800000; // 2023-01-01T00:00:00\n const DATE_MAX = 4828172400000; // 2123-01-01T00:00:00\n return DATE_MIN < dateNumber && dateNumber < DATE_MAX;\n};\n\n/**\n * validation; 날짜 데이터 체크\n * @util\n * @validation\n * @param {unknown} date 날짜\n * @return {boolean}\n */\nexport const isValidDateType = (date: unknown): boolean => {\n if (!date) return false;\n if (\n typeof date === \"string\" ||\n (typeof date === \"number\" && isValidDateNumber(date)) ||\n date instanceof Date\n )\n return new Date(date) instanceof Date && !isNaN(new Date(date).valueOf());\n return false;\n};\n\n/**\n * validation; uuidx 계군 식별코드 데이터 체크\n * @util\n * @validation\n * @param {string} uuidx 계군 식별코드\n * @return {boolean}\n */\nexport const isValidUuidx = (uuidx?: string): boolean =>\n typeof uuidx !== \"undefined\" && uuidx !== \"\";\n\n/**\n * validation; 사육동 번호 데이터 체크\n * @util\n * @validation\n * @param {string | number} buildingNo 사육동 번호\n * @return {boolean}\n */\nexport const isValidBuildingNo = (\n buildingNo?: NullableNumericIdentifier,\n): boolean =>\n typeof buildingNo !== \"undefined\" &&\n buildingNo !== \"\" &&\n !isNaN(Number(buildingNo)) &&\n Number(buildingNo) > 0;\n\n/**\n * validation; building_no_s 사육동 번호 복수형 데이터 체크\n * @util\n * @validation\n * @param {string} buildingNoList 사육동 번호 1,2,4,...\n * @return {boolean}\n */\nexport const isValidBuildingNoList = (\n buildingNoList?: BuildingNoListString,\n): boolean =>\n typeof buildingNoList === \"string\" &&\n buildingNoList !== \"\" &&\n buildingNoList.split(\",\").length > 0;\n\n/**\n * validation; 숫자 데이터 체크\n * @util\n * @validation\n * @param {unknown} value 숫자 확인 데이터\n * @return {boolean}\n */\nexport const isValidNumber = (value: unknown): boolean =>\n typeof value !== \"undefined\" && !isNaN(Number(value)) && value !== \"\";\n\n/**\n * validation; 카테고리 이름이 업체인지 여부\n * @util\n * @validation\n * @param {string} categoryName 카테고리 이름\n * @return {boolean}\n */\nexport const isValidFirmCategory = (categoryName?: string): boolean =>\n typeof categoryName === \"string\" &&\n /[농장|정부기관|유통사|수의사|병성기관|부화장|도계장|사료|약품|유니아이]/.test(\n categoryName,\n );\n\n/**\n * validation; 카테고리 이름이 약품/사료인지 여부\n * @util\n * @validation\n * @param {string} categoryName 카테고리 이름\n * @return {boolean}\n */\nexport const isValidFeedMedicineCategory = (categoryName?: string): boolean =>\n typeof categoryName === \"string\" && /[약품|사료]/.test(categoryName);\n\n/**\n * validation; 시간 데이터 HH:MM:SS 포맷 체크\n * @util\n * @validation\n * @param {string} time\n * @return {boolean}\n */\nexport const isValidTimeStringFormat = (time: TimeFormatString): boolean => {\n const hms = time.split(\":\");\n if (hms.length !== 3 || hms.some(t => isNaN(Number(t)))) return false;\n\n // hour\n if (Number(hms[0]) < 0 || Number(hms[0]) > 24) return false;\n // minutes\n if (Number(hms[1]) < 0 || Number(hms[1]) > 59) return false;\n // seconds\n if (Number(hms[2]) < 0 || Number(hms[2]) > 59) return false;\n\n return true;\n};\n","import type { MaskDecimalSeparatorOptions, MaskNumericValue } from \"./type\";\n\n/**\n * 전화번호 포맷 마스크\n * @util\n * @param {string | number} value\n * @return {string}\n * @desc\n * - 규칙: [\n * 999-9999(7),\n * 9999-9999(8),\n * 99-999-9999(9),\n * 99-9999-9999(10),\n * 999-999-9999(10),\n * 999-9999-9999(11),\n * ];\n * - 지역번호 구분:\n * 01X: 휴대전화\n * 02 ~ 0XX: 지역번호\n */\nexport function maskPhone(value: MaskNumericValue): string {\n // 입력값\n const originValue = String(value).replace(/[^0-9]/g, \"\");\n\n if (isNaN(Number(originValue))) return originValue;\n\n // 11자리 제한\n const v = originValue.length > 11 ? originValue.slice(0, 11) : originValue;\n\n let maskValue = v;\n\n // 999-9999\n if (3 < v.length && v.length <= 7) {\n maskValue = `${v.slice(0, 3)}-${v.slice(3)}`;\n }\n // 9999-9999\n else if (v.length === 8) {\n maskValue = `${v.slice(0, 4)}-${v.slice(4)}`;\n }\n // 99-999-9999\n else if (v.length === 9) {\n maskValue = `${v.slice(0, 2)}-${v.slice(2, 5)}-${v.slice(5)}`;\n }\n // 99-9999-9999, 999-999-9999\n else if (v.length === 10) {\n const firstDigits = v.startsWith(\"02\") ? 2 : 3;\n // 02-9999-9999\n if (firstDigits === 2) {\n maskValue = `${v.slice(0, 2)}-${v.slice(2, 6)}-${v.slice(6)}`;\n }\n // 0XX-999-9999\n else {\n maskValue = `${v.slice(0, 3)}-${v.slice(3, 6)}-${v.slice(6)}`;\n }\n } else if (v.length > 10) {\n maskValue = `${v.slice(0, 3)}-${v.slice(3, 7)}-${v.slice(7)}`;\n }\n\n return maskValue;\n}\n\n/**\n * 주민등록번호 포맷 마스크\n * @util\n * @param {string | number} value\n * @return {string}\n * @desc\n * - 규칙: 999999-9999999\n */\nexport function maskResidentCode(value: MaskNumericValue): string {\n // 입력값\n const originValue = String(value).replace(/[^0-9]/g, \"\");\n\n if (isNaN(Number(originValue))) return originValue;\n\n // 11자리 제한\n const v = originValue.length > 6 ? originValue.slice(0, 6) : originValue;\n return v.length > 6 ? v.slice(0, 6) : v;\n\n let maskValue = v;\n\n // 999999-9999999\n if (6 < v.length) {\n maskValue = `${v.slice(0, 6)}-${v.slice(6)}`;\n }\n\n return maskValue;\n}\n\n/**\n * 사업자등록번호 포맷 마스크\n * @util\n * @param {string | number} value\n * @return {string}\n * @desc\n * - 규칙: 999-99-99999\n */\nexport function maskBusinessCode(value: MaskNumericValue): string {\n // 입력값\n const originValue = String(value).replace(/[^0-9]/g, \"\");\n\n if (isNaN(Number(originValue))) return originValue;\n\n // 11자리 제한\n const v = originValue.length > 10 ? originValue.slice(0, 10) : originValue;\n\n let maskValue = v;\n\n // 999-99-99999\n if (3 < v.length && v.length < 6) {\n maskValue = `${v.slice(0, 3)}-${v.slice(3)}`;\n } else if (6 <= v.length) {\n maskValue = `${v.slice(0, 3)}-${v.slice(3, 5)}-${v.slice(5)}`;\n }\n\n return maskValue;\n}\n\n/**\n * 1,000단위 숫자 구분 comma (decimal separator)\n * @util\n * @param {string | number} value\n * @param {Intl.NumberFormatOptions} options\n * @return {string}\n */\nexport function maskDecimalSeparator(\n value: MaskNumericValue,\n options?: MaskDecimalSeparatorOptions,\n): string {\n // 입력값\n const pureNumberValue = String(value).replace(/[^0-9.-]/g, \"\");\n\n if (isNaN(Number(pureNumberValue))) return pureNumberValue;\n\n const originValue = String(value).replace(/[^0-9,.-]/g, \"\");\n const isPoint =\n originValue !== \"\" && originValue.indexOf(\".\") === originValue.length - 1;\n\n const v = String(value).replace(/[^0-9.-]/g, \"\");\n if (isNaN(Number(v))) return String(originValue);\n\n return v === \"\"\n ? \"\"\n : `${new Intl.NumberFormat(\"en-US\", {\n style: \"decimal\",\n ...options,\n }).format(Number(v))}${isPoint ? \".\" : \"\"}`;\n}\n\n/**\n * 날짜 표현\n * @util\n * @param {string | number} value\n * @return {string}\n * @desc\n * - 규칙 : 9999-99-99\n */\nexport function maskDate(value: MaskNumericValue): string {\n // 입력값\n const originValue = String(value).replace(/[^0-9]/g, \"\");\n\n if (isNaN(Number(originValue))) return originValue;\n\n // 8자리 제한\n const v = originValue.length > 8 ? originValue.slice(0, 8) : originValue;\n\n let maskValue = v;\n\n // 9999.99.99.\n if (4 < v.length && v.length < 7) {\n maskValue = `${v.slice(0, 4)}-${v.slice(4)}`;\n } else if (7 <= v.length) {\n maskValue = `${v.slice(0, 4)}-${v.slice(4, 6)}-${v.slice(6)}`;\n }\n\n return maskValue;\n}\n","import { convert2Digit } from \"../convert/module\";\nimport { maskPhone } from \"../mask/module\";\nimport { isValidDateType } from \"../validation/module\";\nimport type { DateTimeFormatOptionsType, DurationFormatOptions } from \"./type\";\n\n/**\n * comma 마스킹된 숫자 Number 타입으로 변환\n * @util\n * @param {number | string} value 타입 변환 값\n * @param {boolean} [isString]\n * @return {number | string}\n */\nexport const getNumberReplaceComma = (\n value: unknown,\n isString?: boolean,\n): number | string => {\n if (\n ![\"number\", \"string\"].includes(typeof value) ||\n value === null ||\n value === \"\"\n )\n return \"\";\n\n if (typeof value === \"number\") return value;\n\n const v = Number(String(value).replace(/[^0-9.-]/g, \"\"));\n if (isNaN(Number(v))) return isString ? \"\" : 0;\n\n return isString ? String(v) : v;\n};\n\n/**\n * 수량을 1000단위로 comma표기\n * @util\n * @param {unknown} value 숫자\n * @param {number} [digit] 소수점 자리수 고정 옵션\n * @return {string}\n */\nexport const lengthFormat = (value: unknown, digit?: number): string => {\n if (\n ![\"number\", \"string\"].includes(typeof value) ||\n value === null ||\n value === \"\"\n )\n return \"-\";\n\n if (isNaN(Number(getNumberReplaceComma(value)))) return String(value);\n\n // 소수점 고정 옵션\n const digitOptions: Intl.NumberFormatOptions =\n typeof digit === \"number\"\n ? { minimumFractionDigits: digit, maximumFractionDigits: digit }\n : {};\n\n return new Intl.NumberFormat(\"en-US\", digitOptions).format(Number(value));\n};\n\n/**\n * 날짜 사용 옵션\n */\nconst DATE_FULL_OPTION: Intl.DateTimeFormatOptions = {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n};\n\n/**\n * 날짜 사용 안함 옵션\n */\nconst NO_DATE_OPTION: Intl.DateTimeFormatOptions = {\n year: undefined,\n month: undefined,\n day: undefined,\n};\n\n/**\n * 24시간 사용 옵션\n */\nconst TIME_FULL_OPTION: Intl.DateTimeFormatOptions = {\n hour12: false,\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n};\n\n/**\n * 시간 사용 안함 옵션\n */\nconst NO_TIME_OPTION: Intl.DateTimeFormatOptions = {\n hour: undefined,\n minute: undefined,\n second: undefined,\n};\n\n/**\n * 접속위치에 따른 시간대 보정\n * @util\n * @param {Date} date 보정할 시간\n * @return {Date} 보정된 시간\n */\n// 변경: correctTimezone 함수를 UTC 산출 후 KST로 변경\nexport const correctTimezone = (date: string | Date): Date => {\n const utc =\n new Date(date).getTime() + new Date(date).getTimezoneOffset() * 60000;\n return new Date(utc + 9 * 60 * 60000);\n};\n\n/**\n * Date 타입 데이터를 yyyy-mm-dd로 변환\n * @util\n * @param {unknown} date\n * @param {DateTimeFormatOptionsType} [options]\n * @param {Intl.LocalesArgument} [options.formatTimezone] 시간 기준; 기본값 ko-KR\n * @param {Intl.DateTimeFormatOptions} [options.formatOptions]\n * @param {boolean | boolean[]} [options.isKorean] // ymd 또는 [year, month?, day?]\n * @param {boolean} [options.isCorrection] 시간 보정\n * @param {boolean} [options.isISOString] ISO 문자열\n * @return {string} yyyy-mm-dd 또는 각 옵션에 대한 날짜포맷\n */\n// 변경: dateFormat 함수에서 isCorrection 옵션 사용 시 toISOString()의 결과를 슬라이스하여 \"YYYY-MM-DDTHH:MM:SS\" 형식 반환\nexport const dateFormat = (\n date: unknown,\n options?: Partial<DateTimeFormatOptionsType>,\n): string => {\n if (isValidDateType(date)) {\n const d = new Date(date as string | number | Date);\n const corrDate = correctTimezone(d);\n\n // toISOString()으로 변환 시, KST 적용되지 않음\n const defaultDateFormat = options?.isCorrection\n ? `${corrDate.getFullYear()}-${convert2Digit(corrDate.getMonth() + 1)}-${convert2Digit(corrDate.getDate())}`\n : `${d.getFullYear()}-${convert2Digit(d.getMonth() + 1)}-${convert2Digit(d.getDate())}`;\n\n if (options?.isISOString) return defaultDateFormat;\n\n const onlyDate = defaultDateFormat || \"\";\n\n if (options?.isKorean) {\n const [y, m, d] = onlyDate.split(\"-\");\n if (options.isKorean === true) return `${y}년 ${m}월 ${d}일`;\n const __ymd = options.isKorean.map((apply, index) => {\n switch (index) {\n case 0:\n return apply ? `${y}년` : \"\";\n case 1:\n return apply ? `${m}월` : \"\";\n case 2:\n return apply ? `${d}일` : \"\";\n default:\n return \"\";\n }\n });\n return __ymd.join(\" \");\n }\n\n if (typeof options?.formatOptions !== \"undefined\")\n return new Intl.DateTimeFormat(\n options?.formatTimezone ? options.formatTimezone : \"ko-KR\",\n { ...DATE_FULL_OPTION, ...options.formatOptions, ...NO_TIME_OPTION },\n ).format(d);\n return onlyDate;\n }\n return String(date);\n};\n\n/**\n * Date 타입 데이터를 HH:MM:SS 시간으로 변환\n * @util\n * @param {unknown} date\n * @param {DateTimeFormatOptionsType} [options]\n * @param {Intl.LocalesArgument} [options.formatTimezone] 시간 기준; 기본값 ko-KR\n * @param {Intl.DateTimeFormatOptions} [options.formatOptions]\n * @param {boolean | boolean[]} [options.isKorean] // ymd 또는 [year, month?, day?]\n * @param {boolean} [options.isCorrection] 시간 보정\n * @param {boolean} [options.isISOString] ISO 문자열\n * @return {string} HH:MM:SS\n */\n// 변경: timeFormat 함수에서 isCorrection 옵션 사용 시 toISOString()의 시간 부분만 슬라이스하여 \"HH:MM:SS\" 형식 반환\nexport const timeFormat = (\n date: unknown,\n options?: Partial<DateTimeFormatOptionsType>,\n): string => {\n if (isValidDateType(date)) {\n const d = new Date(date as string | number | Date);\n\n if (options?.isKST) {\n const utc = d.getTime() + 60 * 60 * 1000 * 9;\n d.setTime(utc);\n }\n\n const defaultDateFormat = options?.isCorrection\n ? correctTimezone(d).toISOString().split(\"T\")[1].split(\".\")[0]\n : new Intl.DateTimeFormat(\"en-US\", {\n ...TIME_FULL_OPTION,\n ...NO_DATE_OPTION,\n }).format(d);\n\n if (options?.isISOString) return defaultDateFormat;\n\n const onlyDate = defaultDateFormat || \"\";\n\n if (options?.isKorean) {\n const [hr, min, sec] = onlyDate.split(\":\");\n if (options.isKorean === true) return `${hr}시간 ${min}분 ${sec}초`;\n const __hms = options.isKorean.map((apply, index) => {\n switch (index) {\n case 0:\n return apply ? `${hr}시간` : \"\";\n case 1:\n return apply ? `${min}분` : \"\";\n case 2:\n return apply ? `${d}초` : \"\";\n default:\n return \"\";\n }\n });\n return __hms.join(\" \");\n }\n\n if (typeof options?.formatOptions !== \"undefined\") {\n const res = new Intl.DateTimeFormat(\n options?.formatTimezone ? options.formatTimezone : \"ko-KR\",\n { ...TIME_FULL_OPTION, ...options.formatOptions, ...NO_DATE_OPTION },\n ).format(d);\n\n // console.log(\"res\", res);\n return res;\n }\n\n return onlyDate;\n }\n return String(date);\n};\n\n/**\n * 소요시간 변환\n * @util\n * @param {number | null} duration 초 단위 시간값\n */\nexport const durationFormat = (\n duration: number | null,\n options?: Partial<DurationFormatOptions>,\n): string => {\n if (duration === null) return String(duration);\n\n const hours: number | null =\n options?.hours === false ? null : Math.floor(duration / (60 * 60));\n const minutes: number | null =\n options?.minutes === false ? null : Math.floor((duration % (60 * 60)) / 60);\n const seconds: number | null =\n options?.seconds === false ? null : duration % 60;\n\n const HH = hours !== null ? `${hours}시간 ` : \"\";\n const MM = minutes !== null ? `${minutes}분 ` : \"\";\n const SS = seconds !== null ? `${seconds}초` : \"\";\n\n return `${HH}${MM}${SS}`.trim();\n};\n\n/**\n * 전화번호 타입 데이터로 변환\n * @util\n * @param {string | number} value\n * @return {string}\n * @desc\n * - 규칙: [\n * 999-9999(7),\n * 9999-9999(8),\n * 99-999-9999(9),\n * 99-9999-9999(10),\n * 999-999-9999(10),\n * 999-9999-9999(11),\n * ];\n * - 지역번호 구분:\n * 01X: 휴대전화\n * 02 ~ 0XX: 지역번호\n */\nexport const phoneNumberFormat = maskPhone;\n\n/**\n * 정수 숫자를 +/-를 붙인 형태로 변환\n * @util\n * @param {unknown} value\n * @param {boolean} [isMaskLength] 길이 마스킹 여부\n * @return {string}\n */\nexport const deltaFormat = (\n value: unknown,\n digit: number = 0,\n isMaskLength: boolean = true,\n): string => {\n if (typeof value === \"undefined\" || value === null || isNaN(Number(value)))\n return \"-\";\n\n const v = Number(value);\n\n if (v > 0) return isMaskLength ? `+${lengthFormat(v, digit)}` : `+${v}`;\n return lengthFormat(v, digit);\n};\n\n/**\n * 거리를 m 또는 km로 변환\n * @util\n * @param {number | null} distance\n * @return {string}\n */\nexport const distanceFormat = (\n distance: number | null,\n isUseUnit: boolean = true,\n): string => {\n if (distance === null) return \"-\";\n if (distance < 1000) return `${distance}${isUseUnit ? \"m\" : \"\"}`;\n return `${Math.floor(distance / 1000)}${isUseUnit ? \"km\" : \"\"}`;\n};\n","import { isValidDateType } from \"../validation/module\";\nimport { dateFormat } from \"../format/module\";\nimport type { KeyChainRecord } from \"./type\";\n\nconst isKeyChainRecord = (value: unknown): value is KeyChainRecord =>\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n typeof value !== \"function\";\n\n/**\n * 데이터를 스트링으로 변환\n * @util\n * @param {unknown} value\n * @return {string}\n */\nexport const string = (value: unknown): string => {\n if (typeof value === \"string\") return value;\n return JSON.stringify(value);\n};\n\n/**\n * 세션/로컬 스토리지 데이터 parsing\n * @util\n * @param {string} data 세션/로컬 스토리지 데이터\n * @return {unknown}\n */\nexport const parseData = (data: string): unknown => {\n // 괄호 여부 -> object | array\n if (/^(\\{|\\[)/.test(data)) return JSON.parse(data);\n // 숫자 여부 -> number\n else if (!isNaN(Number(data))) return Number(data);\n // 불리언 여부 -> boolean\n else if (data === \"true\" || data === \"false\") return JSON.parse(data);\n // undefined\n else if (data === \"undefined\") return undefined;\n\n return data; // string\n};\n\n/**\n * 키체인에 해당하는 데이터 추출\n * @util\n * @param {unknown} data 세션/로컬 스토리지 데이터\n * @param {string} keyChain 키체인\n * @return {unknown}\n */\nexport const getValueByKeyChain = (\n data: unknown,\n keyChain: string,\n): unknown => {\n // 프로퍼티를 가진 객체인지 확인\n if (isKeyChainRecord(data)) {\n // 키 체인이 남았는지 확인\n const firstChainIndex: number = keyChain.indexOf(\".\");\n if (firstChainIndex === -1) return data[keyChain as keyof KeyChainRecord];\n\n // 키 체인이 끝나지 않은 경우\n const currentKey: string = keyChain.slice(0, firstChainIndex);\n const remainKeyChain: string = keyChain.slice(firstChainIndex + 1);\n const foundData = data[currentKey as keyof KeyChainRecord];\n return isKeyChainRecord(foundData)\n ? getValueByKeyChain(foundData, remainKeyChain)\n : undefined;\n }\n\n return data;\n};\n\n/**\n * object -> URLSearchParams 데이터 변환\n * @param {unknown} data\n * @return {URLSearchParams | string}\n */\nexport const convertObjectToSearchParams = (data: unknown): URLSearchParams => {\n if (!data) {\n console.log(\"[convertObjectToSearchParams] 데이터가 유효하지 않음\", {\n data,\n });\n return new URLSearchParams();\n }\n if (data instanceof URLSearchParams) {\n return data;\n }\n\n if (isKeyChainRecord(data) && Object.keys(data).length > 0) {\n const d = Object.fromEntries(\n Object.entries(data).map(([key, value]) => [key, string(value)]),\n );\n return new URLSearchParams(d);\n }\n\n console.log(\"[convertObjectToSearchParams] 데이터가 객체가 아님\", {\n data,\n type: typeof data,\n key: isKeyChainRecord(data) ? Object.keys(data) : [],\n array: Array.isArray(data),\n });\n return new URLSearchParams();\n};\n\n// /**\n// * 배열 추가형 입력 테이블 register rule 필터링\n// * @util\n// * @param {RegisterOptionsType} ruleCollection\n// * @param {boolean} isActive\n// * @return {RegisterOptionsType}\n// */\n// export function getFieldArrayValidOptions(\n// ruleCollection: RegisterOptionsType,\n// isActive: boolean,\n// ): RegisterOptionsType {\n// const entries = Object.entries(ruleCollection);\n// const filtered = entries.map(([dataName, rule]) => {\n// const ruleEntries = Object.entries(rule).filter(\n// ([ruleKey]) => ruleKey !== \"required\",\n// );\n// return [dataName, Object.fromEntries(ruleEntries)];\n// });\n\n// return isActive ? ruleCollection : Object.fromEntries(filtered);\n// }\n\n/**\n * 텍스트 capitalize 첫글자 대문자 변환\n * @util\n * @param {string} value 텍스트\n * @return {string}\n */\nexport const capitalize = (value: string): string => {\n const first = value.charAt(0).toUpperCase();\n const others = value.slice(1);\n return `${first}${others}`;\n};\n\n/**\n * kg -> g 변환\n * @util\n * @param {number | string} kg\n * @return {number} gram\n */\nexport const covertGram = (kg: number | string): number => Number(kg) * 1000;\n\n/**\n * g -> kg 변환\n * @util\n * @param {number | string} gram\n * @return {number} kg\n */\nexport const covertKilogram = (gram: number | string): number =>\n Number(gram) / 1000;\n\n/**\n * ml -> L 변환\n * @util\n * @param {number | string} ml\n * @return {number} liter\n */\nexport const convertLiter = (ml: number | string): number => Number(ml) / 1000;\n\n/**\n * L -> ml 변환\n * @util\n * @param {number | string} liter\n * @return {number} ml\n */\nexport const convertMilliliter = (liter: number | string): number =>\n Number(liter) * 1000;\n\n/**\n * 데이터 가공\n * @util\n * @param {unknown} value\n * @return {unknown}\n * @desc\n * - 빈칸 또는 줄바꿈 텍스트 모두 제거\n * - 날짜 데이터 yyyy-mm-ddTHH:MM:SS 변환\n */\nexport function extractCoreValue<TOriginType>(value: TOriginType): TOriginType {\n if (isValidDateType(value)) return dateFormat(value) as TOriginType;\n if (typeof value === \"string\")\n return value.replace(/[\\s\\n\\t]+/g, \"\") as TOriginType;\n return value;\n}\n\n/**\n * 자연수로 된 숫자를, 지정된 자리수만큼 0을 채워서 반환\n * @util\n * @param {number} v 소수점 제외\n * @param {number} [digitLength] 자릿수 (기본값 2)\n * @return {string}\n */\nexport function convertDigit(v: number, digitLength: number = 2): string {\n const valueLength = String(Math.floor(v)).length;\n const restLength = digitLength - valueLength;\n const fill = Array(restLength).fill(0).join(\"\");\n\n return `${fill}${v}`;\n}\n\n/**\n * 날짜 시간을 2-digit으로 맞춤\n * @util\n * @param {number} date_time\n * @return {string}\n */\nexport const convert2Digit = (date_time: number): string =>\n date_time < 10 ? `0${date_time}` : String(date_time);\n","import { isValidDateType, isValidTimeStringFormat } from \"../validation/module\";\nimport { dateFormat } from \"../format/module\";\nimport type {\n CheckDateMomentType,\n ScheduleBYDAY,\n ScheduleFREQ,\n ScheduleRepeatCycleDateType,\n} from \"./type\";\n\n/**\n * 오늘 날짜를 yyyy-mm-dd 포맷 string으로 추출\n * @util\n * @param {string} [time] HH:MM:SS\n * @return {string} yyyy-mm-dd\n */\nexport const getToday = (time?: string): string =>\n `${dateFormat(new Date())}${time && isValidTimeStringFormat(time) ? `T${time}` : \"\"}`;\n\n/**\n * 과거 특정날짜 추출\n * @util\n * @param {string | Date} date\n * @param {number} [weeks] 과거 몇 주 전\n * @param {number} [days] 과거 며칠 전\n * @return {Date | undefined}\n */\nexport function getPrevDay(\n date: string | Date,\n weeks?: number,\n days?: number,\n): Date | undefined {\n if (!isValidDateType(date)) return undefined;\n const standardDate = new Date(date);\n\n const prevWeekDay: number = typeof weeks === \"undefined\" ? 0 : 7 * weeks;\n const prevDays: number = typeof days === \"undefined\" ? 1 : days;\n const prevDayAmount: number = prevWeekDay !== 0 ? prevWeekDay : prevDays;\n\n standardDate.setDate(standardDate.getDate() - prevDayAmount);\n\n return new Date(standardDate);\n}\n\n/**\n * 미래 특정날짜 추출\n * @util\n * @param {string | Date} date\n * @param {number} [weeks] 미래 몇 주 후\n * @param {number} [days] 미래 며칠 후\n * @return {Date | undefined}\n */\nexport function getNextDay(\n date: string | Date,\n weeks?: number,\n days?: number,\n): Date | undefined {\n if (!isValidDateType(date)) return undefined;\n const standardDate = new Date(date);\n\n const nextWeekDay: number = typeof weeks === \"undefined\" ? 0 : 7 * weeks;\n const nextDays: number = typeof days === \"undefined\" ? 1 : days;\n const nextDayAmount: number = nextWeekDay !== 0 ? nextWeekDay : nextDays;\n\n standardDate.setDate(standardDate.getDate() + nextDayAmount);\n\n return new Date(standardDate);\n}\n\n/**\n * 과거 특정시점의 주간 날짜 배열 추출\n * @util\n * @param {string | Date} date\n * @param {number} weeks 과거 몇 주 전\n * @return {Date[]}\n */\nexport function getLastWeeks(date: string | Date, weeks: number = 1): Date[] {\n if (!isValidDateType(date)) return [];\n const lastWeeks: Date[] = [];\n for (let d = 1; d <= 7 * weeks; d++) {\n const prevDate = new Date(date);\n lastWeeks.unshift(new Date(prevDate.setDate(prevDate.getDate() - d)));\n }\n return lastWeeks;\n}\n\n/**\n * 미래 특정시점의 주간 날짜 배열 추출\n * @util\n * @param {string | Date} date\n * @param {number} weeks 미래 몇 주 전\n * @return {Date[]}\n */\nexport function getNextWeeks(date: string | Date, weeks: number = 1): Date[] {\n if (!isValidDateType(date)) return [];\n const startDate = new Date(date);\n return new Array(weeks * 7)\n .fill(startDate)\n .map((date: Date, index: number) => {\n const nextDate = new Date(date);\n return new Date(nextDate.setDate(nextDate.getDate() + index));\n });\n}\n\n/**\n * 지정된 범위 내의 모든 날짜 배열 추출\n * @util\n * @param {string | Date} startDate\n * @param {string | Date} endDate\n * @param {boolean} [isFormat] 날짜 배열을 yyyy-mm-dd string으로 생성할지 여부\n * @return {(Date | string)[]}\n */\nexport function getDateArray(\n startDate: string | Date,\n endDate: string | Date,\n isFormat?: boolean,\n): (Date | string)[] {\n if (!isValidDateType(startDate) || !isValidDateType(endDate)) return [];\n\n const dayUnit = 1000 * 60 * 60 * 24;\n const start = new Date(dateFormat(startDate));\n const end = new Date(dateFormat(endDate));\n const array: (Date | string)[] = [];\n for (let day = start.getTime(); day <= end.getTime(); day += dayUnit) {\n const d = isFormat ? dateFormat(new Date(day)) : new Date(day);\n array.push(d);\n }\n return array;\n}\n\n/**\n * 현재 시점을 기준으로 한 특정 날짜의 시점 추출\n * @util\n * @param {string | Date} date\n * @return {CheckDateMomentType}\n */\nexport function checkDateMoment(date: string | Date): CheckDateMomentType {\n const res: CheckDateMomentType = {\n isToday: false,\n isPast: false,\n isFuture: false,\n moment: \"\",\n };\n\n if (!isValidDateType(date)) return res;\n\n const standardDate = dateFormat(date);\n const standardTime = new Date(standardDate).getTime();\n const today = getToday();\n const todayTime = new Date(today).getTime();\n\n if (standardDate === today) {\n res.isToday = true;\n res.moment = \"today\";\n } else if (standardTime < todayTime) {\n res.isPast = true;\n res.moment = \"past\";\n } else if (standardTime > todayTime) {\n res.isFuture = true;\n res.moment = \"future\";\n }\n\n return res;\n}\n\n/**\n * 특정 날짜의 해당 월 주차 수\n * @util\n * @param {string|Date} date\n * @return {number} 몇주차\n */\nexport function weekOrderIndex(date: string | Date): number {\n if (date && new Date(date) instanceof Date) {\n const standardDate = new Date(date).getDate();\n const firstWeekday = new Date(new Date(date).setDate(1)).getDay();\n return Math.ceil((standardDate + firstWeekday) / 7);\n }\n return 0;\n}\n\n/**\n * 반복 주기의 명칭 한글표기로 변환\n * @util\n * @param {ScheduleFREQ} FREQ \"DAILY\" | \"WEEKLY\" | \"MONTHLY\" | \"YEARLY\"\n * @return {string} \"일\" | \"주\" | \"개월\" | \"년\"\n */\nexport function getRepeatCycleUnit(FREQ: ScheduleFREQ): string {\n switch (FREQ) {\n case \"DAILY\":\n return \"일\";\n case \"WEEKLY\":\n return \"주\";\n case \"MONTHLY\":\n return \"개월\";\n case \"YEARLY\":\n return \"년\";\n default:\n return \"주기\";\n }\n}\n\n/**\n * weekOrderIdx()의 index값을 \"N번째\"로 텍스트 변환\n * @util\n * @param {number|string} [weekIndex] 몇주차 인덱스\n * @return {string}\n */\nexport function weekOrderKo(weekIndex?: string | number): string {\n if (typeof weekIndex === \"undefined\") return \"\";\n switch (String(weekIndex)) {\n case \"1\":\n return \"첫번째\";\n case \"2\":\n return \"두번째\";\n case \"3\":\n return \"세번째\";\n case \"4\":\n return \"네번째\";\n case \"5\":\n return \"다섯번째\";\n case \"6\":\n return \"여섯번째\";\n default:\n return \"\";\n }\n}\n\n/**\n * 요일 인덱스에서 요일 코드 추출\n * @util\n * @param {number|string} weekdayIndex\n * @return {ScheduleBYDAY} \"MO\"|\"TU\"|\"WE\"|\"TH\"|\"FR\"|\"SA\"|\"SU\"|\"\"\n */\nexport function weekdayCodeByWeekdayIndex(\n weekdayIndex?: number | string,\n): ScheduleBYDAY {\n if (typeof weekdayIndex === \"undefined\") return \"\";\n\n switch (String(weekdayIndex)) {\n case \"0\":\n return \"SU\";\n case \"1\":\n return \"MO\";\n case \"2\":\n return \"TU\";\n case \"3\":\n return \"WE\";\n case \"4\":\n return \"TH\";\n case \"5\":\n return \"FR\";\n case \"6\":\n return \"SA\";\n default:\n return \"\";\n }\n}\n\n/**\n * 요일 인덱스에서 \"N요일\" 텍스트 생성\n * @util\n * @param {string|number|ScheduleBYDAY} [dayCode] 요일 인덱스 또는 R-rule 요일 코드\n * @param {boolean} [isFull] \"요일\"까지 붙은 전체 명칭생성 여부\n * @return {string} \"일(요일)\",\"월(요일)\", ..., \"토(요일)\"\n */\nexport function weekdayByDayCode(\n dayCode?: string | number | ScheduleBYDAY,\n isFull?: boolean,\n): string {\n if (typeof dayCode === \"undefined\") return \"\";\n\n const fullName = isFull ? \"요일\" : \"\";\n const code = String(dayCode);\n\n if (code === \"0\" || code.includes(\"SU\")) return `일${fullName}`;\n else if (code === \"1\" || code.includes(\"MO\")) return `월${fullName}`;\n else if (code === \"2\" || code.includes(\"TU\")) return `화${fullName}`;\n else if (code === \"3\" || code.includes(\"WE\")) return `수${fullName}`;\n else if (code === \"4\" || code.includes(\"TH\")) return `목${fullName}`;\n else if (code === \"5\" || code.includes(\"FR\")) return `금${fullName}`;\n else if (code === \"6\" || code.includes(\"SA\")) return `토${fullName}`;\n\n return ``;\n}\n\n/**\n * 월간/연간 반복에 대한 지정 날짜 코드 parsing\n * @util\n * @param {string} cycleDateString 전체 명칭생성 여부\n * @return {ScheduleRepeatCycleDateType | undefined}\n */\nexport function generateRepeatCycleDate(\n cycleDateString: string,\n): ScheduleRepeatCycleDateType | undefined {\n const isRepeatDate = cycleDateString?.startsWith(\"date,\") || false;\n const isRepeatWeek = cycleDateString?.startsWith(\"weekday,\") || false;\n\n if (cycleDateString === \"\" || !(isRepeatDate || isRepeatWeek))\n return undefined;\n\n const selected = cycleDateString.split(\",\");\n\n const repeatCycleDate: ScheduleRepeatCycleDateType = {\n cycleDateUnit: selected[0] as \"date\" | \"weekday\",\n };\n\n if (selected[0] === \"date\") {\n const repeatDay = selected[1]?.split(\"_\")?.[1] || \"\";\n Object.assign(repeatCycleDate, { repeatDay });\n\n if (selected[2] !== \"\" && selected[2]?.startsWith(\"month_\")) {\n const repeatMonth = selected[2].split(\"_\")?.[1] || \"\";\n Object.assign(repeatCycleDate, { repeatMonth });\n }\n } else if (selected[0] === \"weekday\") {\n const repeatWeekOrder = selected[1]?.split(\"_\")?.[1] || \"\";\n const repeatWeekDayIndex = selected[2]?.split(\"_\")?.[1] || \"\";\n Object.assign(repeatCycleDate, { repeatWeekOrder, repeatWeekDayIndex });\n }\n\n return repeatCycleDate;\n}\n\n/**\n * 반복 지정 주기/날짜/요일에 대해, 코드에서 한글로 변환\n * @util\n * @param {string} repeatCycleDate 반복 주기/날짜/요일 코드\n * @return {string}\n */\nexport function repeatCycleDateKo(repeatCycleDate?: string): string {\n if (typeof repeatCycleDate === \"undefined\" || repeatCycleDate === \"\")\n return \"\";\n\n const option = generateRepeatCycleDate(repeatCycleDate as string);\n if (option === undefined) return \"\";\n\n if (option.cycleDateUnit === \"date\") {\n const repeatMonthKo = option.repeatMonth ? `${option.repeatMonth}월 ` : \"\";\n const repeatDayKo = option.repeatDay ? `${option.repeatDay}일` : \"\";\n return `${repeatMonthKo}${repeatDayKo}`;\n } else if (option.cycleDateUnit === \"weekday\") {\n const repeatWeekOrderKo = weekOrderKo(option.repeatWeekOrder);\n const repeatWeekDayKo = weekdayByDayCode(option.repeatWeekDayIndex, true);\n return `${repeatWeekOrderKo} ${repeatWeekDayKo}`;\n }\n\n return \"\";\n}\n\n/**\n * 반복 지정 정보 전체를 한글표현으로 생성\n * @util\n * @param {ScheduleFREQ | undefined} repeatUnit\n * @param {string | number | undefined} repeatCycle\n * @param {string | undefined} repeatCycleDate\n * @param {string | undefined} repeatWeekly\n * @return {string}\n */\nexport function convertSelectedRepeatInfo(\n repeatUnit: ScheduleFREQ | undefined,\n repeatCycle: string | number | undefined,\n repeatCycleDate: string | undefined,\n repeatWeekly: string | undefined,\n): string {\n const weekdayKorean: string =\n repeatUnit === \"WEEKLY\" &&\n typeof repeatWeekly !== \"undefined\" &&\n repeatWeekly !== \"\"\n ? String(repeatWeekly)\n .split(\",\")\n .map((dayIndex: string) => weekdayByDayCode(dayIndex as string, true))\n .join(\",\")\n : \"\";\n\n switch (repeatUnit) {\n case \"DAILY\":\n return `${repeatCycle}일마다`;\n case \"WEEKLY\":\n return `매주 ${weekdayKorean}`;\n case \"MONTHLY\":\n return `${repeatCycle}개월마다 ${repeatCycleDateKo(repeatCycleDate)}`;\n case \"YEARLY\":\n return `${repeatCycle}년마다 ${repeatCycleDateKo(repeatCycleDate)}`;\n default:\n return \"--\";\n }\n}\n","import type { SitemapBase, SitemapMatchBase } from \"./type\";\n\n/**\n * 현재 경로와 가장 근접한 경로 데이터 추출\n * @param {SitemapBase[]} routes 사이트맵 배열 데이터\n * @param {string} currentPath 현재 경로\n * @return {SitemapBase | null} 경로 데이터\n */\nexport const getClosestRoute = <Sitemap extends SitemapBase>(\n routes: Sitemap[],\n currentPath: string,\n): Sitemap | null => {\n let deepestMatch: Sitemap | null = null; // 가장 긴 prefix를 저장한다.\n for (const route of routes) {\n if (currentPath.startsWith(route.path)) {\n // 기존 match가 없거나 더 긴 path를 찾으면 교체한다.\n if (!deepestMatch || route.path.length > deepestMatch.path.length) {\n deepestMatch = route;\n }\n }\n }\n return deepestMatch;\n};\n\n/**\n * 경로 일치 데이터 추출\n * @util\n * @param {SitemapBase[]} routes 사이트맵 배열 데이터\n * @param {string} currentPath 현재 경로\n * @return {SitemapBase | undefined} 경로 데이터\n */\nexport const getMatchRoute = <\n Sitemap extends SitemapBase,\n SitemapMatched extends SitemapMatchBase,\n>(\n routes: Sitemap[],\n currentPath: string,\n): SitemapMatched => {\n const res: SitemapMatched = { category: null, depth: null } as SitemapMatched; // 반환 형식 초기화\n\n // 1 depth\n res.category = getClosestRoute<Sitemap>(routes, currentPath);\n\n // 2 depth\n if (res.category && res.category.depth) {\n res.depth = getClosestRoute<Sitemap>(\n res.category.depth as Sitemap[],\n currentPath,\n );\n }\n\n return res;\n};\n\n/**\n * 브라우저 환경 여부와 관계없이 안전하게 pathname을 추출한다.\n * @util\n * @param {string} fallback 브라우저가 아닌 환경에서 사용할 기본 경로\n * @return {string} 현재 경로 또는 fallback\n */\nexport const getSafePathname = (fallback: string = \"\"): string => {\n // CSR 환경: window.location.pathname 활용\n if (typeof window !== \"undefined\" && window.location?.pathname) {\n return window.location.pathname;\n }\n // SSR 또는 다른 런타임: globalThis.location을 검사\n if (typeof globalThis !== \"undefined\") {\n const globalLocation = (globalThis as { location?: { pathname?: string } })\n .location;\n if (globalLocation?.pathname) {\n return globalLocation.pathname;\n }\n }\n // 모든 환경에서 값이 없으면 fallback 반환\n return fallback;\n};\n","/**\n * 오름차순 정렬\n * @util\n * @param {string | number | null} a\n * @param {string | number | null} b\n */\nimport type { SortableDateValue, SortableValue } from \"./type\";\n\nexport const sortAsc = (a: SortableValue, b: SortableValue) => {\n if (a === null || b === null) {\n if (a === null && b !== null) return 1;\n if (a !== null && b === null) return -1;\n return 0;\n }\n return a < b ? -1 : a > b ? 1 : 0;\n};\n\n/**\n * 내림차순 정렬\n * @util\n * @param {string | number | null} a\n * @param {string | number | null} b\n */\nexport const sortDesc = (a: SortableValue, b: SortableValue) => {\n if (a === null || b === null) {\n if (a === null && b !== null) return 1;\n if (a !== null && b === null) return -1;\n return 0;\n }\n return a > b ? -1 : a < b ? 1 : 0;\n};\n\n/**\n * 날짜순 오름차순 정렬\n * @util\n * @param {Date | number | string | null} a\n * @param {Date | number | string | null} b\n */\nexport const sortDateAsc = (a: SortableDateValue, b: SortableDateValue) => {\n if (a === null || b === null) {\n if (a === null && b !== null) return 1;\n if (a !== null && b === null) return -1;\n return 0;\n }\n return sortAsc(new Date(a).getTime(), new Date(b).getTime());\n};\n\n/**\n * 날짜순 내림차순 정렬\n * @util\n * @param {Date | number | string | null} a\n * @param {Date | number | string | null} b\n */\nexport const sortDateDesc = (a: SortableDateValue, b: SortableDateValue) => {\n if (a === null || b === null) {\n if (a === null && b !== null) return 1;\n if (a !== null && b === null) return -1;\n return 0;\n }\n return sortDesc(new Date(a).getTime(), new Date(b).getTime());\n};\n","import { convertObjectToSearchParams } from \"../convert\";\nimport { dateFormat } from \"../format\";\n\n/**\n * 콘솔로그; Next.js API Route 디버깅용\n * @util\n * @param {string} method GET, POST, DELETE\n * @param {string} routeUrl Next.js route API route URL\n * @param {string} [queryUrl] DB API route URL\n * @param {unknown[]} [messages] 로그 데이터\n */\nexport const nextAPILog = (\n method: string,\n routeUrl: string,\n queryUrl?: string,\n ...messages: unknown[]\n) => {\n if (process.env.NODE_ENV === \"production\") return;\n\n const DATE = dateFormat(new Date());\n const TIME =\n new Intl.DateTimeFormat(\"en-US\", {\n hour: \"numeric\",\n minute: \"numeric\",\n second: \"numeric\",\n hour12: false,\n }).format(new Date()) +\n \".\" +\n new Date().getMilliseconds();\n\n const REQUEST_METHOD = method.split(\"-\")[0]?.toUpperCase() || \"-\";\n const RESPONSE_METHOD = method.split(\"-\")[1]\n ? method.split(\"-\")[1]?.toUpperCase() || \"-\"\n : REQUEST_METHOD;\n\n return console.log(\n // `⚡️`,\n `\\n`,\n `[Next Server API] ⏱ ${DATE} ( ${TIME} )`,\n `\\n λ [${REQUEST_METHOD}] FE route`,\n `\\n ${routeUrl}`,\n ...(queryUrl\n ? [`\\n ═⏵ Ω [${RESPONSE_METHOD}] BE url`, `\\n ${queryUrl}`, `\\n`]\n : []),\n ...(messages?.[0] ? [` ◇-`, ...messages] : []),\n `\\n`,\n );\n};\n\n/**\n * API; 쿼리스트링 생성\n * @util\n * @param {unknown} [searchParams] 쿼리스트링으로 변환할 객체\n * @return {string} 쿼리스트링\n */\nexport const getQueryString = (searchParams?: unknown): string =>\n typeof searchParams !== \"undefined\" &&\n convertObjectToSearchParams(searchParams).toString()\n ? `?${convertObjectToSearchParams(searchParams).toString()}`\n : \"\";\n\n/**\n * API; POST/DELETE method option\n */\nexport const getFetchOptions = ({\n method,\n headers,\n body,\n}: {\n method: string;\n} & Partial<{\n headers: HeadersInit;\n body: BodyInit | null;\n}>): RequestInit => {\n const option: RequestInit = { method };\n // API fetch Headers\n if (typeof headers !== \"undefined\") Object.assign(option, { headers });\n // API fetch Body\n if (typeof body !== \"undefined\") Object.assign(option, { body });\n return option;\n};\n","import { convertObjectToSearchParams } from \"../convert\";\nimport { getFetchOptions, getQueryString, nextAPILog } from \"./util\";\nimport type { CommonPostResponseType } from \"./types\";\n\n/**\n * API 요청 url 생성; GET 타입\n * @util\n * @param {object} props\n * @param {\"ai\" | \"db\" | string} props.domain API 인프라\n * @param {string} props.routeUrl Next.js /app/api 라우트 주소\n * @param {string} props.queryUrl 백엔드 API url\n * @param {URLSearchParams} [props.searchParams] 쿼리 스트링 추출\n * @param {object} [props.log] 디버깅용 서버 로그 정보\n * @param {boolean} [props.logDisabled] 로그 비활성화\n * @return {string} GET API 요청 full url\n */\nexport const generateBackendQueryUrl_GET = ({\n domain,\n routeUrl,\n queryUrl,\n searchParams, // 가공이 완료된 파라미터\n log,\n logDisabled,\n}: {\n /**\n * API 도메인\n */\n domain: string;\n /**\n * Next.js /app/api 라우트 주소\n */\n routeUrl: string;\n /**\n * 백엔드 API url\n */\n queryUrl: string;\n} & Partial<{\n /**\n * 쿼리 스트링\n * @desc\n * - URLSearchParams 객체로 가공된 파라미터\n */\n searchParams: URLSearchParams | object;\n /**\n * 디버깅용 서버 로그 정보\n */\n log: object;\n /**\n * 로그 비활성화\n * @default false\n */\n logDisabled: boolean;\n}>): string => {\n // url 생성\n const url = `${domain}${queryUrl}${getQueryString(searchParams)}`;\n\n // 서버 로그 출력\n if (!logDisabled)\n nextAPILog(\"get\", routeUrl, url, {\n ...log,\n ...(searchParams ? searchParams : {}),\n });\n\n return url;\n};\n\n/**\n * API fetch 요청; POST/DELETE 타입\n * @util\n * @param {object} props\n * @param {\"ai\" | \"db\" | string} props.infra API 인프라\n * @param {\"POST\" | \"DELETE\"} props.method POST, DELETE\n * @param {string} props.routeUrl Next.js /app/api 라우트 주소\n * @param {string} props.queryUrl 백엔드 API url\n * @param {HeadersInit} [props.headers] fetch Headers\n * @param {BodyInit | null} [props.body] post/delete body (이대로 바로 전송됨)\n * @param {object} [props.bodyData] body로 전송하기 위해 가공이 필요한 데이터 객체\n * @param {object} [props.queryStringData] url에 쿼리스트링으로 요청하는 경우에 대한 데이터 객체\n * @param {object} [props.log] 디버깅용 서버 로그 정보\n * @param {boolean} [props.logDisabled] 로그 비활성화\n * @param {boolean} [props.fetchDisabled] fetch 실행 비활성화\n * @return {Promise<MutateAPICommonResponseType>} POST, DELETE 응답\n */\nexport const fetchBackendQuery = async <\n FetchRequestType extends object,\n FetchResponseType extends CommonPostResponseType,\n>({\n domain,\n method,\n routeUrl,\n queryUrl,\n headers,\n body,\n bodyOriginData,\n queryStringData,\n log,\n logDisabled,\n fetchDisabled,\n}: {\n /**\n * API 도메인\n */\n domain: string;\n /**\n * 요청 방식\n * POST, DELETE\n */\n method: \"POST\" | \"DELETE\";\n /**\n * 프론트 API URL\n */\n routeUrl: string;\n /**\n * 백엔드 API 요청 URL\n */\n queryUrl: string;\n} & Partial<{\n /**\n * fetch Headers\n */\n headers: HeadersInit;\n /**\n * fetch Body\n */\n body: BodyInit | null;\n /**\n * fetch Body 를 SearchParams 전환할 데이터\n */\n bodyOriginData: FetchRequestType;\n /**\n * URL 쿼리 스트링\n */\n queryStringData: FetchRequestType;\n /**\n * 디버그용 로그 객체\n */\n log: object;\n /**\n * 로그 비활성화\n */\n logDisabled: boolean;\n /**\n * fetch 비활성화\n */\n fetchDisabled: boolean;\n}>): Promise<FetchResponseType> => {\n // 쿼리 url 생성\n const url = `${domain}${queryUrl}${getQueryString(queryStringData)}`;\n\n // 에러 응답\n const errRes: FetchResponseType = {\n is_ok: false,\n idx: \"\",\n error: \"\",\n } as FetchResponseType;\n\n const bodyData = convertObjectToSearchParams(bodyOriginData);\n\n // bodyOriginData가 undefined가 아닌데도, bodyOriginData의 데이터가 유효하지 않은 경우\n if (typeof bodyOriginData !== \"undefined\" && bodyData.toString() === \"\") {\n if (!logDisabled) {\n nextAPILog(method.toLowerCase(), routeUrl, url, {\n state: \"ERROR (BODY - ORIGIN DATA)\",\n error: \"데이터가 유효하지 않습니다.\",\n bodyOriginData,\n ...log,\n });\n }\n errRes.error = \"데이터가 유효하지 않습니다.\";\n return errRes;\n }\n\n // 쿼리 옵션 생성\n const option: RequestInit = getFetchOptions({\n method,\n headers,\n body,\n });\n if (!body && typeof bodyOriginData !== \"undefined\")\n Object.assign(option, { body: bodyData });\n\n // 로그 옵션\n if (!logDisabled) {\n // 쿼리 전 로그 출력\n nextAPILog(method.toLowerCase(), routeUrl, url, {\n state: \"READY\",\n ...option,\n ...log,\n });\n }\n\n // 디버깅을 위한 fetch 요청 제한\n if (fetchDisabled) {\n errRes.error = \"API 요청제한 활성화됨.\";\n return errRes;\n }\n\n try {\n const res: FetchResponseType = await (await fetch(url, option)).json();\n\n if (!logDisabled) {\n // API 응답 성공 여부\n const isSuccess =\n \"is_ok\" in res && typeof res?.is_ok === \"boolean\" && res.is_ok === true;\n\n nextAPILog(method.toLowerCase(), routeUrl, url, {\n state: isSuccess ? \"SUCCESS\" : \"FAIL\",\n ...res,\n });\n }\n\n return res;\n } catch (error: unknown) {\n errRes.error =\n error instanceof Error\n ? error.message || \"알 수 없는 오류가 발생하였습니다.\"\n : String(error);\n\n if (!logDisabled) {\n nextAPILog(method.toLowerCase(), routeUrl, url, {\n state: \"ERROR (RESPONSE)\",\n error,\n ...log,\n });\n }\n\n return errRes;\n }\n};\n\n/**\n * API; POST/DELETE method fetch\n * @util\n * @param {object} props\n * @param {\"ai\" | \"db\" | string} props.domain\n * @param {\"POST\" | \"DELETE\"} props.method POST, DELETE\n * @param {string} props.routeUrl Next.js /app/api 라우트 주소\n * @param {string} props.queryUrl 백엔드 API url\n * @param {HeadersInit} [props.headers] fetch Headers\n * @param {BodyInit | null} [props.body] post/delete body (이대로 바로 전송됨)\n * @param {object} [props.bodyData] body로 전송하기 위해 가공이 필요한 데이터 객체\n * @param {object} [props.log] 디버깅용 서버 로그 정보\n * @param {boolean} [props.logDisabled] 로그 비활성화\n * @param {boolean} [props.fetchDisabled] fetch 실행 비활성화\n * @param {object} [props.alternateResponse] fetch 실패 시 대체 응답\n * @return {Promise<ResponseType>} POST, DELETE 응답\n */\nexport const fetchWithBody = async <\n BodyDataType = object,\n ResponseType extends object | Response = Response,\n>({\n domain,\n method,\n routeUrl,\n queryUrl,\n searchParams,\n headers,\n body,\n bodyData,\n isRawResponse,\n alternateResponse,\n debug,\n disabled,\n disabledLog,\n}: {\n /**\n * API 도메인\n */\n domain: string;\n /**\n * 요청 방식\n * POST, DELETE\n */\n method: string;\n /**\n * 프론트 API URL\n */\n routeUrl: string;\n /**\n * 백엔드 API 요청 URL\n */\n queryUrl: string;\n /**\n * fetch 실패 시 대체 응답\n */\n alternateResponse: ResponseType;\n} & Partial<{\n searchParams: URLSearchParams | object;\n /**\n * fetch Headers\n */\n headers: HeadersInit;\n /**\n * fetch Body\n */\n body: BodyInit | null;\n /**\n * fetch Body Data\n */\n bodyData: BodyDataType;\n /**\n * 응답값 원본으로 return\n * const responseRaw = await fetch(api);\n */\n isRawResponse: boolean;\n /**\n * 디버그용 로그 객체\n */\n debug: object;\n /**\n * fetch 비활성화\n */\n disabled: boolean;\n /**\n * 로그 비활성화\n */\n disabledLog: boolean;\n}>): Promise<ResponseType> => {\n // ------------------------------------- API 요청 URL 생성\n\n // url 생성\n const url = `${domain}${queryUrl}${getQueryString(searchParams)}`;\n\n // ------------------------------------- 쿼리 옵션 생성\n const option: RequestInit = getFetchOptions({\n method,\n headers,\n body,\n });\n\n // ------------------------------------- body data 적용\n // 완성된 body가 없고, body 데이터는 있는 경우\n if (!body && typeof bodyData !== \"undefined\") {\n // bodyData가 undefined가 아닌데도, bodyData의 데이터가 유효하지 않은 경우\n if (typeof bodyData !== \"undefined\" && String(bodyData) === \"\") {\n nextAPILog(method.toLowerCase(), routeUrl, url, {\n state: \"ERROR (BODY - DATA)\",\n error: \"데이터가 유효하지 않습니다.\",\n bodyData,\n ...debug,\n });\n\n return alternateResponse;\n }\n\n // option에 bodyData 적용\n Object.assign(option, { body: bodyData });\n }\n\n // option 준비가 완료되면, READY 상태\n if (!disabledLog)\n nextAPILog(method.toLowerCase(), routeUrl, url, {\n state: \"READY\",\n ...option,\n ...debug,\n });\n\n // ------------------------------------- fetch 요청\n if (disabled) {\n // fetch 요청 비활성화\n nextAPILog(method.toLowerCase(), routeUrl, url, {\n state: \"FETCH DISABLED\",\n message: \"API 요청제한 활성화됨.\",\n });\n return alternateResponse;\n }\n\n try {\n const responseRaw = await fetch(url, option);\n\n // API 응답 상태 코드\n const resCode = responseRaw.status;\n\n // API 응답 성공 여부\n if (!disabledLog) {\n nextAPILog(method.toLowerCase(), routeUrl, url, {\n state: resCode === 200 ? \"SUCCESS\" : \"FAIL\",\n code: resCode,\n });\n }\n\n if (isRawResponse) return responseRaw as ResponseType;\n\n const res = await responseRaw.json();\n return res;\n } catch (error: unknown) {\n // 에러 응답\n if (!disabledLog)\n nextAPILog(method.toLowerCase(), routeUrl, url, {\n state: \"ERROR (RESPONSE)\",\n error,\n ...debug,\n });\n\n return alternateResponse;\n }\n};\n","import type { BreakPointType, DeviceCategoryType } from \"./types\";\n\n/**\n * Apple 디바이스\n */\nconst apple: string[] = [\"iPhone\", \"iPad\", \"iPod\", \"Mac\", \"Macintosh\"];\n/**\n * 태블릿 디바이스\n */\nconst tablet: string[] = [\"Tablet\", \"iPad\", \"playbook\", \"silk\"];\n/**\n * 모바일 디바이스\n */\nconst mobile: string[] = [\n \"Android\",\n \"Mobile\",\n \"iPhone\",\n \"iPod\",\n \"iPad\",\n \"BlackBerry\",\n \"IEMobile\",\n \"Kindle\",\n \"NetFront\",\n \"Silk-Accelerated\",\n \"hpwOS\",\n \"webOS\",\n \"Fennec\",\n \"Minimo\",\n \"Opera Mobi\",\n \"Opera Mini\",\n \"Blazer\",\n \"Dolfin\",\n \"Dolphin\",\n \"Skyfire\",\n \"Zune\",\n];\n\nexport const userAgentCollection: Record<DeviceCategoryType, string[]> = {\n apple,\n tablet,\n mobile,\n};\n\nconst setLowerCase = (v: unknown): string => String(v).toLowerCase();\nconst deviceLowerCasePatterns: Record<DeviceCategoryType, string[]> = {\n apple: apple.map(setLowerCase),\n tablet: tablet.map(setLowerCase),\n mobile: mobile.map(setLowerCase),\n};\n\n/**\n * 반응형 웹 breakpoint 감지\n */\nexport const checkResponsiveDevice = (userAgent: string): BreakPointType => {\n const { mobile, tablet } = deviceLowerCasePatterns;\n const clientAgent = setLowerCase(userAgent);\n const isTablet = tablet.some(agent => clientAgent.includes(agent));\n const isMobile = mobile.some(agent => clientAgent.includes(agent));\n\n if (isMobile) return isTablet ? \"tablet\" : \"mobile\";\n\n return \"desktop\";\n};\n\n/**\n * 애플 디바이스 감지\n */\nexport const checkAppleDevice = (userAgent: string): boolean => {\n const { apple } = deviceLowerCasePatterns;\n const clientAgent = setLowerCase(userAgent);\n return apple.some(agent => clientAgent.includes(agent));\n};\n","import type { DisplayMode, PwaRuntimeInfo } from \"./types\";\n\nconst DISPLAY_MODE_QUERIES: Array<{ mode: DisplayMode; query: string }> = [\n { mode: \"standalone\", query: \"(display-mode: standalone)\" },\n { mode: \"fullscreen\", query: \"(display-mode: fullscreen)\" },\n { mode: \"minimal-ui\", query: \"(display-mode: minimal-ui)\" },\n { mode: \"browser\", query: \"(display-mode: browser)\" },\n];\n\nconst STANDALONE_DISPLAY_MODES: ReadonlySet<DisplayMode> = new Set([\n \"standalone\",\n \"fullscreen\",\n \"minimal-ui\",\n]);\n\nconst isWindowAvailable = (): boolean => typeof window !== \"undefined\";\n\nconst detectDisplayMode = (): DisplayMode => {\n if (!isWindowAvailable() || typeof window.matchMedia !== \"function\") {\n return \"unknown\";\n }\n\n for (const { mode, query } of DISPLAY_MODE_QUERIES) {\n if (window.matchMedia(query).matches) {\n return mode;\n }\n }\n\n return \"unknown\";\n};\n\nconst detectNavigatorStandalone = (): boolean => {\n if (!isWindowAvailable()) {\n return false;\n }\n\n const nav = window.navigator as Navigator & { standalone?: boolean };\n return typeof nav.standalone === \"boolean\" ? Boolean(nav.standalone) : false;\n};\n\nexport const getPwaRuntimeInfo = (): PwaRuntimeInfo => {\n const displayMode = detectDisplayMode();\n const navigatorStandalone = detectNavigatorStandalone();\n\n if (displayMode === \"unknown\" && navigatorStandalone) {\n return { isStandalone: true, displayMode: \"standalone\" };\n }\n\n return {\n displayMode,\n isStandalone:\n displayMode === \"unknown\"\n ? navigatorStandalone\n : STANDALONE_DISPLAY_MODES.has(displayMode),\n };\n};\n\nexport const checkStandaloneApp = getPwaRuntimeInfo;\n","import type { CheckboxStateMap } from \"./type\";\n\n/**\n * \"전체\" 항목 선택에 따른 단일 항목 업데이트\n * @util\n * @param {Record<string, boolean>} checkStateObject 체크 상태관리 객체\n * @param {boolean} allCheckState 동기화할 \"전체\" 선택 상태\n * @return {Record<string, boolean>} 업데이트된 체크 상태관리 객체\n */\n\nexport const syncAllToEach = (\n checkStateObject: CheckboxStateMap,\n allCheckState: boolean,\n): CheckboxStateMap =>\n Object.fromEntries(\n Object.entries(checkStateObject).map(([key]) => [key, allCheckState]),\n );\n\n/**\n * 단일 항목 선택에 따른 \"전체\" 항목 업데이트\n * @util\n * @param {Record<string, boolean>} checkStateObject 체크 상태관리 객체\n * @param {string} eachKey 선택한 단일 항목 키\n * @param {boolean} eachChecked 선택한 단일 항목 선택 상태\n * @return {Record<string, boolean>} 업데이트된 체크 상태관리 객체\n */\nexport const syncEachToAll = (\n checkStateObject: CheckboxStateMap,\n eachKey: string,\n eachChecked: boolean,\n): CheckboxStateMap => {\n const res = { ...checkStateObject, [eachKey]: eachChecked };\n const exceptStateAll = Object.entries(res)\n .filter(([key]) => key !== \"all\")\n .map(([, checked]) => checked);\n\n const isAllEachChecked = Object.values(exceptStateAll).every(\n checked => checked,\n );\n\n res.all = isAllEachChecked;\n\n return res;\n};\n","import type { StyleSpacingArray, StyleSpacingType } from \"./type\";\n\n/**\n * 스타일 변수; rem 단위\n * @util\n */\nexport const styleRemAmount = 10;\n\n/**\n * 스타일 함수; px 단위를 rem 단위로 변환\n * @util\n * @param {number} v - px\n */\nexport const styleRem = (v: number): string => `${v / styleRemAmount}rem`;\n\n/**\n * 스타일 함수; px 또는 string을 유효한 스타일 문자열로 변환\n * @util\n * @param {\"px\" | \"rem\"} unit - 단위 (px 또는 rem)\n * @param {unknown} v - px 또는 string\n * @param {number | string} [alt] - 대체 값 (px 또는 string)\n * @returns {string} 유효한 스타일 문자열\n */\nexport const styleBaseSize = (\n unit: \"px\" | \"rem\",\n v: unknown,\n alt?: number | string,\n): string => {\n // 유효하지 않은 값인 경우 \"auto\"\n if (![\"number\", \"string\"].includes(typeof v) && typeof alt === \"undefined\")\n return \"auto\";\n\n if (typeof v === \"number\")\n return unit === \"rem\" ? styleRem(v) : `${v}${unit}`;\n // 유효한 스타일 문자인 경우\n if (typeof v === \"string\" && v) return v;\n\n // 대체 값이 있는 경우\n if (typeof alt === \"number\")\n return unit === \"rem\" ? styleRem(alt) : `${alt}${unit}`;\n else if (typeof alt === \"string\" && alt) return alt;\n\n return String(v);\n};\n\n/**\n * 스타일 함수; padding, margin 배열을 스타일 문자열로 변환\n * @util\n * @param {\"px\" | \"rem\"} unit - 단위 (px 또는 rem)\n * @param {FixedLengthArray<number | string, 2 | 3 | 4>} v - 스타일 배열\n * @returns {string} 스타일 문자열\n * @desc\n * 파라미터 패턴\n * - [상하좌우]: 일괄적용 처리\n * - [상하, 좌우]: [top-bottom, left-right]\n * - [상, 좌우, 하]: [top, left-right, bottom]\n * - [상, 우, 하, 좌]: [top, right, bottom, left\n */\nexport const styleSpacingArray = (\n unit: \"px\" | \"rem\",\n v: StyleSpacingArray,\n): string => v.map(space => styleBaseSize(unit, space)).join(\" \");\n\n/**\n * 스타일 함수; padding, margin 옵션을 스타일 문자열로 변환\n * @util\n * @param {\"px\" | \"rem\"} unit - 단위 (px 또는 rem)\n * @param {StyleSpacingType} spacing - 스타일 패딩 타입\n * @param {StyleSpacingType} [alt] - 대체 값 (px 또는 string)\n * @desc\n * - number | string: 단일 값\n * - [상하좌우]: 일괄적용 처리\n * - [상하, 좌우]: [top-bottom, left-right]\n * - [상, 좌우, 하]: [top, left-right, bottom]\n * - [상, 우, 하, 좌]: [top, right, bottom, left\n */\nexport const styleSpacingSize = (\n unit: \"px\" | \"rem\",\n spacing: StyleSpacingType | undefined,\n alt?: StyleSpacingType,\n): string => {\n if (typeof spacing === \"undefined\") {\n if (typeof alt === \"undefined\") return \"0\";\n\n // 대체 값이 있는 경우\n if (Array.isArray(alt)) return styleSpacingArray(unit, alt);\n else if ([\"number\", \"string\"].includes(typeof alt) && alt !== \"\")\n return styleBaseSize(unit, alt as number | string);\n }\n // 단일 값인 경우\n if ([\"number\", \"string\"].includes(typeof spacing) && spacing !== \"\")\n return styleBaseSize(unit, spacing as number | string);\n\n // 배열 지정하는 경우\n if (Array.isArray(spacing)) return styleSpacingArray(unit, spacing);\n\n return String(spacing);\n};\n\n/**\n * 스타일 함수; padding 옵션을 스타일 문자열로 변환\n * @util\n * @param {\"px\" | \"rem\"} unit - 단위 (px 또는 rem)\n * @param {StyleSpacingType} padding - 스타일 패딩 타입\n * @param {StyleSpacingType} [alt] - 대체 값 (px 또는 string)\n * @desc\n * - number | string: 단일 값\n * - [상하좌우]: 일괄적용 처리\n * - [상하, 좌우]: [top-bottom, left-right]\n * - [상, 좌우, 하]: [top, left-right, bottom]\n * - [상, 우, 하, 좌]: [top, right, bottom, left]\n */\nexport const stylePaddingSize = styleSpacingSize;\n\n/**\n * 스타일 함수; margin 옵션을 스타일 문자열로 변환\n * @util\n * @param {\"px\" | \"rem\"} unit - 단위 (px 또는 rem)\n * @param {StyleSpacingType} margin - 스타일 마진 타입\n * @param {StyleSpacingType} [alt] - 대체 값 (px 또는 string)\n * @desc\n * - number | string: 단일 값\n * - [상하좌우]: 일괄적용 처리\n * - [상하, 좌우]: [top-bottom, left-right]\n * - [상, 좌우, 하]: [top, left-right, bottom]\n * - [상, 우, 하, 좌]: [top, right, bottom, left]\n */\nexport const styleMarginSize = styleSpacingSize;\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -4,7 +4,7 @@ export { CheckDateMomentType, DateMomentType, ScheduleBYDAY, ScheduleFREQ, Sched
|
|
|
4
4
|
export { correctTimezone, dateFormat, deltaFormat, distanceFormat, durationFormat, getNumberReplaceComma, lengthFormat, phoneNumberFormat, timeFormat } from './format/index.cjs';
|
|
5
5
|
export { D as DateTimeFormatOptionsType, a as DurationFormatOptions } from './type-CNV_n0-w.cjs';
|
|
6
6
|
export { MaskDecimalSeparatorOptions, MaskNumericValue, maskBusinessCode, maskDate, maskDecimalSeparator, maskPhone, maskResidentCode } from './mask/index.cjs';
|
|
7
|
-
export { SitemapBase, SitemapMatchBase, getClosestRoute, getMatchRoute } from './route/index.cjs';
|
|
7
|
+
export { SitemapBase, SitemapMatchBase, getClosestRoute, getMatchRoute, getSafePathname } from './route/index.cjs';
|
|
8
8
|
export { SortableDateValue, SortableValue, sortAsc, sortDateAsc, sortDateDesc, sortDesc } from './sort/index.cjs';
|
|
9
9
|
export { BuildingNoListString, NullableNumericIdentifier, NumericIdentifier, TimeFormatString, isValidArray, isValidBuildingNo, isValidBuildingNoList, isValidBusinessCode, isValidDateNumber, isValidDateType, isValidFeedMedicineCategory, isValidFirmCategory, isValidIdx, isValidNumber, isValidTimeStringFormat, isValidUuidx } from './validation/index.cjs';
|
|
10
10
|
export { ApiLogger, BackendApiConfig, CommonPostResponseType, DomainResolver, EnvDomainMap, FetchBackendQueryOptions, FetchWithBodyParams, GenerateBackendQueryUrlOptions, GenerateGetQueryUrlParams, InfraKey, UtilQueryBaseParams, fetchBackendQuery, fetchWithBody, generateBackendQueryUrl_GET, getFetchOptions, getQueryString, nextAPILog } from './api/index.cjs';
|
package/dist/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export { CheckDateMomentType, DateMomentType, ScheduleBYDAY, ScheduleFREQ, Sched
|
|
|
4
4
|
export { correctTimezone, dateFormat, deltaFormat, distanceFormat, durationFormat, getNumberReplaceComma, lengthFormat, phoneNumberFormat, timeFormat } from './format/index.js';
|
|
5
5
|
export { D as DateTimeFormatOptionsType, a as DurationFormatOptions } from './type-CNV_n0-w.js';
|
|
6
6
|
export { MaskDecimalSeparatorOptions, MaskNumericValue, maskBusinessCode, maskDate, maskDecimalSeparator, maskPhone, maskResidentCode } from './mask/index.js';
|
|
7
|
-
export { SitemapBase, SitemapMatchBase, getClosestRoute, getMatchRoute } from './route/index.js';
|
|
7
|
+
export { SitemapBase, SitemapMatchBase, getClosestRoute, getMatchRoute, getSafePathname } from './route/index.js';
|
|
8
8
|
export { SortableDateValue, SortableValue, sortAsc, sortDateAsc, sortDateDesc, sortDesc } from './sort/index.js';
|
|
9
9
|
export { BuildingNoListString, NullableNumericIdentifier, NumericIdentifier, TimeFormatString, isValidArray, isValidBuildingNo, isValidBuildingNoList, isValidBusinessCode, isValidDateNumber, isValidDateType, isValidFeedMedicineCategory, isValidFirmCategory, isValidIdx, isValidNumber, isValidTimeStringFormat, isValidUuidx } from './validation/index.js';
|
|
10
10
|
export { ApiLogger, BackendApiConfig, CommonPostResponseType, DomainResolver, EnvDomainMap, FetchBackendQueryOptions, FetchWithBodyParams, GenerateBackendQueryUrlOptions, GenerateGetQueryUrlParams, InfraKey, UtilQueryBaseParams, fetchBackendQuery, fetchWithBody, generateBackendQueryUrl_GET, getFetchOptions, getQueryString, nextAPILog } from './api/index.js';
|
package/dist/index.mjs
CHANGED
|
@@ -548,6 +548,18 @@ var getMatchRoute = (routes, currentPath) => {
|
|
|
548
548
|
}
|
|
549
549
|
return res;
|
|
550
550
|
};
|
|
551
|
+
var getSafePathname = (fallback = "") => {
|
|
552
|
+
if (typeof window !== "undefined" && window.location?.pathname) {
|
|
553
|
+
return window.location.pathname;
|
|
554
|
+
}
|
|
555
|
+
if (typeof globalThis !== "undefined") {
|
|
556
|
+
const globalLocation = globalThis.location;
|
|
557
|
+
if (globalLocation?.pathname) {
|
|
558
|
+
return globalLocation.pathname;
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
return fallback;
|
|
562
|
+
};
|
|
551
563
|
|
|
552
564
|
// src/sort/module.ts
|
|
553
565
|
var sortAsc = (a, b) => {
|
|
@@ -923,6 +935,6 @@ var styleSpacingSize = (unit, spacing, alt) => {
|
|
|
923
935
|
var stylePaddingSize = styleSpacingSize;
|
|
924
936
|
var styleMarginSize = styleSpacingSize;
|
|
925
937
|
|
|
926
|
-
export { capitalize, checkAppleDevice, checkDateMoment, checkResponsiveDevice, checkStandaloneApp, convert2Digit, convertDigit, convertLiter, convertMilliliter, convertObjectToSearchParams, convertSelectedRepeatInfo, correctTimezone, covertGram, covertKilogram, dateFormat, deltaFormat, distanceFormat, durationFormat, escapeQuotes, escapeSymbol, extractCoreValue, fetchBackendQuery, fetchWithBody, generateBackendQueryUrl_GET, generateRepeatCycleDate, getClosestRoute, getDateArray, getFetchOptions, getLastWeeks, getMatchRoute, getNextDay, getNextWeeks, getNumberReplaceComma, getPrevDay, getPwaRuntimeInfo, getQueryString, getRepeatCycleUnit, getToday, getValueByKeyChain, isValidArray, isValidBuildingNo, isValidBuildingNoList, isValidBusinessCode, isValidDateNumber, isValidDateType, isValidFeedMedicineCategory, isValidFirmCategory, isValidIdx, isValidNumber, isValidTimeStringFormat, isValidUuidx, lengthFormat, maskBusinessCode, maskDate, maskDecimalSeparator, maskPhone, maskResidentCode, nextAPILog, parseData, phoneNumberFormat, repeatCycleDateKo, sortAsc, sortDateAsc, sortDateDesc, sortDesc, string, styleBaseSize, styleMarginSize, stylePaddingSize, styleRem, styleRemAmount, styleSpacingArray, styleSpacingSize, syncAllToEach, syncEachToAll, timeFormat, userAgentCollection, weekOrderIndex, weekOrderKo, weekdayByDayCode, weekdayCodeByWeekdayIndex };
|
|
938
|
+
export { capitalize, checkAppleDevice, checkDateMoment, checkResponsiveDevice, checkStandaloneApp, convert2Digit, convertDigit, convertLiter, convertMilliliter, convertObjectToSearchParams, convertSelectedRepeatInfo, correctTimezone, covertGram, covertKilogram, dateFormat, deltaFormat, distanceFormat, durationFormat, escapeQuotes, escapeSymbol, extractCoreValue, fetchBackendQuery, fetchWithBody, generateBackendQueryUrl_GET, generateRepeatCycleDate, getClosestRoute, getDateArray, getFetchOptions, getLastWeeks, getMatchRoute, getNextDay, getNextWeeks, getNumberReplaceComma, getPrevDay, getPwaRuntimeInfo, getQueryString, getRepeatCycleUnit, getSafePathname, getToday, getValueByKeyChain, isValidArray, isValidBuildingNo, isValidBuildingNoList, isValidBusinessCode, isValidDateNumber, isValidDateType, isValidFeedMedicineCategory, isValidFirmCategory, isValidIdx, isValidNumber, isValidTimeStringFormat, isValidUuidx, lengthFormat, maskBusinessCode, maskDate, maskDecimalSeparator, maskPhone, maskResidentCode, nextAPILog, parseData, phoneNumberFormat, repeatCycleDateKo, sortAsc, sortDateAsc, sortDateDesc, sortDesc, string, styleBaseSize, styleMarginSize, stylePaddingSize, styleRem, styleRemAmount, styleSpacingArray, styleSpacingSize, syncAllToEach, syncEachToAll, timeFormat, userAgentCollection, weekOrderIndex, weekOrderKo, weekdayByDayCode, weekdayCodeByWeekdayIndex };
|
|
927
939
|
//# sourceMappingURL=index.mjs.map
|
|
928
940
|
//# sourceMappingURL=index.mjs.map
|