// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'package:logging/logging.dart'; import '../config.dart'; import 'build_and_link.dart'; import 'builder.dart'; /// A builder to be run in [link] in `hook/link.dart`. /// /// [Linker]s should be used to shrink or omit assets based on tree-shaking /// information. [Linker]s have access to tree-shaking information in some build /// modes. However, due to the tree-shaking information being an input to link /// hooks, link hooks are re-run more often than [Builder]s. A link hook is /// rerun when its declared [BuildOutput.dependencies] or its [LinkInput] tree /// shaking information changes. /// /// A package to be used in link hooks should implement this interface. The /// typical pattern of link hooks should be a declarative specification of one /// or more linkers (constructor calls), followed by [run]ning these linkers. /// /// The linker is designed to immediately operate on [LinkInput]. If a linker /// should deviate behavior from the build input, this should be configurable /// through a constructor parameter. /// /// The linker is designed to immediately operate on [LinkOutput]. If a linker /// should output something else than standard, it should be configurable /// through a constructor parameter. // TODO(dacoharkes): Add a doc comment reference when tree shaking info is // available. abstract interface class Linker { /// Runs this linker. /// /// Reads the input from [input], streams output to [output], and streams /// logs to [logger]. Future run({ required LinkInput input, required LinkOutputBuilder output, required Logger? logger, }); }