{"record":{"id":"77476231e3fa2624","repo":"yarnpkg/yarn","slug":"invalidpackagename-774762","errorCode":null,"errorMessage":"invalidPackageName","messagePattern":"invalidPackageName","errorType":"exception","errorClass":"MessageError","httpStatus":null,"severity":"error","filePath":"src/cli/commands/owner.js","lineNumber":32,"sourceCode":"  success: string,\n  error: string,\n};\n\nexport async function mutate(\n  args: Array<string>,\n  config: Config,\n  reporter: Reporter,\n  buildMessages: (username: string, packageName: string) => Messages,\n  mutator: (user: Object, pkg: Object) => boolean,\n): Promise<boolean> {\n  if (args.length !== 2 && args.length !== 1) {\n    return false;\n  }\n\n  const username = args.shift();\n  const name = await getName(args, config);\n  if (!isValidPackageName(name)) {\n    throw new MessageError(reporter.lang('invalidPackageName'));\n  }\n\n  const msgs = buildMessages(username, name);\n  reporter.step(1, 3, reporter.lang('loggingIn'));\n  const revoke = await getToken(config, reporter, name);\n\n  reporter.step(2, 3, msgs.info);\n  const user = await config.registries.npm.request(`-/user/org.couchdb.user:${username}`);\n  let error = false;\n  if (user) {\n    // get package\n    const pkg = await config.registries.npm.request(NpmRegistry.escapeName(name));\n    if (pkg) {\n      pkg.maintainers = pkg.maintainers || [];\n      error = mutator({name: user.name, email: user.email}, pkg);\n    } else {\n      error = true;\n      reporter.error(reporter.lang('unknownPackage', name));","sourceCodeStart":14,"sourceCodeEnd":50,"githubUrl":"https://github.com/yarnpkg/yarn/blob/c2dda503f3759b5be5f0e24ecd9cf5c97a540147/src/cli/commands/owner.js#L14-L50","documentation":"Before mutating package owners, the owner command resolves the package name and validates it with `isValidPackageName(name)` (owner.js:31). If the name fails npm naming rules, it throws invalidPackageName before contacting the registry.","triggerScenarios":"Running `yarn owner add/remove <user> <pkg>` where `<pkg>` contains uppercase letters, spaces, leading dots/underscores, invalid special chars, or a malformed scope like `@scope` without a name.","commonSituations":"Passing a display name instead of the package identifier; copy-pasting a scoped name with a typo; using a local folder name that doesn't match the published name.","solutions":["Use the exact published package name (check it on the registry or in package.json `name`).","For scoped packages pass `@scope/name` with lowercase alphanumeric, hyphens, and underscores only.","Avoid uppercase, spaces, and leading punctuation in the name argument."],"exampleFix":"// before\n$ yarn owner add alice My-Lib\n// after\n$ yarn owner add alice my-lib","handlingStrategy":"validation","validationCode":"// Mirror npm's package-name rules before calling owner commands\nfunction isValidPackageName(name) {\n  return /^(?:@[a-z0-9-~][a-z0-9-._~]*\\/)?[a-z0-9-~][a-z0-9-._~]*$/.test(name);\n}\nif (!isValidPackageName(pkgName)) {\n  throw new Error(`'${pkgName}' is not a valid npm package name.`);\n}","typeGuard":"function isValidPackageName(name) {\n  return typeof name === 'string' &&\n    /^(?:@[a-z0-9-~][a-z0-9-._~]*\\/)?[a-z0-9-~][a-z0-9-._~]*$/.test(name);\n}","tryCatchPattern":"try {\n  await runYarn(['owner', verb, user, pkgName]);\n} catch (e) {\n  if (/invalidPackageName/.test(e.message)) {\n    console.error(`'${pkgName}' must be lowercase, no spaces, valid scope.`);\n    return;\n  }\n  throw e;\n}","preventionTips":["Always pass the exact published `name` from package.json.","Validate scoped names with `@scope/name` lowercase form.","Never substitute a display title for the package identifier."],"tags":["cli","owner","validation","package-name"],"backgroundTag":null,"analyzedSha":"c2dda503f3759b5be5f0e24ecd9cf5c97a540147","analyzedAt":"2026-08-13T04:17:06.305Z","schemaVersion":2},"datasetVersion":"2026-08-13T09:17:06.757Z"}