discover static method

LoomProjectConfig discover(
  1. Directory start, {
  2. String? explicitPath,
})

Finds and parses project configuration, searching parent directories.

Implementation

static LoomProjectConfig discover(Directory start, {String? explicitPath}) {
  final configFile = explicitPath == null
      ? _findConfig(start)
      : File(p.normalize(p.absolute(start.path, explicitPath)));
  if (configFile == null || !configFile.existsSync()) {
    throw LoomCliException(
      'Could not find sqlite_loom.yaml. Run `dart run sqlite_loom init`.',
      LoomExitCode.missingInput,
    );
  }
  final root = configFile.parent;
  final document = loadYaml(configFile.readAsStringSync());
  if (document is! YamlMap) {
    throw LoomCliException(
      '${configFile.path} must contain a YAML map.',
      LoomExitCode.invalidProject,
    );
  }
  final version = document['version'];
  if (version != 1) {
    throw LoomCliException(
      'Unsupported sqlite_loom.yaml version: $version',
      LoomExitCode.invalidProject,
    );
  }
  final migrations = _yamlMap(document, 'migrations');
  final runner = _yamlMap(document, 'runner');
  final packageName = _readPackageName(root);
  final legacyRegistry = migrations['registry'];
  return LoomProjectConfig._(
    root: root,
    configFile: configFile,
    packageName: packageName,
    migrationsDirectory: Directory(
      _safeProjectPath(root, _yamlString(migrations, 'directory')),
    ),
    indexFile: File(
      _safeProjectPath(
        root,
        _yamlString(
          migrations,
          'index',
          fallback: legacyRegistry is String ? legacyRegistry : null,
        ),
      ),
    ),
    lockFile: File(
      _safeProjectPath(
        root,
        _yamlString(
          migrations,
          'lock',
          fallback: '.sqlite_loom/migrations.lock.json',
        ),
      ),
    ),
    runnerFile: File(_safeProjectPath(root, _yamlString(runner, 'path'))),
    flavorOverridesDirectory: Directory(
      _safeProjectPath(
        root,
        _yamlString(
          runner,
          'flavor_overrides_directory',
          fallback: 'config/sqlite_loom',
        ),
      ),
    ),
    defaultFlavor: _yamlString(
      runner,
      'default_flavor',
      fallback: 'development',
    ),
  );
}