// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'dart:convert'; import 'package:collection/collection.dart'; import 'package:file/file.dart'; /// Writes a `.dart_tool/package_config.json` file at [directory]. /// /// Also writes a `.dart_tool/package_graph.json` file. /// /// If directory is not specified, it will be `globals.fs.currentDirectory`; /// /// `package_config.json` will contain a package entry for [mainLibName] with `rootUri` at /// [directory]. /// /// [packages] maps other package names to their `rootUri` relative to `directory`. /// /// [languageVersions] can map a package to a non-default language version. /// /// All [packages] will be marked as dependencies of [mainLibName]. Except those /// in [devDependencies] which will be marked as dev_dependencies. /// /// Returns the `File` object representing the package config. File writePackageConfigFiles({ required Directory directory, required String mainLibName, String mainLibRootUri = '.', Map packages = const {}, Map languageVersions = const {}, List devDependencies = const [], List? dependencies, }) { directory.childDirectory('.dart_tool').childFile('package_graph.json') ..createSync(recursive: true) ..writeAsStringSync( json.encode({ 'roots': [mainLibName], 'packages': [ { 'name': mainLibName, 'dependencies': dependencies ?? packages.keys.toList().whereNot(devDependencies.contains).toList(), 'devDependencies': devDependencies, }, ...packages.entries.map( (MapEntry entry) => { 'name': entry.key, 'dependencies': [], }, ), ], 'configVersion': 1, }), ); return directory.childDirectory('.dart_tool').childFile('package_config.json') ..createSync(recursive: true) ..writeAsStringSync( json.encode({ 'packages': [ { 'name': mainLibName, 'rootUri': Uri.parse('../').resolve(mainLibRootUri).toString(), 'packageUri': 'lib/', 'languageVersion': languageVersions[mainLibName] ?? '3.7', }, ...packages.entries.map( (MapEntry entry) => { 'name': entry.key, 'rootUri': Uri.parse('../').resolve(entry.value).toString(), 'packageUri': 'lib/', 'languageVersion': languageVersions[entry.key] ?? '3.7', }, ), ], 'configVersion': 2, }), ); }