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 logger = ConsoleLogger();
  final fileSystem = LocalJasprFileSystem();

  logger.printStatus('Using configuration: $config');

  // For template ARB path, we need lib-relative path
  final arbDirPath = config.arbDir.startsWith('lib/')
      ? config.arbDir
      : path.join('lib', config.arbDir);
  final templateArbPath = path.join(arbDirPath, config.templateArbFile);

  // Output directory and file from config
  final outputDirPath = config.outputLocalizationFile.startsWith('lib/')
      ? path.dirname(config.outputLocalizationFile)
      : path.join('lib', path.dirname(config.outputLocalizationFile));
  final outputFileName = config.outputFileName;

  // Parse preferred supported locales if specified
  List<LocaleInfo>? preferredLocales;
  if (config.preferredSupportedLocales != null &&
      config.preferredSupportedLocales!.isNotEmpty) {
    preferredLocales = config.preferredSupportedLocales!
        .map((locale) => LocaleInfo.fromString(locale))
        .toList();
  }

  try {
    final generator = LocalizationsGenerator(
      fileSystem: fileSystem,
      inputsAndOutputsListPath: '',
      projectPathString: '.',
      outputPathString: outputDirPath,
      templateArbPathString: templateArbPath,
      outputFileString: outputFileName,
      classNameString: config.outputClass,
      preferredSupportedLocales: preferredLocales,
      headerString: config.header,
      headerFile: config.headerFile,
      deferredLoading: config.useDeferredLoading,
      useRelaxedSyntax: config.useRelaxedSyntax,
      useSyntheticPackage: config.useSyntheticPackage,
      useEscaping: config.useEscaping,
      suppressWarnings: config.suppressWarnings,
      useNamedParameters: config.useNamedParameters,
      nullableGetter: config.nullableGetter,
      useFormat: config.useFormat,
      requiredResourceAttributes: config.requiredResourceAttributes,
      untranslatedMessagesFile:
          config.untranslatedMessagesFile ?? 'untranslated_messages.json',
      logger: logger,
    );

    generator.loadResources();
    final generatedCode = generator.generateLocalizationContent();

    // CRITICAL: The output path MUST match exactly what's in buildExtensions
    // buildExtensions is dynamically set based on config
    final outputPath = 'lib/${buildExtensions[r'$lib$']!.first}';
    final outputId = AssetId(buildStep.inputId.package, outputPath);

    await buildStep.writeAsString(outputId, generatedCode);

    logger.printStatus(
      'Jaspr localization files generated successfully to $outputPath',
    );
  } catch (e, stackTrace) {
    logger.printError('Failed to generate localization files: $e');
    logger.printError('Stack trace: $stackTrace');
    rethrow;
  }
}