blob: f3134d71c243ad9f5fb5a5e0d56f8d17bff2c0e4 [file] [edit]
// 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,
});
}