{"version":3,"file":"utils.cjs","names":[],"sources":["../../src/lib/utils.ts"],"sourcesContent":["import { type Expand, getFileSystemProvider } from '@cli-forge/parser';\nimport { CLI } from './public-api';\n\nexport function getCallingFile() {\n  // Since this function lives in a utility file, the parent file\n  // would just be the file that invokes getCallingFile... We actually\n  // want the parent of the file that calls this, which is this file's\n  // grandparent.\n  let grandparentFile: string | undefined;\n\n  // Overrides prepare stack trace to be an identity fn, to get the callsites\n  // associated with the current error.\n  const _pst = Error.prepareStackTrace;\n  Error.prepareStackTrace = function (err, stack) {\n    return stack;\n  };\n\n  try {\n    const err = new Error();\n    const callsites = err.stack as any as NodeJS.CallSite[];\n\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    const currentfile = callsites.shift()!.getFileName();\n    let parentfile: string | undefined;\n\n    while (callsites.length) {\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n      const callerfile = callsites.shift()!.getFileName();\n\n      // We've reached the parent file\n      if (currentfile !== callerfile) {\n        // We've reached the grandparent file\n        if (parentfile && parentfile !== callerfile) {\n          grandparentFile = parentfile;\n          break;\n        }\n        parentfile = callerfile;\n      }\n    }\n  } finally {\n    Error.prepareStackTrace = _pst;\n  }\n\n  return grandparentFile;\n}\n\nexport function getParentPackageJson(searchPath: string) {\n  const fs = getFileSystemProvider();\n\n  let currentPath = searchPath;\n  let packageJsonPath: string | undefined;\n\n   \n  while (true) {\n    const packagePath = fs.join(currentPath, 'package.json');\n\n    if (fs.existsSync(packagePath)) {\n      packageJsonPath = packagePath;\n      break;\n    }\n\n    const nextPath = fs.resolve(currentPath, '..');\n\n    if (nextPath === currentPath) {\n      break;\n    }\n\n    currentPath = nextPath;\n  }\n\n  if (!packageJsonPath) {\n    throw new Error('Could not find package.json');\n  }\n\n  return JSON.parse(fs.readFileSync(packageJsonPath)) as {\n    name: string;\n    version: string;\n    bin?: {\n      [cmd: string]: string;\n    };\n    dependencies?: Record<string, string>;\n  };\n}\n\nexport function stringToArgs(str: string) {\n  const quotePairs = new Map<string, string>([\n    ['\"', '\"'],\n    [\"'\", \"'\"],\n    ['`', '`'],\n  ]);\n  const escapeChars = new Set(['\\\\']);\n\n  let activeQuote: string | undefined;\n\n  const args = [];\n  let currentArg = '';\n\n  let prev: string | undefined;\n  for (let i = 0; i < str.length; i++) {\n    const char = str[i];\n    if (activeQuote) {\n       \n      while (true) {\n        if (i >= str.length) {\n          break;\n        } else if (\n          str[i] === quotePairs.get(activeQuote) &&\n          !(prev && escapeChars.has(prev))\n        ) {\n          break;\n        }\n        if (!escapeChars.has(str[i])) {\n          currentArg += str[i];\n        }\n        prev = str[i];\n        i++;\n      }\n      activeQuote = undefined;\n    } else if (quotePairs.has(char) && !(prev && escapeChars.has(prev))) {\n      activeQuote = char;\n    } else if (\n      char === ' ' &&\n      prev !== ' ' &&\n      !(prev && escapeChars.has(prev))\n    ) {\n      args.push(currentArg);\n      currentArg = '';\n    } else if (!escapeChars.has(char) || (prev && escapeChars.has(prev))) {\n      currentArg += char;\n    }\n    prev = char;\n  }\n  args.push(currentArg);\n  return args;\n}\n\n/**\n * Resolves the arguments added to a CLI instance by a builder function. Useful\n * for typing the arguments of a command handler when using composable builders.\n *\n * @typeParam T - A function that takes a CLI instance and returns a new CLI instance with additional options, commands etc.\n */\nexport type ArgumentsOf<T> = T extends (...args: any[]) => CLI<infer TArgs>\n  ? Expand<TArgs>\n  : never;\n"],"mappings":";;;;AAGA,SAAgB,iBAAiB;CAK/B,IAAI;CAIJ,MAAM,OAAO,MAAM;AACnB,OAAM,oBAAoB,SAAU,KAAK,OAAO;AAC9C,SAAO;;AAGT,KAAI;EAEF,MAAM,6BADM,IAAI,OAAO,EACD;EAGtB,MAAM,cAAc,UAAU,OAAO,CAAE,aAAa;EACpD,IAAI;AAEJ,SAAO,UAAU,QAAQ;GAEvB,MAAM,aAAa,UAAU,OAAO,CAAE,aAAa;AAGnD,OAAI,gBAAgB,YAAY;AAE9B,QAAI,cAAc,eAAe,YAAY;AAC3C,uBAAkB;AAClB;;AAEF,iBAAa;;;WAGT;AACR,QAAM,oBAAoB;;AAG5B,QAAO;;AAGT,SAAgB,qBAAqB,YAAoB;CACvD,MAAM,MAAA,GAAA,kBAAA,wBAA4B;CAElC,IAAI,cAAc;CAClB,IAAI;AAGJ,QAAO,MAAM;EACX,MAAM,cAAc,GAAG,KAAK,aAAa,eAAe;AAExD,MAAI,GAAG,WAAW,YAAY,EAAE;AAC9B,qBAAkB;AAClB;;EAGF,MAAM,WAAW,GAAG,QAAQ,aAAa,KAAK;AAE9C,MAAI,aAAa,YACf;AAGF,gBAAc;;AAGhB,KAAI,CAAC,gBACH,OAAM,IAAI,MAAM,8BAA8B;AAGhD,QAAO,KAAK,MAAM,GAAG,aAAa,gBAAgB,CAAC;;AAUrD,SAAgB,aAAa,KAAa;CACxC,MAAM,aAAa,IAAI,IAAoB;EACzC,CAAC,MAAK,KAAI;EACV,CAAC,KAAK,IAAI;EACV,CAAC,KAAK,IAAI;EACX,CAAC;CACF,MAAM,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC;CAEnC,IAAI;CAEJ,MAAM,OAAO,EAAE;CACf,IAAI,aAAa;CAEjB,IAAI;AACJ,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;EACnC,MAAM,OAAO,IAAI;AACjB,MAAI,aAAa;AAEf,UAAO,MAAM;AACX,QAAI,KAAK,IAAI,OACX;aAEA,IAAI,OAAO,WAAW,IAAI,YAAY,IACtC,EAAE,QAAQ,YAAY,IAAI,KAAK,EAE/B;AAEF,QAAI,CAAC,YAAY,IAAI,IAAI,GAAG,CAC1B,eAAc,IAAI;AAEpB,WAAO,IAAI;AACX;;AAEF,iBAAc,KAAA;aACL,WAAW,IAAI,KAAK,IAAI,EAAE,QAAQ,YAAY,IAAI,KAAK,EAChE,eAAc;WAEd,SAAS,OACT,SAAS,OACT,EAAE,QAAQ,YAAY,IAAI,KAAK,GAC/B;AACA,QAAK,KAAK,WAAW;AACrB,gBAAa;aACJ,CAAC,YAAY,IAAI,KAAK,IAAK,QAAQ,YAAY,IAAI,KAAK,CACjE,eAAc;AAEhB,SAAO;;AAET,MAAK,KAAK,WAAW;AACrB,QAAO"}