@@ -8,6 +8,7 @@ import 'dart:isolate';
88import 'package:build/build.dart' ;
99import 'package:build/experiments.dart' ;
1010import 'package:build_resolvers/build_resolvers.dart' ;
11+ import 'package:glob/glob.dart' ;
1112import 'package:package_config/package_config.dart' ;
1213
1314import 'package_reader.dart' ;
@@ -28,6 +29,7 @@ Future<T> resolveSource<T>(
2829 AssetId ? inputId,
2930 PackageConfig ? packageConfig,
3031 Set <AssetId >? nonInputsToReadFromFilesystem,
32+ bool ? readAllSourcesFromFilesystem,
3133 Resolvers ? resolvers,
3234}) {
3335 inputId ?? = AssetId ('_resolve_source' , 'lib/_resolve_source.dart' );
@@ -37,6 +39,7 @@ Future<T> resolveSource<T>(
3739 action,
3840 packageConfig: packageConfig,
3941 nonInputsToReadFromFilesystem: nonInputsToReadFromFilesystem,
42+ readAllSourcesFromFilesystem: readAllSourcesFromFilesystem,
4043 resolverFor: inputId,
4144 resolvers: resolvers,
4245 );
@@ -83,13 +86,20 @@ Future<T> resolveSource<T>(
8386/// - by default, [PackageAssetReader.currentIsolate] . A custom [packageConfig]
8487/// may be provided to map files not visible to the current package's runtime.
8588///
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+ ///
8695/// [assetReaderChecks] , if provided, runs after the action completes and can be
8796/// used to add expectations on the reader state.
8897Future <T > resolveSources <T >(
8998 Map <String , String > inputs,
9099 FutureOr <T > Function (Resolver resolver) action, {
91100 PackageConfig ? packageConfig,
92101 Set <AssetId >? nonInputsToReadFromFilesystem,
102+ bool ? readAllSourcesFromFilesystem,
93103 String ? resolverFor,
94104 String ? rootPackage,
95105 FutureOr <void > Function (TestReaderWriter )? assetReaderChecks,
@@ -105,6 +115,7 @@ Future<T> resolveSources<T>(
105115 action,
106116 packageConfig: packageConfig,
107117 nonInputsToReadFromFilesystem: nonInputsToReadFromFilesystem,
118+ readAllSourcesFromFilesystem: readAllSourcesFromFilesystem,
108119 resolverFor: AssetId .parse (resolverFor ?? inputs.keys.first),
109120 assetReaderChecks: assetReaderChecks,
110121 resolvers: resolvers,
@@ -117,6 +128,7 @@ Future<T> resolveAsset<T>(
117128 FutureOr <T > Function (Resolver resolver) action, {
118129 PackageConfig ? packageConfig,
119130 Set <AssetId >? nonInputsToReadFromFilesystem,
131+ bool ? readAllSourcesFromFilesystem,
120132 Future <void >? tearDown,
121133 Resolvers ? resolvers,
122134}) {
@@ -126,6 +138,7 @@ Future<T> resolveAsset<T>(
126138 action,
127139 packageConfig: packageConfig,
128140 nonInputsToReadFromFilesystem: nonInputsToReadFromFilesystem,
141+ readAllSourcesFromFilesystem: readAllSourcesFromFilesystem,
129142 resolverFor: inputId,
130143 resolvers: resolvers,
131144 );
@@ -142,6 +155,7 @@ Future<T> _resolveAssets<T>(
142155 FutureOr <T > Function (Resolver resolver) action, {
143156 PackageConfig ? packageConfig,
144157 Set <AssetId >? nonInputsToReadFromFilesystem,
158+ bool ? readAllSourcesFromFilesystem,
145159 AssetId ? resolverFor,
146160 FutureOr <void > Function (TestReaderWriter )? assetReaderChecks,
147161 Resolvers ? resolvers,
@@ -161,10 +175,21 @@ Future<T> _resolveAssets<T>(
161175 }
162176 }
163177
178+ final readerWriter = TestReaderWriter (rootPackage: rootPackage);
164179 // Copy any additionally requested files from the filesystem to `inputs`.
165180 if (nonInputsToReadFromFilesystem != null ) {
166181 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+ }
168193 }
169194 }
170195
@@ -175,18 +200,25 @@ Future<T> _resolveAssets<T>(
175200 ? AnalyzerResolvers .sharedInstance
176201 : AnalyzerResolvers .custom (packageConfig: resolvedConfig);
177202
178- final buildResult = await testBuilder (
203+ await testBuilder (
179204 resolveBuilder,
180205 inputs,
206+ readerWriter: readerWriter,
181207 resolvers: resolvers,
182208 packageConfig: packageConfig,
183209 );
184- final readerWriter = buildResult.readerWriter;
185210 if (assetReaderChecks != null ) {
186211 assetReaderChecks (readerWriter);
187212 }
188213
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+ }
190222}
191223
192224/// A [Builder] that is only used to retrieve a [Resolver] instance.
@@ -197,17 +229,20 @@ class _ResolveSourceBuilder<T> implements Builder {
197229 final FutureOr <T > Function (Resolver ) _action;
198230 final AssetId ? _resolverFor;
199231
200- final onDone = Completer <T >();
232+ T ? result;
233+ Object ? error;
234+ StackTrace ? stackTrace;
201235
202236 _ResolveSourceBuilder (this ._action, this ._resolverFor);
203237
204238 @override
205239 Future <void > build (BuildStep buildStep) async {
206240 if (_resolverFor != buildStep.inputId) return ;
207241 try {
208- onDone. complete ( await _action (buildStep.resolver) );
242+ result = await _action (buildStep.resolver);
209243 } catch (e, s) {
210- onDone.completeError (e, s);
244+ error = e;
245+ stackTrace = s;
211246 }
212247 }
213248
0 commit comments