Future watch()

in build_runner/lib/src/generate/watch_impl.dart [33:116]


Future<ServeHandler> watch(
  List<BuilderApplication> builders, {
  bool? deleteFilesByDefault,
  bool? assumeTty,
  String? configKey,
  PackageGraph? packageGraph,
  RunnerAssetReader? reader,
  RunnerAssetWriter? writer,
  Resolvers? resolvers,
  Level? logLevel,
  void Function(LogRecord)? onLog,
  Duration? debounceDelay,
  required DirectoryWatcher Function(String) directoryWatcherFactory,
  Stream<ProcessSignal>? terminateEventStream,
  bool? skipBuildScriptCheck,
  bool? enableLowResourcesMode,
  Map<String, BuildConfig>? overrideBuildConfig,
  Set<BuildDirectory>? buildDirs,
  bool? outputSymlinksOnly,
  bool? trackPerformance,
  bool? verbose,
  Map<String, Map<String, dynamic>>? builderConfigOverrides,
  bool? isReleaseBuild,
  String? logPerformanceDir,
  Set<BuildFilter>? buildFilters,
}) async {
  builderConfigOverrides ??= const {};
  buildDirs ??= <BuildDirectory>{};
  buildFilters ??= <BuildFilter>{};
  debounceDelay ??= const Duration(milliseconds: 250);
  deleteFilesByDefault ??= false;
  enableLowResourcesMode ??= false;
  outputSymlinksOnly ??= false;
  packageGraph ??= await PackageGraph.forThisPackage();
  skipBuildScriptCheck ??= false;
  trackPerformance ??= false;
  verbose ??= false;

  var environment = OverrideableEnvironment(
      IOEnvironment(packageGraph,
          assumeTty: assumeTty, outputSymlinksOnly: outputSymlinksOnly),
      reader: reader,
      writer: writer,
      onLog: onLog ?? stdIOLogListener(assumeTty: assumeTty, verbose: verbose));
  var logSubscription =
      LogSubscription(environment, verbose: verbose, logLevel: logLevel);
  overrideBuildConfig ??= await findBuildConfigOverrides(
      packageGraph, environment.reader,
      configKey: configKey);
  var options = await BuildOptions.create(
    logSubscription,
    deleteFilesByDefault: deleteFilesByDefault,
    packageGraph: packageGraph,
    overrideBuildConfig: overrideBuildConfig,
    debounceDelay: debounceDelay,
    skipBuildScriptCheck: skipBuildScriptCheck,
    enableLowResourcesMode: enableLowResourcesMode,
    trackPerformance: trackPerformance,
    logPerformanceDir: logPerformanceDir,
    resolvers: resolvers,
  );
  var terminator = Terminator(terminateEventStream);

  var watch = _runWatch(
      options,
      environment,
      builders,
      builderConfigOverrides,
      terminator.shouldTerminate,
      directoryWatcherFactory,
      configKey,
      buildDirs
          .any((target) => target.outputLocation?.path.isNotEmpty ?? false),
      buildDirs,
      buildFilters,
      isReleaseMode: isReleaseBuild ?? false);

  unawaited(watch.buildResults.drain().then((_) async {
    await terminator.cancel();
    await options.logListener.cancel();
  }));

  return createServeHandler(watch);
}