Something went wrong. Try again.
This repository has no description
Something went wrong. Try again.
1.2 kB · 34 lines
TypeScript
1234567891011121314151617181920212223242526272829303132333435import * as Effect from "effect/Effect";import { digest } from "./artifact.ts";export const id = (value: unknown): value is string => typeof value === "string" && /^(?:[a-f0-9]{32}|[a-f0-9]{8}(?:-[a-f0-9]{4}){3}-[a-f0-9]{12})$/.test(value);export const object = (v: unknown): v is Record<string, unknown> => !!v && typeof v === "object" && !Array.isArray(v);export const eq = (a: unknown, b: unknown): boolean => { if (a === b) return true; if (Array.isArray(a) && Array.isArray(b)) return a.length === b.length && a.every((v, i) => eq(v, b[i])); if (!object(a) || !object(b)) return false; const keys = Object.keys(a); return ( keys.length === Object.keys(b).length && keys.every((k) => eq(a[k], b[k])) );};export const fingerprint = (value: unknown) => Effect.suspend(() => { const canonical = (v: unknown): unknown => Array.isArray(v) ? v.map(canonical) : object(v) ? Object.fromEntries( Object.keys(v) .sort() .map((k) => [k, canonical(v[k])]), ) : v; return digest( new TextEncoder().encode(JSON.stringify(canonical(value))) .buffer as ArrayBuffer, ); });