From a9915be1abec7ede6729c2077e1f4ea222d1a950 Mon Sep 17 00:00:00 2001 From: Felix Angelov Date: Fri, 17 Oct 2025 15:05:06 -0500 Subject: [PATCH 1/3] fix(dart_frog_cli): support workspace root `pubspec_overrides.yaml` --- .../src/create_external_packages_folder.dart | 12 +++- .../lib/src/disable_workspace_resolution.dart | 57 +++++++++++++++---- .../disable_workspace_resolution_test.dart | 52 ++++++++++++++++- 3 files changed, 106 insertions(+), 15 deletions(-) diff --git a/bricks/dart_frog_prod_server/hooks/lib/src/create_external_packages_folder.dart b/bricks/dart_frog_prod_server/hooks/lib/src/create_external_packages_folder.dart index 52ab775f0..1b2f847c4 100644 --- a/bricks/dart_frog_prod_server/hooks/lib/src/create_external_packages_folder.dart +++ b/bricks/dart_frog_prod_server/hooks/lib/src/create_external_packages_folder.dart @@ -64,9 +64,17 @@ Future> createExternalPackagesFolder({ ); overrideResolutionInPubspecOverrides(buildDirectory.path); - writePathDependencyOverrides( + writeDependencyOverrides( projectDirectory: buildDirectory.path, - pathDependencies: copiedExternalPathDependencies, + overrides: { + for (final externalDependency in copiedExternalPathDependencies) + externalDependency.name: { + 'path': path.relative( + externalDependency.path, + from: buildDirectory.path, + ), + } + }, ); return copiedExternalPathDependencies diff --git a/bricks/dart_frog_prod_server/hooks/lib/src/disable_workspace_resolution.dart b/bricks/dart_frog_prod_server/hooks/lib/src/disable_workspace_resolution.dart index 170ff079c..9fba4795d 100644 --- a/bricks/dart_frog_prod_server/hooks/lib/src/disable_workspace_resolution.dart +++ b/bricks/dart_frog_prod_server/hooks/lib/src/disable_workspace_resolution.dart @@ -28,10 +28,11 @@ VoidCallback disableWorkspaceResolution( } try { - overridePathDependenciesInPubspecOverrides( + overrideDependenciesInPubspecOverrides( projectDirectory: projectDirectory, packageConfig: packageConfig, packageGraph: packageGraph, + workspaceRoot: workspaceRoot, ); } on Exception catch (e) { restoreWorkspaceResolution(); @@ -70,11 +71,12 @@ VoidCallback overrideResolutionInPubspecOverrides(String projectDirectory) { return () => pubspecOverridesFile.writeAsStringSync(contents); } -/// Add overrides for all path dependencies to `pubspec_overrides.yaml` -void overridePathDependenciesInPubspecOverrides({ +/// Add overrides for all neccessary dependencies to `pubspec_overrides.yaml` +void overrideDependenciesInPubspecOverrides({ required String projectDirectory, required PackageConfig packageConfig, required PackageGraph packageGraph, + required String workspaceRoot, }) { final name = getPackageName(projectDirectory: projectDirectory); if (name == null) { @@ -90,29 +92,45 @@ void overridePathDependenciesInPubspecOverrides({ .where((p) => p.relativeRoot && productionDeps.contains(p.name)) .map((p) => PathDependency(name: p.name, path: p.root.path)); - writePathDependencyOverrides( + final workspaceRootOverrides = getWorkspaceRootDependencyOverrides( + workspaceRoot: workspaceRoot, + ); + final productionOverrides = workspaceRootOverrides.entries.where( + (e) => productionDeps.contains(e.key), + ); + + final overrides = { + for (final pathDependency in pathDependencies) + pathDependency.name: { + 'path': path.relative(pathDependency.path, from: projectDirectory), + }, + for (final override in productionOverrides) + '${override.key}': override.value, + }; + + writeDependencyOverrides( projectDirectory: projectDirectory, - pathDependencies: pathDependencies, + overrides: overrides, ); } -void writePathDependencyOverrides({ +void writeDependencyOverrides({ required String projectDirectory, - required Iterable pathDependencies, + required Map overrides, }) { final pubspecOverridesFile = File( path.join(projectDirectory, 'pubspec_overrides.yaml'), ); final contents = pubspecOverridesFile.readAsStringSync(); - final overrides = loadYaml(contents) as YamlMap; + final pubspecOverrides = loadYaml(contents) as YamlMap; final editor = YamlEditor(contents); - if (!overrides.containsKey('dependency_overrides')) { + if (!pubspecOverrides.containsKey('dependency_overrides')) { editor.update(['dependency_overrides'], {}); } - for (final package in pathDependencies) { + for (final override in overrides.entries) { editor.update( - ['dependency_overrides', package.name], - {'path': path.relative(package.path, from: projectDirectory)}, + ['dependency_overrides', override.key], + override.value, ); } pubspecOverridesFile.writeAsStringSync(editor.toString()); @@ -130,6 +148,21 @@ String? getPackageName({required String projectDirectory}) { return name; } +YamlMap getWorkspaceRootDependencyOverrides({required String workspaceRoot}) { + final pubspecOverridesFile = File( + path.join(workspaceRoot, 'pubspec_overrides.yaml'), + ); + if (!pubspecOverridesFile.existsSync()) return YamlMap(); + + final pubspecOverrides = loadYaml(pubspecOverridesFile.readAsStringSync()); + if (pubspecOverrides is! YamlMap) return YamlMap(); + + final overrides = pubspecOverrides['dependency_overrides']; + if (overrides is! YamlMap) return YamlMap(); + + return overrides; +} + /// Build a complete list of dependencies (direct and transitive). Set getProductionDependencies({ required String packageName, diff --git a/bricks/dart_frog_prod_server/hooks/test/src/disable_workspace_resolution_test.dart b/bricks/dart_frog_prod_server/hooks/test/src/disable_workspace_resolution_test.dart index 1877768c1..ac3f427b2 100644 --- a/bricks/dart_frog_prod_server/hooks/test/src/disable_workspace_resolution_test.dart +++ b/bricks/dart_frog_prod_server/hooks/test/src/disable_workspace_resolution_test.dart @@ -41,11 +41,17 @@ void main() { packageGraph = _MockPackageGraph(); when(() => context.logger).thenReturn(logger); - when(() => packageGraph.roots).thenReturn([packageName]); + when(() => packageGraph.roots).thenReturn([packageName, 'dart_frog']); when(() => packageGraph.packages).thenReturn( [ const PackageGraphPackage( name: packageName, + dependencies: ['dart_frog'], + devDependencies: [], + version: '1.0.0', + ), + const PackageGraphPackage( + name: 'dart_frog', dependencies: [], devDependencies: [], version: '1.0.0', @@ -118,6 +124,50 @@ resolution: null ), ); }); + + group('when workspace root contains pubspec_overrides.yaml', () { + const workspaceRootDartFrogOverride = ''' + dart_frog: + git: + url: https://github.com/dart-frog-dev/dart_frog + path: packages/dart_frog'''; + const workspaceRootPubspecOverrides = ''' +dependency_overrides: +$workspaceRootDartFrogOverride + '''; + + setUp(() { + File( + path.join(rootDirectory.path, 'pubspec_overrides.yaml'), + ).writeAsStringSync(workspaceRootPubspecOverrides); + }); + + test('adds root overrides', () { + disableWorkspaceResolution( + context, + packageConfig: packageConfig, + packageGraph: packageGraph, + projectDirectory: projectDirectory.path, + workspaceRoot: rootDirectory.path, + exit: exitCalls.add, + ); + final contents = projectDirectory.listSync(); + expect(contents, hasLength(2)); + final pubspecOverrides = contents.firstWhere( + (p) => path.basename(p.path) == 'pubspec_overrides.yaml', + ) as File; + expect( + pubspecOverrides.readAsStringSync(), + equals( + ''' +$originalPubspecOverridesContent +$workspaceRootDartFrogOverride +resolution: null +''', + ), + ); + }); + }); }); group('when unable to read pubspec_overrides', () { From 9d9f0418a34fd023cbe4bd5ee83d8106c819252d Mon Sep 17 00:00:00 2001 From: Felix Angelov Date: Fri, 17 Oct 2025 15:07:57 -0500 Subject: [PATCH 2/3] fix analysis warning --- .../hooks/lib/src/create_external_packages_folder.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bricks/dart_frog_prod_server/hooks/lib/src/create_external_packages_folder.dart b/bricks/dart_frog_prod_server/hooks/lib/src/create_external_packages_folder.dart index 1b2f847c4..d0145dbb7 100644 --- a/bricks/dart_frog_prod_server/hooks/lib/src/create_external_packages_folder.dart +++ b/bricks/dart_frog_prod_server/hooks/lib/src/create_external_packages_folder.dart @@ -73,7 +73,7 @@ Future> createExternalPackagesFolder({ externalDependency.path, from: buildDirectory.path, ), - } + }, }, ); From 2b91786bb7b20ef5af28014799599dd9704efcf1 Mon Sep 17 00:00:00 2001 From: Felix Angelov Date: Sun, 19 Oct 2025 14:18:38 -0500 Subject: [PATCH 3/3] chore: fix typo --- .../hooks/lib/src/disable_workspace_resolution.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bricks/dart_frog_prod_server/hooks/lib/src/disable_workspace_resolution.dart b/bricks/dart_frog_prod_server/hooks/lib/src/disable_workspace_resolution.dart index 9fba4795d..c8f262c14 100644 --- a/bricks/dart_frog_prod_server/hooks/lib/src/disable_workspace_resolution.dart +++ b/bricks/dart_frog_prod_server/hooks/lib/src/disable_workspace_resolution.dart @@ -71,7 +71,7 @@ VoidCallback overrideResolutionInPubspecOverrides(String projectDirectory) { return () => pubspecOverridesFile.writeAsStringSync(contents); } -/// Add overrides for all neccessary dependencies to `pubspec_overrides.yaml` +/// Add overrides for all necessary dependencies to `pubspec_overrides.yaml` void overrideDependenciesInPubspecOverrides({ required String projectDirectory, required PackageConfig packageConfig,