diff --git a/src/plugins/core.js b/src/plugins/core.js index c1c1ec93c..b3109f985 100644 --- a/src/plugins/core.js +++ b/src/plugins/core.js @@ -1,7 +1,9 @@ import Base64 from '../serializers/base-64' import Content from '../components/content' +import Block from '../models/block' import Character from '../models/character' +import Inline from '../models/inline' import Debug from 'debug' import getPoint from '../utils/get-point' import Placeholder from '../components/placeholder' @@ -381,11 +383,20 @@ function Plugin(options = {}) { if (isInternal) transform.delete() - return transform - .select(target) - .insertBlock(node) - .removeNodeByKey(node.key) - .apply() + if (Block.isBlock(node)) { + return transform + .select(target) + .insertBlock(node) + .removeNodeByKey(node.key) + .apply() + } + if (Inline.isInline(node)) { + return transform + .select(target) + .insertInline(node) + .removeNodeByKey(node.key) + .apply() + } } /** diff --git a/src/utils/normalize.js b/src/utils/normalize.js index 89d16dab8..83b5a07a0 100644 --- a/src/utils/normalize.js +++ b/src/utils/normalize.js @@ -18,12 +18,20 @@ import typeOf from 'type-of' function block(value) { if (Block.isBlock(value)) return value + if ( + Inline.isInline(value) || + Mark.isMark(value) || + Text.isText(value) || + Selection.isSelection(value) + ) { + throw new Error(`Invalid \`block\` argument! It must be a block, an object, or a string. You passed: "${value}".`) + } + switch (typeOf(value)) { case 'string': case 'object': return Block.create(nodeProperties(value)) - default: throw new Error(`Invalid \`block\` argument! It must be a block, an object, or a string. You passed: "${value}".`) } @@ -38,12 +46,19 @@ function block(value) { function inline(value) { if (Inline.isInline(value)) return value + if ( + Block.isBlock(value) || + Mark.isMark(value) || + Text.isText(value) || + Selection.isSelection(value) + ) { + throw new Error(`Invalid \`inline\` argument! It must be an inline, an object, or a string. You passed: "${value}".`) + } switch (typeOf(value)) { case 'string': case 'object': return Inline.create(nodeProperties(value)) - default: throw new Error(`Invalid \`inline\` argument! It must be an inline, an object, or a string. You passed: "${value}".`) } @@ -60,10 +75,14 @@ function key(value) { if (typeOf(value) == 'string') return value warn('An object was passed to a Node method instead of a `key` string. This was previously supported, but is being deprecated because it can have a negative impact on performance. The object in question was:', value) - if (Block.isBlock(value)) return value.key - if (Document.isDocument(value)) return value.key - if (Inline.isInline(value)) return value.key - if (Text.isText(value)) return value.key + if ( + Block.isBlock(value) || + Document.isDocument(value) || + Inline.isInline(value) || + Text.isText(value) + ) { + return value.key + } throw new Error(`Invalid \`key\` argument! It must be either a block, an inline, a text, or a string. You passed: "${value}".`) } @@ -77,12 +96,19 @@ function key(value) { function mark(value) { if (Mark.isMark(value)) return value + if ( + Block.isBlock(value) || + Inline.isInline(value) || + Text.isText(value) || + Selection.isSelection(value) + ) { + throw new Error(`Invalid \`mark\` argument! It must be a mark, an object, or a string. You passed: "${value}".`) + } switch (typeOf(value)) { case 'string': case 'object': return Mark.create(markProperties(value)) - default: throw new Error(`Invalid \`mark\` argument! It must be a mark, an object, or a string. You passed: "${value}".`) } @@ -107,6 +133,8 @@ function markProperties(value = {}) { for (const k in value) { if (k == 'data') { if (value[k] !== undefined) ret[k] = Data.create(value[k]) + } else if (k.startsWith('@@__SLATE')) { + return } else { ret[k] = value[k] } @@ -140,6 +168,8 @@ function nodeProperties(value = {}) { for (const k in value) { if (k == 'data') { if (value[k] !== undefined) ret[k] = Data.create(value[k]) + } else if (k.startsWith('@@__SLATE')) { + return } else { ret[k] = value[k] } @@ -162,11 +192,18 @@ function nodeProperties(value = {}) { function selection(value) { if (Selection.isSelection(value)) return value + if ( + Mark.isMark(value) || + Block.isBlock(value) || + Inline.isInline(value) || + Text.isText(value) + ) { + throw new Error(`Invalid \`selection\` argument! It must be a selection or an object. You passed: "${value}".`)`` + } switch (typeOf(value)) { case 'object': return Selection.create(value) - default: throw new Error(`Invalid \`selection\` argument! It must be a selection or an object. You passed: "${value}".`) } @@ -192,7 +229,6 @@ function selectionProperties(value = {}) { if (value.isFocused !== undefined) ret.isFocused = !!value.isFocused if (value.marks !== undefined) ret.marks = value.marks break - default: throw new Error(`Invalid selection \`properties\` argument! It must be an object or a selection. You passed: "${value}".`) }