datocms-structured-text-to-html-string
Version:
Convert DatoCMS Structured Text field to HTML string
133 lines • 8.06 kB
JavaScript
var __spreadArrays = (this && this.__spreadArrays) || function () {
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
for (var r = Array(s), k = 0, i = 0; i < il; i++)
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
r[k] = a[j];
return r;
};
import { defaultMetaTransformer, render as genericHtmlRender, renderMarkRule, renderNodeRule, } from 'datocms-structured-text-generic-html-renderer';
import { isBlock, isInlineBlock, isInlineItem, isItemLink, isStructuredText, RenderError, } from 'datocms-structured-text-utils';
import vhtml from 'vhtml';
export { renderNodeRule, renderMarkRule, RenderError };
// deprecated export
export { renderNodeRule as renderRule };
var vhtmlAdapter = function (tagName, attrs) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
var children = [];
for (
// eslint-disable-next-line @typescript-eslint/no-explicit-any
var _i = 2;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
_i < arguments.length;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
_i++) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
children[_i - 2] = arguments[_i];
}
if (attrs) {
delete attrs.key;
}
return vhtml.apply(void 0, __spreadArrays([tagName, attrs], children));
};
export var defaultAdapter = {
renderNode: vhtmlAdapter,
renderFragment: function (children) {
return vhtmlAdapter(null, null, children);
},
renderText: function (text) { return text; },
};
export function render(
/** The actual field value you get from DatoCMS **/
structuredTextOrNode,
/** Additional render settings **/
settings) {
var renderInlineRecord = settings === null || settings === void 0 ? void 0 : settings.renderInlineRecord;
var renderLinkToRecord = settings === null || settings === void 0 ? void 0 : settings.renderLinkToRecord;
var renderBlock = settings === null || settings === void 0 ? void 0 : settings.renderBlock;
var renderInlineBlock = settings === null || settings === void 0 ? void 0 : settings.renderInlineBlock;
var customRules = (settings === null || settings === void 0 ? void 0 : settings.customNodeRules) || (settings === null || settings === void 0 ? void 0 : settings.customRules) || [];
var result = genericHtmlRender(structuredTextOrNode, {
adapter: {
renderText: (settings === null || settings === void 0 ? void 0 : settings.renderText) || defaultAdapter.renderText,
renderNode: (settings === null || settings === void 0 ? void 0 : settings.renderNode) || defaultAdapter.renderNode,
renderFragment: (settings === null || settings === void 0 ? void 0 : settings.renderFragment) || defaultAdapter.renderFragment,
},
customMarkRules: settings === null || settings === void 0 ? void 0 : settings.customMarkRules,
metaTransformer: settings === null || settings === void 0 ? void 0 : settings.metaTransformer,
customNodeRules: __spreadArrays(customRules, [
renderNodeRule(isInlineItem, function (_a) {
var node = _a.node, adapter = _a.adapter;
if (!renderInlineRecord) {
throw new RenderError("The Structured Text document contains an 'inlineItem' node, but no 'renderInlineRecord' option is specified!", node);
}
if (!isStructuredText(structuredTextOrNode) ||
!structuredTextOrNode.links) {
throw new RenderError("The document contains an 'inlineItem' node, but the passed value is not a Structured Text GraphQL response, or .links is not present!", node);
}
var item = structuredTextOrNode.links.find(function (item) { return item.id === node.item; });
if (!item) {
throw new RenderError("The Structured Text document contains an 'inlineItem' node, but cannot find a record with ID " + node.item + " inside .links!", node);
}
return renderInlineRecord({ record: item, adapter: adapter });
}),
renderNodeRule(isItemLink, function (_a) {
var node = _a.node, children = _a.children, adapter = _a.adapter;
if (!renderLinkToRecord) {
throw new RenderError("The Structured Text document contains an 'itemLink' node, but no 'renderLinkToRecord' option is specified!", node);
}
if (!isStructuredText(structuredTextOrNode) ||
!structuredTextOrNode.links) {
throw new RenderError("The document contains an 'itemLink' node, but the passed value is not a Structured Text GraphQL response, or .links is not present!", node);
}
var item = structuredTextOrNode.links.find(function (item) { return item.id === node.item; });
if (!item) {
throw new RenderError("The Structured Text document contains an 'itemLink' node, but cannot find a record with ID " + node.item + " inside .links!", node);
}
return renderLinkToRecord({
record: item,
adapter: adapter,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
children: children,
transformedMeta: node.meta
? ((settings === null || settings === void 0 ? void 0 : settings.metaTransformer) || defaultMetaTransformer)({
node: node,
meta: node.meta,
})
: null,
});
}),
renderNodeRule(isBlock, function (_a) {
var node = _a.node, adapter = _a.adapter;
if (!renderBlock) {
throw new RenderError("The Structured Text document contains a 'block' node, but no 'renderBlock' option is specified!", node);
}
if (!isStructuredText(structuredTextOrNode) ||
!structuredTextOrNode.blocks) {
throw new RenderError("The document contains a 'block' node, but the passed value is not a Structured Text GraphQL response, or .blocks is not present!", node);
}
var item = structuredTextOrNode.blocks.find(function (item) { return item.id === node.item; });
if (!item) {
throw new RenderError("The Structured Text document contains a 'block' node, but cannot find a record with ID " + node.item + " inside .blocks!", node);
}
return renderBlock({ record: item, adapter: adapter });
}),
renderNodeRule(isInlineBlock, function (_a) {
var node = _a.node, adapter = _a.adapter;
if (!renderInlineBlock) {
throw new RenderError("The Structured Text document contains an 'inlineBlock' node, but no 'renderInlineBlock' option is specified!", node);
}
if (!isStructuredText(structuredTextOrNode) ||
!structuredTextOrNode.inlineBlocks) {
throw new RenderError("The document contains an 'inlineBlock' node, but the passed value is not a Structured Text GraphQL response, or .inlineBlocks is not present!", node);
}
var item = structuredTextOrNode.inlineBlocks.find(function (item) { return item.id === node.item; });
if (!item) {
throw new RenderError("The Structured Text document contains an 'inlineBlock' node, but cannot find a record with ID " + node.item + " inside .inlineBlocks!", node);
}
return renderInlineBlock({ record: item, adapter: adapter });
}),
]),
});
return result || null;
}
//# sourceMappingURL=index.js.map