build method
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;
}
}