Deep Freeze With Cycle Protection

Recursively freeze arrays and objects while tolerating cycles, accessors and typed arrays that cannot be frozen with elements.

JavascriptData Integrity

Code

snippet
export function deepFreeze(value, seen = new WeakSet()) {
  if (value === null || (typeof value !== "object" && typeof value !== "function")) {
    return value;
  }
  if (seen.has(value)) return value;
  seen.add(value);
  if (ArrayBuffer.isView(value)) return value;

  for (const key of Reflect.ownKeys(value)) {
    const descriptor = Object.getOwnPropertyDescriptor(value, key);
    if (descriptor && "value" in descriptor) {
      deepFreeze(descriptor.value, seen);
    }
  }
  return Object.freeze(value);
}