diff --git a/.github/workflows/package_config.yaml b/.github/workflows/package_config.yaml index 1d5d4c4433..43786530bf 100644 --- a/.github/workflows/package_config.yaml +++ b/.github/workflows/package_config.yaml @@ -54,7 +54,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, windows-latest] - sdk: [3.4, dev] + sdk: [3.7, dev] steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 - uses: dart-lang/setup-dart@e51d8e571e22473a2ddebf0ef8a2123f0ab2c02c diff --git a/pkgs/package_config/lib/package_config.dart b/pkgs/package_config/lib/package_config.dart index 074c977075..2f2a612ea4 100644 --- a/pkgs/package_config/lib/package_config.dart +++ b/pkgs/package_config/lib/package_config.dart @@ -41,9 +41,11 @@ export 'package_config_types.dart'; /// The returned package configuration is a *best effort* attempt to create /// a valid configuration from the invalid configuration file. /// If no [onError] is provided, errors are thrown immediately. -Future loadPackageConfig(File file, - {bool preferNewest = true, void Function(Object error)? onError}) => - readAnyConfigFile(file, preferNewest, onError ?? throwError); +Future loadPackageConfig( + File file, { + bool preferNewest = true, + void Function(Object error)? onError, +}) => readAnyConfigFile(file, preferNewest, onError ?? throwError); /// Reads a specific package configuration URI. /// @@ -86,11 +88,12 @@ Future loadPackageConfig(File file, /// The returned package configuration is a *best effort* attempt to create /// a valid configuration from the invalid configuration file. /// If no [onError] is provided, errors are thrown immediately. -Future loadPackageConfigUri(Uri file, - {Future Function(Uri uri)? loader, - bool preferNewest = true, - void Function(Object error)? onError}) => - readAnyConfigFileUri(file, loader, onError ?? throwError, preferNewest); +Future loadPackageConfigUri( + Uri file, { + Future Function(Uri uri)? loader, + bool preferNewest = true, + void Function(Object error)? onError, +}) => readAnyConfigFileUri(file, loader, onError ?? throwError, preferNewest); /// Finds a package configuration relative to [directory]. /// @@ -115,16 +118,25 @@ Future loadPackageConfigUri(Uri file, /// any lower-version configuration files are ignored in the search. /// /// Returns `null` if no configuration file is found. -Future findPackageConfig(Directory directory, - {bool recurse = true, - void Function(Object error)? onError, - int minVersion = 1}) { +Future findPackageConfig( + Directory directory, { + bool recurse = true, + void Function(Object error)? onError, + int minVersion = 1, +}) { if (minVersion > PackageConfig.maxVersion) { - throw ArgumentError.value(minVersion, 'minVersion', - 'Maximum known version is ${PackageConfig.maxVersion}'); + throw ArgumentError.value( + minVersion, + 'minVersion', + 'Maximum known version is ${PackageConfig.maxVersion}', + ); } return discover.findPackageConfig( - directory, minVersion, recurse, onError ?? throwError); + directory, + minVersion, + recurse, + onError ?? throwError, + ); } /// Finds a package configuration relative to [location]. @@ -170,17 +182,27 @@ Future findPackageConfig(Directory directory, /// any lower-version configuration files are ignored in the search. /// /// Returns `null` if no configuration file is found. -Future findPackageConfigUri(Uri location, - {bool recurse = true, - int minVersion = 1, - Future Function(Uri uri)? loader, - void Function(Object error)? onError}) { +Future findPackageConfigUri( + Uri location, { + bool recurse = true, + int minVersion = 1, + Future Function(Uri uri)? loader, + void Function(Object error)? onError, +}) { if (minVersion > PackageConfig.maxVersion) { - throw ArgumentError.value(minVersion, 'minVersion', - 'Maximum known version is ${PackageConfig.maxVersion}'); + throw ArgumentError.value( + minVersion, + 'minVersion', + 'Maximum known version is ${PackageConfig.maxVersion}', + ); } return discover.findPackageConfigUri( - location, minVersion, loader, onError ?? throwError, recurse); + location, + minVersion, + loader, + onError ?? throwError, + recurse, + ); } /// Writes a package configuration to the provided directory. @@ -195,5 +217,6 @@ Future findPackageConfigUri(Uri location, /// A comment is generated if `[PackageConfig.extraData]` contains a /// `"generator"` entry. Future savePackageConfig( - PackageConfig configuration, Directory directory) => - writePackageConfigJsonFile(configuration, directory); + PackageConfig configuration, + Directory directory, +) => writePackageConfigJsonFile(configuration, directory); diff --git a/pkgs/package_config/lib/src/discovery.dart b/pkgs/package_config/lib/src/discovery.dart index b678410996..a125166d0f 100644 --- a/pkgs/package_config/lib/src/discovery.dart +++ b/pkgs/package_config/lib/src/discovery.dart @@ -36,8 +36,12 @@ final Uri parentPath = Uri(path: '..'); /// If [minVersion] is greater than 1, `.packages` files are ignored. /// If [minVersion] is greater than the version read from the /// `package_config.json` file, it too is ignored. -Future findPackageConfig(Directory baseDirectory, - int minVersion, bool recursive, void Function(Object error) onError) async { +Future findPackageConfig( + Directory baseDirectory, + int minVersion, + bool recursive, + void Function(Object error) onError, +) async { var directory = baseDirectory; if (!directory.isAbsolute) directory = directory.absolute; if (!await directory.exists()) { @@ -45,8 +49,11 @@ Future findPackageConfig(Directory baseDirectory, } do { // Check for $cwd/.packages - var packageConfig = - await findPackageConfigInDirectory(directory, minVersion, onError); + var packageConfig = await findPackageConfigInDirectory( + directory, + minVersion, + onError, + ); if (packageConfig != null) return packageConfig; if (!recursive) break; // Check in parent directories. @@ -59,23 +66,30 @@ Future findPackageConfig(Directory baseDirectory, /// Similar to [findPackageConfig] but based on a URI. Future findPackageConfigUri( - Uri location, - int minVersion, - Future Function(Uri uri)? loader, - void Function(Object error) onError, - bool recursive) async { + Uri location, + int minVersion, + Future Function(Uri uri)? loader, + void Function(Object error) onError, + bool recursive, +) async { if (location.isScheme('package')) { - onError(PackageConfigArgumentError( - location, 'location', 'Must not be a package: URI')); + onError( + PackageConfigArgumentError( + location, + 'location', + 'Must not be a package: URI', + ), + ); return null; } if (loader == null) { if (location.isScheme('file')) { return findPackageConfig( - Directory.fromUri(location.resolveUri(currentPath)), - minVersion, - recursive, - onError); + Directory.fromUri(location.resolveUri(currentPath)), + minVersion, + recursive, + onError, + ); } loader = defaultLoader; } @@ -116,8 +130,11 @@ Future findPackageConfigUri( /// If [minVersion] is greater than 1, `.packages` files are ignored. /// If [minVersion] is greater than the version read from the /// `package_config.json` file, it too is ignored. -Future findPackageConfigInDirectory(Directory directory, - int minVersion, void Function(Object error) onError) async { +Future findPackageConfigInDirectory( + Directory directory, + int minVersion, + void Function(Object error) onError, +) async { var packageConfigFile = await checkForPackageConfigJsonFile(directory); if (packageConfigFile != null) { var config = await readPackageConfigJsonFile(packageConfigFile, onError); @@ -135,8 +152,9 @@ Future findPackageConfigInDirectory(Directory directory, Future checkForPackageConfigJsonFile(Directory directory) async { assert(directory.isAbsolute); - var file = - File(pathJoin(directory.path, '.dart_tool', 'package_config.json')); + var file = File( + pathJoin(directory.path, '.dart_tool', 'package_config.json'), + ); if (await file.exists()) return file; return null; } diff --git a/pkgs/package_config/lib/src/errors.dart b/pkgs/package_config/lib/src/errors.dart index a66fef7f3a..ba6ad5d388 100644 --- a/pkgs/package_config/lib/src/errors.dart +++ b/pkgs/package_config/lib/src/errors.dart @@ -13,20 +13,25 @@ abstract class PackageConfigError { class PackageConfigArgumentError extends ArgumentError implements PackageConfigError { PackageConfigArgumentError( - Object? super.value, String super.name, String super.message) - : super.value(); + Object? super.value, + String super.name, + String super.message, + ) : super.value(); PackageConfigArgumentError.from(ArgumentError error) - : super.value(error.invalidValue, error.name, error.message); + : super.value(error.invalidValue, error.name, error.message); } class PackageConfigFormatException extends FormatException implements PackageConfigError { - PackageConfigFormatException(super.message, Object? super.source, - [super.offset]); + PackageConfigFormatException( + super.message, + Object? super.source, [ + super.offset, + ]); PackageConfigFormatException.from(FormatException exception) - : super(exception.message, exception.source, exception.offset); + : super(exception.message, exception.source, exception.offset); } /// The default `onError` handler. diff --git a/pkgs/package_config/lib/src/package_config.dart b/pkgs/package_config/lib/src/package_config.dart index 707e85703e..0db7ac5b69 100644 --- a/pkgs/package_config/lib/src/package_config.dart +++ b/pkgs/package_config/lib/src/package_config.dart @@ -69,9 +69,11 @@ abstract class PackageConfig { /// despite the error. The input must still be valid JSON. /// The result may be [PackageConfig.empty] if there is no way to /// extract useful information from the bytes. - static PackageConfig parseBytes(Uint8List bytes, Uri baseUri, - {void Function(Object error)? onError}) => - parsePackageConfigBytes(bytes, baseUri, onError ?? throwError); + static PackageConfig parseBytes( + Uint8List bytes, + Uri baseUri, { + void Function(Object error)? onError, + }) => parsePackageConfigBytes(bytes, baseUri, onError ?? throwError); /// Parses a package configuration file. /// @@ -89,9 +91,11 @@ abstract class PackageConfig { /// despite the error. The input must still be valid JSON. /// The result may be [PackageConfig.empty] if there is no way to /// extract useful information from the bytes. - static PackageConfig parseString(String configuration, Uri baseUri, - {void Function(Object error)? onError}) => - parsePackageConfigString(configuration, baseUri, onError ?? throwError); + static PackageConfig parseString( + String configuration, + Uri baseUri, { + void Function(Object error)? onError, + }) => parsePackageConfigString(configuration, baseUri, onError ?? throwError); /// Parses the JSON data of a package configuration file. /// @@ -110,16 +114,21 @@ abstract class PackageConfig { /// despite the error. The input must still be valid JSON. /// The result may be [PackageConfig.empty] if there is no way to /// extract useful information from the bytes. - static PackageConfig parseJson(Object? jsonData, Uri baseUri, - {void Function(Object error)? onError}) => - parsePackageConfigJson(jsonData, baseUri, onError ?? throwError); + static PackageConfig parseJson( + Object? jsonData, + Uri baseUri, { + void Function(Object error)? onError, + }) => parsePackageConfigJson(jsonData, baseUri, onError ?? throwError); /// Writes a configuration file for this configuration on [output]. /// /// If [baseUri] is provided, URI references in the generated file /// will be made relative to [baseUri] where possible. - static void writeBytes(PackageConfig configuration, Sink output, - [Uri? baseUri]) { + static void writeBytes( + PackageConfig configuration, + Sink output, [ + Uri? baseUri, + ]) { writePackageConfigJsonUtf8(configuration, baseUri, output); } @@ -127,8 +136,11 @@ abstract class PackageConfig { /// /// If [baseUri] is provided, URI references in the generated file /// will be made relative to [baseUri] where possible. - static void writeString(PackageConfig configuration, StringSink output, - [Uri? baseUri]) { + static void writeString( + PackageConfig configuration, + StringSink output, [ + Uri? baseUri, + ]) { writePackageConfigJsonString(configuration, baseUri, output); } @@ -136,9 +148,10 @@ abstract class PackageConfig { /// /// If [baseUri] is provided, URI references in the generated data /// will be made relative to [baseUri] where possible. - static Map toJson(PackageConfig configuration, - [Uri? baseUri]) => - packageConfigToJson(configuration, baseUri); + static Map toJson( + PackageConfig configuration, [ + Uri? baseUri, + ]) => packageConfigToJson(configuration, baseUri); /// The configuration version number. /// @@ -231,13 +244,23 @@ abstract class Package { /// /// If [extraData] is supplied, it will be available as the /// [Package.extraData] of the created package. - factory Package(String name, Uri root, - {Uri? packageUriRoot, - LanguageVersion? languageVersion, - Object? extraData, - bool relativeRoot = true}) => - SimplePackage.validate(name, root, packageUriRoot, languageVersion, - extraData, relativeRoot, throwError)!; + factory Package( + String name, + Uri root, { + Uri? packageUriRoot, + LanguageVersion? languageVersion, + Object? extraData, + bool relativeRoot = true, + }) => + SimplePackage.validate( + name, + root, + packageUriRoot, + languageVersion, + extraData, + relativeRoot, + throwError, + )!; /// The package-name of the package. String get name; @@ -330,9 +353,10 @@ abstract class LanguageVersion implements Comparable { /// If [onError] is not supplied, it defaults to throwing the exception. /// If the call does not throw, then an [InvalidLanguageVersion] is returned /// containing the original [source]. - static LanguageVersion parse(String source, - {void Function(Object error)? onError}) => - parseLanguageVersion(source, onError ?? throwError); + static LanguageVersion parse( + String source, { + void Function(Object error)? onError, + }) => parseLanguageVersion(source, onError ?? throwError); /// The major language version. /// @@ -485,11 +509,15 @@ extension LanguageVersionRelationalOperators on LanguageVersion { return compareTo(other) >= 0; } - static Never _throwThisInvalid() => throw StateError( - 'Can\'t compare an invalid language version to another language version. ' - 'Verify language versions are valid after parsing.'); - - static Never _throwOtherInvalid() => throw StateError( - 'Can\'t compare a language version to an invalid language version. ' - 'Verify language versions are valid after parsing.'); + static Never _throwThisInvalid() => + throw StateError( + "Can't compare an invalid language version to another language version." + ' Verify language versions are valid after parsing.', + ); + + static Never _throwOtherInvalid() => + throw StateError( + "Can't compare a language version to an invalid language version." + ' Verify language versions are valid after parsing.', + ); } diff --git a/pkgs/package_config/lib/src/package_config_impl.dart b/pkgs/package_config/lib/src/package_config_impl.dart index 865e99a8e0..a33ccf8a2e 100644 --- a/pkgs/package_config/lib/src/package_config_impl.dart +++ b/pkgs/package_config/lib/src/package_config_impl.dart @@ -20,18 +20,27 @@ class SimplePackageConfig implements PackageConfig { @override final Object? extraData; - factory SimplePackageConfig(int version, Iterable packages, - [Object? extraData, void Function(Object error)? onError]) { + factory SimplePackageConfig( + int version, + Iterable packages, [ + Object? extraData, + void Function(Object error)? onError, + ]) { onError ??= throwError; var validVersion = _validateVersion(version, onError); var sortedPackages = [...packages]..sort(_compareRoot); var packageTree = _validatePackages(packages, sortedPackages, onError); - return SimplePackageConfig._(validVersion, packageTree, - {for (var p in packageTree.allPackages) p.name: p}, extraData); + return SimplePackageConfig._(validVersion, packageTree, { + for (var p in packageTree.allPackages) p.name: p, + }, extraData); } SimplePackageConfig._( - this.version, this._packageTree, this._packages, this.extraData); + this.version, + this._packageTree, + this._packages, + this.extraData, + ); /// Creates empty configuration. /// @@ -41,23 +50,33 @@ class SimplePackageConfig implements PackageConfig { /// The version number is [PackageConfig.maxVersion] to avoid /// minimum-version filters discarding the configuration. const SimplePackageConfig.empty() - : version = PackageConfig.maxVersion, - _packageTree = const EmptyPackageTree(), - _packages = const {}, - extraData = null; + : version = PackageConfig.maxVersion, + _packageTree = const EmptyPackageTree(), + _packages = const {}, + extraData = null; static int _validateVersion( - int version, void Function(Object error) onError) { + int version, + void Function(Object error) onError, + ) { if (version < 0 || version > PackageConfig.maxVersion) { - onError(PackageConfigArgumentError(version, 'version', - 'Must be in the range 1 to ${PackageConfig.maxVersion}')); + onError( + PackageConfigArgumentError( + version, + 'version', + 'Must be in the range 1 to ${PackageConfig.maxVersion}', + ), + ); return 2; // The minimal version supporting a SimplePackageConfig. } return version; } - static PackageTree _validatePackages(Iterable originalPackages, - List packages, void Function(Object error) onError) { + static PackageTree _validatePackages( + Iterable originalPackages, + List packages, + void Function(Object error) onError, + ) { var packageNames = {}; var tree = TriePackageTree(); for (var originalPackage in packages) { @@ -65,27 +84,39 @@ class SimplePackageConfig implements PackageConfig { if (originalPackage is! SimplePackage) { // SimplePackage validates these properties. newPackage = SimplePackage.validate( - originalPackage.name, - originalPackage.root, - originalPackage.packageUriRoot, - originalPackage.languageVersion, - originalPackage.extraData, - originalPackage.relativeRoot, (error) { - if (error is PackageConfigArgumentError) { - onError(PackageConfigArgumentError(packages, 'packages', - 'Package ${newPackage!.name}: ${error.message}')); - } else { - onError(error); - } - }); + originalPackage.name, + originalPackage.root, + originalPackage.packageUriRoot, + originalPackage.languageVersion, + originalPackage.extraData, + originalPackage.relativeRoot, + (error) { + if (error is PackageConfigArgumentError) { + onError( + PackageConfigArgumentError( + packages, + 'packages', + 'Package ${newPackage!.name}: ${error.message}', + ), + ); + } else { + onError(error); + } + }, + ); if (newPackage == null) continue; } else { newPackage = originalPackage; } var name = newPackage.name; if (packageNames.contains(name)) { - onError(PackageConfigArgumentError( - name, 'packages', "Duplicate package name '$name'")); + onError( + PackageConfigArgumentError( + name, + 'packages', + "Duplicate package name '$name'", + ), + ); continue; } packageNames.add(name); @@ -95,16 +126,20 @@ class SimplePackageConfig implements PackageConfig { var existingPackage = error.existingPackage; switch (error.conflictType) { case ConflictType.sameRoots: - onError(PackageConfigArgumentError( + onError( + PackageConfigArgumentError( originalPackages, 'packages', 'Packages ${newPackage!.name} and ${existingPackage.name} ' - 'have the same root directory: ${newPackage.root}.\n')); + 'have the same root directory: ${newPackage.root}.\n', + ), + ); break; case ConflictType.interleaving: // The new package is inside the package URI root of the existing // package. - onError(PackageConfigArgumentError( + onError( + PackageConfigArgumentError( originalPackages, 'packages', 'Package ${newPackage!.name} is inside the root of ' @@ -113,17 +148,22 @@ class SimplePackageConfig implements PackageConfig { '${newPackage.name}.\n' '${existingPackage.name} package root: ' '${existingPackage.packageUriRoot}\n' - '${newPackage.name} root: ${newPackage.root}\n')); + '${newPackage.name} root: ${newPackage.root}\n', + ), + ); break; case ConflictType.insidePackageRoot: - onError(PackageConfigArgumentError( + onError( + PackageConfigArgumentError( originalPackages, 'packages', 'Package ${newPackage!.name} is inside the package root of ' 'package ${existingPackage.name}.\n' '${existingPackage.name} package root: ' '${existingPackage.packageUriRoot}\n' - '${newPackage.name} root: ${newPackage.root}\n')); + '${newPackage.name} root: ${newPackage.root}\n', + ), + ); break; } } else { @@ -148,18 +188,25 @@ class SimplePackageConfig implements PackageConfig { Uri? resolve(Uri packageUri) { var packageName = checkValidPackageUri(packageUri, 'packageUri'); return _packages[packageName]?.packageUriRoot.resolveUri( - Uri(path: packageUri.path.substring(packageName.length + 1))); + Uri(path: packageUri.path.substring(packageName.length + 1)), + ); } @override Uri? toPackageUri(Uri nonPackageUri) { if (nonPackageUri.isScheme('package')) { throw PackageConfigArgumentError( - nonPackageUri, 'nonPackageUri', 'Must not be a package URI'); + nonPackageUri, + 'nonPackageUri', + 'Must not be a package URI', + ); } if (nonPackageUri.hasQuery || nonPackageUri.hasFragment) { - throw PackageConfigArgumentError(nonPackageUri, 'nonPackageUri', - 'Must not have query or fragment part'); + throw PackageConfigArgumentError( + nonPackageUri, + 'nonPackageUri', + 'Must not have query or fragment part', + ); } // Find package that file belongs to. var package = _packageTree.packageOf(nonPackageUri); @@ -190,8 +237,14 @@ class SimplePackage implements Package { @override final bool relativeRoot; - SimplePackage._(this.name, this.root, this.packageUriRoot, - this.languageVersion, this.extraData, this.relativeRoot); + SimplePackage._( + this.name, + this.root, + this.packageUriRoot, + this.languageVersion, + this.extraData, + this.relativeRoot, + ); /// Creates a [SimplePackage] with the provided content. /// @@ -209,30 +262,44 @@ class SimplePackage implements Package { /// Returns `null` if the input is invalid and an approximately valid package /// cannot be salvaged from the input. static SimplePackage? validate( - String name, - Uri root, - Uri? packageUriRoot, - LanguageVersion? languageVersion, - Object? extraData, - bool relativeRoot, - void Function(Object error) onError) { + String name, + Uri root, + Uri? packageUriRoot, + LanguageVersion? languageVersion, + Object? extraData, + bool relativeRoot, + void Function(Object error) onError, + ) { var fatalError = false; var invalidIndex = checkPackageName(name); if (invalidIndex >= 0) { - onError(PackageConfigFormatException( - 'Not a valid package name', name, invalidIndex)); + onError( + PackageConfigFormatException( + 'Not a valid package name', + name, + invalidIndex, + ), + ); fatalError = true; } if (root.isScheme('package')) { - onError(PackageConfigArgumentError( - '$root', 'root', 'Must not be a package URI')); + onError( + PackageConfigArgumentError( + '$root', + 'root', + 'Must not be a package URI', + ), + ); fatalError = true; } else if (!isAbsoluteDirectoryUri(root)) { - onError(PackageConfigArgumentError( + onError( + PackageConfigArgumentError( '$root', 'root', 'In package $name: Not an absolute URI with no query or fragment ' - 'with a path ending in /')); + 'with a path ending in /', + ), + ); // Try to recover. If the URI has a scheme, // then ensure that the path ends with `/`. if (!root.hasScheme) { @@ -246,21 +313,35 @@ class SimplePackage implements Package { } else if (!fatalError) { packageUriRoot = root.resolveUri(packageUriRoot); if (!isAbsoluteDirectoryUri(packageUriRoot)) { - onError(PackageConfigArgumentError( + onError( + PackageConfigArgumentError( packageUriRoot, 'packageUriRoot', 'In package $name: Not an absolute URI with no query or fragment ' - 'with a path ending in /')); + 'with a path ending in /', + ), + ); packageUriRoot = root; } else if (!isUriPrefix(root, packageUriRoot)) { - onError(PackageConfigArgumentError(packageUriRoot, 'packageUriRoot', - 'The package URI root is not below the package root')); + onError( + PackageConfigArgumentError( + packageUriRoot, + 'packageUriRoot', + 'The package URI root is not below the package root', + ), + ); packageUriRoot = root; } } if (fatalError) return null; return SimplePackage._( - name, root, packageUriRoot, languageVersion, extraData, relativeRoot); + name, + root, + packageUriRoot, + languageVersion, + extraData, + relativeRoot, + ); } } @@ -271,7 +352,9 @@ class SimplePackage implements Package { /// Reports a format exception on [onError] if not, or if the numbers /// are too large (at most 32-bit signed integers). LanguageVersion parseLanguageVersion( - String? source, void Function(Object error) onError) { + String? source, + void Function(Object error) onError, +) { var index = 0; // Reads a positive decimal numeral. Returns the value of the numeral, // or a negative number in case of an error. @@ -299,7 +382,8 @@ LanguageVersion parseLanguageVersion( value = value * 10 + digit; if (value > maxValue) { onError( - PackageConfigFormatException('Number too large', source, start)); + PackageConfigFormatException('Number too large', source, start), + ); return -1; } index++; @@ -308,8 +392,9 @@ LanguageVersion parseLanguageVersion( digit = char ^ 0x30; } while (digit <= 9); if (firstDigit == 0 && index > start + 1) { - onError(PackageConfigFormatException( - 'Leading zero not allowed', source, start)); + onError( + PackageConfigFormatException('Leading zero not allowed', source, start), + ); } return value; } @@ -328,8 +413,13 @@ LanguageVersion parseLanguageVersion( return SimpleInvalidLanguageVersion(source); } if (index != source.length) { - onError(PackageConfigFormatException( - 'Unexpected trailing character', source, index)); + onError( + PackageConfigFormatException( + 'Unexpected trailing character', + source, + index, + ), + ); return SimpleInvalidLanguageVersion(source); } return SimpleLanguageVersion(major, minor, source); @@ -414,24 +504,40 @@ class TriePackageTree implements PackageTree { } } - bool _checkConflict(_PackageTrieNode node, SimplePackage newPackage, - void Function(Object error) onError) { + bool _checkConflict( + _PackageTrieNode node, + SimplePackage newPackage, + void Function(Object error) onError, + ) { var existingPackage = node.package; if (existingPackage != null) { // Trying to add package that is inside the existing package. // 1) If it's an exact match it's not allowed (i.e. the roots can't be // the same). if (newPackage.root.path.length == existingPackage.root.path.length) { - onError(ConflictException( - newPackage, existingPackage, ConflictType.sameRoots)); + onError( + ConflictException( + newPackage, + existingPackage, + ConflictType.sameRoots, + ), + ); return true; } // 2) The existing package has a packageUriRoot thats inside the // root of the new package. - if (_beginsWith(0, newPackage.root.toString(), - existingPackage.packageUriRoot.toString())) { - onError(ConflictException( - newPackage, existingPackage, ConflictType.interleaving)); + if (_beginsWith( + 0, + newPackage.root.toString(), + existingPackage.packageUriRoot.toString(), + )) { + onError( + ConflictException( + newPackage, + existingPackage, + ConflictType.interleaving, + ), + ); return true; } @@ -439,10 +545,18 @@ class TriePackageTree implements PackageTree { // it though. // 3) The new package is inside the packageUriRoot of existing package. if (_disallowPackagesInsidePackageUriRoot) { - if (_beginsWith(0, existingPackage.packageUriRoot.toString(), - newPackage.root.toString())) { - onError(ConflictException( - newPackage, existingPackage, ConflictType.insidePackageRoot)); + if (_beginsWith( + 0, + existingPackage.packageUriRoot.toString(), + newPackage.root.toString(), + )) { + onError( + ConflictException( + newPackage, + existingPackage, + ConflictType.insidePackageRoot, + ), + ); return true; } } @@ -480,7 +594,10 @@ class TriePackageTree implements PackageTree { } bool _isMatch( - String path, _PackageTrieNode node, List potential) { + String path, + _PackageTrieNode node, + List potential, + ) { var currentPackage = node.package; if (currentPackage != null) { var currentPackageRootLength = currentPackage.root.toString().length; diff --git a/pkgs/package_config/lib/src/package_config_io.dart b/pkgs/package_config/lib/src/package_config_io.dart index 8c5773b2b7..bcbe31bf1d 100644 --- a/pkgs/package_config/lib/src/package_config_io.dart +++ b/pkgs/package_config/lib/src/package_config_io.dart @@ -43,10 +43,14 @@ const packagesFileName = '.packages'; /// /// The file must exist and be a normal file. Future readAnyConfigFile( - File file, bool preferNewest, void Function(Object error) onError) async { + File file, + bool preferNewest, + void Function(Object error) onError, +) async { if (preferNewest && fileName(file.path) == packagesFileName) { var alternateFile = File( - pathJoin(dirName(file.path), dartToolDirName, packageConfigFileName)); + pathJoin(dirName(file.path), dartToolDirName, packageConfigFileName), + ); if (alternateFile.existsSync()) { return await readPackageConfigJsonFile(alternateFile, onError); } @@ -63,13 +67,17 @@ Future readAnyConfigFile( /// Like [readAnyConfigFile] but uses a URI and an optional loader. Future readAnyConfigFileUri( - Uri file, - Future Function(Uri uri)? loader, - void Function(Object error) onError, - bool preferNewest) async { + Uri file, + Future Function(Uri uri)? loader, + void Function(Object error) onError, + bool preferNewest, +) async { if (file.isScheme('package')) { throw PackageConfigArgumentError( - file, 'file', 'Must not be a package: URI'); + file, + 'file', + 'Must not be a package: URI', + ); } if (loader == null) { if (file.isScheme('file')) { @@ -98,8 +106,13 @@ Future readAnyConfigFileUri( return const SimplePackageConfig.empty(); } if (bytes == null) { - onError(PackageConfigArgumentError( - file.toString(), 'file', 'File cannot be read')); + onError( + PackageConfigArgumentError( + file.toString(), + 'file', + 'File cannot be read', + ), + ); return const SimplePackageConfig.empty(); } return parseAnyConfigFile(bytes, file, onError); @@ -110,7 +123,10 @@ Future readAnyConfigFileUri( /// Assumes it's a JSON file if the first non-whitespace character /// is `{`, otherwise assumes it's a `.packages` file. PackageConfig parseAnyConfigFile( - Uint8List bytes, Uri file, void Function(Object error) onError) { + Uint8List bytes, + Uri file, + void Function(Object error) onError, +) { var firstChar = firstNonWhitespaceChar(bytes); if (firstChar != $lbrace) { // Definitely not a JSON object, probably a .packages. @@ -120,7 +136,9 @@ PackageConfig parseAnyConfigFile( } Future readPackageConfigJsonFile( - File file, void Function(Object error) onError) async { + File file, + void Function(Object error) onError, +) async { Uint8List bytes; try { bytes = await file.readAsBytes(); @@ -132,7 +150,9 @@ Future readPackageConfigJsonFile( } Future readDotPackagesFile( - File file, void Function(Object error) onError) async { + File file, + void Function(Object error) onError, +) async { Uint8List bytes; try { bytes = await file.readAsBytes(); @@ -144,7 +164,9 @@ Future readDotPackagesFile( } Future writePackageConfigJsonFile( - PackageConfig config, Directory targetDirectory) async { + PackageConfig config, + Directory targetDirectory, +) async { // Write .dart_tool/package_config.json first. var dartToolDir = Directory(pathJoin(targetDirectory.path, dartToolDirName)); await dartToolDir.create(recursive: true); diff --git a/pkgs/package_config/lib/src/package_config_json.dart b/pkgs/package_config/lib/src/package_config_json.dart index 65560a0f00..6198abf706 100644 --- a/pkgs/package_config/lib/src/package_config_json.dart +++ b/pkgs/package_config/lib/src/package_config_json.dart @@ -23,7 +23,7 @@ const List _packageNames = [ _nameKey, _rootUriKey, _packageUriKey, - _languageVersionKey + _languageVersionKey, ]; const String _generatedKey = 'generated'; @@ -33,7 +33,10 @@ const String _generatorVersionKey = 'generatorVersion'; final _jsonUtf8Decoder = json.fuse(utf8).decoder; PackageConfig parsePackageConfigBytes( - Uint8List bytes, Uri file, void Function(Object error) onError) { + Uint8List bytes, + Uri file, + void Function(Object error) onError, +) { // TODO(lrn): Make this simpler. Maybe parse directly from bytes. Object? jsonObject; try { @@ -46,7 +49,10 @@ PackageConfig parsePackageConfigBytes( } PackageConfig parsePackageConfigString( - String source, Uri file, void Function(Object error) onError) { + String source, + Uri file, + void Function(Object error) onError, +) { Object? jsonObject; try { jsonObject = jsonDecode(source); @@ -78,10 +84,16 @@ PackageConfig parsePackageConfigString( /// The [baseLocation] is used as base URI to resolve the "rootUri" /// URI reference string. PackageConfig parsePackageConfigJson( - Object? json, Uri baseLocation, void Function(Object error) onError) { + Object? json, + Uri baseLocation, + void Function(Object error) onError, +) { if (!baseLocation.hasScheme || baseLocation.isScheme('package')) { - throw PackageConfigArgumentError(baseLocation.toString(), 'baseLocation', - 'Must be an absolute non-package: URI'); + throw PackageConfigArgumentError( + baseLocation.toString(), + 'baseLocation', + 'Must be an absolute non-package: URI', + ); } if (!baseLocation.path.endsWith('/')) { @@ -162,16 +174,25 @@ PackageConfig parsePackageConfigJson( } return SimplePackage.validate( - name!, root, packageRoot, version, extraData, relativeRoot, (error) { - if (error is ArgumentError) { - onError( - PackageConfigFormatException( - error.message.toString(), error.invalidValue), - ); - } else { - onError(error); - } - }); + name!, + root, + packageRoot, + version, + extraData, + relativeRoot, + (error) { + if (error is ArgumentError) { + onError( + PackageConfigFormatException( + error.message.toString(), + error.invalidValue, + ), + ); + } else { + onError(error); + } + }, + ); } var map = checkType>(json, 'value'); @@ -188,8 +209,10 @@ PackageConfig parsePackageConfigJson( var packageArray = checkType>(value, _packagesKey) ?? []; var packages = []; for (var package in packageArray) { - var packageMap = - checkType>(package, 'package entry'); + var packageMap = checkType>( + package, + 'package entry', + ); if (packageMap != null) { var entry = parsePackage(packageMap); if (entry != null) { @@ -216,7 +239,9 @@ PackageConfig parsePackageConfigJson( if (error is ArgumentError) { onError( PackageConfigFormatException( - error.message.toString(), error.invalidValue), + error.message.toString(), + error.invalidValue, + ), ); } else { onError(error); @@ -227,14 +252,20 @@ PackageConfig parsePackageConfigJson( final _jsonUtf8Encoder = JsonUtf8Encoder(' '); void writePackageConfigJsonUtf8( - PackageConfig config, Uri? baseUri, Sink> output) { + PackageConfig config, + Uri? baseUri, + Sink> output, +) { // Can be optimized. var data = packageConfigToJson(config, baseUri); output.add(_jsonUtf8Encoder.convert(data) as Uint8List); } void writePackageConfigJsonString( - PackageConfig config, Uri? baseUri, StringSink output) { + PackageConfig config, + Uri? baseUri, + StringSink output, +) { // Can be optimized. var data = packageConfigToJson(config, baseUri); output.write(const JsonEncoder.withIndent(' ').convert(data)); @@ -248,19 +279,21 @@ Map packageConfigToJson(PackageConfig config, Uri? baseUri) => for (var package in config.packages) { _nameKey: package.name, - _rootUriKey: trailingSlash((package.relativeRoot - ? relativizeUri(package.root, baseUri) - : package.root) - .toString()), + _rootUriKey: trailingSlash( + (package.relativeRoot + ? relativizeUri(package.root, baseUri) + : package.root) + .toString(), + ), if (package.root != package.packageUriRoot) _packageUriKey: trailingSlash( - relativizeUri(package.packageUriRoot, package.root) - .toString()), + relativizeUri(package.packageUriRoot, package.root).toString(), + ), if (package.languageVersion != null && package.languageVersion is! InvalidLanguageVersion) _languageVersionKey: package.languageVersion.toString(), ...?_extractExtraData(package.extraData, _packageNames), - } + }, ], }; @@ -273,7 +306,8 @@ void writeDotPackages(PackageConfig config, Uri baseUri, StringSink output) { if (generator is String) { var generated = extraData[_generatedKey]; var generatorVersion = extraData[_generatorVersionKey]; - comment = 'Generated by $generator' + comment = + 'Generated by $generator' "${generatorVersion is String ? " $generatorVersion" : ""}" "${generated is String ? " on $generated" : ""}."; } @@ -286,14 +320,16 @@ void writeDotPackages(PackageConfig config, Uri baseUri, StringSink output) { /// If the value contains any of the [reservedNames] for the current context, /// entries with that name in the extra data are dropped. Map? _extractExtraData( - Object? data, Iterable reservedNames) { + Object? data, + Iterable reservedNames, +) { if (data is Map) { if (data.isEmpty) return null; for (var name in reservedNames) { if (data.containsKey(name)) { var filteredData = { for (var key in data.keys) - if (!reservedNames.contains(key)) key: data[key] + if (!reservedNames.contains(key)) key: data[key], }; if (filteredData.isEmpty) return null; for (var value in filteredData.values) { diff --git a/pkgs/package_config/lib/src/packages_file.dart b/pkgs/package_config/lib/src/packages_file.dart index bf68f2c888..6a977a0ad9 100644 --- a/pkgs/package_config/lib/src/packages_file.dart +++ b/pkgs/package_config/lib/src/packages_file.dart @@ -30,10 +30,18 @@ final LanguageVersion _languageVersion = LanguageVersion(2, 7); /// [Package.packageUriRoot] is the same as its [Package.root] /// and it has no [Package.languageVersion]. PackageConfig parse( - List source, Uri baseLocation, void Function(Object error) onError) { + List source, + Uri baseLocation, + void Function(Object error) onError, +) { if (baseLocation.isScheme('package')) { - onError(PackageConfigArgumentError( - baseLocation, 'baseLocation', 'Must not be a package: URI')); + onError( + PackageConfigArgumentError( + baseLocation, + 'baseLocation', + 'Must not be a package: URI', + ), + ); return PackageConfig.empty; } var index = 0; @@ -49,8 +57,9 @@ PackageConfig parse( continue; } if (char == $colon) { - onError(PackageConfigFormatException( - 'Missing package name', source, index - 1)); + onError( + PackageConfigFormatException('Missing package name', source, index - 1), + ); ignoreLine = true; // Ignore if package name is invalid. } else { ignoreLine = char == $hash; // Ignore if comment. @@ -73,23 +82,39 @@ PackageConfig parse( if (ignoreLine) continue; if (separatorIndex < 0) { onError( - PackageConfigFormatException("No ':' on line", source, index - 1)); + PackageConfigFormatException("No ':' on line", source, index - 1), + ); continue; } var packageName = String.fromCharCodes(source, start, separatorIndex); var invalidIndex = checkPackageName(packageName); if (invalidIndex >= 0) { - onError(PackageConfigFormatException( - 'Not a valid package name', source, start + invalidIndex)); + onError( + PackageConfigFormatException( + 'Not a valid package name', + source, + start + invalidIndex, + ), + ); continue; } if (queryStart >= 0) { - onError(PackageConfigFormatException( - 'Location URI must not have query', source, queryStart)); + onError( + PackageConfigFormatException( + 'Location URI must not have query', + source, + queryStart, + ), + ); end = queryStart; } else if (fragmentStart >= 0) { - onError(PackageConfigFormatException( - 'Location URI must not have fragment', source, fragmentStart)); + onError( + PackageConfigFormatException( + 'Location URI must not have fragment', + source, + fragmentStart, + ), + ); end = fragmentStart; } var packageValue = String.fromCharCodes(source, separatorIndex + 1, end); @@ -103,8 +128,13 @@ PackageConfig parse( var relativeRoot = !hasAbsolutePath(packageLocation); packageLocation = baseLocation.resolveUri(packageLocation); if (packageLocation.isScheme('package')) { - onError(PackageConfigFormatException( - 'Package URI as location for package', source, separatorIndex + 1)); + onError( + PackageConfigFormatException( + 'Package URI as location for package', + source, + separatorIndex + 1, + ), + ); continue; } var path = packageLocation.path; @@ -113,24 +143,39 @@ PackageConfig parse( packageLocation = packageLocation.replace(path: path); } if (packageNames.contains(packageName)) { - onError(PackageConfigFormatException( - 'Same package name occurred more than once', source, start)); + onError( + PackageConfigFormatException( + 'Same package name occurred more than once', + source, + start, + ), + ); continue; } var rootUri = packageLocation; if (path.endsWith('/lib/')) { // Assume default Pub package layout. Include package itself in root. - rootUri = - packageLocation.replace(path: path.substring(0, path.length - 4)); - } - var package = SimplePackage.validate(packageName, rootUri, packageLocation, - _languageVersion, null, relativeRoot, (error) { - if (error is ArgumentError) { - onError(PackageConfigFormatException(error.message.toString(), source)); - } else { - onError(error); - } - }); + rootUri = packageLocation.replace( + path: path.substring(0, path.length - 4), + ); + } + var package = SimplePackage.validate( + packageName, + rootUri, + packageLocation, + _languageVersion, + null, + relativeRoot, + (error) { + if (error is ArgumentError) { + onError( + PackageConfigFormatException(error.message.toString(), source), + ); + } else { + onError(error); + } + }, + ); if (package != null) { packages.add(package); packageNames.add(packageName); @@ -148,8 +193,12 @@ PackageConfig parse( /// /// If [baseUri] is provided, package locations will be made relative /// to the base URI, if possible, before writing. -void write(StringSink output, PackageConfig config, - {Uri? baseUri, String? comment}) { +void write( + StringSink output, + PackageConfig config, { + Uri? baseUri, + String? comment, +}) { if (baseUri != null && !baseUri.isAbsolute) { throw PackageConfigArgumentError(baseUri, 'baseUri', 'Must be absolute'); } @@ -172,11 +221,17 @@ void write(StringSink output, PackageConfig config, // Validate packageName. if (!isValidPackageName(packageName)) { throw PackageConfigArgumentError( - config, 'config', '"$packageName" is not a valid package name'); + config, + 'config', + '"$packageName" is not a valid package name', + ); } if (uri.scheme == 'package') { throw PackageConfigArgumentError( - config, 'config', 'Package location must not be a package URI: $uri'); + config, + 'config', + 'Package location must not be a package URI: $uri', + ); } output.write(packageName); output.write(':'); diff --git a/pkgs/package_config/lib/src/util.dart b/pkgs/package_config/lib/src/util.dart index 4f0210cda2..cebd3c8c0e 100644 --- a/pkgs/package_config/lib/src/util.dart +++ b/pkgs/package_config/lib/src/util.dart @@ -52,12 +52,18 @@ String checkValidPackageUri(Uri packageUri, String name) { } if (packageUri.hasAuthority) { throw PackageConfigArgumentError( - packageUri, name, 'Package URIs must not have a host part'); + packageUri, + name, + 'Package URIs must not have a host part', + ); } if (packageUri.hasQuery) { // A query makes no sense if resolved to a file: URI. throw PackageConfigArgumentError( - packageUri, name, 'Package URIs must not have a query part'); + packageUri, + name, + 'Package URIs must not have a query part', + ); } if (packageUri.hasFragment) { // We could leave the fragment after the URL when resolving, @@ -65,27 +71,42 @@ String checkValidPackageUri(Uri packageUri, String name) { // "package:foo/foo.dart#2" were considered different libraries. // Keep the syntax open in case we ever get multiple libraries in one file. throw PackageConfigArgumentError( - packageUri, name, 'Package URIs must not have a fragment part'); + packageUri, + name, + 'Package URIs must not have a fragment part', + ); } if (packageUri.path.startsWith('/')) { throw PackageConfigArgumentError( - packageUri, name, "Package URIs must not start with a '/'"); + packageUri, + name, + "Package URIs must not start with a '/'", + ); } var firstSlash = packageUri.path.indexOf('/'); if (firstSlash == -1) { - throw PackageConfigArgumentError(packageUri, name, - "Package URIs must start with the package name followed by a '/'"); + throw PackageConfigArgumentError( + packageUri, + name, + "Package URIs must start with the package name followed by a '/'", + ); } var packageName = packageUri.path.substring(0, firstSlash); var badIndex = checkPackageName(packageName); if (badIndex >= 0) { if (packageName.isEmpty) { throw PackageConfigArgumentError( - packageUri, name, 'Package names mus be non-empty'); + packageUri, + name, + 'Package names mus be non-empty', + ); } if (badIndex == packageName.length) { - throw PackageConfigArgumentError(packageUri, name, - "Package names must contain at least one non-'.' character"); + throw PackageConfigArgumentError( + packageUri, + name, + "Package names must contain at least one non-'.' character", + ); } assert(badIndex < packageName.length); var badCharCode = packageName.codeUnitAt(badIndex); @@ -95,7 +116,10 @@ String checkValidPackageUri(Uri packageUri, String name) { badChar = "'${packageName[badIndex]}' ($badChar)"; } throw PackageConfigArgumentError( - packageUri, name, 'Package names must not contain $badChar'); + packageUri, + name, + 'Package names must not contain $badChar', + ); } return packageName; } @@ -173,11 +197,12 @@ Uri? relativizeUri(Uri? uri, Uri? baseUri) { assert(baseUri.isAbsolute); if (uri!.hasQuery || uri.hasFragment) { uri = Uri( - scheme: uri.scheme, - userInfo: uri.hasAuthority ? uri.userInfo : null, - host: uri.hasAuthority ? uri.host : null, - port: uri.hasAuthority ? uri.port : null, - path: uri.path); + scheme: uri.scheme, + userInfo: uri.hasAuthority ? uri.userInfo : null, + host: uri.hasAuthority ? uri.host : null, + port: uri.hasAuthority ? uri.port : null, + path: uri.path, + ); } // Already relative. We assume the caller knows what they are doing. diff --git a/pkgs/package_config/pubspec.yaml b/pkgs/package_config/pubspec.yaml index 56eac6802c..5ff9c53c18 100644 --- a/pkgs/package_config/pubspec.yaml +++ b/pkgs/package_config/pubspec.yaml @@ -5,7 +5,7 @@ repository: https://github.com/dart-lang/tools/tree/main/pkgs/package_config issue_tracker: https://github.com/dart-lang/tools/labels/package%3Apackage_config environment: - sdk: ^3.4.0 + sdk: ^3.7.0 dependencies: path: ^1.8.0 diff --git a/pkgs/package_config/test/bench.dart b/pkgs/package_config/test/bench.dart index 8428481f78..1d0ab1da35 100644 --- a/pkgs/package_config/test/bench.dart +++ b/pkgs/package_config/test/bench.dart @@ -48,8 +48,10 @@ void bench(final int size, final bool doPrint) { final lookup = stopwatch.elapsedMilliseconds; if (doPrint) { - print('Read file with $size packages in $read ms, ' - 'looked up all packages in $lookup ms'); + print( + 'Read file with $size packages in $read ms, ' + 'looked up all packages in $lookup ms', + ); } } diff --git a/pkgs/package_config/test/discovery_test.dart b/pkgs/package_config/test/discovery_test.dart index 6d1b655299..1e76e1e0b0 100644 --- a/pkgs/package_config/test/discovery_test.dart +++ b/pkgs/package_config/test/discovery_test.dart @@ -43,187 +43,225 @@ const packageConfigFile = ''' void validatePackagesFile(PackageConfig resolver, Directory directory) { expect(resolver, isNotNull); - expect(resolver.resolve(pkg('foo', 'bar/baz')), - equals(Uri.parse('file:///dart/packages/foo/bar/baz'))); - expect(resolver.resolve(pkg('bar', 'baz/qux')), - equals(Uri.parse('file:///dart/packages/bar/baz/qux'))); - expect(resolver.resolve(pkg('baz', 'qux/foo')), - equals(Uri.directory(directory.path).resolve('packages/baz/qux/foo'))); - expect([for (var p in resolver.packages) p.name], - unorderedEquals(['foo', 'bar', 'baz'])); + expect( + resolver.resolve(pkg('foo', 'bar/baz')), + equals(Uri.parse('file:///dart/packages/foo/bar/baz')), + ); + expect( + resolver.resolve(pkg('bar', 'baz/qux')), + equals(Uri.parse('file:///dart/packages/bar/baz/qux')), + ); + expect( + resolver.resolve(pkg('baz', 'qux/foo')), + equals(Uri.directory(directory.path).resolve('packages/baz/qux/foo')), + ); + expect([ + for (var p in resolver.packages) p.name, + ], unorderedEquals(['foo', 'bar', 'baz'])); } void main() { group('findPackages', () { // Finds package_config.json if there. - fileTest('package_config.json', { - '.packages': 'invalid .packages file', - 'script.dart': 'main(){}', - 'packages': {'shouldNotBeFound': {}}, - '.dart_tool': { - 'package_config.json': packageConfigFile, - } - }, (Directory directory) async { - var config = (await findPackageConfig(directory))!; - expect(config.version, 2); // Found package_config.json file. - validatePackagesFile(config, directory); - }); + fileTest( + 'package_config.json', + { + '.packages': 'invalid .packages file', + 'script.dart': 'main(){}', + 'packages': {'shouldNotBeFound': {}}, + '.dart_tool': {'package_config.json': packageConfigFile}, + }, + (Directory directory) async { + var config = (await findPackageConfig(directory))!; + expect(config.version, 2); // Found package_config.json file. + validatePackagesFile(config, directory); + }, + ); // Finds .packages if no package_config.json. - fileTest('.packages', { - '.packages': packagesFile, - 'script.dart': 'main(){}', - 'packages': {'shouldNotBeFound': {}} - }, (Directory directory) async { - var config = (await findPackageConfig(directory))!; - expect(config.version, 1); // Found .packages file. - validatePackagesFile(config, directory); - }); + fileTest( + '.packages', + { + '.packages': packagesFile, + 'script.dart': 'main(){}', + 'packages': {'shouldNotBeFound': {}}, + }, + (Directory directory) async { + var config = (await findPackageConfig(directory))!; + expect(config.version, 1); // Found .packages file. + validatePackagesFile(config, directory); + }, + ); // Finds package_config.json in super-directory. - fileTest('package_config.json recursive', { - '.packages': packagesFile, - '.dart_tool': { - 'package_config.json': packageConfigFile, + fileTest( + 'package_config.json recursive', + { + '.packages': packagesFile, + '.dart_tool': {'package_config.json': packageConfigFile}, + 'subdir': {'script.dart': 'main(){}'}, }, - 'subdir': { - 'script.dart': 'main(){}', - } - }, (Directory directory) async { - var config = (await findPackageConfig(subdir(directory, 'subdir/')))!; - expect(config.version, 2); - validatePackagesFile(config, directory); - }); + (Directory directory) async { + var config = (await findPackageConfig(subdir(directory, 'subdir/')))!; + expect(config.version, 2); + validatePackagesFile(config, directory); + }, + ); // Finds .packages in super-directory. - fileTest('.packages recursive', { - '.packages': packagesFile, - 'subdir': {'script.dart': 'main(){}'} - }, (Directory directory) async { - var config = (await findPackageConfig(subdir(directory, 'subdir/')))!; - expect(config.version, 1); - validatePackagesFile(config, directory); - }); + fileTest( + '.packages recursive', + { + '.packages': packagesFile, + 'subdir': {'script.dart': 'main(){}'}, + }, + (Directory directory) async { + var config = (await findPackageConfig(subdir(directory, 'subdir/')))!; + expect(config.version, 1); + validatePackagesFile(config, directory); + }, + ); // Does not find a packages/ directory, and returns null if nothing found. - fileTest('package directory packages not supported', { - 'packages': { - 'foo': {}, - } - }, (Directory directory) async { - var config = await findPackageConfig(directory); - expect(config, null); - }); + fileTest( + 'package directory packages not supported', + { + 'packages': {'foo': {}}, + }, + (Directory directory) async { + var config = await findPackageConfig(directory); + expect(config, null); + }, + ); group('throws', () { - fileTest('invalid .packages', { - '.packages': 'not a .packages file', - }, (Directory directory) { + fileTest('invalid .packages', {'.packages': 'not a .packages file'}, ( + Directory directory, + ) { expect(findPackageConfig(directory), throwsA(isA())); }); - fileTest('invalid .packages as JSON', { - '.packages': packageConfigFile, - }, (Directory directory) { + fileTest('invalid .packages as JSON', {'.packages': packageConfigFile}, ( + Directory directory, + ) { expect(findPackageConfig(directory), throwsA(isA())); }); - fileTest('invalid .packages', { - '.dart_tool': { - 'package_config.json': 'not a JSON file', - } - }, (Directory directory) { - expect(findPackageConfig(directory), throwsA(isA())); - }); + fileTest( + 'invalid .packages', + { + '.dart_tool': {'package_config.json': 'not a JSON file'}, + }, + (Directory directory) { + expect(findPackageConfig(directory), throwsA(isA())); + }, + ); - fileTest('invalid .packages as INI', { - '.dart_tool': { - 'package_config.json': packagesFile, - } - }, (Directory directory) { - expect(findPackageConfig(directory), throwsA(isA())); - }); + fileTest( + 'invalid .packages as INI', + { + '.dart_tool': {'package_config.json': packagesFile}, + }, + (Directory directory) { + expect(findPackageConfig(directory), throwsA(isA())); + }, + ); }); group('handles error', () { - fileTest('invalid .packages', { - '.packages': 'not a .packages file', - }, (Directory directory) async { + fileTest('invalid .packages', {'.packages': 'not a .packages file'}, ( + Directory directory, + ) async { var hadError = false; - await findPackageConfig(directory, - onError: expectAsync1((error) { - hadError = true; - expect(error, isA()); - }, max: -1)); + await findPackageConfig( + directory, + onError: expectAsync1((error) { + hadError = true; + expect(error, isA()); + }, max: -1), + ); expect(hadError, true); }); - fileTest('invalid .packages as JSON', { - '.packages': packageConfigFile, - }, (Directory directory) async { + fileTest('invalid .packages as JSON', {'.packages': packageConfigFile}, ( + Directory directory, + ) async { var hadError = false; - await findPackageConfig(directory, - onError: expectAsync1((error) { - hadError = true; - expect(error, isA()); - }, max: -1)); + await findPackageConfig( + directory, + onError: expectAsync1((error) { + hadError = true; + expect(error, isA()); + }, max: -1), + ); expect(hadError, true); }); - fileTest('invalid package_config not JSON', { - '.dart_tool': { - 'package_config.json': 'not a JSON file', - } - }, (Directory directory) async { - var hadError = false; - await findPackageConfig(directory, + fileTest( + 'invalid package_config not JSON', + { + '.dart_tool': {'package_config.json': 'not a JSON file'}, + }, + (Directory directory) async { + var hadError = false; + await findPackageConfig( + directory, onError: expectAsync1((error) { hadError = true; expect(error, isA()); - }, max: -1)); - expect(hadError, true); - }); + }, max: -1), + ); + expect(hadError, true); + }, + ); - fileTest('invalid package config as INI', { - '.dart_tool': { - 'package_config.json': packagesFile, - } - }, (Directory directory) async { - var hadError = false; - await findPackageConfig(directory, + fileTest( + 'invalid package config as INI', + { + '.dart_tool': {'package_config.json': packagesFile}, + }, + (Directory directory) async { + var hadError = false; + await findPackageConfig( + directory, onError: expectAsync1((error) { hadError = true; expect(error, isA()); - }, max: -1)); - expect(hadError, true); - }); + }, max: -1), + ); + expect(hadError, true); + }, + ); }); // Does not find .packages if no package_config.json and minVersion > 1. - fileTest('.packages ignored', { - '.packages': packagesFile, - 'script.dart': 'main(){}' - }, (Directory directory) async { - var config = await findPackageConfig(directory, minVersion: 2); - expect(config, null); - }); + fileTest( + '.packages ignored', + {'.packages': packagesFile, 'script.dart': 'main(){}'}, + (Directory directory) async { + var config = await findPackageConfig(directory, minVersion: 2); + expect(config, null); + }, + ); // Finds package_config.json in super-directory, with .packages in // subdir and minVersion > 1. - fileTest('package_config.json recursive .packages ignored', { - '.dart_tool': { - 'package_config.json': packageConfigFile, + fileTest( + 'package_config.json recursive .packages ignored', + { + '.dart_tool': {'package_config.json': packageConfigFile}, + 'subdir': {'.packages': packagesFile, 'script.dart': 'main(){}'}, }, - 'subdir': { - '.packages': packagesFile, - 'script.dart': 'main(){}', - } - }, (Directory directory) async { - var config = (await findPackageConfig(subdir(directory, 'subdir/'), - minVersion: 2))!; - expect(config.version, 2); - validatePackagesFile(config, directory); - }); + (Directory directory) async { + var config = + (await findPackageConfig( + subdir(directory, 'subdir/'), + minVersion: 2, + ))!; + expect(config.version, 2); + validatePackagesFile(config, directory); + }, + ); }); group('loadPackageConfig', () { @@ -231,19 +269,20 @@ void main() { group('package_config.json', () { var files = { '.packages': packagesFile, - '.dart_tool': { - 'package_config.json': packageConfigFile, - }, + '.dart_tool': {'package_config.json': packageConfigFile}, }; fileTest('directly', files, (Directory directory) async { - var file = - dirFile(subdir(directory, '.dart_tool'), 'package_config.json'); + var file = dirFile( + subdir(directory, '.dart_tool'), + 'package_config.json', + ); var config = await loadPackageConfig(file); expect(config.version, 2); validatePackagesFile(config, directory); }); - fileTest('indirectly through .packages', files, - (Directory directory) async { + fileTest('indirectly through .packages', files, ( + Directory directory, + ) async { var file = dirFile(directory, '.packages'); var config = await loadPackageConfig(file); expect(config.version, 2); @@ -257,41 +296,45 @@ void main() { }); }); - fileTest('package_config.json non-default name', { - '.packages': packagesFile, - 'subdir': { - 'pheldagriff': packageConfigFile, + fileTest( + 'package_config.json non-default name', + { + '.packages': packagesFile, + 'subdir': {'pheldagriff': packageConfigFile}, }, - }, (Directory directory) async { - var file = dirFile(directory, 'subdir/pheldagriff'); - var config = await loadPackageConfig(file); - expect(config.version, 2); - validatePackagesFile(config, directory); - }); + (Directory directory) async { + var file = dirFile(directory, 'subdir/pheldagriff'); + var config = await loadPackageConfig(file); + expect(config.version, 2); + validatePackagesFile(config, directory); + }, + ); - fileTest('package_config.json named .packages', { - 'subdir': { - '.packages': packageConfigFile, + fileTest( + 'package_config.json named .packages', + { + 'subdir': {'.packages': packageConfigFile}, }, - }, (Directory directory) async { - var file = dirFile(directory, 'subdir/.packages'); - var config = await loadPackageConfig(file); - expect(config.version, 2); - validatePackagesFile(config, directory); - }); + (Directory directory) async { + var file = dirFile(directory, 'subdir/.packages'); + var config = await loadPackageConfig(file); + expect(config.version, 2); + validatePackagesFile(config, directory); + }, + ); - fileTest('.packages', { - '.packages': packagesFile, - }, (Directory directory) async { + fileTest('.packages', {'.packages': packagesFile}, ( + Directory directory, + ) async { var file = dirFile(directory, '.packages'); var config = await loadPackageConfig(file); expect(config.version, 1); validatePackagesFile(config, directory); }); - fileTest('.packages non-default name', { - 'pheldagriff': packagesFile, - }, (Directory directory) async { + fileTest('.packages non-default name', {'pheldagriff': packagesFile}, ( + Directory directory, + ) async { var file = dirFile(directory, 'pheldagriff'); var config = await loadPackageConfig(file); expect(config.version, 1); @@ -301,44 +344,50 @@ void main() { fileTest('no config found', {}, (Directory directory) { var file = dirFile(directory, 'anyname'); expect( - () => loadPackageConfig(file), throwsA(isA())); + () => loadPackageConfig(file), + throwsA(isA()), + ); }); fileTest('no config found, handled', {}, (Directory directory) async { var file = dirFile(directory, 'anyname'); var hadError = false; - await loadPackageConfig(file, - onError: expectAsync1((error) { - hadError = true; - expect(error, isA()); - }, max: -1)); + await loadPackageConfig( + file, + onError: expectAsync1((error) { + hadError = true; + expect(error, isA()); + }, max: -1), + ); expect(hadError, true); }); - fileTest('specified file syntax error', { - 'anyname': 'syntax error', - }, (Directory directory) { + fileTest('specified file syntax error', {'anyname': 'syntax error'}, ( + Directory directory, + ) { var file = dirFile(directory, 'anyname'); expect(() => loadPackageConfig(file), throwsFormatException); }); // Find package_config.json in subdir even if initial file syntax error. - fileTest('specified file syntax onError', { - '.packages': 'syntax error', - '.dart_tool': { - 'package_config.json': packageConfigFile, + fileTest( + 'specified file syntax onError', + { + '.packages': 'syntax error', + '.dart_tool': {'package_config.json': packageConfigFile}, }, - }, (Directory directory) async { - var file = dirFile(directory, '.packages'); - var config = await loadPackageConfig(file); - expect(config.version, 2); - validatePackagesFile(config, directory); - }); + (Directory directory) async { + var file = dirFile(directory, '.packages'); + var config = await loadPackageConfig(file); + expect(config.version, 2); + validatePackagesFile(config, directory); + }, + ); // A file starting with `{` is a package_config.json file. - fileTest('file syntax error with {', { - '.packages': '{syntax error', - }, (Directory directory) { + fileTest('file syntax error with {', {'.packages': '{syntax error'}, ( + Directory directory, + ) { var file = dirFile(directory, '.packages'); expect(() => loadPackageConfig(file), throwsFormatException); }); diff --git a/pkgs/package_config/test/discovery_uri_test.dart b/pkgs/package_config/test/discovery_uri_test.dart index 542bf0a65f..e81d02314d 100644 --- a/pkgs/package_config/test/discovery_uri_test.dart +++ b/pkgs/package_config/test/discovery_uri_test.dart @@ -40,138 +40,184 @@ const packageConfigFile = ''' void validatePackagesFile(PackageConfig resolver, Uri directory) { expect(resolver, isNotNull); - expect(resolver.resolve(pkg('foo', 'bar/baz')), - equals(Uri.parse('file:///dart/packages/foo/bar/baz'))); - expect(resolver.resolve(pkg('bar', 'baz/qux')), - equals(directory.resolve('/dart/packages/bar/baz/qux'))); - expect(resolver.resolve(pkg('baz', 'qux/foo')), - equals(directory.resolve('packages/baz/qux/foo'))); - expect([for (var p in resolver.packages) p.name], - unorderedEquals(['foo', 'bar', 'baz'])); + expect( + resolver.resolve(pkg('foo', 'bar/baz')), + equals(Uri.parse('file:///dart/packages/foo/bar/baz')), + ); + expect( + resolver.resolve(pkg('bar', 'baz/qux')), + equals(directory.resolve('/dart/packages/bar/baz/qux')), + ); + expect( + resolver.resolve(pkg('baz', 'qux/foo')), + equals(directory.resolve('packages/baz/qux/foo')), + ); + expect([ + for (var p in resolver.packages) p.name, + ], unorderedEquals(['foo', 'bar', 'baz'])); } void main() { group('findPackages', () { // Finds package_config.json if there. - loaderTest('package_config.json', { - '.packages': 'invalid .packages file', - 'script.dart': 'main(){}', - 'packages': {'shouldNotBeFound': {}}, - '.dart_tool': { - 'package_config.json': packageConfigFile, - } - }, (directory, loader) async { - var config = (await findPackageConfigUri(directory, loader: loader))!; - expect(config.version, 2); // Found package_config.json file. - validatePackagesFile(config, directory); - }); + loaderTest( + 'package_config.json', + { + '.packages': 'invalid .packages file', + 'script.dart': 'main(){}', + 'packages': {'shouldNotBeFound': {}}, + '.dart_tool': {'package_config.json': packageConfigFile}, + }, + (directory, loader) async { + var config = (await findPackageConfigUri(directory, loader: loader))!; + expect(config.version, 2); // Found package_config.json file. + validatePackagesFile(config, directory); + }, + ); // Finds .packages if no package_config.json. - loaderTest('.packages', { - '.packages': packagesFile, - 'script.dart': 'main(){}', - 'packages': {'shouldNotBeFound': {}} - }, (directory, loader) async { - var config = (await findPackageConfigUri(directory, loader: loader))!; - expect(config.version, 1); // Found .packages file. - validatePackagesFile(config, directory); - }); + loaderTest( + '.packages', + { + '.packages': packagesFile, + 'script.dart': 'main(){}', + 'packages': {'shouldNotBeFound': {}}, + }, + (directory, loader) async { + var config = (await findPackageConfigUri(directory, loader: loader))!; + expect(config.version, 1); // Found .packages file. + validatePackagesFile(config, directory); + }, + ); // Finds package_config.json in super-directory. - loaderTest('package_config.json recursive', { - '.packages': packagesFile, - '.dart_tool': { - 'package_config.json': packageConfigFile, + loaderTest( + 'package_config.json recursive', + { + '.packages': packagesFile, + '.dart_tool': {'package_config.json': packageConfigFile}, + 'subdir': {'script.dart': 'main(){}'}, }, - 'subdir': { - 'script.dart': 'main(){}', - } - }, (directory, loader) async { - var config = (await findPackageConfigUri(directory.resolve('subdir/'), - loader: loader))!; - expect(config.version, 2); - validatePackagesFile(config, directory); - }); + (directory, loader) async { + var config = + (await findPackageConfigUri( + directory.resolve('subdir/'), + loader: loader, + ))!; + expect(config.version, 2); + validatePackagesFile(config, directory); + }, + ); // Finds .packages in super-directory. - loaderTest('.packages recursive', { - '.packages': packagesFile, - 'subdir': {'script.dart': 'main(){}'} - }, (directory, loader) async { - var config = (await findPackageConfigUri(directory.resolve('subdir/'), - loader: loader))!; - expect(config.version, 1); - validatePackagesFile(config, directory); - }); + loaderTest( + '.packages recursive', + { + '.packages': packagesFile, + 'subdir': {'script.dart': 'main(){}'}, + }, + (directory, loader) async { + var config = + (await findPackageConfigUri( + directory.resolve('subdir/'), + loader: loader, + ))!; + expect(config.version, 1); + validatePackagesFile(config, directory); + }, + ); // Does not find a packages/ directory, and returns null if nothing found. - loaderTest('package directory packages not supported', { - 'packages': { - 'foo': {}, - } - }, (Uri directory, loader) async { - var config = await findPackageConfigUri(directory, loader: loader); - expect(config, null); - }); + loaderTest( + 'package directory packages not supported', + { + 'packages': {'foo': {}}, + }, + (Uri directory, loader) async { + var config = await findPackageConfigUri(directory, loader: loader); + expect(config, null); + }, + ); - loaderTest('invalid .packages', { - '.packages': 'not a .packages file', - }, (Uri directory, loader) { - expect(() => findPackageConfigUri(directory, loader: loader), - throwsA(isA())); + loaderTest('invalid .packages', {'.packages': 'not a .packages file'}, ( + Uri directory, + loader, + ) { + expect( + () => findPackageConfigUri(directory, loader: loader), + throwsA(isA()), + ); }); - loaderTest('invalid .packages as JSON', { - '.packages': packageConfigFile, - }, (Uri directory, loader) { - expect(() => findPackageConfigUri(directory, loader: loader), - throwsA(isA())); + loaderTest('invalid .packages as JSON', {'.packages': packageConfigFile}, ( + Uri directory, + loader, + ) { + expect( + () => findPackageConfigUri(directory, loader: loader), + throwsA(isA()), + ); }); - loaderTest('invalid .packages', { - '.dart_tool': { - 'package_config.json': 'not a JSON file', - } - }, (Uri directory, loader) { - expect(() => findPackageConfigUri(directory, loader: loader), - throwsA(isA())); - }); + loaderTest( + 'invalid .packages', + { + '.dart_tool': {'package_config.json': 'not a JSON file'}, + }, + (Uri directory, loader) { + expect( + () => findPackageConfigUri(directory, loader: loader), + throwsA(isA()), + ); + }, + ); - loaderTest('invalid .packages as INI', { - '.dart_tool': { - 'package_config.json': packagesFile, - } - }, (Uri directory, loader) { - expect(() => findPackageConfigUri(directory, loader: loader), - throwsA(isA())); - }); + loaderTest( + 'invalid .packages as INI', + { + '.dart_tool': {'package_config.json': packagesFile}, + }, + (Uri directory, loader) { + expect( + () => findPackageConfigUri(directory, loader: loader), + throwsA(isA()), + ); + }, + ); // Does not find .packages if no package_config.json and minVersion > 1. - loaderTest('.packages ignored', { - '.packages': packagesFile, - 'script.dart': 'main(){}' - }, (directory, loader) async { - var config = - await findPackageConfigUri(directory, minVersion: 2, loader: loader); - expect(config, null); - }); + loaderTest( + '.packages ignored', + {'.packages': packagesFile, 'script.dart': 'main(){}'}, + (directory, loader) async { + var config = await findPackageConfigUri( + directory, + minVersion: 2, + loader: loader, + ); + expect(config, null); + }, + ); // Finds package_config.json in super-directory, with .packages in // subdir and minVersion > 1. - loaderTest('package_config.json recursive ignores .packages', { - '.dart_tool': { - 'package_config.json': packageConfigFile, + loaderTest( + 'package_config.json recursive ignores .packages', + { + '.dart_tool': {'package_config.json': packageConfigFile}, + 'subdir': {'.packages': packagesFile, 'script.dart': 'main(){}'}, }, - 'subdir': { - '.packages': packagesFile, - 'script.dart': 'main(){}', - } - }, (directory, loader) async { - var config = (await findPackageConfigUri(directory.resolve('subdir/'), - minVersion: 2, loader: loader))!; - expect(config.version, 2); - validatePackagesFile(config, directory); - }); + (directory, loader) async { + var config = + (await findPackageConfigUri( + directory.resolve('subdir/'), + minVersion: 2, + loader: loader, + ))!; + expect(config.version, 2); + validatePackagesFile(config, directory); + }, + ); }); group('loadPackageConfig', () { @@ -179,9 +225,7 @@ void main() { group('package_config.json', () { var files = { '.packages': packagesFile, - '.dart_tool': { - 'package_config.json': packageConfigFile, - }, + '.dart_tool': {'package_config.json': packageConfigFile}, }; loaderTest('directly', files, (Uri directory, loader) async { var file = directory.resolve('.dart_tool/package_config.json'); @@ -189,8 +233,10 @@ void main() { expect(config.version, 2); validatePackagesFile(config, directory); }); - loaderTest('indirectly through .packages', files, - (Uri directory, loader) async { + loaderTest('indirectly through .packages', files, ( + Uri directory, + loader, + ) async { var file = directory.resolve('.packages'); var config = await loadPackageConfigUri(file, loader: loader); expect(config.version, 2); @@ -198,41 +244,47 @@ void main() { }); }); - loaderTest('package_config.json non-default name', { - '.packages': packagesFile, - 'subdir': { - 'pheldagriff': packageConfigFile, + loaderTest( + 'package_config.json non-default name', + { + '.packages': packagesFile, + 'subdir': {'pheldagriff': packageConfigFile}, }, - }, (Uri directory, loader) async { - var file = directory.resolve('subdir/pheldagriff'); - var config = await loadPackageConfigUri(file, loader: loader); - expect(config.version, 2); - validatePackagesFile(config, directory); - }); + (Uri directory, loader) async { + var file = directory.resolve('subdir/pheldagriff'); + var config = await loadPackageConfigUri(file, loader: loader); + expect(config.version, 2); + validatePackagesFile(config, directory); + }, + ); - loaderTest('package_config.json named .packages', { - 'subdir': { - '.packages': packageConfigFile, + loaderTest( + 'package_config.json named .packages', + { + 'subdir': {'.packages': packageConfigFile}, }, - }, (Uri directory, loader) async { - var file = directory.resolve('subdir/.packages'); - var config = await loadPackageConfigUri(file, loader: loader); - expect(config.version, 2); - validatePackagesFile(config, directory); - }); + (Uri directory, loader) async { + var file = directory.resolve('subdir/.packages'); + var config = await loadPackageConfigUri(file, loader: loader); + expect(config.version, 2); + validatePackagesFile(config, directory); + }, + ); - loaderTest('.packages', { - '.packages': packagesFile, - }, (Uri directory, loader) async { + loaderTest('.packages', {'.packages': packagesFile}, ( + Uri directory, + loader, + ) async { var file = directory.resolve('.packages'); var config = await loadPackageConfigUri(file, loader: loader); expect(config.version, 1); validatePackagesFile(config, directory); }); - loaderTest('.packages non-default name', { - 'pheldagriff': packagesFile, - }, (Uri directory, loader) async { + loaderTest('.packages non-default name', {'pheldagriff': packagesFile}, ( + Uri directory, + loader, + ) async { var file = directory.resolve('pheldagriff'); var config = await loadPackageConfigUri(file, loader: loader); expect(config.version, 1); @@ -241,69 +293,88 @@ void main() { loaderTest('no config found', {}, (Uri directory, loader) { var file = directory.resolve('anyname'); - expect(() => loadPackageConfigUri(file, loader: loader), - throwsA(isA())); + expect( + () => loadPackageConfigUri(file, loader: loader), + throwsA(isA()), + ); }); - loaderTest('no config found, handle error', {}, - (Uri directory, loader) async { + loaderTest('no config found, handle error', {}, ( + Uri directory, + loader, + ) async { var file = directory.resolve('anyname'); var hadError = false; - await loadPackageConfigUri(file, - loader: loader, - onError: expectAsync1((error) { - hadError = true; - expect(error, isA()); - }, max: -1)); + await loadPackageConfigUri( + file, + loader: loader, + onError: expectAsync1((error) { + hadError = true; + expect(error, isA()); + }, max: -1), + ); expect(hadError, true); }); - loaderTest('specified file syntax error', { - 'anyname': 'syntax error', - }, (Uri directory, loader) { + loaderTest('specified file syntax error', {'anyname': 'syntax error'}, ( + Uri directory, + loader, + ) { var file = directory.resolve('anyname'); - expect(() => loadPackageConfigUri(file, loader: loader), - throwsFormatException); + expect( + () => loadPackageConfigUri(file, loader: loader), + throwsFormatException, + ); }); - loaderTest('specified file syntax onError', { - 'anyname': 'syntax error', - }, (directory, loader) async { + loaderTest('specified file syntax onError', {'anyname': 'syntax error'}, ( + directory, + loader, + ) async { var file = directory.resolve('anyname'); var hadError = false; - await loadPackageConfigUri(file, - loader: loader, - onError: expectAsync1((error) { - hadError = true; - expect(error, isA()); - }, max: -1)); + await loadPackageConfigUri( + file, + loader: loader, + onError: expectAsync1((error) { + hadError = true; + expect(error, isA()); + }, max: -1), + ); expect(hadError, true); }); // Don't look for package_config.json if original file not named .packages. - loaderTest('specified file syntax error with alternative', { - 'anyname': 'syntax error', - '.dart_tool': { - 'package_config.json': packageConfigFile, + loaderTest( + 'specified file syntax error with alternative', + { + 'anyname': 'syntax error', + '.dart_tool': {'package_config.json': packageConfigFile}, }, - }, (directory, loader) async { - var file = directory.resolve('anyname'); - expect(() => loadPackageConfigUri(file, loader: loader), - throwsFormatException); - }); + (directory, loader) async { + var file = directory.resolve('anyname'); + expect( + () => loadPackageConfigUri(file, loader: loader), + throwsFormatException, + ); + }, + ); // A file starting with `{` is a package_config.json file. - loaderTest('file syntax error with {', { - '.packages': '{syntax error', - }, (directory, loader) async { + loaderTest('file syntax error with {', {'.packages': '{syntax error'}, ( + directory, + loader, + ) async { var file = directory.resolve('.packages'); var hadError = false; - await loadPackageConfigUri(file, - loader: loader, - onError: expectAsync1((error) { - hadError = true; - expect(error, isA()); - }, max: -1)); + await loadPackageConfigUri( + file, + loader: loader, + onError: expectAsync1((error) { + hadError = true; + expect(error, isA()); + }, max: -1), + ); expect(hadError, true); }); }); diff --git a/pkgs/package_config/test/package_config_impl_test.dart b/pkgs/package_config/test/package_config_impl_test.dart index fff82fa5e4..0ad399e2b5 100644 --- a/pkgs/package_config/test/package_config_impl_test.dart +++ b/pkgs/package_config/test/package_config_impl_test.dart @@ -21,22 +21,20 @@ void main() { test('negative major', () { expect( - () => LanguageVersion(-1, 1), - throwsA(isA().having( - (e) => e.name, - 'message', - contains('major'), - ))); + () => LanguageVersion(-1, 1), + throwsA( + isA().having((e) => e.name, 'message', contains('major')), + ), + ); }); test('negative minor', () { expect( - () => LanguageVersion(1, -1), - throwsA(isA().having( - (e) => e.name, - 'message', - contains('minor'), - ))); + () => LanguageVersion(1, -1), + throwsA( + isA().having((e) => e.name, 'message', contains('minor')), + ), + ); }); test('minimal parse', () { @@ -47,13 +45,18 @@ void main() { void failParse(String name, String input) { test('$name - error', () { - expect(() => LanguageVersion.parse(input), - throwsA(isA())); + expect( + () => LanguageVersion.parse(input), + throwsA(isA()), + ); expect(() => LanguageVersion.parse(input), throwsFormatException); var failed = false; - var actual = LanguageVersion.parse(input, onError: (_) { - failed = true; - }); + var actual = LanguageVersion.parse( + input, + onError: (_) { + failed = true; + }, + ); expect(failed, true); expect(actual, isA()); }); @@ -101,7 +104,9 @@ void main() { /// Test that the relational comparisons between two valid versions /// match the results of `compareTo`. void testComparisons( - LanguageVersion version, LanguageVersion otherVersion) { + LanguageVersion version, + LanguageVersion otherVersion, + ) { expect(version == otherVersion, version.compareTo(otherVersion) == 0); expect(version < otherVersion, version.compareTo(otherVersion) < 0); @@ -164,11 +169,14 @@ void main() { test('absolute package root', () { var version = LanguageVersion(1, 1); var absolute = root.resolve('foo/bar/'); - var package = Package('name', root, - packageUriRoot: absolute, - relativeRoot: false, - languageVersion: version, - extraData: unique); + var package = Package( + 'name', + root, + packageUriRoot: absolute, + relativeRoot: false, + languageVersion: version, + extraData: unique, + ); expect(package.name, 'name'); expect(package.root, root); expect(package.packageUriRoot, absolute); @@ -180,8 +188,13 @@ void main() { test('relative package root', () { var relative = Uri.parse('foo/bar/'); var absolute = root.resolveUri(relative); - var package = Package('name', root, - packageUriRoot: relative, relativeRoot: true, extraData: unique); + var package = Package( + 'name', + root, + packageUriRoot: relative, + relativeRoot: true, + extraData: unique, + ); expect(package.name, 'name'); expect(package.root, root); expect(package.packageUriRoot, absolute); @@ -198,22 +211,30 @@ void main() { test('Invalid root, not absolute', () { expect( - () => Package('name', Uri.parse('/foo/')), throwsPackageConfigError); + () => Package('name', Uri.parse('/foo/')), + throwsPackageConfigError, + ); }); test('Invalid root, not ending in slash', () { - expect(() => Package('name', Uri.parse('file:///foo')), - throwsPackageConfigError); + expect( + () => Package('name', Uri.parse('file:///foo')), + throwsPackageConfigError, + ); }); test('invalid package root, not ending in slash', () { - expect(() => Package('name', root, packageUriRoot: Uri.parse('foo')), - throwsPackageConfigError); + expect( + () => Package('name', root, packageUriRoot: Uri.parse('foo')), + throwsPackageConfigError, + ); }); test('invalid package root, not inside root', () { - expect(() => Package('name', root, packageUriRoot: Uri.parse('../baz/')), - throwsPackageConfigError); + expect( + () => Package('name', root, packageUriRoot: Uri.parse('../baz/')), + throwsPackageConfigError, + ); }); }); @@ -238,19 +259,26 @@ void main() { }); }); test('writeString', () { - var config = PackageConfig([ - Package('foo', Uri.parse('file:///pkg/foo/'), + var config = PackageConfig( + [ + Package( + 'foo', + Uri.parse('file:///pkg/foo/'), packageUriRoot: Uri.parse('file:///pkg/foo/lib/'), relativeRoot: false, languageVersion: LanguageVersion(2, 4), - extraData: {'foo': 'foo!'}), - Package('bar', Uri.parse('file:///pkg/bar/'), + extraData: {'foo': 'foo!'}, + ), + Package( + 'bar', + Uri.parse('file:///pkg/bar/'), packageUriRoot: Uri.parse('file:///pkg/bar/lib/'), relativeRoot: true, - extraData: {'bar': 'bar!'}), - ], extraData: { - 'extra': 'data' - }); + extraData: {'bar': 'bar!'}, + ), + ], + extraData: {'extra': 'data'}, + ); var buffer = StringBuffer(); PackageConfig.writeString(config, buffer, Uri.parse('file:///pkg/')); var text = buffer.toString(); @@ -265,12 +293,7 @@ void main() { 'languageVersion': '2.4', 'foo': 'foo!', }, - { - 'name': 'bar', - 'rootUri': 'bar/', - 'packageUri': 'lib/', - 'bar': 'bar!', - }, + {'name': 'bar', 'rootUri': 'bar/', 'packageUri': 'lib/', 'bar': 'bar!'}, ]), 'extra': 'data', }); diff --git a/pkgs/package_config/test/parse_test.dart b/pkgs/package_config/test/parse_test.dart index 1db51716fb..d5c73258fd 100644 --- a/pkgs/package_config/test/parse_test.dart +++ b/pkgs/package_config/test/parse_test.dart @@ -16,20 +16,30 @@ import 'src/util.dart'; void main() { group('.packages', () { test('valid', () { - var packagesFile = '# Generated by pub yadda yadda\n' + var packagesFile = + '# Generated by pub yadda yadda\n' 'foo:file:///foo/lib/\n' 'bar:/bar/lib/\n' 'baz:lib/\n'; - var result = packages.parse(utf8.encode(packagesFile), - Uri.parse('file:///tmp/file.dart'), throwError); + var result = packages.parse( + utf8.encode(packagesFile), + Uri.parse('file:///tmp/file.dart'), + throwError, + ); expect(result.version, 1); expect({for (var p in result.packages) p.name}, {'foo', 'bar', 'baz'}); - expect(result.resolve(pkg('foo', 'foo.dart')), - Uri.parse('file:///foo/lib/foo.dart')); - expect(result.resolve(pkg('bar', 'bar.dart')), - Uri.parse('file:///bar/lib/bar.dart')); - expect(result.resolve(pkg('baz', 'baz.dart')), - Uri.parse('file:///tmp/lib/baz.dart')); + expect( + result.resolve(pkg('foo', 'foo.dart')), + Uri.parse('file:///foo/lib/foo.dart'), + ); + expect( + result.resolve(pkg('bar', 'bar.dart')), + Uri.parse('file:///bar/lib/bar.dart'), + ); + expect( + result.resolve(pkg('baz', 'baz.dart')), + Uri.parse('file:///tmp/lib/baz.dart'), + ); var foo = result['foo']!; expect(foo, isNotNull); @@ -42,7 +52,10 @@ void main() { test('valid empty', () { var packagesFile = '# Generated by pub yadda yadda\n'; var result = packages.parse( - utf8.encode(packagesFile), Uri.file('/tmp/file.dart'), throwError); + utf8.encode(packagesFile), + Uri.file('/tmp/file.dart'), + throwError, + ); expect(result.version, 1); expect({for (var p in result.packages) p.name}, {}); }); @@ -52,8 +65,9 @@ void main() { void testThrows(String name, String content) { test(name, () { expect( - () => packages.parse(utf8.encode(content), baseFile, throwError), - throwsA(isA())); + () => packages.parse(utf8.encode(content), baseFile, throwError), + throwsA(isA()), + ); }); test('$name, handle error', () { var hadError = false; @@ -111,18 +125,29 @@ void main() { "other": [42] } '''; - var config = parsePackageConfigBytes(utf8.encode(packageConfigFile), - Uri.parse('file:///tmp/.dart_tool/file.dart'), throwError); + var config = parsePackageConfigBytes( + utf8.encode(packageConfigFile), + Uri.parse('file:///tmp/.dart_tool/file.dart'), + throwError, + ); expect(config.version, 2); - expect({for (var p in config.packages) p.name}, - {'foo', 'bar', 'baz', 'noslash'}); + expect( + {for (var p in config.packages) p.name}, + {'foo', 'bar', 'baz', 'noslash'}, + ); - expect(config.resolve(pkg('foo', 'foo.dart')), - Uri.parse('file:///foo/lib/foo.dart')); - expect(config.resolve(pkg('bar', 'bar.dart')), - Uri.parse('file:///bar/lib/bar.dart')); - expect(config.resolve(pkg('baz', 'baz.dart')), - Uri.parse('file:///tmp/lib/baz.dart')); + expect( + config.resolve(pkg('foo', 'foo.dart')), + Uri.parse('file:///foo/lib/foo.dart'), + ); + expect( + config.resolve(pkg('bar', 'bar.dart')), + Uri.parse('file:///bar/lib/bar.dart'), + ); + expect( + config.resolve(pkg('baz', 'baz.dart')), + Uri.parse('file:///tmp/lib/baz.dart'), + ); var foo = config['foo']!; expect(foo, isNotNull); @@ -157,7 +182,7 @@ void main() { expect(config.extraData, { 'generator': 'pub', - 'other': [42] + 'other': [42], }); }); @@ -189,20 +214,29 @@ void main() { "configVersion": 2 } '''; - var config = parsePackageConfigBytes(utf8.encode(packageConfigFile), - Uri.parse('file:///tmp/.dart_tool/file.dart'), throwError); + var config = parsePackageConfigBytes( + utf8.encode(packageConfigFile), + Uri.parse('file:///tmp/.dart_tool/file.dart'), + throwError, + ); expect(config.version, 2); expect({for (var p in config.packages) p.name}, {'foo', 'bar', 'baz'}); - expect(config.resolve(pkg('foo', 'foo.dart')), - Uri.parse('file:///foo/lib/foo.dart')); - expect(config.resolve(pkg('bar', 'bar.dart')), - Uri.parse('file:///bar/lib/bar.dart')); - expect(config.resolve(pkg('baz', 'baz.dart')), - Uri.parse('file:///tmp/lib/baz.dart')); + expect( + config.resolve(pkg('foo', 'foo.dart')), + Uri.parse('file:///foo/lib/foo.dart'), + ); + expect( + config.resolve(pkg('bar', 'bar.dart')), + Uri.parse('file:///bar/lib/bar.dart'), + ); + expect( + config.resolve(pkg('baz', 'baz.dart')), + Uri.parse('file:///tmp/lib/baz.dart'), + ); expect(config.extraData, { 'generator': 'pub', - 'other': [42] + 'other': [42], }); }); @@ -213,8 +247,11 @@ void main() { var name = '"name":"foo"'; var root = '"rootUri":"/foo/"'; test('minimal', () { - var config = parsePackageConfigBytes(utf8.encode('{$cfg,$pkgs}'), - Uri.parse('file:///tmp/.dart_tool/file.dart'), throwError); + var config = parsePackageConfigBytes( + utf8.encode('{$cfg,$pkgs}'), + Uri.parse('file:///tmp/.dart_tool/file.dart'), + throwError, + ); expect(config.version, 2); expect(config.packages, isEmpty); }); @@ -222,103 +259,156 @@ void main() { // A package must have a name and a rootUri, the remaining properties // are optional. var config = parsePackageConfigBytes( - // ignore: unnecessary_cast - utf8.encode('{$cfg,"packages":[{$name,$root}]}'), - Uri.parse('file:///tmp/.dart_tool/file.dart'), - throwError); + utf8.encode('{$cfg,"packages":[{$name,$root}]}'), + Uri.parse('file:///tmp/.dart_tool/file.dart'), + throwError, + ); expect(config.version, 2); expect(config.packages.first.name, 'foo'); }); test('nested packages', () { - var configBytes = utf8.encode(json.encode({ - 'configVersion': 2, - 'packages': [ - {'name': 'foo', 'rootUri': '/foo/', 'packageUri': 'lib/'}, - {'name': 'bar', 'rootUri': '/foo/bar/', 'packageUri': 'lib/'}, - {'name': 'baz', 'rootUri': '/foo/bar/baz/', 'packageUri': 'lib/'}, - {'name': 'qux', 'rootUri': '/foo/qux/', 'packageUri': 'lib/'}, - ] - })); - var config = parsePackageConfigBytes(configBytes, - Uri.parse('file:///tmp/.dart_tool/file.dart'), throwError); + var configBytes = utf8.encode( + json.encode({ + 'configVersion': 2, + 'packages': [ + {'name': 'foo', 'rootUri': '/foo/', 'packageUri': 'lib/'}, + {'name': 'bar', 'rootUri': '/foo/bar/', 'packageUri': 'lib/'}, + {'name': 'baz', 'rootUri': '/foo/bar/baz/', 'packageUri': 'lib/'}, + {'name': 'qux', 'rootUri': '/foo/qux/', 'packageUri': 'lib/'}, + ], + }), + ); + var config = parsePackageConfigBytes( + configBytes, + Uri.parse('file:///tmp/.dart_tool/file.dart'), + throwError, + ); expect(config.version, 2); - expect(config.packageOf(Uri.parse('file:///foo/lala/lala.dart'))!.name, - 'foo'); - expect(config.packageOf(Uri.parse('file:///foo/bar/lala.dart'))!.name, - 'bar'); - expect(config.packageOf(Uri.parse('file:///foo/bar/baz/lala.dart'))!.name, - 'baz'); - expect(config.packageOf(Uri.parse('file:///foo/qux/lala.dart'))!.name, - 'qux'); - expect(config.toPackageUri(Uri.parse('file:///foo/lib/diz')), - Uri.parse('package:foo/diz')); - expect(config.toPackageUri(Uri.parse('file:///foo/bar/lib/diz')), - Uri.parse('package:bar/diz')); - expect(config.toPackageUri(Uri.parse('file:///foo/bar/baz/lib/diz')), - Uri.parse('package:baz/diz')); - expect(config.toPackageUri(Uri.parse('file:///foo/qux/lib/diz')), - Uri.parse('package:qux/diz')); + expect( + config.packageOf(Uri.parse('file:///foo/lala/lala.dart'))!.name, + 'foo', + ); + expect( + config.packageOf(Uri.parse('file:///foo/bar/lala.dart'))!.name, + 'bar', + ); + expect( + config.packageOf(Uri.parse('file:///foo/bar/baz/lala.dart'))!.name, + 'baz', + ); + expect( + config.packageOf(Uri.parse('file:///foo/qux/lala.dart'))!.name, + 'qux', + ); + expect( + config.toPackageUri(Uri.parse('file:///foo/lib/diz')), + Uri.parse('package:foo/diz'), + ); + expect( + config.toPackageUri(Uri.parse('file:///foo/bar/lib/diz')), + Uri.parse('package:bar/diz'), + ); + expect( + config.toPackageUri(Uri.parse('file:///foo/bar/baz/lib/diz')), + Uri.parse('package:baz/diz'), + ); + expect( + config.toPackageUri(Uri.parse('file:///foo/qux/lib/diz')), + Uri.parse('package:qux/diz'), + ); }); test('nested packages 2', () { - var configBytes = utf8.encode(json.encode({ - 'configVersion': 2, - 'packages': [ - {'name': 'foo', 'rootUri': '/', 'packageUri': 'lib/'}, - {'name': 'bar', 'rootUri': '/bar/', 'packageUri': 'lib/'}, - {'name': 'baz', 'rootUri': '/bar/baz/', 'packageUri': 'lib/'}, - {'name': 'qux', 'rootUri': '/qux/', 'packageUri': 'lib/'}, - ] - })); - var config = parsePackageConfigBytes(configBytes, - Uri.parse('file:///tmp/.dart_tool/file.dart'), throwError); + var configBytes = utf8.encode( + json.encode({ + 'configVersion': 2, + 'packages': [ + {'name': 'foo', 'rootUri': '/', 'packageUri': 'lib/'}, + {'name': 'bar', 'rootUri': '/bar/', 'packageUri': 'lib/'}, + {'name': 'baz', 'rootUri': '/bar/baz/', 'packageUri': 'lib/'}, + {'name': 'qux', 'rootUri': '/qux/', 'packageUri': 'lib/'}, + ], + }), + ); + var config = parsePackageConfigBytes( + configBytes, + Uri.parse('file:///tmp/.dart_tool/file.dart'), + throwError, + ); expect(config.version, 2); expect( - config.packageOf(Uri.parse('file:///lala/lala.dart'))!.name, 'foo'); + config.packageOf(Uri.parse('file:///lala/lala.dart'))!.name, + 'foo', + ); expect(config.packageOf(Uri.parse('file:///bar/lala.dart'))!.name, 'bar'); - expect(config.packageOf(Uri.parse('file:///bar/baz/lala.dart'))!.name, - 'baz'); + expect( + config.packageOf(Uri.parse('file:///bar/baz/lala.dart'))!.name, + 'baz', + ); expect(config.packageOf(Uri.parse('file:///qux/lala.dart'))!.name, 'qux'); - expect(config.toPackageUri(Uri.parse('file:///lib/diz')), - Uri.parse('package:foo/diz')); - expect(config.toPackageUri(Uri.parse('file:///bar/lib/diz')), - Uri.parse('package:bar/diz')); - expect(config.toPackageUri(Uri.parse('file:///bar/baz/lib/diz')), - Uri.parse('package:baz/diz')); - expect(config.toPackageUri(Uri.parse('file:///qux/lib/diz')), - Uri.parse('package:qux/diz')); + expect( + config.toPackageUri(Uri.parse('file:///lib/diz')), + Uri.parse('package:foo/diz'), + ); + expect( + config.toPackageUri(Uri.parse('file:///bar/lib/diz')), + Uri.parse('package:bar/diz'), + ); + expect( + config.toPackageUri(Uri.parse('file:///bar/baz/lib/diz')), + Uri.parse('package:baz/diz'), + ); + expect( + config.toPackageUri(Uri.parse('file:///qux/lib/diz')), + Uri.parse('package:qux/diz'), + ); }); test('packageOf is case sensitive on windows', () { - var configBytes = utf8.encode(json.encode({ - 'configVersion': 2, - 'packages': [ - {'name': 'foo', 'rootUri': 'file:///C:/Foo/', 'packageUri': 'lib/'}, - ] - })); - var config = parsePackageConfigBytes(configBytes, - Uri.parse('file:///C:/tmp/.dart_tool/file.dart'), throwError); + var configBytes = utf8.encode( + json.encode({ + 'configVersion': 2, + 'packages': [ + {'name': 'foo', 'rootUri': 'file:///C:/Foo/', 'packageUri': 'lib/'}, + ], + }), + ); + var config = parsePackageConfigBytes( + configBytes, + Uri.parse('file:///C:/tmp/.dart_tool/file.dart'), + throwError, + ); expect(config.version, 2); expect( - config.packageOf(Uri.parse('file:///C:/foo/lala/lala.dart')), null); - expect(config.packageOf(Uri.parse('file:///C:/Foo/lala/lala.dart'))!.name, - 'foo'); + config.packageOf(Uri.parse('file:///C:/foo/lala/lala.dart')), + null, + ); + expect( + config.packageOf(Uri.parse('file:///C:/Foo/lala/lala.dart'))!.name, + 'foo', + ); }); group('invalid', () { void testThrows(String name, String source) { test(name, () { expect( - // ignore: unnecessary_cast - () => parsePackageConfigBytes(utf8.encode(source), - Uri.parse('file:///tmp/.dart_tool/file.dart'), throwError), - throwsA(isA())); + () => parsePackageConfigBytes( + utf8.encode(source), + Uri.parse('file:///tmp/.dart_tool/file.dart'), + throwError, + ), + throwsA(isA()), + ); }); } void testThrowsContains( - String name, String source, String containsString) { + String name, + String source, + String containsString, + ) { test(name, () { dynamic exception; try { @@ -364,11 +454,17 @@ void main() { testThrows('one-dot', '{$cfg,"packages":[{"name":".",$root}]}'); testThrows('two-dot', '{$cfg,"packages":[{"name":"..",$root}]}'); testThrows( - "invalid char '\\'", '{$cfg,"packages":[{"name":"\\",$root}]}'); + "invalid char '\\'", + '{$cfg,"packages":[{"name":"\\",$root}]}', + ); testThrows( - "invalid char ':'", '{$cfg,"packages":[{"name":":",$root}]}'); + "invalid char ':'", + '{$cfg,"packages":[{"name":":",$root}]}', + ); testThrows( - "invalid char ' '", '{$cfg,"packages":[{"name":" ",$root}]}'); + "invalid char ' '", + '{$cfg,"packages":[{"name":" ",$root}]}', + ); }); testThrows('no root', '{$cfg,"packages":[{$name}]}'); @@ -378,91 +474,140 @@ void main() { testThrows('object', '{$cfg,"packages":[{$name,"rootUri":{}}]}'); testThrows('fragment', '{$cfg,"packages":[{$name,"rootUri":"x/#"}]}'); testThrows('query', '{$cfg,"packages":[{$name,"rootUri":"x/?"}]}'); - testThrows('package-URI', - '{$cfg,"packages":[{$name,"rootUri":"package:x/x/"}]}'); + testThrows( + 'package-URI', + '{$cfg,"packages":[{$name,"rootUri":"package:x/x/"}]}', + ); }); group('package-URI root:', () { testThrows( - 'null', '{$cfg,"packages":[{$name,$root,"packageUri":null}]}'); + 'null', + '{$cfg,"packages":[{$name,$root,"packageUri":null}]}', + ); testThrows('num', '{$cfg,"packages":[{$name,$root,"packageUri":1}]}'); testThrows( - 'object', '{$cfg,"packages":[{$name,$root,"packageUri":{}}]}'); - testThrows('fragment', - '{$cfg,"packages":[{$name,$root,"packageUri":"x/#"}]}'); + 'object', + '{$cfg,"packages":[{$name,$root,"packageUri":{}}]}', + ); + testThrows( + 'fragment', + '{$cfg,"packages":[{$name,$root,"packageUri":"x/#"}]}', + ); + testThrows( + 'query', + '{$cfg,"packages":[{$name,$root,"packageUri":"x/?"}]}', + ); + testThrows( + 'package: URI', + '{$cfg,"packages":[{$name,$root,"packageUri":"package:x/x/"}]}', + ); testThrows( - 'query', '{$cfg,"packages":[{$name,$root,"packageUri":"x/?"}]}'); - testThrows('package: URI', - '{$cfg,"packages":[{$name,$root,"packageUri":"package:x/x/"}]}'); - testThrows('not inside root', - '{$cfg,"packages":[{$name,$root,"packageUri":"../other/"}]}'); + 'not inside root', + '{$cfg,"packages":[{$name,$root,"packageUri":"../other/"}]}', + ); }); group('language version', () { - testThrows('null', - '{$cfg,"packages":[{$name,$root,"languageVersion":null}]}'); testThrows( - 'num', '{$cfg,"packages":[{$name,$root,"languageVersion":1}]}'); - testThrows('object', - '{$cfg,"packages":[{$name,$root,"languageVersion":{}}]}'); - testThrows('empty', - '{$cfg,"packages":[{$name,$root,"languageVersion":""}]}'); - testThrows('non number.number', - '{$cfg,"packages":[{$name,$root,"languageVersion":"x.1"}]}'); - testThrows('number.non number', - '{$cfg,"packages":[{$name,$root,"languageVersion":"1.x"}]}'); - testThrows('non number', - '{$cfg,"packages":[{$name,$root,"languageVersion":"x"}]}'); - testThrows('one number', - '{$cfg,"packages":[{$name,$root,"languageVersion":"1"}]}'); - testThrows('three numbers', - '{$cfg,"packages":[{$name,$root,"languageVersion":"1.2.3"}]}'); - testThrows('leading zero first', - '{$cfg,"packages":[{$name,$root,"languageVersion":"01.1"}]}'); - testThrows('leading zero second', - '{$cfg,"packages":[{$name,$root,"languageVersion":"1.01"}]}'); - testThrows('trailing-', - '{$cfg,"packages":[{$name,$root,"languageVersion":"1.1-1"}]}'); - testThrows('trailing+', - '{$cfg,"packages":[{$name,$root,"languageVersion":"1.1+1"}]}'); + 'null', + '{$cfg,"packages":[{$name,$root,"languageVersion":null}]}', + ); + testThrows( + 'num', + '{$cfg,"packages":[{$name,$root,"languageVersion":1}]}', + ); + testThrows( + 'object', + '{$cfg,"packages":[{$name,$root,"languageVersion":{}}]}', + ); + testThrows( + 'empty', + '{$cfg,"packages":[{$name,$root,"languageVersion":""}]}', + ); + testThrows( + 'non number.number', + '{$cfg,"packages":[{$name,$root,"languageVersion":"x.1"}]}', + ); + testThrows( + 'number.non number', + '{$cfg,"packages":[{$name,$root,"languageVersion":"1.x"}]}', + ); + testThrows( + 'non number', + '{$cfg,"packages":[{$name,$root,"languageVersion":"x"}]}', + ); + testThrows( + 'one number', + '{$cfg,"packages":[{$name,$root,"languageVersion":"1"}]}', + ); + testThrows( + 'three numbers', + '{$cfg,"packages":[{$name,$root,"languageVersion":"1.2.3"}]}', + ); + testThrows( + 'leading zero first', + '{$cfg,"packages":[{$name,$root,"languageVersion":"01.1"}]}', + ); + testThrows( + 'leading zero second', + '{$cfg,"packages":[{$name,$root,"languageVersion":"1.01"}]}', + ); + testThrows( + 'trailing-', + '{$cfg,"packages":[{$name,$root,"languageVersion":"1.1-1"}]}', + ); + testThrows( + 'trailing+', + '{$cfg,"packages":[{$name,$root,"languageVersion":"1.1+1"}]}', + ); }); }); - testThrows('duplicate package name', - '{$cfg,"packages":[{$name,$root},{$name,"rootUri":"/other/"}]}'); + testThrows( + 'duplicate package name', + '{$cfg,"packages":[{$name,$root},{$name,"rootUri":"/other/"}]}', + ); testThrowsContains( - // The roots of foo and bar are the same. - 'same roots', - '{$cfg,"packages":[{$name,$root},{"name":"bar",$root}]}', - 'the same root directory'); + // The roots of foo and bar are the same. + 'same roots', + '{$cfg,"packages":[{$name,$root},{"name":"bar",$root}]}', + 'the same root directory', + ); testThrowsContains( - // The roots of foo and bar are the same. - 'same roots 2', - '{$cfg,"packages":[{$name,"rootUri":"/"},{"name":"bar","rootUri":"/"}]}', - 'the same root directory'); + // The roots of foo and bar are the same. + 'same roots 2', + '{$cfg,"packages":[{$name,"rootUri":"/"},{"name":"bar","rootUri":"/"}]}', + 'the same root directory', + ); testThrowsContains( - // The root of bar is inside the root of foo, - // but the package root of foo is inside the root of bar. - 'between root and lib', - '{$cfg,"packages":[' - '{"name":"foo","rootUri":"/foo/","packageUri":"bar/lib/"},' - '{"name":"bar","rootUri":"/foo/bar/","packageUri":"baz/lib"}]}', - 'package root of foo is inside the root of bar'); + // The root of bar is inside the root of foo, + // but the package root of foo is inside the root of bar. + 'between root and lib', + '{$cfg,"packages":[' + '{"name":"foo","rootUri":"/foo/","packageUri":"bar/lib/"},' + '{"name":"bar","rootUri":"/foo/bar/","packageUri":"baz/lib"}]}', + 'package root of foo is inside the root of bar', + ); // This shouldn't be allowed, but for internal reasons it is. test('package inside package root', () { var config = parsePackageConfigBytes( - utf8.encode( - '{$cfg,"packages":[' - '{"name":"foo","rootUri":"/foo/","packageUri":"lib/"},' - '{"name":"bar","rootUri":"/foo/lib/bar/","packageUri":"lib"}]}', - ), - Uri.parse('file:///tmp/.dart_tool/file.dart'), - throwError); + utf8.encode( + '{$cfg,"packages":[' + '{"name":"foo","rootUri":"/foo/","packageUri":"lib/"},' + '{"name":"bar","rootUri":"/foo/lib/bar/","packageUri":"lib"}]}', + ), + Uri.parse('file:///tmp/.dart_tool/file.dart'), + throwError, + ); expect( - config - .packageOf(Uri.parse('file:///foo/lib/bar/lib/lala.dart'))! - .name, - 'foo'); // why not bar? - expect(config.toPackageUri(Uri.parse('file:///foo/lib/bar/lib/diz')), - Uri.parse('package:foo/bar/lib/diz')); // why not package:bar/diz? + config + .packageOf(Uri.parse('file:///foo/lib/bar/lib/lala.dart'))! + .name, + 'foo', + ); // why not bar? + expect( + config.toPackageUri(Uri.parse('file:///foo/lib/bar/lib/diz')), + Uri.parse('package:foo/bar/lib/diz'), + ); // why not package:bar/diz? }); }); }); @@ -482,10 +627,16 @@ void main() { var expectedPackage = expected[name]!; expect(expectedPackage, isNotNull); expect(package.root, expectedPackage.root, reason: 'root'); - expect(package.packageUriRoot, expectedPackage.packageUriRoot, - reason: 'package root'); - expect(package.languageVersion, expectedPackage.languageVersion, - reason: 'languageVersion'); + expect( + package.packageUriRoot, + expectedPackage.packageUriRoot, + reason: 'package root', + ); + expect( + package.languageVersion, + expectedPackage.languageVersion, + reason: 'languageVersion', + ); }); } }); @@ -503,34 +654,58 @@ void main() { '''; var baseUri = Uri.parse('file:///start/'); var config = PackageConfig([ - Package('foo', Uri.parse('file:///start/foo/'), - packageUriRoot: Uri.parse('file:///start/foo/bar/'), - languageVersion: LanguageVersion(1, 2)) + Package( + 'foo', + Uri.parse('file:///start/foo/'), + packageUriRoot: Uri.parse('file:///start/foo/bar/'), + languageVersion: LanguageVersion(1, 2), + ), ]); testConfig( - 'string', PackageConfig.parseString(configText, baseUri), config); + 'string', + PackageConfig.parseString(configText, baseUri), + config, + ); + testConfig( + 'bytes', + PackageConfig.parseBytes( + Uint8List.fromList(configText.codeUnits), + baseUri, + ), + config, + ); testConfig( - 'bytes', - PackageConfig.parseBytes( - Uint8List.fromList(configText.codeUnits), baseUri), - config); - testConfig('json', PackageConfig.parseJson(jsonDecode(configText), baseUri), - config); + 'json', + PackageConfig.parseJson(jsonDecode(configText), baseUri), + config, + ); baseUri = Uri.parse('file:///start2/'); config = PackageConfig([ - Package('foo', Uri.parse('file:///start2/foo/'), - packageUriRoot: Uri.parse('file:///start2/foo/bar/'), - languageVersion: LanguageVersion(1, 2)) + Package( + 'foo', + Uri.parse('file:///start2/foo/'), + packageUriRoot: Uri.parse('file:///start2/foo/bar/'), + languageVersion: LanguageVersion(1, 2), + ), ]); testConfig( - 'string2', PackageConfig.parseString(configText, baseUri), config); + 'string2', + PackageConfig.parseString(configText, baseUri), + config, + ); + testConfig( + 'bytes2', + PackageConfig.parseBytes( + Uint8List.fromList(configText.codeUnits), + baseUri, + ), + config, + ); testConfig( - 'bytes2', - PackageConfig.parseBytes( - Uint8List.fromList(configText.codeUnits), baseUri), - config); - testConfig('json2', - PackageConfig.parseJson(jsonDecode(configText), baseUri), config); + 'json2', + PackageConfig.parseJson(jsonDecode(configText), baseUri), + config, + ); }); } diff --git a/pkgs/package_config/test/src/util_io.dart b/pkgs/package_config/test/src/util_io.dart index e032556f4d..40bd231b73 100644 --- a/pkgs/package_config/test/src/util_io.dart +++ b/pkgs/package_config/test/src/util_io.dart @@ -13,8 +13,11 @@ import 'package:test/test.dart'; /// it's a subdirectory, otherwise it's a file and the value is the content /// as a string. /// Introduces a group to hold the [setUp]/[tearDown] logic. -void fileTest(String name, Map description, - void Function(Directory directory) fileTest) { +void fileTest( + String name, + Map description, + void Function(Directory directory) fileTest, +) { group('file-test', () { var tempDir = Directory.systemTemp.createTempSync('pkgcfgtest'); setUp(() {