| // Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import 'package:analyzer/file_system/file_system.dart'; |
| |
| /// Helper for building `.dart_tool/package_config.json` files. |
| /// |
| /// See accepted/future-releases/language-versioning/package-config-file-v2.md |
| /// in https://github.com/dart-lang/language/. |
| /// |
| /// Use the [add] method to add package configurations. These configurations |
| /// will accumulate into one package config file with the [toContent] method. |
| class PackageConfigFileBuilder { |
| final List<_PackageDescription> _packages = []; |
| |
| /// Adds a package configuration. |
| /// |
| /// The [rootFolder] is used to produce the package root URI. |
| /// |
| /// The [packageUriStr] is optional (defaults to `'lib/'`), a relative path |
| /// resolved against the root URI. The result must be inside the root URI. |
| /// |
| /// The [languageVersion] specifies the package's Dart language version, in |
| /// the form of 'X.Y', such as '3.9'. |
| void add({ |
| required String name, |
| required Folder rootFolder, |
| String packageUriStr = 'lib/', |
| String? languageVersion, |
| }) { |
| if (_packages.any((e) => e.name == name)) { |
| throw StateError('Already added: $name'); |
| } |
| _packages.add( |
| _PackageDescription( |
| name: name, |
| rootFolder: rootFolder, |
| packageUriStr: packageUriStr, |
| languageVersion: languageVersion, |
| ), |
| ); |
| } |
| |
| /// Copies this [PackageConfigFileBuilder] into a new instance. |
| PackageConfigFileBuilder copy() { |
| var copy = PackageConfigFileBuilder(); |
| copy._packages.addAll(_packages); |
| return copy; |
| } |
| |
| /// Returns the contents of the built package config file. |
| String toContent() { |
| var buffer = StringBuffer(); |
| |
| buffer.writeln('{'); |
| |
| var prefix = ' ' * 2; |
| buffer.writeln('$prefix"configVersion": 2,'); |
| buffer.writeln('$prefix"packages": ['); |
| |
| for (var i = 0; i < _packages.length; i++) { |
| var package = _packages[i]; |
| |
| var prefix = ' ' * 4; |
| buffer.writeln('$prefix{'); |
| |
| prefix = ' ' * 6; |
| buffer.writeln('$prefix"name": "${package.name}",'); |
| |
| buffer.write('$prefix"rootUri": "${package.rootFolder.toUri()}"'); |
| |
| buffer.writeln(','); |
| buffer.write('$prefix"packageUri": "${package.packageUriStr}"'); |
| |
| if (package.languageVersion != null) { |
| buffer.writeln(','); |
| buffer.write('$prefix"languageVersion": "${package.languageVersion}"'); |
| } |
| |
| buffer.writeln(); |
| |
| prefix = ' ' * 4; |
| buffer.write(prefix); |
| buffer.writeln(i < _packages.length - 1 ? '},' : '}'); |
| } |
| |
| buffer.writeln(' ]'); |
| buffer.writeln('}'); |
| |
| return buffer.toString(); |
| } |
| } |
| |
| class _PackageDescription { |
| final String name; |
| final Folder rootFolder; |
| final String packageUriStr; |
| final String? languageVersion; |
| |
| _PackageDescription({ |
| required this.name, |
| required this.rootFolder, |
| required this.packageUriStr, |
| required this.languageVersion, |
| }); |
| } |