@@ -396,23 +396,39 @@ class VersionSolver {
396396 return null ; // when unsatisfied.isEmpty
397397 }
398398
399- bool isDirectAndStable (String packageName) {
400- final dep = _root.pubspec.dependencies[packageName];
401- if (dep == null ) return false ; // not a direct dependency
402- final constraint = dep.constraint;
403- if (constraint is Version ) {
404- return ! constraint.isPreRelease;
399+ // Prereleases are allowed only if the dependency is transitive, or if
400+ // the constraint explicitly allows prereleases.
401+ bool shouldAllowPrereleases (String packageName) {
402+ final workspaces = [_root, ..._root.workspaceChildren];
403+ bool constraintContainsPrerelease (VersionConstraint ? constraint) {
404+ if (constraint is Version ) {
405+ return constraint.isPreRelease;
406+ }
407+ if (constraint is VersionRange ) {
408+ return (constraint.min != null && constraint.min! .isPreRelease) ||
409+ (constraint.max != null && constraint.max! .isPreRelease) ||
410+ constraint.isAny;
411+ }
412+ return false ;
405413 }
406- if (constraint is VersionRange && constraint.min != null ) {
407- return ! constraint.min! .isPreRelease;
414+ var isDirectOrDev = false ;
415+ for (final workspace in workspaces) {
416+ final directDep = workspace.dependencies[packageName];
417+ if (directDep != null && constraintContainsPrerelease (directDep.constraint)) {
418+ return true ;
419+ }
420+ final devDep = workspace.devDependencies[packageName];
421+ if (devDep != null && constraintContainsPrerelease (devDep.constraint)) {
422+ return true ;
423+ }
424+ isDirectOrDev = isDirectOrDev || directDep != null || devDep != null ;
408425 }
409- return false ;
426+ return ! isDirectOrDev ;
410427 }
411428
412429 PackageId ? version;
413430 try {
414- // Prereleases are allowed only if not direct or not stable.
415- final allowPrereleases = ! isDirectAndStable (package.name);
431+ final allowPrereleases = shouldAllowPrereleases (package.name);
416432 version = await _packageLister (
417433 package,
418434 ).bestVersion (package.constraint, allowPrereleases: allowPrereleases);
0 commit comments