{"version":3,"file":"args.cjs","names":["process","toCamelCase"],"sources":["../../src/node/args.ts"],"sourcesContent":["// Inspired by https://github.com/kof/node-argsparser/blob/master/lib/argsparser.js\n\nimport process from 'node:process'\nimport { toCamelCase } from '../common/data/camelcase'\n\n/**\n * Represents the configuration options for parsing command line arguments.\n */\nexport interface ParseConfig {\n  args?: string[]\n  alias?: Record<string, string[]>\n  normalize?: (value: string) => string\n  booleanArgs?: string | string[]\n  listArgs?: string | string[]\n  numberArgs?: string | string[]\n}\n\n/**\n * Parses command line arguments and returns an object containing the parsed options.\n *\n * @param config - Configuration options for parsing the arguments.\n * @returns An object containing the parsed options.\n */\nexport function parseArgs(config: ParseConfig = {}) {\n  const {\n    args = process.argv.slice(1),\n    alias = {},\n    normalize = toCamelCase,\n    booleanArgs = [],\n    listArgs = [],\n    numberArgs = [],\n  } = config\n\n  const nameToAlias = Object.entries(alias).reduce((map, curr) => {\n    let [name, values] = curr\n    if (typeof values === 'string')\n      values = [values]\n    for (const value of values)\n      map[normalize(value)] = normalize(name)\n\n    return map\n  }, {} as any)\n\n  const opts: Record<string, any> = {\n    _: [],\n  }\n\n  function setOpt(name: string, value: any) {\n    if (opts[name] == null)\n      opts[name] = value\n\n    else if (typeof opts[name] === 'boolean')\n      opts[name] = value\n\n    else if (Array.isArray(opts[name]))\n      opts[name].push(value)\n\n    else\n      opts[name] = [opts[name], value]\n  }\n\n  const argList = [...args]\n  let arg: string | undefined\n\n  // eslint-disable-next-line no-cond-assign\n  while ((arg = argList.shift())) {\n    let value: any\n    if (/^--?/.test(arg)) {\n      let key = arg.replace(/^--?/, '')\n      if (arg.includes('=')) {\n        const [name, valuePart] = key.split('=', 2)\n        key = name.trim()\n        value = valuePart.trim()\n      }\n      key = normalize(key)\n      key = nameToAlias[key] ?? key\n      if (booleanArgs.includes(key)) {\n        setOpt(key, true)\n      }\n      else {\n        value = value ?? argList.shift() ?? ''\n        if (numberArgs.includes(key))\n          value = Number(value ?? 0)\n\n        if (listArgs.includes(key)) {\n          if (Array.isArray(opts[key]))\n            opts[key].push(value)\n\n          else\n            opts[key] = [value]\n        }\n        else {\n          setOpt(key, value)\n        }\n      }\n    }\n    else {\n      opts._.push(arg)\n    }\n  }\n\n  return opts\n}\n"],"mappings":";;;;;;;;;;;;;AAuBA,SAAgB,UAAU,SAAsB,EAAE,EAAE;CAClD,MAAM,EACJ,OAAOA,qBAAQ,KAAK,MAAM,EAAE,EAC5B,QAAQ,EAAE,EACV,YAAYC,2CACZ,cAAc,EAAE,EAChB,WAAW,EAAE,EACb,aAAa,EAAE,KACb;CAEJ,MAAM,cAAc,OAAO,QAAQ,MAAM,CAAC,QAAQ,KAAK,SAAS;EAC9D,IAAI,CAAC,MAAM,UAAU;AACrB,MAAI,OAAO,WAAW,SACpB,UAAS,CAAC,OAAO;AACnB,OAAK,MAAM,SAAS,OAClB,KAAI,UAAU,MAAM,IAAI,UAAU,KAAK;AAEzC,SAAO;IACN,EAAE,CAAQ;CAEb,MAAM,OAA4B,EAChC,GAAG,EAAE,EACN;CAED,SAAS,OAAO,MAAc,OAAY;AACxC,MAAI,KAAK,SAAS,KAChB,MAAK,QAAQ;WAEN,OAAO,KAAK,UAAU,UAC7B,MAAK,QAAQ;WAEN,MAAM,QAAQ,KAAK,MAAM,CAChC,MAAK,MAAM,KAAK,MAAM;MAGtB,MAAK,QAAQ,CAAC,KAAK,OAAO,MAAM;;CAGpC,MAAM,UAAU,CAAC,GAAG,KAAK;CACzB,IAAI;AAGJ,QAAQ,MAAM,QAAQ,OAAO,EAAG;EAC9B,IAAI;AACJ,MAAI,OAAO,KAAK,IAAI,EAAE;GACpB,IAAI,MAAM,IAAI,QAAQ,QAAQ,GAAG;AACjC,OAAI,IAAI,SAAS,IAAI,EAAE;IACrB,MAAM,CAAC,MAAM,aAAa,IAAI,MAAM,KAAK,EAAE;AAC3C,UAAM,KAAK,MAAM;AACjB,YAAQ,UAAU,MAAM;;AAE1B,SAAM,UAAU,IAAI;AACpB,SAAM,YAAY,QAAQ;AAC1B,OAAI,YAAY,SAAS,IAAI,CAC3B,QAAO,KAAK,KAAK;QAEd;AACH,YAAQ,SAAS,QAAQ,OAAO,IAAI;AACpC,QAAI,WAAW,SAAS,IAAI,CAC1B,SAAQ,OAAO,SAAS,EAAE;AAE5B,QAAI,SAAS,SAAS,IAAI,CACxB,KAAI,MAAM,QAAQ,KAAK,KAAK,CAC1B,MAAK,KAAK,KAAK,MAAM;QAGrB,MAAK,OAAO,CAAC,MAAM;QAGrB,QAAO,KAAK,MAAM;;QAKtB,MAAK,EAAE,KAAK,IAAI;;AAIpB,QAAO"}