drop package_resolver dependency and release 2.x version
### Breaking changes
* Dropped the dependency on `package_resolver`.
* All `PackageResolver` apis now take a `Map<String, Uri>` of package name
to the base uri for resolving `package:` uris for that package.
* Named arguments have been renamed from `resolver` to `packageMap`.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7789778..f156022 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,12 @@
+## 2.0.0
+
+### Breaking changes
+
+* Dropped the dependency on `package_resolver`.
+ * All `PackageResolver` apis now take a `Map<String, Uri>` of package name
+ to the base uri for resolving `package:` uris for that package.
+ * Named arguments have been renamed from `resolver` to `packageMap`.
+
## 1.0.4
* Set max SDK version to `<3.0.0`, and adjust other dependencies.
diff --git a/lib/shelf_packages_handler.dart b/lib/shelf_packages_handler.dart
index 677db97..694dcb5 100644
--- a/lib/shelf_packages_handler.dart
+++ b/lib/shelf_packages_handler.dart
@@ -5,32 +5,22 @@
library shelf_packages_handler;
import 'package:shelf/shelf.dart';
-import 'package:shelf_static/shelf_static.dart';
-import 'package:package_resolver/package_resolver.dart';
-import 'package:path/path.dart' as p;
-import 'src/async_handler.dart';
import 'src/dir_handler.dart';
import 'src/package_config_handler.dart';
/// A handler that serves the contents of a virtual packages directory.
///
/// This effectively serves `package:${request.url}`. It locates packages using
-/// the package resolution logic defined by [resolver]. If [resolver] isn't
-/// passed, it defaults to the current isolate's package resolution logic.
+/// the mapping defined by [packageMap]. If [packageMap] isn't passed, it
+/// defaults to the current isolate's package resolution logic.
+///
+/// The [packageMap] maps package names to the base uri for resolving
+/// `package:` uris for that package.
///
/// This can only serve assets from `file:` URIs.
-Handler packagesHandler({PackageResolver resolver}) {
- resolver ??= PackageResolver.current;
- return AsyncHandler(resolver.packageRoot.then((packageRoot) {
- if (packageRoot != null) {
- return createStaticHandler(p.fromUri(packageRoot),
- serveFilesOutsidePath: true);
- } else {
- return PackageConfigHandler(resolver);
- }
- }));
-}
+Handler packagesHandler({Map<String, Uri> packageMap}) =>
+ PackageConfigHandler(packageMap: packageMap).handleRequest;
/// A handler that serves virtual `packages/` directories wherever they're
/// requested.
@@ -40,5 +30,5 @@
///
/// This is useful for ensuring that `package:` imports work for all entrypoints
/// in Dartium.
-Handler packagesDirHandler({PackageResolver resolver}) =>
- DirHandler('packages', packagesHandler(resolver: resolver));
+Handler packagesDirHandler({Map<String, Uri> packageMap}) =>
+ DirHandler('packages', packagesHandler(packageMap: packageMap));
diff --git a/lib/src/async_handler.dart b/lib/src/async_handler.dart
deleted file mode 100644
index c221aea..0000000
--- a/lib/src/async_handler.dart
+++ /dev/null
@@ -1,26 +0,0 @@
-// 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:async';
-
-import 'package:async/async.dart';
-import 'package:shelf/shelf.dart';
-
-class AsyncHandler {
- final ResultFuture<Handler> _future;
-
- AsyncHandler(Future<Handler> future) : _future = ResultFuture(future);
-
- FutureOr<Response> call(Request request) {
- if (_future.result == null) {
- return _future.then((handler) => handler(request));
- }
-
- if (_future.result.isError) {
- return Future.error(_future.result.asError.error);
- }
-
- return _future.result.asValue.value(request);
- }
-}
diff --git a/lib/src/package_config_handler.dart b/lib/src/package_config_handler.dart
index 563e66c..d984021 100644
--- a/lib/src/package_config_handler.dart
+++ b/lib/src/package_config_handler.dart
@@ -3,42 +3,52 @@
// BSD-style license that can be found in the LICENSE file.
import 'dart:async';
+import 'dart:isolate';
-import 'package:package_resolver/package_resolver.dart';
import 'package:path/path.dart' as p;
import 'package:shelf/shelf.dart';
import 'package:shelf_static/shelf_static.dart';
-import 'async_handler.dart';
-
/// A shelf handler that serves a virtual packages directory based on a package
/// config.
class PackageConfigHandler {
/// The static handlers for serving entries in the package config, indexed by
/// name.
- final _packageHandlers = <String, Handler>{};
+ final _packageHandlers = <String, Future<Handler>>{};
- /// The information specifying how to do package resolution.
- final PackageResolver _resolver;
+ /// Optional, a map of package names to base uri for resolving `package:`
+ /// uris for that package.
+ final Map<String, Uri> _packageMap;
- PackageConfigHandler(this._resolver);
+ PackageConfigHandler({Map<String, Uri> packageMap})
+ : _packageMap = packageMap;
/// The callback for handling a single request.
- FutureOr<Response> call(Request request) {
+ Future<Response> handleRequest(Request request) async {
var segments = request.url.pathSegments;
- return _handlerFor(segments.first)(request.change(path: segments.first));
+ var handler = await _handlerFor(segments.first);
+ return handler(request.change(path: segments.first));
}
- /// Creates a handler for [package] based on the package map in [_resolver].
- Handler _handlerFor(String package) {
- return _packageHandlers.putIfAbsent(package, () {
- return AsyncHandler(_resolver.urlFor(package).then((url) {
- var handler = url == null
- ? (_) => Response.notFound('Package $package not found.')
- : createStaticHandler(p.fromUri(url), serveFilesOutsidePath: true);
+ /// Creates a handler for [packageName] based on the package map in
+ /// [_packageMap] or the current isolate resolver.
+ Future<Handler> _handlerFor(String packageName) {
+ return _packageHandlers.putIfAbsent(packageName, () async {
+ Uri packageUri;
+ if (_packageMap != null) {
+ packageUri = _packageMap[packageName];
+ } else {
+ var fakeResolvedUri = await Isolate.resolvePackageUri(
+ Uri(scheme: 'package', path: '$packageName/'));
+ packageUri = fakeResolvedUri;
+ }
- return handler;
- }));
+ var handler = packageUri == null
+ ? (_) => Response.notFound('Package $packageName not found.')
+ : createStaticHandler(p.fromUri(packageUri),
+ serveFilesOutsidePath: true);
+
+ return handler;
});
}
}
diff --git a/pubspec.yaml b/pubspec.yaml
index 35e86e1..f03e57d 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,19 +1,20 @@
name: shelf_packages_handler
-version: 1.0.5-dev
+version: 2.0.0
description: A shelf handler for serving a `packages/` directory.
-author: Dart Team <misc@dartlang.org>
homepage: https://github.com/dart-lang/shelf_packages_handler
environment:
sdk: '>=2.0.0 <3.0.0'
dependencies:
- async: '>=1.1.0 <3.0.0'
path: ^1.0.0
- shelf: '>=0.6.0 <0.8.0'
+ shelf: ^0.7.0
shelf_static: ^0.2.0
- package_resolver: ^1.0.0
dev_dependencies:
test: '>=1.0.0 <2.0.0'
+
+dependency_overrides:
+ # Required to get a pub solve
+ test: '>=1.0.0 <2.0.0'
diff --git a/test/packages_handler_test.dart b/test/packages_handler_test.dart
index 85938b6..3b0dea4 100644
--- a/test/packages_handler_test.dart
+++ b/test/packages_handler_test.dart
@@ -4,8 +4,6 @@
import 'dart:io';
-import 'package:package_resolver/package_resolver.dart';
-import 'package:path/path.dart' as p;
import 'package:shelf/shelf.dart';
import 'package:shelf_packages_handler/shelf_packages_handler.dart';
import 'package:test/test.dart';
@@ -38,36 +36,16 @@
await response.readAsString(), contains('Handler packagesHandler'));
});
- group('with a package root', () {
- PackageResolver resolver;
- setUp(() => resolver = PackageResolver.root(p.toUri(dir)));
+ group('with a package map', () {
+ Handler handler;
- test('looks up a real file', () async {
- var handler = packagesHandler(resolver: resolver);
- var request =
- Request('GET', Uri.parse('http://example.com/foo/foo.dart'));
- var response = await handler(request);
- expect(response.statusCode, equals(200));
- expect(await response.readAsString(), contains('in foo'));
- });
-
- test('404s for a nonexistent file', () async {
- var handler = packagesHandler(resolver: resolver);
- var request =
- Request('GET', Uri.parse('http://example.com/foo/bar.dart'));
- var response = await handler(request);
- expect(response.statusCode, equals(404));
- });
- });
-
- group('with a package config', () {
- PackageResolver resolver;
setUp(() {
- resolver = PackageResolver.config({'foo': p.toUri('$dir/foo')});
+ handler = packagesHandler(packageMap: {
+ 'foo': Uri.file('$dir/foo/'),
+ });
});
test('looks up a real file', () async {
- var handler = packagesHandler(resolver: resolver);
var request =
Request('GET', Uri.parse('http://example.com/foo/foo.dart'));
var response = await handler(request);
@@ -76,15 +54,15 @@
});
test('404s for a nonexistent package', () async {
- var handler = packagesHandler(resolver: resolver);
var request =
Request('GET', Uri.parse('http://example.com/bar/foo.dart'));
var response = await handler(request);
expect(response.statusCode, equals(404));
+ expect(
+ await response.readAsString(), contains('Package bar not found'));
});
test('404s for a nonexistent file', () async {
- var handler = packagesHandler(resolver: resolver);
var request =
Request('GET', Uri.parse('http://example.com/foo/bar.dart'));
var response = await handler(request);