Chromium Code Reviews| Index: lib/src/package_root_resolver.dart |
| diff --git a/lib/src/package_root_resolver.dart b/lib/src/package_root_resolver.dart |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..ec9c6cdda9a9c8868ef089d34e33cef45dbf08c3 |
| --- /dev/null |
| +++ b/lib/src/package_root_resolver.dart |
| @@ -0,0 +1,65 @@ |
| +// Copyright (c) 2016, 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 'package:path/path.dart' as p; |
| + |
| +import 'async_package_resolver.dart'; |
| +import 'package_resolver.dart'; |
| +import 'sync_package_resolver.dart'; |
| +import 'utils.dart'; |
| + |
| +/// A package resolution strategy based on a package root URI. |
| +class PackageRootResolver implements SyncPackageResolver { |
| + final packageConfigMap = null; |
| + final packageConfigUri = null; |
| + |
| + final Uri packageRoot; |
| + |
| + PackageResolver get asAsync => new AsyncPackageResolver(this); |
| + |
| + String get processArgument => "--package-root=$packageRoot"; |
| + |
| + PackageRootResolver(packageRoot) |
| + : packageRoot = (() { |
| + packageRoot = asUri(packageRoot, "packageRoot"); |
| + return packageRoot.pathSegments.last.isEmpty |
| + ? packageRoot |
| + : packageRoot.replace( |
| + pathSegments: packageRoot.pathSegments.toList()..add("")); |
|
Bob Nystrom
2016/07/21 18:00:32
This logic pretty much exists elsewhere too. Make
nweiz
2016/07/21 19:42:43
Done.
|
| + })(); |
| + |
| + Uri resolveUri(packageUri) { |
| + packageUri = asPackageUri(packageUri, "packageUri"); |
| + |
| + // Following [Isolate.resolvePackageUri], "package:foo" resolves to null. |
| + if (packageUri.pathSegments.length == 1) return null; |
| + return packageRoot.resolve(packageUri.path); |
| + } |
| + |
| + Uri urlFor(String package, [String path]) { |
| + var result = packageRoot.resolve("$package/"); |
| + return path == null ? result : result.resolve(path); |
| + } |
| + |
| + Uri packageUriFor(url) { |
| + var packageRootString = packageRoot.toString(); |
| + url = asUri(url, "url").toString(); |
| + if (!p.url.isWithin(packageRootString, url)) return null; |
| + |
| + var relative = p.url.relative(url, from: packageRootString); |
| + if (!relative.contains("/")) relative += "/"; |
| + return Uri.parse("package:$relative"); |
| + } |
| + |
| + String packagePath(String package) { |
| + if (packageRoot.scheme != 'file') return null; |
| + |
| + var libLink = p.join(p.fromUri(packageRoot), package); |
| + if (!new Link(libLink).existsSync()) return null; |
| + |
| + return p.dirname(new Link(libLink).resolveSymbolicLinksSync()); |
| + } |
| +} |