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..c9a06fff4f503c077dc3f1a380c03e6a192ec7fc |
--- /dev/null |
+++ b/lib/src/package_root_resolver.dart |
@@ -0,0 +1,59 @@ |
+// 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 = ensureTrailingSlash(asUri(packageRoot, "packageRoot")); |
+ |
+ 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()); |
+ } |
+} |