discover static method
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',
),
);
}