diff --git a/lib/src/barback/pub_package_provider.dart b/lib/src/barback/pub_package_provider.dart
index 23c1a48db13094dd942088c23a04cdd38d6be5a1..5e77cb3c3889f4fac16c77ff463fa22d2311c5ca 100644
--- a/lib/src/barback/pub_package_provider.dart
+++ b/lib/src/barback/pub_package_provider.dart
@@ -29,7 +29,7 @@ class PubPackageProvider implements StaticPackageProvider {
         staticPackages = [r"$pub", r"$sdk"]..addAll(
             graph.packages.keys.where(graph.isPackageStatic));
 
-  Future<Asset> getAsset(AssetId id) {
+  Future<Asset> getAsset(AssetId id) async {
     // "$pub" is a psuedo-package that allows pub's transformer-loading
     // infrastructure to share code with pub proper.
     if (id.package == r'$pub') {
@@ -38,19 +38,20 @@ class PubPackageProvider implements StaticPackageProvider {
       assert(components.first == 'lib');
       components[0] = 'dart';
       var file = assetPath(path.joinAll(components));
+      _assertExists(file, id);
 
       // Barback may not be in the package graph if there are no user-defined
       // transformers being used at all. The "$pub" sources are still provided,
       // but will never be loaded.
       if (!_graph.packages.containsKey("barback")) {
-        return new Future.value(new Asset.fromPath(id, file));
+        return new Asset.fromPath(id, file);
       }
 
       var versions = mapMap(_graph.packages,
           value: (_, package) => package.version);
       var contents = readTextFile(file);
       contents = preprocess(contents, versions, path.toUri(file));
-      return new Future.value(new Asset.fromString(id, contents));
+      return new Asset.fromString(id, contents);
     }
 
     // "$sdk" is a pseudo-package that provides access to the Dart library
@@ -66,12 +67,19 @@ class PubPackageProvider implements StaticPackageProvider {
       parts = parts.skip(1);
 
       var file = path.join(sdk.rootDirectory, path.joinAll(parts));
-      return new Future.value(new Asset.fromPath(id, file));
+      _assertExists(file, id);
+      return new Asset.fromPath(id, file);
     }
 
     var nativePath = path.fromUri(id.path);
     var file = _graph.packages[id.package].path(nativePath);
-    return new Future.value(new Asset.fromPath(id, file));
+    _assertExists(file, id);
+    return new Asset.fromPath(id, file);
+  }
+
+  /// Throw an [AssetNotFoundException] for [id] if [path] doesn't exist.
+  void _assertExists(String path, AssetId id) {
+    if (!fileExists(path)) throw new AssetNotFoundException(id);
   }
 
   Stream<AssetId> getAllAssetIds(String packageName) {
diff --git a/test/get/cache_transformed_dependency_test.dart b/test/get/cache_transformed_dependency_test.dart
index f3769eed49862342b5d090a3d53830a179609fbf..613d9cbd99099a608bd6e98180b76344632abc3a 100644
--- a/test/get/cache_transformed_dependency_test.dart
+++ b/test/get/cache_transformed_dependency_test.dart
@@ -32,6 +32,30 @@ class ModeTransformer extends Transformer {
 }
 """;
 
+const HAS_INPUT_TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class HasInputTransformer extends Transformer {
+  HasInputTransformer.asPlugin();
+
+  bool get allowedExtensions => '.txt';
+
+  Future apply(Transform transform) {
+    return Future.wait([
+      transform.hasInput(new AssetId("foo", "lib/foo.dart")),
+      transform.hasInput(new AssetId("foo", "lib/does/not/exist.dart"))
+    ]).then((results) {
+      transform.addOutput(new Asset.fromString(
+          transform.primaryInput.id,
+          "lib/foo.dart: \${results.first}, "
+              "lib/does/not/exist.dart: \${results.last}"));
+    });
+  }
+}
+""";
+
 main() {
   initConfig();
 
@@ -314,6 +338,44 @@ main() {
     pub.stdout.expect("Hello!");
     pub.shouldExit();
   });
+
+  // Regression test for issue 21087.
+  integration("hasInput works for static packages", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+
+      builder.serve("foo", "1.2.3",
+          deps: {'barback': 'any'},
+          pubspec: {'transformers': ['foo']},
+          contents: [
+        d.dir("lib", [
+          d.file("transformer.dart", replaceTransformer("Hello", "Goodbye")),
+          d.file("foo.dart", "void main() => print('Hello!');")
+        ])
+      ]);
+    });
+
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": "1.2.3"},
+        "transformers": ["myapp/src/transformer"]
+      }),
+      d.dir("lib", [d.dir("src", [
+        d.file("transformer.dart", HAS_INPUT_TRANSFORMER)
+      ])]),
+      d.dir("web", [
+        d.file("foo.txt", "foo")
+      ])
+    ]).create();
+
+    pubGet(output: contains("Precompiled foo."));
+
+    pubServe();
+    requestShouldSucceed("foo.txt",
+        "lib/foo.dart: true, lib/does/not/exist.dart: false");
+    endPubServe();
+  });
 }
 
 String replaceTransformer(String input, String output) {