1
0
Fork 0
mirror of synced 2024-09-20 19:33:10 +12:00
budibase/packages/builder/src/userInterface/pagesParsing/createProps.js

70 lines
1.6 KiB
JavaScript
Raw Normal View History

2019-07-19 23:52:08 +12:00
import {
isString,
isUndefined
} from "lodash/fp";
2019-07-20 05:03:58 +12:00
import { types } from "./types";
2019-07-19 23:52:08 +12:00
import { assign } from "lodash";
2019-07-21 08:41:06 +12:00
export const createProps = (componentName, propsDefinition, derivedFromProps) => {
const error = (propName, error) =>
errors.push({propName, error});
const props = {
_component: componentName
};
2019-07-19 23:52:08 +12:00
const errors = [];
2019-07-21 08:41:06 +12:00
if(!componentName)
error("_component", "Component name not supplied");
2019-07-19 23:52:08 +12:00
for(let propDef in propsDefinition) {
const parsedPropDef = parsePropDef(propsDefinition[propDef]);
if(parsedPropDef.error)
2019-07-21 08:41:06 +12:00
error(propDef, parsedPropDef.error);
2019-07-19 23:52:08 +12:00
else
props[propDef] = parsedPropDef;
}
if(derivedFromProps) {
assign(props, ...derivedFromProps);
}
return ({
props, errors
});
}
const parsePropDef = propDef => {
2019-07-20 05:03:58 +12:00
const error = message => ({error:message, propDef});
2019-07-19 23:52:08 +12:00
if(isString(propDef)) {
if(!types[propDef])
return error(`Do not recognise type ${propDef}`);
return types[propDef].default();
}
if(!propDef.type)
return error("Property Definition must declare a type");
const type = types[propDef.type];
if(!type)
return error(`Do not recognise type ${propDef.type}`);
if(isUndefined(propDef.default))
return type.default(propDef);
if(!type.isOfType(propDef.default))
return error(`${propDef.default} is not of type ${type}`);
return propDef.default;
}
2019-07-20 05:03:58 +12:00
/*
Allowed propDefOptions
- type: string, bool, number, array
- default: default value, when undefined
- required: field is required
*/