@dnb/eufemia
Version:
DNB Eufemia Design System UI Library
71 lines (70 loc) • 2.18 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.classWithCamelCaseProps = classWithCamelCaseProps;
exports.convertCamelCasePropsToSnakeCase = convertCamelCasePropsToSnakeCase;
exports.withCamelCaseProps = withCamelCaseProps;
var _react = _interopRequireDefault(require("react"));
var _componentHelper = require("../component-helper.js");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function withCamelCaseProps(Base) {
const Component = Base;
const Derived = props => {
return _react.default.createElement(Component, convertCamelCasePropsToSnakeCase(props));
};
Object.defineProperty(Derived, 'name', {
value: Base.name
});
for (const name in Base) {
Object.defineProperty(Derived, name, {
value: Base[name]
});
}
return Derived;
}
function classWithCamelCaseProps(Base) {
const Component = Base;
class Derived extends Base {
componentDidMount() {}
render() {
if (this.props !== this._prevProps) {
this._prevProps = this.props;
this._elem = _react.default.createElement(Component, convertCamelCasePropsToSnakeCase(this.props));
}
return this._elem;
}
}
Object.defineProperty(Derived, 'name', {
value: Base.name
});
Object.defineProperty(Derived, 'displayName', {
value: Base.displayName || Base.name
});
return Derived;
}
function convertCamelCasePropsToSnakeCase(props, validProperties) {
const isFrozen = Object.isFrozen(props);
const newProps = isFrozen ? {
...props
} : props;
const hasValidProperties = Array.isArray(validProperties);
for (const key in props) {
switch (key) {
case 'className':
{
continue;
}
}
if (/^[a-z]+[A-Z]/.test(key)) {
const name = (0, _componentHelper.toSnakeCase)(key);
if (hasValidProperties && !(validProperties !== null && validProperties !== void 0 && validProperties.includes(name))) {
continue;
}
newProps[name] = props[key];
delete newProps[key];
}
}
return isFrozen ? Object.freeze(newProps) : newProps;
}
//# sourceMappingURL=withCamelCaseProps.js.map