@wepublish/api
Version:
API core for we.publish.
187 lines • 8.92 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseRichTextNodes = exports.parseRichTextNode = exports.createRichTextError = exports.GraphQLRichText = exports.TableCellNodeFields = exports.LinkNodeFields = exports.ElementNodeFields = exports.TextNodeFields = exports.ElementNodeType = void 0;
const graphql_1 = require("graphql");
const ramda_1 = require("ramda");
var ElementNodeType;
(function (ElementNodeType) {
ElementNodeType["H1"] = "heading-one";
ElementNodeType["H2"] = "heading-two";
ElementNodeType["H3"] = "heading-three";
ElementNodeType["Paragraph"] = "paragraph";
ElementNodeType["UnorderedList"] = "unordered-list";
ElementNodeType["OrderedList"] = "ordered-list";
ElementNodeType["ListItem"] = "list-item";
ElementNodeType["Link"] = "link";
ElementNodeType["Table"] = "table";
ElementNodeType["TableRow"] = "table-row";
ElementNodeType["TableCell"] = "table-cell";
})(ElementNodeType || (exports.ElementNodeType = ElementNodeType = {}));
var TextNodeFields;
(function (TextNodeFields) {
TextNodeFields["Text"] = "text";
TextNodeFields["Bold"] = "bold";
TextNodeFields["Italic"] = "italic";
TextNodeFields["Underline"] = "underline";
TextNodeFields["Strikethrough"] = "strikethrough";
TextNodeFields["Superscript"] = "superscript";
TextNodeFields["Subscript"] = "subscript";
})(TextNodeFields || (exports.TextNodeFields = TextNodeFields = {}));
var ElementNodeFields;
(function (ElementNodeFields) {
ElementNodeFields["Type"] = "type";
ElementNodeFields["Children"] = "children";
})(ElementNodeFields || (exports.ElementNodeFields = ElementNodeFields = {}));
var LinkNodeFields;
(function (LinkNodeFields) {
LinkNodeFields["URL"] = "url";
LinkNodeFields["Title"] = "title";
})(LinkNodeFields || (exports.LinkNodeFields = LinkNodeFields = {}));
var TableCellNodeFields;
(function (TableCellNodeFields) {
TableCellNodeFields["Bordercolor"] = "borderColor";
})(TableCellNodeFields || (exports.TableCellNodeFields = TableCellNodeFields = {}));
exports.GraphQLRichText = new graphql_1.GraphQLScalarType({
name: 'RichText',
serialize(value) {
return value;
},
parseValue(value) {
return parseRichTextNodes(value);
},
parseLiteral(literal) {
return parseRichTextNodes((0, graphql_1.valueFromASTUntyped)(literal));
}
});
function createRichTextError(message, path) {
return new Error(path.length > 0 ? `Error at path "${path.join('.')}": ${message}` : message);
}
exports.createRichTextError = createRichTextError;
const TextNodeFieldsArr = Object.values(TextNodeFields);
const ElmentNodeFieldsArr = Object.values(ElementNodeFields);
const LinkNodeFieldsArr = [
...Object.values(ElementNodeFields),
...Object.values(LinkNodeFields)
];
const TableCellNodeFieldsArr = [
...Object.values(ElementNodeFields),
...Object.values(TableCellNodeFields)
];
const ElementNodeTypeArr = Object.values(ElementNodeType);
function parseRichTextNode(value, path = []) {
if (!(0, ramda_1.is)(Object, value)) {
throw createRichTextError(`Expected object, found ${value}.`, path);
}
const isTextNode = value.text != undefined;
const isElementNode = value.children != undefined;
if (isTextNode && isElementNode) {
throw createRichTextError(`Field "text" and "children" are mutually exclusive.`, path);
}
if (isTextNode) {
for (const field of Object.keys(value)) {
if (!TextNodeFieldsArr.includes(field)) {
throw createRichTextError(`Unknown TextNode field "${field}".`, path);
}
}
if (!(0, ramda_1.is)(String, value.text)) {
throw createRichTextError(`Expected string found ${value.text}`, [...path, 'text']);
}
if (value.bold != undefined && !(0, ramda_1.is)(Boolean, value.bold)) {
throw createRichTextError(`Expected boolean found ${value.bold}`, [...path, 'bold']);
}
if (value.italic != undefined && !(0, ramda_1.is)(Boolean, value.italic)) {
throw createRichTextError(`Expected boolean found ${value.italic}`, [...path, 'italic']);
}
if (value.underline != undefined && !(0, ramda_1.is)(Boolean, value.underline)) {
throw createRichTextError(`Expected boolean found ${value.underline}`, [...path, 'underline']);
}
if (value.strikethrough != undefined && !(0, ramda_1.is)(Boolean, value.strikethrough)) {
throw createRichTextError(`Expected boolean found ${value.strikethrough}`, [
...path,
'strikethrough'
]);
}
if (value.superscript != undefined && !(0, ramda_1.is)(Boolean, value.superscript)) {
throw createRichTextError(`Expected boolean found ${value.superscript}`, [
...path,
'superscript'
]);
}
if (value.subscript != undefined && !(0, ramda_1.is)(Boolean, value.subscript)) {
throw createRichTextError(`Expected boolean found ${value.subscript}`, [...path, 'subscript']);
}
return Object.assign({ text: value.text }, value.bold != undefined ? { bold: value.bold } : {}, value.italic != undefined ? { italic: value.italic } : {}, value.underline != undefined ? { underline: value.underline } : {}, value.strikethrough != undefined ? { strikethrough: value.strikethrough } : {}, value.superscript != undefined ? { superscript: value.superscript } : {}, value.subscript != undefined ? { subscript: value.subscript } : {});
}
else {
const isLinkNode = value.type === ElementNodeType.Link;
const isTableCellNode = value.type === ElementNodeType.TableCell;
for (const field of Object.keys(value)) {
if (isLinkNode) {
if (!LinkNodeFieldsArr.includes(field)) {
throw createRichTextError(`Unknown LinkNode field "${field}".`, path);
}
}
else if (isTableCellNode) {
if (!TableCellNodeFieldsArr.includes(field)) {
throw createRichTextError(`Unknown TableCellNode field "${field}".`, path);
}
}
else {
if (!ElmentNodeFieldsArr.includes(field)) {
throw createRichTextError(`Unknown ElementNode field "${field}".`, path);
}
}
}
if (!Array.isArray(value.children)) {
throw createRichTextError(`Expected array found ${value.children}`, [...path, 'children']);
}
if (!(0, ramda_1.is)(String, value.type) || !ElementNodeTypeArr.includes(value.type)) {
throw createRichTextError(`Expected one of ${JSON.stringify(ElementNodeTypeArr)} found ${value.type}`, [...path, 'type']);
}
const type = value.type;
switch (type) {
case ElementNodeType.Link: {
if (!(0, ramda_1.is)(String, value.url)) {
// TODO: Check URL for malicious content.
throw createRichTextError(`Expected string found ${value.url}`, [...path, 'url']);
}
if (value.title != undefined && !(0, ramda_1.is)(String, value.title)) {
throw createRichTextError(`Expected string found ${value.title}`, [...path, 'title']);
}
return Object.assign({
type,
url: value.url,
children: parseRichTextNodes(value.children, [...path, 'children'])
}, value.title != undefined ? { title: value.title } : {});
}
case ElementNodeType.TableCell: {
if (!(0, ramda_1.is)(String, value.borderColor)) {
// TODO: Check URL for malicious content.
throw createRichTextError(`Expected string found ${value.borderColor}`, [
...path,
'borderColor'
]);
}
return {
type,
borderColor: value.borderColor,
children: parseRichTextNodes(value.children, [...path, 'children'])
};
}
default:
return {
type,
children: parseRichTextNodes(value.children, [...path, 'children'])
};
}
}
}
exports.parseRichTextNode = parseRichTextNode;
function parseRichTextNodes(value, path = []) {
if (!Array.isArray(value)) {
throw createRichTextError(`Expected array, found ${typeof value}.`, path);
}
return value.map((value, index) => parseRichTextNode(value, [...path, index.toString()]));
}
exports.parseRichTextNodes = parseRichTextNodes;
//# sourceMappingURL=richtext-scalar.js.map