{"version":3,"file":"completion-types.mjs","names":[],"sources":["../../src/lib/completion-types.ts"],"sourcesContent":["import type { ParsedArgs } from '@cli-forge/parser';\nimport { getFileSystemProvider } from '@cli-forge/parser';\n\n/**\n * Context passed to completion callbacks.\n */\nexport interface CompletionContext<TArgs = ParsedArgs> {\n  /** Partially-parsed args available so far */\n  current: Partial<TArgs>;\n  /** The raw argv being completed */\n  argv: string[];\n  /** Default completions cli-forge would return (subcommands, flags, choices) */\n  defaultCompletions: string[];\n}\n\n/**\n * A completion callback that returns custom completion suggestions.\n * Used with `.completion()` on a CLI instance.\n */\nexport type CompletionCallback<TArgs = ParsedArgs> = (\n  context: CompletionContext<TArgs>\n) => string[] | Promise<string[]>;\n\n/**\n * Per-option completion callback, attached to option configs via the `completion` field.\n */\nexport type OptionCompletionCallback<TArgs = ParsedArgs> = (\n  context: CompletionContext<TArgs>\n) => string[] | Promise<string[]>;\n\n/**\n * Helpers for common completion scenarios.\n */\nexport const completionHelpers = {\n  /**\n   * Returns a completion callback that suggests filesystem paths.\n   * @param glob Optional glob pattern to filter results (e.g. '*.json')\n   */\n  files(glob?: string): OptionCompletionCallback {\n    return ({ argv }) => {\n      const fs = getFileSystemProvider();\n      const partial = argv[argv.length - 1] || '';\n      const dir = partial ? fs.dirname(partial) : '.';\n      const prefix = partial ? fs.basename(partial) : '';\n\n      try {\n        let entries: string[] = fs.readdirSync(dir === '' ? '.' : dir);\n\n        if (prefix) {\n          entries = entries.filter((e) => e.startsWith(prefix));\n        }\n\n        if (glob) {\n          // Simple extension filter for patterns like '*.json'\n          const ext = glob.startsWith('*.') ? glob.slice(1) : null;\n          if (ext) {\n            entries = entries.filter((e) => e.endsWith(ext));\n          }\n        }\n\n        return entries.map((e) => (dir === '.' ? e : fs.join(dir, e)));\n      } catch {\n        return [];\n      }\n    };\n  },\n};\n"],"mappings":";;;;;AAiCA,MAAa,oBAAoB,EAK/B,MAAM,MAAyC;AAC7C,SAAQ,EAAE,WAAW;EACnB,MAAM,KAAK,uBAAuB;EAClC,MAAM,UAAU,KAAK,KAAK,SAAS,MAAM;EACzC,MAAM,MAAM,UAAU,GAAG,QAAQ,QAAQ,GAAG;EAC5C,MAAM,SAAS,UAAU,GAAG,SAAS,QAAQ,GAAG;AAEhD,MAAI;GACF,IAAI,UAAoB,GAAG,YAAY,QAAQ,KAAK,MAAM,IAAI;AAE9D,OAAI,OACF,WAAU,QAAQ,QAAQ,MAAM,EAAE,WAAW,OAAO,CAAC;AAGvD,OAAI,MAAM;IAER,MAAM,MAAM,KAAK,WAAW,KAAK,GAAG,KAAK,MAAM,EAAE,GAAG;AACpD,QAAI,IACF,WAAU,QAAQ,QAAQ,MAAM,EAAE,SAAS,IAAI,CAAC;;AAIpD,UAAO,QAAQ,KAAK,MAAO,QAAQ,MAAM,IAAI,GAAG,KAAK,KAAK,EAAE,CAAE;UACxD;AACN,UAAO,EAAE;;;GAIhB"}