exec method
Run command.
The contents of katana.yaml and the arguments of the command are passed to context.
コマンドを実行します。
contextにkatana.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,
);
}