{"version":3,"file":"url.mjs","names":[],"sources":["../../../src/common/data/url.ts"],"sourcesContent":["// https://mathiasbynens.be/demo/url-regex\n// https://gist.github.com/dperini/729294\n\nimport { escapeHTML } from './html'\n\n/// Remove scheme, www. and trailing slash for display purposes\nexport function toHumanReadableUrl(url: string): string {\n  return url.replace(/^(https?:\\/\\/(www\\.)?|mailto:)/gi, '').replace(/\\/$/, '')\n}\n\n//\n\nexport const RX_URL = /((?:(?:https?|ftp):)?\\/\\/(?:\\S+@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[01])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4])|(?:(?:[a-z0-9\\u00A1-\\uFFFF][\\w\\u00A1-\\uFFFF-]{0,62})?[a-z0-9\\u00A1-\\uFFFF]\\.)+[a-z\\u00A1-\\uFFFF]{2,}\\.?)(?::\\d{2,5})?(?:[/?#]\\S*)?)/gi\n\n/** @deprecated use linkifyPlainText */\nexport function linkifyPlainTextSimple(text: string): string {\n  return text\n    .split(RX_URL)\n    .map((part, i) => {\n      const escapedPart = escapeHTML(part)\n      return i % 2\n        ? `<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"${escapedPart}\">${toHumanReadableUrl(\n          escapedPart,\n        )}</a>`\n        : escapedPart\n    })\n    .join('')\n}\n\n// Advanced implementation that also handles email addresses and simple URLs without protocol\n\nconst RX_EMAIL = /((mailto:)?[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})/gi\nconst RX_SIMPLE_URL = /([a-zA-Z0-9]+\\.[a-zA-Z]{2,})/gi\n\nfunction handleUrlString(part: string): string {\n  var url = part\n  var rests = []\n\n  // Remove trailing punctuation from URLs\n  const urlWithoutPunctuation = url.replace(/[.,!?;:]*$/, '')\n  rests.unshift(url.slice(urlWithoutPunctuation.length))\n\n  // Full URL with protocol\n  if (url.includes('://')) {\n\n    // Remove trailing closing brackets if unbalanced\n    url = urlWithoutPunctuation\n    const openingBrackets = (url.match(/[\\(\\[\\{]/g) || []).length\n    const closingBrackets = (url.match(/[\\)\\]\\}]/g) || []).length\n    if (closingBrackets > openingBrackets) {\n      const diff = closingBrackets - openingBrackets\n      const rx = new RegExp(`[\\\\)\\\\]\\\\}]{0,${diff}}$`, 'g')\n      const urlWithoutTrailing = url.replace(rx, '')\n      rests.unshift(url.slice(urlWithoutTrailing.length))\n      url = urlWithoutTrailing\n    }\n\n  }\n\n  // Email address\n  else if (url.includes('@')) {\n    if (!url.startsWith('mailto:'))\n      url = `mailto:${urlWithoutPunctuation}`\n  }\n\n  // Simple URL without protocol\n  else {\n    url = `https://${urlWithoutPunctuation}`\n  }\n\n  const escapedRest = escapeHTML(rests.join(''))\n  const escapedHumanReadableUrl = escapeHTML(toHumanReadableUrl(url))\n  const escapedUrl = escapeHTML(url)\n  const classInsecureHttp = url.startsWith('http://') ? ' class=\"_warn\"' : ''\n  return `<a target=\"_blank\" rel=\"noopener noreferrer\"${classInsecureHttp} href=\"${escapedUrl}\">${escapedHumanReadableUrl}</a>${escapedRest}`\n}\n\nvar rxJoined: RegExp | undefined = undefined\n\nexport interface LinkifyOptions {\n}\n\nexport function linkifyPlainText(text: string, options: LinkifyOptions = {}): string {\n  if (rxJoined == null) {\n    rxJoined = new RegExp(`((${RX_URL.source})|(${RX_EMAIL.source})|(${RX_SIMPLE_URL.source}))`, 'gi')\n  } else {\n    rxJoined.lastIndex = 0\n  }\n\n  var index = 0\n  const parts: string[] = []\n\n  text.replace(rxJoined, (match, ...args) => {\n    const offset = args[args.length - 2]\n    const leading = text.slice(index, offset) ?? ''\n    parts.push(escapeHTML(leading))\n    index = offset + match.length\n    parts.push(handleUrlString(match))\n    return match\n  })\n\n  return parts.join('') + escapeHTML(text.slice(index))\n}\n\n\nexport function linkifyPlainTextWithLineBreaks(text: string, options: LinkifyOptions = {}): string {\n  return text.split('\\n').map(l => linkifyPlainText(l, options)).join('<br>')\n}\n\n//\n\nexport function encodeQuery(data: Record<string, any>, filterValue?: (value: any) => boolean) {\n  const pairs = []\n  for (let [key, value] of Object.entries(data)) {\n    if (value != null) {\n      if (!Array.isArray(value))\n        value = [value]\n      for (const v of value) {\n        if (filterValue && !filterValue(v))\n          continue\n        else if (v == null)\n          continue\n        pairs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(v))}`)\n      }\n    }\n  }\n  return pairs.join('&')\n}\n\nexport function parseQuery(queryString: string) {\n  const query: any = {}\n  while (queryString.startsWith('?')) {\n    queryString = queryString.substring(1)\n  }\n  const pairs = queryString.split('&')\n  for (let i = 0; i < pairs.length; i++) {\n    const part = pairs[i]\n    const idx = part.indexOf('=')\n    if (part.length === 0) continue\n    const key = idx < 0 ? part : decodeURIComponent(part.substring(0, idx))\n    const value = idx < 0 ? '' : decodeURIComponent(part.substring(idx + 1))\n    if (query[key] != null) {\n      if (!Array.isArray(query[key]))\n        query[key] = [query[key]]\n      query[key].push(value)\n    }\n    else {\n      query[key] = value\n    }\n  }\n  return query\n}\n"],"mappings":"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"}