UNPKG

@muban/muban

Version:

Writing components for server-rendered HTML

35 lines (34 loc) 1.47 kB
import parseJson from 'json-parse-better-errors'; import { simpleMemo } from '../../utils/simple-memo'; const getJsonContent = simpleMemo((element) => { // get props json script tag // TODO: use ":scope >" to only select direct descendant const scriptElement = element.querySelector('script[type="application/json"]'); // only resolve if direct descendant const propContent = ((scriptElement === null || scriptElement === void 0 ? void 0 : scriptElement.parentElement) === element && (scriptElement === null || scriptElement === void 0 ? void 0 : scriptElement.textContent)) || ''; return ((propContent && (() => { try { return parseJson(propContent); } catch (error) { // eslint-disable-next-line no-console console.error('Malformed JSON props', error); return {}; } })()) || {}); }); export function createJsonScriptPropertySource() { return () => { return { sourceName: 'json', hasProp: (propInfo) => Boolean(propInfo.source.target && propInfo.source.name in getJsonContent(propInfo.source.target)), getProp: (propInfo) => { // TODO: convert to Date - all other data types should be fine in JSON already return getJsonContent(propInfo.source.target)[propInfo.source.name]; }, }; }; }