shapeup.js
function frozenWrapper(propType) {
  const checkFrozen = (obj, propName, componentName) => {
    if (!Object.isFrozen(obj)) {
      throw new Error(
        `the property "${propName}" provided to component ` +
        `"${componentName}" is not frozen`
      );
    }
    forEachKeyValue(obj, (name, prop) => {
      const type = typeof obj;
      if (prop !== null && (type === 'object' || type === 'function')) {
        checkFrozen(prop, `${propName}.${name}`, componentName);
      }
    });
  };

  const frozen = (props, propName, componentName, ...rest) => {
    const propValue = props[propName];
    if (!propValue) {
      return null;
    }
    try {
      checkFrozen(propValue, propName, componentName);
    } catch (err) {
      return err;
    }
    return propType(props, propName, componentName, ...rest);
  };
  frozen[SHAPE] = propType[SHAPE];
  return frozen;
}
function frozenWrapper(propType) {
  const checkFrozen = (obj, propName, componentName) => {
    if (!Object.isFrozen(obj)) {
      throw new Error(
        `the property "${propName}" provided to component ` +
        `"${componentName}" is not frozen`
      );
    }
    forEachKeyValue(obj, (name, prop) => {
      const type = typeof obj;
      if (prop !== null && (type === 'object' || type === 'function')) {
        checkFrozen(prop, `${propName}.${name}`, componentName);
      }
    });
  };

  const frozen = (props, propName, componentName, ...rest) => {
    const propValue = props[propName];
    if (!propValue) {
      return null;
    }
    try {
      checkFrozen(propValue, propName, componentName);
    } catch (err) {
      return err;
    }
    return propType(props, propName, componentName, ...rest);
  };
  frozen[SHAPE] = propType[SHAPE];
  return frozen;
}
function frozenWrapper ( propType ) { const checkFrozen = ( obj , propName , componentName ) => { if ( ! Object . isFrozen ( obj ) ) { throw new Error ( ` ${ propName } ` + ` ${ componentName } ` ) ; } forEachKeyValue ( obj , ( name , prop ) => { const type = typeof obj ; if ( prop !== null && ( type === 'object' || type === 'function' ) ) { checkFrozen ( prop , ` ${ propName } ${ name } ` , componentName ) ; } } ) ; } ; const frozen = ( props , propName , componentName , ... rest ) => { const propValue = props [ propName ] ; if ( ! propValue ) { return null ; } try { checkFrozen ( propValue , propName , componentName ) ; } catch ( err ) { return err ; } return propType ( props , propName , componentName , ... rest ) ; } ; frozen [ SHAPE ] = propType [ SHAPE ] ; return frozen ; }
Return a frozen wrapper for the given propType validator.
The resulting validator checks that the provided property is deeply frozen.

@param {Function} propType A shape validator.
@return {Function} The frozen validator.
Return a frozen wrapper for the given propType validator . The resulting validator checks that the provided property is deeply frozen .