UNPKG

xcraft-core-utils

Version:
155 lines (145 loc) 4.03 kB
'use strict'; const PropTypes = require('prop-types'); /******************************************************************************/ function getType(type) { switch (type.type) { case 'any': return PropTypes.any; case 'string': case 'color': case 'richColor': case 'background': case 'shortcut': case 'angle': case 'percentage': case 'fontWeight': case 'shape': case 'horizontalSpacing': case 'verticalSpacing': case 'fontStyle': case 'cursor': case 'textTransform': case 'justify': case 'textJustify': case 'date': case 'time': case 'datetime': case 'price': case 'weight': case 'length': case 'pixel': case 'volume': case 'percent': case 'delay': case 'place': case 'transition': return PropTypes.string; case 'number': return PropTypes.number; case 'nabu': return (props, propName, componentName) => { const prop = props[propName]; if (prop !== null && prop !== undefined) { if (typeof prop === 'object') { let isNabu = 'nabuId' in prop || ('_type' in prop && (prop['_type'] === 'translatableString' || prop['_type'] === 'translatableMarkdown')); // Handle Map or OrderedMap if (prop.get) { isNabu = prop.get('nabuId') ? true : false; if (!isNabu) { isNabu = prop.get('_type') === 'translatableString' || prop.get('_type') === 'translatableMarkdown'; } } if (!isNabu) { return new Error( 'Invalid prop `' + propName + ' of value "' + prop + '" supplied to' + ' `' + componentName + '`. Validation failed. Missing nabuId !' ); } } else if (typeof prop !== 'string' && typeof prop !== 'number') { return new Error( 'Invalid prop `' + propName + ' of value "' + prop + '" supplied to' + ' `' + componentName + '`. Validation failed.' ); } } }; case 'glyph': return PropTypes.oneOfType([ PropTypes.string, PropTypes.shape({ glyph: PropTypes.string, color: PropTypes.string, }), ]); case 'bool': return PropTypes.oneOf([false, true]); case 'enum': return PropTypes.oneOf(type.values); case 'component': return PropTypes.node; case 'function': return PropTypes.func; case 'grow': return PropTypes.oneOfType([PropTypes.number, PropTypes.string]); case 'oneOfType': // eslint-disable-next-line no-case-declarations const types = type.types.map((t) => getType(t)); return PropTypes.oneOfType(types); default: throw new Error(`Unknown prop type: '${type.type}'`); } } function getPropType(prop) { let propType = prop.type.propType || getType(prop.type); if (prop.required && propType !== undefined) { propType = propType.isRequired; } return propType; } function getDefaultProp(prop) { if (prop.defaultValue !== undefined) { return prop.defaultValue; } else { return null; } } /******************************************************************************/ function makePropTypes(props) { const propTypes = {}; for (const prop of props) { propTypes[prop.name] = getPropType(prop); } return propTypes; } function makeDefaultProps(props) { const defaultProps = {}; for (const prop of props) { const d = getDefaultProp(prop); if (d !== null) { defaultProps[prop.name] = d; } } return defaultProps; } module.exports = { makePropTypes, makeDefaultProps, };