Skip to content

[BUG] Vaden não importa enums no código gerado pelo Build Runner #152

@KlayRodrigs

Description

@KlayRodrigs

Bug: Vaden não importa enums no código gerado pelo Build Runner

Descrição do Problema

O Vaden Framework, através do build runner, não importa os tipos de enum no arquivo vaden_application.dart gerado quando os enums estão em arquivos separados. Se os enums estiverem no mesmo arquivo das classes que os usam, o build acontece corretamente. Isso causa erros de compilação quando os enums estão organizados em diretórios separados como lib/src/enum/, pois o código gerado referencia tipos que não foram importados e obriga o desenvolvedor a mover os enums para os mesmos arquivos dos DTOs, controllers, etc.

Fluxo do Problema

  1. Enum definido com @Component()
  2. DTO usa o enum como tipo de campo
  3. Controller usa o enum como parâmetro
  4. Build Runner gera código sem importar o enum
  5. Erro de compilação por tipo não encontrado

Código de Exemplo

1. Enum

// lib/src/enum/day_period_enum.dart
enum DayPeriod {
  morning,
  afternoon,
  evening;

  static DayPeriod fromString(String value) {
    return DayPeriod.values.firstWhere(
      (e) => e.name.toLowerCase() == value.toLowerCase(),
      orElse: () => throw ArgumentError('Invalid DayPeriod: $value'),
    );
  }
}

2. DTO que usa o enum

// lib/src/dto/bus_stop_dto.dart
@DTO()
class BusStopDto {
  final int id;
  final List<RouteDto> routes;
  final String busStopName;
  final String time;
  final DayPeriod dayPeriod;  // ← Usa o enum
  final bool isActive;
  // ...
}

3. Controller com enum como parâmetro

// lib/src/controllers/bus_stop_controller.dart
@Get("/by-day-period/<dayPeriod>")
Future<List<BusStopDto>> getByDayPeriod(@Param() DayPeriod dayPeriod) async {
  // ...
}

4. Código gerado pelo Vaden (COM BUG)

// lib/vaden_application.dart - GERADO AUTOMATICAMENTE

// ❌ IMPORTAÇÕES FALTANDO:
// import 'package:oxe_bus_api/src/enum/day_period_enum.dart';
// import 'package:oxe_bus_api/src/enum/all_bus_stops_filter_enum.dart';

import 'package:oxe_bus_api/config/app_configuration.dart';
import 'package:oxe_bus_api/config/app_controller_advice.dart';
// ... outras importações, mas NENHUM enum

final handlerBusStopControllergetAll = (Request request) async {
  // ...
  // ❌ ERRO: AllBusStopsFilterEnum não foi importado
  final filter = _parse<AllBusStopsFilterEnum>(request.params['filter'])!;
  // ...
};

final handlerBusStopControllergetByDayPeriod = (Request request) async {
  // ...
  // ❌ ERRO: DayPeriod não foi importado
  final dayPeriod = _parse<DayPeriod>(request.params['dayPeriod'])!;
  // ...
};

// ❌ ERRO: DayPeriod.values.byName não funciona sem import
#dayPeriod: DayPeriod.values.byName(json['dayPeriod'] as String),

Erros Específicos Encontrados

Linha 160: AllBusStopsFilterEnum não importado

final filter = _parse<AllBusStopsFilterEnum>(request.params['filter'])!;
// ❌ Error: Undefined name 'AllBusStopsFilterEnum'

Linha 246: DayPeriod não importado

final dayPeriod = _parse<DayPeriod>(request.params['dayPeriod'])!;
// ❌ Error: Undefined name 'DayPeriod'

Linha 331: DayPeriod.values.byName sem import

#dayPeriod: DayPeriod.values.byName(json['dayPeriod'] as String),
// ❌ Error: Undefined name 'DayPeriod'

Soluções Testadas

❌ 1. Adicionar @component() nos enums

@Component()  // Não funciona
enum DayPeriod { ... }

✅ 2. Mover enums para mesmo arquivo dos DTOs

// Resolve o problema de import no código gerado

enum DayPeriod { ... }  // Enum externo ao DTO, mas no mesmo arquivo
@DTO()
class BusStopDto {
 
}

Conclusão

Visando um código limpo e mais organizado, a melhor solução é poder ter a opção de usar enum externos aos arquivos em que eles são associados, sem precisar mover os enums para o mesmo arquivo dos DTOs, Controllers, etc. O que resolve o problema de importação no código gerado pelo Vaden.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions