@servicenow/library-enhanced-element
Version:
Base element for Now Design System components
89 lines (77 loc) • 2.45 kB
JavaScript
;
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) }));
}
})
});
};