Source: utils/deepFreeze.js

/**
 * Recursively freezes a plain object or array.
 * @template T
 * @param {T} value - Value to freeze
 * @returns {Readonly<T>} The frozen value
 */
export const deepFreeze = (value) => {
  const freeze = (item, visited) => {
    if (!item || typeof item !== "object" || visited.has(item)) {
      return item;
    }

    visited.add(item);

    for (const key of Reflect.ownKeys(item)) {
      freeze(item[key], visited);
    }

    return Object.freeze(item);
  };

  return freeze(value, new WeakSet());
};