{"version":3,"file":"location.cjs","sources":["../../../src/utils/location.ts"],"sourcesContent":["import { Location } from 'history';\n\nimport { textUtil } from '../text/sanitize';\nimport { ScopedVars } from '../types/ScopedVars';\nimport { GrafanaConfig } from '../types/config';\nimport { RawTimeRange } from '../types/time';\n\nimport { UrlQueryMap, urlUtil } from './url';\n\nlet grafanaConfig = { appSubUrl: '' } as GrafanaConfig;\nlet getTimeRangeUrlParams: () => RawTimeRange;\nlet getVariablesUrlParams: (scopedVars?: ScopedVars) => UrlQueryMap;\n\nconst maybeParseUrl = (input: string): URL | undefined => {\n  try {\n    return new URL(input);\n  } catch {\n    return undefined;\n  }\n};\n\n/**\n *\n * @param url\n * @internal\n */\nconst stripBaseFromUrl = (urlOrPath: string): string => {\n  // Will only return a URL object if the input is actually a valid URL\n  const parsedUrl = maybeParseUrl(urlOrPath);\n  if (parsedUrl) {\n    // If the input is a URL, and for a different origin that we're on, just bail\n    // and return it. There's no need to strip anything from it\n    if (parsedUrl.origin !== window.location.origin) {\n      return urlOrPath;\n    }\n  }\n\n  const appSubUrl = grafanaConfig.appSubUrl ?? '';\n  const stripExtraChars = appSubUrl.endsWith('/') ? 1 : 0;\n  const isAbsoluteUrl = urlOrPath.startsWith('http');\n\n  let segmentToStrip = appSubUrl;\n\n  if (!urlOrPath.startsWith('/') || isAbsoluteUrl) {\n    segmentToStrip = `${window.location.origin}${appSubUrl}`;\n  }\n\n  // Check if the segment is either exactly the same as the url\n  // or followed by a '/' so it does not replace incorrect similarly named segments\n  // i.e. /grafana should not replace /grafanadashboards\n  return urlOrPath.length > 0 && (urlOrPath.indexOf(segmentToStrip + '/') === 0 || urlOrPath === segmentToStrip)\n    ? urlOrPath.slice(segmentToStrip.length - stripExtraChars)\n    : urlOrPath;\n};\n\n/**\n *\n * @param url\n * @internal\n */\nconst assureBaseUrl = (url: string): string => {\n  if (url.startsWith('/')) {\n    return `${grafanaConfig.appSubUrl}${stripBaseFromUrl(url)}`;\n  }\n  return url;\n};\n\n/**\n *\n * @param location\n * @param searchParamsToUpdate\n * @returns\n */\nconst getUrlForPartial = (location: Location, searchParamsToUpdate: UrlQueryMap) => {\n  const searchParams = urlUtil.parseKeyValue(\n    location.search.startsWith('?') ? location.search.substring(1) : location.search\n  );\n  for (const key in searchParamsToUpdate) {\n    // removing params with null | undefined\n    if (searchParamsToUpdate[key] === null || searchParamsToUpdate[key] === undefined) {\n      delete searchParams[key];\n    } else {\n      searchParams[key] = searchParamsToUpdate[key];\n    }\n  }\n  return assureBaseUrl(urlUtil.renderUrl(location.pathname, searchParams));\n};\n\n/**\n * @deprecated use `getUrlForPartial` instead\n * Update URL or search param string `init` with new params `partial`.\n */\nconst updateSearchParams = (init: string, partial: string) => {\n  const urlSearchParams = new URLSearchParams(partial);\n\n  // Check if full URL\n  try {\n    const curURL = new URL(init);\n    urlSearchParams.forEach((val, key) => curURL.searchParams.set(key, val));\n    return curURL.href;\n  } catch {\n    // assume search params\n    const newSearchParams = new URLSearchParams(init);\n    urlSearchParams.forEach((v, k) => {\n      newSearchParams.set(k, v);\n    });\n    return '?' + newSearchParams.toString();\n  }\n};\n\ninterface LocationUtilDependencies {\n  config: GrafanaConfig;\n  getTimeRangeForUrl: () => RawTimeRange;\n  getVariablesUrlParams: (scopedVars?: ScopedVars) => UrlQueryMap;\n}\n\nexport const locationUtil = {\n  /**\n   *\n   * @param getConfig\n   * @param getAllVariableValuesForUrl\n   * @param getTimeRangeForUrl\n   * @internal\n   */\n  initialize: (dependencies: LocationUtilDependencies) => {\n    grafanaConfig = dependencies.config;\n    getTimeRangeUrlParams = dependencies.getTimeRangeForUrl;\n    getVariablesUrlParams = dependencies.getVariablesUrlParams;\n  },\n  stripBaseFromUrl,\n  assureBaseUrl,\n  updateSearchParams,\n  getTimeRangeUrlParams: () => {\n    if (!getTimeRangeUrlParams) {\n      return null;\n    }\n    return urlUtil.toUrlParams(getTimeRangeUrlParams());\n  },\n  getVariablesUrlParams: (scopedVars?: ScopedVars) => {\n    if (!getVariablesUrlParams) {\n      return null;\n    }\n    const params = getVariablesUrlParams(scopedVars);\n    return urlUtil.toUrlParams(params);\n  },\n  getUrlForPartial,\n  processUrl: (url: string) => {\n    return grafanaConfig.disableSanitizeHtml ? url : textUtil.sanitizeUrl(url);\n  },\n};\n"],"names":["urlUtil","textUtil"],"mappings":"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"}