findEdgeTidbUsages function

List<String> findEdgeTidbUsages({
  1. String entry = cloudflareEdgeEntryPath,
})

Returns the files that use TiDB from the edge Worker entry.

Follows relative imports of entry recursively within cloudflare/src and lists files containing @mathrunet/masamune_cloudflare_tidb, TidbDirectClient or TIDB_HOST.

edge WorkerentryからTiDBを使用しているファイルを返します。

entryの相対importをcloudflare/src内で再帰的に辿り、 @mathrunet/masamune_cloudflare_tidb・TidbDirectClient・TIDB_HOSTを含むファイルを列挙します。

Implementation

List<String> findEdgeTidbUsages({String entry = cloudflareEdgeEntryPath}) {
  const root = "cloudflare/src";
  const markers = [
    "@mathrunet/masamune_cloudflare_tidb",
    "TidbDirectClient",
    "TIDB_HOST",
  ];
  final importPattern = RegExp(
    r"""(?:import|export)\s+(?:[^'";]*?\s+from\s+)?["'](\.{1,2}/[^"']+)["']""",
  );
  final visited = <String>{};
  final usages = <String>[];
  final queue = <String>[_normalizeCloudflarePath(entry)];
  while (queue.isNotEmpty) {
    final path = queue.removeAt(0);
    if (!visited.add(path)) {
      continue;
    }
    final file = File(path);
    if (!file.existsSync()) {
      continue;
    }
    final source = file.readAsStringSync();
    if (markers.any(source.contains)) {
      usages.add(path);
    }
    final directory =
        path.contains("/") ? path.substring(0, path.lastIndexOf("/")) : "";
    for (final match in importPattern.allMatches(source)) {
      final resolved = _resolveCloudflareImport(directory, match.group(1)!);
      if (resolved != null &&
          resolved.startsWith("$root/") &&
          !visited.contains(resolved)) {
        queue.add(resolved);
      }
    }
  }
  return usages;
}