{"version":3,"file":"useMatchPolicies.cjs","sources":["../../../../../src/grafana/notificationPolicies/hooks/useMatchPolicies.ts"],"sourcesContent":["import { useCallback } from 'react';\n\nimport {\n  RoutingTree,\n  generatedAPI as notificationsAPIv0alpha1,\n} from '@grafana/api-clients/rtkq/notifications.alerting/v0alpha1';\n\nimport { Label } from '../../matchers/types';\nimport { USER_DEFINED_TREE_NAME } from '../consts';\nimport { Route, RouteWithID } from '../types';\nimport { RouteMatchResult, TreeMatch, convertRoutingTreeToRoute, matchInstancesToRoute } from '../utils';\n\nexport type RouteMatch = {\n  route: Route;\n  routeTree: {\n    // Add some metadata about the tree that is useful for displaying diagnostics\n    metadata: Pick<RoutingTree['metadata'], 'name'>;\n    // We'll include the entire expanded policy tree for diagnostics\n    expandedSpec: RouteWithID;\n  };\n  matchDetails: RouteMatchResult<RouteWithID>;\n};\n\nexport type InstanceMatchResult = {\n  // The labels we used to match to our policies\n  labels: Label[];\n  // The routes that matched the labels where the key is a route and the value is an array of instances that match that route\n  matchedRoutes: RouteMatch[];\n};\n\ninterface UseMatchInstancesToRouteTreesReturnType\n  extends ReturnType<typeof notificationsAPIv0alpha1.endpoints.listRoutingTree.useQuery> {\n  matchInstancesToRouteTrees: (instances: Label[][]) => InstanceMatchResult[];\n}\n\n/**\n * React hook that finds notification policy routes in all routing trees that match the provided set of alert instances.\n *\n * This hook queries the routing tree API and processes each tree to:\n * 1. Convert RoutingTree structures to Route structures\n * 2. Compute the inherited properties for each node in the tree\n * 3. Find routes within each tree that match the given set of labels\n *\n * @returns An object containing a `matchInstancesToRoutingTrees` function that takes alert instances\n *          and returns an array of InstanceMatchResult objects, each containing the matched routes and matching details\n */\nexport function useMatchInstancesToRouteTrees(): UseMatchInstancesToRouteTreesReturnType {\n  const { data, ...rest } = notificationsAPIv0alpha1.endpoints.listRoutingTree.useQuery(\n    {},\n    {\n      refetchOnFocus: true,\n      refetchOnReconnect: true,\n    }\n  );\n\n  const memoizedFunction = useCallback(\n    (instances: Label[][]) => matchInstancesToRouteTrees(data?.items ?? [], instances),\n    [data?.items]\n  );\n\n  return {\n    matchInstancesToRouteTrees: memoizedFunction,\n    ...rest,\n  };\n}\n\n/**\n * This function will match a set of labels to multiple routing trees. Assumes a list of routing trees has already been fetched.\n *\n * Use \"useMatchInstancesToRouteTrees\" if you want the hook to automatically fetch the latest definition of routing trees.\n */\nexport function matchInstancesToRouteTrees(trees: RoutingTree[], instances: Label[][]): InstanceMatchResult[] {\n  // Process each tree and get matches for all instances\n  const treeMatches = trees.map<TreeMatch>((tree) => {\n    const rootRoute = convertRoutingTreeToRoute(tree);\n    return matchInstancesToRoute(rootRoute, instances);\n  });\n\n  // Group results by instance\n  return instances.map<InstanceMatchResult>((labels) => {\n    // Collect matches for this specific instance from all trees\n    const allMatchedRoutes = treeMatches.flatMap(({ expandedTree, matchedPolicies }, index) => {\n      const tree = trees[index];\n\n      return Array.from(matchedPolicies.entries()).flatMap(([route, results]) =>\n        results\n          .filter((matchDetails) => matchDetails.labels === labels)\n          .map((matchDetails) => ({\n            route,\n            routeTree: {\n              metadata: { name: tree.metadata.name ?? USER_DEFINED_TREE_NAME },\n              expandedSpec: expandedTree,\n            },\n            matchDetails,\n          }))\n      );\n    });\n\n    return {\n      labels,\n      matchedRoutes: allMatchedRoutes,\n    };\n  });\n}\n"],"names":["notificationsAPIv0alpha1","useCallback","convertRoutingTreeToRoute","matchInstancesToRoute","USER_DEFINED_TREE_NAME"],"mappings":";;;;;;;;;;AA8CO,SAAS,6BAAA,GAAyE;AACvF,EAAA,MAAM,EAAE,IAAA,EAAM,GAAG,MAAK,GAAIA,qBAAA,CAAyB,UAAU,eAAA,CAAgB,QAAA;AAAA,IAC3E,EAAC;AAAA,IACD;AAAA,MACE,cAAA,EAAgB,IAAA;AAAA,MAChB,kBAAA,EAAoB;AAAA;AACtB,GACF;AAEA,EAAA,MAAM,gBAAA,GAAmBC,iBAAA;AAAA,IACvB,CAAC,SAAA,KAAsB;AAxD3B,MAAA,IAAA,EAAA;AAwD8B,MAAA,OAAA,0BAAA,CAAA,CAA2B,EAAA,GAAA,IAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,IAAA,CAAM,KAAA,KAAN,IAAA,GAAA,EAAA,GAAe,IAAI,SAAS,CAAA;AAAA,IAAA,CAAA;AAAA,IACjF,CAAC,6BAAM,KAAK;AAAA,GACd;AAEA,EAAA,OAAO;AAAA,IACL,0BAAA,EAA4B,gBAAA;AAAA,IAC5B,GAAG;AAAA,GACL;AACF;AAOO,SAAS,0BAAA,CAA2B,OAAsB,SAAA,EAA6C;AAE5G,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,GAAA,CAAe,CAAC,IAAA,KAAS;AACjD,IAAA,MAAM,SAAA,GAAYC,gCAA0B,IAAI,CAAA;AAChD,IAAA,OAAOC,2BAAA,CAAsB,WAAW,SAAS,CAAA;AAAA,EACnD,CAAC,CAAA;AAGD,EAAA,OAAO,SAAA,CAAU,GAAA,CAAyB,CAAC,MAAA,KAAW;AAEpD,IAAA,MAAM,gBAAA,GAAmB,YAAY,OAAA,CAAQ,CAAC,EAAE,YAAA,EAAc,eAAA,IAAmB,KAAA,KAAU;AACzF,MAAA,MAAM,IAAA,GAAO,MAAM,KAAK,CAAA;AAExB,MAAA,OAAO,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,CAAA,CAAE,OAAA;AAAA,QAAQ,CAAC,CAAC,KAAA,EAAO,OAAO,MACnE,OAAA,CACG,MAAA,CAAO,CAAC,YAAA,KAAiB,aAAa,MAAA,KAAW,MAAM,CAAA,CACvD,GAAA,CAAI,CAAC,YAAA,KAAc;AAvF9B,UAAA,IAAA,EAAA;AAuFkC,UAAA,OAAA;AAAA,YACtB,KAAA;AAAA,YACA,SAAA,EAAW;AAAA,cACT,UAAU,EAAE,IAAA,EAAA,CAAM,UAAK,QAAA,CAAS,IAAA,KAAd,YAAsBC,6BAAA,EAAuB;AAAA,cAC/D,YAAA,EAAc;AAAA,aAChB;AAAA,YACA;AAAA,WACF;AAAA,QAAA,CAAE;AAAA,OACN;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,aAAA,EAAe;AAAA,KACjB;AAAA,EACF,CAAC,CAAA;AACH;;;;;"}