@bwg-ui/core 1.1.6 → 1.1.8

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.
Files changed (104) hide show
  1. package/README.md +1 -1
  2. package/dist/chunks/BwgLargeUploader-1yDku10l.cjs +3 -0
  3. package/dist/chunks/BwgLargeUploader-1yDku10l.cjs.map +1 -0
  4. package/dist/chunks/{BwgLargeUploader-CZllyq7K.js → BwgLargeUploader-DsaIHpYz.js} +311 -297
  5. package/dist/chunks/BwgLargeUploader-DsaIHpYz.js.map +1 -0
  6. package/dist/chunks/LoadingOverlay-CAO6_FuF.js +29 -0
  7. package/dist/chunks/LoadingOverlay-CAO6_FuF.js.map +1 -0
  8. package/dist/chunks/LoadingOverlay-NX9Mo_6n.cjs +2 -0
  9. package/dist/chunks/LoadingOverlay-NX9Mo_6n.cjs.map +1 -0
  10. package/dist/chunks/{PublicLayout-BiTPwkVq.cjs → PublicLayout-3v46YZdi.cjs} +2 -2
  11. package/dist/chunks/{PublicLayout-BiTPwkVq.cjs.map → PublicLayout-3v46YZdi.cjs.map} +1 -1
  12. package/dist/chunks/{PublicLayout-g9WMtoZ0.js → PublicLayout-B4wGo0ut.js} +2 -2
  13. package/dist/chunks/{PublicLayout-g9WMtoZ0.js.map → PublicLayout-B4wGo0ut.js.map} +1 -1
  14. package/dist/chunks/{SSOHandler-Bu3v95k0.js → SSOHandler-B5rmYk8s.js} +2565 -2568
  15. package/dist/chunks/SSOHandler-B5rmYk8s.js.map +1 -0
  16. package/dist/chunks/SSOHandler-DjL0sH7k.cjs +184 -0
  17. package/dist/chunks/SSOHandler-DjL0sH7k.cjs.map +1 -0
  18. package/dist/chunks/ScreenProtectContext-3my4PHFa.js +154 -0
  19. package/dist/chunks/ScreenProtectContext-3my4PHFa.js.map +1 -0
  20. package/dist/chunks/ScreenProtectContext-CVuXrJm6.cjs +2 -0
  21. package/dist/chunks/ScreenProtectContext-CVuXrJm6.cjs.map +1 -0
  22. package/dist/chunks/{UtilsContext-CSgz9o2Z.js → UtilsContext-BKUZmmKx.js} +2 -2
  23. package/dist/chunks/{UtilsContext-CSgz9o2Z.js.map → UtilsContext-BKUZmmKx.js.map} +1 -1
  24. package/dist/chunks/{UtilsContext-5l7yFRQI.cjs → UtilsContext-DczQBfFi.cjs} +2 -2
  25. package/dist/chunks/{UtilsContext-5l7yFRQI.cjs.map → UtilsContext-DczQBfFi.cjs.map} +1 -1
  26. package/dist/chunks/{commonUtils-BV6WFv-z.js → commonUtils-Cvx6_eK2.js} +24 -23
  27. package/dist/chunks/commonUtils-Cvx6_eK2.js.map +1 -0
  28. package/dist/chunks/commonUtils-DaFg0y7C.cjs +2 -0
  29. package/dist/chunks/commonUtils-DaFg0y7C.cjs.map +1 -0
  30. package/dist/chunks/menuViewStore-BJak0NMm.cjs +3 -0
  31. package/dist/chunks/menuViewStore-BJak0NMm.cjs.map +1 -0
  32. package/dist/chunks/menuViewStore-BwR3vgPM.js +339 -0
  33. package/dist/chunks/menuViewStore-BwR3vgPM.js.map +1 -0
  34. package/dist/components/common/BwgButtonGroup.d.ts +2 -2
  35. package/dist/components/common/BwgButtonGroup.d.ts.map +1 -1
  36. package/dist/components/common/BwgTitleBox.d.ts +2 -2
  37. package/dist/components/common/BwgTitleBox.d.ts.map +1 -1
  38. package/dist/components/common/BwgView.d.ts.map +1 -1
  39. package/dist/components/common/QuickServiceToggle.d.ts.map +1 -1
  40. package/dist/components/common/index.cjs +1 -1
  41. package/dist/components/common/index.js +1 -1
  42. package/dist/components/core/BwgForm.d.ts.map +1 -1
  43. package/dist/components/core/BwgUploader.d.ts +5 -0
  44. package/dist/components/core/BwgUploader.d.ts.map +1 -1
  45. package/dist/components/core/index.cjs +1 -1
  46. package/dist/components/core/index.js +1 -1
  47. package/dist/components/layout/LoadingOverlay.d.ts +5 -0
  48. package/dist/components/layout/LoadingOverlay.d.ts.map +1 -0
  49. package/dist/components/layout/index.cjs +1 -1
  50. package/dist/components/layout/index.d.ts +1 -0
  51. package/dist/components/layout/index.d.ts.map +1 -1
  52. package/dist/components/layout/index.js +3 -1
  53. package/dist/components/layout/index.js.map +1 -1
  54. package/dist/index.cjs +1 -1
  55. package/dist/index.js +295 -291
  56. package/dist/index.js.map +1 -1
  57. package/dist/provider/contexts/ScreenProtectContext.d.ts +9 -4
  58. package/dist/provider/contexts/ScreenProtectContext.d.ts.map +1 -1
  59. package/dist/provider/hooks/index.d.ts +0 -1
  60. package/dist/provider/hooks/index.d.ts.map +1 -1
  61. package/dist/provider/index.cjs +1 -1
  62. package/dist/provider/index.js +2 -2
  63. package/dist/public/realgrid/css/realgrid-style-custom.css +65 -60
  64. package/dist/stores/favoriteStore.d.ts +1 -1
  65. package/dist/stores/favoriteStore.d.ts.map +1 -1
  66. package/dist/stores/index.cjs +1 -1
  67. package/dist/stores/index.cjs.map +1 -1
  68. package/dist/stores/index.d.ts +34 -3
  69. package/dist/stores/index.d.ts.map +1 -1
  70. package/dist/stores/index.js +17 -15
  71. package/dist/stores/index.js.map +1 -1
  72. package/dist/stores/menuModelStore.d.ts +36 -0
  73. package/dist/stores/menuModelStore.d.ts.map +1 -0
  74. package/dist/stores/menuViewStore.d.ts +31 -0
  75. package/dist/stores/menuViewStore.d.ts.map +1 -0
  76. package/dist/styles/assets/images/header/icon/ico-bell.svg +3 -3
  77. package/dist/styles/assets/images/header/icon/ico-logout.svg +10 -10
  78. package/dist/styles/assets/images/header/icon/ico-setting.svg +4 -4
  79. package/dist/styles/assets/images/header/icon/ico-sidebar-arrow.svg +3 -3
  80. package/dist/utils/index.cjs +1 -1
  81. package/dist/utils/index.js +1 -1
  82. package/package.json +10 -4
  83. package/scripts/gen-component-registry.js +138 -0
  84. package/dist/chunks/BwgLargeUploader-CZllyq7K.js.map +0 -1
  85. package/dist/chunks/BwgLargeUploader-xAjj4TQ1.cjs +0 -3
  86. package/dist/chunks/BwgLargeUploader-xAjj4TQ1.cjs.map +0 -1
  87. package/dist/chunks/SSOHandler-Bu3v95k0.js.map +0 -1
  88. package/dist/chunks/SSOHandler-kghWABfM.cjs +0 -184
  89. package/dist/chunks/SSOHandler-kghWABfM.cjs.map +0 -1
  90. package/dist/chunks/ScreenProtectContext-ofv2QgMp.cjs +0 -2
  91. package/dist/chunks/ScreenProtectContext-ofv2QgMp.cjs.map +0 -1
  92. package/dist/chunks/ScreenProtectContext-zByHldrr.js +0 -115
  93. package/dist/chunks/ScreenProtectContext-zByHldrr.js.map +0 -1
  94. package/dist/chunks/commonUtils-BV6WFv-z.js.map +0 -1
  95. package/dist/chunks/commonUtils-L9Jgc5y-.cjs +0 -2
  96. package/dist/chunks/commonUtils-L9Jgc5y-.cjs.map +0 -1
  97. package/dist/chunks/menuStore-2zsN-PRt.js +0 -266
  98. package/dist/chunks/menuStore-2zsN-PRt.js.map +0 -1
  99. package/dist/chunks/menuStore-D7zl2c89.cjs +0 -2
  100. package/dist/chunks/menuStore-D7zl2c89.cjs.map +0 -1
  101. package/dist/provider/hooks/useViewState.d.ts +0 -15
  102. package/dist/provider/hooks/useViewState.d.ts.map +0 -1
  103. package/dist/stores/menuStore.d.ts +0 -53
  104. package/dist/stores/menuStore.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commonUtils-Cvx6_eK2.js","sources":["../../node_modules/dayjs/locale/ko.js","../../node_modules/dayjs/plugin/relativeTime.js","../../node_modules/dayjs/plugin/utc.js","../../node_modules/dayjs/plugin/timezone.js","../../src/utils/dateUtils.ts","../../src/utils/objectUtils.ts","../../src/utils/arrayUtils.ts","../../src/utils/commonUtils.ts"],"sourcesContent":["!function(e,_){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=_(require(\"dayjs\")):\"function\"==typeof define&&define.amd?define([\"dayjs\"],_):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_locale_ko=_(e.dayjs)}(this,(function(e){\"use strict\";function _(e){return e&&\"object\"==typeof e&&\"default\"in e?e:{default:e}}var d=_(e),t={name:\"ko\",weekdays:\"일요일_월요일_화요일_수요일_목요일_금요일_토요일\".split(\"_\"),weekdaysShort:\"일_월_화_수_목_금_토\".split(\"_\"),weekdaysMin:\"일_월_화_수_목_금_토\".split(\"_\"),months:\"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월\".split(\"_\"),monthsShort:\"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월\".split(\"_\"),ordinal:function(e){return e+\"일\"},formats:{LT:\"A h:mm\",LTS:\"A h:mm:ss\",L:\"YYYY.MM.DD.\",LL:\"YYYY년 MMMM D일\",LLL:\"YYYY년 MMMM D일 A h:mm\",LLLL:\"YYYY년 MMMM D일 dddd A h:mm\",l:\"YYYY.MM.DD.\",ll:\"YYYY년 MMMM D일\",lll:\"YYYY년 MMMM D일 A h:mm\",llll:\"YYYY년 MMMM D일 dddd A h:mm\"},meridiem:function(e){return e<12?\"오전\":\"오후\"},relativeTime:{future:\"%s 후\",past:\"%s 전\",s:\"몇 초\",m:\"1분\",mm:\"%d분\",h:\"한 시간\",hh:\"%d시간\",d:\"하루\",dd:\"%d일\",M:\"한 달\",MM:\"%d달\",y:\"일 년\",yy:\"%d년\"}};return d.default.locale(t,null,!0),t}));","!function(r,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(r=\"undefined\"!=typeof globalThis?globalThis:r||self).dayjs_plugin_relativeTime=e()}(this,(function(){\"use strict\";return function(r,e,t){r=r||{};var n=e.prototype,o={future:\"in %s\",past:\"%s ago\",s:\"a few seconds\",m:\"a minute\",mm:\"%d minutes\",h:\"an hour\",hh:\"%d hours\",d:\"a day\",dd:\"%d days\",M:\"a month\",MM:\"%d months\",y:\"a year\",yy:\"%d years\"};function i(r,e,t,o){return n.fromToBase(r,e,t,o)}t.en.relativeTime=o,n.fromToBase=function(e,n,i,d,u){for(var f,a,s,l=i.$locale().relativeTime||o,h=r.thresholds||[{l:\"s\",r:44,d:\"second\"},{l:\"m\",r:89},{l:\"mm\",r:44,d:\"minute\"},{l:\"h\",r:89},{l:\"hh\",r:21,d:\"hour\"},{l:\"d\",r:35},{l:\"dd\",r:25,d:\"day\"},{l:\"M\",r:45},{l:\"MM\",r:10,d:\"month\"},{l:\"y\",r:17},{l:\"yy\",d:\"year\"}],m=h.length,c=0;c<m;c+=1){var y=h[c];y.d&&(f=d?t(e).diff(i,y.d,!0):i.diff(e,y.d,!0));var p=(r.rounding||Math.round)(Math.abs(f));if(s=f>0,p<=y.r||!y.r){p<=1&&c>0&&(y=h[c-1]);var v=l[y.l];u&&(p=u(\"\"+p)),a=\"string\"==typeof v?v.replace(\"%d\",p):v(p,n,y.l,s);break}}if(n)return a;var M=s?l.future:l.past;return\"function\"==typeof M?M(a):M.replace(\"%s\",a)},n.to=function(r,e){return i(r,e,this,!0)},n.from=function(r,e){return i(r,e,this)};var d=function(r){return r.$u?t.utc():t()};n.toNow=function(r){return this.to(d(this),r)},n.fromNow=function(r){return this.from(d(this),r)}}}));","!function(t,i){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=i():\"function\"==typeof define&&define.amd?define(i):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs_plugin_utc=i()}(this,(function(){\"use strict\";var t=\"minute\",i=/[+-]\\d\\d(?::?\\d\\d)?/g,e=/([+-]|\\d\\d)/g;return function(s,f,n){var u=f.prototype;n.utc=function(t){var i={date:t,utc:!0,args:arguments};return new f(i)},u.utc=function(i){var e=n(this.toDate(),{locale:this.$L,utc:!0});return i?e.add(this.utcOffset(),t):e},u.local=function(){return n(this.toDate(),{locale:this.$L,utc:!1})};var o=u.parse;u.parse=function(t){t.utc&&(this.$u=!0),this.$utils().u(t.$offset)||(this.$offset=t.$offset),o.call(this,t)};var r=u.init;u.init=function(){if(this.$u){var t=this.$d;this.$y=t.getUTCFullYear(),this.$M=t.getUTCMonth(),this.$D=t.getUTCDate(),this.$W=t.getUTCDay(),this.$H=t.getUTCHours(),this.$m=t.getUTCMinutes(),this.$s=t.getUTCSeconds(),this.$ms=t.getUTCMilliseconds()}else r.call(this)};var a=u.utcOffset;u.utcOffset=function(s,f){var n=this.$utils().u;if(n(s))return this.$u?0:n(this.$offset)?a.call(this):this.$offset;if(\"string\"==typeof s&&(s=function(t){void 0===t&&(t=\"\");var s=t.match(i);if(!s)return null;var f=(\"\"+s[0]).match(e)||[\"-\",0,0],n=f[0],u=60*+f[1]+ +f[2];return 0===u?0:\"+\"===n?u:-u}(s),null===s))return this;var u=Math.abs(s)<=16?60*s:s,o=this;if(f)return o.$offset=u,o.$u=0===s,o;if(0!==s){var r=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();(o=this.local().add(u+r,t)).$offset=u,o.$x.$localOffset=r}else o=this.utc();return o};var h=u.format;u.format=function(t){var i=t||(this.$u?\"YYYY-MM-DDTHH:mm:ss[Z]\":\"\");return h.call(this,i)},u.valueOf=function(){var t=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||this.$d.getTimezoneOffset());return this.$d.valueOf()-6e4*t},u.isUTC=function(){return!!this.$u},u.toISOString=function(){return this.toDate().toISOString()},u.toString=function(){return this.toDate().toUTCString()};var l=u.toDate;u.toDate=function(t){return\"s\"===t&&this.$offset?n(this.format(\"YYYY-MM-DD HH:mm:ss:SSS\")).toDate():l.call(this)};var c=u.diff;u.diff=function(t,i,e){if(t&&this.$u===t.$u)return c.call(this,t,i,e);var s=this.local(),f=n(t).local();return c.call(s,f,i,e)}}}));","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs_plugin_timezone=e()}(this,(function(){\"use strict\";var t={year:0,month:1,day:2,hour:3,minute:4,second:5},e={};return function(n,i,o){var r,a=function(t,n,i){void 0===i&&(i={});var o=new Date(t),r=function(t,n){void 0===n&&(n={});var i=n.timeZoneName||\"short\",o=t+\"|\"+i,r=e[o];return r||(r=new Intl.DateTimeFormat(\"en-US\",{hour12:!1,timeZone:t,year:\"numeric\",month:\"2-digit\",day:\"2-digit\",hour:\"2-digit\",minute:\"2-digit\",second:\"2-digit\",timeZoneName:i}),e[o]=r),r}(n,i);return r.formatToParts(o)},u=function(e,n){for(var i=a(e,n),r=[],u=0;u<i.length;u+=1){var f=i[u],s=f.type,m=f.value,c=t[s];c>=0&&(r[c]=parseInt(m,10))}var d=r[3],l=24===d?0:d,h=r[0]+\"-\"+r[1]+\"-\"+r[2]+\" \"+l+\":\"+r[4]+\":\"+r[5]+\":000\",v=+e;return(o.utc(h).valueOf()-(v-=v%1e3))/6e4},f=i.prototype;f.tz=function(t,e){void 0===t&&(t=r);var n,i=this.utcOffset(),a=this.toDate(),u=a.toLocaleString(\"en-US\",{timeZone:t}),f=Math.round((a-new Date(u))/1e3/60),s=15*-Math.round(a.getTimezoneOffset()/15)-f;if(!Number(s))n=this.utcOffset(0,e);else if(n=o(u,{locale:this.$L}).$set(\"millisecond\",this.$ms).utcOffset(s,!0),e){var m=n.utcOffset();n=n.add(i-m,\"minute\")}return n.$x.$timezone=t,n},f.offsetName=function(t){var e=this.$x.$timezone||o.tz.guess(),n=a(this.valueOf(),e,{timeZoneName:t}).find((function(t){return\"timezonename\"===t.type.toLowerCase()}));return n&&n.value};var s=f.startOf;f.startOf=function(t,e){if(!this.$x||!this.$x.$timezone)return s.call(this,t,e);var n=o(this.format(\"YYYY-MM-DD HH:mm:ss:SSS\"),{locale:this.$L});return s.call(n,t,e).tz(this.$x.$timezone,!0)},o.tz=function(t,e,n){var i=n&&e,a=n||e||r,f=u(+o(),a);if(\"string\"!=typeof t)return o(t).tz(a);var s=function(t,e,n){var i=t-60*e*1e3,o=u(i,n);if(e===o)return[i,e];var r=u(i-=60*(o-e)*1e3,n);return o===r?[i,o]:[t-60*Math.min(o,r)*1e3,Math.max(o,r)]}(o.utc(t,i).valueOf(),f,a),m=s[0],c=s[1],d=o(m).utcOffset(c);return d.$x.$timezone=a,d},o.tz.guess=function(){return Intl.DateTimeFormat().resolvedOptions().timeZone},o.tz.setDefault=function(t){r=t}}}));","import dayjs, { Dayjs } from 'dayjs'\r\nimport 'dayjs/locale/ko'\r\nimport relativeTime from 'dayjs/plugin/relativeTime'\r\nimport utc from 'dayjs/plugin/utc'\r\nimport timezone from 'dayjs/plugin/timezone'\r\n\r\n// dayjs 플러그인 설정\r\ndayjs.extend(relativeTime)\r\ndayjs.extend(utc)\r\ndayjs.extend(timezone)\r\ndayjs.locale('ko')\r\n\r\n/**\r\n * 날짜 유틸리티 함수들\r\n */\r\n\r\n// 현재 날짜/시간 가져오기\r\nexport const getCurrentDate = (): Dayjs => dayjs()\r\nexport const getCurrentDateString = (format: string = 'YYYY-MM-DD'): string => dayjs().format(format)\r\n\r\n// 날짜 포맷팅\r\nexport const formatDate = (date: string | Date | Dayjs, format: string = 'YYYY-MM-DD'): string => {\r\n return dayjs(date).format(format)\r\n}\r\n\r\n// 한국 시간대로 포맷팅\r\nexport const formatDateKST = (date: string | Date | Dayjs, format: string = 'YYYY-MM-DD HH:mm:ss'): string => {\r\n return dayjs(date).tz('Asia/Seoul').format(format)\r\n}\r\n\r\n// 상대적 시간 표시 (예: 3분 전, 1시간 전)\r\nexport const getRelativeTime = (date: string | Date | Dayjs): string => {\r\n return dayjs(date).fromNow()\r\n}\r\n\r\n// 날짜 차이 계산\r\nexport const getDateDiff = (date1: string | Date | Dayjs, date2: string | Date | Dayjs, unit: 'day' | 'hour' | 'minute' = 'day'): number => {\r\n return dayjs(date1).diff(dayjs(date2), unit)\r\n}\r\n\r\n// 특정 날짜가 오늘인지 확인\r\nexport const isToday = (date: string | Date | Dayjs): boolean => {\r\n return dayjs(date).isSame(dayjs(), 'day')\r\n}\r\n\r\n// 특정 날짜가 이번 주인지 확인\r\nexport const isThisWeek = (date: string | Date | Dayjs): boolean => {\r\n return dayjs(date).isSame(dayjs(), 'week')\r\n}\r\n\r\n// 특정 날짜가 이번 달인지 확인\r\nexport const isThisMonth = (date: string | Date | Dayjs): boolean => {\r\n return dayjs(date).isSame(dayjs(), 'month')\r\n}\r\n\r\n// 주의 시작일 (월요일)\r\nexport const getWeekStart = (date: string | Date | Dayjs = dayjs()): Dayjs => {\r\n return dayjs(date).startOf('week')\r\n}\r\n\r\n// 주의 마지막일 (일요일)\r\nexport const getWeekEnd = (date: string | Date | Dayjs = dayjs()): Dayjs => {\r\n return dayjs(date).endOf('week')\r\n}\r\n\r\n// 월의 시작일\r\nexport const getMonthStart = (date: string | Date | Dayjs = dayjs()): Dayjs => {\r\n return dayjs(date).startOf('month')\r\n}\r\n\r\n// 월의 마지막일\r\nexport const getMonthEnd = (date: string | Date | Dayjs = dayjs()): Dayjs => {\r\n return dayjs(date).endOf('month')\r\n}\r\n\r\n// 날짜 범위 생성 (시작일부터 종료일까지)\r\nexport const getDateRange = (startDate: string | Date | Dayjs, endDate: string | Date | Dayjs): Dayjs[] => {\r\n const dates: Dayjs[] = []\r\n let current = dayjs(startDate)\r\n const end = dayjs(endDate)\r\n \r\n while (current.isBefore(end) || current.isSame(end, 'day')) {\r\n dates.push(current)\r\n current = current.add(1, 'day')\r\n }\r\n \r\n return dates\r\n}\r\n\r\n// Ant Design DatePicker용 날짜 범위\r\nexport const getDateRangeForPicker = (startDate: string | Date | Dayjs, endDate: string | Date | Dayjs): [Dayjs, Dayjs] => {\r\n return [dayjs(startDate), dayjs(endDate)]\r\n}\r\n\r\n// 날짜 유효성 검사\r\nexport const isValidDate = (date: string | Date | Dayjs): boolean => {\r\n return dayjs(date).isValid()\r\n}\r\n\r\n// 나이 계산\r\nexport const calculateAge = (birthDate: string | Date | Dayjs): number => {\r\n return dayjs().diff(dayjs(birthDate), 'year')\r\n}\r\n\r\n// 주말 여부 확인\r\nexport const isWeekend = (date: string | Date | Dayjs): boolean => {\r\n const day = dayjs(date).day()\r\n return day === 0 || day === 6\r\n}\r\n\r\n// 평일 여부 확인\r\nexport const isWeekday = (date: string | Date | Dayjs): boolean => {\r\n return !isWeekend(date)\r\n}\r\n\r\n// 날짜를 한국어로 표시\r\nexport const formatDateKorean = (date: string | Date | Dayjs): string => {\r\n return dayjs(date).format('YYYY년 MM월 DD일')\r\n}\r\n\r\n// 시간을 한국어로 표시\r\nexport const formatTimeKorean = (date: string | Date | Dayjs): string => {\r\n return dayjs(date).format('HH시 mm분')\r\n}\r\n\r\n// 날짜와 시간을 한국어로 표시\r\nexport const formatDateTimeKorean = (date: string | Date | Dayjs): string => {\r\n return dayjs(date).format('YYYY년 MM월 DD일 HH시 mm분')\r\n} ","/**\r\n * 객체 유틸리티 함수들\r\n */\r\n\r\n// 객체가 비어있는지 확인\r\nexport const isEmptyObject = (obj: object): boolean => {\r\n return Object.keys(obj).length === 0;\r\n};\r\n\r\n// 객체가 비어있지 않은지 확인\r\nexport const isNotEmptyObject = (obj: object): boolean => {\r\n return !isEmptyObject(obj);\r\n};\r\n\r\n// 객체의 깊은 복사\r\nexport const deepClone = <T>(obj: T): T => {\r\n if (obj === null || typeof obj !== 'object') return obj;\r\n if (obj instanceof Date) return new Date(obj.getTime()) as T;\r\n if (obj instanceof Array) return obj.map(item => deepClone(item)) as T;\r\n if (typeof obj === 'object') {\r\n const clonedObj = {} as T;\r\n for (const key in obj) {\r\n if (obj.hasOwnProperty(key)) {\r\n clonedObj[key] = deepClone(obj[key]);\r\n }\r\n }\r\n return clonedObj;\r\n }\r\n return obj;\r\n};\r\n\r\n// 객체에서 특정 키들만 선택\r\nexport const pick = <T extends object, K extends keyof T>(\r\n obj: T,\r\n keys: K[]\r\n): Pick<T, K> => {\r\n const result = {} as Pick<T, K>;\r\n keys.forEach(key => {\r\n if (key in obj) {\r\n result[key] = obj[key];\r\n }\r\n });\r\n return result;\r\n};\r\n\r\n// 객체에서 특정 키들 제외\r\nexport const omit = <T extends object, K extends keyof T>(\r\n obj: T,\r\n keys: K[]\r\n): Omit<T, K> => {\r\n const result = { ...obj } as Omit<T, K>;\r\n keys.forEach(key => {\r\n delete (result as any)[key];\r\n });\r\n return result;\r\n};\r\n\r\n// 객체의 모든 값 가져오기\r\nexport const values = <T extends object>(obj: T): T[keyof T][] => {\r\n return Object.values(obj);\r\n};\r\n\r\n// 객체의 모든 키 가져오기\r\nexport const keys = <T extends object>(obj: T): (keyof T)[] => {\r\n return Object.keys(obj) as (keyof T)[];\r\n};\r\n\r\n// 객체의 모든 키-값 쌍 가져오기\r\nexport const entries = <T extends object>(obj: T): [keyof T, T[keyof T]][] => {\r\n return Object.entries(obj) as [keyof T, T[keyof T]][];\r\n};\r\n\r\n// 객체 병합 (깊은 병합)\r\nexport const merge = <T extends object>(\r\n target: T,\r\n ...sources: Partial<T>[]\r\n): T => {\r\n const result = deepClone(target);\r\n\r\n sources.forEach(source => {\r\n if (source) {\r\n Object.keys(source).forEach(key => {\r\n const targetKey = key as keyof T;\r\n const sourceValue = source[targetKey];\r\n const targetValue = result[targetKey];\r\n\r\n if (\r\n sourceValue &&\r\n typeof sourceValue === 'object' &&\r\n !Array.isArray(sourceValue) &&\r\n targetValue &&\r\n typeof targetValue === 'object' &&\r\n !Array.isArray(targetValue)\r\n ) {\r\n result[targetKey] = merge(targetValue, sourceValue);\r\n } else {\r\n result[targetKey] = sourceValue;\r\n }\r\n });\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\n// 객체에서 null/undefined 값 제거\r\nexport const removeNullValues = <T extends object>(obj: T): Partial<T> => {\r\n const result = {} as Partial<T>;\r\n\r\n Object.keys(obj).forEach(key => {\r\n const value = obj[key as keyof T];\r\n if (value !== null && value !== undefined) {\r\n result[key as keyof T] = value;\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\n// 객체에서 빈 문자열 제거\r\nexport const removeEmptyStrings = <T extends object>(obj: T): Partial<T> => {\r\n const result = {} as Partial<T>;\r\n\r\n Object.keys(obj).forEach(key => {\r\n const value = obj[key as keyof T];\r\n if (value !== '') {\r\n result[key as keyof T] = value;\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\n// 객체를 쿼리 문자열로 변환\r\nexport const toQueryString = (obj: Record<string, any>): string => {\r\n const params = new URLSearchParams();\r\n\r\n Object.keys(obj).forEach(key => {\r\n const value = obj[key];\r\n if (value !== null && value !== undefined) {\r\n params.append(key, String(value));\r\n }\r\n });\r\n\r\n return params.toString();\r\n};\r\n\r\n// 쿼리 문자열을 객체로 변환\r\nexport const fromQueryString = (\r\n queryString: string\r\n): Record<string, string> => {\r\n const params = new URLSearchParams(queryString);\r\n const result: Record<string, string> = {};\r\n\r\n params.forEach((value, key) => {\r\n result[key] = value;\r\n });\r\n\r\n return result;\r\n};\r\n\r\n// 객체의 중첩된 속성 값 가져오기\r\nexport const get = <T>(\r\n obj: any,\r\n path: string,\r\n defaultValue?: T\r\n): T | undefined => {\r\n const keys = path.split('.');\r\n let result = obj;\r\n\r\n for (const key of keys) {\r\n if (result === null || result === undefined) {\r\n return defaultValue;\r\n }\r\n result = result[key];\r\n }\r\n\r\n return result !== undefined ? result : defaultValue;\r\n};\r\n\r\n// 객체의 중첩된 속성 값 설정\r\nexport const set = <T extends object>(obj: T, path: string, value: any): T => {\r\n const keys = path.split('.');\r\n const result = deepClone(obj);\r\n let current = result;\r\n\r\n for (let i = 0; i < keys.length - 1; i++) {\r\n const key = keys[i];\r\n if (!(key in current) || typeof current[key] !== 'object') {\r\n current[key] = {};\r\n }\r\n current = current[key];\r\n }\r\n\r\n current[keys[keys.length - 1]] = value;\r\n return result;\r\n};\r\n\r\n// 객체의 모든 중첩된 키들 가져오기\r\nexport const getAllKeys = (obj: any, prefix = ''): string[] => {\r\n const keys: string[] = [];\r\n\r\n for (const key in obj) {\r\n if (obj.hasOwnProperty(key)) {\r\n const newKey = prefix ? `${prefix}.${key}` : key;\r\n keys.push(newKey);\r\n\r\n if (\r\n obj[key] &&\r\n typeof obj[key] === 'object' &&\r\n !Array.isArray(obj[key])\r\n ) {\r\n keys.push(...getAllKeys(obj[key], newKey));\r\n }\r\n }\r\n }\r\n\r\n return keys;\r\n};\r\n\r\n// 객체를 플랫하게 만들기\r\nexport const flatten = (obj: any, prefix = ''): Record<string, any> => {\r\n const result: Record<string, any> = {};\r\n\r\n for (const key in obj) {\r\n if (obj.hasOwnProperty(key)) {\r\n const newKey = prefix ? `${prefix}.${key}` : key;\r\n\r\n if (\r\n obj[key] &&\r\n typeof obj[key] === 'object' &&\r\n !Array.isArray(obj[key])\r\n ) {\r\n Object.assign(result, flatten(obj[key], newKey));\r\n } else {\r\n result[newKey] = obj[key];\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n};\r\n\r\n// 객체 비교 (깊은 비교)\r\nexport const isEqual = (obj1: any, obj2: any): boolean => {\r\n if (obj1 === obj2) return true;\r\n if (obj1 == null || obj2 == null) return false;\r\n if (typeof obj1 !== typeof obj2) return false;\r\n\r\n if (typeof obj1 !== 'object') return obj1 === obj2;\r\n\r\n const keys1 = Object.keys(obj1);\r\n const keys2 = Object.keys(obj2);\r\n\r\n if (keys1.length !== keys2.length) return false;\r\n\r\n for (const key of keys1) {\r\n if (!keys2.includes(key)) return false;\r\n if (!isEqual(obj1[key], obj2[key])) return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\n// 객체 크기 (키 개수)\r\nexport const size = (obj: object): number => {\r\n return Object.keys(obj).length;\r\n};\r\n\r\n// 객체가 특정 키를 가지고 있는지 확인\r\nexport const has = (obj: object, key: string): boolean => {\r\n return Object.prototype.hasOwnProperty.call(obj, key);\r\n};\r\n\r\n// 객체의 모든 값이 조건을 만족하는지 확인\r\nexport const every = <T extends object>(\r\n obj: T,\r\n predicate: (value: T[keyof T], key: keyof T) => boolean\r\n): boolean => {\r\n return Object.keys(obj).every(key =>\r\n predicate(obj[key as keyof T], key as keyof T)\r\n );\r\n};\r\n\r\n// 객체의 일부 값이 조건을 만족하는지 확인\r\nexport const some = <T extends object>(\r\n obj: T,\r\n predicate: (value: T[keyof T], key: keyof T) => boolean\r\n): boolean => {\r\n return Object.keys(obj).some(key =>\r\n predicate(obj[key as keyof T], key as keyof T)\r\n );\r\n};\r\n\r\n// 객체를 필터링\r\nexport const filter = <T extends object>(\r\n obj: T,\r\n predicate: (value: T[keyof T], key: keyof T) => boolean\r\n): Partial<T> => {\r\n const result = {} as Partial<T>;\r\n\r\n Object.keys(obj).forEach(key => {\r\n const k = key as keyof T;\r\n if (predicate(obj[k], k)) {\r\n result[k] = obj[k];\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\n// 객체를 매핑\r\nexport const map = <T extends object, U>(\r\n obj: T,\r\n mapper: (value: T[keyof T], key: keyof T) => U\r\n): Record<keyof T, U> => {\r\n const result = {} as Record<keyof T, U>;\r\n\r\n Object.keys(obj).forEach(key => {\r\n const k = key as keyof T;\r\n result[k] = mapper(obj[k], k);\r\n });\r\n\r\n return result;\r\n};\r\n","/**\r\n * 배열 유틸리티 함수들\r\n */\r\n\r\n// 배열이 비어있는지 확인\r\nexport const isEmptyArray = <T>(arr: T[]): boolean => {\r\n return !arr || arr.length === 0\r\n}\r\n\r\n// 배열이 비어있지 않은지 확인\r\nexport const isNotEmptyArray = <T>(arr: T[]): boolean => {\r\n return !isEmptyArray(arr)\r\n}\r\n\r\n// 배열 중복 제거\r\nexport const unique = <T>(arr: T[]): T[] => {\r\n return [...new Set(arr)]\r\n}\r\n\r\n// 객체 배열에서 특정 키로 중복 제거\r\nexport const uniqueBy = <T>(arr: T[], key: keyof T): T[] => {\r\n const seen = new Set()\r\n return arr.filter(item => {\r\n const value = item[key]\r\n if (seen.has(value)) {\r\n return false\r\n }\r\n seen.add(value)\r\n return true\r\n })\r\n}\r\n\r\n// 배열을 청크로 나누기\r\nexport const chunk = <T>(arr: T[], size: number): T[][] => {\r\n const chunks: T[][] = []\r\n for (let i = 0; i < arr.length; i += size) {\r\n chunks.push(arr.slice(i, i + size))\r\n }\r\n return chunks\r\n}\r\n\r\n// 배열 섞기 (Fisher-Yates 알고리즘)\r\nexport const shuffle = <T>(arr: T[]): T[] => {\r\n const shuffled = [...arr]\r\n for (let i = shuffled.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1))\r\n ;[shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]\r\n }\r\n return shuffled\r\n}\r\n\r\n// 배열에서 랜덤 요소 가져오기\r\nexport const randomFromArray = <T>(arr: T[]): T | undefined => {\r\n if (isEmptyArray(arr)) return undefined\r\n return arr[Math.floor(Math.random() * arr.length)]\r\n}\r\n\r\n// 배열에서 여러 개의 랜덤 요소 가져오기\r\nexport const randomMultiple = <T>(arr: T[], count: number): T[] => {\r\n const shuffled = shuffle(arr)\r\n return shuffled.slice(0, Math.min(count, arr.length))\r\n}\r\n\r\n// 배열 정렬 (숫자)\r\nexport const sortNumbers = (arr: number[], ascending: boolean = true): number[] => {\r\n return [...arr].sort((a, b) => ascending ? a - b : b - a)\r\n}\r\n\r\n// 객체 배열을 특정 키로 정렬\r\nexport const sortBy = <T>(arr: T[], key: keyof T, ascending: boolean = true): T[] => {\r\n return [...arr].sort((a, b) => {\r\n const aVal = a[key]\r\n const bVal = b[key]\r\n \r\n if (aVal < bVal) return ascending ? -1 : 1\r\n if (aVal > bVal) return ascending ? 1 : -1\r\n return 0\r\n })\r\n}\r\n\r\n// 배열에서 최대값 찾기\r\nexport const max = (arr: number[]): number | undefined => {\r\n if (isEmptyArray(arr)) return undefined\r\n return Math.max(...arr)\r\n}\r\n\r\n// 배열에서 최소값 찾기\r\nexport const min = (arr: number[]): number | undefined => {\r\n if (isEmptyArray(arr)) return undefined\r\n return Math.min(...arr)\r\n}\r\n\r\n// 배열 평균 계산\r\nexport const average = (arr: number[]): number | undefined => {\r\n if (isEmptyArray(arr)) return undefined\r\n return arr.reduce((sum, num) => sum + num, 0) / arr.length\r\n}\r\n\r\n// 배열 합계 계산\r\nexport const sum = (arr: number[]): number => {\r\n return arr.reduce((sum, num) => sum + num, 0)\r\n}\r\n\r\n// 배열에서 특정 조건을 만족하는 요소 개수 세기\r\nexport const count = <T>(arr: T[], predicate: (item: T) => boolean): number => {\r\n return arr.filter(predicate).length\r\n}\r\n\r\n// 배열에서 특정 요소의 인덱스 찾기 (마지막)\r\nexport const lastIndexOf = <T>(arr: T[], item: T): number => {\r\n for (let i = arr.length - 1; i >= 0; i--) {\r\n if (arr[i] === item) return i\r\n }\r\n return -1\r\n}\r\n\r\n// 배열에서 특정 조건을 만족하는 첫 번째 요소 찾기\r\nexport const find = <T>(arr: T[], predicate: (item: T) => boolean): T | undefined => {\r\n return arr.find(predicate)\r\n}\r\n\r\n// 배열에서 특정 조건을 만족하는 마지막 요소 찾기\r\nexport const findLast = <T>(arr: T[], predicate: (item: T) => boolean): T | undefined => {\r\n for (let i = arr.length - 1; i >= 0; i--) {\r\n if (predicate(arr[i])) return arr[i]\r\n }\r\n return undefined\r\n}\r\n\r\n// 배열에서 특정 요소 제거\r\nexport const remove = <T>(arr: T[], item: T): T[] => {\r\n return arr.filter(i => i !== item)\r\n}\r\n\r\n// 배열에서 특정 인덱스의 요소 제거\r\nexport const removeAt = <T>(arr: T[], index: number): T[] => {\r\n if (index < 0 || index >= arr.length) return arr\r\n return [...arr.slice(0, index), ...arr.slice(index + 1)]\r\n}\r\n\r\n// 배열에서 특정 조건을 만족하는 요소들 제거\r\nexport const removeWhere = <T>(arr: T[], predicate: (item: T) => boolean): T[] => {\r\n return arr.filter(item => !predicate(item))\r\n}\r\n\r\n// 배열에서 특정 요소가 포함되어 있는지 확인\r\nexport const includes = <T>(arr: T[], item: T): boolean => {\r\n return arr.includes(item)\r\n}\r\n\r\n// 두 배열의 교집합\r\nexport const intersection = <T>(arr1: T[], arr2: T[]): T[] => {\r\n return arr1.filter(item => arr2.includes(item))\r\n}\r\n\r\n// 두 배열의 합집합\r\nexport const union = <T>(arr1: T[], arr2: T[]): T[] => {\r\n return unique([...arr1, ...arr2])\r\n}\r\n\r\n// 두 배열의 차집합\r\nexport const difference = <T>(arr1: T[], arr2: T[]): T[] => {\r\n return arr1.filter(item => !arr2.includes(item))\r\n}\r\n\r\n// 배열을 그룹으로 나누기\r\nexport const groupBy = <T, K extends string | number | symbol>(\r\n arr: T[], \r\n keySelector: (item: T) => K\r\n): Record<K, T[]> => {\r\n return arr.reduce((groups, item) => {\r\n const key = keySelector(item)\r\n if (!groups[key]) {\r\n groups[key] = []\r\n }\r\n groups[key].push(item)\r\n return groups\r\n }, {} as Record<K, T[]>)\r\n}\r\n\r\n// 배열을 플랫하게 만들기 (중첩 배열)\r\nexport const flattenArray = <T>(arr: T[][]): T[] => {\r\n return arr.flat()\r\n}\r\n\r\n// 배열을 깊게 플랫하게 만들기\r\nexport const flattenDeep = (arr: any[]): any[] => {\r\n return arr.reduce((flat: any[], item) => {\r\n return flat.concat(Array.isArray(item) ? flattenDeep(item) : item)\r\n }, [])\r\n}\r\n\r\n// 배열에서 특정 범위의 요소들 가져오기\r\nexport const range = <T>(arr: T[], start: number, end?: number): T[] => {\r\n const endIndex = end ?? arr.length\r\n return arr.slice(start, endIndex)\r\n}\r\n\r\n// 배열을 뒤집기\r\nexport const reverse = <T>(arr: T[]): T[] => {\r\n return [...arr].reverse()\r\n}\r\n\r\n// 배열에서 중복 요소들 찾기\r\nexport const duplicates = <T>(arr: T[]): T[] => {\r\n const seen = new Set<T>()\r\n const duplicates = new Set<T>()\r\n \r\n arr.forEach(item => {\r\n if (seen.has(item)) {\r\n duplicates.add(item)\r\n } else {\r\n seen.add(item)\r\n }\r\n })\r\n \r\n return Array.from(duplicates)\r\n} ","/**\r\n * 일반적인 유틸리티 함수들\r\n */\r\n\r\n// 타입 가드 함수들\r\nexport const isString = (value: any): value is string => typeof value === 'string'\r\nexport const isNumber = (value: any): value is number => typeof value === 'number' && !isNaN(value)\r\nexport const isBoolean = (value: any): value is boolean => typeof value === 'boolean'\r\nexport const isFunction = (value: any): value is Function => typeof value === 'function'\r\nexport const isObject = (value: any): value is object => value !== null && typeof value === 'object'\r\nexport const isArray = (value: any): value is any[] => Array.isArray(value)\r\nexport const isNull = (value: any): value is null => value === null\r\nexport const isUndefined = (value: any): value is undefined => value === undefined\r\nexport const isNullOrUndefined = (value: any): value is null | undefined => value === null || value === undefined\r\n\r\n// 숫자 관련\r\nexport const clamp = (value: number, min: number, max: number): number => {\r\n return Math.min(Math.max(value, min), max)\r\n}\r\n\r\nexport const round = (value: number, decimals: number = 0): number => {\r\n return Math.round(value * Math.pow(10, decimals)) / Math.pow(10, decimals)\r\n}\r\n\r\nexport const formatNumber = (num: number, locale: string = 'ko-KR'): string => {\r\n return new Intl.NumberFormat(locale).format(num)\r\n}\r\n\r\nexport const formatCurrency = (amount: number, currency: string = 'KRW', locale: string = 'ko-KR'): string => {\r\n return new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currency: currency\r\n }).format(amount)\r\n}\r\n\r\nexport const formatPercent = (value: number, decimals: number = 2): string => {\r\n return `${(value * 100).toFixed(decimals)}%`\r\n}\r\n\r\n// 랜덤 관련\r\nexport const random = (min: number, max: number): number => {\r\n return Math.random() * (max - min) + min\r\n}\r\n\r\nexport const randomInt = (min: number, max: number): number => {\r\n return Math.floor(Math.random() * (max - min + 1)) + min\r\n}\r\n\r\nexport const randomChoice = <T>(array: T[]): T | undefined => {\r\n if (array.length === 0) return undefined\r\n return array[Math.floor(Math.random() * array.length)]\r\n}\r\n\r\n// 디바운스 함수\r\nexport const debounce = <T extends (...args: any[]) => any>(\r\n func: T,\r\n delay: number\r\n): ((...args: Parameters<T>) => void) => {\r\n let timeoutId: ReturnType<typeof setTimeout>\r\n \r\n return (...args: Parameters<T>) => {\r\n clearTimeout(timeoutId)\r\n timeoutId = setTimeout(() => func(...args), delay)\r\n }\r\n}\r\n\r\n// 쓰로틀 함수\r\nexport const throttle = <T extends (...args: any[]) => any>(\r\n func: T,\r\n delay: number\r\n): ((...args: Parameters<T>) => void) => {\r\n let lastCall = 0\r\n \r\n return (...args: Parameters<T>) => {\r\n const now = Date.now()\r\n if (now - lastCall >= delay) {\r\n lastCall = now\r\n func(...args)\r\n }\r\n }\r\n}\r\n\r\n// 딜레이 함수\r\nexport const delay = (ms: number): Promise<void> => {\r\n return new Promise(resolve => setTimeout(resolve, ms))\r\n}\r\n\r\n// 로컬 스토리지 관련\r\nexport const setLocalStorage = (key: string, value: any): void => {\r\n try {\r\n localStorage.setItem(key, JSON.stringify(value))\r\n } catch (error) {\r\n console.error('Error saving to localStorage:', error)\r\n }\r\n}\r\n\r\nexport const getLocalStorage = <T>(key: string, defaultValue?: T): T | null => {\r\n try {\r\n const item = localStorage.getItem(key)\r\n return item ? JSON.parse(item) : defaultValue || null\r\n } catch (error) {\r\n console.error('Error reading from localStorage:', error)\r\n return defaultValue || null\r\n }\r\n}\r\n\r\nexport const removeLocalStorage = (key: string): void => {\r\n try {\r\n localStorage.removeItem(key)\r\n } catch (error) {\r\n console.error('Error removing from localStorage:', error)\r\n }\r\n}\r\n\r\nexport const clearLocalStorage = (): void => {\r\n try {\r\n localStorage.clear()\r\n } catch (error) {\r\n console.error('Error clearing localStorage:', error)\r\n }\r\n}\r\n\r\n// 세션 스토리지 관련\r\nexport const setSessionStorage = (key: string, value: any): void => {\r\n try {\r\n sessionStorage.setItem(key, JSON.stringify(value))\r\n } catch (error) {\r\n console.error('Error saving to sessionStorage:', error)\r\n }\r\n}\r\n\r\nexport const getSessionStorage = <T>(key: string, defaultValue?: T): T | null => {\r\n try {\r\n const item = sessionStorage.getItem(key)\r\n return item ? JSON.parse(item) : defaultValue || null\r\n } catch (error) {\r\n console.error('Error reading from sessionStorage:', error)\r\n return defaultValue || null\r\n }\r\n}\r\n\r\nexport const removeSessionStorage = (key: string): void => {\r\n try {\r\n sessionStorage.removeItem(key)\r\n } catch (error) {\r\n console.error('Error removing from sessionStorage:', error)\r\n }\r\n}\r\n\r\nexport const clearSessionStorage = (): void => {\r\n try {\r\n sessionStorage.clear()\r\n } catch (error) {\r\n console.error('Error clearing sessionStorage:', error)\r\n }\r\n}\r\n\r\n// URL 관련\r\nexport const getUrlParams = (): Record<string, string> => {\r\n const params = new URLSearchParams(window.location.search)\r\n const result: Record<string, string> = {}\r\n \r\n params.forEach((value, key) => {\r\n result[key] = value\r\n })\r\n \r\n return result\r\n}\r\n\r\nexport const setUrlParams = (params: Record<string, string>): void => {\r\n const url = new URL(window.location.href)\r\n \r\n Object.keys(params).forEach(key => {\r\n url.searchParams.set(key, params[key])\r\n })\r\n \r\n window.history.pushState({}, '', url.toString())\r\n}\r\n\r\nexport const removeUrlParams = (keys: string[]): void => {\r\n const url = new URL(window.location.href)\r\n \r\n keys.forEach(key => {\r\n url.searchParams.delete(key)\r\n })\r\n \r\n window.history.pushState({}, '', url.toString())\r\n}\r\n\r\n// 파일 관련\r\nexport const formatFileSize = (bytes: number): string => {\r\n if (bytes === 0) return '0 Bytes'\r\n \r\n const k = 1024\r\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB']\r\n const i = Math.floor(Math.log(bytes) / Math.log(k))\r\n \r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]\r\n}\r\n\r\nexport const getFileExtension = (filename: string): string => {\r\n return filename.slice((filename.lastIndexOf('.') - 1 >>> 0) + 2)\r\n}\r\n\r\nexport const isValidFileType = (file: File, allowedTypes: string[]): boolean => {\r\n return allowedTypes.includes(file.type)\r\n}\r\n\r\nexport const isValidFileSize = (file: File, maxSize: number): boolean => {\r\n return file.size <= maxSize\r\n}\r\n\r\n// 색상 관련\r\nexport const hexToRgb = (hex: string): { r: number; g: number; b: number } | null => {\r\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex)\r\n return result ? {\r\n r: parseInt(result[1], 16),\r\n g: parseInt(result[2], 16),\r\n b: parseInt(result[3], 16)\r\n } : null\r\n}\r\n\r\nexport const rgbToHex = (r: number, g: number, b: number): string => {\r\n return '#' + [r, g, b].map(x => {\r\n const hex = x.toString(16)\r\n return hex.length === 1 ? '0' + hex : hex\r\n }).join('')\r\n}\r\n\r\nexport const generateRandomColor = (): string => {\r\n return '#' + Math.floor(Math.random() * 16777215).toString(16)\r\n}\r\n\r\n// 기타 유틸리티\r\nexport const copyToClipboard = async (text: string): Promise<boolean> => {\r\n try {\r\n await navigator.clipboard.writeText(text)\r\n return true\r\n } catch (error) {\r\n console.error('Error copying to clipboard:', error)\r\n return false\r\n }\r\n}\r\n\r\nexport const downloadFile = (data: string, filename: string, type: string = 'text/plain'): void => {\r\n const blob = new Blob([data], { type })\r\n const url = URL.createObjectURL(blob)\r\n const link = document.createElement('a')\r\n link.href = url\r\n link.download = filename\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n URL.revokeObjectURL(url)\r\n}\r\n\r\nexport const scrollToTop = (): void => {\r\n window.scrollTo({ top: 0, behavior: 'smooth' })\r\n}\r\n\r\nexport const scrollToElement = (elementId: string): void => {\r\n const element = document.getElementById(elementId)\r\n if (element) {\r\n element.scrollIntoView({ behavior: 'smooth' })\r\n }\r\n}\r\n\r\nexport const isInViewport = (element: HTMLElement): boolean => {\r\n const rect = element.getBoundingClientRect()\r\n return (\r\n rect.top >= 0 &&\r\n rect.left >= 0 &&\r\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\r\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\r\n )\r\n}\r\n\r\nexport const getDeviceType = (): 'mobile' | 'tablet' | 'desktop' => {\r\n const width = window.innerWidth\r\n if (width < 768) return 'mobile'\r\n if (width < 1024) return 'tablet'\r\n return 'desktop'\r\n}\r\n\r\nexport const isMobile = (): boolean => getDeviceType() === 'mobile'\r\nexport const isTablet = (): boolean => getDeviceType() === 'tablet'\r\nexport const isDesktop = (): boolean => getDeviceType() === 'desktop' "],"names":["e","_","module","require$$0","this","d","t","n","o","i","r","u","f","a","s","l","h","m","c","y","p","v","M","dayjs","relativeTime","utc","timezone","getCurrentDate","getCurrentDateString","format","formatDate","date","formatDateKST","getRelativeTime","getDateDiff","date1","date2","unit","isToday","isThisWeek","isThisMonth","getWeekStart","getWeekEnd","getMonthStart","getMonthEnd","getDateRange","startDate","endDate","dates","current","end","getDateRangeForPicker","isValidDate","calculateAge","birthDate","isWeekend","day","isWeekday","formatDateKorean","formatTimeKorean","formatDateTimeKorean","isEmptyObject","obj","isNotEmptyObject","deepClone","item","clonedObj","key","pick","keys","result","omit","values","entries","merge","target","sources","source","targetKey","sourceValue","targetValue","removeNullValues","value","removeEmptyStrings","toQueryString","params","fromQueryString","queryString","get","path","defaultValue","set","getAllKeys","prefix","newKey","flatten","isEqual","obj1","obj2","keys1","keys2","size","has","every","predicate","some","filter","k","map","mapper","isEmptyArray","arr","isNotEmptyArray","unique","uniqueBy","seen","chunk","chunks","shuffle","shuffled","j","randomFromArray","randomMultiple","count","sortNumbers","ascending","b","sortBy","aVal","bVal","max","min","average","sum","num","lastIndexOf","find","findLast","remove","removeAt","index","removeWhere","includes","intersection","arr1","arr2","union","difference","groupBy","keySelector","groups","flattenArray","flattenDeep","flat","range","start","endIndex","duplicates","isString","isNumber","isBoolean","isFunction","isObject","isArray","isNull","isUndefined","isNullOrUndefined","clamp","round","decimals","formatNumber","locale","formatCurrency","amount","currency","random","randomInt","randomChoice","array","debounce","func","delay","timeoutId","args","throttle","lastCall","now","ms","resolve","setLocalStorage","error","getLocalStorage","removeLocalStorage","clearLocalStorage","setSessionStorage","getSessionStorage","removeSessionStorage","clearSessionStorage","generateRandomColor","copyToClipboard","text","downloadFile","data","filename","type","blob","url","link","scrollToTop","scrollToElement","elementId","element","isInViewport","rect","getDeviceType","width","isMobile","isTablet","isDesktop"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}
@@ -0,0 +1,2 @@
1
+ "use strict";const a=require("dayjs"),U=require("./_commonjsHelpers-DwGv2jUC.cjs");var E={exports:{}},_t=E.exports,K;function wt(){return K||(K=1,(function(t,e){(function(r,n){t.exports=n(a)})(_t,(function(r){function n(i){return i&&typeof i=="object"&&"default"in i?i:{default:i}}var o=n(r),c={name:"ko",weekdays:"일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),weekdaysShort:"일_월_화_수_목_금_토".split("_"),weekdaysMin:"일_월_화_수_목_금_토".split("_"),months:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),monthsShort:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),ordinal:function(i){return i+"일"},formats:{LT:"A h:mm",LTS:"A h:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY년 MMMM D일",LLL:"YYYY년 MMMM D일 A h:mm",LLLL:"YYYY년 MMMM D일 dddd A h:mm",l:"YYYY.MM.DD.",ll:"YYYY년 MMMM D일",lll:"YYYY년 MMMM D일 A h:mm",llll:"YYYY년 MMMM D일 dddd A h:mm"},meridiem:function(i){return i<12?"오전":"오후"},relativeTime:{future:"%s 후",past:"%s 전",s:"몇 초",m:"1분",mm:"%d분",h:"한 시간",hh:"%d시간",d:"하루",dd:"%d일",M:"한 달",MM:"%d달",y:"일 년",yy:"%d년"}};return o.default.locale(c,null,!0),c}))})(E)),E.exports}wt();var A={exports:{}},xt=A.exports,H;function Et(){return H||(H=1,(function(t,e){(function(r,n){t.exports=n()})(xt,(function(){return function(r,n,o){r=r||{};var c=n.prototype,i={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function h(y,D,Y,f){return c.fromToBase(y,D,Y,f)}o.en.relativeTime=i,c.fromToBase=function(y,D,Y,f,M){for(var l,s,u,p=Y.$locale().relativeTime||i,v=r.thresholds||[{l:"s",r:44,d:"second"},{l:"m",r:89},{l:"mm",r:44,d:"minute"},{l:"h",r:89},{l:"hh",r:21,d:"hour"},{l:"d",r:35},{l:"dd",r:25,d:"day"},{l:"M",r:45},{l:"MM",r:10,d:"month"},{l:"y",r:17},{l:"yy",d:"year"}],g=v.length,S=0;S<g;S+=1){var d=v[S];d.d&&(l=f?o(y).diff(Y,d.d,!0):Y.diff(y,d.d,!0));var O=(r.rounding||Math.round)(Math.abs(l));if(u=l>0,O<=d.r||!d.r){O<=1&&S>0&&(d=v[S-1]);var $=p[d.l];M&&(O=M(""+O)),s=typeof $=="string"?$.replace("%d",O):$(O,D,d.l,u);break}}if(D)return s;var T=u?p.future:p.past;return typeof T=="function"?T(s):T.replace("%s",s)},c.to=function(y,D){return h(y,D,this,!0)},c.from=function(y,D){return h(y,D,this)};var m=function(y){return y.$u?o.utc():o()};c.toNow=function(y){return this.to(m(this),y)},c.fromNow=function(y){return this.from(m(this),y)}}}))})(A)),A.exports}var At=Et();const bt=U.getDefaultExportFromCjs(At);var b={exports:{}},Lt=b.exports,q;function Ct(){return q||(q=1,(function(t,e){(function(r,n){t.exports=n()})(Lt,(function(){var r="minute",n=/[+-]\d\d(?::?\d\d)?/g,o=/([+-]|\d\d)/g;return function(c,i,h){var m=i.prototype;h.utc=function(s){var u={date:s,utc:!0,args:arguments};return new i(u)},m.utc=function(s){var u=h(this.toDate(),{locale:this.$L,utc:!0});return s?u.add(this.utcOffset(),r):u},m.local=function(){return h(this.toDate(),{locale:this.$L,utc:!1})};var y=m.parse;m.parse=function(s){s.utc&&(this.$u=!0),this.$utils().u(s.$offset)||(this.$offset=s.$offset),y.call(this,s)};var D=m.init;m.init=function(){if(this.$u){var s=this.$d;this.$y=s.getUTCFullYear(),this.$M=s.getUTCMonth(),this.$D=s.getUTCDate(),this.$W=s.getUTCDay(),this.$H=s.getUTCHours(),this.$m=s.getUTCMinutes(),this.$s=s.getUTCSeconds(),this.$ms=s.getUTCMilliseconds()}else D.call(this)};var Y=m.utcOffset;m.utcOffset=function(s,u){var p=this.$utils().u;if(p(s))return this.$u?0:p(this.$offset)?Y.call(this):this.$offset;if(typeof s=="string"&&(s=(function(d){d===void 0&&(d="");var O=d.match(n);if(!O)return null;var $=(""+O[0]).match(o)||["-",0,0],T=$[0],k=60*+$[1]+ +$[2];return k===0?0:T==="+"?k:-k})(s),s===null))return this;var v=Math.abs(s)<=16?60*s:s,g=this;if(u)return g.$offset=v,g.$u=s===0,g;if(s!==0){var S=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();(g=this.local().add(v+S,r)).$offset=v,g.$x.$localOffset=S}else g=this.utc();return g};var f=m.format;m.format=function(s){var u=s||(this.$u?"YYYY-MM-DDTHH:mm:ss[Z]":"");return f.call(this,u)},m.valueOf=function(){var s=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||this.$d.getTimezoneOffset());return this.$d.valueOf()-6e4*s},m.isUTC=function(){return!!this.$u},m.toISOString=function(){return this.toDate().toISOString()},m.toString=function(){return this.toDate().toUTCString()};var M=m.toDate;m.toDate=function(s){return s==="s"&&this.$offset?h(this.format("YYYY-MM-DD HH:mm:ss:SSS")).toDate():M.call(this)};var l=m.diff;m.diff=function(s,u,p){if(s&&this.$u===s.$u)return l.call(this,s,u,p);var v=this.local(),g=h(s).local();return l.call(v,g,u,p)}}}))})(b)),b.exports}var Nt=Ct();const Ut=U.getDefaultExportFromCjs(Nt);var L={exports:{}},zt=L.exports,F;function Rt(){return F||(F=1,(function(t,e){(function(r,n){t.exports=n()})(zt,(function(){var r={year:0,month:1,day:2,hour:3,minute:4,second:5},n={};return function(o,c,i){var h,m=function(f,M,l){l===void 0&&(l={});var s=new Date(f),u=(function(p,v){v===void 0&&(v={});var g=v.timeZoneName||"short",S=p+"|"+g,d=n[S];return d||(d=new Intl.DateTimeFormat("en-US",{hour12:!1,timeZone:p,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",timeZoneName:g}),n[S]=d),d})(M,l);return u.formatToParts(s)},y=function(f,M){for(var l=m(f,M),s=[],u=0;u<l.length;u+=1){var p=l[u],v=p.type,g=p.value,S=r[v];S>=0&&(s[S]=parseInt(g,10))}var d=s[3],O=d===24?0:d,$=s[0]+"-"+s[1]+"-"+s[2]+" "+O+":"+s[4]+":"+s[5]+":000",T=+f;return(i.utc($).valueOf()-(T-=T%1e3))/6e4},D=c.prototype;D.tz=function(f,M){f===void 0&&(f=h);var l,s=this.utcOffset(),u=this.toDate(),p=u.toLocaleString("en-US",{timeZone:f}),v=Math.round((u-new Date(p))/1e3/60),g=15*-Math.round(u.getTimezoneOffset()/15)-v;if(!Number(g))l=this.utcOffset(0,M);else if(l=i(p,{locale:this.$L}).$set("millisecond",this.$ms).utcOffset(g,!0),M){var S=l.utcOffset();l=l.add(s-S,"minute")}return l.$x.$timezone=f,l},D.offsetName=function(f){var M=this.$x.$timezone||i.tz.guess(),l=m(this.valueOf(),M,{timeZoneName:f}).find((function(s){return s.type.toLowerCase()==="timezonename"}));return l&&l.value};var Y=D.startOf;D.startOf=function(f,M){if(!this.$x||!this.$x.$timezone)return Y.call(this,f,M);var l=i(this.format("YYYY-MM-DD HH:mm:ss:SSS"),{locale:this.$L});return Y.call(l,f,M).tz(this.$x.$timezone,!0)},i.tz=function(f,M,l){var s=l&&M,u=l||M||h,p=y(+i(),u);if(typeof f!="string")return i(f).tz(u);var v=(function(O,$,T){var k=O-60*$*1e3,_=y(k,T);if($===_)return[k,$];var N=y(k-=60*(_-$)*1e3,T);return _===N?[k,_]:[O-60*Math.min(_,N)*1e3,Math.max(_,N)]})(i.utc(f,s).valueOf(),p,u),g=v[0],S=v[1],d=i(g).utcOffset(S);return d.$x.$timezone=u,d},i.tz.guess=function(){return Intl.DateTimeFormat().resolvedOptions().timeZone},i.tz.setDefault=function(f){h=f}}}))})(L)),L.exports}var It=Rt();const Kt=U.getDefaultExportFromCjs(It);a.extend(bt);a.extend(Ut);a.extend(Kt);a.locale("ko");const W=()=>a(),B=(t="YYYY-MM-DD")=>a().format(t),P=(t,e="YYYY-MM-DD")=>a(t).format(e),V=(t,e="YYYY-MM-DD HH:mm:ss")=>a(t).tz("Asia/Seoul").format(e),Z=t=>a(t).fromNow(),j=(t,e,r="day")=>a(t).diff(a(e),r),J=t=>a(t).isSame(a(),"day"),Q=t=>a(t).isSame(a(),"week"),G=t=>a(t).isSame(a(),"month"),X=(t=a())=>a(t).startOf("week"),tt=(t=a())=>a(t).endOf("week"),et=(t=a())=>a(t).startOf("month"),rt=(t=a())=>a(t).endOf("month"),nt=(t,e)=>{const r=[];let n=a(t);const o=a(e);for(;n.isBefore(o)||n.isSame(o,"day");)r.push(n),n=n.add(1,"day");return r},ot=(t,e)=>[a(t),a(e)],st=t=>a(t).isValid(),it=t=>a().diff(a(t),"year"),at=t=>{const e=a(t).day();return e===0||e===6},Ht=t=>!at(t),ct=t=>a(t).format("YYYY년 MM월 DD일"),ut=t=>a(t).format("HH시 mm분"),lt=t=>a(t).format("YYYY년 MM월 DD일 HH시 mm분"),qt=Object.freeze(Object.defineProperty({__proto__:null,calculateAge:it,formatDate:P,formatDateKST:V,formatDateKorean:ct,formatDateTimeKorean:lt,formatTimeKorean:ut,getCurrentDate:W,getCurrentDateString:B,getDateDiff:j,getDateRange:nt,getDateRangeForPicker:ot,getMonthEnd:rt,getMonthStart:et,getRelativeTime:Z,getWeekEnd:tt,getWeekStart:X,isThisMonth:G,isThisWeek:Q,isToday:J,isValidDate:st,isWeekday:Ht,isWeekend:at},Symbol.toStringTag,{value:"Module"})),ft=t=>Object.keys(t).length===0,Ft=t=>!ft(t),w=t=>{if(t===null||typeof t!="object")return t;if(t instanceof Date)return new Date(t.getTime());if(t instanceof Array)return t.map(e=>w(e));if(typeof t=="object"){const e={};for(const r in t)t.hasOwnProperty(r)&&(e[r]=w(t[r]));return e}return t},mt=(t,e)=>{const r={};return e.forEach(n=>{n in t&&(r[n]=t[n])}),r},dt=(t,e)=>{const r={...t};return e.forEach(n=>{delete r[n]}),r},ht=t=>Object.values(t),gt=t=>Object.keys(t),yt=t=>Object.entries(t),z=(t,...e)=>{const r=w(t);return e.forEach(n=>{n&&Object.keys(n).forEach(o=>{const c=o,i=n[c],h=r[c];i&&typeof i=="object"&&!Array.isArray(i)&&h&&typeof h=="object"&&!Array.isArray(h)?r[c]=z(h,i):r[c]=i})}),r},pt=t=>{const e={};return Object.keys(t).forEach(r=>{const n=t[r];n!=null&&(e[r]=n)}),e},vt=t=>{const e={};return Object.keys(t).forEach(r=>{const n=t[r];n!==""&&(e[r]=n)}),e},Wt=t=>{const e=new URLSearchParams;return Object.keys(t).forEach(r=>{const n=t[r];n!=null&&e.append(r,String(n))}),e.toString()},Bt=t=>{const e=new URLSearchParams(t),r={};return e.forEach((n,o)=>{r[o]=n}),r},Pt=(t,e,r)=>{const n=e.split(".");let o=t;for(const c of n){if(o==null)return r;o=o[c]}return o!==void 0?o:r},Mt=(t,e,r)=>{const n=e.split("."),o=w(t);let c=o;for(let i=0;i<n.length-1;i++){const h=n[i];(!(h in c)||typeof c[h]!="object")&&(c[h]={}),c=c[h]}return c[n[n.length-1]]=r,o},R=(t,e="")=>{const r=[];for(const n in t)if(t.hasOwnProperty(n)){const o=e?`${e}.${n}`:n;r.push(o),t[n]&&typeof t[n]=="object"&&!Array.isArray(t[n])&&r.push(...R(t[n],o))}return r},St=(t,e="")=>{const r={};for(const n in t)if(t.hasOwnProperty(n)){const o=e?`${e}.${n}`:n;t[n]&&typeof t[n]=="object"&&!Array.isArray(t[n])?Object.assign(r,St(t[n],o)):r[o]=t[n]}return r},I=(t,e)=>{if(t===e)return!0;if(t==null||e==null||typeof t!=typeof e)return!1;if(typeof t!="object")return t===e;const r=Object.keys(t),n=Object.keys(e);if(r.length!==n.length)return!1;for(const o of r)if(!n.includes(o)||!I(t[o],e[o]))return!1;return!0},Dt=t=>Object.keys(t).length,Ot=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),Vt=(t,e)=>Object.keys(t).every(r=>e(t[r],r)),Zt=(t,e)=>Object.keys(t).some(r=>e(t[r],r)),jt=(t,e)=>{const r={};return Object.keys(t).forEach(n=>{const o=n;e(t[o],o)&&(r[o]=t[o])}),r},$t=(t,e)=>{const r={};return Object.keys(t).forEach(n=>{const o=n;r[o]=e(t[o],o)}),r},Jt=Object.freeze(Object.defineProperty({__proto__:null,deepClone:w,entries:yt,every:Vt,filter:jt,flatten:St,fromQueryString:Bt,get:Pt,getAllKeys:R,has:Ot,isEmptyObject:ft,isEqual:I,isNotEmptyObject:Ft,keys:gt,map:$t,merge:z,omit:dt,pick:mt,removeEmptyStrings:vt,removeNullValues:pt,set:Mt,size:Dt,some:Zt,toQueryString:Wt,values:ht},Symbol.toStringTag,{value:"Module"})),x=t=>!t||t.length===0,Qt=t=>!x(t),Tt=t=>[...new Set(t)],Gt=(t,e)=>{const r=new Set;return t.filter(n=>{const o=n[e];return r.has(o)?!1:(r.add(o),!0)})},Xt=(t,e)=>{const r=[];for(let n=0;n<t.length;n+=e)r.push(t.slice(n,n+e));return r},Yt=t=>{const e=[...t];for(let r=e.length-1;r>0;r--){const n=Math.floor(Math.random()*(r+1));[e[r],e[n]]=[e[n],e[r]]}return e},te=t=>{if(!x(t))return t[Math.floor(Math.random()*t.length)]},ee=(t,e)=>Yt(t).slice(0,Math.min(e,t.length)),re=(t,e=!0)=>[...t].sort((r,n)=>e?r-n:n-r),ne=(t,e,r=!0)=>[...t].sort((n,o)=>{const c=n[e],i=o[e];return c<i?r?-1:1:c>i?r?1:-1:0}),oe=t=>{if(!x(t))return Math.max(...t)},se=t=>{if(!x(t))return Math.min(...t)},ie=t=>{if(!x(t))return t.reduce((e,r)=>e+r,0)/t.length},ae=t=>t.reduce((e,r)=>e+r,0),ce=(t,e)=>t.filter(e).length,ue=(t,e)=>{for(let r=t.length-1;r>=0;r--)if(t[r]===e)return r;return-1},le=(t,e)=>t.find(e),fe=(t,e)=>{for(let r=t.length-1;r>=0;r--)if(e(t[r]))return t[r]},me=(t,e)=>t.filter(r=>r!==e),de=(t,e)=>e<0||e>=t.length?t:[...t.slice(0,e),...t.slice(e+1)],he=(t,e)=>t.filter(r=>!e(r)),ge=(t,e)=>t.includes(e),ye=(t,e)=>t.filter(r=>e.includes(r)),pe=(t,e)=>Tt([...t,...e]),ve=(t,e)=>t.filter(r=>!e.includes(r)),Me=(t,e)=>t.reduce((r,n)=>{const o=e(n);return r[o]||(r[o]=[]),r[o].push(n),r},{}),Se=t=>t.flat(),kt=t=>t.reduce((e,r)=>e.concat(Array.isArray(r)?kt(r):r),[]),De=(t,e,r)=>{const n=r??t.length;return t.slice(e,n)},Oe=t=>{const e=new Set,r=new Set;return t.forEach(n=>{e.has(n)?r.add(n):e.add(n)}),Array.from(r)},$e=t=>typeof t=="string",Te=t=>typeof t=="number"&&!isNaN(t),Ye=t=>typeof t=="boolean",ke=t=>typeof t=="function",_e=t=>t!==null&&typeof t=="object",we=t=>Array.isArray(t),xe=t=>t===null,Ee=t=>t===void 0,Ae=t=>t==null,be=(t,e,r)=>Math.min(Math.max(t,e),r),Le=(t,e=0)=>Math.round(t*Math.pow(10,e))/Math.pow(10,e),Ce=(t,e="ko-KR")=>new Intl.NumberFormat(e).format(t),Ne=(t,e="KRW",r="ko-KR")=>new Intl.NumberFormat(r,{style:"currency",currency:e}).format(t),Ue=(t,e)=>Math.random()*(e-t)+t,ze=(t,e)=>Math.floor(Math.random()*(e-t+1))+t,Re=t=>{if(t.length!==0)return t[Math.floor(Math.random()*t.length)]},Ie=(t,e)=>{let r;return(...n)=>{clearTimeout(r),r=setTimeout(()=>t(...n),e)}},Ke=(t,e)=>{let r=0;return(...n)=>{const o=Date.now();o-r>=e&&(r=o,t(...n))}},He=t=>new Promise(e=>setTimeout(e,t)),qe=(t,e)=>{try{localStorage.setItem(t,JSON.stringify(e))}catch(r){console.error("Error saving to localStorage:",r)}},Fe=(t,e)=>{try{const r=localStorage.getItem(t);return r?JSON.parse(r):e||null}catch(r){return console.error("Error reading from localStorage:",r),e||null}},We=t=>{try{localStorage.removeItem(t)}catch(e){console.error("Error removing from localStorage:",e)}},Be=()=>{try{localStorage.clear()}catch(t){console.error("Error clearing localStorage:",t)}},Pe=(t,e)=>{try{sessionStorage.setItem(t,JSON.stringify(e))}catch(r){console.error("Error saving to sessionStorage:",r)}},Ve=(t,e)=>{try{const r=sessionStorage.getItem(t);return r?JSON.parse(r):e||null}catch(r){return console.error("Error reading from sessionStorage:",r),e||null}},Ze=t=>{try{sessionStorage.removeItem(t)}catch(e){console.error("Error removing from sessionStorage:",e)}},je=()=>{try{sessionStorage.clear()}catch(t){console.error("Error clearing sessionStorage:",t)}},Je=()=>"#"+Math.floor(Math.random()*16777215).toString(16),Qe=async t=>{try{return await navigator.clipboard.writeText(t),!0}catch(e){return console.error("Error copying to clipboard:",e),!1}},Ge=(t,e,r="text/plain")=>{const n=new Blob([t],{type:r}),o=URL.createObjectURL(n),c=document.createElement("a");c.href=o,c.download=e,document.body.appendChild(c),c.click(),document.body.removeChild(c),URL.revokeObjectURL(o)},Xe=()=>{window.scrollTo({top:0,behavior:"smooth"})},tr=t=>{const e=document.getElementById(t);e&&e.scrollIntoView({behavior:"smooth"})},er=t=>{const e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)},C=()=>{const t=window.innerWidth;return t<768?"mobile":t<1024?"tablet":"desktop"},rr=()=>C()==="mobile",nr=()=>C()==="tablet",or=()=>C()==="desktop";exports.average=ie;exports.calculateAge=it;exports.chunk=Xt;exports.clamp=be;exports.clearLocalStorage=Be;exports.clearSessionStorage=je;exports.copyToClipboard=Qe;exports.count=ce;exports.dateUtils=qt;exports.debounce=Ie;exports.deepClone=w;exports.delay=He;exports.difference=ve;exports.downloadFile=Ge;exports.duplicates=Oe;exports.entries=yt;exports.find=le;exports.findLast=fe;exports.flattenArray=Se;exports.flattenDeep=kt;exports.formatCurrency=Ne;exports.formatDate=P;exports.formatDateKST=V;exports.formatDateKorean=ct;exports.formatDateTimeKorean=lt;exports.formatNumber=Ce;exports.formatTimeKorean=ut;exports.generateRandomColor=Je;exports.getAllKeys=R;exports.getCurrentDate=W;exports.getCurrentDateString=B;exports.getDateDiff=j;exports.getDateRange=nt;exports.getDateRangeForPicker=ot;exports.getDeviceType=C;exports.getLocalStorage=Fe;exports.getMonthEnd=rt;exports.getMonthStart=et;exports.getRelativeTime=Z;exports.getSessionStorage=Ve;exports.getWeekEnd=tt;exports.getWeekStart=X;exports.groupBy=Me;exports.has=Ot;exports.includes=ge;exports.intersection=ye;exports.isArray=we;exports.isBoolean=Ye;exports.isDesktop=or;exports.isEmptyArray=x;exports.isEqual=I;exports.isFunction=ke;exports.isInViewport=er;exports.isMobile=rr;exports.isNotEmptyArray=Qt;exports.isNull=xe;exports.isNullOrUndefined=Ae;exports.isNumber=Te;exports.isObject=_e;exports.isString=$e;exports.isTablet=nr;exports.isThisMonth=G;exports.isThisWeek=Q;exports.isToday=J;exports.isUndefined=Ee;exports.isValidDate=st;exports.keys=gt;exports.lastIndexOf=ue;exports.map=$t;exports.max=oe;exports.merge=z;exports.min=se;exports.objectUtils=Jt;exports.omit=dt;exports.pick=mt;exports.random=Ue;exports.randomChoice=Re;exports.randomFromArray=te;exports.randomInt=ze;exports.randomMultiple=ee;exports.range=De;exports.remove=me;exports.removeAt=de;exports.removeEmptyStrings=vt;exports.removeLocalStorage=We;exports.removeNullValues=pt;exports.removeSessionStorage=Ze;exports.removeWhere=he;exports.round=Le;exports.scrollToElement=tr;exports.scrollToTop=Xe;exports.set=Mt;exports.setLocalStorage=qe;exports.setSessionStorage=Pe;exports.shuffle=Yt;exports.size=Dt;exports.sortBy=ne;exports.sortNumbers=re;exports.sum=ae;exports.throttle=Ke;exports.union=pe;exports.unique=Tt;exports.uniqueBy=Gt;exports.values=ht;
2
+ //# sourceMappingURL=commonUtils-DaFg0y7C.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commonUtils-DaFg0y7C.cjs","sources":["../../node_modules/dayjs/locale/ko.js","../../node_modules/dayjs/plugin/relativeTime.js","../../node_modules/dayjs/plugin/utc.js","../../node_modules/dayjs/plugin/timezone.js","../../src/utils/dateUtils.ts","../../src/utils/objectUtils.ts","../../src/utils/arrayUtils.ts","../../src/utils/commonUtils.ts"],"sourcesContent":["!function(e,_){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=_(require(\"dayjs\")):\"function\"==typeof define&&define.amd?define([\"dayjs\"],_):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_locale_ko=_(e.dayjs)}(this,(function(e){\"use strict\";function _(e){return e&&\"object\"==typeof e&&\"default\"in e?e:{default:e}}var d=_(e),t={name:\"ko\",weekdays:\"일요일_월요일_화요일_수요일_목요일_금요일_토요일\".split(\"_\"),weekdaysShort:\"일_월_화_수_목_금_토\".split(\"_\"),weekdaysMin:\"일_월_화_수_목_금_토\".split(\"_\"),months:\"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월\".split(\"_\"),monthsShort:\"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월\".split(\"_\"),ordinal:function(e){return e+\"일\"},formats:{LT:\"A h:mm\",LTS:\"A h:mm:ss\",L:\"YYYY.MM.DD.\",LL:\"YYYY년 MMMM D일\",LLL:\"YYYY년 MMMM D일 A h:mm\",LLLL:\"YYYY년 MMMM D일 dddd A h:mm\",l:\"YYYY.MM.DD.\",ll:\"YYYY년 MMMM D일\",lll:\"YYYY년 MMMM D일 A h:mm\",llll:\"YYYY년 MMMM D일 dddd A h:mm\"},meridiem:function(e){return e<12?\"오전\":\"오후\"},relativeTime:{future:\"%s 후\",past:\"%s 전\",s:\"몇 초\",m:\"1분\",mm:\"%d분\",h:\"한 시간\",hh:\"%d시간\",d:\"하루\",dd:\"%d일\",M:\"한 달\",MM:\"%d달\",y:\"일 년\",yy:\"%d년\"}};return d.default.locale(t,null,!0),t}));","!function(r,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(r=\"undefined\"!=typeof globalThis?globalThis:r||self).dayjs_plugin_relativeTime=e()}(this,(function(){\"use strict\";return function(r,e,t){r=r||{};var n=e.prototype,o={future:\"in %s\",past:\"%s ago\",s:\"a few seconds\",m:\"a minute\",mm:\"%d minutes\",h:\"an hour\",hh:\"%d hours\",d:\"a day\",dd:\"%d days\",M:\"a month\",MM:\"%d months\",y:\"a year\",yy:\"%d years\"};function i(r,e,t,o){return n.fromToBase(r,e,t,o)}t.en.relativeTime=o,n.fromToBase=function(e,n,i,d,u){for(var f,a,s,l=i.$locale().relativeTime||o,h=r.thresholds||[{l:\"s\",r:44,d:\"second\"},{l:\"m\",r:89},{l:\"mm\",r:44,d:\"minute\"},{l:\"h\",r:89},{l:\"hh\",r:21,d:\"hour\"},{l:\"d\",r:35},{l:\"dd\",r:25,d:\"day\"},{l:\"M\",r:45},{l:\"MM\",r:10,d:\"month\"},{l:\"y\",r:17},{l:\"yy\",d:\"year\"}],m=h.length,c=0;c<m;c+=1){var y=h[c];y.d&&(f=d?t(e).diff(i,y.d,!0):i.diff(e,y.d,!0));var p=(r.rounding||Math.round)(Math.abs(f));if(s=f>0,p<=y.r||!y.r){p<=1&&c>0&&(y=h[c-1]);var v=l[y.l];u&&(p=u(\"\"+p)),a=\"string\"==typeof v?v.replace(\"%d\",p):v(p,n,y.l,s);break}}if(n)return a;var M=s?l.future:l.past;return\"function\"==typeof M?M(a):M.replace(\"%s\",a)},n.to=function(r,e){return i(r,e,this,!0)},n.from=function(r,e){return i(r,e,this)};var d=function(r){return r.$u?t.utc():t()};n.toNow=function(r){return this.to(d(this),r)},n.fromNow=function(r){return this.from(d(this),r)}}}));","!function(t,i){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=i():\"function\"==typeof define&&define.amd?define(i):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs_plugin_utc=i()}(this,(function(){\"use strict\";var t=\"minute\",i=/[+-]\\d\\d(?::?\\d\\d)?/g,e=/([+-]|\\d\\d)/g;return function(s,f,n){var u=f.prototype;n.utc=function(t){var i={date:t,utc:!0,args:arguments};return new f(i)},u.utc=function(i){var e=n(this.toDate(),{locale:this.$L,utc:!0});return i?e.add(this.utcOffset(),t):e},u.local=function(){return n(this.toDate(),{locale:this.$L,utc:!1})};var o=u.parse;u.parse=function(t){t.utc&&(this.$u=!0),this.$utils().u(t.$offset)||(this.$offset=t.$offset),o.call(this,t)};var r=u.init;u.init=function(){if(this.$u){var t=this.$d;this.$y=t.getUTCFullYear(),this.$M=t.getUTCMonth(),this.$D=t.getUTCDate(),this.$W=t.getUTCDay(),this.$H=t.getUTCHours(),this.$m=t.getUTCMinutes(),this.$s=t.getUTCSeconds(),this.$ms=t.getUTCMilliseconds()}else r.call(this)};var a=u.utcOffset;u.utcOffset=function(s,f){var n=this.$utils().u;if(n(s))return this.$u?0:n(this.$offset)?a.call(this):this.$offset;if(\"string\"==typeof s&&(s=function(t){void 0===t&&(t=\"\");var s=t.match(i);if(!s)return null;var f=(\"\"+s[0]).match(e)||[\"-\",0,0],n=f[0],u=60*+f[1]+ +f[2];return 0===u?0:\"+\"===n?u:-u}(s),null===s))return this;var u=Math.abs(s)<=16?60*s:s,o=this;if(f)return o.$offset=u,o.$u=0===s,o;if(0!==s){var r=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();(o=this.local().add(u+r,t)).$offset=u,o.$x.$localOffset=r}else o=this.utc();return o};var h=u.format;u.format=function(t){var i=t||(this.$u?\"YYYY-MM-DDTHH:mm:ss[Z]\":\"\");return h.call(this,i)},u.valueOf=function(){var t=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||this.$d.getTimezoneOffset());return this.$d.valueOf()-6e4*t},u.isUTC=function(){return!!this.$u},u.toISOString=function(){return this.toDate().toISOString()},u.toString=function(){return this.toDate().toUTCString()};var l=u.toDate;u.toDate=function(t){return\"s\"===t&&this.$offset?n(this.format(\"YYYY-MM-DD HH:mm:ss:SSS\")).toDate():l.call(this)};var c=u.diff;u.diff=function(t,i,e){if(t&&this.$u===t.$u)return c.call(this,t,i,e);var s=this.local(),f=n(t).local();return c.call(s,f,i,e)}}}));","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs_plugin_timezone=e()}(this,(function(){\"use strict\";var t={year:0,month:1,day:2,hour:3,minute:4,second:5},e={};return function(n,i,o){var r,a=function(t,n,i){void 0===i&&(i={});var o=new Date(t),r=function(t,n){void 0===n&&(n={});var i=n.timeZoneName||\"short\",o=t+\"|\"+i,r=e[o];return r||(r=new Intl.DateTimeFormat(\"en-US\",{hour12:!1,timeZone:t,year:\"numeric\",month:\"2-digit\",day:\"2-digit\",hour:\"2-digit\",minute:\"2-digit\",second:\"2-digit\",timeZoneName:i}),e[o]=r),r}(n,i);return r.formatToParts(o)},u=function(e,n){for(var i=a(e,n),r=[],u=0;u<i.length;u+=1){var f=i[u],s=f.type,m=f.value,c=t[s];c>=0&&(r[c]=parseInt(m,10))}var d=r[3],l=24===d?0:d,h=r[0]+\"-\"+r[1]+\"-\"+r[2]+\" \"+l+\":\"+r[4]+\":\"+r[5]+\":000\",v=+e;return(o.utc(h).valueOf()-(v-=v%1e3))/6e4},f=i.prototype;f.tz=function(t,e){void 0===t&&(t=r);var n,i=this.utcOffset(),a=this.toDate(),u=a.toLocaleString(\"en-US\",{timeZone:t}),f=Math.round((a-new Date(u))/1e3/60),s=15*-Math.round(a.getTimezoneOffset()/15)-f;if(!Number(s))n=this.utcOffset(0,e);else if(n=o(u,{locale:this.$L}).$set(\"millisecond\",this.$ms).utcOffset(s,!0),e){var m=n.utcOffset();n=n.add(i-m,\"minute\")}return n.$x.$timezone=t,n},f.offsetName=function(t){var e=this.$x.$timezone||o.tz.guess(),n=a(this.valueOf(),e,{timeZoneName:t}).find((function(t){return\"timezonename\"===t.type.toLowerCase()}));return n&&n.value};var s=f.startOf;f.startOf=function(t,e){if(!this.$x||!this.$x.$timezone)return s.call(this,t,e);var n=o(this.format(\"YYYY-MM-DD HH:mm:ss:SSS\"),{locale:this.$L});return s.call(n,t,e).tz(this.$x.$timezone,!0)},o.tz=function(t,e,n){var i=n&&e,a=n||e||r,f=u(+o(),a);if(\"string\"!=typeof t)return o(t).tz(a);var s=function(t,e,n){var i=t-60*e*1e3,o=u(i,n);if(e===o)return[i,e];var r=u(i-=60*(o-e)*1e3,n);return o===r?[i,o]:[t-60*Math.min(o,r)*1e3,Math.max(o,r)]}(o.utc(t,i).valueOf(),f,a),m=s[0],c=s[1],d=o(m).utcOffset(c);return d.$x.$timezone=a,d},o.tz.guess=function(){return Intl.DateTimeFormat().resolvedOptions().timeZone},o.tz.setDefault=function(t){r=t}}}));","import dayjs, { Dayjs } from 'dayjs'\r\nimport 'dayjs/locale/ko'\r\nimport relativeTime from 'dayjs/plugin/relativeTime'\r\nimport utc from 'dayjs/plugin/utc'\r\nimport timezone from 'dayjs/plugin/timezone'\r\n\r\n// dayjs 플러그인 설정\r\ndayjs.extend(relativeTime)\r\ndayjs.extend(utc)\r\ndayjs.extend(timezone)\r\ndayjs.locale('ko')\r\n\r\n/**\r\n * 날짜 유틸리티 함수들\r\n */\r\n\r\n// 현재 날짜/시간 가져오기\r\nexport const getCurrentDate = (): Dayjs => dayjs()\r\nexport const getCurrentDateString = (format: string = 'YYYY-MM-DD'): string => dayjs().format(format)\r\n\r\n// 날짜 포맷팅\r\nexport const formatDate = (date: string | Date | Dayjs, format: string = 'YYYY-MM-DD'): string => {\r\n return dayjs(date).format(format)\r\n}\r\n\r\n// 한국 시간대로 포맷팅\r\nexport const formatDateKST = (date: string | Date | Dayjs, format: string = 'YYYY-MM-DD HH:mm:ss'): string => {\r\n return dayjs(date).tz('Asia/Seoul').format(format)\r\n}\r\n\r\n// 상대적 시간 표시 (예: 3분 전, 1시간 전)\r\nexport const getRelativeTime = (date: string | Date | Dayjs): string => {\r\n return dayjs(date).fromNow()\r\n}\r\n\r\n// 날짜 차이 계산\r\nexport const getDateDiff = (date1: string | Date | Dayjs, date2: string | Date | Dayjs, unit: 'day' | 'hour' | 'minute' = 'day'): number => {\r\n return dayjs(date1).diff(dayjs(date2), unit)\r\n}\r\n\r\n// 특정 날짜가 오늘인지 확인\r\nexport const isToday = (date: string | Date | Dayjs): boolean => {\r\n return dayjs(date).isSame(dayjs(), 'day')\r\n}\r\n\r\n// 특정 날짜가 이번 주인지 확인\r\nexport const isThisWeek = (date: string | Date | Dayjs): boolean => {\r\n return dayjs(date).isSame(dayjs(), 'week')\r\n}\r\n\r\n// 특정 날짜가 이번 달인지 확인\r\nexport const isThisMonth = (date: string | Date | Dayjs): boolean => {\r\n return dayjs(date).isSame(dayjs(), 'month')\r\n}\r\n\r\n// 주의 시작일 (월요일)\r\nexport const getWeekStart = (date: string | Date | Dayjs = dayjs()): Dayjs => {\r\n return dayjs(date).startOf('week')\r\n}\r\n\r\n// 주의 마지막일 (일요일)\r\nexport const getWeekEnd = (date: string | Date | Dayjs = dayjs()): Dayjs => {\r\n return dayjs(date).endOf('week')\r\n}\r\n\r\n// 월의 시작일\r\nexport const getMonthStart = (date: string | Date | Dayjs = dayjs()): Dayjs => {\r\n return dayjs(date).startOf('month')\r\n}\r\n\r\n// 월의 마지막일\r\nexport const getMonthEnd = (date: string | Date | Dayjs = dayjs()): Dayjs => {\r\n return dayjs(date).endOf('month')\r\n}\r\n\r\n// 날짜 범위 생성 (시작일부터 종료일까지)\r\nexport const getDateRange = (startDate: string | Date | Dayjs, endDate: string | Date | Dayjs): Dayjs[] => {\r\n const dates: Dayjs[] = []\r\n let current = dayjs(startDate)\r\n const end = dayjs(endDate)\r\n \r\n while (current.isBefore(end) || current.isSame(end, 'day')) {\r\n dates.push(current)\r\n current = current.add(1, 'day')\r\n }\r\n \r\n return dates\r\n}\r\n\r\n// Ant Design DatePicker용 날짜 범위\r\nexport const getDateRangeForPicker = (startDate: string | Date | Dayjs, endDate: string | Date | Dayjs): [Dayjs, Dayjs] => {\r\n return [dayjs(startDate), dayjs(endDate)]\r\n}\r\n\r\n// 날짜 유효성 검사\r\nexport const isValidDate = (date: string | Date | Dayjs): boolean => {\r\n return dayjs(date).isValid()\r\n}\r\n\r\n// 나이 계산\r\nexport const calculateAge = (birthDate: string | Date | Dayjs): number => {\r\n return dayjs().diff(dayjs(birthDate), 'year')\r\n}\r\n\r\n// 주말 여부 확인\r\nexport const isWeekend = (date: string | Date | Dayjs): boolean => {\r\n const day = dayjs(date).day()\r\n return day === 0 || day === 6\r\n}\r\n\r\n// 평일 여부 확인\r\nexport const isWeekday = (date: string | Date | Dayjs): boolean => {\r\n return !isWeekend(date)\r\n}\r\n\r\n// 날짜를 한국어로 표시\r\nexport const formatDateKorean = (date: string | Date | Dayjs): string => {\r\n return dayjs(date).format('YYYY년 MM월 DD일')\r\n}\r\n\r\n// 시간을 한국어로 표시\r\nexport const formatTimeKorean = (date: string | Date | Dayjs): string => {\r\n return dayjs(date).format('HH시 mm분')\r\n}\r\n\r\n// 날짜와 시간을 한국어로 표시\r\nexport const formatDateTimeKorean = (date: string | Date | Dayjs): string => {\r\n return dayjs(date).format('YYYY년 MM월 DD일 HH시 mm분')\r\n} ","/**\r\n * 객체 유틸리티 함수들\r\n */\r\n\r\n// 객체가 비어있는지 확인\r\nexport const isEmptyObject = (obj: object): boolean => {\r\n return Object.keys(obj).length === 0;\r\n};\r\n\r\n// 객체가 비어있지 않은지 확인\r\nexport const isNotEmptyObject = (obj: object): boolean => {\r\n return !isEmptyObject(obj);\r\n};\r\n\r\n// 객체의 깊은 복사\r\nexport const deepClone = <T>(obj: T): T => {\r\n if (obj === null || typeof obj !== 'object') return obj;\r\n if (obj instanceof Date) return new Date(obj.getTime()) as T;\r\n if (obj instanceof Array) return obj.map(item => deepClone(item)) as T;\r\n if (typeof obj === 'object') {\r\n const clonedObj = {} as T;\r\n for (const key in obj) {\r\n if (obj.hasOwnProperty(key)) {\r\n clonedObj[key] = deepClone(obj[key]);\r\n }\r\n }\r\n return clonedObj;\r\n }\r\n return obj;\r\n};\r\n\r\n// 객체에서 특정 키들만 선택\r\nexport const pick = <T extends object, K extends keyof T>(\r\n obj: T,\r\n keys: K[]\r\n): Pick<T, K> => {\r\n const result = {} as Pick<T, K>;\r\n keys.forEach(key => {\r\n if (key in obj) {\r\n result[key] = obj[key];\r\n }\r\n });\r\n return result;\r\n};\r\n\r\n// 객체에서 특정 키들 제외\r\nexport const omit = <T extends object, K extends keyof T>(\r\n obj: T,\r\n keys: K[]\r\n): Omit<T, K> => {\r\n const result = { ...obj } as Omit<T, K>;\r\n keys.forEach(key => {\r\n delete (result as any)[key];\r\n });\r\n return result;\r\n};\r\n\r\n// 객체의 모든 값 가져오기\r\nexport const values = <T extends object>(obj: T): T[keyof T][] => {\r\n return Object.values(obj);\r\n};\r\n\r\n// 객체의 모든 키 가져오기\r\nexport const keys = <T extends object>(obj: T): (keyof T)[] => {\r\n return Object.keys(obj) as (keyof T)[];\r\n};\r\n\r\n// 객체의 모든 키-값 쌍 가져오기\r\nexport const entries = <T extends object>(obj: T): [keyof T, T[keyof T]][] => {\r\n return Object.entries(obj) as [keyof T, T[keyof T]][];\r\n};\r\n\r\n// 객체 병합 (깊은 병합)\r\nexport const merge = <T extends object>(\r\n target: T,\r\n ...sources: Partial<T>[]\r\n): T => {\r\n const result = deepClone(target);\r\n\r\n sources.forEach(source => {\r\n if (source) {\r\n Object.keys(source).forEach(key => {\r\n const targetKey = key as keyof T;\r\n const sourceValue = source[targetKey];\r\n const targetValue = result[targetKey];\r\n\r\n if (\r\n sourceValue &&\r\n typeof sourceValue === 'object' &&\r\n !Array.isArray(sourceValue) &&\r\n targetValue &&\r\n typeof targetValue === 'object' &&\r\n !Array.isArray(targetValue)\r\n ) {\r\n result[targetKey] = merge(targetValue, sourceValue);\r\n } else {\r\n result[targetKey] = sourceValue;\r\n }\r\n });\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\n// 객체에서 null/undefined 값 제거\r\nexport const removeNullValues = <T extends object>(obj: T): Partial<T> => {\r\n const result = {} as Partial<T>;\r\n\r\n Object.keys(obj).forEach(key => {\r\n const value = obj[key as keyof T];\r\n if (value !== null && value !== undefined) {\r\n result[key as keyof T] = value;\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\n// 객체에서 빈 문자열 제거\r\nexport const removeEmptyStrings = <T extends object>(obj: T): Partial<T> => {\r\n const result = {} as Partial<T>;\r\n\r\n Object.keys(obj).forEach(key => {\r\n const value = obj[key as keyof T];\r\n if (value !== '') {\r\n result[key as keyof T] = value;\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\n// 객체를 쿼리 문자열로 변환\r\nexport const toQueryString = (obj: Record<string, any>): string => {\r\n const params = new URLSearchParams();\r\n\r\n Object.keys(obj).forEach(key => {\r\n const value = obj[key];\r\n if (value !== null && value !== undefined) {\r\n params.append(key, String(value));\r\n }\r\n });\r\n\r\n return params.toString();\r\n};\r\n\r\n// 쿼리 문자열을 객체로 변환\r\nexport const fromQueryString = (\r\n queryString: string\r\n): Record<string, string> => {\r\n const params = new URLSearchParams(queryString);\r\n const result: Record<string, string> = {};\r\n\r\n params.forEach((value, key) => {\r\n result[key] = value;\r\n });\r\n\r\n return result;\r\n};\r\n\r\n// 객체의 중첩된 속성 값 가져오기\r\nexport const get = <T>(\r\n obj: any,\r\n path: string,\r\n defaultValue?: T\r\n): T | undefined => {\r\n const keys = path.split('.');\r\n let result = obj;\r\n\r\n for (const key of keys) {\r\n if (result === null || result === undefined) {\r\n return defaultValue;\r\n }\r\n result = result[key];\r\n }\r\n\r\n return result !== undefined ? result : defaultValue;\r\n};\r\n\r\n// 객체의 중첩된 속성 값 설정\r\nexport const set = <T extends object>(obj: T, path: string, value: any): T => {\r\n const keys = path.split('.');\r\n const result = deepClone(obj);\r\n let current = result;\r\n\r\n for (let i = 0; i < keys.length - 1; i++) {\r\n const key = keys[i];\r\n if (!(key in current) || typeof current[key] !== 'object') {\r\n current[key] = {};\r\n }\r\n current = current[key];\r\n }\r\n\r\n current[keys[keys.length - 1]] = value;\r\n return result;\r\n};\r\n\r\n// 객체의 모든 중첩된 키들 가져오기\r\nexport const getAllKeys = (obj: any, prefix = ''): string[] => {\r\n const keys: string[] = [];\r\n\r\n for (const key in obj) {\r\n if (obj.hasOwnProperty(key)) {\r\n const newKey = prefix ? `${prefix}.${key}` : key;\r\n keys.push(newKey);\r\n\r\n if (\r\n obj[key] &&\r\n typeof obj[key] === 'object' &&\r\n !Array.isArray(obj[key])\r\n ) {\r\n keys.push(...getAllKeys(obj[key], newKey));\r\n }\r\n }\r\n }\r\n\r\n return keys;\r\n};\r\n\r\n// 객체를 플랫하게 만들기\r\nexport const flatten = (obj: any, prefix = ''): Record<string, any> => {\r\n const result: Record<string, any> = {};\r\n\r\n for (const key in obj) {\r\n if (obj.hasOwnProperty(key)) {\r\n const newKey = prefix ? `${prefix}.${key}` : key;\r\n\r\n if (\r\n obj[key] &&\r\n typeof obj[key] === 'object' &&\r\n !Array.isArray(obj[key])\r\n ) {\r\n Object.assign(result, flatten(obj[key], newKey));\r\n } else {\r\n result[newKey] = obj[key];\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n};\r\n\r\n// 객체 비교 (깊은 비교)\r\nexport const isEqual = (obj1: any, obj2: any): boolean => {\r\n if (obj1 === obj2) return true;\r\n if (obj1 == null || obj2 == null) return false;\r\n if (typeof obj1 !== typeof obj2) return false;\r\n\r\n if (typeof obj1 !== 'object') return obj1 === obj2;\r\n\r\n const keys1 = Object.keys(obj1);\r\n const keys2 = Object.keys(obj2);\r\n\r\n if (keys1.length !== keys2.length) return false;\r\n\r\n for (const key of keys1) {\r\n if (!keys2.includes(key)) return false;\r\n if (!isEqual(obj1[key], obj2[key])) return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\n// 객체 크기 (키 개수)\r\nexport const size = (obj: object): number => {\r\n return Object.keys(obj).length;\r\n};\r\n\r\n// 객체가 특정 키를 가지고 있는지 확인\r\nexport const has = (obj: object, key: string): boolean => {\r\n return Object.prototype.hasOwnProperty.call(obj, key);\r\n};\r\n\r\n// 객체의 모든 값이 조건을 만족하는지 확인\r\nexport const every = <T extends object>(\r\n obj: T,\r\n predicate: (value: T[keyof T], key: keyof T) => boolean\r\n): boolean => {\r\n return Object.keys(obj).every(key =>\r\n predicate(obj[key as keyof T], key as keyof T)\r\n );\r\n};\r\n\r\n// 객체의 일부 값이 조건을 만족하는지 확인\r\nexport const some = <T extends object>(\r\n obj: T,\r\n predicate: (value: T[keyof T], key: keyof T) => boolean\r\n): boolean => {\r\n return Object.keys(obj).some(key =>\r\n predicate(obj[key as keyof T], key as keyof T)\r\n );\r\n};\r\n\r\n// 객체를 필터링\r\nexport const filter = <T extends object>(\r\n obj: T,\r\n predicate: (value: T[keyof T], key: keyof T) => boolean\r\n): Partial<T> => {\r\n const result = {} as Partial<T>;\r\n\r\n Object.keys(obj).forEach(key => {\r\n const k = key as keyof T;\r\n if (predicate(obj[k], k)) {\r\n result[k] = obj[k];\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\n// 객체를 매핑\r\nexport const map = <T extends object, U>(\r\n obj: T,\r\n mapper: (value: T[keyof T], key: keyof T) => U\r\n): Record<keyof T, U> => {\r\n const result = {} as Record<keyof T, U>;\r\n\r\n Object.keys(obj).forEach(key => {\r\n const k = key as keyof T;\r\n result[k] = mapper(obj[k], k);\r\n });\r\n\r\n return result;\r\n};\r\n","/**\r\n * 배열 유틸리티 함수들\r\n */\r\n\r\n// 배열이 비어있는지 확인\r\nexport const isEmptyArray = <T>(arr: T[]): boolean => {\r\n return !arr || arr.length === 0\r\n}\r\n\r\n// 배열이 비어있지 않은지 확인\r\nexport const isNotEmptyArray = <T>(arr: T[]): boolean => {\r\n return !isEmptyArray(arr)\r\n}\r\n\r\n// 배열 중복 제거\r\nexport const unique = <T>(arr: T[]): T[] => {\r\n return [...new Set(arr)]\r\n}\r\n\r\n// 객체 배열에서 특정 키로 중복 제거\r\nexport const uniqueBy = <T>(arr: T[], key: keyof T): T[] => {\r\n const seen = new Set()\r\n return arr.filter(item => {\r\n const value = item[key]\r\n if (seen.has(value)) {\r\n return false\r\n }\r\n seen.add(value)\r\n return true\r\n })\r\n}\r\n\r\n// 배열을 청크로 나누기\r\nexport const chunk = <T>(arr: T[], size: number): T[][] => {\r\n const chunks: T[][] = []\r\n for (let i = 0; i < arr.length; i += size) {\r\n chunks.push(arr.slice(i, i + size))\r\n }\r\n return chunks\r\n}\r\n\r\n// 배열 섞기 (Fisher-Yates 알고리즘)\r\nexport const shuffle = <T>(arr: T[]): T[] => {\r\n const shuffled = [...arr]\r\n for (let i = shuffled.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1))\r\n ;[shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]\r\n }\r\n return shuffled\r\n}\r\n\r\n// 배열에서 랜덤 요소 가져오기\r\nexport const randomFromArray = <T>(arr: T[]): T | undefined => {\r\n if (isEmptyArray(arr)) return undefined\r\n return arr[Math.floor(Math.random() * arr.length)]\r\n}\r\n\r\n// 배열에서 여러 개의 랜덤 요소 가져오기\r\nexport const randomMultiple = <T>(arr: T[], count: number): T[] => {\r\n const shuffled = shuffle(arr)\r\n return shuffled.slice(0, Math.min(count, arr.length))\r\n}\r\n\r\n// 배열 정렬 (숫자)\r\nexport const sortNumbers = (arr: number[], ascending: boolean = true): number[] => {\r\n return [...arr].sort((a, b) => ascending ? a - b : b - a)\r\n}\r\n\r\n// 객체 배열을 특정 키로 정렬\r\nexport const sortBy = <T>(arr: T[], key: keyof T, ascending: boolean = true): T[] => {\r\n return [...arr].sort((a, b) => {\r\n const aVal = a[key]\r\n const bVal = b[key]\r\n \r\n if (aVal < bVal) return ascending ? -1 : 1\r\n if (aVal > bVal) return ascending ? 1 : -1\r\n return 0\r\n })\r\n}\r\n\r\n// 배열에서 최대값 찾기\r\nexport const max = (arr: number[]): number | undefined => {\r\n if (isEmptyArray(arr)) return undefined\r\n return Math.max(...arr)\r\n}\r\n\r\n// 배열에서 최소값 찾기\r\nexport const min = (arr: number[]): number | undefined => {\r\n if (isEmptyArray(arr)) return undefined\r\n return Math.min(...arr)\r\n}\r\n\r\n// 배열 평균 계산\r\nexport const average = (arr: number[]): number | undefined => {\r\n if (isEmptyArray(arr)) return undefined\r\n return arr.reduce((sum, num) => sum + num, 0) / arr.length\r\n}\r\n\r\n// 배열 합계 계산\r\nexport const sum = (arr: number[]): number => {\r\n return arr.reduce((sum, num) => sum + num, 0)\r\n}\r\n\r\n// 배열에서 특정 조건을 만족하는 요소 개수 세기\r\nexport const count = <T>(arr: T[], predicate: (item: T) => boolean): number => {\r\n return arr.filter(predicate).length\r\n}\r\n\r\n// 배열에서 특정 요소의 인덱스 찾기 (마지막)\r\nexport const lastIndexOf = <T>(arr: T[], item: T): number => {\r\n for (let i = arr.length - 1; i >= 0; i--) {\r\n if (arr[i] === item) return i\r\n }\r\n return -1\r\n}\r\n\r\n// 배열에서 특정 조건을 만족하는 첫 번째 요소 찾기\r\nexport const find = <T>(arr: T[], predicate: (item: T) => boolean): T | undefined => {\r\n return arr.find(predicate)\r\n}\r\n\r\n// 배열에서 특정 조건을 만족하는 마지막 요소 찾기\r\nexport const findLast = <T>(arr: T[], predicate: (item: T) => boolean): T | undefined => {\r\n for (let i = arr.length - 1; i >= 0; i--) {\r\n if (predicate(arr[i])) return arr[i]\r\n }\r\n return undefined\r\n}\r\n\r\n// 배열에서 특정 요소 제거\r\nexport const remove = <T>(arr: T[], item: T): T[] => {\r\n return arr.filter(i => i !== item)\r\n}\r\n\r\n// 배열에서 특정 인덱스의 요소 제거\r\nexport const removeAt = <T>(arr: T[], index: number): T[] => {\r\n if (index < 0 || index >= arr.length) return arr\r\n return [...arr.slice(0, index), ...arr.slice(index + 1)]\r\n}\r\n\r\n// 배열에서 특정 조건을 만족하는 요소들 제거\r\nexport const removeWhere = <T>(arr: T[], predicate: (item: T) => boolean): T[] => {\r\n return arr.filter(item => !predicate(item))\r\n}\r\n\r\n// 배열에서 특정 요소가 포함되어 있는지 확인\r\nexport const includes = <T>(arr: T[], item: T): boolean => {\r\n return arr.includes(item)\r\n}\r\n\r\n// 두 배열의 교집합\r\nexport const intersection = <T>(arr1: T[], arr2: T[]): T[] => {\r\n return arr1.filter(item => arr2.includes(item))\r\n}\r\n\r\n// 두 배열의 합집합\r\nexport const union = <T>(arr1: T[], arr2: T[]): T[] => {\r\n return unique([...arr1, ...arr2])\r\n}\r\n\r\n// 두 배열의 차집합\r\nexport const difference = <T>(arr1: T[], arr2: T[]): T[] => {\r\n return arr1.filter(item => !arr2.includes(item))\r\n}\r\n\r\n// 배열을 그룹으로 나누기\r\nexport const groupBy = <T, K extends string | number | symbol>(\r\n arr: T[], \r\n keySelector: (item: T) => K\r\n): Record<K, T[]> => {\r\n return arr.reduce((groups, item) => {\r\n const key = keySelector(item)\r\n if (!groups[key]) {\r\n groups[key] = []\r\n }\r\n groups[key].push(item)\r\n return groups\r\n }, {} as Record<K, T[]>)\r\n}\r\n\r\n// 배열을 플랫하게 만들기 (중첩 배열)\r\nexport const flattenArray = <T>(arr: T[][]): T[] => {\r\n return arr.flat()\r\n}\r\n\r\n// 배열을 깊게 플랫하게 만들기\r\nexport const flattenDeep = (arr: any[]): any[] => {\r\n return arr.reduce((flat: any[], item) => {\r\n return flat.concat(Array.isArray(item) ? flattenDeep(item) : item)\r\n }, [])\r\n}\r\n\r\n// 배열에서 특정 범위의 요소들 가져오기\r\nexport const range = <T>(arr: T[], start: number, end?: number): T[] => {\r\n const endIndex = end ?? arr.length\r\n return arr.slice(start, endIndex)\r\n}\r\n\r\n// 배열을 뒤집기\r\nexport const reverse = <T>(arr: T[]): T[] => {\r\n return [...arr].reverse()\r\n}\r\n\r\n// 배열에서 중복 요소들 찾기\r\nexport const duplicates = <T>(arr: T[]): T[] => {\r\n const seen = new Set<T>()\r\n const duplicates = new Set<T>()\r\n \r\n arr.forEach(item => {\r\n if (seen.has(item)) {\r\n duplicates.add(item)\r\n } else {\r\n seen.add(item)\r\n }\r\n })\r\n \r\n return Array.from(duplicates)\r\n} ","/**\r\n * 일반적인 유틸리티 함수들\r\n */\r\n\r\n// 타입 가드 함수들\r\nexport const isString = (value: any): value is string => typeof value === 'string'\r\nexport const isNumber = (value: any): value is number => typeof value === 'number' && !isNaN(value)\r\nexport const isBoolean = (value: any): value is boolean => typeof value === 'boolean'\r\nexport const isFunction = (value: any): value is Function => typeof value === 'function'\r\nexport const isObject = (value: any): value is object => value !== null && typeof value === 'object'\r\nexport const isArray = (value: any): value is any[] => Array.isArray(value)\r\nexport const isNull = (value: any): value is null => value === null\r\nexport const isUndefined = (value: any): value is undefined => value === undefined\r\nexport const isNullOrUndefined = (value: any): value is null | undefined => value === null || value === undefined\r\n\r\n// 숫자 관련\r\nexport const clamp = (value: number, min: number, max: number): number => {\r\n return Math.min(Math.max(value, min), max)\r\n}\r\n\r\nexport const round = (value: number, decimals: number = 0): number => {\r\n return Math.round(value * Math.pow(10, decimals)) / Math.pow(10, decimals)\r\n}\r\n\r\nexport const formatNumber = (num: number, locale: string = 'ko-KR'): string => {\r\n return new Intl.NumberFormat(locale).format(num)\r\n}\r\n\r\nexport const formatCurrency = (amount: number, currency: string = 'KRW', locale: string = 'ko-KR'): string => {\r\n return new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currency: currency\r\n }).format(amount)\r\n}\r\n\r\nexport const formatPercent = (value: number, decimals: number = 2): string => {\r\n return `${(value * 100).toFixed(decimals)}%`\r\n}\r\n\r\n// 랜덤 관련\r\nexport const random = (min: number, max: number): number => {\r\n return Math.random() * (max - min) + min\r\n}\r\n\r\nexport const randomInt = (min: number, max: number): number => {\r\n return Math.floor(Math.random() * (max - min + 1)) + min\r\n}\r\n\r\nexport const randomChoice = <T>(array: T[]): T | undefined => {\r\n if (array.length === 0) return undefined\r\n return array[Math.floor(Math.random() * array.length)]\r\n}\r\n\r\n// 디바운스 함수\r\nexport const debounce = <T extends (...args: any[]) => any>(\r\n func: T,\r\n delay: number\r\n): ((...args: Parameters<T>) => void) => {\r\n let timeoutId: ReturnType<typeof setTimeout>\r\n \r\n return (...args: Parameters<T>) => {\r\n clearTimeout(timeoutId)\r\n timeoutId = setTimeout(() => func(...args), delay)\r\n }\r\n}\r\n\r\n// 쓰로틀 함수\r\nexport const throttle = <T extends (...args: any[]) => any>(\r\n func: T,\r\n delay: number\r\n): ((...args: Parameters<T>) => void) => {\r\n let lastCall = 0\r\n \r\n return (...args: Parameters<T>) => {\r\n const now = Date.now()\r\n if (now - lastCall >= delay) {\r\n lastCall = now\r\n func(...args)\r\n }\r\n }\r\n}\r\n\r\n// 딜레이 함수\r\nexport const delay = (ms: number): Promise<void> => {\r\n return new Promise(resolve => setTimeout(resolve, ms))\r\n}\r\n\r\n// 로컬 스토리지 관련\r\nexport const setLocalStorage = (key: string, value: any): void => {\r\n try {\r\n localStorage.setItem(key, JSON.stringify(value))\r\n } catch (error) {\r\n console.error('Error saving to localStorage:', error)\r\n }\r\n}\r\n\r\nexport const getLocalStorage = <T>(key: string, defaultValue?: T): T | null => {\r\n try {\r\n const item = localStorage.getItem(key)\r\n return item ? JSON.parse(item) : defaultValue || null\r\n } catch (error) {\r\n console.error('Error reading from localStorage:', error)\r\n return defaultValue || null\r\n }\r\n}\r\n\r\nexport const removeLocalStorage = (key: string): void => {\r\n try {\r\n localStorage.removeItem(key)\r\n } catch (error) {\r\n console.error('Error removing from localStorage:', error)\r\n }\r\n}\r\n\r\nexport const clearLocalStorage = (): void => {\r\n try {\r\n localStorage.clear()\r\n } catch (error) {\r\n console.error('Error clearing localStorage:', error)\r\n }\r\n}\r\n\r\n// 세션 스토리지 관련\r\nexport const setSessionStorage = (key: string, value: any): void => {\r\n try {\r\n sessionStorage.setItem(key, JSON.stringify(value))\r\n } catch (error) {\r\n console.error('Error saving to sessionStorage:', error)\r\n }\r\n}\r\n\r\nexport const getSessionStorage = <T>(key: string, defaultValue?: T): T | null => {\r\n try {\r\n const item = sessionStorage.getItem(key)\r\n return item ? JSON.parse(item) : defaultValue || null\r\n } catch (error) {\r\n console.error('Error reading from sessionStorage:', error)\r\n return defaultValue || null\r\n }\r\n}\r\n\r\nexport const removeSessionStorage = (key: string): void => {\r\n try {\r\n sessionStorage.removeItem(key)\r\n } catch (error) {\r\n console.error('Error removing from sessionStorage:', error)\r\n }\r\n}\r\n\r\nexport const clearSessionStorage = (): void => {\r\n try {\r\n sessionStorage.clear()\r\n } catch (error) {\r\n console.error('Error clearing sessionStorage:', error)\r\n }\r\n}\r\n\r\n// URL 관련\r\nexport const getUrlParams = (): Record<string, string> => {\r\n const params = new URLSearchParams(window.location.search)\r\n const result: Record<string, string> = {}\r\n \r\n params.forEach((value, key) => {\r\n result[key] = value\r\n })\r\n \r\n return result\r\n}\r\n\r\nexport const setUrlParams = (params: Record<string, string>): void => {\r\n const url = new URL(window.location.href)\r\n \r\n Object.keys(params).forEach(key => {\r\n url.searchParams.set(key, params[key])\r\n })\r\n \r\n window.history.pushState({}, '', url.toString())\r\n}\r\n\r\nexport const removeUrlParams = (keys: string[]): void => {\r\n const url = new URL(window.location.href)\r\n \r\n keys.forEach(key => {\r\n url.searchParams.delete(key)\r\n })\r\n \r\n window.history.pushState({}, '', url.toString())\r\n}\r\n\r\n// 파일 관련\r\nexport const formatFileSize = (bytes: number): string => {\r\n if (bytes === 0) return '0 Bytes'\r\n \r\n const k = 1024\r\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB']\r\n const i = Math.floor(Math.log(bytes) / Math.log(k))\r\n \r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]\r\n}\r\n\r\nexport const getFileExtension = (filename: string): string => {\r\n return filename.slice((filename.lastIndexOf('.') - 1 >>> 0) + 2)\r\n}\r\n\r\nexport const isValidFileType = (file: File, allowedTypes: string[]): boolean => {\r\n return allowedTypes.includes(file.type)\r\n}\r\n\r\nexport const isValidFileSize = (file: File, maxSize: number): boolean => {\r\n return file.size <= maxSize\r\n}\r\n\r\n// 색상 관련\r\nexport const hexToRgb = (hex: string): { r: number; g: number; b: number } | null => {\r\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex)\r\n return result ? {\r\n r: parseInt(result[1], 16),\r\n g: parseInt(result[2], 16),\r\n b: parseInt(result[3], 16)\r\n } : null\r\n}\r\n\r\nexport const rgbToHex = (r: number, g: number, b: number): string => {\r\n return '#' + [r, g, b].map(x => {\r\n const hex = x.toString(16)\r\n return hex.length === 1 ? '0' + hex : hex\r\n }).join('')\r\n}\r\n\r\nexport const generateRandomColor = (): string => {\r\n return '#' + Math.floor(Math.random() * 16777215).toString(16)\r\n}\r\n\r\n// 기타 유틸리티\r\nexport const copyToClipboard = async (text: string): Promise<boolean> => {\r\n try {\r\n await navigator.clipboard.writeText(text)\r\n return true\r\n } catch (error) {\r\n console.error('Error copying to clipboard:', error)\r\n return false\r\n }\r\n}\r\n\r\nexport const downloadFile = (data: string, filename: string, type: string = 'text/plain'): void => {\r\n const blob = new Blob([data], { type })\r\n const url = URL.createObjectURL(blob)\r\n const link = document.createElement('a')\r\n link.href = url\r\n link.download = filename\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n URL.revokeObjectURL(url)\r\n}\r\n\r\nexport const scrollToTop = (): void => {\r\n window.scrollTo({ top: 0, behavior: 'smooth' })\r\n}\r\n\r\nexport const scrollToElement = (elementId: string): void => {\r\n const element = document.getElementById(elementId)\r\n if (element) {\r\n element.scrollIntoView({ behavior: 'smooth' })\r\n }\r\n}\r\n\r\nexport const isInViewport = (element: HTMLElement): boolean => {\r\n const rect = element.getBoundingClientRect()\r\n return (\r\n rect.top >= 0 &&\r\n rect.left >= 0 &&\r\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\r\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\r\n )\r\n}\r\n\r\nexport const getDeviceType = (): 'mobile' | 'tablet' | 'desktop' => {\r\n const width = window.innerWidth\r\n if (width < 768) return 'mobile'\r\n if (width < 1024) return 'tablet'\r\n return 'desktop'\r\n}\r\n\r\nexport const isMobile = (): boolean => getDeviceType() === 'mobile'\r\nexport const isTablet = (): boolean => getDeviceType() === 'tablet'\r\nexport const isDesktop = (): boolean => getDeviceType() === 'desktop' "],"names":["e","_","module","require$$0","this","d","t","n","o","i","r","u","f","a","s","l","h","m","c","y","p","v","M","dayjs","relativeTime","utc","timezone","getCurrentDate","getCurrentDateString","format","formatDate","date","formatDateKST","getRelativeTime","getDateDiff","date1","date2","unit","isToday","isThisWeek","isThisMonth","getWeekStart","getWeekEnd","getMonthStart","getMonthEnd","getDateRange","startDate","endDate","dates","current","end","getDateRangeForPicker","isValidDate","calculateAge","birthDate","isWeekend","day","isWeekday","formatDateKorean","formatTimeKorean","formatDateTimeKorean","isEmptyObject","obj","isNotEmptyObject","deepClone","item","clonedObj","key","pick","keys","result","omit","values","entries","merge","target","sources","source","targetKey","sourceValue","targetValue","removeNullValues","value","removeEmptyStrings","toQueryString","params","fromQueryString","queryString","get","path","defaultValue","set","getAllKeys","prefix","newKey","flatten","isEqual","obj1","obj2","keys1","keys2","size","has","every","predicate","some","filter","k","map","mapper","isEmptyArray","arr","isNotEmptyArray","unique","uniqueBy","seen","chunk","chunks","shuffle","shuffled","j","randomFromArray","randomMultiple","count","sortNumbers","ascending","b","sortBy","aVal","bVal","max","min","average","sum","num","lastIndexOf","find","findLast","remove","removeAt","index","removeWhere","includes","intersection","arr1","arr2","union","difference","groupBy","keySelector","groups","flattenArray","flattenDeep","flat","range","start","endIndex","duplicates","isString","isNumber","isBoolean","isFunction","isObject","isArray","isNull","isUndefined","isNullOrUndefined","clamp","round","decimals","formatNumber","locale","formatCurrency","amount","currency","random","randomInt","randomChoice","array","debounce","func","delay","timeoutId","args","throttle","lastCall","now","ms","resolve","setLocalStorage","error","getLocalStorage","removeLocalStorage","clearLocalStorage","setSessionStorage","getSessionStorage","removeSessionStorage","clearSessionStorage","generateRandomColor","copyToClipboard","text","downloadFile","data","filename","type","blob","url","link","scrollToTop","scrollToElement","elementId","element","isInViewport","rect","getDeviceType","width","isMobile","isTablet","isDesktop"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}
@@ -0,0 +1,3 @@
1
+ "use strict";const M=require("zustand"),l=require("./serviceConfig-Cc8jfw_Y.cjs"),b=require("./envUtils-CduTHoHu.cjs"),u=require("antd"),T=M.create((r,a)=>({favorites:[],isLoading:!1,error:null,fetchFavorites:async({crprCd:e,userId:t})=>{console.log("즐겨찾기 메뉴 요청:",{crprCd:e,userId:t}),r({isLoading:!0,error:null});try{const o=await l.callService(l.getServiceCode("AUTH_BMRK"),{crprCd:e,userId:t});let n=[];if(o?.favorites&&Array.isArray(o.favorites)?n=o.favorites:Array.isArray(o)?n=o:(console.warn("즐겨찾기 데이터가 비어있거나 예상과 다른 구조입니다."),n=[]),console.log("즐겨찾기 메뉴 로드 완료:",n),b.isLocal&&n.length===0){const s=[{crprCd:"100",menuGbCd:"CMPRGRP",menuPrntId:"FAV001",menuId:"FAV_TEST001",menuNm:"API 테스트",scrnId:"TEST001",menuNo:1,scrnPath:"/dev/ApiTest",menuLvl:3,rootMenu:"FAV001",addedAt:new Date().toISOString(),userId:t},{crprCd:"100",menuGbCd:"CMPRGRP",menuPrntId:"FAV001",menuId:"FAV_TEST002",menuNm:"프로젝트 개요",scrnId:"DOCS001",menuNo:2,scrnPath:"/docs/ProjectOverview",menuLvl:3,rootMenu:"FAV001",addedAt:new Date().toISOString(),userId:t}];r({favorites:s,isLoading:!1,error:null}),console.log("개발 모드: 테스트용 즐겨찾기 데이터 추가")}else r({favorites:n,isLoading:!1,error:null})}catch(o){console.error("즐겨찾기 메뉴 로드 실패:",o),r({error:o instanceof Error?o.message:"즐겨찾기 로드 실패",isLoading:!1})}},addFavorite:async(e,t)=>{const{favorites:o}=a();if(o.some(n=>n.menuId===e.menuId)){console.log("이미 즐겨찾기에 추가된 메뉴입니다:",e.menuNm);return}try{await l.callService(l.getServiceCode("AUTH_BMRK"),{action:"add",crprCd:e.crprCd,userId:t,menuId:e.menuId,menuNm:e.menuNm,scrnPath:e.scrnPath});const n={...e,addedAt:new Date().toISOString(),userId:t};r({favorites:[...o,n]}),console.log("즐겨찾기 추가 완료:",e.menuNm)}catch(n){throw console.error("즐겨찾기 추가 실패:",n),n}},removeFavorite:async(e,t)=>{const{favorites:o}=a();try{await l.callService(l.getServiceCode("AUTH_BMRK"),{action:"remove",crprCd:"100",userId:t,menuId:e});const n=o.filter(s=>s.menuId!==e);r({favorites:n}),console.log("즐겨찾기 제거 완료:",e)}catch(n){throw console.error("즐겨찾기 제거 실패:",n),n}},isFavorite:e=>{const{favorites:t}=a();return t.some(o=>o.menuId===e)},clearFavorites:()=>{r({favorites:[],isLoading:!1,error:null})}})),v={DEFAULT_PRNT_GBCD:1},F=r=>r&&typeof r=="object"&&typeof r.menuId=="string"&&typeof r.menuNm=="string"&&typeof r.crprCd=="string",g=r=>Array.isArray(r)&&r.every(F);let f=[],I=[];const h=r=>{if(r&&typeof r=="object"){const a=r;if(a.menus&&g(a.menus))return a.menus;if(g(r))return r}return console.warn("⚠️ 메뉴 응답이 비어있거나 예상과 다릅니다."),[]},A=(r,a)=>!!a&&r.crprCd===a.crprCd&&r.userId===a.userId&&(r.prntGbcd??v.DEFAULT_PRNT_GBCD)===(a.prntGbcd??v.DEFAULT_PRNT_GBCD),y=r=>{if(f.length===r.length&&f.every((n,s)=>n.menuId===r[s]?.menuId&&n.menuPrntId===r[s]?.menuPrntId))return I;if(!r.length)return[];const a=new Map,e=[];r.forEach(n=>n?.menuId&&a.set(n.menuId,{...n,children:[]})),r.forEach(n=>{const s=a.get(n.menuId);s&&(n.menuPrntId&&n.menuPrntId!==""&&n.menuPrntId!=="-"?a.get(n.menuPrntId)?.children?.push(s):e.push(s))});const t=n=>n.sort((s,c)=>(s?.menuNo??0)-(c?.menuNo??0)).map(s=>({...s,children:s.children&&s.children.length?t(s.children):void 0})),o=t(e);return f=[...r],I=o,o},P=M.create((r,a)=>({menuList:[],flatMenuList:[],isLoading:!1,error:null,_lastFetchParams:null,fetchMenu:async({crprCd:e,userId:t,prntGbcd:o})=>{const n={crprCd:e,userId:t,prntGbcd:o??v.DEFAULT_PRNT_GBCD};if(A(n,a()._lastFetchParams)){console.log("✅ 중복 fetch 차단",n);return}r({isLoading:!0,error:null,_lastFetchParams:n});try{const s=await l.callService(l.getServiceCode("AUTH_MENU"),n),c=h(s),i=y(c);r({flatMenuList:c,menuList:i,isLoading:!1,error:null})}catch(s){r({isLoading:!1,error:s?.message??"메뉴 로드 실패"})}},clearMenu:()=>{r({menuList:[],flatMenuList:[],error:null,_lastFetchParams:null})},findMenuById:e=>{const{flatMenuList:t}=a();return t.find(o=>o.menuId===e)??null}})),m={MAX_TABS:15},S=M.create((r,a)=>({activeMenuId:null,activeMenuItem:null,tabs:[],sidebarCollapsed:!1,maxTabs:m.MAX_TABS,tabProtectFlag:{},tabParams:{},openTabFromMenu:(e,t)=>{const{tabs:o,activeMenuId:n}=a();if(o.find(c=>c.key===e.menuId))n!==e.menuId?(r({activeMenuId:e.menuId,activeMenuItem:e}),console.log("✅ 기존 탭 활성화 - activeMenuItem:",e),a().setTabParams(e.menuId,t||{}),e?.prsnInfoYn==="Y"&&a().setProtectFlagForKey(e.menuId)):(console.warn("❌ 유효하지 않은 메뉴정보",e.menuId),u.message.warning("유효하지 않은 메뉴정보입니다."));else{if(o.length>m.MAX_TABS){console.warn("❌ 최대 탭 개수를 초과했습니다."),u.message.warning(`최대 ${m.MAX_TABS}개의 탭만 열 수 있습니다.
2
+ 기존 탭을 닫고 다시 시도해주세요.`);return}const c={key:e.menuId,label:e.menuNm,gubun:"M",menuItem:e,closable:!0};r({tabs:[...o,c],activeMenuId:e.menuId,activeMenuItem:e}),a().setTabParams(e.menuId,t||{}),console.log("✅ 새 탭 추가 - activeMenuItem:",e),e?.prsnInfoYn==="Y"&&a().setProtectFlagForKey(e.menuId)}},openTabByMenuId:(e,t)=>{const o=P.getState().findMenuById(e);o?a().openTabFromMenu(o,t):(console.warn("❌ 메뉴 ID를 찾을 수 없음:",e),u.message.warning("메뉴 ID를 찾을 수 없습니다."))},openTabByComponentId:(e,t,o)=>{const{tabs:n,activeMenuId:s}=a(),c=n.find(d=>d.key===e),i={crprCd:"",menuNm:t||e,menuId:e,scrnId:e,scrnPath:e,menuNo:void 0,menuLvl:0,prsnInfoYn:"N",rootMenu:"",iconCd:"",menuGbCd:"",menuPrntId:"",children:[]};if(c)if(s!==i.menuId)r({activeMenuId:i.menuId,activeMenuItem:i}),a().setTabParams(i.menuId,o||{});else{console.warn("❌ 유효하지 않은 메뉴정보",e),u.message.warning("유효하지 않은 메뉴정보입니다.");return}else{const d={key:e,gubun:"C",label:t||e,menuItem:i,closable:!0};r({tabs:[...n,d],activeMenuId:e,activeMenuItem:i}),a().setTabParams(e,o||{})}},closeTab:e=>{const{tabs:t,activeMenuId:o}=a();t.find(c=>c.key===e);const n=t.filter(c=>c.key!==e);let s=o;if(o===e){const c=t.findIndex(i=>i.key===e);s=n.length?n[Math.min(c,n.length-1)]?.key??null:null}r({tabs:n}),s&&a().focusTab(s)},focusTab:e=>{const{tabs:t}=a(),o=t.find(n=>n.key===e);o?o.menuItem.prsnInfoYn==="Y"?(r({activeMenuId:e,activeMenuItem:o.menuItem}),console.log("✅ 탭 포커스 (개인정보) - activeMenuItem:",o.menuItem),a().setProtectFlagForKey(e)):(r({activeMenuId:e,activeMenuItem:o.menuItem}),console.log("✅ 탭 포커스 (일반) - activeMenuItem:",o.menuItem),a().clearProtectFlagForKey(e)):(r({activeMenuId:e,activeMenuItem:null}),console.warn("❌ 탭을 찾을 수 없음:",e))},closeAllTabs:()=>r({tabs:[],activeMenuId:null,activeMenuItem:null}),toggleSidebar:()=>r(e=>({sidebarCollapsed:!e.sidebarCollapsed})),reorderTabs:e=>r(t=>{const o=new Map(t.tabs.map(n=>[n.key,n]));return{tabs:e.map(n=>o.get(n)).filter(Boolean)}}),setProtectFlagForKey:e=>r(t=>({tabProtectFlag:{...t.tabProtectFlag,[e]:!0}})),clearProtectFlagForKey:e=>r(t=>{const o={...t.tabProtectFlag};return delete o[e],{tabProtectFlag:o}}),setTabParams:(e,t)=>r(o=>{const n=o.tabParams[e]||{},s={...t||{}};return Object.keys(n).length===Object.keys(s).length&&Object.keys(s).every(i=>n[i]===s[i])?o:{tabParams:{...o.tabParams,[e]:s}}})}));exports.useFavoriteStore=T;exports.useMenuModelStore=P;exports.useMenuViewStore=S;
3
+ //# sourceMappingURL=menuViewStore-BJak0NMm.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menuViewStore-BJak0NMm.cjs","sources":["../../src/stores/favoriteStore.ts","../../src/stores/menuModelStore.ts","../../src/stores/menuViewStore.ts"],"sourcesContent":["import { create } from \"zustand\";\r\nimport { callService } from \"../utils/apiUtils\";\r\nimport { getServiceCode } from \"../utils/serviceConfig\";\r\nimport type { MenuItem } from \"./menuModelStore\";\r\nimport { isLocal } from \"@/utils\";\r\n\r\n// 즐겨찾기 메뉴 타입 정의\r\nexport interface FavoriteMenuItem extends MenuItem {\r\n addedAt: string; // 즐겨찾기 추가 시간\r\n userId: string; // 사용자 ID\r\n}\r\n\r\n// 즐겨찾기 스토어 타입 정의\r\nexport interface FavoriteStore {\r\n favorites: FavoriteMenuItem[];\r\n isLoading: boolean;\r\n error: string | null;\r\n\r\n // 즐겨찾기 메뉴 가져오기\r\n fetchFavorites: (params: { crprCd: string; userId: string }) => Promise<void>;\r\n\r\n // 즐겨찾기 추가\r\n addFavorite: (menuItem: MenuItem, userId: string) => Promise<void>;\r\n\r\n // 즐겨찾기 제거\r\n removeFavorite: (menuId: string, userId: string) => Promise<void>;\r\n\r\n // 즐겨찾기 여부 확인\r\n isFavorite: (menuId: string) => boolean;\r\n\r\n // 즐겨찾기 초기화\r\n clearFavorites: () => void;\r\n}\r\n\r\n// 즐겨찾기 스토어 생성\r\nexport const useFavoriteStore = create<FavoriteStore>((set, get) => ({\r\n favorites: [],\r\n isLoading: false,\r\n error: null,\r\n\r\n // 즐겨찾기 메뉴 가져오기\r\n fetchFavorites: async ({ crprCd, userId }) => {\r\n console.log(\"즐겨찾기 메뉴 요청:\", { crprCd, userId });\r\n set({ isLoading: true, error: null });\r\n\r\n try {\r\n // 서버에서 즐겨찾기 메뉴 가져오기\r\n const data = await callService(getServiceCode(\"AUTH_BMRK\"), {\r\n crprCd,\r\n userId,\r\n });\r\n\r\n let favoritesList: FavoriteMenuItem[] = [];\r\n\r\n if (data?.favorites && Array.isArray(data.favorites)) {\r\n favoritesList = data.favorites;\r\n } else if (Array.isArray(data)) {\r\n favoritesList = data;\r\n } else {\r\n console.warn(\"즐겨찾기 데이터가 비어있거나 예상과 다른 구조입니다.\");\r\n favoritesList = [];\r\n }\r\n\r\n console.log(\"즐겨찾기 메뉴 로드 완료:\", favoritesList);\r\n\r\n // 개발 모드에서 테스트용 즐겨찾기 데이터 추가\r\n if (isLocal && favoritesList.length === 0) {\r\n const testFavorites: FavoriteMenuItem[] = [\r\n {\r\n crprCd: \"100\",\r\n menuGbCd: \"CMPRGRP\",\r\n menuPrntId: \"FAV001\",\r\n menuId: \"FAV_TEST001\",\r\n menuNm: \"API 테스트\",\r\n scrnId: \"TEST001\",\r\n menuNo: 1,\r\n scrnPath: \"/dev/ApiTest\",\r\n menuLvl: 3,\r\n rootMenu: \"FAV001\",\r\n addedAt: new Date().toISOString(),\r\n userId,\r\n },\r\n {\r\n crprCd: \"100\",\r\n menuGbCd: \"CMPRGRP\",\r\n menuPrntId: \"FAV001\",\r\n menuId: \"FAV_TEST002\",\r\n menuNm: \"프로젝트 개요\",\r\n scrnId: \"DOCS001\",\r\n menuNo: 2,\r\n scrnPath: \"/docs/ProjectOverview\",\r\n menuLvl: 3,\r\n rootMenu: \"FAV001\",\r\n addedAt: new Date().toISOString(),\r\n userId,\r\n },\r\n ];\r\n set({ favorites: testFavorites, isLoading: false, error: null });\r\n console.log(\"개발 모드: 테스트용 즐겨찾기 데이터 추가\");\r\n } else {\r\n set({ favorites: favoritesList, isLoading: false, error: null });\r\n }\r\n } catch (error) {\r\n console.error(\"즐겨찾기 메뉴 로드 실패:\", error);\r\n set({\r\n error: error instanceof Error ? error.message : \"즐겨찾기 로드 실패\",\r\n isLoading: false,\r\n });\r\n }\r\n },\r\n\r\n // 즐겨찾기 추가\r\n addFavorite: async (menuItem: MenuItem, userId: string) => {\r\n const { favorites } = get();\r\n\r\n // 이미 즐겨찾기에 있는지 확인\r\n if (favorites.some((fav) => fav.menuId === menuItem.menuId)) {\r\n console.log(\"이미 즐겨찾기에 추가된 메뉴입니다:\", menuItem.menuNm);\r\n return;\r\n }\r\n\r\n try {\r\n // 서버에 즐겨찾기 추가 요청\r\n await callService(getServiceCode(\"AUTH_BMRK\"), {\r\n action: \"add\",\r\n crprCd: menuItem.crprCd,\r\n userId,\r\n menuId: menuItem.menuId,\r\n menuNm: menuItem.menuNm,\r\n scrnPath: menuItem.scrnPath,\r\n });\r\n\r\n // 로컬 상태 업데이트\r\n const newFavorite: FavoriteMenuItem = {\r\n ...menuItem,\r\n addedAt: new Date().toISOString(),\r\n userId,\r\n };\r\n\r\n set({ favorites: [...favorites, newFavorite] });\r\n console.log(\"즐겨찾기 추가 완료:\", menuItem.menuNm);\r\n } catch (error) {\r\n console.error(\"즐겨찾기 추가 실패:\", error);\r\n throw error;\r\n }\r\n },\r\n\r\n // 즐겨찾기 제거\r\n removeFavorite: async (menuId: string, userId: string) => {\r\n const { favorites } = get();\r\n\r\n try {\r\n // 서버에 즐겨찾기 제거 요청\r\n await callService(getServiceCode(\"AUTH_BMRK\"), {\r\n action: \"remove\",\r\n crprCd: \"100\", // 기본값\r\n userId,\r\n menuId,\r\n });\r\n\r\n // 로컬 상태 업데이트\r\n const updatedFavorites = favorites.filter((fav) => fav.menuId !== menuId);\r\n set({ favorites: updatedFavorites });\r\n console.log(\"즐겨찾기 제거 완료:\", menuId);\r\n } catch (error) {\r\n console.error(\"즐겨찾기 제거 실패:\", error);\r\n throw error;\r\n }\r\n },\r\n\r\n // 즐겨찾기 여부 확인\r\n isFavorite: (menuId: string) => {\r\n const { favorites } = get();\r\n return favorites.some((fav) => fav.menuId === menuId);\r\n },\r\n\r\n // 즐겨찾기 초기화\r\n clearFavorites: () => {\r\n set({ favorites: [], isLoading: false, error: null });\r\n },\r\n}));\r\n","import { create } from \"zustand\";\r\n// 필요에 맞게 경로 조정\r\nimport { callService } from \"@/utils/apiUtils\";\r\nimport { getServiceCode } from \"@/utils/serviceConfig\";\r\n\r\n/* ──── Constants ──── */\r\nconst MENU_CONSTANTS = {\r\n DEFAULT_ACTIVE_MENU: \"1\",\r\n DEFAULT_PRNT_GBCD: 1,\r\n COMPANY_CODE: \"100\",\r\n MENU_PARENT_ROOT: \"-\",\r\n MENU_TYPE: { MAIN: \"CMPRGRM\", SUB: \"CMPRGRS\", PROGRAM: \"CMPRGRP\" } as const,\r\n} as const;\r\n\r\n/* ──── Types (이 파일 전용) ──── */\r\nexport interface MenuItem {\r\n crprCd: string;\r\n menuGbCd: string;\r\n menuPrntId: string;\r\n menuId: string;\r\n menuNm: string;\r\n menuNo?: number;\r\n scrnId?: string;\r\n scrnPath?: string;\r\n prsnInfoYn?: \"Y\" | \"N\";\r\n rootMenu: string;\r\n iconCd?: string;\r\n children?: MenuItem[];\r\n}\r\n\r\nexport type FetchMenuParams = {\r\n crprCd: string;\r\n userId: string;\r\n prntGbcd: number;\r\n};\r\n\r\nexport interface MenuApiResponse {\r\n menus?: MenuItem[];\r\n [k: string]: any;\r\n}\r\n\r\n/* 런타임 타입가드 */\r\nconst isMenuItem = (v: any): v is MenuItem =>\r\n v &&\r\n typeof v === \"object\" &&\r\n typeof v.menuId === \"string\" &&\r\n typeof v.menuNm === \"string\" &&\r\n typeof v.crprCd === \"string\";\r\n\r\nconst isMenuItemArray = (v: any): v is MenuItem[] =>\r\n Array.isArray(v) && v.every(isMenuItem);\r\n\r\n/* ──── State Shape ──── */\r\ntype MenuModelState = {\r\n // 📊 State (상태)\r\n // 계층형 메뉴 트리 구조 (부모-자식 관계)\r\n menuList: MenuItem[];\r\n // 평면화된 메뉴 리스트 (검색/조회용)\r\n flatMenuList: MenuItem[];\r\n // 메뉴 데이터 로딩 상태\r\n isLoading: boolean;\r\n // 에러 메시지\r\n error: string | null;\r\n // 마지막 조회 파라미터 (중복 요청 방지)\r\n _lastFetchParams: FetchMenuParams | null;\r\n\r\n // 🔧 Actions (액션 함수들)\r\n // 서버에서 메뉴 데이터 조회\r\n fetchMenu: (p: FetchMenuParams) => Promise<void>;\r\n // 메뉴 데이터 초기화\r\n clearMenu: () => void;\r\n // 메뉴 ID로 특정 메뉴 찾기\r\n findMenuById: (menuId: string) => MenuItem | null;\r\n};\r\n\r\n/* ──── Local Memoization Cache ──── */\r\nlet _lastFlat: MenuItem[] = [];\r\nlet _cachedTree: MenuItem[] = [];\r\n\r\n/* ──── Helpers ──── */\r\nconst parseMenuResponse = (data: unknown): MenuItem[] => {\r\n if (data && typeof data === \"object\") {\r\n const r = data as MenuApiResponse;\r\n if (r.menus && isMenuItemArray(r.menus)) return r.menus;\r\n if (isMenuItemArray(data)) return data;\r\n }\r\n console.warn(\"⚠️ 메뉴 응답이 비어있거나 예상과 다릅니다.\");\r\n return [];\r\n};\r\n\r\nconst sameParams = (a: FetchMenuParams, b: FetchMenuParams | null) =>\r\n !!b &&\r\n a.crprCd === b.crprCd &&\r\n a.userId === b.userId &&\r\n (a.prntGbcd ?? MENU_CONSTANTS.DEFAULT_PRNT_GBCD) ===\r\n (b.prntGbcd ?? MENU_CONSTANTS.DEFAULT_PRNT_GBCD);\r\n\r\nconst buildHierarchy = (flat: MenuItem[]): MenuItem[] => {\r\n if (\r\n _lastFlat.length === flat.length &&\r\n _lastFlat.every(\r\n (x, i) =>\r\n x.menuId === flat[i]?.menuId && x.menuPrntId === flat[i]?.menuPrntId\r\n )\r\n )\r\n return _cachedTree;\r\n\r\n if (!flat.length) return [];\r\n\r\n const map = new Map<string, MenuItem>();\r\n const roots: MenuItem[] = [];\r\n\r\n flat.forEach((m) => m?.menuId && map.set(m.menuId, { ...m, children: [] }));\r\n flat.forEach((m) => {\r\n const cur = map.get(m.menuId);\r\n if (!cur) return;\r\n if (m.menuPrntId && m.menuPrntId !== \"\" && m.menuPrntId !== \"-\") {\r\n const p = map.get(m.menuPrntId);\r\n p?.children?.push(cur);\r\n } else {\r\n roots.push(cur);\r\n }\r\n });\r\n\r\n const sortRec = (arr: MenuItem[]): MenuItem[] =>\r\n arr\r\n .sort((a, b) => (a?.menuNo ?? 0) - (b?.menuNo ?? 0))\r\n .map((x) => ({\r\n ...x,\r\n children:\r\n x.children && x.children.length ? sortRec(x.children) : undefined,\r\n }));\r\n\r\n const out = sortRec(roots);\r\n _lastFlat = [...flat];\r\n _cachedTree = out;\r\n return out;\r\n};\r\n\r\n/* ──── Store ──── */\r\nexport const useMenuModelStore = create<MenuModelState>((set, get) => ({\r\n // 📊 초기 상태값\r\n menuList: [],\r\n flatMenuList: [],\r\n isLoading: false,\r\n error: null,\r\n _lastFetchParams: null,\r\n\r\n // 🔧 메뉴 모델 조회\r\n // 서버에서 사용자별 메뉴 권한 데이터를 가져와서 트리/플랫 구조로 저장\r\n fetchMenu: async ({ crprCd, userId, prntGbcd }: FetchMenuParams) => {\r\n const p = {\r\n crprCd,\r\n userId,\r\n prntGbcd: prntGbcd ?? MENU_CONSTANTS.DEFAULT_PRNT_GBCD,\r\n };\r\n // 중복 요청 방지\r\n if (sameParams(p, get()._lastFetchParams)) {\r\n console.log(\"✅ 중복 fetch 차단\", p);\r\n return;\r\n }\r\n set({ isLoading: true, error: null, _lastFetchParams: p });\r\n try {\r\n // API 호출하여 메뉴 데이터 가져오기\r\n const data = await callService(getServiceCode(\"AUTH_MENU\"), p);\r\n const flat = parseMenuResponse(data); // 응답 데이터 파싱\r\n const tree = buildHierarchy(flat); // 계층 구조 생성\r\n set({\r\n flatMenuList: flat, // 평면 리스트 저장\r\n menuList: tree, // 트리 구조 저장\r\n isLoading: false,\r\n error: null,\r\n });\r\n } catch (e: any) {\r\n set({ isLoading: false, error: e?.message ?? \"메뉴 로드 실패\" });\r\n }\r\n },\r\n\r\n // 🔧 메뉴 모델 초기화\r\n // 로그아웃 시나 사용자 변경 시 메뉴 모델 클리어\r\n clearMenu: () => {\r\n set({\r\n menuList: [],\r\n flatMenuList: [],\r\n error: null,\r\n _lastFetchParams: null,\r\n });\r\n },\r\n\r\n // 🔧 메뉴 ID로 메뉴 아이템 찾기\r\n // URL 파라미터나 프로그래밍 방식으로 특정 메뉴를 찾을 때 사용\r\n findMenuById: (menuId: string) => {\r\n const { flatMenuList } = get();\r\n return flatMenuList.find((m) => m.menuId === menuId) ?? null;\r\n },\r\n}));\r\n","import { create } from \"zustand\";\r\nimport React from \"react\";\r\nimport { MenuItem, useMenuModelStore } from \"./menuModelStore\";\r\nimport { message } from \"antd\";\r\n\r\n/* ──── Constants (UI 측에도 독립적으로 존재) ──── */\r\nconst MENU_CONSTANTS = {\r\n DEFAULT_ACTIVE_MENU: \"1\",\r\n MAX_TABS: 15,\r\n} as const;\r\n\r\n/* ──── Types (이 파일 전용) ──── */\r\nexport interface TabItem {\r\n key: string; // menuId\r\n label: string; // menuNm\r\n gubun: \"M\" | \"C\"; // menuId or componentPath\r\n menuItem: MenuItem;\r\n\r\n closable: boolean;\r\n}\r\n\r\n/* ──── State Shape ──── */\r\ntype MenuViewState = {\r\n // 📊 UI State (화면 상태)\r\n // 현재 활성화된 메뉴 ID\r\n activeMenuId: string | undefined | null;\r\n // 현재 활성화된 메뉴 정보\r\n activeMenuItem: MenuItem | null;\r\n // 열린 탭 목록\r\n tabs: TabItem[];\r\n // 사이드바 접힘/펼침 상태\r\n sidebarCollapsed: boolean;\r\n // 최대 탭 개수\r\n maxTabs: number;\r\n tabProtectFlag: Record<string, boolean>;\r\n tabParams: Record<string, Record<string, any>>;\r\n\r\n /* 🛠 UI Actions (UI 액션 함수들) */\r\n // 메뉴 아이템으로 탭 추가\r\n openTabFromMenu: (menuItem: MenuItem, params?: Record<string, any>) => void;\r\n // 메뉴 ID로 탭 추가 (URL 파라미터 처리용)\r\n openTabByMenuId: (menuId: string, params?: Record<string, any>) => void;\r\n // 컴포넌트 ID로 탭 추가\r\n openTabByComponentId: (\r\n cpntId: string,\r\n cpntNm?: string,\r\n params?: Record<string, any>\r\n ) => void;\r\n // 활성 탭 변경\r\n focusTab: (tabKey: string) => void;\r\n // 탭 제거\r\n closeTab: (tabKey: string) => void;\r\n // 모든 탭 제거\r\n closeAllTabs: () => void;\r\n // 사이드바 토글\r\n toggleSidebar: () => void;\r\n // 탭 순서 변경\r\n reorderTabs: (keys: string[]) => void;\r\n // 개인정보 포함여부에 따른 탭 잠금 Flag 설정\r\n setProtectFlagForKey: (key: string) => void;\r\n // 개인정보 포함여부에 따른 탭 잠금 해제\r\n clearProtectFlagForKey: (key: string) => void;\r\n setTabParams: (key: string, params: Record<string, any>) => void;\r\n};\r\n\r\n/* ──── Store ──── */\r\nexport const useMenuViewStore = create<MenuViewState>((set, get) => ({\r\n // 📊 초기 상태값\r\n activeMenuId: null,\r\n activeMenuItem: null,\r\n tabs: [],\r\n sidebarCollapsed: false,\r\n maxTabs: MENU_CONSTANTS.MAX_TABS,\r\n tabProtectFlag: {},\r\n tabParams: {},\r\n // 🔧 탭 추가 (메뉴 아이템 객체로)\r\n // 사이드바에서 메뉴 클릭 시 호출되는 메인 함수\r\n openTabFromMenu: (menuItem, params) => {\r\n const { tabs, activeMenuId } = get();\r\n const exists = tabs.find((t) => t.key === menuItem.menuId);\r\n\r\n // 새 탭 생성\r\n if (!exists) {\r\n // 2. 최대 탭 개수 확인\r\n if (tabs.length > MENU_CONSTANTS.MAX_TABS) {\r\n console.warn(\"❌ 최대 탭 개수를 초과했습니다.\");\r\n message.warning(\r\n `최대 ${MENU_CONSTANTS.MAX_TABS}개의 탭만 열 수 있습니다.\\n기존 탭을 닫고 다시 시도해주세요.`\r\n );\r\n return;\r\n }\r\n const newTab: TabItem = {\r\n key: menuItem.menuId,\r\n label: menuItem.menuNm,\r\n gubun: \"M\",\r\n menuItem: menuItem as MenuItem,\r\n closable: true,\r\n };\r\n set({\r\n tabs: [...tabs, newTab], // 탭 목록에 추가\r\n activeMenuId: menuItem.menuId, // 새 탭을 활성화\r\n activeMenuItem: menuItem, // 현재 프로그램으로 설정\r\n });\r\n get().setTabParams(menuItem.menuId, params || {});\r\n console.log(\"✅ 새 탭 추가 - activeMenuItem:\", menuItem);\r\n\r\n // 개인정보 메뉴만 Protect\r\n if (menuItem?.prsnInfoYn === \"Y\") {\r\n get().setProtectFlagForKey(menuItem.menuId);\r\n }\r\n } else if (activeMenuId !== menuItem.menuId) {\r\n // 이미 존재하는 탭이면 활성화만\r\n set({ activeMenuId: menuItem.menuId, activeMenuItem: menuItem });\r\n console.log(\"✅ 기존 탭 활성화 - activeMenuItem:\", menuItem);\r\n get().setTabParams(menuItem.menuId, params || {});\r\n // 개인정보 메뉴만 Protect\r\n if (menuItem?.prsnInfoYn === \"Y\") {\r\n get().setProtectFlagForKey(menuItem.menuId);\r\n }\r\n } else {\r\n console.warn(\"❌ 유효하지 않은 메뉴정보\", menuItem.menuId);\r\n message.warning(\"유효하지 않은 메뉴정보입니다.\");\r\n }\r\n },\r\n // 🔧 탭 추가 (메뉴 ID로)\r\n // URL 파라미터로 메뉴 열기 시 사용 (예: ?menuId=CM000301)\r\n openTabByMenuId: (menuId, params) => {\r\n const target = useMenuModelStore.getState().findMenuById(menuId);\r\n if (!target) {\r\n console.warn(\"❌ 메뉴 ID를 찾을 수 없음:\", menuId);\r\n message.warning(\"메뉴 ID를 찾을 수 없습니다.\");\r\n } else {\r\n get().openTabFromMenu(target, params); // 찾은 메뉴로 탭 추가\r\n }\r\n },\r\n openTabByComponentId: (cpntId, cpntNm, params) => {\r\n const { tabs, activeMenuId } = get();\r\n const exists = tabs.find((t) => t.key === cpntId);\r\n const menuItem = {\r\n crprCd: \"\",\r\n menuNm: cpntNm || cpntId,\r\n menuId: cpntId,\r\n scrnId: cpntId,\r\n scrnPath: cpntId,\r\n menuNo: undefined,\r\n menuLvl: 0,\r\n prsnInfoYn: \"N\" as const,\r\n rootMenu: \"\",\r\n iconCd: \"\",\r\n menuGbCd: \"\",\r\n menuPrntId: \"\",\r\n children: [],\r\n };\r\n // 새 탭 생성\r\n if (!exists) {\r\n const newTab: TabItem = {\r\n key: cpntId,\r\n gubun: \"C\",\r\n label: cpntNm || cpntId,\r\n menuItem,\r\n closable: true,\r\n };\r\n\r\n set({\r\n tabs: [...tabs, newTab], // 탭 목록에 추가\r\n activeMenuId: cpntId, // 새 탭을 활성화\r\n activeMenuItem: menuItem, // 현재 프로그램으로 설정\r\n });\r\n get().setTabParams(cpntId, params || {});\r\n } else if (activeMenuId !== menuItem.menuId) {\r\n // 이미 존재하는 탭이면 활성화만\r\n set({ activeMenuId: menuItem.menuId, activeMenuItem: menuItem });\r\n get().setTabParams(menuItem.menuId, params || {});\r\n } else {\r\n console.warn(\"❌ 유효하지 않은 메뉴정보\", cpntId);\r\n message.warning(\"유효하지 않은 메뉴정보입니다.\");\r\n return;\r\n }\r\n },\r\n // 🔧 탭 제거\r\n // X 버튼 클릭 시 탭을 닫고 관련 상태도 정리\r\n closeTab: (tabKey) => {\r\n const { tabs, activeMenuId } = get();\r\n const removed = tabs.find((t) => t.key === tabKey);\r\n const nextTabs = tabs.filter((t) => t.key !== tabKey);\r\n\r\n // 닫힌 탭이 현재 활성 탭이면 다음 탭으로 이동\r\n let nextActive = activeMenuId;\r\n if (activeMenuId === tabKey) {\r\n const idx = tabs.findIndex((t) => t.key === tabKey);\r\n nextActive = nextTabs.length\r\n ? nextTabs[Math.min(idx, nextTabs.length - 1)]?.key ?? null\r\n : null;\r\n }\r\n\r\n set({\r\n tabs: nextTabs,\r\n });\r\n\r\n if (nextActive) get().focusTab(nextActive);\r\n },\r\n // 🔧 활성 탭 변경\r\n // 탭 헤더 클릭 시 해당 탭으로 전환\r\n focusTab: (tabKey) => {\r\n const { tabs } = get();\r\n const target = tabs.find((t) => t.key === tabKey);\r\n\r\n if (target) {\r\n if (target.menuItem.prsnInfoYn === \"Y\") {\r\n set({\r\n activeMenuId: tabKey,\r\n activeMenuItem: target.menuItem,\r\n });\r\n console.log(\r\n \"✅ 탭 포커스 (개인정보) - activeMenuItem:\",\r\n target.menuItem\r\n );\r\n get().setProtectFlagForKey(tabKey);\r\n } else {\r\n set({\r\n activeMenuId: tabKey,\r\n activeMenuItem: target.menuItem,\r\n });\r\n console.log(\"✅ 탭 포커스 (일반) - activeMenuItem:\", target.menuItem);\r\n get().clearProtectFlagForKey(tabKey);\r\n }\r\n } else {\r\n set({ activeMenuId: tabKey, activeMenuItem: null });\r\n console.warn(\"❌ 탭을 찾을 수 없음:\", tabKey);\r\n }\r\n },\r\n\r\n // 🔧 모든 탭 제거\r\n // 로그아웃이나 전체 초기화 시 사용\r\n closeAllTabs: () =>\r\n set({ tabs: [], activeMenuId: null, activeMenuItem: null }),\r\n\r\n // 🔧 사이드바 토글\r\n // 햄버거 메뉴 클릭 시 사이드바 접기/펼치기\r\n toggleSidebar: () => set((s) => ({ sidebarCollapsed: !s.sidebarCollapsed })),\r\n\r\n // useMenuViewStore.ts\r\n reorderTabs: (keys: string[]) =>\r\n set((state) => {\r\n const map = new Map(state.tabs.map((t) => [t.key, t]));\r\n return { tabs: keys.map((k) => map.get(k)!).filter(Boolean) };\r\n }),\r\n // 개인정보 포함여부에 따른 탭 잠금 Flag 설정\r\n setProtectFlagForKey: (key: string) =>\r\n set((s) => ({\r\n tabProtectFlag: { ...s.tabProtectFlag, [key]: true },\r\n })),\r\n // 개인정보 포함여부에 따른 탭 잠금 해제\r\n clearProtectFlagForKey: (key: string) =>\r\n set((s) => {\r\n const newFlags = { ...s.tabProtectFlag };\r\n delete newFlags[key];\r\n return { tabProtectFlag: newFlags };\r\n }),\r\n setTabParams: (key, params) =>\r\n set((state) => {\r\n const prev = state.tabParams[key] || {};\r\n const next = { ...(params || {}) }; // 새 객체 (불변 보장)\r\n\r\n // shallow equal이면 스킵(불필요 렌더 방지)\r\n const isShallowEqual =\r\n Object.keys(prev).length === Object.keys(next).length &&\r\n Object.keys(next).every((k) => prev[k] === next[k]);\r\n if (isShallowEqual) return state;\r\n\r\n return {\r\n tabParams: { ...state.tabParams, [key]: next },\r\n };\r\n }),\r\n}));\r\n"],"names":["useFavoriteStore","create","set","get","crprCd","userId","data","callService","getServiceCode","favoritesList","isLocal","testFavorites","error","menuItem","favorites","fav","newFavorite","menuId","updatedFavorites","MENU_CONSTANTS","isMenuItem","v","isMenuItemArray","_lastFlat","_cachedTree","parseMenuResponse","r","sameParams","a","b","buildHierarchy","flat","x","i","map","roots","m","cur","sortRec","arr","out","useMenuModelStore","prntGbcd","p","tree","e","flatMenuList","useMenuViewStore","params","tabs","activeMenuId","t","message","newTab","target","cpntId","cpntNm","exists","tabKey","nextTabs","nextActive","idx","s","keys","state","k","key","newFlags","prev","next"],"mappings":"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"}