"use strict"; const crypto = require("node:crypto"); const { normalizeRemoteUrl } = require("../shared/repository-match.cjs"); function canonicalRemote(value) { const normalized = normalizeRemoteUrl(value); return normalized ? `${normalized.host}/${normalized.path}`.toLowerCase() : ""; } function deploymentIdentity({ workload, profile = null, repository = null }) { const remote = canonicalRemote(workload?.metadata?.sourceRepository || repository?.sshUrl || repository?.cloneUrl || profile?.cloneUrl); return { repository: remote || String(workload?.link?.repositoryFullName || repository?.fullName || profile?._repositoryFullName || "").toLowerCase(), branch: String(workload?.metadata?.branch || profile?.branch || repository?.defaultBranch || "").toLowerCase(), serverId: String(workload?.serverId || profile?.serverId || ""), environment: String(profile?.environment || "production").toLowerCase(), composeProject: String(workload?.compose?.project || profile?.composeProject || "").toLowerCase(), deploymentRoot: String(workload?.compose?.workingDir || profile?.composeWorkingDir || workload?.remoteFolderCandidate || profile?.remoteFolder || "").replace(/\\/g, "/").replace(/\/+$/, "").toLowerCase(), containers: (workload?.containers || []).map((item) => String(item.id || item.name || "").toLowerCase()).sort(), liveSha: String(workload?.metadata?.liveRevision || "").toLowerCase(), profileId: String(profile?.id || workload?.link?.profileId || ""), }; } function evidenceHash(identity, evidence = {}) { const stable = (value) => Array.isArray(value) ? value.map(stable) : value && typeof value === "object" ? Object.fromEntries(Object.keys(value).sort().map((key) => [key, stable(value[key])])) : value; return crypto.createHash("sha256").update(JSON.stringify(stable({ identity, evidence }))).digest("hex"); } function authorityKey(identity) { return [identity.repository, identity.serverId, identity.environment].join("|"); } module.exports = { canonicalDeploymentRemote: canonicalRemote, deploymentIdentity, deploymentEvidenceHash: evidenceHash, deploymentAuthorityKey: authorityKey };