@condenast/flyway-schema-validator
Version:
A joi schema validator for flyways types
73 lines (62 loc) • 2.2 kB
JavaScript
const CopilotMarkdownSource = require('@condenast/atjson-source-copilot-markdown').default;
const VersoSource = require('@condenast/atjson-source-verso').default;
const CKEditorRenderer = require('@condenast/atjson-renderer-ckeditor').default;
const CKEditorSourceHTML = require('@condenast/atjson-source-ckeditor-html').default;
const Diff = require('diff');
function sentencesToLines(value) {
return value.split(/(\S.+?[.!?])(?=\s+|$)/).join('\n');
}
function annotationsToJson({ annotations, content }) {
return `${JSON.stringify(
annotations.map(annotation => {
const { type, start, end, attributes } = annotation.toJSON();
return { type, start, end, content: content.slice(start, end), attributes };
}),
null,
2
)}\n`;
}
function getDiff(lhsDoc, rhsDoc) {
const canonicalLeftHandSideDoc = lhsDoc.canonical();
const canonicalRightHandSideDoc = rhsDoc.canonical();
const isContentEqual = canonicalLeftHandSideDoc.content === canonicalRightHandSideDoc.content;
let content;
if (!isContentEqual) {
content = Diff.createPatch(
'content',
sentencesToLines(canonicalLeftHandSideDoc.content),
sentencesToLines(canonicalRightHandSideDoc.content),
'in',
'out'
);
}
const annotations = Diff.createPatch(
'annotations',
annotationsToJson(canonicalLeftHandSideDoc),
annotationsToJson(canonicalRightHandSideDoc),
'in',
'out',
{ context: 8 }
);
return content ? `${content}\n${annotations}` : annotations;
}
function isCKEditorCompatible(markdown) {
try {
const mdVersoDoc = CopilotMarkdownSource.fromRaw(markdown).convertTo(VersoSource);
const ckeditorData = CKEditorRenderer.render(mdVersoDoc);
const ckVersoDoc = CKEditorSourceHTML.fromRaw(ckeditorData).convertTo(VersoSource);
const result = mdVersoDoc.equals(ckVersoDoc);
if (result) {
return { result };
}
const diff = getDiff(mdVersoDoc, ckVersoDoc);
return { result, diff };
} catch (error) {
// errors might be thrown if Unknown annotations are encountered in
// the rendering process
return { result: false, error };
}
}
module.exports = {
isCKEditorCompatible
};