UNPKG

@nitrogenbuilder/client-core

Version:

Nitrogen Builder Core Client

207 lines (206 loc) 8.68 kB
import { nitrogen } from '../index.js'; import { getDefault } from './getDefault.js'; import { resolve } from './resolve.js'; import { set } from './set.js'; function processChildren(mod, dynamicData = {}, requestedData = {}) { if (!mod.props.children) return undefined; if (Array.isArray(mod.props.children)) { return mod.props.children.map((child) => { return processModule(child, dynamicData, requestedData); }); } else if (typeof mod.props.children === 'object') { return Object.keys(mod.props.children).reduce((acc, slot) => { if (Array.isArray(mod.props.children[slot])) { return { ...acc, [slot]: mod.props.children[slot].map((child) => { return processModule(child, dynamicData, requestedData); }), }; } return acc; }, {}); } return undefined; } export function renderModuleProps(props, settings, dynamicData = {}, requestedData = {}) { let _settings; if (typeof settings === 'string') { const module = nitrogen.getModule(settings); if (!module) return {}; _settings = { categories: module.categories, options: module.options, }; } else { _settings = settings; } let spreadProps = { ...(props ?? {}) }; delete spreadProps.children; function recursiveArrayPropDefault(prop, keys) { if (prop.props) { Object.entries(prop.props).forEach(([subPropK, subPropV]) => { if (subPropV.type === 'array') { let indexes = Object.keys(resolve(keys.join('.'), spreadProps) ?? {}); for (let i = 0; i < indexes.length; i++) { recursiveArrayPropDefault(subPropV, [ ...keys, `${indexes[i]}`, subPropK, ]); } } else { let indexes = Object.keys(resolve(keys.join('.'), spreadProps) ?? {}); for (let i = 0; i < indexes.length; i++) { set(spreadProps, getDefault(resolve([...keys, `${indexes[i]}`, subPropK].join('.'), spreadProps), subPropV), [...keys, `${indexes[i]}`, subPropK]); } } }); } } Object.values(_settings.categories).forEach((category) => { Object.entries(category.groups).forEach(([groupK, group]) => { Object.entries(group.props).forEach(([propK, propV]) => { if (spreadProps[groupK] === undefined) { spreadProps[groupK] = {}; } if (propV.type === 'array') { recursiveArrayPropDefault(propV, [groupK, propK]); } else { spreadProps[groupK][propK] = getDefault(spreadProps[groupK][propK], propV); } }); }); }); function recursiveDynamicProps(keys) { let props = resolve(keys.join('.'), spreadProps); if (!props) return; let propChildrenKeys = Object.keys(props); for (let j = 0; j < propChildrenKeys.length; j++) { let propChildrenKey = propChildrenKeys[j]; let propChild = props[propChildrenKey]; if (propChildrenKey.endsWith('___dynamic')) { const dynamicVal = resolve(propChild.key, dynamicData) || propChild.fallback || ''; props[propChildrenKey.replace('___dynamic', '')] = typeof dynamicVal === 'boolean' ? dynamicVal : (propChild.before || '') + dynamicVal + (propChild.after || ''); } else if (typeof props[propChildrenKey] === 'object') { recursiveDynamicProps([...keys, propChildrenKey]); } } } let groupKeys = Object.keys(spreadProps); for (let i = 0; i < groupKeys.length; i++) { let groupKey = groupKeys[i]; if (typeof groupKey === 'string') { if (typeof spreadProps[groupKey] === 'object') { // check children properties for if the end in ___dynamic recursiveDynamicProps([groupKey]); } } } return spreadProps; } function processModule(mod, dynamicData = {}, requestedData = {}, includeChildren = true) { const module = typeof mod.module === 'object' ? mod.module : nitrogen.getModule(mod.module); let spreadProps = { ...(mod?.props ?? {}) }; delete spreadProps.children; if (typeof module === 'object') { function recursiveArrayPropDefault(prop, keys) { if (prop.props) { Object.entries(prop.props).forEach(([subPropK, subPropV]) => { if (subPropV.type === 'array') { let indexes = Object.keys(resolve(keys.join('.'), spreadProps) ?? {}); for (let i = 0; i < indexes.length; i++) { recursiveArrayPropDefault(subPropV, [ ...keys, `${indexes[i]}`, subPropK, ]); } } else { let indexes = Object.keys(resolve(keys.join('.'), spreadProps) ?? {}); for (let i = 0; i < indexes.length; i++) { set(spreadProps, getDefault(resolve([...keys, `${indexes[i]}`, subPropK].join('.'), spreadProps), subPropV), [...keys, `${indexes[i]}`, subPropK]); } } }); } } Object.values(module.categories).forEach((category) => { Object.entries(category.groups).forEach(([groupK, group]) => { Object.entries(group.props).forEach(([propK, propV]) => { if (spreadProps[groupK] === undefined) { spreadProps[groupK] = {}; } if (propV.type === 'array') { recursiveArrayPropDefault(propV, [groupK, propK]); } else { spreadProps[groupK][propK] = getDefault(spreadProps[groupK][propK], propV); } }); }); }); } function recursiveDynamicProps(keys) { let props = resolve(keys.join('.'), spreadProps); if (!props) return; let propChildrenKeys = Object.keys(props); for (let j = 0; j < propChildrenKeys.length; j++) { let propChildrenKey = propChildrenKeys[j]; let propChild = props[propChildrenKey]; if (propChildrenKey.endsWith('___dynamic')) { const dynamicVal = resolve(propChild.key, dynamicData) || propChild.fallback || ''; props[propChildrenKey.replace('___dynamic', '')] = typeof dynamicVal === 'boolean' ? dynamicVal : (propChild.before || '') + dynamicVal + (propChild.after || ''); } else if (typeof props[propChildrenKey] === 'object') { recursiveDynamicProps([...keys, propChildrenKey]); } } } let groupKeys = Object.keys(spreadProps); for (let i = 0; i < groupKeys.length; i++) { let groupKey = groupKeys[i]; if (typeof groupKey === 'string') { if (typeof spreadProps[groupKey] === 'object') { // check children properties for if the end in ___dynamic recursiveDynamicProps([groupKey]); } } } const children = includeChildren ? processChildren(mod, dynamicData, requestedData) : undefined; return { id: mod.id, module: mod.module, props: spreadProps, ...(children && { children }), ...(requestedData[mod.id] && { requestedData: requestedData[mod.id] }), }; } export function updateWithDefaultProps({ page, dynamicData, requestedData, }) { return page.map((block) => { return processModule(block, dynamicData, requestedData); }); } export function updateModuleProps(module, dynamicData = {}, requestedData = {}, includeChildren = false) { return processModule(module, dynamicData, requestedData, includeChildren); }