From abfc9d5331ab1baa753b7c47ed76afe02dd93f20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20Ku=CC=88hn?= Date: Fri, 16 Nov 2018 14:12:25 +0100 Subject: [PATCH] improved error handling for invalid content --- .eslintrc.js | 3 +++ packages/tiptap/src/Editor.js | 20 +++++++++++------- packages/tiptap/test/Editor.spec.js | 32 +++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 816569dc..c9f110ac 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -32,6 +32,9 @@ module.exports = { // required semicolons 'semi': ['error', 'never'], + // error handling + 'no-console': ['error', { allow: ['warn', 'error'] }], + // indent 'no-tabs': 'off', 'indent': 'off', diff --git a/packages/tiptap/src/Editor.js b/packages/tiptap/src/Editor.js index 57f06e32..39741aaa 100644 --- a/packages/tiptap/src/Editor.js +++ b/packages/tiptap/src/Editor.js @@ -40,6 +40,12 @@ export default class Editor { editable: true, extensions: [], content: '', + emptyDocument: { + type: 'doc', + content: [{ + type: 'paragraph', + }], + }, onInit: () => {}, onUpdate: () => {}, onFocus: () => {}, @@ -125,7 +131,12 @@ export default class Editor { createDocument(content) { if (typeof content === 'object') { - return this.schema.nodeFromJSON(content) + try { + return this.schema.nodeFromJSON(content) + } catch (error) { + console.warn('[tiptap warn]: Invalid content.', 'Passed value:', content, 'Error:', error) + return this.schema.nodeFromJSON(this.options.emptyDocument) + } } if (typeof content === 'string') { @@ -263,12 +274,7 @@ export default class Editor { } clearContent(emitUpdate = false) { - this.setContent({ - type: 'doc', - content: [{ - type: 'paragraph', - }], - }, emitUpdate) + this.setContent(this.options.emptyDocument, emitUpdate) } setActiveNodesAndMarks() { diff --git a/packages/tiptap/test/Editor.spec.js b/packages/tiptap/test/Editor.spec.js index 7504f25b..ec9a4c84 100644 --- a/packages/tiptap/test/Editor.spec.js +++ b/packages/tiptap/test/Editor.spec.js @@ -25,6 +25,38 @@ test('create editor', () => { expect(editor).toBeDefined() }) +test('check invalid content (JSON)', () => { + const editor = new Editor({ + content: { thisIsNotAValidDocument: true }, + }) + + expect(editor.getHTML()).toEqual('

') +}) + +test('check invalid content (HTML)', () => { + const editor = new Editor({ + content: '', + }) + + expect(editor.getHTML()).toEqual('

') +}) + +test('check invalid content (unsupported format: Function)', () => { + const editor = new Editor({ + content: () => false, + }) + + expect(editor.getHTML()).toEqual('

') +}) + +test('check invalid content (unsupported format: Array)', () => { + const editor = new Editor({ + content: [], + }) + + expect(editor.getHTML()).toEqual('

') +}) + test('set HTML, get HTML', () => { const content = '

Lorem ipsum dolor sit amet.

'