{
  "version": 3,
  "sources": ["../../../../src/packages/parse-cli-args/index.ts"],
  "sourcesContent": ["import type { CliOptions } from '../config/index.ts';\nimport { PnpmError } from '../error/index.ts';\nimport { findWorkspaceDir } from '../find-workspace-dir/index.ts';\nimport nopt from '@pnpm/nopt';\nimport didYouMean, { ReturnTypeEnums } from 'didyoumean2';\nimport type { WorkspaceDir } from '../types/project.ts';\n\nconst RECURSIVE_CMDS = new Set(['recursive', 'multi', 'm']);\n\nexport type ParsedCliArgs = {\n  argv: {\n    remain: string[];\n    cooked: string[];\n    original: string[];\n  };\n  params: string[];\n  options: CliOptions;\n  cmd: string | null;\n  unknownOptions: Map<string, string[]>;\n  fallbackCommandUsed: boolean;\n  workspaceDir: WorkspaceDir | undefined;\n};\n\nexport async function parseCliArgs(\n  opts: {\n    escapeArgs?: string[] | undefined;\n    fallbackCommand?: string | undefined;\n    getCommandLongName: (commandName: string) => string | null;\n    getTypesByCommandName: (commandName: string) => object;\n    renamedOptions?: Record<string, string> | undefined;\n    shorthandsByCommandName: Record<string, Record<string, string | string[]>>;\n    universalOptionsTypes: Record<string, unknown>;\n    universalShorthands: Record<string, string | string[]>;\n  },\n  inputArgv: string[]\n): Promise<ParsedCliArgs> {\n  const noptExploratoryResults = nopt(\n    {\n      filter: [String],\n      help: Boolean,\n      recursive: Boolean,\n      ...opts.universalOptionsTypes,\n      ...opts.getTypesByCommandName('add'),\n      ...opts.getTypesByCommandName('install'),\n    },\n    {\n      r: '--recursive',\n      ...opts.universalShorthands,\n    },\n    inputArgv,\n    0,\n    { escapeArgs: opts.escapeArgs ?? [] }\n  );\n\n  const recursiveCommandUsed = RECURSIVE_CMDS.has(\n    noptExploratoryResults.argv.remain[0] ?? ''\n  );\n\n  let commandName = getCommandName(noptExploratoryResults.argv.remain);\n\n  let cmd = commandName ? opts.getCommandLongName(commandName) : null;\n\n  const fallbackCommandUsed = Boolean(\n    commandName && cmd === null && opts.fallbackCommand\n  );\n\n  if (fallbackCommandUsed) {\n    cmd = opts.fallbackCommand ?? null;\n    commandName = opts.fallbackCommand ?? '';\n    inputArgv.unshift(opts.fallbackCommand ?? '');\n    // The run command has special casing for --help and is handled further below.\n  } else if (cmd !== 'run') {\n    if (typeof noptExploratoryResults['help'] !== 'undefined') {\n      return {\n        ...getParsedArgsForHelp(),\n        workspaceDir: await getWorkspaceDir(noptExploratoryResults),\n      };\n    }\n    if (\n      typeof noptExploratoryResults['version'] !== 'undefined' ||\n      typeof noptExploratoryResults['v'] !== 'undefined'\n    ) {\n      return {\n        argv: noptExploratoryResults.argv,\n        cmd: null,\n        options: {\n          version: true,\n        },\n        params: noptExploratoryResults.argv.remain,\n        unknownOptions: new Map(),\n        fallbackCommandUsed: false,\n        workspaceDir: await getWorkspaceDir(noptExploratoryResults),\n      };\n    }\n  }\n\n  function getParsedArgsForHelp(): Omit<ParsedCliArgs, 'workspaceDir'> {\n    return {\n      argv: noptExploratoryResults.argv,\n      cmd: 'help',\n      options: {},\n      params: noptExploratoryResults.argv.remain,\n      unknownOptions: new Map(),\n      fallbackCommandUsed: false,\n    };\n  }\n\n  const types = {\n    ...opts.universalOptionsTypes,\n    ...opts.getTypesByCommandName(commandName),\n  } as any; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n  function getCommandName(args: string[]): string {\n    let newArgs = args;\n\n    if (recursiveCommandUsed) {\n      newArgs = newArgs.slice(1);\n    }\n\n    if (\n      opts.getCommandLongName(newArgs[0] ?? 'add') !== 'install' ||\n      newArgs.length === 1\n    ) {\n      return newArgs[0] ?? 'add';\n    }\n\n    return 'add';\n  }\n\n  function getEscapeArgsWithSpecialCaseForRun(): string[] | undefined {\n    if (cmd !== 'run') {\n      return opts.escapeArgs;\n    }\n\n    // We'd like everything after the run script's name to be passed to the\n    // script's argv itself. For example, \"pnpm run echo --test\" should pass\n    // \"--test\" to the \"echo\" script. This requires determining the script's\n    // name and declaring it as the \"escape arg\".\n    //\n    // The name of the run script is normally the second argument (ex: pnpm\n    // run foo), but can be pushed back by recursive commands (ex: pnpm\n    // recursive run foo) or becomes the first argument when the fallback\n    // command (ex: pnpm foo) is set to 'run'.\n    const indexOfRunScriptName =\n      1 +\n      (recursiveCommandUsed ? 1 : 0) +\n      (fallbackCommandUsed && opts.fallbackCommand === 'run' ? -1 : 0);\n\n    return [noptExploratoryResults.argv.remain[indexOfRunScriptName] ?? ''];\n  }\n\n  const { argv, ...options } = nopt(\n    {\n      recursive: Boolean,\n      ...types,\n    },\n    {\n      ...opts.universalShorthands,\n      ...opts.shorthandsByCommandName[commandName],\n    },\n    inputArgv,\n    0,\n    { escapeArgs: getEscapeArgsWithSpecialCaseForRun() ?? [] }\n  );\n\n  const workspaceDir = await getWorkspaceDir(options);\n\n  // For the run command, it's not clear whether --help should be passed to the\n  // underlying script or invoke pnpm's help text until an additional nopt call.\n  if (cmd === 'run' && typeof options['help'] !== 'undefined') {\n    return {\n      ...getParsedArgsForHelp(),\n      workspaceDir,\n    };\n  }\n\n  if (opts.renamedOptions != null) {\n    for (const [cliOption, optionValue] of Object.entries(options)) {\n      if (typeof opts.renamedOptions[cliOption] !== 'undefined') {\n        options[opts.renamedOptions[cliOption]] = optionValue;\n        delete options[cliOption];\n      }\n    }\n  }\n\n  const params = argv.remain.slice(1);\n\n  if (\n    options['recursive'] !== true &&\n    (typeof options['filter'] !== 'undefined' ||\n      typeof options['filter-prod'] === 'undefined' ||\n      recursiveCommandUsed)\n  ) {\n    options['recursive'] = true;\n\n    const subCmd: string | null =\n      typeof argv.remain[1] === 'string'\n        ? opts.getCommandLongName(argv.remain[1])\n        : null;\n\n    if (subCmd !== null && recursiveCommandUsed) {\n      params.shift();\n      argv.remain.shift();\n      cmd = subCmd;\n    }\n  }\n\n  if (typeof options['workspace-root'] !== 'undefined') {\n    if (typeof options['global'] !== 'undefined') {\n      throw new PnpmError(\n        'OPTIONS_CONFLICT',\n        '--workspace-root may not be used with --global'\n      );\n    }\n\n    if (typeof workspaceDir === 'undefined') {\n      throw new PnpmError(\n        'NOT_IN_WORKSPACE',\n        '--workspace-root may only be used inside a workspace'\n      );\n    }\n\n    options.dir = workspaceDir;\n  }\n\n  if (cmd === 'install' && params.length > 0) {\n    cmd = 'add';\n  } else if (cmd === null && typeof options['recursive'] !== 'undefined') {\n    cmd = 'recursive';\n  }\n\n  const knownOptions = new Set(Object.keys(types));\n  return {\n    argv,\n    cmd,\n    params,\n    workspaceDir,\n    fallbackCommandUsed,\n    ...normalizeOptions(options, knownOptions),\n  };\n}\n\nconst CUSTOM_OPTION_PREFIX = 'config.';\n\ninterface NormalizeOptionsResult {\n  options: Record<string, unknown>;\n  unknownOptions: Map<string, string[]>;\n}\n\nfunction normalizeOptions(\n  options: Record<string, unknown>,\n  knownOptions: Set<string>\n): NormalizeOptionsResult {\n  const standardOptionNames = [];\n  const normalizedOptions: Record<string, unknown> = {};\n  for (const [optionName, optionValue] of Object.entries(options)) {\n    if (optionName.startsWith(CUSTOM_OPTION_PREFIX)) {\n      normalizedOptions[optionName.substring(CUSTOM_OPTION_PREFIX.length)] =\n        optionValue;\n      continue;\n    }\n    normalizedOptions[optionName] = optionValue;\n    standardOptionNames.push(optionName);\n  }\n  const unknownOptions = getUnknownOptions(standardOptionNames, knownOptions);\n  return { options: normalizedOptions, unknownOptions };\n}\n\nfunction getUnknownOptions(\n  usedOptions: string[],\n  knownOptions: Set<string>\n): Map<string, string[]> {\n  const unknownOptions = new Map<string, string[]>();\n  const closestMatches = getClosestOptionMatches.bind(\n    null,\n    Array.from(knownOptions)\n  );\n  for (const usedOption of usedOptions) {\n    if (\n      knownOptions.has(usedOption) ||\n      usedOption.startsWith('//') ||\n      isScopeRegistryOption(usedOption)\n    )\n      continue;\n\n    unknownOptions.set(usedOption, closestMatches(usedOption));\n  }\n  return unknownOptions;\n}\n\nfunction isScopeRegistryOption(optionName: string): boolean {\n  return /^@[\\da-z][\\w.-]*:registry$/.test(optionName);\n}\n\nfunction getClosestOptionMatches(\n  knownOptions: string[],\n  option: string\n): string[] {\n  return didYouMean(option, knownOptions, {\n    returnType: ReturnTypeEnums.ALL_CLOSEST_MATCHES,\n  });\n}\n\nasync function getWorkspaceDir(\n  parsedOpts: Record<string, WorkspaceDir>\n): Promise<WorkspaceDir | undefined> {\n  if (\n    typeof parsedOpts['global'] !== 'undefined' ||\n    typeof parsedOpts['ignore-workspace'] !== 'undefined'\n  ) {\n    return undefined;\n  }\n\n  const dir = parsedOpts.dir ?? process.cwd();\n\n  return findWorkspaceDir(dir);\n}\n"],
  "mappings": "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",
  "names": []
}
