(raw: &str, package_json_path: &Path)
| 422 | |
| 423 | impl ConfiguredPackageManager { |
| 424 | fn parse(raw: &str, package_json_path: &Path) -> Result<Self> { |
| 425 | let raw = raw.trim(); |
| 426 | |
| 427 | let separator_count = raw.matches('@').count(); |
| 428 | if separator_count == 0 && matches!(raw, "yarn" | "pnpm") { |
| 429 | let correction = SupportedPackageManager::from_command(raw) |
| 430 | .expect("validated supported package manager") |
| 431 | .example_package_manager_value(); |
| 432 | return Err(package_manager_invalid_input( |
| 433 | format!( |
| 434 | "Missing packageManager version for manager '{raw}' in {}", |
| 435 | package_json_path.display() |
| 436 | ), |
| 437 | format!("Use an exact value such as `\"packageManager\": \"{correction}\"`."), |
| 438 | package_manager_diagnostics(PackageManagerDiagnosticsInput { |
| 439 | package_json_path, |
| 440 | raw_value: Some(raw), |
| 441 | received_type: None, |
| 442 | failed_part: "version", |
| 443 | problem: "missing-version", |
| 444 | manager: Some(raw), |
| 445 | version: None, |
| 446 | correction: json!(correction), |
| 447 | }), |
| 448 | )); |
| 449 | } |
| 450 | |
| 451 | if separator_count != 1 { |
| 452 | return Err(package_manager_invalid_input( |
| 453 | format!( |
| 454 | "Invalid packageManager separator in {} (value={raw})", |
| 455 | package_json_path.display() |
| 456 | ), |
| 457 | "Use exactly one `@` separator in `<manager>@<exact-semver>`, for example \ |
| 458 | `yarn@4.13.0` or `pnpm@10.32.1`.", |
| 459 | package_manager_diagnostics(PackageManagerDiagnosticsInput { |
| 460 | package_json_path, |
| 461 | raw_value: Some(raw), |
| 462 | received_type: None, |
| 463 | failed_part: "separator", |
| 464 | problem: "malformed-separator", |
| 465 | manager: None, |
| 466 | version: None, |
| 467 | correction: json!(["yarn@4.13.0", "pnpm@10.32.1"]), |
| 468 | }), |
| 469 | )); |
| 470 | } |
| 471 | |
| 472 | let (manager_raw, version_raw) = raw |
| 473 | .split_once('@') |
| 474 | .expect("validated exactly one packageManager separator"); |
| 475 | |
| 476 | if manager_raw.is_empty() { |
| 477 | return Err(package_manager_invalid_input( |
| 478 | format!( |
| 479 | "Invalid packageManager manager in {} (value={raw})", |
| 480 | package_json_path.display() |
| 481 | ), |
nothing calls this directly
no test coverage detected