{"record":{"id":"a81481db4dfbef2e","repo":"yarnpkg/yarn","slug":"missingadddependencies","errorCode":null,"errorMessage":"missingAddDependencies","messagePattern":"missingAddDependencies","errorType":"exception","errorClass":"MessageError","httpStatus":null,"severity":"error","filePath":"src/cli/commands/add.js","lineNumber":308,"sourceCode":"export function hasWrapper(commander: Object): boolean {\n  return true;\n}\n\nexport function setFlags(commander: Object) {\n  commander.description('Installs a package and any packages that it depends on.');\n  commander.usage('add [packages ...] [flags]');\n  commander.option('-W, --ignore-workspace-root-check', 'required to run yarn add inside a workspace root');\n  commander.option('-D, --dev', 'save package to your `devDependencies`');\n  commander.option('-P, --peer', 'save package to your `peerDependencies`');\n  commander.option('-O, --optional', 'save package to your `optionalDependencies`');\n  commander.option('-E, --exact', 'install exact version');\n  commander.option('-T, --tilde', 'install most recent release with the same minor version');\n  commander.option('-A, --audit', 'Run vulnerability audit on installed packages');\n}\n\nexport async function run(config: Config, reporter: Reporter, flags: Object, args: Array<string>): Promise<void> {\n  if (!args.length) {\n    throw new MessageError(reporter.lang('missingAddDependencies'));\n  }\n\n  const lockfile = await Lockfile.fromDirectory(config.lockfileFolder, reporter);\n\n  await wrapLifecycle(config, flags, async () => {\n    const install = new Add(args, flags, config, reporter, lockfile);\n    await install.init();\n  });\n}\n","sourceCodeStart":290,"sourceCodeEnd":318,"githubUrl":"https://github.com/yarnpkg/yarn/blob/c2dda503f3759b5be5f0e24ecd9cf5c97a540147/src/cli/commands/add.js#L290-L318","documentation":"Thrown by the `yarn add` entry point when no package arguments are supplied. The lang string is 'Missing list of packages to add to your project.' `add.js:308` checks `if (!args.length)` immediately after parsing argv, before any install logic runs, so it is a pure argument-validation failure.","triggerScenarios":"Invoking `run(config, reporter, flags, args)` for the `add` command with an empty `args` array (e.g. `yarn add` with nothing after it).","commonSituations":"Typo such as `yarn add ` with a trailing space, a shell alias/script that forwards an empty variable (`yarn add $PKG` where `$PKG` is unset), or misuse of the programmatic API.","solutions":["Supply at least one package specifier: `yarn add lodash@^4.17.0`.","If scripting, default the variable: `yarn add \"${PKG:?PKG is required}\"`.","When calling `run(...)` programmatically, assert `args.length >= 1` first."],"exampleFix":"// before\nawait run(config, reporter, flags, []);  // throws\n\n// after\nawait run(config, reporter, flags, ['lodash']);","handlingStrategy":"validation","validationCode":"function requireAddArgs(args: string[]): string[] {\n  if (!Array.isArray(args) || args.length === 0) {\n    throw new Error('yarn add requires at least one package specifier');\n  }\n  return args;\n}\n// const safeArgs = requireAddArgs(args); await run(config, reporter, flags, safeArgs);","typeGuard":"function hasAddArgs(args: unknown): args is string[] {\n  return Array.isArray(args) && args.length > 0;\n}","tryCatchPattern":null,"preventionTips":["Wrap script variables with `${VAR:?msg}` so an unset variable aborts the shell.","Unit-test wrappers that forward argv to confirm at least one positional arg."],"tags":["yarn-add","arguments","validation"],"backgroundTag":null,"analyzedSha":"c2dda503f3759b5be5f0e24ecd9cf5c97a540147","analyzedAt":"2026-08-13T04:17:06.305Z","schemaVersion":2},"datasetVersion":"2026-08-13T09:17:06.757Z"}