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
Source
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