blob: c33dda62885e6a2274488a23d5eb7d2cd43d2519 [file] [log] [blame]
// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:io';
import 'dart:isolate';
import 'package:package_config/package_config.dart';
import 'package:path/path.dart' as p;
/// The [PackageConfig] parsed from the current isolates package config file.
final Future<PackageConfig> currentPackageConfig = () async {
return loadPackageConfigUri(await packageConfigUri);
}();
final Future<Uri> packageConfigUri = () async {
var uri = await Isolate.packageConfig;
if (uri == null) {
throw StateError('Unable to find a package config');
}
return uri;
}();
final _originalWorkingDirectory = Directory.current.uri;
/// Returns an `package:` URI for [path] if it is in a package, otherwise
/// returns an absolute file URI.
Future<Uri> absoluteUri(String path) async {
final uri = p.toUri(path);
final absoluteUri =
uri.isAbsolute ? uri : _originalWorkingDirectory.resolveUri(uri);
try {
final packageConfig = await currentPackageConfig;
return packageConfig.toPackageUri(absoluteUri) ?? absoluteUri;
} on StateError {
// Workaround for a missing package config.
return absoluteUri;
}
}