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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions