{"version":3,"file":"completion-scripts.mjs","names":[],"sources":["../../src/lib/completion-scripts.ts"],"sourcesContent":["import { getFileSystemProvider, getEnvironmentProvider } from '@cli-forge/parser';\n\nfunction sanitizeName(cliName: string): string {\n  return cliName.replace(/[^a-zA-Z0-9_]/g, '_');\n}\n\n/**\n * Generates a bash completion script for the given CLI name.\n */\nexport function bashCompletionScript(cliName: string): string {\n  const funcName = `_${sanitizeName(cliName)}_completions`;\n  /* eslint-disable no-useless-escape -- \\$ is intentional in bash script template literals */\n  return `${funcName}() {\n  local cur_word args\n  cur_word=\"\\${COMP_WORDS[COMP_CWORD]}\"\n  args=(\"\\${COMP_WORDS[@]:1:\\$COMP_CWORD}\")\n\n  local completions\n  completions=\"$(\"${cliName}\" --get-completions \"\\${args[@]}\" 2>/dev/null)\"\n\n  COMPREPLY=($(compgen -W \"$completions\" -- \"$cur_word\"))\n}\ncomplete -F ${funcName} \"${cliName}\"`;\n  /* eslint-enable no-useless-escape */\n}\n\n/**\n * Generates a zsh completion script for the given CLI name.\n */\nexport function zshCompletionScript(cliName: string): string {\n  const funcName = `_${sanitizeName(cliName)}_completions`;\n  return `${funcName}() {\n  local completions\n  completions=(\"\\${(@f)$(\"${cliName}\" --get-completions \"\\${words[@]:1}\" 2>/dev/null)}\")\n  compadd -- $completions\n}\ncompdef ${funcName} \"${cliName}\"`;\n}\n\n/**\n * Generates a fish completion script for the given CLI name.\n */\nexport function fishCompletionScript(cliName: string): string {\n  return `complete -c \"${cliName}\" -f -a '(\"${cliName}\" --get-completions (commandline -cop)[2..] 2>/dev/null)'`;\n}\n\n/**\n * Generates a PowerShell completion script for the given CLI name.\n */\nexport function powershellCompletionScript(cliName: string): string {\n  return `Register-ArgumentCompleter -CommandName \"${cliName}\" -ScriptBlock {\n  param($wordToComplete, $commandAst, $cursorPosition)\n  $args = $commandAst.ToString().Split() | Select-Object -Skip 1\n  $completions = & \"${cliName}\" --get-completions @args 2>$null\n  $completions -split '\\\\n' | Where-Object { $_ -like \"$wordToComplete*\" } | ForEach-Object {\n    [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_)\n  }\n}`;\n}\n\ninterface InstallResult {\n  shell: string;\n  file: string;\n  action: 'created' | 'appended' | 'skipped';\n}\n\nfunction installForShell(\n  shell: string,\n  file: string,\n  script: string,\n  cliName: string,\n  overwrite = false\n): InstallResult {\n  const fs = getFileSystemProvider();\n  const marker = `# cli-forge completion for ${cliName}`;\n\n  if (overwrite) {\n    // For fish, write the whole file (each CLI gets its own file)\n    fs.writeFileSync(file, `${marker}\\n${script}\\n`);\n    return { shell, file, action: 'created' };\n  }\n\n  if (!fs.existsSync(file)) {\n    return { shell, file, action: 'skipped' };\n  }\n\n  const content = fs.readFileSync(file);\n  if (content.includes(marker)) {\n    return { shell, file, action: 'skipped' };\n  }\n\n  const block = `\\n${marker}\\n${script}\\n${marker} end\\n`;\n  fs.appendFileSync(file, block);\n  return { shell, file, action: 'appended' };\n}\n\n/**\n * Auto-detect available shells and install completion scripts.\n */\nexport async function installCompletionScripts(\n  cliName: string\n): Promise<void> {\n  const fs = getFileSystemProvider();\n  const env = getEnvironmentProvider();\n  const home = env.getEnv('HOME') ?? env.getEnv('USERPROFILE') ?? '/';\n  const results: InstallResult[] = [];\n\n  // Bash: ~/.bashrc\n  const bashrc = fs.join(home, '.bashrc');\n  results.push(\n    installForShell('bash', bashrc, bashCompletionScript(cliName), cliName)\n  );\n\n  // Zsh: ~/.zshrc\n  const zshrc = fs.join(home, '.zshrc');\n  results.push(\n    installForShell('zsh', zshrc, zshCompletionScript(cliName), cliName)\n  );\n\n  // Fish: ~/.config/fish/completions/<cliName>.fish\n  const fishDir = fs.join(home, '.config', 'fish', 'completions');\n  const fishFile = fs.join(fishDir, `${cliName}.fish`);\n  if (fs.existsSync(fs.join(home, '.config', 'fish'))) {\n    if (!fs.existsSync(fishDir)) {\n      fs.mkdirSync(fishDir, { recursive: true });\n    }\n    results.push(\n      installForShell(\n        'fish',\n        fishFile,\n        fishCompletionScript(cliName),\n        cliName,\n        true\n      )\n    );\n  }\n\n  // PowerShell: check for profile directory\n  const psProfile = fs.join(\n    home,\n    'Documents',\n    'PowerShell',\n    'Microsoft.PowerShell_profile.ps1'\n  );\n  if (fs.existsSync(fs.dirname(psProfile))) {\n    results.push(\n      installForShell(\n        'PowerShell',\n        psProfile,\n        powershellCompletionScript(cliName),\n        cliName\n      )\n    );\n  }\n\n  // Report\n  console.log('Shell completion installation results:');\n  for (const r of results) {\n    console.log(`  ${r.shell}: ${r.action} (${r.file})`);\n  }\n  if (results.every((r) => r.action === 'skipped')) {\n    console.log(\n      '\\nNo shell config files detected. You can manually source the completion scripts.'\n    );\n  } else {\n    console.log(\n      '\\nRestart your shell or source the updated config to enable completions.'\n    );\n  }\n}\n"],"mappings":";;AAEA,SAAS,aAAa,SAAyB;AAC7C,QAAO,QAAQ,QAAQ,kBAAkB,IAAI;;;;;AAM/C,SAAgB,qBAAqB,SAAyB;CAC5D,MAAM,WAAW,IAAI,aAAa,QAAQ,CAAC;AAE3C,QAAO,GAAG,SAAS;;;;;;oBAMD,QAAQ;;;;cAId,SAAS,IAAI,QAAQ;;;;;AAOnC,SAAgB,oBAAoB,SAAyB;CAC3D,MAAM,WAAW,IAAI,aAAa,QAAQ,CAAC;AAC3C,QAAO,GAAG,SAAS;;4BAEO,QAAQ;;;UAG1B,SAAS,IAAI,QAAQ;;;;;AAM/B,SAAgB,qBAAqB,SAAyB;AAC5D,QAAO,gBAAgB,QAAQ,aAAa,QAAQ;;;;;AAMtD,SAAgB,2BAA2B,SAAyB;AAClE,QAAO,4CAA4C,QAAQ;;;sBAGvC,QAAQ;;;;;;AAa9B,SAAS,gBACP,OACA,MACA,QACA,SACA,YAAY,OACG;CACf,MAAM,KAAK,uBAAuB;CAClC,MAAM,SAAS,8BAA8B;AAE7C,KAAI,WAAW;AAEb,KAAG,cAAc,MAAM,GAAG,OAAO,IAAI,OAAO,IAAI;AAChD,SAAO;GAAE;GAAO;GAAM,QAAQ;GAAW;;AAG3C,KAAI,CAAC,GAAG,WAAW,KAAK,CACtB,QAAO;EAAE;EAAO;EAAM,QAAQ;EAAW;AAI3C,KADgB,GAAG,aAAa,KAAK,CACzB,SAAS,OAAO,CAC1B,QAAO;EAAE;EAAO;EAAM,QAAQ;EAAW;CAG3C,MAAM,QAAQ,KAAK,OAAO,IAAI,OAAO,IAAI,OAAO;AAChD,IAAG,eAAe,MAAM,MAAM;AAC9B,QAAO;EAAE;EAAO;EAAM,QAAQ;EAAY;;;;;AAM5C,eAAsB,yBACpB,SACe;CACf,MAAM,KAAK,uBAAuB;CAClC,MAAM,MAAM,wBAAwB;CACpC,MAAM,OAAO,IAAI,OAAO,OAAO,IAAI,IAAI,OAAO,cAAc,IAAI;CAChE,MAAM,UAA2B,EAAE;CAGnC,MAAM,SAAS,GAAG,KAAK,MAAM,UAAU;AACvC,SAAQ,KACN,gBAAgB,QAAQ,QAAQ,qBAAqB,QAAQ,EAAE,QAAQ,CACxE;CAGD,MAAM,QAAQ,GAAG,KAAK,MAAM,SAAS;AACrC,SAAQ,KACN,gBAAgB,OAAO,OAAO,oBAAoB,QAAQ,EAAE,QAAQ,CACrE;CAGD,MAAM,UAAU,GAAG,KAAK,MAAM,WAAW,QAAQ,cAAc;CAC/D,MAAM,WAAW,GAAG,KAAK,SAAS,GAAG,QAAQ,OAAO;AACpD,KAAI,GAAG,WAAW,GAAG,KAAK,MAAM,WAAW,OAAO,CAAC,EAAE;AACnD,MAAI,CAAC,GAAG,WAAW,QAAQ,CACzB,IAAG,UAAU,SAAS,EAAE,WAAW,MAAM,CAAC;AAE5C,UAAQ,KACN,gBACE,QACA,UACA,qBAAqB,QAAQ,EAC7B,SACA,KACD,CACF;;CAIH,MAAM,YAAY,GAAG,KACnB,MACA,aACA,cACA,mCACD;AACD,KAAI,GAAG,WAAW,GAAG,QAAQ,UAAU,CAAC,CACtC,SAAQ,KACN,gBACE,cACA,WACA,2BAA2B,QAAQ,EACnC,QACD,CACF;AAIH,SAAQ,IAAI,yCAAyC;AACrD,MAAK,MAAM,KAAK,QACd,SAAQ,IAAI,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,IAAI,EAAE,KAAK,GAAG;AAEtD,KAAI,QAAQ,OAAO,MAAM,EAAE,WAAW,UAAU,CAC9C,SAAQ,IACN,oFACD;KAED,SAAQ,IACN,2EACD"}