{"version":3,"file":"resolver.mjs","sources":["../../src/resolver.ts"],"sourcesContent":["import { gte, compare, valid } from 'semver';\n\nimport {\n  FunctionSelector,\n  Selectors,\n  SelectorsOf,\n  StringSelector,\n  VersionedSelectorGroup,\n  VersionedSelectors,\n  CssSelector,\n  UrlSelector,\n  FunctionSelectorTwoArgs,\n} from './types';\n\n/**\n * Resolves selectors based on the Grafana version\n */\nexport function resolveSelectors<T extends VersionedSelectorGroup>(\n  versionedSelectors: T,\n  grafanaVersion = 'latest'\n): SelectorsOf<T> {\n  const version = grafanaVersion.replace(/\\-.*/, '');\n\n  return resolveSelectorGroup(versionedSelectors, version);\n}\n\nfunction resolveSelectorGroup<T extends VersionedSelectorGroup>(group: T, grafanaVersion: string): SelectorsOf<T> {\n  const result: Selectors = {};\n\n  for (const [key, value] of Object.entries(group)) {\n    if (isVersionedSelectorGroup(value)) {\n      result[key] = resolveSelectorGroup(value, grafanaVersion);\n    } else {\n      assertIsSemverValid(value, key);\n      result[key] = resolveSelector(value, grafanaVersion);\n    }\n  }\n\n  return result as SelectorsOf<T>;\n}\n\nfunction isVersionedSelectorGroup(\n  target: VersionedSelectors | VersionedSelectorGroup\n): target is VersionedSelectorGroup {\n  if (typeof target === 'object') {\n    const [first] = Object.keys(target);\n    return !valid(first);\n  }\n\n  return false;\n}\n\nfunction resolveSelector(\n  versionedSelector: VersionedSelectors,\n  grafanaVersion: string\n): StringSelector | FunctionSelector | FunctionSelectorTwoArgs | CssSelector | UrlSelector {\n  let versionToUse;\n  let versions = Object.keys(versionedSelector).sort(compare);\n\n  if (grafanaVersion === 'latest') {\n    return versionedSelector[versions[versions.length - 1]];\n  }\n\n  for (const version of versions) {\n    if (gte(grafanaVersion, version)) {\n      versionToUse = version;\n    }\n  }\n\n  if (!versionToUse) {\n    versionToUse = versions[versions.length - 1];\n  }\n\n  return versionedSelector[versionToUse];\n}\n\nfunction assertIsSemverValid(versionedSelector: VersionedSelectors, selectorName: string) {\n  if (!Object.keys(versionedSelector).every((version) => valid(version))) {\n    throw new Error(`Invalid semver version: '${selectorName}'`);\n  }\n}\n"],"names":[],"mappings":";;AAiBgB,SAAA,gBAAA,CACd,kBACA,EAAA,cAAA,GAAiB,QACD,EAAA;AAChB,EAAA,MAAM,OAAU,GAAA,cAAA,CAAe,OAAQ,CAAA,MAAA,EAAQ,EAAE,CAAA;AAEjD,EAAO,OAAA,oBAAA,CAAqB,oBAAoB,OAAO,CAAA;AACzD;AAEA,SAAS,oBAAA,CAAuD,OAAU,cAAwC,EAAA;AAChH,EAAA,MAAM,SAAoB,EAAC;AAE3B,EAAA,KAAA,MAAW,CAAC,GAAK,EAAA,KAAK,KAAK,MAAO,CAAA,OAAA,CAAQ,KAAK,CAAG,EAAA;AAChD,IAAI,IAAA,wBAAA,CAAyB,KAAK,CAAG,EAAA;AACnC,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,oBAAqB,CAAA,KAAA,EAAO,cAAc,CAAA;AAAA,KACnD,MAAA;AACL,MAAA,mBAAA,CAAoB,OAAO,GAAG,CAAA;AAC9B,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,eAAgB,CAAA,KAAA,EAAO,cAAc,CAAA;AAAA;AACrD;AAGF,EAAO,OAAA,MAAA;AACT;AAEA,SAAS,yBACP,MACkC,EAAA;AAClC,EAAI,IAAA,OAAO,WAAW,QAAU,EAAA;AAC9B,IAAA,MAAM,CAAC,KAAK,CAAI,GAAA,MAAA,CAAO,KAAK,MAAM,CAAA;AAClC,IAAO,OAAA,CAAC,MAAM,KAAK,CAAA;AAAA;AAGrB,EAAO,OAAA,KAAA;AACT;AAEA,SAAS,eAAA,CACP,mBACA,cACyF,EAAA;AACzF,EAAI,IAAA,YAAA;AACJ,EAAA,IAAI,WAAW,MAAO,CAAA,IAAA,CAAK,iBAAiB,CAAA,CAAE,KAAK,OAAO,CAAA;AAE1D,EAAA,IAAI,mBAAmB,QAAU,EAAA;AAC/B,IAAA,OAAO,iBAAkB,CAAA,QAAA,CAAS,QAAS,CAAA,MAAA,GAAS,CAAC,CAAC,CAAA;AAAA;AAGxD,EAAA,KAAA,MAAW,WAAW,QAAU,EAAA;AAC9B,IAAI,IAAA,GAAA,CAAI,cAAgB,EAAA,OAAO,CAAG,EAAA;AAChC,MAAe,YAAA,GAAA,OAAA;AAAA;AACjB;AAGF,EAAA,IAAI,CAAC,YAAc,EAAA;AACjB,IAAe,YAAA,GAAA,QAAA,CAAS,QAAS,CAAA,MAAA,GAAS,CAAC,CAAA;AAAA;AAG7C,EAAA,OAAO,kBAAkB,YAAY,CAAA;AACvC;AAEA,SAAS,mBAAA,CAAoB,mBAAuC,YAAsB,EAAA;AACxF,EAAI,IAAA,CAAC,MAAO,CAAA,IAAA,CAAK,iBAAiB,CAAA,CAAE,KAAM,CAAA,CAAC,OAAY,KAAA,KAAA,CAAM,OAAO,CAAC,CAAG,EAAA;AACtE,IAAA,MAAM,IAAI,KAAA,CAAM,CAA4B,yBAAA,EAAA,YAAY,CAAG,CAAA,CAAA,CAAA;AAAA;AAE/D;;;;"}