mekanika/skematic

View on GitHub
src/plugins/toReactShape.js

Summary

Maintainability
A
0 mins
Test Coverage

var mapToPropType = function (PropTypes, type) {
  switch (type) {
    // @todo Add support for:
    //   - Arrays
    //   - Objects (sub-schema)

    case 'boolean':
      return PropTypes.bool

    case 'string':
    case 'text':
      return PropTypes.string

    case 'integer':
    case 'float':
    case 'decimal':
    case 'number':
      return PropTypes.number

    default:
      if (type) {
        // @todo Make this log dependent on a development env
        // console.log('[mapToPropType] No map for type: ' + type)
      }
      return PropTypes.any
  }
}

/**
  Converts a Skematic model into a React PropTypes validation object
  @see https://facebook.github.io/react/docs/reusable-components.html

  @param {Object} model The Skematic data model
  @param {Object} PropTypes The React.PropTypes setter

  @return {Object} A mapped propTypes object to attach to React components
*/

module.exports = function toReactShape (model, PropTypes) {
  var shape = {}

  for (var key in model) {
    var field = model[key]

    shape[key] = mapToPropType(PropTypes, field.type)

    // Enforce .isRequired for fields that disable allowNull
    if (field.required || field.allowNull === false) {
      shape[key] = shape[key].isRequired
    }
  }

  return PropTypes.shape(shape)
}