97 lines
2.4 KiB
JavaScript
97 lines
2.4 KiB
JavaScript
import { isString, isUndefined } from "lodash/fp"
|
|
import { TYPE_MAP } from "./types"
|
|
import { assign } from "lodash"
|
|
import { uuid } from "builderStore/uuid"
|
|
|
|
export const getBuiltin = _component => {
|
|
const { props } = createProps({ _component })
|
|
|
|
return {
|
|
_component,
|
|
name: "Screenslot",
|
|
props,
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param {object} componentDefinition - component definition from a component library
|
|
* @param {object} derivedFromProps - extra props derived from a components given props.
|
|
* @return {object} the fully created properties for the component, and any property parsing errors
|
|
*/
|
|
export const createProps = (componentDefinition, derivedFromProps) => {
|
|
const errorOccurred = (propName, error) => errors.push({ propName, error })
|
|
|
|
const props = {
|
|
_id: uuid(),
|
|
_component: componentDefinition._component,
|
|
_styles: { normal: {}, hover: {}, active: {}, selected: {} },
|
|
_code: "",
|
|
}
|
|
|
|
const errors = []
|
|
|
|
if (!componentDefinition._component) {
|
|
errorOccurred("_component", "Component name not supplied")
|
|
}
|
|
|
|
for (let propName in componentDefinition.props) {
|
|
const parsedPropDef = parsePropDef(componentDefinition.props[propName])
|
|
|
|
if (parsedPropDef.error) {
|
|
errors.push({ propName, error: parsedPropDef.error })
|
|
} else {
|
|
props[propName] = parsedPropDef
|
|
}
|
|
}
|
|
|
|
if (derivedFromProps) {
|
|
assign(props, derivedFromProps)
|
|
}
|
|
|
|
if (componentDefinition.children !== false && isUndefined(props._children)) {
|
|
props._children = []
|
|
}
|
|
|
|
return {
|
|
props,
|
|
errors,
|
|
}
|
|
}
|
|
|
|
export const makePropsSafe = (componentDefinition, props) => {
|
|
const safeProps = createProps(componentDefinition, props).props
|
|
for (let propName in safeProps) {
|
|
props[propName] = safeProps[propName]
|
|
}
|
|
|
|
for (let propName in props) {
|
|
if (safeProps[propName] === undefined) {
|
|
delete props[propName]
|
|
}
|
|
}
|
|
|
|
if (!props._styles) {
|
|
props._styles = { normal: {}, hover: {}, active: {}, selected: {} }
|
|
}
|
|
|
|
return props
|
|
}
|
|
|
|
const parsePropDef = propDef => {
|
|
const error = message => ({ error: message, propDef })
|
|
|
|
if (isString(propDef)) {
|
|
if (!TYPE_MAP[propDef]) return error(`Type ${propDef} is not recognised.`)
|
|
|
|
return TYPE_MAP[propDef].default
|
|
}
|
|
|
|
const type = TYPE_MAP[propDef.type]
|
|
if (!type) return error(`Type ${propDef.type} is not recognised.`)
|
|
|
|
return propDef.default
|
|
}
|
|
|
|
export const arrayElementComponentName = (parentComponentName, arrayPropName) =>
|
|
`${parentComponentName}:${arrayPropName}`
|