/* eslint-disable no-use-before-define */ import React from 'react'; function resolveToken(token, components) { const { type, children, tag, reactProps, ...props } = token; if (type === 'inline') { return resolveTokens(children, components); } if (!tag) { // no tag. render children or content return children; } let Component = components[tag] || tag; if (components[tag]) { // React component available for this // append reactProps to props object for (const prop in reactProps) { props[prop] = reactProps[prop]; } } if (type === 'heading' && components.heading) { // token is heading and Heading component is available Component = components.heading; props.level = Number(tag.slice(1)); } if (type.indexOf('container_') === 0 && components.container) { // token is container and Container component is available Component = components.container; for (const prop in reactProps) { props[prop] = reactProps[prop]; } props.type = type.replace('container_', ''); } if (type === 'image') { // Images can't have children return ; } return ( {typeof children === 'object' ? resolveTokens(children, components) : children} ); } function resolveTokens(tokens, components) { if (!tokens) return null; return tokens.map((token, key) => resolveToken(Object.assign({ key }, token), components)); } export default function renderer(tokens, components) { return resolveTokens(tokens, components); }