@muban/muban
Version:
Writing components for server-rendered HTML
35 lines (34 loc) • 1.47 kB
JavaScript
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];
},
};
};
}