@nitrogenbuilder/client-react
Version:
Nitrogen Builder React Client
207 lines (206 loc) • 9.05 kB
JavaScript
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
import { nitrogen } from '@nitrogenbuilder/client-core';
import { getDefault } from './utils/getDefault.js';
import { resolve } from './utils/resolve.js';
import { set } from './utils/set.js';
function renderChildren(mod, dynamicData = {}, requestedData = {}) {
if (!mod.props.children)
return undefined;
if (Array.isArray(mod.props.children)) {
return mod.props.children.flatMap((child) => {
return renderModule(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].flatMap((child) => {
return renderModule(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 renderModule(mod, dynamicData = {}, requestedData = {}) {
const Component = nitrogen.getModuleComponent(typeof mod.module === 'object' ? mod.module.name : mod.module);
if (!Component) {
console.groupCollapsed('NitrogenRenderer/renderModule/Component');
console.warn('Component not found for module. Possibly removed or renamed.', mod);
console.groupEnd();
return null;
}
const module = typeof mod.module === 'object'
? mod.module
: nitrogen.getModule(mod.module);
const hasSlots = typeof mod.props?.children === 'object' &&
!Array.isArray(mod.props?.children);
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]);
}
}
}
return (_jsx(Component, { id: mod.id, ...spreadProps, requestedData: requestedData[mod.id] ?? undefined, ...(hasSlots && {
slots: renderChildren(mod, dynamicData, requestedData),
}), children: hasSlots ? null : renderChildren(mod, dynamicData, requestedData) }, mod.id));
}
export default function NitrogenRenderer({ page, dynamicData, requestedData, }) {
return (_jsx(_Fragment, { children: page.map((block) => {
return renderModule(block, dynamicData, requestedData);
}) }));
}