{"version":3,"sources":["../src/termi-link.ts"],"sourcesContent":["\n// Interface for version information\ninterface Version {\n  major: number;\n  minor: number;\n  patch: number;\n}\n\n// Environment variables that indicate hyperlink support\nconst ENVIRONMENT_VARIABLES = [\n  'DOMTERM',\n  'WT_SESSION',\n  'KONSOLE_VERSION',\n];\n\n// Parse version string into Version object\nfunction parseVersion(version: string): Version {\n  const [major = 0, minor = 0, patch = 0] = version.split('.').map(Number);\n  return { major, minor, patch };\n}\n\n// Check if environment variable exists\nfunction hasEnv(name: string): boolean {\n  return process.env[name] !== undefined;\n}\n\n// Get environment variable value\nfunction getEnv(name: string): string {\n  return process.env[name] || '';\n}\n\n// Check if environment variable matches any of the given values\nfunction matchesEnv(name: string, values: string[]): boolean {\n  return hasEnv(name) && values.includes(getEnv(name));\n}\n\n// Check if any of the environment variables exist\nfunction checkAllEnvs(vars: string[]): boolean {\n  return vars.some(v => hasEnv(v));\n}\n\n// Check if terminal supports hyperlinks\nfunction supportsHyperlinks(): boolean {\n  // Force hyperlinks if environment variable is set\n  if (matchesEnv('TERMI_LINK_HYPERLINK', ['1', 'true', 'always', 'enabled'])) {\n    return true;\n  }\n  if (matchesEnv('TERMI_LINK_HYPERLINK', ['0', 'false', 'never', 'disabled'])) {\n    return false;\n  }\n\n  // VTE-based terminals\n  if (hasEnv('VTE_VERSION')) {\n    const v = parseVersion(getEnv('VTE_VERSION'));\n    return v.major > 5000;\n  }\n\n  // Terminals with TERM_PROGRAM variable\n  if (hasEnv('TERM_PROGRAM')) {\n    const v = parseVersion(getEnv('TERM_PROGRAM_VERSION'));\n    const term = getEnv('TERM_PROGRAM');\n\n    switch (term) {\n      case 'iTerm.app':\n        return v.major > 3 || (v.major === 3 && v.minor >= 1);\n      case 'WezTerm':\n        return v.major >= 20200620;\n      case 'vscode':\n        return v.major > 1 || (v.major === 1 && v.minor >= 72);\n      case 'ghostty':\n        return v.major >= 1;\n      case 'terminology':\n        return v.major >= 1 && v.minor >= 2;\n      case 'Hyper':\n        return v.major >= 3;\n      case 'alacritty':\n        return v.major >= 0 && v.minor >= 11;\n      case 'kitty':\n        return v.major >= 0 && v.minor >= 19;\n      default:\n        return false;\n    }\n  }\n\n  // Check TERM variable\n  if (matchesEnv('TERM', ['xterm-kitty', 'alacritty', 'alacritty-direct', 'xterm-ghostty'])) {\n    return true;\n  }\n\n  // Check COLORTERM variable\n  if (matchesEnv('COLORTERM', ['xfce4-terminal'])) {\n    return true;\n  }\n\n  // Check JetBrains terminals\n  if (matchesEnv('TERMINAL_EMULATOR', ['JetBrains-JediTerm'])) {\n    return true;\n  }\n\n  // Check standalone environment variables\n  if (checkAllEnvs(ENVIRONMENT_VARIABLES)) {\n    return true;\n  }\n\n  return false;\n}\n\nexport const ANSI_RESET = \"\\u001b[0m\";\n\nfunction sanitizeUrl(url: string): string {\n  // Remove control characters\n  return url.replace(/[\\x00-\\x1F\\x7F]/g, '');\n}\n\n/**\n * Creates a clickable terminal link sequence of characters. The url provided will be sanitized to remove control characters.\n * \n * @param text The text to display, if an empty string `\"\"` is passed, the text will be the same as the url, and in the fallback case, the link will be the only thing displayed.\n * @param url The URL to link to\n * @param options Optional parameters\n * @param options.fallback Override the default fallback or disable fallback. When function provided, it receives the `text` and `url` as parameters and is expected to return a string.\nIf set to `false`, there will be an empty string returned when a terminal is unsupported.\n * @returns Formatted terminal link string\n */\nexport function terminalLink(text: string, url: string, options?: {\n  fallback?: false | ((text: string, url: string) => string),\n} | undefined): string {\n  const { fallback = null } = options || {};\n  //const textColor = parseColor(color);\n  if (supportsHyperlinks()) {\n    //return `\\x1b]8;;${url}\\x07${textColor}${text || url}\\x1b]8;;\\x07`;\n    const sanitized = sanitizeUrl(url)\n    return `\\x1b]8;;${sanitized}\\x07${text || sanitized}\\x1b]8;;\\x07`;\n  }\n  if (fallback == null) {\n    if (!text) {\n      return `${sanitizeUrl(url)}`;\n    }\n    //return `${textColor}${text} (${url})`;\n    return `${text} (${sanitizeUrl(url)})`;\n  } else if (fallback === false) {\n    return ``;\n  } else {\n    return fallback(text, url);\n  }\n}\n\n/**\n * Checks if the terminal supports hyperlinks.\n * @returns boolean indicating hyperlink support\n */\nexport function isSupported(): boolean {\n  return supportsHyperlinks();\n}\n"],"mappings":"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","names":[]}