build method

  1. @override
Future<void> build(
  1. BuildStep buildStep
)

Generates the outputs for a given BuildStep.

Implementation

@override
Future<void> build(BuildStep buildStep) async {
  final inputId = buildStep.inputId;

  // 1️⃣ Skip generated, part, and hidden files
  final path = inputId.path;

  if (path.startsWith(Constant.GENERATED_DIR_NAME)) {
    return;
  }

  if (inputId.package.startsWith("jetleaf") || inputId.uri.toString().startsWith(KEYWORD)) {
    return;
  }

  if (inputId.uri.toString().startsWith(DART)) {
    return;
  }

  final skip = [
    ...getNonNecessaryPackages(),
    "fixnum",
    "graphs",
    "http_multi_server",
    "io",
    "jetson",
    "jtl",
    "matcher",
    "collection",
    "string_scanner",
    "mime",
    "pool",
    "pubspec_parse",
    "checked_yaml",
    "json_annotation",
    "shelf_web_socket",
    "shelf",
    "http_parser",
    "args",
    "logging",
    "source_span",
    "watcher",
    "boolean_selector",
    "stack_trace",
    "stream_transform",
    "convert",
    "file",
    "glob",
    "package_config",
    "path",
    "term_glyph",
    "yaml",
    "meta",
    "async",
    "typed_data",
    "crypto",
    "stream_channel",
    "web",
    "web_socket",
    "web_socket_channel",
  ];

  if (skip.any((s) => s.equals(inputId.package))) {
    return;
  }

  if (path.endsWith('.g.dart') || path.endsWith('.freezed.dart')) {
    return;
  }

  // 2️⃣ Try to see if this is a valid Dart library before resolving
  if (!await buildStep.resolver.isLibrary(inputId)) {
    return; // Skip part files and non-library units
  }

  final resolver = buildStep.resolver;
  final lib = await resolver.libraryFor(inputId);

  // 3️⃣ Skip SDK libs and analyzer internals
  if (lib.isInSdk || lib.uri.toString().startsWith(DART) || lib.identifier.contains(DART)) return;
  if (lib.uri.toString().startsWith(KEYWORD)) return;

  if ((await buildStep.inputLibrary).firstFragment.importedLibraries.map((i) => i.uri.toString()).toList().none((im) => im.contains(KEYWORD))) {
    return;
  }

  final reader = LibraryReader(lib);
  final generator = ProxyGenerator();
  final output = await generator.generate(reader, buildStep);
  if (output.trim().isEmpty) return;

  // Store the result in the global map
  final inputPath = buildStep.inputId.path; // e.g. lib/core/config.dart
  final relPath = p.withoutExtension(inputPath);
  final outputPath = '${Constant.GENERATED_DIR_NAME}/${relPath.replaceFirst("lib", '${buildStep.inputId.package}_proxies')}_proxy.dart';
  await writeGeneratedOutput(output, File(outputPath));

  final outputId = inputId.changeExtension('.proxy.dart');
  await buildStep.writeAsString(outputId, output);
}