{"record":{"id":"03cc445747d5f519","repo":"remix-run/remix","slug":"could-not-derive-a-valid-package-name-from-inpu","errorCode":null,"errorMessage":"Could not derive a valid package name from \"${input}\".","messagePattern":"Could not derive a valid package name from \"(.+?)\"\\.","errorType":"exception","errorClass":"UsageError","httpStatus":null,"severity":"error","filePath":"packages/cli/src/lib/bootstrap-project.ts","lineNumber":247,"sourceCode":"\n  return parts\n    .map((part) => {\n      let head = part.slice(0, 1).toUpperCase()\n      let tail = part.slice(1)\n      return `${head}${tail}`\n    })\n    .join(' ')\n}\n\nfunction toPackageName(value: string): string {\n  let packageName = value\n    .trim()\n    .toLowerCase()\n    .replace(/[^a-z0-9]+/g, '-')\n    .replace(/^-+|-+$/g, '')\n\n  if (packageName.length === 0) {\n    throw invalidPackageName(value)\n  }\n\n  return packageName\n}\n","sourceCodeStart":229,"sourceCodeEnd":252,"githubUrl":"https://github.com/remix-run/remix/blob/9696913134be3a4423513d2775f7b31d6917c049/packages/cli/src/lib/bootstrap-project.ts#L229-L252","documentation":"The CLI normalizes a raw app name into a package name (lowercase, non-alphanumerics collapsed to hyphens, trimmed). If the result is the empty string, the input contained no usable characters and no valid package name can be derived.","triggerScenarios":"toPackageName receives an input consisting solely of non-alphanumeric characters (e.g. '---', '!!!', '_____'), so after sanitization packageName.length === 0.","commonSituations":"Directory names made only of symbols/dashes; shell quoting mistakes producing an empty or symbolic string; programmatic appName values from unvalidated user input.","solutions":["Choose a name containing at least one letter or digit","Rename the target directory to something alphanumeric","Validate user-supplied names before passing to the CLI in tooling"],"exampleFix":"# before\n$ remix new '---'\n\n# after\n$ remix new my-app","handlingStrategy":"type-guard","validationCode":"function derivesPackageName(input: string): boolean {\n  return input.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '').length > 0\n}","typeGuard":"function isValidAppName(input: string): input is string {\n  return /^[a-zA-Z0-9]/.test(input.trim()) && /[a-zA-Z0-9]/.test(input)\n}","tryCatchPattern":"try {\n  await bootstrapProject(options)\n} catch (error) {\n  if (/valid package name/.test(error.message)) promptForName()\n  else throw error\n}","preventionTips":["Require at least one alphanumeric character in scaffolded names","Validate interactive input before invoking the CLI","Use npm naming rules as a UX guide when prompting"],"tags":["cli","scaffolding","package-name","validation"],"backgroundTag":"invalid-package-name","analyzedSha":"9696913134be3a4423513d2775f7b31d6917c049","analyzedAt":"2026-08-27T19:55:01.024Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}