{"version":3,"sources":["../index.ts","../src/flags.ts","../src/tree.ts","../src/fish.ts","../src/zsh.ts","../src/index.ts"],"sourcesContent":["export * from './src';\n","/** Split flag spellings into short (`-x`), long (`--xy`) and old-style (`-xy`). */\nexport function splitFlags(flags: string[]): { short: string[]; long: string[]; old: string[] } {\n  const short: string[] = [];\n  const long: string[] = [];\n  const old: string[] = [];\n  for (const f of flags) {\n    if (f.startsWith('--')) long.push(f.slice(2));\n    else if (f.startsWith('-') && f.length === 2) short.push(f.slice(1));\n    else if (f.startsWith('-')) old.push(f.slice(1));\n  }\n  return { short, long, old };\n}\n","import type { Command, OpencliSpecJson, Option } from '@xyd-js/opencli';\n\nimport type { CompletionNode, CompletionOption } from './types';\n\n/**\n * Adapt an OpenCLI document into the command tree the shell generators walk.\n * Root-level `recursive` options (a CLI's global flags) are made available on\n * every command, so they complete in any subcommand context too.\n */\nexport function opencliToTree(spec: OpencliSpecJson): CompletionNode {\n  const name = spec.info?.title || 'cli';\n  const rootOptions = (spec.options || []).filter((o) => !o.hidden);\n  const globalOptions = rootOptions.filter((o) => o.recursive);\n\n  const commandNode = (cmd: Command): CompletionNode => ({\n    name: cmd.name,\n    description: cmd.description,\n    options: [\n      ...(cmd.options || []).filter((o) => !o.hidden).map(optionToCompletion),\n      ...globalOptions.map(optionToCompletion),\n    ],\n    commands: toNodeMap(cmd.commands, commandNode),\n  });\n\n  return {\n    name,\n    description: spec.info?.description,\n    options: rootOptions.map(optionToCompletion),\n    commands: toNodeMap(spec.commands, commandNode),\n  };\n}\n\nfunction toNodeMap(commands: Command[] | undefined, node: (c: Command) => CompletionNode): Record<string, CompletionNode> {\n  return Object.fromEntries((commands || []).filter((c) => !c.hidden).map((c) => [c.name, node(c)]));\n}\n\nfunction optionToCompletion(opt: Option): CompletionOption {\n  // OpenCLI option `name` is the canonical long form; aliases may be short or long.\n  const flags = [`--${opt.name}`, ...(opt.aliases || []).map((a) => (a.length === 1 ? `-${a}` : `--${a}`))];\n  return { flags, takesValue: (opt.arguments?.length ?? 0) > 0, description: opt.description };\n}\n","import type { OpencliSpecJson } from '@xyd-js/opencli';\n\nimport { splitFlags } from './flags';\nimport { opencliToTree } from './tree';\nimport type { CompletionNode } from './types';\n\nconst escFish = (s: string) => s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n\n/** Generate a fish completion script from an OpenCLI document. */\nexport function fish(spec: OpencliSpecJson): string {\n  const tree = opencliToTree(spec);\n  const cmd = tree.name;\n  const lines = [`# fish completions for ${cmd} (generated - do not edit)`];\n\n  const walk = (node: CompletionNode, path: string[]) => {\n    const cond =\n      path.length === 0\n        ? '__fish_use_subcommand'\n        : path.map((p) => `__fish_seen_subcommand_from ${p}`).join('; and ');\n\n    const subs = Object.values(node.commands);\n    for (const sub of subs) {\n      const d = sub.description ? ` -d '${escFish(sub.description)}'` : '';\n      lines.push(`complete -c ${cmd} -n \"${cond}\" -f -a \"${sub.name}\"${d}`);\n    }\n    for (const opt of node.options) {\n      const { short, long, old } = splitFlags(opt.flags);\n      const parts = [...short.map((s) => `-s ${s}`), ...long.map((l) => `-l ${l}`), ...old.map((o) => `-o ${o}`)].join(' ');\n      const r = opt.takesValue ? ' -r' : '';\n      const d = opt.description ? ` -d '${escFish(opt.description)}'` : '';\n      lines.push(`complete -c ${cmd} -n \"${cond}\" ${parts}${r}${d}`);\n    }\n    for (const sub of subs) walk(sub, [...path, sub.name]);\n  };\n\n  walk(tree, []);\n  return `${lines.join('\\n')}\\n`;\n}\n","import type { OpencliSpecJson } from '@xyd-js/opencli';\n\nimport { splitFlags } from './flags';\nimport { opencliToTree } from './tree';\nimport type { CompletionOption } from './types';\n\n// Inside an `_arguments` spec's `[...]` description: escape backslash, single\n// quote, and the chars that are syntactically special there (`:` `[` `]` `{` `}`).\nconst escZshSpec = (s: string) =>\n  s\n    .replace(/\\\\/g, '\\\\\\\\')\n    .replace(/'/g, \"'\\\\''\")\n    .replace(/[:[\\]{}]/g, (c) => `\\\\${c}`);\n\n// Inside a `_describe` `'value:desc'` row only the `:` separator (plus quote /\n// backslash) is special — brackets/braces are literal.\nconst escZshDescribe = (s: string) => s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"'\\\\''\").replace(/:/g, '\\\\:');\n\nfunction optToSpec(opt: CompletionOption): string {\n  const { short, long } = splitFlags(opt.flags);\n  const desc = opt.description ? `[${escZshSpec(opt.description)}]` : '';\n  const value = opt.takesValue ? ':value:' : '';\n  const all = [...short.map((s) => `-${s}`), ...long.map((l) => `--${l}`)];\n  if (all.length >= 2) {\n    return `'(${all.join(' ')})'{${all.join(',')}}'${desc}${value}'`;\n  }\n  return `'${all[0]}${desc}${value}'`;\n}\n\n/** Generate a zsh completion script (`#compdef`) from an OpenCLI document. */\nexport function zsh(spec: OpencliSpecJson): string {\n  const tree = opencliToTree(spec);\n  const cmd = tree.name;\n  const subs = Object.values(tree.commands);\n  const hasSubs = subs.length > 0;\n  const out = [`#compdef ${cmd}`, '', `_${cmd}() {`];\n\n  out.push('  local context state state_descr line');\n  out.push('  typeset -A opt_args');\n  out.push('');\n\n  const rootSpecs = tree.options.map(optToSpec);\n  if (hasSubs) {\n    rootSpecs.push(\"'1: :->command'\");\n    rootSpecs.push(\"'*::arg:->args'\");\n  }\n  out.push('  _arguments -C \\\\');\n  out.push(`${rootSpecs.map((s) => `    ${s}`).join(' \\\\\\n')} && return 0`);\n\n  if (hasSubs) {\n    out.push('');\n    out.push('  case $state in');\n    out.push('    command)');\n    out.push('      local -a commands');\n    out.push('      commands=(');\n    for (const sub of subs) {\n      out.push(`        '${sub.name}:${escZshDescribe(sub.description || '')}'`);\n    }\n    out.push('      )');\n    out.push(`      _describe -t commands '${cmd} command' commands`);\n    out.push('      ;;');\n    out.push('    args)');\n    out.push('      case $line[1] in');\n    for (const sub of subs) {\n      out.push(`        ${sub.name})`);\n      const specs = sub.options.map(optToSpec);\n      if (specs.length) {\n        out.push('          _arguments \\\\');\n        out.push(specs.map((s) => `            ${s}`).join(' \\\\\\n'));\n      } else {\n        out.push(\"          _message 'no more arguments'\");\n      }\n      out.push('          ;;');\n    }\n    out.push('      esac');\n    out.push('      ;;');\n    out.push('  esac');\n  }\n\n  out.push('}');\n  out.push('');\n  out.push(`_${cmd} \"$@\"`);\n  return `${out.join('\\n')}\\n`;\n}\n","import type { OpencliSpecJson } from '@xyd-js/opencli';\n\nimport { fish } from './fish';\nimport type { Shell } from './types';\nimport { zsh } from './zsh';\n\nexport { fish } from './fish';\nexport { zsh } from './zsh';\nexport { opencliToTree } from './tree';\nexport type { Shell, CompletionNode, CompletionOption } from './types';\n\n/** Generate a completion script for the given shell from an OpenCLI document. */\nexport function completion(spec: OpencliSpecJson, shell: Shell): string {\n  switch (shell) {\n    case 'fish':\n      return fish(spec);\n    default:\n      return zsh(spec);\n  }\n}\n"],"mappings":"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","names":[]}