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 routes = await findRoutes(buildStep);

  final sortedRoutes = [...routes]
    ..sort((a, b) {
      final aHasParams = a.path.contains('<');
      final bHasParams = b.path.contains('<');
      if (aHasParams == bHasParams) return a.path.compareTo(b.path);
      return aHasParams ? 1 : -1; // static routes first
    });

  final library = Library((lib) {
    lib.directives.add(
      Directive.import('package:vanestack_common/vanestack_common.dart'),
    );

    // ====== RequestUtils extension ======
    lib.body.add(_buildRequestUtilsExtension());
    lib.body.add(_buildCleanParam());

    // ====== Helper functions ======
    lib.body.add(_buildStringToDartTypeFunction());
    lib.body.add(_buildDefaultErrorHandlerFunction());

    // ====== Route handlers ======
    for (final (index, route) in sortedRoutes.indexed) {
      lib.body.add(_buildRouteHandler(index, route));
    }

    // ====== registerRoutes() ======
    lib.body.add(_buildRegisterRoutesFunction(sortedRoutes));
  });

  final emitter = DartEmitter.scoped();
  final generatedCode = _dartFormatter.format(
    '// GENERATED CODE - DO NOT MODIFY BY HAND\n\n${library.accept(emitter)}',
  );

  await buildStep.writeAsString(
    AssetId(buildStep.inputId.package, 'lib/src/routes.dart'),
    generatedCode,
  );

  // Also generate routes_info.dart with plain data for the generate command
  final routesInfoCode = _buildRoutesInfo(sortedRoutes);
  await buildStep.writeAsString(
    AssetId(buildStep.inputId.package, 'lib/src/routes_info.dart'),
    routesInfoCode,
  );
}