resolveTursoSharedConfig function
Resolves cloudflare.turso.shared from shared.
Values may be a {dev:, prod:} map or a single value. Empty values use the defaults
(<app>-dev-shared / <app>-shared, groups <app>-dev / <app>-us) where <app>
is appName (the pubspec name with _ replaced by -).
Throws FormatException for invalid values.
sharedからcloudflare.turso.sharedを解決します。
値は{dev:, prod:}形式または単一値で指定できます。空の場合は既定値
(<app>-dev-shared / <app>-shared、group <app>-dev / <app>-us)を使います。
<app>はappName(pubspecのnameの_を-に置換したもの)です。
不正な値はFormatExceptionを投げます。
Implementation
TursoSharedConfig resolveTursoSharedConfig({
required Map shared,
required String appName,
FlavorContext? flavorContext,
}) {
final logicalName = shared["logical_name"]?.toString().trim() ?? "";
final resolvedLogicalName = logicalName.isEmpty ? "shared" : logicalName;
if (!RegExp(r"^[A-Za-z0-9_-]+$").hasMatch(resolvedLogicalName)) {
throw FormatException(
"[cloudflare]->[turso]->[shared]->[logical_name] must match [A-Za-z0-9_-]+: $resolvedLogicalName",
);
}
final app = appName.trim().toLowerCase().replaceAll("_", "-");
String value(String key, String flavor) {
final Object? raw = flavorContext != null
? flavorContext.yamlValue(
["cloudflare", "turso", "shared", key],
flavor: KatanaFlavor.parse(flavor),
)
: shared[key] is Map
? (shared[key] as Map)[flavor]
: shared[key];
return raw?.toString().trim() ?? "";
}
String fallback(String suffix) {
if (app.isEmpty) {
throw const FormatException(
"The pubspec name could not be read. Set [cloudflare]->[turso]->[shared]->[database] and [group] explicitly.",
);
}
return "$app-$suffix";
}
final bindings = <String, TursoSharedBinding>{};
for (final flavor in const ["dev", "prod"]) {
var database = value("database", flavor);
var group = value("group", flavor);
if (database.isEmpty) {
database = fallback(flavor == "dev" ? "dev-shared" : "shared");
}
if (group.isEmpty) {
group = fallback(flavor == "dev" ? "dev" : "us");
}
if (!RegExp(r"^[a-z0-9-]{1,56}$").hasMatch(database)) {
throw FormatException(
"[cloudflare]->[turso]->[shared]->[database] ($flavor) must match [a-z0-9-]{1,56}: $database",
);
}
if (!RegExp(r"^[A-Za-z0-9_-]+$").hasMatch(group)) {
throw FormatException(
"[cloudflare]->[turso]->[shared]->[group] ($flavor) must match [A-Za-z0-9_-]+: $group",
);
}
bindings[flavor] = TursoSharedBinding(database: database, group: group);
}
if (bindings["dev"]!.database == bindings["prod"]!.database) {
throw const FormatException(
"[cloudflare]->[turso]->[shared]->[database] must differ between dev and prod.",
);
}
return TursoSharedConfig(
logicalName: resolvedLogicalName,
bindings: bindings,
);
}