Home / Function/ buildMakeReadOnly() — react Function Reference

buildMakeReadOnly() — react Function Reference

Architecture documentation for the buildMakeReadOnly() function in makeReadOnly.ts from the react codebase.

Entity Profile

Dependency Diagram

graph TD
  13c9557e_a777_aa57_3631_07e98c11165f["buildMakeReadOnly()"]
  d6c796a8_fd31_85fd_3d28_009b4955a0c4["makeReadOnly.ts"]
  13c9557e_a777_aa57_3631_07e98c11165f -->|defined in| d6c796a8_fd31_85fd_3d28_009b4955a0c4
  5b5b0d8e_4b9b_6d8e_c1e7_c21e8d638cf4["getOrInsertDefault()"]
  13c9557e_a777_aa57_3631_07e98c11165f -->|calls| 5b5b0d8e_4b9b_6d8e_c1e7_c21e8d638cf4
  13ff07fe_b54f_bd16_c3fe_6e936bf0241c["isWriteable()"]
  13c9557e_a777_aa57_3631_07e98c11165f -->|calls| 13ff07fe_b54f_bd16_c3fe_6e936bf0241c
  style 13c9557e_a777_aa57_3631_07e98c11165f fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

compiler/packages/make-read-only-util/src/makeReadOnly.ts lines 53–151

function buildMakeReadOnly(
  logger: ROViolationLogger,
  skippedClasses: string[],
): <T>(val: T, source: string) => T {
  // All saved proxys
  const savedROObjects: SavedROObjects = new WeakMap();

  // Overwrites an object property with its proxy and saves its original value
  function addProperty(
    obj: Object,
    source: string,
    key: string,
    prop: PropertyDescriptor,
    savedEntries: Map<string, SavedEntry>,
  ) {
    const proxy: PropertyDescriptor & {get(): unknown} = {
      get() {
        // read from backing cache entry
        return makeReadOnly(savedEntries.get(key)!.savedVal, source);
      },
      set(newVal: unknown) {
        logger('FORGET_MUTATE_IMMUT', source, key, newVal);
        // update backing cache entry
        savedEntries.get(key)!.savedVal = newVal;
      },
    };
    if (prop.configurable != null) {
      proxy.configurable = prop.configurable;
    }
    if (prop.enumerable != null) {
      proxy.enumerable = prop.enumerable;
    }

    savedEntries.set(key, {savedVal: (obj as any)[key], getter: proxy.get});
    Object.defineProperty(obj, key, proxy);
  }

  // Changes an object to be read-only, returns its input
  function makeReadOnly<T>(o: T, source: string): T {
    if (typeof o !== 'object' || o == null) {
      return o;
    } else if (
      o.constructor?.name != null &&
      skippedClasses.includes(o.constructor.name)
    ) {
      return o;
    }

    const {existed, entry: cache} = getOrInsertDefault(savedROObjects, o);

    for (const [k, entry] of cache.entries()) {
      const currentProp = Object.getOwnPropertyDescriptor(o, k);
      if (currentProp && !isWriteable(currentProp)) {
        continue;
      }
      const currentPropGetter = currentProp?.get;
      const cachedGetter = entry.getter;

      if (currentPropGetter !== cachedGetter) {
        // cache is currently holding an old property
        //  - it may have been deleted
        //  - it may have been deleted + re-set
        //    (meaning that new value is not proxied,
        //     and the current proxied value is stale)
        cache.delete(k);
        if (!currentProp) {
          logger('FORGET_DELETE_PROP_IMMUT', source, k);
        } else if (currentProp) {
          logger('FORGET_CHANGE_PROP_IMMUT', source, k);
          addProperty(o, source, k, currentProp, cache);
        }
      }
    }
    for (const [k, prop] of Object.entries(
      Object.getOwnPropertyDescriptors(o),
    )) {
      if (!cache.has(k) && isWriteable(prop)) {
        if (
          prop.hasOwnProperty('set') ||
          prop.hasOwnProperty('get') ||
          k === 'current'

Domain

Subdomains

Frequently Asked Questions

What does buildMakeReadOnly() do?
buildMakeReadOnly() is a function in the react codebase, defined in compiler/packages/make-read-only-util/src/makeReadOnly.ts.
Where is buildMakeReadOnly() defined?
buildMakeReadOnly() is defined in compiler/packages/make-read-only-util/src/makeReadOnly.ts at line 53.
What does buildMakeReadOnly() call?
buildMakeReadOnly() calls 2 function(s): getOrInsertDefault, isWriteable.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free