displayLabel: sanitizeText()

in packages/graph-explorer/src/connector/gremlin/fetchSchema/index.ts [156:243]


            displayLabel: sanitizeText(name),
            dataType:
              typeof value === "string"
                ? "String"
                : TYPE_MAP[value["@type"]] || "String",
          };
        }),
      });
    }
  }

  remoteLogger.info(
    `[Gremlin Explorer] Found ${vertices.flatMap(v => v.attributes).length} vertex attributes across ${vertices.length} vertex types.`
  );

  return vertices;
};

const fetchVerticesSchema = async (
  gremlinFetch: GremlinFetch,
  remoteLogger: LoggerConnector
): Promise<SchemaResponse["vertices"]> => {
  const countsByLabel = await fetchVertexLabels(gremlinFetch, remoteLogger);
  const labels = Object.keys(countsByLabel);

  return fetchVerticesAttributes(
    gremlinFetch,
    remoteLogger,
    labels,
    countsByLabel
  );
};

const fetchEdgeLabels = async (
  gremlinFetch: GremlinFetch,
  remoteLogger: LoggerConnector
): Promise<Record<string, number>> => {
  const labelsTemplate = edgeLabelsTemplate();
  remoteLogger.info("[Gremlin Explorer] Fetching edge labels with counts...");
  const data = await gremlinFetch<RawEdgeLabelsResponse>(labelsTemplate);

  const values = data.result.data["@value"][0]["@value"];
  const labelsWithCounts: Record<string, number> = {};
  for (let i = 0; i < values.length; i += 2) {
    labelsWithCounts[values[i] as string] = (values[i + 1] as GInt64)["@value"];
  }

  remoteLogger.info(
    `[Gremlin Explorer] Found ${Object.keys(labelsWithCounts).length} edge labels.`
  );

  return labelsWithCounts;
};

const fetchEdgesAttributes = async (
  gremlinFetch: GremlinFetch,
  remoteLogger: LoggerConnector,
  labels: Array<string>,
  countsByLabel: Record<string, number>
): Promise<SchemaResponse["edges"]> => {
  const edges: SchemaResponse["edges"] = [];
  if (labels.length === 0) {
    return edges;
  }

  // Batch in to sets of 100
  const batches = chunk(labels, BATCH_SIZE);

  remoteLogger.info("[Gremlin Explorer] Fetching edges attributes...");
  for (const batch of batches) {
    const edgesTemplate = edgesSchemaTemplate({
      types: batch,
    });
    const data = await gremlinFetch<RawEdgesSchemaResponse>(edgesTemplate);

    const edgesSchemas = data.result.data["@value"][0]["@value"];

    for (let i = 0; i < edgesSchemas.length; i += 2) {
      const label = edgesSchemas[i] as string;
      const vertex = edgesSchemas[i + 1] as GEdge;
      const properties = vertex["@value"].properties;
      edges.push({
        type: label,
        displayLabel: sanitizeText(label),
        total: countsByLabel[label],
        attributes: Object.entries(properties || {}).map(([name, prop]) => {
          const value = prop["@value"].value;
          return {