loadConfig function

Future<BuildConfig> loadConfig({
  1. String? configPath,
  2. Map<String, dynamic> overrides = const {},
})

Loads spry.config.dart and merges the supplied overrides.

Implementation

Future<BuildConfig> loadConfig({
  String? configPath,
  Map<String, dynamic> overrides = const {},
}) async {
  final rootDir = p.normalize(
    p.absolute(_string(overrides['rootDir']) ?? Directory.current.path),
  );
  final file = File(
    p.normalize(p.absolute(rootDir, configPath ?? 'spry.config.dart')),
  );

  var config = BuildConfig(rootDir: rootDir);
  if (await file.exists()) {
    final result = await Process.run(Platform.resolvedExecutable, [
      'run',
      file.path,
    ], workingDirectory: rootDir);

    if (result.exitCode != 0) {
      throw LoadConfigException(
        'Failed to run spry.config.dart:\n${result.stderr}',
      );
    }

    final stdoutText = (result.stdout as String).trim();
    if (stdoutText.isEmpty) {
      throw const LoadConfigException(
        'spry.config.dart did not emit any configuration JSON.',
      );
    }

    final json = jsonDecode(stdoutText);
    if (json is! Map<String, dynamic>) {
      throw const LoadConfigException(
        'spry.config.dart must emit a JSON object.',
      );
    }

    config = BuildConfig.fromJson(json, rootDir: rootDir);
  }

  return config.merge(overrides);
}