exec method

  1. @override
Future<void> exec(
  1. ExecContext context
)
override

Run command.

The contents of katana.yaml and the arguments of the command are passed to context.

コマンドを実行します。

contextkatana.yamlの内容やコマンドの引数が渡されます。

Implementation

@override
Future<void> exec(ExecContext context) async {
  final bin = context.yaml.getAsMap("bin");
  final npm = bin.get("npm", "npm");
  final wrangler = bin.get("wrangler", "wrangler");
  final cloudflare = context.yaml.getAsMap("cloudflare");
  final storage = cloudflare.getAsMap("storage");
  final binding = storage.get("binding", "R2_BUCKET");
  final bucketName = storage.get("bucket_name", "");
  final previewBucketName = storage.get("preview_bucket_name", "");
  final publicBaseUrl = storage.get("public_base_url", "");
  final configuredDownloadUrlSecret = storage.get("download_url_secret", "");
  if (binding.isEmpty) {
    error(
      "If [cloudflare]->[storage]->[enable] is enabled, please include [cloudflare]->[storage]->[binding].",
    );
    return;
  }
  if (bucketName.isEmpty) {
    error(
      "If [cloudflare]->[storage]->[enable] is enabled, please include [cloudflare]->[storage]->[bucket_name]. Create it with `wrangler r2 bucket create <bucket_name>`.",
    );
    return;
  }
  if (publicBaseUrl.isEmpty) {
    error(
      "If [cloudflare]->[storage]->[enable] is enabled, please include [cloudflare]->[storage]->[public_base_url].",
    );
    return;
  }
  final downloadUrlSecret =
      await _loadOrCreateDownloadUrlSecret(configuredDownloadUrlSecret);
  final cloudflareDir = Directory("cloudflare");
  if (!cloudflareDir.existsSync()) {
    error(
      "The directory `cloudflare` does not exist. Initialize Cloudflare Workers by enabling [cloudflare]->[workers]->[enable] and executing `katana apply`.",
    );
    return;
  }
  final indexFile = File("cloudflare/src/index.ts");
  if (!indexFile.existsSync()) {
    error(
      "The file `cloudflare/src/index.ts` does not exist. Initialize Cloudflare Workers by enabling [cloudflare]->[workers]->[enable] and executing `katana apply`.",
    );
    return;
  }
  final wranglerFile = File("cloudflare/wrangler.jsonc");
  if (!wranglerFile.existsSync()) {
    error(
      "The file `cloudflare/wrangler.jsonc` does not exist. Initialize Cloudflare Workers by enabling [cloudflare]->[workers]->[enable] and executing `katana apply`.",
    );
    return;
  }

  label("Add Cloudflare Workers functions");
  final source = await indexFile.readAsString();
  final updated = _updateStorageFunctions(
    source,
    binding: binding,
    publicBaseUrl: publicBaseUrl,
  );
  if (updated == null) {
    return;
  }
  await indexFile.writeAsString(updated);
  label("Add Cloudflare R2 bucket binding");
  await wranglerFile.writeAsString(_updateWranglerR2Bucket(
    await wranglerFile.readAsString(),
    binding: binding,
    bucketName: bucketName,
    previewBucketName: previewBucketName,
  ));
  await command(
    "Package installation.",
    [
      npm,
      "install",
      "@mathrunet/masamune_cloudflare_storage",
    ],
    workingDirectory: "cloudflare",
    runInShell: true,
  );
  await addFlutterImport(
    [
      "masamune_storage_cloudflare",
    ],
  );
  await _putWranglerSecret(
    wrangler: wrangler,
    key: "STORAGE_DOWNLOAD_URL_SECRET",
    value: downloadUrlSecret,
  );
}