Track HiveGrid Cloud planning reference

This commit is contained in:
david committed 2026-06-26 20:48:01 +02:00
1 parent b3d5ea6764
commit e341c5938a
5784 files changed
+1104929 -3

No files matched your search

@@ -0,0 +1,33 @@
import { createHash } from "node:crypto";
import type { PluginListItem } from "../services/.server/PluginLifecycleService";
import { getPluginConsentRequirements } from "./pluginConsentRequirements";
export function createCapabilityReviewDigest(item: Pick<PluginListItem, "pluginId" | "version" | "manifest">, capabilityNames: ReadonlyArray<string>) {
const selectedCapabilities = new Set(capabilityNames);
const reviewPayload = {
pluginId: item.pluginId,
version: item.version,
capabilities: getPluginConsentRequirements(item.manifest)
.filter((requirement) => selectedCapabilities.has(requirement.name))
.map((requirement) => ({
name: requirement.name,
scope: requirement.scope ?? null,
kind: requirement.kind,
}))
.sort((left, right) => left.name.localeCompare(right.name)),
};
return createHash("sha256").update(stableJsonStringify(reviewPayload)).digest("base64url");
}
function stableJsonStringify(value: unknown): string {
if (Array.isArray(value)) {
return `[${value.map((item) => stableJsonStringify(item)).join(",")}]`;
}
if (value && typeof value === "object") {
return `{${Object.entries(value as Record<string, unknown>)
.sort(([left], [right]) => left.localeCompare(right))
.map(([key, nestedValue]) => `${JSON.stringify(key)}:${stableJsonStringify(nestedValue)}`)
.join(",")}}`;
}
return JSON.stringify(value);
}