blob: 188699e7a67eb7de657d26dffbdbcdf39b374dd0 [file] [log] [blame] [edit]
// 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:collection/collection.dart';
import 'package:hooks/hooks.dart';
import '../build_runner/build_runner.dart';
import 'build_result.dart';
import 'link_result.dart';
/// The result from a [NativeAssetsBuildRunner.build] or
/// [NativeAssetsBuildRunner.link].
final class HookResult implements BuildResult, LinkResult {
/// The native encodedAssets produced by the hooks, which should be bundled.
@override
final List<EncodedAsset> encodedAssets;
/// The encodedAssets produced by the hooks, which should be linked.
@override
final Map<String, List<EncodedAsset>> encodedAssetsForLinking;
/// The files used by the hooks.
@override
final List<Uri> dependencies;
HookResult._({
required this.encodedAssets,
required this.encodedAssetsForLinking,
required this.dependencies,
});
factory HookResult({
List<EncodedAsset>? encodedAssets,
Map<String, List<EncodedAsset>>? encodedAssetsForLinking,
List<Uri>? dependencies,
}) => HookResult._(
encodedAssets: encodedAssets ?? [],
encodedAssetsForLinking: encodedAssetsForLinking ?? {},
dependencies: dependencies ?? [],
);
HookResult copyAdd(HookOutput hookOutput, List<Uri> hookDependencies) {
final mergedMaps = mergeMaps(
encodedAssetsForLinking,
hookOutput is BuildOutput
? hookOutput.assets.encodedAssetsForLinking
: <String, List<EncodedAsset>>{},
value: (encodedAssets1, encodedAssets2) => [
...encodedAssets1,
...encodedAssets2,
],
);
final hookOutputAssets = (hookOutput is BuildOutput)
? hookOutput.assets.encodedAssets
: (hookOutput as LinkOutput).assets.encodedAssets;
return HookResult(
encodedAssets: [...encodedAssets, ...hookOutputAssets],
encodedAssetsForLinking: mergedMaps,
dependencies: [
...dependencies,
...hookOutput.dependencies,
...hookDependencies,
]..sort(_uriCompare),
);
}
}
int _uriCompare(Uri u1, Uri u2) => u1.toString().compareTo(u2.toString());