migrateCloudflareLegacyEntry function

Future<bool> migrateCloudflareLegacyEntry()

Migrates the legacy Worker entrypoint cloudflare/src/index.ts to cloudflare/src/edge.ts and rewrites "main" of cloudflare/wrangler.jsonc.

Throws StateError if both files exist. Returns true if the file was migrated.

旧Workerエントリファイルcloudflare/src/index.tsをcloudflare/src/edge.tsに移行し、 cloudflare/wrangler.jsoncの"main"を書き換えます。

両方のファイルが存在する場合はStateErrorを投げます。移行した場合はtrueを返します。

Implementation

Future<bool> migrateCloudflareLegacyEntry() async {
  final legacy = File(cloudflareLegacyEntryPath);
  final edge = File(cloudflareEdgeEntryPath);
  if (!legacy.existsSync()) {
    return false;
  }
  if (edge.existsSync()) {
    throw StateError(
      "Both `$cloudflareLegacyEntryPath` and `$cloudflareEdgeEntryPath` exist. "
      "Merge `$cloudflareLegacyEntryPath` into `$cloudflareEdgeEntryPath` manually, delete it, and run `katana apply` again. "
      "`$cloudflareLegacyEntryPath`と`$cloudflareEdgeEntryPath`の両方が存在します。"
      "手動で`$cloudflareEdgeEntryPath`へ統合して`$cloudflareLegacyEntryPath`を削除後、再度`katana apply`を実行してください。",
    );
  }
  await legacy.rename(edge.path);
  final wrangler = File("cloudflare/wrangler.jsonc");
  if (wrangler.existsSync()) {
    final source = await wrangler.readAsString();
    final updated = source.replaceAll(
      RegExp(r'"main"\s*:\s*"src/index\.ts"'),
      '"main": "src/edge.ts"',
    );
    if (updated != source) {
      await wrangler.writeAsString(updated);
    }
  }
  label(
    "Migrated `$cloudflareLegacyEntryPath` to `$cloudflareEdgeEntryPath` and updated `main` in `cloudflare/wrangler.jsonc`.",
  );
  return true;
}