@uniai-fe/util-functions 0.1.1 โ†’ 0.2.0

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 CHANGED
@@ -786,6 +786,61 @@ var fetchWithBody = async ({
786
786
  }
787
787
  };
788
788
 
789
+ // src/user-agent/device-patterns.ts
790
+ var apple = ["iPhone", "iPad", "iPod", "Mac", "Macintosh"];
791
+ var tablet = ["Tablet", "iPad", "playbook", "silk"];
792
+ var mobile = [
793
+ "Android",
794
+ "Mobile",
795
+ "iPhone",
796
+ "iPod",
797
+ "iPad",
798
+ "BlackBerry",
799
+ "IEMobile",
800
+ "Kindle",
801
+ "NetFront",
802
+ "Silk-Accelerated",
803
+ "hpwOS",
804
+ "webOS",
805
+ "Fennec",
806
+ "Minimo",
807
+ "Opera Mobi",
808
+ "Opera Mini",
809
+ "Blazer",
810
+ "Dolfin",
811
+ "Dolphin",
812
+ "Skyfire",
813
+ "Zune"
814
+ ];
815
+ var devicePatterns = {
816
+ apple,
817
+ tablet,
818
+ mobile
819
+ };
820
+ var device_patterns_default = devicePatterns;
821
+
822
+ // src/user-agent/module.ts
823
+ var setLowerCase = (v) => String(v).toLowerCase();
824
+ var deviceLowerCasePatterns = Object.fromEntries(
825
+ Object.entries(device_patterns_default).map(([key, value]) => [
826
+ key,
827
+ value.map(setLowerCase)
828
+ ])
829
+ );
830
+ var checkResponsiveDevice = (userAgent) => {
831
+ const { mobile: mobile2, tablet: tablet2 } = deviceLowerCasePatterns;
832
+ const clientAgent = setLowerCase(userAgent);
833
+ const isTablet = tablet2.some((agent) => clientAgent.includes(agent));
834
+ const isMobile = mobile2.some((agent) => clientAgent.includes(agent));
835
+ if (isMobile) return isTablet ? "tablet" : "mobile";
836
+ return "desktop";
837
+ };
838
+ var checkAppleDevice = (userAgent) => {
839
+ const { apple: apple2 } = deviceLowerCasePatterns;
840
+ const clientAgent = setLowerCase(userAgent);
841
+ return apple2.some((agent) => clientAgent.includes(agent));
842
+ };
843
+
789
844
  // src/form/checkbox/module.ts
790
845
  var syncAllToEach = (checkStateObject, allCheckState) => Object.fromEntries(
791
846
  Object.entries(checkStateObject).map(([key]) => [key, allCheckState])
@@ -831,7 +886,9 @@ var stylePaddingSize = styleSpacingSize;
831
886
  var styleMarginSize = styleSpacingSize;
832
887
 
833
888
  exports.capitalize = capitalize;
889
+ exports.checkAppleDevice = checkAppleDevice;
834
890
  exports.checkDateMoment = checkDateMoment;
891
+ exports.checkResponsiveDevice = checkResponsiveDevice;
835
892
  exports.convert2Digit = convert2Digit;
836
893
  exports.convertDigit = convertDigit;
837
894
  exports.convertLiter = convertLiter;
@@ -843,6 +900,7 @@ exports.covertGram = covertGram;
843
900
  exports.covertKilogram = covertKilogram;
844
901
  exports.dateFormat = dateFormat;
845
902
  exports.deltaFormat = deltaFormat;
903
+ exports.devicePatterns = device_patterns_default;
846
904
  exports.distanceFormat = distanceFormat;
847
905
  exports.durationFormat = durationFormat;
848
906
  exports.escapeQuotes = escapeQuotes;
@@ -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/form/checkbox/module.ts","../src/style/size/module.ts"],"names":["d","date"],"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 { 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/user-agent/device-patterns.ts","../src/user-agent/module.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 { DeviceCategoryType } from \"./types\";\n\nconst apple: string[] = [\"iPhone\", \"iPad\", \"iPod\", \"Mac\", \"Macintosh\"];\nconst tablet: string[] = [\"Tablet\", \"iPad\", \"playbook\", \"silk\"];\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\nconst devicePatterns: Record<DeviceCategoryType, string[]> = {\n apple,\n tablet,\n mobile,\n};\n\nexport default devicePatterns;\n","import devicePatterns from \"./device-patterns\";\nimport type { BreakPointType, DeviceCategoryType } from \"./types\";\n\nconst setLowerCase = (v: unknown): string => String(v).toLowerCase();\nconst deviceLowerCasePatterns = Object.fromEntries(\n Object.entries(devicePatterns).map(([key, value]) => [\n key,\n value.map(setLowerCase),\n ]),\n) as Record<DeviceCategoryType, string[]>;\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 { 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
@@ -8,5 +8,6 @@ export { SitemapBase, SitemapMatchBase, getClosestRoute, getMatchRoute } from '.
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, GenerateBackendQueryUrlOptions, InfraKey, fetchBackendQuery, fetchWithBody, generateBackendQueryUrl_GET, getFetchOptions, getQueryString, nextAPILog } from './api/index.cjs';
11
+ export { BreakPointType, DeviceCategoryType, ResponsiveDeviceStateType, ViewportOrientationStateType, checkAppleDevice, checkResponsiveDevice, devicePatterns } from './user-agent/index.cjs';
11
12
  export { CheckboxStateMap, syncAllToEach, syncEachToAll } from './form/checkbox/index.cjs';
12
13
  export { StyleSpacingArray, StyleSpacingPrimitive, StyleSpacingType, styleBaseSize, styleMarginSize, stylePaddingSize, styleRem, styleRemAmount, styleSpacingArray, styleSpacingSize } from './style/size/index.cjs';
package/dist/index.d.ts CHANGED
@@ -8,5 +8,6 @@ export { SitemapBase, SitemapMatchBase, getClosestRoute, getMatchRoute } from '.
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, GenerateBackendQueryUrlOptions, InfraKey, fetchBackendQuery, fetchWithBody, generateBackendQueryUrl_GET, getFetchOptions, getQueryString, nextAPILog } from './api/index.js';
11
+ export { BreakPointType, DeviceCategoryType, ResponsiveDeviceStateType, ViewportOrientationStateType, checkAppleDevice, checkResponsiveDevice, devicePatterns } from './user-agent/index.js';
11
12
  export { CheckboxStateMap, syncAllToEach, syncEachToAll } from './form/checkbox/index.js';
12
13
  export { StyleSpacingArray, StyleSpacingPrimitive, StyleSpacingType, styleBaseSize, styleMarginSize, stylePaddingSize, styleRem, styleRemAmount, styleSpacingArray, styleSpacingSize } from './style/size/index.js';