encodeAsync method

Future<Program> encodeAsync({
  1. String? entryFile,
  2. String entryFunction = 'main',
})

Async variant of encode that supports dependency resolution.

When resolveExternalDeps is true and a PubClient was provided, external package: imports are downloaded, recursively encoded, and merged into the program instead of being left as empty stubs.

Implementation

Future<Program> encodeAsync({
  String? entryFile,
  String entryFunction = 'main',
}) async {
  final program = encode(entryFile: entryFile, entryFunction: entryFunction);
  if (!resolveExternalDeps || _pubClient == null) return program;

  // Collect stub module names (modules with zero functions = stubs).
  final stubNames = <String>{};
  for (final m in program.modules) {
    if (m.functions.isEmpty && m.name != '__assets__') {
      stubNames.add(m.name);
    }
  }
  if (stubNames.isEmpty) return program;

  final resolved = await _resolveExternalDeps(stubNames);
  if (resolved.isEmpty) return program;

  // Replace stubs with resolved modules.
  final modules = <Module>[];
  for (final m in program.modules) {
    if (stubNames.contains(m.name)) continue;
    modules.add(m);
  }
  modules.addAll(resolved);

  return Program()
    ..name = program.name
    ..version = program.version
    ..entryModule = program.entryModule
    ..entryFunction = program.entryFunction
    ..modules.addAll(modules);
}