UNPKG

@servicenow/library-enhanced-element

Version:

Base element for Now Design System components

89 lines (77 loc) 2.45 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.extendWithCast = undefined; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _get = require('lodash/get'); var _get2 = _interopRequireDefault(_get); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const castJSON = (properties, prop) => { if (typeof properties[prop] !== 'string') { return properties; } let value; try { value = JSON.parse(properties[prop]); } catch (e) { // eslint-disable-next-line no-console console.error(`The attribute ${prop} is not valid JSON:`, e); value = {}; } return _extends({}, properties, { [prop]: value }); }; const castJSONorString = (properties, prop) => { if (typeof properties[prop] !== 'string') { return properties; } let value; try { value = JSON.parse(properties[prop]); return _extends({}, properties, { [prop]: value }); } catch (e) { return properties; } }; const castNumber = (properties, prop) => { if (typeof properties[prop] !== 'string') { return properties; } if (isNaN(properties[prop])) { // eslint-disable-next-line no-console console.error(`The attribute ${prop} is not a number.`); return properties; } return _extends({}, properties, { [prop]: Number(properties[prop]) }); }; const castFunctions = { array: castJSON, object: castJSON, number: castNumber, objectOrString: castJSONorString }; const extendWithCast = exports.extendWithCast = baseConfig => { const baseTransformProps = (0, _get2.default)(baseConfig, ['renderer', 'transformProps'], state => state); const properties = baseConfig.properties || {}; const transforms = Object.keys(properties).reduce((acc, key) => { if (properties[key].hasOwnProperty('cast')) { const transform = castFunctions[properties[key].cast]; acc = [...acc, properties => transform(properties, key)]; } return acc; }, []); return _extends({}, baseConfig, { renderer: _extends({}, baseConfig.renderer, { transformProps: state => { const properties = transforms.reduce((acc, fn) => fn(acc), state.properties); return baseTransformProps(_extends({}, state, { properties: _extends({}, properties) })); } }) }); };