resolveTursoSharedConfig function

TursoSharedConfig resolveTursoSharedConfig({
  1. required Map shared,
  2. required String appName,
  3. FlavorContext? flavorContext,
})

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,
  );
}