@bwg-ui/core 1.1.10 → 1.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/BwgLargeUploader-CgrJUwFW.cjs +3 -0
- package/dist/chunks/BwgLargeUploader-CgrJUwFW.cjs.map +1 -0
- package/dist/chunks/{BwgLargeUploader-B5EtYKUz.js → BwgLargeUploader-Nx2-wiD8.js} +802 -776
- package/dist/chunks/BwgLargeUploader-Nx2-wiD8.js.map +1 -0
- package/dist/chunks/{FileUtils-CaU9Bzu2.js → FileUtils-Bbz3AvQn.js} +2 -2
- package/dist/chunks/{FileUtils-CaU9Bzu2.js.map → FileUtils-Bbz3AvQn.js.map} +1 -1
- package/dist/chunks/FileUtils-D73GVmB8.cjs +2 -0
- package/dist/chunks/{FileUtils-BweAWoJt.cjs.map → FileUtils-D73GVmB8.cjs.map} +1 -1
- package/dist/chunks/SSOHandler-CZHPiuEh.js +25397 -0
- package/dist/chunks/SSOHandler-CZHPiuEh.js.map +1 -0
- package/dist/chunks/SSOHandler-rq0OGrpX.cjs +236 -0
- package/dist/chunks/SSOHandler-rq0OGrpX.cjs.map +1 -0
- package/dist/chunks/{SearchBoxContext-CY4tAQcg.js → SearchBoxContext-BxtHF9BO.js} +2 -2
- package/dist/chunks/{SearchBoxContext-CY4tAQcg.js.map → SearchBoxContext-BxtHF9BO.js.map} +1 -1
- package/dist/chunks/SearchBoxContext-Cpr9xa1S.cjs +2 -0
- package/dist/chunks/{SearchBoxContext-DDBY44Wr.cjs.map → SearchBoxContext-Cpr9xa1S.cjs.map} +1 -1
- package/dist/chunks/TabContainer-B7-6AQXV.js +254 -0
- package/dist/chunks/TabContainer-B7-6AQXV.js.map +1 -0
- package/dist/chunks/TabContainer-Dx2PVShz.cjs +36 -0
- package/dist/chunks/TabContainer-Dx2PVShz.cjs.map +1 -0
- package/dist/chunks/_commonjsHelpers-DKOUU3wS.cjs +2 -0
- package/dist/chunks/_commonjsHelpers-DKOUU3wS.cjs.map +1 -0
- package/dist/chunks/_commonjsHelpers-DaMA6jEr.js +9 -0
- package/dist/chunks/_commonjsHelpers-DaMA6jEr.js.map +1 -0
- package/dist/chunks/apiUtils-C45AWfu-.js +957 -0
- package/dist/chunks/apiUtils-C45AWfu-.js.map +1 -0
- package/dist/chunks/apiUtils-Cbg6NQLv.cjs +4 -0
- package/dist/chunks/apiUtils-Cbg6NQLv.cjs.map +1 -0
- package/dist/chunks/codeStore-BGLhSpAM.cjs +2 -0
- package/dist/chunks/{codeStore-KPL92rcv.cjs.map → codeStore-BGLhSpAM.cjs.map} +1 -1
- package/dist/chunks/{codeStore-IIp25egq.js → codeStore-BzT5wSd9.js} +2 -2
- package/dist/chunks/{codeStore-IIp25egq.js.map → codeStore-BzT5wSd9.js.map} +1 -1
- package/dist/chunks/commonUtils-BH6QwGUb.cjs +2 -0
- package/dist/chunks/commonUtils-BH6QwGUb.cjs.map +1 -0
- package/dist/chunks/{commonUtils-Cvx6_eK2.js → commonUtils-Bb16Yqjk.js} +24 -25
- package/dist/chunks/commonUtils-Bb16Yqjk.js.map +1 -0
- package/dist/chunks/envUtils-C9Gf5aek.js.map +1 -1
- package/dist/chunks/envUtils-CduTHoHu.cjs.map +1 -1
- package/dist/chunks/favoriteStore-3YceyayF.cjs +2 -0
- package/dist/chunks/favoriteStore-3YceyayF.cjs.map +1 -0
- package/dist/chunks/favoriteStore-C9utQ6sm.js +112 -0
- package/dist/chunks/favoriteStore-C9utQ6sm.js.map +1 -0
- package/dist/chunks/{popupStore-D8RI04bU.js → popupStore-DmFbkkjd.js} +19 -18
- package/dist/chunks/popupStore-DmFbkkjd.js.map +1 -0
- package/dist/chunks/popupStore-DnWLaQ70.cjs +2 -0
- package/dist/chunks/popupStore-DnWLaQ70.cjs.map +1 -0
- package/dist/chunks/usePopup-C8FrbrDD.cjs +2 -0
- package/dist/chunks/{UtilsContext-JSHHfnWl.js.map → usePopup-C8FrbrDD.cjs.map} +1 -1
- package/dist/chunks/{UtilsContext-JSHHfnWl.js → usePopup-pfh-ajfP.js} +82 -82
- package/dist/chunks/usePopup-pfh-ajfP.js.map +1 -0
- package/dist/components/common/BwgDetail.d.ts +5 -0
- package/dist/components/common/BwgDetail.d.ts.map +1 -0
- package/dist/components/common/BwgDrawer.d.ts.map +1 -1
- package/dist/components/common/BwgEditor.d.ts +7 -0
- package/dist/components/common/BwgEditor.d.ts.map +1 -0
- package/dist/components/common/BwgView.d.ts.map +1 -1
- package/dist/components/common/index.cjs +1 -1
- package/dist/components/common/index.d.ts +3 -1
- package/dist/components/common/index.d.ts.map +1 -1
- package/dist/components/common/index.js +27 -25
- package/dist/components/core/BwgDatePicker.d.ts +1 -1
- package/dist/components/core/BwgDatePicker.d.ts.map +1 -1
- package/dist/components/core/BwgRangePicker.d.ts +1 -1
- package/dist/components/core/BwgRangePicker.d.ts.map +1 -1
- package/dist/components/core/BwgUploader.d.ts.map +1 -1
- package/dist/components/core/index.cjs +1 -1
- package/dist/components/core/index.js +1 -1
- package/dist/components/layout/ErrorBound.d.ts +29 -0
- package/dist/components/layout/ErrorBound.d.ts.map +1 -0
- package/dist/components/layout/TabContainer.d.ts +9 -0
- package/dist/components/layout/TabContainer.d.ts.map +1 -0
- package/dist/components/layout/index.cjs +1 -1
- package/dist/components/layout/index.d.ts +3 -1
- package/dist/components/layout/index.d.ts.map +1 -1
- package/dist/components/layout/index.js +6 -4
- package/dist/index.cjs +1 -1
- package/dist/index.js +304 -299
- package/dist/provider/index.cjs +1 -1
- package/dist/provider/index.js +2 -2
- package/dist/stores/favoriteStore.d.ts.map +1 -1
- package/dist/stores/index.cjs +1 -1
- package/dist/stores/index.cjs.map +1 -1
- package/dist/stores/index.d.ts +3 -1
- package/dist/stores/index.d.ts.map +1 -1
- package/dist/stores/index.js +18 -16
- package/dist/stores/index.js.map +1 -1
- package/dist/stores/loadingStore.d.ts +9 -0
- package/dist/stores/loadingStore.d.ts.map +1 -0
- package/dist/stores/menuViewStore.d.ts +28 -3
- package/dist/stores/menuViewStore.d.ts.map +1 -1
- package/dist/stores/popupStore.d.ts.map +1 -1
- package/dist/styles/assets/images/header/icon/ico-bell.svg +3 -3
- package/dist/styles/assets/images/header/icon/ico-logout.svg +10 -10
- package/dist/styles/assets/images/header/icon/ico-setting.svg +4 -4
- package/dist/styles/assets/images/header/icon/ico-sidebar-arrow.svg +3 -3
- package/dist/utils/apiUtils.d.ts +3 -2
- package/dist/utils/apiUtils.d.ts.map +1 -1
- package/dist/utils/index.cjs +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -3
- package/dist/utils/notificationUtils.d.ts +0 -1
- package/dist/utils/notificationUtils.d.ts.map +1 -1
- package/package.json +6 -7
- package/dist/chunks/BwgLargeUploader-B5EtYKUz.js.map +0 -1
- package/dist/chunks/BwgLargeUploader-BPJcShgF.cjs +0 -3
- package/dist/chunks/BwgLargeUploader-BPJcShgF.cjs.map +0 -1
- package/dist/chunks/FileUtils-BweAWoJt.cjs +0 -2
- package/dist/chunks/PublicLayout-3v46YZdi.cjs +0 -36
- package/dist/chunks/PublicLayout-3v46YZdi.cjs.map +0 -1
- package/dist/chunks/PublicLayout-B4wGo0ut.js +0 -139
- package/dist/chunks/PublicLayout-B4wGo0ut.js.map +0 -1
- package/dist/chunks/SSOHandler-C72Do3RD.js +0 -15717
- package/dist/chunks/SSOHandler-C72Do3RD.js.map +0 -1
- package/dist/chunks/SSOHandler-ColywAGZ.cjs +0 -184
- package/dist/chunks/SSOHandler-ColywAGZ.cjs.map +0 -1
- package/dist/chunks/SearchBoxContext-DDBY44Wr.cjs +0 -2
- package/dist/chunks/UtilsContext-C4tlOndT.cjs +0 -2
- package/dist/chunks/UtilsContext-C4tlOndT.cjs.map +0 -1
- package/dist/chunks/_commonjsHelpers-C6fGbg64.js +0 -7
- package/dist/chunks/_commonjsHelpers-C6fGbg64.js.map +0 -1
- package/dist/chunks/_commonjsHelpers-DwGv2jUC.cjs +0 -2
- package/dist/chunks/_commonjsHelpers-DwGv2jUC.cjs.map +0 -1
- package/dist/chunks/codeStore-KPL92rcv.cjs +0 -2
- package/dist/chunks/commonUtils-Cvx6_eK2.js.map +0 -1
- package/dist/chunks/commonUtils-DaFg0y7C.cjs +0 -2
- package/dist/chunks/commonUtils-DaFg0y7C.cjs.map +0 -1
- package/dist/chunks/menuViewStore-DuS0VmkB.cjs +0 -3
- package/dist/chunks/menuViewStore-DuS0VmkB.cjs.map +0 -1
- package/dist/chunks/menuViewStore-OKcSQq-s.js +0 -343
- package/dist/chunks/menuViewStore-OKcSQq-s.js.map +0 -1
- package/dist/chunks/popupStore-BEoWGajT.cjs +0 -2
- package/dist/chunks/popupStore-BEoWGajT.cjs.map +0 -1
- package/dist/chunks/popupStore-D8RI04bU.js.map +0 -1
- package/dist/chunks/serviceConfig-9dHegQIK.cjs +0 -3
- package/dist/chunks/serviceConfig-9dHegQIK.cjs.map +0 -1
- package/dist/chunks/serviceConfig-Dhe7neaj.js +0 -709
- package/dist/chunks/serviceConfig-Dhe7neaj.js.map +0 -1
- package/scripts/gen-component-registry.js +0 -138
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";const a=require("./jsx-runtime-CeSfJrVB.cjs"),c=require("react"),d=require("./serviceConfig-9dHegQIK.cjs"),u={AUTH_BTNS:"SCMSIGN00202",AUTH_MENU:"SCMSIGN00201",SRCH_CODE:"SCMSIGN00301",SRCH_POPU:"SCMPOPU00101",AUTH_BMRK:"SCMBMRK00101"},S=c.createContext(null),x=({children:o,serviceCodes:e={}})=>{c.useEffect(()=>{d.setServiceCodeOverrides(e)},[e]);const i={serviceCodes:e,getServiceCode:r=>{if(e[r]&&e[r].trim()!=="")return console.log(`🔧 Provider 설정 사용: ${r} = ${e[r]}`),e[r];const s=u[r];return console.log(`🔧 기본값 사용: ${r} = ${s}`),s}};return a.jsxRuntimeExports.jsx(S.Provider,{value:i,children:o})},n=()=>{const o=c.useContext(S);if(!o)throw new Error("useServiceCode must be used within a ServiceCodeProvider");return o},g=o=>{const{getServiceCode:e}=n();return e(o)},m=()=>{const{getServiceCode:o}=n(),e={};for(const t of Object.keys(u))e[t]=o(t);return e},f=()=>{const{getServiceCode:o}=n();console.log("🔧 bwg-core 서비스코드 설정:"),console.log("📋 Provider 설정 > 기본값 순서로 확인");for(const e of Object.keys(u)){const t=o(e);console.log(` ${e}: ${t}`)}},l=c.createContext(null),P=({children:o})=>{const e=c.useRef(null),C={searchBoxRef:e,getFormData:()=>e.current?.getFormData()||{},setFormData:v=>{e.current?.setFormData(v)},resetForm:()=>{e.current?.resetForm()},validateForm:async()=>await e.current?.validateForm()||{success:!1,error:null}};return a.jsxRuntimeExports.jsx(l.Provider,{value:C,children:o})},F=()=>{const o=c.useContext(l);if(!o)throw new Error("useSearchBox must be used within a SearchBoxProvider");return o};exports.SearchBoxProvider=P;exports.ServiceCodeProvider=x;exports.useAllServiceCodes=m;exports.useLogServiceCodeConfig=f;exports.useSearchBox=F;exports.useServiceCode=n;exports.useServiceCodeValue=g;
|
|
2
|
-
//# sourceMappingURL=SearchBoxContext-DDBY44Wr.cjs.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";const u=require("react"),b=require("./popupStore-BEoWGajT.cjs"),y=require("./jsx-runtime-CeSfJrVB.cjs"),L=require("./codeStore-KPL92rcv.cjs"),o=require("./commonUtils-DaFg0y7C.cjs"),i=require("./serviceConfig-9dHegQIK.cjs"),x=()=>!1,E=()=>{const{popups:e,activePopupId:r,setActivePopup:s,closePopup:m,openPopup:c}=b.usePopupStore(),l=u.useCallback(async(d,g,C)=>{try{await c(d,g,C)}catch(p){throw console.error("팝업 열기 실패:",p),p}},[c]);return{popups:e,activePopupId:r,setActivePopup:s,closePopup:m,showPopup:l,isPopup:e.length>0}},D=u.createContext(void 0),S=({children:e})=>{const{codeData:r,isLoading:s,error:m,lastUpdated:c,getCodeList:l,getCodeListByOption:d,getCodeName:g,getCodeColor:C,getCodeByOption:p,getAvailableGroupCodes:U,getGridLookup:f,fetchCommonCodes:P}=L.useCodeStore(),v={codeData:r,isLoading:s,error:m,lastUpdated:c,getCodeList:l,getCodeListByOption:d,getCodeName:g,getCodeColor:C,getCodeByOption:p,getAvailableGroupCodes:U,getGridLookup:f,refreshCodes:P};return y.jsxRuntimeExports.jsx(D.Provider,{value:v,children:e})},a=()=>{const e=u.useContext(D);if(e===void 0)throw new Error("useCommonCode must be used within a CommonCodeProvider");return e},A=()=>{const{getCodeList:e,isLoading:r,error:s}=a();return{getCodeList:e,isLoading:r,error:s}},I=()=>{const{getCodeName:e,isLoading:r,error:s}=a();return{getCodeName:e,isLoading:r,error:s}},N=()=>{const{getCodeColor:e,isLoading:r,error:s}=a();return{getCodeColor:e,isLoading:r,error:s}},T=()=>{const{getCodeListByOption:e,isLoading:r,error:s}=a();return{getCodeListByOption:e,isLoading:r,error:s}},G=()=>{const{getGridLookup:e,isLoading:r,error:s}=a();return{getGridLookup:e,isLoading:r,error:s}},k={...o.dateUtils,...i.stringUtils,isEmptyArray:o.isEmptyArray,isNotEmptyArray:o.isNotEmptyArray,unique:o.unique,shuffle:o.shuffle,sortBy:o.sortBy,max:o.max,min:o.min,average:o.average,sum:o.sum,randomFromArray:o.randomFromArray,flattenArray:o.flattenArray,...o.objectUtils,debounce:o.debounce,throttle:o.throttle,setLocalStorage:o.setLocalStorage,getLocalStorage:o.getLocalStorage,formatNumber:o.formatNumber,formatCurrency:o.formatCurrency,copyToClipboard:o.copyToClipboard,isMobile:o.isMobile,isDesktop:o.isDesktop,callService:i.callService,apiGet:i.apiGet,apiPost:i.apiPost,apiPut:i.apiPut,apiDelete:i.apiDelete,apiPatch:i.apiPatch},h=u.createContext(void 0),q=({children:e})=>y.jsxRuntimeExports.jsx(h.Provider,{value:{utils:k},children:e}),n=()=>{const e=u.useContext(h);if(e===void 0)throw new Error("useUtils must be used within a UtilsProvider");return e.utils},t=(e,r,s)=>e&&typeof e[r]=="function"?e[r]:s||(()=>{}),w=()=>{const e=n();return{formatDate:t(e,"formatDate"),formatDateKorean:t(e,"formatDateKorean"),getCurrentDate:t(e,"getCurrentDate"),getCurrentDateString:t(e,"getCurrentDateString"),getRelativeTime:t(e,"getRelativeTime"),isToday:t(e,"isToday"),isThisWeek:t(e,"isThisWeek"),isThisMonth:t(e,"isThisMonth"),getDateDiff:t(e,"getDateDiff"),calculateAge:t(e,"calculateAge")}},B=()=>{const e=n();return{isEmpty:t(e,"isEmpty"),isNotEmpty:t(e,"isNotEmpty"),truncate:t(e,"truncate"),capitalize:t(e,"capitalize"),formatPhoneNumber:t(e,"formatPhoneNumber"),isValidEmail:t(e,"isValidEmail"),removeHtmlTags:t(e,"removeHtmlTags"),generateUID:t(e,"generateUID"),generateShortUID:t(e,"generateShortUID"),generateLongUID:t(e,"generateLongUID"),generateNumericUID:t(e,"generateNumericUID"),generateAlphanumericUID:t(e,"generateAlphanumericUID"),generateGUID:t(e,"generateGUID"),generateGUIDWithoutHyphens:t(e,"generateGUIDWithoutHyphens"),generateTimestampUID:t(e,"generateTimestampUID"),generateCustomUID:t(e,"generateCustomUID"),encryptSha256:t(e,"encryptSha256"),bxmEncrypt:t(e,"bxmEncrypt"),bxmDecrypt:t(e,"bxmDecrypt"),simpleEncrypt:t(e,"simpleEncrypt"),simpleDecrypt:t(e,"simpleDecrypt"),md5Hash:t(e,"md5Hash"),sha256Hash:t(e,"sha256Hash"),base64Encode:t(e,"base64Encode"),base64Decode:t(e,"base64Decode")}},H=()=>{const e=n();return{isEmptyArray:t(e,"isEmptyArray"),isNotEmptyArray:t(e,"isNotEmptyArray"),unique:t(e,"unique"),shuffle:t(e,"shuffle"),sortBy:t(e,"sortBy"),max:t(e,"max"),min:t(e,"min"),average:t(e,"average"),sum:t(e,"sum")}},M=()=>{const e=n();return{debounce:t(e,"debounce"),throttle:t(e,"throttle"),setLocalStorage:t(e,"setLocalStorage"),getLocalStorage:t(e,"getLocalStorage"),formatNumber:t(e,"formatNumber"),formatCurrency:t(e,"formatCurrency"),copyToClipboard:t(e,"copyToClipboard"),isMobile:t(e,"isMobile"),isDesktop:t(e,"isDesktop")}},R=()=>{const e=n();return{callService:t(e,"callService"),apiGet:t(e,"apiGet"),apiPost:t(e,"apiPost"),apiPut:t(e,"apiPut"),apiDelete:t(e,"apiDelete"),apiPatch:t(e,"apiPatch")}};exports.CommonCodeProvider=S;exports.UtilsProvider=q;exports.useApiUtils=R;exports.useArrayUtils=H;exports.useCodeColor=N;exports.useCodeList=A;exports.useCodeListByOption=T;exports.useCodeName=I;exports.useCommonCode=a;exports.useCommonUtils=M;exports.useDateUtils=w;exports.useGridLookup=G;exports.usePopup=E;exports.usePopupContext=x;exports.useStringUtils=B;exports.useUtils=n;
|
|
2
|
-
//# sourceMappingURL=UtilsContext-C4tlOndT.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"UtilsContext-C4tlOndT.cjs","sources":["../../src/provider/hooks/usePopup.ts","../../src/provider/contexts/CommonCodeContext.tsx","../../src/provider/contexts/UtilsContext.tsx"],"sourcesContent":["import { useCallback } from 'react';\r\nimport { usePopupStore, type PopupConfig } from '../../stores/popupStore';\r\n\r\n/**\r\n * 팝업 컨텍스트를 감지하는 훅\r\n * 팝업 내부에서 사용하면 true, 일반 페이지에서는 false 반환\r\n */\r\nexport const usePopupContext = (): boolean => {\r\n // 팝업 내부에서만 true를 반환하도록 수정\r\n // 현재는 팝업이 열려있으면 모든 컴포넌트가 팝업으로 인식되는 문제가 있음\r\n // 임시로 false 반환 (수동으로 isPopup prop 사용 권장)\r\n return false;\r\n};\r\n\r\n/**\r\n * 팝업 데이터와 이벤트를 관리하는 훅\r\n */\r\nexport const usePopup = () => {\r\n const { popups, activePopupId, setActivePopup, closePopup, openPopup } =\r\n usePopupStore();\r\n\r\n // 팝업 열기 함수\r\n const showPopup = useCallback(\r\n async (popupCode: string, popParams?: any, config?: PopupConfig) => {\r\n try {\r\n await openPopup(popupCode, popParams, config);\r\n } catch (error) {\r\n console.error('팝업 열기 실패:', error);\r\n throw error;\r\n }\r\n },\r\n [openPopup]\r\n );\r\n\r\n return {\r\n popups,\r\n activePopupId,\r\n setActivePopup,\r\n closePopup,\r\n showPopup,\r\n isPopup: popups.length > 0,\r\n };\r\n};\r\n","import { useCodeStore, type CommonCodeContextType } from '../../stores/codeStore';\r\nimport { createContext, useContext, ReactNode } from 'react';\r\n\r\n// 공통코드 컨텍스트 생성\r\nconst CommonCodeContext = createContext<CommonCodeContextType | undefined>(\r\n undefined\r\n);\r\n\r\n// 공통코드 컨텍스트 프로바이더 컴포넌트\r\ninterface CommonCodeProviderProps {\r\n children: ReactNode;\r\n}\r\n\r\nexport const CommonCodeProvider: React.FC<CommonCodeProviderProps> = ({\r\n children,\r\n}) => {\r\n const {\r\n codeData,\r\n isLoading,\r\n error,\r\n lastUpdated,\r\n getCodeList,\r\n getCodeListByOption,\r\n getCodeName,\r\n getCodeColor,\r\n getCodeByOption,\r\n getAvailableGroupCodes,\r\n getGridLookup,\r\n fetchCommonCodes,\r\n } = useCodeStore();\r\n\r\n const contextValue: CommonCodeContextType = {\r\n codeData,\r\n isLoading,\r\n error,\r\n lastUpdated,\r\n getCodeList,\r\n getCodeListByOption,\r\n getCodeName,\r\n getCodeColor,\r\n getCodeByOption,\r\n getAvailableGroupCodes,\r\n getGridLookup,\r\n refreshCodes: fetchCommonCodes,\r\n };\r\n\r\n return (\r\n <CommonCodeContext.Provider value={contextValue}>\r\n {children}\r\n </CommonCodeContext.Provider>\r\n );\r\n};\r\n\r\n// 공통코드 컨텍스트 사용 훅\r\nexport const useCommonCode = (): CommonCodeContextType => {\r\n const context = useContext(CommonCodeContext);\r\n if (context === undefined) {\r\n throw new Error('useCommonCode must be used within a CommonCodeProvider');\r\n }\r\n return context;\r\n};\r\n\r\n// 편의 훅들 (Fast Refresh 호환성을 위해 매개변수 없는 함수로 변경)\r\nexport const useCodeList = () => {\r\n const { getCodeList, isLoading, error } = useCommonCode();\r\n return {\r\n getCodeList,\r\n isLoading,\r\n error,\r\n };\r\n};\r\n\r\nexport const useCodeName = () => {\r\n const { getCodeName, isLoading, error } = useCommonCode();\r\n return {\r\n getCodeName,\r\n isLoading,\r\n error,\r\n };\r\n};\r\n\r\nexport const useCodeColor = () => {\r\n const { getCodeColor, isLoading, error } = useCommonCode();\r\n return {\r\n getCodeColor,\r\n isLoading,\r\n error,\r\n };\r\n};\r\n\r\nexport const useCodeListByOption = () => {\r\n const { getCodeListByOption, isLoading, error } = useCommonCode();\r\n return {\r\n getCodeListByOption,\r\n isLoading,\r\n error,\r\n };\r\n};\r\n\r\nexport const useGridLookup = () => {\r\n const { getGridLookup, isLoading, error } = useCommonCode();\r\n return {\r\n getGridLookup,\r\n isLoading,\r\n error,\r\n };\r\n};\r\n","import React, { createContext, useContext } from \"react\";\r\nimport type { ReactNode } from \"react\";\r\nimport * as dateUtils from \"../../utils/dateUtils\";\r\nimport * as stringUtils from \"../../utils/stringUtils\";\r\nimport * as arrayUtils from \"../../utils/arrayUtils\";\r\nimport * as objectUtils from \"../../utils/objectUtils\";\r\nimport * as commonUtils from \"../../utils/commonUtils\";\r\nimport * as apiUtils from \"../../utils/apiUtils\";\r\n\r\n// 모든 유틸리티 함수들을 하나의 객체로 결합 (충돌하는 함수명은 별칭 사용)\r\nconst utils = {\r\n // 날짜 유틸리티\r\n ...dateUtils,\r\n // 문자열 유틸리티\r\n ...stringUtils,\r\n // 배열 유틸리티 (충돌하는 함수명은 별칭 사용)\r\n isEmptyArray: arrayUtils.isEmptyArray,\r\n isNotEmptyArray: arrayUtils.isNotEmptyArray,\r\n unique: arrayUtils.unique,\r\n shuffle: arrayUtils.shuffle,\r\n sortBy: arrayUtils.sortBy,\r\n max: arrayUtils.max,\r\n min: arrayUtils.min,\r\n average: arrayUtils.average,\r\n sum: arrayUtils.sum,\r\n randomFromArray: arrayUtils.randomFromArray,\r\n flattenArray: arrayUtils.flattenArray,\r\n // 객체 유틸리티\r\n ...objectUtils,\r\n // 일반 유틸리티 (충돌하는 함수명은 별칭 사용)\r\n debounce: commonUtils.debounce,\r\n throttle: commonUtils.throttle,\r\n setLocalStorage: commonUtils.setLocalStorage,\r\n getLocalStorage: commonUtils.getLocalStorage,\r\n formatNumber: commonUtils.formatNumber,\r\n formatCurrency: commonUtils.formatCurrency,\r\n copyToClipboard: commonUtils.copyToClipboard,\r\n isMobile: commonUtils.isMobile,\r\n isDesktop: commonUtils.isDesktop,\r\n // API 유틸리티\r\n callService: apiUtils.callService,\r\n apiGet: apiUtils.apiGet,\r\n apiPost: apiUtils.apiPost,\r\n apiPut: apiUtils.apiPut,\r\n apiDelete: apiUtils.apiDelete,\r\n apiPatch: apiUtils.apiPatch,\r\n};\r\n\r\n// Context 타입 정의\r\ninterface UtilsContextType {\r\n utils: typeof utils;\r\n}\r\n\r\n// Context 생성\r\nconst UtilsContext = createContext<UtilsContextType | undefined>(undefined);\r\n\r\n// Provider 컴포넌트\r\ninterface UtilsProviderProps {\r\n children: ReactNode;\r\n}\r\n\r\nexport const UtilsProvider: React.FC<UtilsProviderProps> = ({ children }) => {\r\n return (\r\n <UtilsContext.Provider value={{ utils }}>{children}</UtilsContext.Provider>\r\n );\r\n};\r\n\r\n// Hook for using utils\r\nexport const useUtils = () => {\r\n const context = useContext(UtilsContext);\r\n if (context === undefined) {\r\n throw new Error(\"useUtils must be used within a UtilsProvider\");\r\n }\r\n return context.utils;\r\n};\r\n\r\n// 안전한 함수 가져오기 헬퍼\r\nconst safeGet = (obj: any, key: string, fallback?: any) => {\r\n return obj && typeof obj[key] === \"function\"\r\n ? obj[key]\r\n : fallback || (() => {});\r\n};\r\n\r\n// 개별 유틸리티 훅들 (선택사항)\r\nexport const useDateUtils = () => {\r\n const utils = useUtils();\r\n return {\r\n formatDate: safeGet(utils, \"formatDate\"),\r\n formatDateKorean: safeGet(utils, \"formatDateKorean\"),\r\n getCurrentDate: safeGet(utils, \"getCurrentDate\"),\r\n getCurrentDateString: safeGet(utils, \"getCurrentDateString\"),\r\n getRelativeTime: safeGet(utils, \"getRelativeTime\"),\r\n isToday: safeGet(utils, \"isToday\"),\r\n isThisWeek: safeGet(utils, \"isThisWeek\"),\r\n isThisMonth: safeGet(utils, \"isThisMonth\"),\r\n getDateDiff: safeGet(utils, \"getDateDiff\"),\r\n calculateAge: safeGet(utils, \"calculateAge\"),\r\n };\r\n};\r\n\r\nexport const useStringUtils = () => {\r\n const utils = useUtils();\r\n return {\r\n isEmpty: safeGet(utils, \"isEmpty\"),\r\n isNotEmpty: safeGet(utils, \"isNotEmpty\"),\r\n truncate: safeGet(utils, \"truncate\"),\r\n capitalize: safeGet(utils, \"capitalize\"),\r\n formatPhoneNumber: safeGet(utils, \"formatPhoneNumber\"),\r\n isValidEmail: safeGet(utils, \"isValidEmail\"),\r\n removeHtmlTags: safeGet(utils, \"removeHtmlTags\"),\r\n // UID 생성 함수들\r\n generateUID: safeGet(utils, \"generateUID\"),\r\n generateShortUID: safeGet(utils, \"generateShortUID\"),\r\n generateLongUID: safeGet(utils, \"generateLongUID\"),\r\n generateNumericUID: safeGet(utils, \"generateNumericUID\"),\r\n generateAlphanumericUID: safeGet(utils, \"generateAlphanumericUID\"),\r\n generateGUID: safeGet(utils, \"generateGUID\"),\r\n generateGUIDWithoutHyphens: safeGet(utils, \"generateGUIDWithoutHyphens\"),\r\n generateTimestampUID: safeGet(utils, \"generateTimestampUID\"),\r\n generateCustomUID: safeGet(utils, \"generateCustomUID\"),\r\n // 암호화 관련 함수들\r\n encryptSha256: safeGet(utils, \"encryptSha256\"),\r\n bxmEncrypt: safeGet(utils, \"bxmEncrypt\"),\r\n bxmDecrypt: safeGet(utils, \"bxmDecrypt\"),\r\n simpleEncrypt: safeGet(utils, \"simpleEncrypt\"),\r\n simpleDecrypt: safeGet(utils, \"simpleDecrypt\"),\r\n md5Hash: safeGet(utils, \"md5Hash\"),\r\n sha256Hash: safeGet(utils, \"sha256Hash\"),\r\n base64Encode: safeGet(utils, \"base64Encode\"),\r\n base64Decode: safeGet(utils, \"base64Decode\"),\r\n };\r\n};\r\n\r\nexport const useArrayUtils = () => {\r\n const utils = useUtils();\r\n return {\r\n isEmptyArray: safeGet(utils, \"isEmptyArray\"),\r\n isNotEmptyArray: safeGet(utils, \"isNotEmptyArray\"),\r\n unique: safeGet(utils, \"unique\"),\r\n shuffle: safeGet(utils, \"shuffle\"),\r\n sortBy: safeGet(utils, \"sortBy\"),\r\n max: safeGet(utils, \"max\"),\r\n min: safeGet(utils, \"min\"),\r\n average: safeGet(utils, \"average\"),\r\n sum: safeGet(utils, \"sum\"),\r\n };\r\n};\r\n\r\nexport const useCommonUtils = () => {\r\n const utils = useUtils();\r\n return {\r\n debounce: safeGet(utils, \"debounce\"),\r\n throttle: safeGet(utils, \"throttle\"),\r\n setLocalStorage: safeGet(utils, \"setLocalStorage\"),\r\n getLocalStorage: safeGet(utils, \"getLocalStorage\"),\r\n formatNumber: safeGet(utils, \"formatNumber\"),\r\n formatCurrency: safeGet(utils, \"formatCurrency\"),\r\n copyToClipboard: safeGet(utils, \"copyToClipboard\"),\r\n isMobile: safeGet(utils, \"isMobile\"),\r\n isDesktop: safeGet(utils, \"isDesktop\"),\r\n };\r\n};\r\n\r\nexport const useApiUtils = () => {\r\n const utils = useUtils();\r\n return {\r\n callService: safeGet(utils, \"callService\"),\r\n apiGet: safeGet(utils, \"apiGet\"),\r\n apiPost: safeGet(utils, \"apiPost\"),\r\n apiPut: safeGet(utils, \"apiPut\"),\r\n apiDelete: safeGet(utils, \"apiDelete\"),\r\n apiPatch: safeGet(utils, \"apiPatch\"),\r\n };\r\n};\r\n"],"names":["usePopupContext","usePopup","popups","activePopupId","setActivePopup","closePopup","openPopup","usePopupStore","showPopup","useCallback","popupCode","popParams","config","error","CommonCodeContext","createContext","CommonCodeProvider","children","codeData","isLoading","lastUpdated","getCodeList","getCodeListByOption","getCodeName","getCodeColor","getCodeByOption","getAvailableGroupCodes","getGridLookup","fetchCommonCodes","useCodeStore","contextValue","useCommonCode","context","useContext","useCodeList","useCodeName","useCodeColor","useCodeListByOption","useGridLookup","utils","dateUtils","stringUtils","arrayUtils.isEmptyArray","arrayUtils.isNotEmptyArray","arrayUtils.unique","arrayUtils.shuffle","arrayUtils.sortBy","arrayUtils.max","arrayUtils.min","arrayUtils.average","arrayUtils.sum","arrayUtils.randomFromArray","arrayUtils.flattenArray","objectUtils","commonUtils.debounce","commonUtils.throttle","commonUtils.setLocalStorage","commonUtils.getLocalStorage","commonUtils.formatNumber","commonUtils.formatCurrency","commonUtils.copyToClipboard","commonUtils.isMobile","commonUtils.isDesktop","apiUtils.callService","apiUtils.apiGet","apiUtils.apiPost","apiUtils.apiPut","apiUtils.apiDelete","apiUtils.apiPatch","UtilsContext","UtilsProvider","jsx","useUtils","safeGet","obj","key","fallback","useDateUtils","useStringUtils","useArrayUtils","useCommonUtils","useApiUtils"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_commonjsHelpers-C6fGbg64.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_commonjsHelpers-DwGv2jUC.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";const D=require("zustand"),S=require("./serviceConfig-9dHegQIK.cjs"),O={CACHE_SIZE_LIMIT:1e3},t={codeCache:new Map,nameCache:new Map,optionCache:new Map,colorCache:new Map,loadedGroups:new Set,cacheHits:new Map,clearCache(){this.codeCache.clear(),this.nameCache.clear(),this.optionCache.clear(),this.colorCache.clear(),this.loadedGroups.clear(),this.cacheHits.clear()},cleanupCache(){const s=Array.from(this.cacheHits.entries());s.sort((e,c)=>e[1]-c[1]),s.slice(0,Math.floor(s.length*.3)).forEach(([e])=>{this.codeCache.delete(e),this.nameCache.delete(e),this.optionCache.delete(e),this.colorCache.delete(e),this.cacheHits.delete(e)})},isGroupLoaded(s){return this.loadedGroups.has(s)},markGroupLoaded(s){this.loadedGroups.add(s)}},_=s=>{console.log("대규모 데이터 변환 시작:",s);const p={};if(s&&s.code&&Array.isArray(s.code)){const e=s.code,c=s.opt||[],o=new Map;c.forEach(a=>{a.cmmnCd&&a.enblYn==="Y"&&(o.has(a.cmmnCd)||o.set(a.cmmnCd,[]),o.get(a.cmmnCd).push(a))}),e.forEach(a=>{if(a&&a.cmmnCdGrp&&a.cmmnCd&&a.enblYn==="Y"){const n=a.cmmnCdGrp;p[n]||(p[n]={});const d=(o.get(a.cmmnCd)||[]).reduce((i,l)=>(l.optnCd&&l.optnNm&&(i[l.optnCd]=l.optnNm),i),{});p[n][a.cmmnCd]={codeValue:a.cmmnCd,codeNm:a.cmmnCdNm,groupCode:a.cmmnCdGrp,commonCode:a.cmmnCd,labelColor:a.cmmnCdClr,systemCodeYn:a.syscdYn,sortOrder:parseInt(a.sortOrd)||1,enabled:a.enblYn==="Y",options:Object.keys(d).length>0?d:null,originalData:a}}})}return console.log("대규모 데이터 변환 완료:",p),p},r=D.create()(S.persist((s,p)=>({codeData:null,isLoading:!1,error:null,lastUpdated:null,loadedGroups:new Set,fetchData:async()=>{s({isLoading:!0,error:null});try{console.log("대규모 공통코드 데이터 가져오기 시작: SCMSIGN00301");const e=await S.callService(S.getServiceCode("SRCH_CODE"),{crprCd:"100"});console.log("대규모 공통코드 응답:",e),console.log("대규모 공통코드목록:",e.code),console.log("대규모 공통코드옵션션목록:",e.opt);const c=_(e);t.clearCache();const o=new Set(Object.keys(c));o.forEach(a=>{t.markGroupLoaded(a)}),s({codeData:c,isLoading:!1,error:null,lastUpdated:new Date,loadedGroups:o}),console.log("대규모 공통코드 데이터 가져오기 완료")}catch(e){console.error("대규모 공통코드 데이터 가져오기 실패:",e),s({isLoading:!1,error:e instanceof Error?e.message:"대규모 공통코드 데이터 가져오기 실패"})}},loadSpecificGroup:async e=>{const{codeData:c,loadedGroups:o}=p();if(!c||o.has(e))return;const a=new Set(o).add(e);s({loadedGroups:a}),t.markGroupLoaded(e)},setData:e=>{t.clearCache();const c=new Set(Object.keys(e));c.forEach(o=>{t.markGroupLoaded(o)}),s({codeData:e,lastUpdated:new Date,loadedGroups:c})},clearData:()=>{t.clearCache(),s({codeData:null,isLoading:!1,error:null,lastUpdated:null,loadedGroups:new Set})},getLoadedGroups:()=>Array.from(p().loadedGroups)}),{name:"large-data-storage",partialize:s=>({codeData:s.codeData,lastUpdated:s.lastUpdated,loadedGroups:Array.from(s.loadedGroups)})})),b=D.create()(S.persist((s,p)=>({get codeData(){return r.getState().codeData},get isLoading(){return r.getState().isLoading},get error(){return r.getState().error},get lastUpdated(){return r.getState().lastUpdated},fetchCommonCodes:async()=>{await r.getState().fetchData()},getCodeList:(e,c)=>{const{enabledOnly:o=!0,systemCodeOnly:a=!1,sortByOrder:n=!1,excludeParentCode:u=!1}=c||{},d=`simpleCodeList_${e}_${o}_${a}_${n}_${u}`;if(t.optionCache.has(d)){const h=t.cacheHits.get(d)||0;return t.cacheHits.set(d,h+1),t.optionCache.get(d)}const i=r.getState().codeData;if(!i)return[];if(!t.isGroupLoaded(e)&&!i[e])return console.warn(`그룹 ${e}가 아직 로드되지 않았습니다.`),[];const l=[],f=i[e];f&&Object.values(f).forEach(h=>{if(!(o&&!h.enabled)&&!(a&&h.systemCodeYn!=="Y"))if(u){const m=e.length,H=h.codeValue.substring(m);H.length>0&&l.push({...h,codeValue:H})}else l.push(h)});let g;n?g=l.sort((h,m)=>h.sortOrder!==m.sortOrder?h.sortOrder-m.sortOrder:h.codeValue.localeCompare(m.codeValue)):g=l.sort((h,m)=>h.codeValue.localeCompare(m.codeValue));const C=g.map(h=>({label:h.codeNm,value:h.codeValue,tagColor:h.labelColor}));return t.optionCache.size>=O.CACHE_SIZE_LIMIT&&t.cleanupCache(),t.optionCache.set(d,C),t.cacheHits.set(d,1),C},getCodeName:e=>{if(t.nameCache.has(e)){const o=t.cacheHits.get(`name_${e}`)||0;return t.cacheHits.set(`name_${e}`,o+1),t.nameCache.get(e)}const c=r.getState().codeData;if(!c)return null;for(const o of Object.values(c))for(const a of Object.values(o))if(a.codeValue===e)return t.nameCache.set(e,a.codeNm),t.cacheHits.set(`name_${e}`,1),a.codeNm;return null},getCodeColor:e=>{if(t.colorCache.has(e)){const o=t.cacheHits.get(`color_${e}`)||0;return t.cacheHits.set(`color_${e}`,o+1),t.colorCache.get(e)}const c=r.getState().codeData;if(!c)return null;for(const o of Object.values(c))for(const a of Object.values(o))if(a.codeValue===e)return t.colorCache.set(e,a.labelColor||""),t.cacheHits.set(`color_${e}`,1),a.labelColor;return null},getGridLookup:e=>{const c=`gridLookup_${e}`;if(t.optionCache.has(c)){const i=t.cacheHits.get(c)||0;return t.cacheHits.set(c,i+1),t.optionCache.get(c)}const o=r.getState().codeData;if(!o)return{labels:[],values:[],lookupDisplay:!0};const a=o[e];if(!a)return{labels:[],values:[],lookupDisplay:!0};const n=[],u=[];Object.values(a).filter(i=>i.enabled).sort((i,l)=>i.sortOrder-l.sortOrder).forEach(i=>{n.push(i.codeNm),u.push(i.codeValue)});const d={labels:n,values:u,lookupDisplay:!0};return t.optionCache.set(c,d),t.cacheHits.set(c,1),d},getCodeByOption:(e,c,o)=>{const a=`codeByOption_${e}_${c}_${o}`;if(t.codeCache.has(a)){const l=t.cacheHits.get(a)||0;return t.cacheHits.set(a,l+1),t.codeCache.get(a)}const n=r.getState().codeData;if(!n)return[];const u=[],d=n[e];d&&Object.values(d).forEach(l=>{l.enabled&&l.options&&l.options[c]===o&&u.push({...l,codeNm:l.options[c]||l.codeNm})});const i=u.sort((l,f)=>l.codeValue.localeCompare(f.codeValue));return t.codeCache.size>=O.CACHE_SIZE_LIMIT&&t.cleanupCache(),t.codeCache.set(a,i),t.cacheHits.set(a,1),i},getCodeListByOption:(e,c,o)=>{const{enabledOnly:a=!0,systemCodeOnly:n=!1,sortByOrder:u=!1}=o||{},d=`codeListByOption_${e}_${c}_${a}_${n}_${u}`;if(t.codeCache.has(d)){const C=t.cacheHits.get(d)||0;return t.cacheHits.set(d,C+1),t.codeCache.get(d)}const i=r.getState().codeData;if(!i)return[];if(!t.isGroupLoaded(e)&&!i[e])return console.warn(`그룹 ${e}가 아직 로드되지 않았습니다.`),[];const l=[],f=i[e];f&&Object.values(f).forEach(C=>{a&&!C.enabled||n&&C.systemCodeYn!=="Y"||C.options&&C.options[c]&&l.push({label:C.options[c],value:C.commonCode,tagColor:C.labelColor})});let g;return u?g=l.sort((C,h)=>C.value.localeCompare(h.value)):g=l.sort((C,h)=>C.value.localeCompare(h.value)),t.codeCache.size>=O.CACHE_SIZE_LIMIT&&t.cleanupCache(),t.codeCache.set(d,g),t.cacheHits.set(d,1),g},getAvailableGroupCodes:()=>{const e="available_group_codes";if(t.nameCache.has(e)){const a=t.cacheHits.get(e)||0;return t.cacheHits.set(e,a+1),JSON.parse(t.nameCache.get(e))}const c=r.getState().codeData;if(!c)return[];const o=Object.keys(c).sort();return t.nameCache.set(e,JSON.stringify(o)),t.cacheHits.set(e,1),o},clearCodes:()=>{r.getState().clearData()}}),{name:"code-storage",partialize:s=>({})})),y=D.create()(S.persist((s,p)=>({get codeData(){return r.getState().codeData},get isLoading(){return r.getState().isLoading},get error(){return r.getState().error},get lastUpdated(){return r.getState().lastUpdated},fetchCommonCodes:async()=>{await r.getState().fetchData()},getOptionValue:(e,c)=>{const o=`option_${e}_${c}`;if(t.optionCache.has(o)){const u=t.cacheHits.get(o)||0;return t.cacheHits.set(o,u+1),t.optionCache.get(o)}const a=r.getState().codeData;if(!a)return null;const n=a[e];if(n&&n[c]){const u=n[c].options;return t.optionCache.set(o,u),t.cacheHits.set(o,1),u}return null},getOptionByKey:(e,c,o)=>{const a=`option_${e}_${c}_${o}`;if(t.optionCache.has(a)){const d=t.cacheHits.get(a)||0;return t.cacheHits.set(a,d+1),t.optionCache.get(a)}const n=p().getOptionValue(e,c),u=n?n[o]:null;return t.optionCache.set(a,u),t.cacheHits.set(a,1),u},clearCodes:()=>{r.getState().clearData()}}),{name:"option-storage",partialize:s=>({})})),L=D.create()(S.persist((s,p)=>({get codeData(){return r.getState().codeData},get isLoading(){return r.getState().isLoading},get error(){return r.getState().error},get lastUpdated(){return r.getState().lastUpdated},fetchCommonCodes:async()=>{await r.getState().fetchData()},getColorCode:e=>{if(t.colorCache.has(e)){const o=t.cacheHits.get(`color_${e}`)||0;return t.cacheHits.set(`color_${e}`,o+1),t.colorCache.get(e)}const c=r.getState().codeData;if(!c)return null;for(const o of Object.values(c))for(const a of Object.values(o))if(a.codeValue===e)return t.colorCache.set(e,a.labelColor||""),t.cacheHits.set(`color_${e}`,1),a.labelColor;return null},getColorMapping:()=>{const e="color_mapping";if(t.optionCache.has(e)){const a=t.cacheHits.get(e)||0;return t.cacheHits.set(e,a+1),t.optionCache.get(e)}const c=r.getState().codeData;if(!c)return[];const o=[];return Object.values(c).forEach(a=>{Object.values(a).forEach(n=>{n.labelColor&&o.push({code:n.codeValue,color:n.labelColor})})}),t.optionCache.set(e,o),t.cacheHits.set(e,1),o},clearCodes:()=>{r.getState().clearData()}}),{name:"color-storage",partialize:s=>({})}));exports.useCodeStore=b;exports.useColorStore=L;exports.useOptionStore=y;
|
|
2
|
-
//# sourceMappingURL=codeStore-KPL92rcv.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
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]}
|
|
@@ -1,2 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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]}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
"use strict";const M=require("zustand"),i=require("./serviceConfig-9dHegQIK.cjs"),P=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 i.callService(i.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),P.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 i.callService(i.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 i.callService(i.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 m=[],b=[];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("⚠️ 메뉴 응답이 비어있거나 예상과 다릅니다."),[]},p=(r,a)=>!!a&&r.crprCd===a.crprCd&&r.userId===a.userId&&(r.prntGbcd??v.DEFAULT_PRNT_GBCD)===(a.prntGbcd??v.DEFAULT_PRNT_GBCD),A=r=>{if(m.length===r.length&&m.every((n,s)=>n.menuId===r[s]?.menuId&&n.menuPrntId===r[s]?.menuPrntId))return b;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 m=[...r],b=o,o},I=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(p(n,a()._lastFetchParams)){console.log("✅ 중복 fetch 차단",n);return}r({isLoading:!0,error:null,_lastFetchParams:n});try{const s=await i.callService(i.getServiceCode("AUTH_MENU"),n),c=h(s),l=A(c);r({flatMenuList:c,menuList:l,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}})),f={MAX_TABS:15},y=M.create((r,a)=>({activeMenuId:null,activeMenuItem:null,tabs:[],sidebarCollapsed:!1,maxTabs:f.MAX_TABS,tabProtectFlag:{},tabParams:{},componentLabelMap:{},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>f.MAX_TABS){console.warn("❌ 최대 탭 개수를 초과했습니다."),u.message.warning(`최대 ${f.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=I.getState().findMenuById(e);o?a().openTabFromMenu(o,t):(console.warn("❌ 메뉴 ID를 찾을 수 없음:",e),u.message.warning("메뉴 ID를 찾을 수 없습니다."))},openTabByComponentId:(e,t)=>{const{tabs:o,activeMenuId:n}=a(),s=o.find(d=>d.key===e),c=a().componentLabelMap[e]??e,l={crprCd:"",menuNm:c,menuId:e,scrnId:e,scrnPath:e,menuNo:void 0,menuLvl:0,prsnInfoYn:"N",rootMenu:"",iconCd:"",menuGbCd:"",menuPrntId:"",children:[]};if(s)if(n!==l.menuId)r({activeMenuId:l.menuId,activeMenuItem:l}),a().setTabParams(l.menuId,t||{});else{console.warn("❌ 유효하지 않은 메뉴정보",e),u.message.warning("유효하지 않은 메뉴정보입니다.");return}else{const d={key:e,gubun:"C",label:c,menuItem:l,closable:!0};r({tabs:[...o,d],activeMenuId:e,activeMenuItem:l}),a().setTabParams(e,t||{})}},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(l=>l.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(l=>n[l]===s[l])?o:{tabParams:{...o.tabParams,[e]:s}}}),setComponentLabelMap:(e,t)=>r({componentLabelMap:e})}));exports.useFavoriteStore=T;exports.useMenuModelStore=I;exports.useMenuViewStore=y;
|
|
3
|
-
//# sourceMappingURL=menuViewStore-DuS0VmkB.cjs.map
|