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 053a48e75947ff3820ec7f27aa49f110baddebba..a4a2f887cf877185c2f66c88c4d09cac5d0471ac 100644 |
--- a/sdk/lib/_internal/pub/lib/src/barback.dart |
+++ b/sdk/lib/_internal/pub/lib/src/barback.dart |
@@ -60,6 +60,27 @@ class TransformerId { |
/// This will be an empty map if no configuration was provided. |
nweiz
2014/02/26 20:25:08
Is this change left over from when we were conside
Bob Nystrom
2014/02/26 21:17:02
No, this has always been here. I think it's so tha
nweiz
2014/02/26 21:44:03
I meant the removal of the previous sentence.
|
final Map configuration; |
+ /// The primary input inclusions. |
+ /// |
+ /// Each inclusion is an asset path. If this set is non-empty, than *only* |
+ /// matching assets are allowed as a primary input by this transformer. If |
+ /// `null`, all assets are included. |
+ /// |
+ /// This is processed before [excludes]. If a transformer has both includes |
+ /// and excludes, then the set of included assets is determined and assets |
+ /// are excluded from that resulting set. |
+ final Set<String> includes; |
+ |
+ /// The primary input exclusions. |
+ /// |
+ /// Any asset whose pach is in this is not allowed as a primary input by |
+ /// this transformer. |
+ /// |
+ /// This is processed after [includes]. If a transformer has both includes |
+ /// and excludes, then the set of included assets is determined and assets |
+ /// are excluded from that resulting set. |
+ final Set<String> excludes; |
+ |
/// Whether this ID points to a built-in transformer exposed by pub. |
bool get isBuiltInTransformer => package.startsWith('\$'); |
@@ -79,11 +100,63 @@ class TransformerId { |
if (parts.length == 1) { |
return new TransformerId(parts.single, null, configuration); |
} |
+ |
return new TransformerId(parts.first, parts.last, configuration); |
} |
- TransformerId(this.package, this.path, Map configuration) |
- : configuration = configuration == null ? {} : configuration { |
+ factory TransformerId(String package, String path, Map configuration) { |
+ parseField(key) { |
+ if (!configuration.containsKey(key)) return null; |
+ var field = configuration.remove(key); |
+ |
+ if (field is String) return new Set<String>.from([field]); |
+ |
+ if (field is List) { |
+ var nonstrings = field |
+ .where((element) => element is! String) |
+ .map((element) => '"$element"'); |
+ |
+ if (nonstrings.isNotEmpty) { |
+ throw new FormatException( |
+ '"$key" list field may only contain strings, but contained ' |
+ '${toSentence(nonstrings)}.'); |
+ } |
+ |
+ return new Set<String>.from(field); |
+ } else { |
+ throw new FormatException( |
+ '"$key" field must be a string or list, but was "$field".'); |
+ } |
+ } |
+ |
+ var includes = null; |
+ var excludes = null; |
+ |
+ if (configuration == null) { |
+ configuration = {}; |
+ } else { |
+ // Pull out the exclusions/inclusions. |
+ includes = parseField("\$include"); |
+ excludes = parseField("\$exclude"); |
+ |
+ // All other keys starting with "$" are unexpected. |
+ var reservedKeys = configuration.keys |
+ .where((key) => key is String && key.startsWith(r'$')) |
+ .map((key) => '"$key"'); |
+ |
+ if (reservedKeys.isNotEmpty) { |
+ throw new FormatException( |
+ 'Unknown reserved ${pluralize('field', reservedKeys.length)} ' |
+ '${toSentence(reservedKeys)}.'); |
+ } |
+ } |
+ |
+ return new TransformerId._(package, path, configuration, |
+ includes, excludes); |
+ } |
+ |
+ TransformerId._(this.package, this.path, this.configuration, |
+ this.includes, this.excludes) { |
if (!package.startsWith('\$')) return; |
if (_BUILT_IN_TRANSFORMERS.contains(package)) return; |
throw new FormatException('Unsupported built-in transformer $package.'); |