| #!/usr/bin/env dart | 
 | // Copyright (c) 2025, 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 'dart:io'; | 
 |  | 
 | import 'package:args/args.dart'; | 
 | import 'package:front_end/src/util/trim.dart'; | 
 | import 'package:kernel/target/targets.dart'; | 
 | import 'package:vm/modular/target/flutter.dart'; | 
 |  | 
 | /// Helper script to invoke [createTrimmedCopy] as a command-line tool given a | 
 | /// `dynamic_interface.yaml` input file. | 
 | Future<void> main(List<String> args) async { | 
 |   ArgResults argResults; | 
 |   try { | 
 |     argResults = _argParser.parse(args); | 
 |   } on ArgParserException catch (e) { | 
 |     print(e.message); | 
 |     print(_argParser.usage); | 
 |     exit(1); | 
 |   } | 
 |  | 
 |   if (args.length < 2) { | 
 |     print(_argParser.usage); | 
 |     exit(1); | 
 |   } | 
 |   String? dynamicInterfacePath = argResults['dynamic-interface'] as String?; | 
 |   File? dynamicInterface = dynamicInterfacePath != null | 
 |       ? File(dynamicInterfacePath) | 
 |       : null; | 
 |   await createTrimmedCopy( | 
 |     TrimOptions( | 
 |       inputAppPath: argResults['input'] as String, | 
 |       inputPlatformPath: argResults['platform'] as String, | 
 |       outputAppPath: argResults['output'] as String, | 
 |       outputPlatformPath: argResults['output-platform'] as String?, | 
 |       dynamicInterfaceUri: dynamicInterface?.uri, | 
 |       dynamicInterfaceContents: dynamicInterface?.readAsStringSync(), | 
 |       requiredUserLibraries: | 
 |           (argResults['required-user-libraries'] as List<String>).toSet(), | 
 |       requiredDartLibraries: FlutterTarget( | 
 |         TargetFlags(), | 
 |       ).extraRequiredLibraries.toSet(), | 
 |       librariesToClear: (argResults['clear-dart-library-body'] as List<String>) | 
 |           .toSet(), | 
 |     ), | 
 |   ); | 
 | } | 
 |  | 
 | final ArgParser _argParser = ArgParser() | 
 |   ..addOption( | 
 |     'input', | 
 |     help: 'Input application dill file path', | 
 |     mandatory: true, | 
 |   ) | 
 |   ..addOption( | 
 |     'platform', | 
 |     help: 'Input platform dill file path', | 
 |     mandatory: true, | 
 |   ) | 
 |   ..addOption( | 
 |     'output', | 
 |     help: 'Output application dill file path', | 
 |     mandatory: true, | 
 |   ) | 
 |   ..addOption('output-platform', help: 'Output platform dill file path') | 
 |   ..addOption( | 
 |     'dynamic-interface', | 
 |     help: 'Path to the dynamic_interface.yaml file', | 
 |   ) | 
 |   ..addMultiOption( | 
 |     'clear-dart-library-body', | 
 |     abbr: 'c', | 
 |     help: | 
 |         'List of `dart:` that, even though are required, can be cleared ' | 
 |         'internally since they are only included for compatibility with ' | 
 |         '"extraRequiredLibraries", but are not needed for compilation', | 
 |     defaultsTo: defaultNonProductionLibraries, | 
 |   ) | 
 |   ..addMultiOption( | 
 |     'required-user-libraries', | 
 |     abbr: 'u', | 
 |     help: | 
 |         'Alternative to providing a dynamic_interface.yaml input. ' | 
 |         'Specifies the list of necessary user written ' | 
 |         'libraries. Can be a full `package:` URI or a prefix pattern, ' | 
 |         'like `package:foo/*`.', | 
 |     defaultsTo: const [], | 
 |   ); | 
 |  | 
 | /// Libraries that are not needed for production builds and that should | 
 | /// be possible to clear when trimming .dill files. | 
 | const List<String> defaultNonProductionLibraries = [ | 
 |   'dart:mirrors', | 
 |   'dart:developer', | 
 |   'dart:ffi', | 
 |   'dart:vmservice_io', | 
 |   'dart:isolate ', | 
 |   'dart:_vmservice', | 
 |   'dart:cli', | 
 | ]; |