build method

  1. @override
Future<void> build(
  1. BuildStep b
)

Generates the outputs for a given BuildStep.

Implementation

@override
Future<void> build(BuildStep b) async {
  final finalAssetId = AssetId(b.inputId.package, 'lib/main.data.dart');

  final _classes = [
    await for (final file in b.findAssets(Glob('**/*.info')))
      await b.readAsString(file)
  ];

  final classes = _classes.fold<List<Map<String, String>>>([], (acc, line) {
    for (final e in line.split(';')) {
      final parts = e.split('#');
      final type = DataHelpers.getType(parts[0]);
      acc.add({
        'name': parts[0],
        'type': type,
        'path': parts[1],
        'remote': parts[2],
      });
    }
    return acc;
  })
    ..sort((a, b) => a['type']!.compareTo(b['type']!));

  // if this is a library, do not generate
  if (classes.any((clazz) => clazz['path']!.startsWith('asset:'))) {
    return null;
  }

  final modelImports = classes
      .map((clazz) => 'import \'${clazz['path']}\';')
      .toSet()
      .join('\n');

  final adaptersMap = {
    for (final clazz in classes)
      '\'${clazz['type']}\'':
          'ref.read(${clazz['type']}RemoteAdapterProvider)'
  };

  final remotesMap = {
    for (final clazz in classes) '\'${clazz['type']}\'': clazz['remote']
  };

  // imports

  final isFlutter = await isDependency('flutter', b);
  final hasPathProvider = await isDependency('path_provider', b);

  final flutterFoundationImport = isFlutter
      ? "import 'package:flutter/foundation.dart' show kIsWeb;"
      : '';
  final pathProviderImport = hasPathProvider
      ? "import 'package:path_provider/path_provider.dart';"
      : '';

  final autoBaseDirFn = hasPathProvider
      ? 'baseDirFn ??= () => getApplicationDocumentsDirectory().then((dir) => dir.path);'
      : '';

  //

  await b.writeAsString(finalAssetId, '''\n
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: directives_ordering, top_level_function_literal_block

import 'package:flutter_data/flutter_data.dart';
$flutterFoundationImport
$pathProviderImport

$modelImports

// ignore: prefer_function_declarations_over_variables
ConfigureRepositoryLocalStorage configureRepositoryLocalStorage = ({FutureFn<String>? baseDirFn, List<int>? encryptionKey, bool? clear}) {
${isFlutter ? 'if (!kIsWeb) {' : ''}
  $autoBaseDirFn
${isFlutter ? '} else {' : ''}
${isFlutter ? '  baseDirFn ??= () => \'\';' : ''}
${isFlutter ? '}' : ''}

return hiveLocalStorageProvider.overrideWithProvider(Provider(
      (_) => HiveLocalStorage(baseDirFn: baseDirFn, encryptionKey: encryptionKey, clear: clear)));
};

// ignore: prefer_function_declarations_over_variables
RepositoryInitializerProvider repositoryInitializerProvider = (
      {bool? remote, bool? verbose}) {
return _repositoryInitializerProviderFamily(
    RepositoryInitializerArgs(remote, verbose));
};

final repositoryProviders = <String, Provider<Repository<DataModel>>>{
${classes.map((clazz) => '\'' + clazz['type']! + '\': ' + clazz['type']! + 'RepositoryProvider').join(',\n')}
};

final _repositoryInitializerProviderFamily =
FutureProvider.family<RepositoryInitializer, RepositoryInitializerArgs>((ref, args) async {
  final adapters = <String, RemoteAdapter>$adaptersMap;
  final remotes = <String, bool>$remotesMap;

  await ref.read(graphNotifierProvider).initialize();

  for (final key in repositoryProviders.keys) {
    final repository = ref.read(repositoryProviders[key]!);
    repository.dispose();
    await repository.initialize(
      remote: args.remote ?? remotes[key],
      verbose: args.verbose,
      adapters: adapters,
    );
  }

  ref.onDispose(() {
    if (ref.mounted) {
      for (final repositoryProvider in repositoryProviders.values) {
        ref.read(repositoryProvider).dispose();
      }
      ref.read(graphNotifierProvider).dispose();
    }
  });

  return RepositoryInitializer();
});
''');
}