{"version":3,"file":"menu-utils.cjs","sources":["../../../src/lib/menu-utils.ts"],"sourcesContent":["/**\n * 메뉴 유틸리티 함수\n * Menu Utility Functions\n */\n\nimport type { SidebarMenuItem } from '@/types/sidebar-menu.types'\n\n/**\n * 검색어로 메뉴 아이템을 재귀적으로 필터링\n * Recursively filters menu items by search query\n * \n * @param items - 필터링할 메뉴 아이템 배열\n * @param query - 검색어\n * @returns 필터링된 메뉴 아이템 배열\n */\nexport function filterMenuItems(\n  items: SidebarMenuItem[],\n  query: string\n): SidebarMenuItem[] {\n  if (!Array.isArray(items) || items.length === 0) {\n    return []\n  }\n\n  if (!query || query.trim() === '') {\n    return items\n  }\n\n  const normalizedQuery = query.toLowerCase().trim()\n  const result: SidebarMenuItem[] = []\n\n  for (const item of items) {\n    const matchesLabel = item.label?.toLowerCase().includes(normalizedQuery) ?? false\n\n    // 하위 메뉴 검색\n    let filteredChildren: SidebarMenuItem[] | undefined = undefined\n    if (item.children && Array.isArray(item.children) && item.children.length > 0) {\n      filteredChildren = filterMenuItems(item.children, query)\n    }\n\n    // 현재 메뉴나 하위 메뉴 중 하나라도 매칭되면 포함\n    if (matchesLabel || (Array.isArray(filteredChildren) && filteredChildren.length > 0)) {\n      result.push({\n        ...item,\n        children: filteredChildren,\n      })\n    }\n  }\n\n  return result\n}\n\n/**\n * 검색 결과에서 매칭된 하위 메뉴가 있는 부모 메뉴의 키를 추출\n * Extracts keys of parent menus that have matching children in search results\n * \n * @param items - 검색 결과 메뉴 아이템 배열\n * @returns 확장해야 할 메뉴 키 Set\n */\nexport function getExpandedKeysForSearch(\n  items: SidebarMenuItem[]\n): Set<number | string> {\n  const keysToExpand = new Set<number | string>()\n\n  const traverse = (menuItems: SidebarMenuItem[]): void => {\n    if (!Array.isArray(menuItems)) {\n      return\n    }\n\n    for (const item of menuItems) {\n      if (item.children && Array.isArray(item.children) && item.children.length > 0) {\n        const key = item.menuKey || item.label\n        keysToExpand.add(key)\n        traverse(item.children)\n      }\n    }\n  }\n\n  traverse(items)\n  return keysToExpand\n}\n\n/**\n * 메뉴 아이템 배열을 평탄화하여 모든 아이템을 추출\n * Flattens menu items array to extract all items\n * \n * @param items - 메뉴 아이템 배열\n * @returns 평탄화된 메뉴 아이템 배열\n */\nexport function flattenMenuItems(items: SidebarMenuItem[]): SidebarMenuItem[] {\n  const result: SidebarMenuItem[] = []\n\n  const traverse = (menuItems: SidebarMenuItem[]): void => {\n    if (!Array.isArray(menuItems)) {\n      return\n    }\n\n    for (const item of menuItems) {\n      result.push(item)\n      if (item.children && Array.isArray(item.children) && item.children.length > 0) {\n        traverse(item.children)\n      }\n    }\n  }\n\n  traverse(items)\n  return result\n}\n\n/**\n * menuKey로 메뉴 아이템 찾기\n * Find menu item by menuKey\n * \n * @param items - 메뉴 아이템 배열\n * @param menuKey - 찾을 메뉴 키\n * @returns 찾은 메뉴 아이템 또는 undefined\n */\nexport function findMenuItemByKey(\n  items: SidebarMenuItem[],\n  menuKey: number | string\n): SidebarMenuItem | undefined {\n  const flatItems = flattenMenuItems(items)\n  return flatItems.find(item => item.menuKey === menuKey)\n}\n"],"names":["filterMenuItems","items","query","normalizedQuery","result","item","matchesLabel","filteredChildren","getExpandedKeysForSearch","keysToExpand","traverse","menuItems","key"],"mappings":"gFAeO,SAASA,EACdC,EACAC,EACmB,CACnB,GAAI,CAAC,MAAM,QAAQD,CAAK,GAAKA,EAAM,SAAW,EAC5C,MAAO,CAAA,EAGT,GAAI,CAACC,GAASA,EAAM,KAAA,IAAW,GAC7B,OAAOD,EAGT,MAAME,EAAkBD,EAAM,YAAA,EAAc,KAAA,EACtCE,EAA4B,CAAA,EAElC,UAAWC,KAAQJ,EAAO,CACxB,MAAMK,EAAeD,EAAK,OAAO,cAAc,SAASF,CAAe,GAAK,GAG5E,IAAII,EACAF,EAAK,UAAY,MAAM,QAAQA,EAAK,QAAQ,GAAKA,EAAK,SAAS,OAAS,IAC1EE,EAAmBP,EAAgBK,EAAK,SAAUH,CAAK,IAIrDI,GAAiB,MAAM,QAAQC,CAAgB,GAAKA,EAAiB,OAAS,IAChFH,EAAO,KAAK,CACV,GAAGC,EACH,SAAUE,CAAA,CACX,CAEL,CAEA,OAAOH,CACT,CASO,SAASI,EACdP,EACsB,CACtB,MAAMQ,MAAmB,IAEnBC,EAAYC,GAAuC,CACvD,GAAK,MAAM,QAAQA,CAAS,GAI5B,UAAWN,KAAQM,EACjB,GAAIN,EAAK,UAAY,MAAM,QAAQA,EAAK,QAAQ,GAAKA,EAAK,SAAS,OAAS,EAAG,CAC7E,MAAMO,EAAMP,EAAK,SAAWA,EAAK,MACjCI,EAAa,IAAIG,CAAG,EACpBF,EAASL,EAAK,QAAQ,CACxB,EAEJ,EAEA,OAAAK,EAAST,CAAK,EACPQ,CACT"}