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) {