55import 'dart:async' ;
66
77import 'package:build/build.dart' ;
8+ import 'package:built_collection/built_collection.dart' ;
89
910class CopyingPostProcessBuilder implements PostProcessBuilder {
1011 final String outputExtension;
@@ -23,18 +24,6 @@ class CopyingPostProcessBuilder implements PostProcessBuilder {
2324 }
2425}
2526
26- class DeletePostProcessBuilder implements PostProcessBuilder {
27- @override
28- final inputExtensions = ['.txt' ];
29-
30- DeletePostProcessBuilder ();
31-
32- @override
33- Future <void > build (PostProcessBuildStep buildStep) async {
34- buildStep.deletePrimaryInput ();
35- }
36- }
37-
3827/// A [Builder] which behaves exactly like it's [delegate] but has a different
3928/// runtime type.
4029class DelegatingBuilder implements Builder {
@@ -48,3 +37,47 @@ class DelegatingBuilder implements Builder {
4837 @override
4938 Future build (BuildStep buildStep) async => delegate.build (buildStep);
5039}
40+
41+ class PlaceholderBuilder extends Builder {
42+ final String inputPlaceholder;
43+ final BuiltMap <String , String > outputFilenameToContent;
44+
45+ @override
46+ Map <String , List <String >> get buildExtensions => {
47+ // Usually this map is input filename extensions to output filename
48+ // extensions, for example `.dart` to `.g.dart`.
49+ //
50+ // But this builder is about placeholders, which are special keys that
51+ // are not extensions. So: the key is a placeholder, and the values are
52+ // full output filenames relative to the placeholder path.
53+ inputPlaceholder: outputFilenameToContent.keys.toList (),
54+ };
55+
56+ PlaceholderBuilder (
57+ this .outputFilenameToContent, {
58+ this .inputPlaceholder = r'$lib$' ,
59+ });
60+
61+ @override
62+ Future build (BuildStep buildStep) async {
63+ for (final MapEntry (key: outputFilename, value: content)
64+ in outputFilenameToContent.entries) {
65+ await buildStep.writeAsString (
66+ _outputId (buildStep.inputId, inputPlaceholder, outputFilename),
67+ content,
68+ );
69+ }
70+ }
71+ }
72+
73+ AssetId _outputId (
74+ AssetId inputId,
75+ String inputExtension,
76+ String outputExtension,
77+ ) {
78+ assert (inputId.path.endsWith (inputExtension));
79+ var newPath =
80+ inputId.path.substring (0 , inputId.path.length - inputExtension.length) +
81+ outputExtension;
82+ return AssetId (inputId.package, newPath);
83+ }
0 commit comments