@@ -8,6 +8,7 @@ import 'dart:isolate';
8
8
import 'package:build/build.dart' ;
9
9
import 'package:build/experiments.dart' ;
10
10
import 'package:build_resolvers/build_resolvers.dart' ;
11
+ import 'package:glob/glob.dart' ;
11
12
import 'package:package_config/package_config.dart' ;
12
13
13
14
import 'package_reader.dart' ;
@@ -28,6 +29,7 @@ Future<T> resolveSource<T>(
28
29
AssetId ? inputId,
29
30
PackageConfig ? packageConfig,
30
31
Set <AssetId >? nonInputsToReadFromFilesystem,
32
+ bool ? readAllSourcesFromFilesystem,
31
33
Resolvers ? resolvers,
32
34
}) {
33
35
inputId ?? = AssetId ('_resolve_source' , 'lib/_resolve_source.dart' );
@@ -37,6 +39,7 @@ Future<T> resolveSource<T>(
37
39
action,
38
40
packageConfig: packageConfig,
39
41
nonInputsToReadFromFilesystem: nonInputsToReadFromFilesystem,
42
+ readAllSourcesFromFilesystem: readAllSourcesFromFilesystem,
40
43
resolverFor: inputId,
41
44
resolvers: resolvers,
42
45
);
@@ -83,13 +86,20 @@ Future<T> resolveSource<T>(
83
86
/// - by default, [PackageAssetReader.currentIsolate] . A custom [packageConfig]
84
87
/// may be provided to map files not visible to the current package's runtime.
85
88
///
89
+ /// By default, only assets listed in [inputs] with value [useAssetReader] are
90
+ /// read from the real filesystem. To read more real files: pass
91
+ /// [nonInputsToReadFromFilesystem] for individual files, or
92
+ /// [readAllSourcesFromFilesystem] to read all sources available with
93
+ /// [packageConfig] .
94
+ ///
86
95
/// [assetReaderChecks] , if provided, runs after the action completes and can be
87
96
/// used to add expectations on the reader state.
88
97
Future <T > resolveSources <T >(
89
98
Map <String , String > inputs,
90
99
FutureOr <T > Function (Resolver resolver) action, {
91
100
PackageConfig ? packageConfig,
92
101
Set <AssetId >? nonInputsToReadFromFilesystem,
102
+ bool ? readAllSourcesFromFilesystem,
93
103
String ? resolverFor,
94
104
String ? rootPackage,
95
105
FutureOr <void > Function (TestReaderWriter )? assetReaderChecks,
@@ -105,6 +115,7 @@ Future<T> resolveSources<T>(
105
115
action,
106
116
packageConfig: packageConfig,
107
117
nonInputsToReadFromFilesystem: nonInputsToReadFromFilesystem,
118
+ readAllSourcesFromFilesystem: readAllSourcesFromFilesystem,
108
119
resolverFor: AssetId .parse (resolverFor ?? inputs.keys.first),
109
120
assetReaderChecks: assetReaderChecks,
110
121
resolvers: resolvers,
@@ -117,6 +128,7 @@ Future<T> resolveAsset<T>(
117
128
FutureOr <T > Function (Resolver resolver) action, {
118
129
PackageConfig ? packageConfig,
119
130
Set <AssetId >? nonInputsToReadFromFilesystem,
131
+ bool ? readAllSourcesFromFilesystem,
120
132
Future <void >? tearDown,
121
133
Resolvers ? resolvers,
122
134
}) {
@@ -126,6 +138,7 @@ Future<T> resolveAsset<T>(
126
138
action,
127
139
packageConfig: packageConfig,
128
140
nonInputsToReadFromFilesystem: nonInputsToReadFromFilesystem,
141
+ readAllSourcesFromFilesystem: readAllSourcesFromFilesystem,
129
142
resolverFor: inputId,
130
143
resolvers: resolvers,
131
144
);
@@ -142,6 +155,7 @@ Future<T> _resolveAssets<T>(
142
155
FutureOr <T > Function (Resolver resolver) action, {
143
156
PackageConfig ? packageConfig,
144
157
Set <AssetId >? nonInputsToReadFromFilesystem,
158
+ bool ? readAllSourcesFromFilesystem,
145
159
AssetId ? resolverFor,
146
160
FutureOr <void > Function (TestReaderWriter )? assetReaderChecks,
147
161
Resolvers ? resolvers,
@@ -161,10 +175,21 @@ Future<T> _resolveAssets<T>(
161
175
}
162
176
}
163
177
178
+ final readerWriter = TestReaderWriter (rootPackage: rootPackage);
164
179
// Copy any additionally requested files from the filesystem to `inputs`.
165
180
if (nonInputsToReadFromFilesystem != null ) {
166
181
for (final id in nonInputsToReadFromFilesystem) {
167
- inputs[id.toString ()] = await assetReader.readAsString (id);
182
+ readerWriter.testing.writeBytes (id, await assetReader.readAsBytes (id));
183
+ }
184
+ }
185
+ if (readAllSourcesFromFilesystem == true ) {
186
+ for (final package in assetReader.packageConfig.packages) {
187
+ await for (final id in assetReader.findAssets (
188
+ Glob ('**' ),
189
+ package: package.name,
190
+ )) {
191
+ readerWriter.testing.writeBytes (id, await assetReader.readAsBytes (id));
192
+ }
168
193
}
169
194
}
170
195
@@ -175,18 +200,25 @@ Future<T> _resolveAssets<T>(
175
200
? AnalyzerResolvers .sharedInstance
176
201
: AnalyzerResolvers .custom (packageConfig: resolvedConfig);
177
202
178
- final buildResult = await testBuilder (
203
+ await testBuilder (
179
204
resolveBuilder,
180
205
inputs,
206
+ readerWriter: readerWriter,
181
207
resolvers: resolvers,
182
208
packageConfig: packageConfig,
183
209
);
184
- final readerWriter = buildResult.readerWriter;
185
210
if (assetReaderChecks != null ) {
186
211
assetReaderChecks (readerWriter);
187
212
}
188
213
189
- return resolveBuilder.onDone.future;
214
+ if (resolveBuilder.error == null ) {
215
+ return resolveBuilder.result as T ;
216
+ } else {
217
+ Error .throwWithStackTrace (
218
+ resolveBuilder.error! ,
219
+ resolveBuilder.stackTrace! ,
220
+ );
221
+ }
190
222
}
191
223
192
224
/// A [Builder] that is only used to retrieve a [Resolver] instance.
@@ -197,17 +229,20 @@ class _ResolveSourceBuilder<T> implements Builder {
197
229
final FutureOr <T > Function (Resolver ) _action;
198
230
final AssetId ? _resolverFor;
199
231
200
- final onDone = Completer <T >();
232
+ T ? result;
233
+ Object ? error;
234
+ StackTrace ? stackTrace;
201
235
202
236
_ResolveSourceBuilder (this ._action, this ._resolverFor);
203
237
204
238
@override
205
239
Future <void > build (BuildStep buildStep) async {
206
240
if (_resolverFor != buildStep.inputId) return ;
207
241
try {
208
- onDone. complete ( await _action (buildStep.resolver) );
242
+ result = await _action (buildStep.resolver);
209
243
} catch (e, s) {
210
- onDone.completeError (e, s);
244
+ error = e;
245
+ stackTrace = s;
211
246
}
212
247
}
213
248
0 commit comments