Index: sdk/lib/_internal/pub/lib/src/barback.dart |
diff --git a/sdk/lib/_internal/pub/lib/src/barback.dart b/sdk/lib/_internal/pub/lib/src/barback.dart |
index 803ec64fb69a049146313b9d4a05aaa3017c63fe..b41c48ad381c9a05bf17e7fbef97f799b67d877b 100644 |
--- a/sdk/lib/_internal/pub/lib/src/barback.dart |
+++ b/sdk/lib/_internal/pub/lib/src/barback.dart |
@@ -7,7 +7,10 @@ library pub.barback; |
import 'dart:async'; |
import 'package:barback/barback.dart'; |
+import 'package:path/path.dart' as path; |
+import 'barback/dart_forwarding_transformer.dart'; |
+import 'barback/dart2js_transformer.dart'; |
import 'barback/load_all_transformers.dart'; |
import 'barback/pub_package_provider.dart'; |
import 'barback/server.dart'; |
@@ -54,6 +57,12 @@ class TransformerId { |
Future<BarbackServer> createServer(String host, int port, PackageGraph graph) { |
var provider = new PubPackageProvider(graph); |
var barback = new Barback(provider); |
+ |
+ var builtInTransformers = [ |
nweiz
2013/09/27 22:21:17
Add a TODO here to add a dart2dart transformer and
Bob Nystrom
2013/09/28 00:56:11
Done.
|
+ new Dart2JSTransformer(graph), |
+ new DartForwardingTransformer() |
+ ]; |
+ |
return BarbackServer.bind(host, port, barback, graph.entrypoint.root.name) |
.then((server) { |
watchSources(graph, barback); |
@@ -75,7 +84,7 @@ Future<BarbackServer> createServer(String host, int port, PackageGraph graph) { |
}) |
]; |
- loadAllTransformers(server, graph).then((_) { |
+ loadAllTransformers(server, graph, builtInTransformers).then((_) { |
if (!completer.isCompleted) completer.complete(server); |
}).catchError((error) { |
if (!completer.isCompleted) completer.completeError(error); |
@@ -141,3 +150,56 @@ Uri idToPackageUri(AssetId id) { |
return new Uri(scheme: 'package', path: id.path.replaceFirst('lib/', '')); |
} |
+ |
+/// Converts a [uri] served by pub serve into an [AssetId] that can be |
nweiz
2013/09/27 22:21:17
"uri" -> "url", throughout this function (except t
Bob Nystrom
2013/09/28 00:56:11
Done.
|
+/// requested from barback. |
+AssetId uriToId(String rootPackage, Uri uri) { |
nweiz
2013/09/27 22:21:17
It feels like this should be a method on [BarbackS
Bob Nystrom
2013/09/28 00:56:11
Done.
|
+ var parts = path.url.split(uri.path); |
+ |
+ // Strip the leading "/" from the URL. |
+ parts.removeAt(0); |
+ |
+ try { |
+ var id = specialPathToId(parts); |
+ if (id != null) return id; |
+ } on FormatException catch(_) { |
nweiz
2013/09/27 22:21:17
Style nit: "catch (_)"
Bob Nystrom
2013/09/28 00:56:11
Done.
|
+ // If we got here, we had a path like "/packages" which is a special |
+ // directory, but not a valid path since it lacks a following package name. |
+ return null; |
nweiz
2013/09/27 22:21:17
It feels like throwing an error for an invalid URI
Bob Nystrom
2013/09/28 00:56:11
Done.
|
+ } |
+ |
+ // Otherwise, it's a path in current package's web directory. |
+ var relativePath = path.url.join("web", path.url.joinAll(parts)); |
+ return new AssetId(rootPackage, relativePath); |
+} |
+ |
+/// Converts [parts], a list of path components into an [AssetId] if [parts] |
nweiz
2013/09/27 22:21:17
"components" -> "components,"
Bob Nystrom
2013/09/28 00:56:11
Done.
|
+/// is from a path containing "packages" or "assets". |
+/// |
+/// If the path doesn't contain one of those special directories, returns null. |
+/// If it does contain a special directory, but lacks a following package name, |
+/// throws a [FormatException]. |
+AssetId specialPathToId(List<String> parts) { |
nweiz
2013/09/27 22:21:17
As a public API function of this library, it doesn
Bob Nystrom
2013/09/28 00:56:11
The problem is that this can be called with both U
nweiz
2013/09/30 17:33:34
That's easy to change by delaying the URI-to-path
Bob Nystrom
2013/10/01 19:08:55
Done.
|
+ for (var pair in [["packages", "lib"], ["assets", "asset"]]) { |
+ var partName = pair[0]; |
+ var dirName = pair[1]; |
nweiz
2013/09/27 22:21:17
Style nit: I like using [Iterable.first] and [Iter
Bob Nystrom
2013/09/28 00:56:11
Done.
|
+ |
+ // Find the package name and the relative path in the package. |
+ var index = parts.indexOf(partName); |
+ if (index == -1) continue; |
+ |
+ // If we got here, the path *did* contain the special directory, which |
+ // means we should not interpret it as a regular path, even if it's |
+ // missing the package name after it, which makes it invalid here. |
nweiz
2013/09/27 22:21:17
Nit: "as a regular path. If it's missing the packa
Bob Nystrom
2013/09/28 00:56:11
Done.
|
+ if (index + 1 >= parts.length) { |
+ throw new FormatException('Expected package named after "$partName".'); |
nweiz
2013/09/27 22:21:17
"named" -> "name"
I would include more context he
Bob Nystrom
2013/09/28 00:56:11
Done.
|
+ } |
+ |
+ var package = parts[index + 1]; |
+ var assetPath = path.url.join(dirName, |
+ path.url.joinAll(parts.skip(index + 2))); |
+ return new AssetId(package, assetPath); |
+ } |
+ |
+ return null; |
+} |