| // 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<void> run({ |
| required LinkInput input, |
| required LinkOutputBuilder output, |
| required Logger? logger, |
| }); |
| } |