From f6d3c8e32cdfa3cecfaee34f2718e74b656cf14a Mon Sep 17 00:00:00 2001 From: Ian Storm Taylor Date: Fri, 27 Oct 2017 14:42:06 -0700 Subject: [PATCH] Remove deprecations (#1317) * remove deprecations from slate core * remove deprecations from slate-html-serializer * remove deprecations from slate-hyperscript * remove deprecations from slate-plain-serializer * remove deprecations from slate-prop-types * remove deprecations from slate-simulator * remove deprecations from slate-react * fix linter, fix tests --- packages/slate-html-serializer/src/index.js | 14 +- packages/slate-hyperscript/src/index.js | 6 - packages/slate-plain-serializer/src/index.js | 6 - packages/slate-prop-types/src/index.js | 7 - packages/slate-react/src/components/editor.js | 90 +------- .../src/utils/get-event-transfer.js | 2 +- packages/slate-react/src/utils/offset-key.js | 6 +- .../src/utils/set-event-transfer.js | 2 +- packages/slate-simulator/src/index.js | 13 -- packages/slate/src/changes/on-selection.js | 69 +----- packages/slate/src/changes/on-value.js | 16 -- packages/slate/src/index.js | 6 - packages/slate/src/models/change.js | 77 +------ packages/slate/src/models/character.js | 10 - packages/slate/src/models/node.js | 215 ++---------------- packages/slate/src/models/range.js | 120 ---------- packages/slate/src/models/selection.js | 50 ---- packages/slate/src/models/state.js | 50 ---- packages/slate/src/models/text.js | 40 +--- packages/slate/src/models/value.js | 17 -- packages/slate/src/operations/apply.js | 31 +-- 21 files changed, 48 insertions(+), 799 deletions(-) delete mode 100644 packages/slate/src/models/selection.js delete mode 100644 packages/slate/src/models/state.js diff --git a/packages/slate-html-serializer/src/index.js b/packages/slate-html-serializer/src/index.js index b620da549..4d9dcf3d4 100644 --- a/packages/slate-html-serializer/src/index.js +++ b/packages/slate-html-serializer/src/index.js @@ -1,7 +1,6 @@ import React from 'react' import ReactDOMServer from 'react-dom/server' -import logger from 'slate-dev-logger' import typeOf from 'type-of' import { Node, Value } from 'slate' import { Record } from 'immutable' @@ -105,11 +104,6 @@ class Html { rules = [], } = options - if (options.defaultBlockType) { - logger.deprecate('0.23.0', 'The `options.defaultBlockType` argument of the `Html` serializer is deprecated, use `options.defaultBlock` instead.') - defaultBlock = options.defaultBlockType - } - defaultBlock = Node.createProperties(defaultBlock) this.rules = [ ...rules, TEXT_RULE ] @@ -127,13 +121,7 @@ class Html { */ deserialize = (html, options = {}) => { - let { toJSON = false } = options - - if (options.toRaw) { - logger.deprecate('0.23.0', 'The `options.toRaw` argument of the `Html` serializer is deprecated, use `options.toJSON` instead.') - toJSON = options.toRaw - } - + const { toJSON = false } = options const { defaultBlock, parseHtml } = this const fragment = parseHtml(html) const children = Array.from(fragment.childNodes) diff --git a/packages/slate-hyperscript/src/index.js b/packages/slate-hyperscript/src/index.js index bf0983132..c21bb7e13 100644 --- a/packages/slate-hyperscript/src/index.js +++ b/packages/slate-hyperscript/src/index.js @@ -1,7 +1,6 @@ import isEmpty from 'is-empty' import isPlainObject from 'is-plain-object' -import logger from 'slate-dev-logger' import { Block, @@ -75,11 +74,6 @@ const CREATORS = { return Range.create(attributes) }, - state(...args) { - logger.deprecate('slate-hyperscript@0.3.0', 'The `` tag has been renamed to ``.') - return CREATORS.value(...args) - }, - value(tagName, attributes, children) { const { data } = attributes const document = children.find(Document.isDocument) diff --git a/packages/slate-plain-serializer/src/index.js b/packages/slate-plain-serializer/src/index.js index 0451ce334..c608fef8b 100644 --- a/packages/slate-plain-serializer/src/index.js +++ b/packages/slate-plain-serializer/src/index.js @@ -1,5 +1,4 @@ -import logger from 'slate-dev-logger' import { Block, Mark, Node, Value } from 'slate' import { Set } from 'immutable' @@ -21,11 +20,6 @@ function deserialize(string, options = {}) { toJSON = false, } = options - if (options.toRaw) { - logger.deprecate('0.23.0', 'The `options.toRaw` argument of the `Plain` serializer is deprecated, use `options.toJSON` instead.') - toJSON = options.toRaw - } - if (Set.isSet(defaultMarks)) { defaultMarks = defaultMarks.toArray() } diff --git a/packages/slate-prop-types/src/index.js b/packages/slate-prop-types/src/index.js index 3af9d4ddb..2654f6c89 100644 --- a/packages/slate-prop-types/src/index.js +++ b/packages/slate-prop-types/src/index.js @@ -1,6 +1,4 @@ -import logger from 'slate-dev-logger' - import { Block, Change, @@ -77,11 +75,6 @@ const Types = { value: create('Value', v => Value.isValue(v)), text: create('Text', v => Text.isText(v)), texts: create('List', v => Text.isTextList(v)), - - state: create('State', (v) => { - logger.deprecate('slate-prop-types@0.3.0', 'The `state` prop type has been renamed to `value`.') - return Value.isValue(v) - }) } /** diff --git a/packages/slate-react/src/components/editor.js b/packages/slate-react/src/components/editor.js index 839d5ed3c..ae1a887d7 100644 --- a/packages/slate-react/src/components/editor.js +++ b/packages/slate-react/src/components/editor.js @@ -5,7 +5,7 @@ import React from 'react' import SlateTypes from 'slate-prop-types' import Types from 'prop-types' import logger from 'slate-dev-logger' -import { Schema, Stack, Value } from 'slate' +import { Schema, Stack } from 'slate' import EVENT_HANDLERS from '../constants/event-handlers' import PLUGINS_PROPS from '../constants/plugin-props' @@ -41,8 +41,6 @@ class Editor extends React.Component { className: Types.string, onChange: Types.func, placeholder: Types.any, - placeholderClassName: Types.string, - placeholderStyle: Types.object, plugins: Types.array, readOnly: Types.bool, role: Types.string, @@ -82,13 +80,6 @@ class Editor extends React.Component { this.tmp.updates = 0 this.tmp.resolves = 0 - let { value } = props - - if (!value && props.state) { - logger.deprecate('slate-react@0.9.0', 'The `props.state` prop has been renamed to `props.value`.') - value = props.state - } - // Resolve the plugins and create a stack and schema from them. const plugins = this.resolvePlugins(props.plugins, props.schema) const stack = Stack.create({ plugins }) @@ -98,10 +89,9 @@ class Editor extends React.Component { // Run `onChange` on the passed-in value because we need to ensure that it // is normalized, and queue the resulting change. - const change = value.change() + const change = props.value.change() stack.run('onChange', change, this) this.queueChange(change) - this.cacheValue(change.value) this.state.value = change.value // Create a bound event handler for each event. @@ -110,14 +100,6 @@ class Editor extends React.Component { this.onEvent(handler, ...args) } }) - - if (props.onDocumentChange) { - logger.deprecate('0.22.10', 'The `onDocumentChange` prop is deprecated because it led to confusing UX issues, see https://github.com/ianstormtaylor/slate/issues/614#issuecomment-327868679') - } - - if (props.onSelectionChange) { - logger.deprecate('0.22.10', 'The `onSelectionChange` prop is deprecated because it led to confusing UX issues, see https://github.com/ianstormtaylor/slate/issues/614#issuecomment-327868679') - } } /** @@ -128,13 +110,7 @@ class Editor extends React.Component { */ componentWillReceiveProps = (props) => { - let { value } = props - let { schema, stack } = this.state - - if (!value && props.state) { - logger.deprecate('slate-react@0.9.0', 'The `props.state` prop has been renamed to `props.value`.') - value = props.state - } + let { schema, stack } = this // Increment the updates counter as a baseline. this.tmp.updates++ @@ -153,16 +129,15 @@ class Editor extends React.Component { // If we've resolved a few times already, and it's exactly in line with // the updates, then warn the user that they may be doing something wrong. if (this.tmp.resolves > 5 && this.tmp.resolves == this.tmp.updates) { - logger.warn('A Slate is re-resolving its `plugins` or `schema` on each update, which leads to poor performance. This is often due to passing in a new `schema` or `plugins` prop with each render, by declaring them inline in your render function. Do not do this!') + logger.warn('A Slate is re-resolving `props.plugins` or `props.schema` on each update, which leads to poor performance. This is often due to passing in a new `schema` or `plugins` prop with each render by declaring them inline in your render function. Do not do this!') } } // Run `onChange` on the passed-in value because we need to ensure that it // is normalized, and queue the resulting change. - const change = value.change() + const change = props.value.change() stack.run('onChange', change, this) this.queueChange(change) - this.cacheValue(change.value) this.setState({ value: change.value }) } @@ -182,17 +157,6 @@ class Editor extends React.Component { this.flushChange() } - /** - * Cache a `value` object to be able to compare against it later. - * - * @param {Value} value - */ - - cacheValue = (value) => { - this.tmp.document = value.document - this.tmp.selection = value.selection - } - /** * Queue a `change` object, to be able to flush it later. This is required for * when a change needs to be applied to the value, but because of the React @@ -269,39 +233,6 @@ class Editor extends React.Component { return this.state.value } - /** - * Get the editor's current schema. - * - * @return {Schema} - */ - - getSchema = () => { - logger.deprecate('slate-react@0.9.0', 'The `editor.getSchema()` method has been deprecated, use the `editor.schema` property getter instead.') - return this.schema - } - - /** - * Get the editor's current stack. - * - * @return {Stack} - */ - - getStack = () => { - logger.deprecate('slate-react@0.9.0', 'The `editor.getStack()` method has been deprecated, use the `editor.stack` property getter instead.') - return this.stack - } - - /** - * Get the editor's current value. - * - * @return {Value} - */ - - getState = () => { - logger.deprecate('slate-react@0.9.0', 'The `editor.getState()` method has been deprecated, use the `editor.value` property getter instead.') - return this.value - } - /** * On event. * @@ -324,20 +255,11 @@ class Editor extends React.Component { onChange = (change) => { debug('onChange', { change }) - if (Value.isValue(change)) { - throw new Error('As of slate@0.22.0 the `editor.onChange` method must be passed a `Change` object not a `Value` object.') - } - this.stack.run('onChange', change, this) - const { value } = change - const { document, selection } = this.tmp - const { onChange, onDocumentChange, onSelectionChange } = this.props + const { onChange } = this.props if (value == this.value) return - onChange(change) - if (onDocumentChange && value.document != document) onDocumentChange(value.document, change) - if (onSelectionChange && value.selection != selection) onSelectionChange(value.selection, change) } /** diff --git a/packages/slate-react/src/utils/get-event-transfer.js b/packages/slate-react/src/utils/get-event-transfer.js index c5ad9966c..81ddbbd0e 100644 --- a/packages/slate-react/src/utils/get-event-transfer.js +++ b/packages/slate-react/src/utils/get-event-transfer.js @@ -114,7 +114,7 @@ function getEmbeddedTypes(text) { try { return JSON.parse(text.substring(prefix.length)) } catch (err) { - throw new Error('Unable to parse custom embedded drag data') + throw new Error('Unable to parse custom Slate drag event data.') } } diff --git a/packages/slate-react/src/utils/offset-key.js b/packages/slate-react/src/utils/offset-key.js index 17934e64d..295fced7b 100644 --- a/packages/slate-react/src/utils/offset-key.js +++ b/packages/slate-react/src/utils/offset-key.js @@ -16,7 +16,11 @@ const PARSER = /^(\w+)(?::(\d+))?$/ function parse(string) { const matches = PARSER.exec(string) - if (!matches) throw new Error(`Invalid offset key string "${string}".`) + + if (!matches) { + throw new Error(`Invalid offset key string "${string}".`) + } + const [ original, key, index ] = matches // eslint-disable-line no-unused-vars return { key, diff --git a/packages/slate-react/src/utils/set-event-transfer.js b/packages/slate-react/src/utils/set-event-transfer.js index 8bb4b6408..b5f6cf42d 100644 --- a/packages/slate-react/src/utils/set-event-transfer.js +++ b/packages/slate-react/src/utils/set-event-transfer.js @@ -24,7 +24,7 @@ function setEventTransfer(event, type, content) { const mime = TRANSFER_TYPES[type.toUpperCase()] if (!mime) { - throw new Error(`Cannot set unknown transfer type "${mime}"`) + throw new Error(`Cannot set unknown transfer type "${mime}".`) } if (event.nativeEvent) { diff --git a/packages/slate-simulator/src/index.js b/packages/slate-simulator/src/index.js index 4285c4c52..5f9bb38b8 100644 --- a/packages/slate-simulator/src/index.js +++ b/packages/slate-simulator/src/index.js @@ -1,5 +1,4 @@ -import logger from 'slate-dev-logger' import { Stack } from 'slate' /** @@ -40,18 +39,6 @@ class Simulator { this.props = props this.stack = stack this.value = value - - if (props.state) { - logger.deprecate('slate-simulator@0.3.0', 'The `state` prop has been renamed to `value`.') - this.value = props.state - } - - Object.defineProperty(this, 'state', { - get() { - logger.deprecate('slate-simulator@0.3.0', 'The `simulator.state` property has been renamed to `simulator.value`.') - return this.value - } - }) } } diff --git a/packages/slate/src/changes/on-selection.js b/packages/slate/src/changes/on-selection.js index 9cf21f98c..3cb0a24c7 100644 --- a/packages/slate/src/changes/on-selection.js +++ b/packages/slate/src/changes/on-selection.js @@ -1,6 +1,5 @@ import isEmpty from 'is-empty' -import logger from 'slate-dev-logger' import pick from 'lodash/pick' import Range from '../models/range' @@ -324,7 +323,7 @@ const PROXY_TRANSFORMS = [ 'moveStart', 'moveStartOffsetTo', 'moveStartTo', - // 'moveTo', Commented out for now, since it conflicts with a deprecated one. + 'moveTo', 'moveToEnd', 'moveToEndOf', 'moveToRangeOf', @@ -411,72 +410,6 @@ PREFIXES.forEach((prefix) => { }) }) -/** - * Set `properties` on the selection. - * - * @param {Mixed} ...args - * @param {Change} change - */ - -Changes.moveTo = (change, properties) => { - logger.deprecate('0.17.0', 'The `moveTo()` change is deprecated, please use `select()` instead.') - change.select(properties) -} - -/** - * Unset the selection's marks. - * - * @param {Change} change - */ - -Changes.unsetMarks = (change) => { - logger.deprecate('0.17.0', 'The `unsetMarks()` change is deprecated.') - change.select({ marks: null }) -} - -/** - * Unset the selection, removing an association to a node. - * - * @param {Change} change - */ - -Changes.unsetSelection = (change) => { - logger.deprecate('0.17.0', 'The `unsetSelection()` change is deprecated, please use `deselect()` instead.') - change.select({ - anchorKey: null, - anchorOffset: 0, - focusKey: null, - focusOffset: 0, - isFocused: false, - isBackward: false - }) -} - -/** - * Mix in deprecated changes with a warning. - */ - -const DEPRECATED_TRANSFORMS = [ - ['extendBackward', 'extend', 'The `extendBackward(n)` change is deprecated, please use `extend(n)` instead with a negative offset.'], - ['extendForward', 'extend', 'The `extendForward(n)` change is deprecated, please use `extend(n)` instead.'], - ['moveBackward', 'move', 'The `moveBackward(n)` change is deprecated, please use `move(n)` instead with a negative offset.'], - ['moveForward', 'move', 'The `moveForward(n)` change is deprecated, please use `move(n)` instead.'], - ['moveStartOffset', 'moveStart', 'The `moveStartOffset(n)` change is deprecated, please use `moveStart(n)` instead.'], - ['moveEndOffset', 'moveEnd', 'The `moveEndOffset(n)` change is deprecated, please use `moveEnd()` instead.'], - ['moveToOffsets', 'moveOffsetsTo', 'The `moveToOffsets()` change is deprecated, please use `moveOffsetsTo()` instead.'], - ['flipSelection', 'flip', 'The `flipSelection()` change is deprecated, please use `flip()` instead.'], -] - -DEPRECATED_TRANSFORMS.forEach(([ old, current, warning ]) => { - Changes[old] = (change, ...args) => { - logger.deprecate('0.17.0', warning) - const { value } = change - const { document, selection } = value - const sel = selection[current](...args).normalize(document) - change.select(sel) - } -}) - /** * Export. * diff --git a/packages/slate/src/changes/on-value.js b/packages/slate/src/changes/on-value.js index 8f6bc386f..456be8e44 100644 --- a/packages/slate/src/changes/on-value.js +++ b/packages/slate/src/changes/on-value.js @@ -1,6 +1,4 @@ -import logger from 'slate-dev-logger' - import Value from '../models/value' /** @@ -29,20 +27,6 @@ Changes.setValue = (change, properties) => { }) } -/** - * Deprecated. - */ - -Changes.setState = (change, ...args) => { - logger.deprecate('0.29.0', 'The `change.setState` method has been renamed to `change.setValue`.') - change.setValue(...args) -} - -Changes.setData = (change, data) => { - logger.deprecate('0.26.0', 'The `change.setData` method is deprecated, use `change.setValue` instead.') - change.setValue({ data }) -} - /** * Export. * diff --git a/packages/slate/src/index.js b/packages/slate/src/index.js index 271877139..1a30cbab6 100644 --- a/packages/slate/src/index.js +++ b/packages/slate/src/index.js @@ -12,9 +12,7 @@ import Node from './models/node' import Operations from './operations' import Range from './models/range' import Schema from './models/schema' -import Selection from './models/selection' import Stack from './models/stack' -import State from './models/state' import Text from './models/text' import Value from './models/value' import { resetKeyGenerator, setKeyGenerator } from './utils/generate-key' @@ -39,9 +37,7 @@ export { Operations, Range, Schema, - Selection, Stack, - State, Text, Value, resetKeyGenerator, @@ -62,9 +58,7 @@ export default { Operations, Range, Schema, - Selection, Stack, - State, Text, Value, resetKeyGenerator, diff --git a/packages/slate/src/models/change.js b/packages/slate/src/models/change.js index dd55c4bdc..c12ecc6a7 100644 --- a/packages/slate/src/models/change.js +++ b/packages/slate/src/models/change.js @@ -1,6 +1,5 @@ import Debug from 'debug' -import logger from 'slate-dev-logger' import pick from 'lodash/pick' import MODEL_TYPES from '../constants/model-types' @@ -42,13 +41,7 @@ class Change { */ constructor(attrs) { - let { value } = attrs - - if (!value && attrs.state) { - logger.deprecate('0.29.0', 'The `state` attribute to change objects has been renamed to `value`.') - value = attrs.state - } - + const { value } = attrs this.value = value this.operations = [] this.flags = pick(attrs, ['merge', 'save']) @@ -156,20 +149,6 @@ class Change { return this } - /** - * Deprecated. - */ - - get state() { - logger.deprecate('0.29.0', 'The `change.state` property has been renamed to `change.value`.') - return this.value - } - - apply(options = {}) { - logger.deprecate('0.22.0', 'The `change.apply()` method is deprecrated and no longer necessary, as all operations are applied immediately when invoked. You can access the change\'s value, which is already pre-computed, directly via `change.value` instead.') - return this.value - } - } /** @@ -190,60 +169,6 @@ Object.keys(Changes).forEach((type) => { } }) -/** - * Add deprecation warnings in case people try to access a change as a value. - */ - -;[ - 'hasUndos', - 'hasRedos', - 'isBlurred', - 'isFocused', - 'isCollapsed', - 'isExpanded', - 'isBackward', - 'isForward', - 'startKey', - 'endKey', - 'startOffset', - 'endOffset', - 'anchorKey', - 'focusKey', - 'anchorOffset', - 'focusOffset', - 'startBlock', - 'endBlock', - 'anchorBlock', - 'focusBlock', - 'startInline', - 'endInline', - 'anchorInline', - 'focusInline', - 'startText', - 'endText', - 'anchorText', - 'focusText', - 'characters', - 'marks', - 'blocks', - 'fragment', - 'inlines', - 'texts', - 'isEmpty', -].forEach((getter) => { - Object.defineProperty(Change.prototype, getter, { - get() { - logger.deprecate('0.22.0', `You attempted to access the \`${getter}\` property of what was previously a \`value\` object but is now a \`change\` object. This syntax has been deprecated as plugins are now passed \`change\` objects instead of \`value\` objects.`) - return this.value[getter] - } - }) -}) - -Change.prototype.transform = function () { - logger.deprecate('0.22.0', 'You attempted to call `.transform()` on what was previously a `value` object but is now already a `change` object. This syntax has been deprecated as plugins are now passed `change` objects instead of `value` objects.') - return this -} - /** * Export. * diff --git a/packages/slate/src/models/character.js b/packages/slate/src/models/character.js index c0b7d951e..6509c1d3b 100644 --- a/packages/slate/src/models/character.js +++ b/packages/slate/src/models/character.js @@ -1,6 +1,5 @@ import isPlainObject from 'is-plain-object' -import logger from 'slate-dev-logger' import { List, Record, Set } from 'immutable' import MODEL_TYPES from '../constants/model-types' @@ -120,15 +119,6 @@ class Character extends Record(DEFAULTS) { return List.isList(any) && any.every(item => Character.isCharacter(item)) } - /** - * Deprecated. - */ - - static createListFromText(string) { - logger.deprecate('0.22.0', 'The `Character.createListFromText(string)` method is deprecated, use `Character.createList(string)` instead.') - return this.createList(string) - } - /** * Get the kind. * diff --git a/packages/slate/src/models/node.js b/packages/slate/src/models/node.js index 9a1c20d2e..49d9c357f 100644 --- a/packages/slate/src/models/node.js +++ b/packages/slate/src/models/node.js @@ -1,7 +1,6 @@ import direction from 'direction' import isPlainObject from 'is-plain-object' -import logger from 'slate-dev-logger' import { List, OrderedSet, Set } from 'immutable' import Block from './block' @@ -163,8 +162,8 @@ class Node { */ areDescendantsSorted(first, second) { - first = normalizeKey(first) - second = normalizeKey(second) + first = assertKey(first) + second = assertKey(second) const keys = this.getKeysAsArray() const firstIndex = keys.indexOf(first) @@ -185,7 +184,7 @@ class Node { const child = this.getChild(key) if (!child) { - key = normalizeKey(key) + key = assertKey(key) throw new Error(`Could not find a child node with key "${key}".`) } @@ -203,7 +202,7 @@ class Node { const descendant = this.getDescendant(key) if (!descendant) { - key = normalizeKey(key) + key = assertKey(key) throw new Error(`Could not find a descendant node with key "${key}".`) } @@ -221,7 +220,7 @@ class Node { const node = this.getNode(key) if (!node) { - key = normalizeKey(key) + key = assertKey(key) throw new Error(`Could not find a node with key "${key}".`) } @@ -315,7 +314,7 @@ class Node { */ getAncestors(key) { - key = normalizeKey(key) + key = assertKey(key) if (key == this.key) return List() if (this.hasChild(key)) return List([this]) @@ -497,7 +496,7 @@ class Node { */ getChild(key) { - key = normalizeKey(key) + key = assertKey(key) return this.nodes.find(node => node.key == key) } @@ -510,7 +509,7 @@ class Node { */ getClosest(key, iterator) { - key = normalizeKey(key) + key = assertKey(key) const ancestors = this.getAncestors(key) if (!ancestors) { throw new Error(`Could not find a descendant node with key "${key}".`) @@ -562,8 +561,8 @@ class Node { */ getCommonAncestor(one, two) { - one = normalizeKey(one) - two = normalizeKey(two) + one = assertKey(one) + two = assertKey(two) if (one == this.key) return this if (two == this.key) return this @@ -622,7 +621,7 @@ class Node { */ getDescendant(key) { - key = normalizeKey(key) + key = assertKey(key) let descendantFound = null const found = this.nodes.find((node) => { @@ -751,7 +750,7 @@ class Node { getFurthest(key, iterator) { const ancestors = this.getAncestors(key) if (!ancestors) { - key = normalizeKey(key) + key = assertKey(key) throw new Error(`Could not find a descendant node with key "${key}".`) } @@ -789,7 +788,7 @@ class Node { */ getFurthestAncestor(key) { - key = normalizeKey(key) + key = assertKey(key) return this.nodes.find((node) => { if (node.key == key) return true if (node.kind == 'text') return false @@ -808,7 +807,7 @@ class Node { const ancestors = this.getAncestors(key) if (!ancestors) { - key = normalizeKey(key) + key = assertKey(key) throw new Error(`Could not find a descendant node with key "${key}".`) } @@ -1181,7 +1180,7 @@ class Node { */ getNextSibling(key) { - key = normalizeKey(key) + key = assertKey(key) const parent = this.getParent(key) const after = parent.nodes @@ -1201,7 +1200,7 @@ class Node { */ getNextText(key) { - key = normalizeKey(key) + key = assertKey(key) return this.getTexts() .skipUntil(text => text.key == key) .get(1) @@ -1215,7 +1214,7 @@ class Node { */ getNode(key) { - key = normalizeKey(key) + key = assertKey(key) return this.key == key ? this : this.getDescendant(key) } @@ -1362,7 +1361,7 @@ class Node { */ getPreviousSibling(key) { - key = normalizeKey(key) + key = assertKey(key) const parent = this.getParent(key) const before = parent.nodes .takeUntil(child => child.key == key) @@ -1382,7 +1381,7 @@ class Node { */ getPreviousText(key) { - key = normalizeKey(key) + key = assertKey(key) return this.getTexts() .takeUntil(text => text.key == key) .last() @@ -1789,7 +1788,7 @@ class Node { */ removeDescendant(key) { - key = normalizeKey(key) + key = assertKey(key) let node = this let parent = node.getParent(key) @@ -1892,181 +1891,18 @@ class Node { return schema.validateNode(this) } - /** - * True if the node has both descendants in that order, false otherwise. The - * order is depth-first, post-order. - * - * @param {String} first - * @param {String} second - * @return {Boolean} - */ - - areDescendantSorted(first, second) { - logger.deprecate('0.19.0', 'The Node.areDescendantSorted(first, second) method is deprecated, please use `Node.areDescendantsSorted(first, second) instead.') - return this.areDescendantsSorted(first, second) - } - - /** - * Concat children `nodes` on to the end of the node. - * - * @param {List} nodes - * @return {Node} - */ - - concatChildren(nodes) { - logger.deprecate('0.19.0', 'The `Node.concatChildren(nodes)` method is deprecated.') - nodes = this.nodes.concat(nodes) - return this.set('nodes', nodes) - } - - /** - * Decorate all of the text nodes with a `decorator` function. - * - * @param {Function} decorator - * @return {Node} - */ - - decorateTexts(decorator) { - logger.deprecate('0.19.0', 'The `Node.decorateTexts(decorator) method is deprecated.') - return this.mapDescendants((child) => { - return child.kind == 'text' - ? child.decorateCharacters(decorator) - : child - }) - } - - /** - * Recursively filter all descendant nodes with `iterator`, depth-first. - * It is different from `filterDescendants` in regard of the order of results. - * - * @param {Function} iterator - * @return {List} - */ - - filterDescendantsDeep(iterator) { - logger.deprecate('0.19.0', 'The Node.filterDescendantsDeep(iterator) method is deprecated.') - return this.nodes.reduce((matches, child, i, nodes) => { - if (child.kind != 'text') matches = matches.concat(child.filterDescendantsDeep(iterator)) - if (iterator(child, i, nodes)) matches = matches.push(child) - return matches - }, new List()) - } - - /** - * Recursively find all descendant nodes by `iterator`. Depth first. - * - * @param {Function} iterator - * @return {Node|Null} - */ - - findDescendantDeep(iterator) { - logger.deprecate('0.19.0', 'The Node.findDescendantDeep(iterator) method is deprecated.') - let found - - this.forEachDescendant((node) => { - if (iterator(node)) { - found = node - return false - } - }) - - return found - } - - /** - * Get children between two child keys. - * - * @param {String} start - * @param {String} end - * @return {Node} - */ - - getChildrenBetween(start, end) { - logger.deprecate('0.19.0', 'The `Node.getChildrenBetween(start, end)` method is deprecated.') - start = this.assertChild(start) - start = this.nodes.indexOf(start) - end = this.assertChild(end) - end = this.nodes.indexOf(end) - return this.nodes.slice(start + 1, end) - } - - /** - * Get children between two child keys, including the two children. - * - * @param {String} start - * @param {String} end - * @return {Node} - */ - - getChildrenBetweenIncluding(start, end) { - logger.deprecate('0.19.0', 'The `Node.getChildrenBetweenIncluding(start, end)` method is deprecated.') - start = this.assertChild(start) - start = this.nodes.indexOf(start) - end = this.assertChild(end) - end = this.nodes.indexOf(end) - return this.nodes.slice(start, end + 1) - } - - /** - * Get the highest child ancestor of a node by `key`. - * - * @param {String} key - * @return {Node|Null} - */ - - getHighestChild(key) { - logger.deprecate('0.19.0', 'The `Node.getHighestChild(key) method is deprecated, please use `Node.getFurthestAncestor(key) instead.') - return this.getFurthestAncestor(key) - } - - /** - * Get the highest parent of a node by `key` which has an only child. - * - * @param {String} key - * @return {Node|Null} - */ - - getHighestOnlyChildParent(key) { - logger.deprecate('0.19.0', 'The `Node.getHighestOnlyChildParent(key)` method is deprecated, please use `Node.getFurthestOnlyChildAncestor` instead.') - return this.getFurthestOnlyChildAncestor(key) - } - - /** - * Check if the inline nodes are split at a `range`. - * - * @param {Range} range - * @return {Boolean} - */ - - isInlineSplitAtRange(range) { - logger.deprecate('0.19.0', 'The `Node.isInlineSplitAtRange(range)` method is deprecated.') - range = range.normalize(this) - if (range.isExpanded) throw new Error() - - const { startKey } = range - const start = this.getFurthestInline(startKey) || this.getDescendant(startKey) - return range.isAtStartOf(start) || range.isAtEndOf(start) - } - } /** - * Normalize a key `arg`. + * Assert a key `arg`. * - * @param {String|Node} arg + * @param {String} arg * @return {String} */ -function normalizeKey(arg) { +function assertKey(arg) { if (typeof arg == 'string') return arg - - logger.deprecate('0.14.0', '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:', arg) - - if (Node.isNode(arg)) { - return arg.key - } - - throw new Error(`Invalid \`key\` argument! It must be either a block, an inline, a text, or a string. You passed: ${arg}`) + throw new Error(`Invalid \`key\` argument! It must be a key string, but you passed: ${arg}`) } /** @@ -2109,8 +1945,6 @@ memoize(Node.prototype, [ 'getCharactersAtRange', 'getCharactersAtRangeAsArray', 'getChild', - 'getChildrenBetween', - 'getChildrenBetweenIncluding', 'getClosestBlock', 'getClosestInline', 'getClosestVoid', @@ -2154,7 +1988,6 @@ memoize(Node.prototype, [ 'hasDescendant', 'hasNode', 'hasVoidParent', - 'isInlineSplitAtRange', 'validate', ], { takesArguments: true diff --git a/packages/slate/src/models/range.js b/packages/slate/src/models/range.js index c2c7aa644..5b6216545 100644 --- a/packages/slate/src/models/range.js +++ b/packages/slate/src/models/range.js @@ -761,126 +761,6 @@ class Range extends Record(DEFAULTS) { return this.toJSON() } - /** - * Unset the range. - * - * @return {Range} - */ - - unset() { - logger.deprecate('0.17.0', 'The `Range.unset` method is deprecated, please switch to using `Range.deselect` instead.') - return this.deselect() - } - - /** - * Move the range forward `n` characters. - * - * @param {Number} n (optional) - * @return {Range} - */ - - moveForward(n = 1) { - logger.deprecate('0.17.0', 'The `Range.moveForward(n)` method is deprecated, please switch to using `Range.move(n)` instead.') - return this.move(n) - } - - /** - * Move the range backward `n` characters. - * - * @param {Number} n (optional) - * @return {Range} - */ - - moveBackward(n = 1) { - logger.deprecate('0.17.0', 'The `Range.moveBackward(n)` method is deprecated, please switch to using `Range.move(-n)` (with a negative number) instead.') - return this.move(0 - n) - } - - /** - * Move the anchor offset `n` characters. - * - * @param {Number} n (optional) - * @return {Range} - */ - - moveAnchorOffset(n = 1) { - logger.deprecate('0.17.0', 'The `Range.moveAnchorOffset(n)` method is deprecated, please switch to using `Range.moveAnchor(n)` instead.') - return this.moveAnchor(n) - } - - /** - * Move the focus offset `n` characters. - * - * @param {Number} n (optional) - * @return {Range} - */ - - moveFocusOffset(n = 1) { - logger.deprecate('0.17.0', 'The `Range.moveFocusOffset(n)` method is deprecated, please switch to using `Range.moveFocus(n)` instead.') - return this.moveFocus(n) - } - - /** - * Move the start offset `n` characters. - * - * @param {Number} n (optional) - * @return {Range} - */ - - moveStartOffset(n = 1) { - logger.deprecate('0.17.0', 'The `Range.moveStartOffset(n)` method is deprecated, please switch to using `Range.moveStart(n)` instead.') - return this.moveStart(n) - } - - /** - * Move the focus offset `n` characters. - * - * @param {Number} n (optional) - * @return {Range} - */ - - moveEndOffset(n = 1) { - logger.deprecate('0.17.0', 'The `Range.moveEndOffset(n)` method is deprecated, please switch to using `Range.moveEnd(n)` instead.') - return this.moveEnd(n) - } - - /** - * Extend the focus point forward `n` characters. - * - * @param {Number} n (optional) - * @return {Range} - */ - - extendForward(n = 1) { - logger.deprecate('0.17.0', 'The `Range.extendForward(n)` method is deprecated, please switch to using `Range.extend(n)` instead.') - return this.extend(n) - } - - /** - * Extend the focus point backward `n` characters. - * - * @param {Number} n (optional) - * @return {Range} - */ - - extendBackward(n = 1) { - logger.deprecate('0.17.0', 'The `Range.extendBackward(n)` method is deprecated, please switch to using `Range.extend(-n)` (with a negative number) instead.') - return this.extend(0 - n) - } - - /** - * Move the range to `anchorOffset` and `focusOffset`. - * - * @param {Number} anchorOffset - * @param {Number} focusOffset (optional) - * @return {Range} - */ - - moveToOffsets(anchorOffset, focusOffset = anchorOffset) { - logger.deprecate('0.17.0', 'The `Range.moveToOffsets` method is deprecated, please switch to using `Range.moveOffsetsTo` instead.') - return this.moveOffsetsTo(anchorOffset, focusOffset) - } - } /** diff --git a/packages/slate/src/models/selection.js b/packages/slate/src/models/selection.js deleted file mode 100644 index f79c1118a..000000000 --- a/packages/slate/src/models/selection.js +++ /dev/null @@ -1,50 +0,0 @@ - -import logger from 'slate-dev-logger' - -import Range from './range' - -/** - * Deprecated. - */ - -const Selection = { - - create(...args) { - logger.deprecate('0.27.0', 'The `Selection` model has been renamed to `Range`.') - return Range.create(...args) - }, - - createList(...args) { - logger.deprecate('0.27.0', 'The `Selection` model has been renamed to `Range`.') - return Range.createList(...args) - }, - - createProperties(...args) { - logger.deprecate('0.27.0', 'The `Selection` model has been renamed to `Range`.') - return Range.createProperties(...args) - }, - - fromJSON(...args) { - logger.deprecate('0.27.0', 'The `Selection` model has been renamed to `Range`.') - return Range.fromJSON(...args) - }, - - fromJS(...args) { - logger.deprecate('0.27.0', 'The `Selection` model has been renamed to `Range`.') - return Range.fromJS(...args) - }, - - isSelection(...args) { - logger.deprecate('0.27.0', 'The `Selection` model has been renamed to `Range`.') - return Range.isRange(...args) - }, - -} - -/** - * Export. - * - * @type {Object} - */ - -export default Selection diff --git a/packages/slate/src/models/state.js b/packages/slate/src/models/state.js deleted file mode 100644 index cb4b2aef3..000000000 --- a/packages/slate/src/models/state.js +++ /dev/null @@ -1,50 +0,0 @@ - -import logger from 'slate-dev-logger' - -import Value from './value' - -/** - * Deprecated. - */ - -const State = { - - create(...args) { - logger.deprecate('0.29.0', 'The `State` model has been renamed to `Value`.') - return Value.create(...args) - }, - - createList(...args) { - logger.deprecate('0.29.0', 'The `State` model has been renamed to `Value`.') - return Value.createList(...args) - }, - - createProperties(...args) { - logger.deprecate('0.29.0', 'The `State` model has been renamed to `Value`.') - return Value.createProperties(...args) - }, - - fromJSON(...args) { - logger.deprecate('0.29.0', 'The `State` model has been renamed to `Value`.') - return Value.fromJSON(...args) - }, - - fromJS(...args) { - logger.deprecate('0.29.0', 'The `State` model has been renamed to `Value`.') - return Value.fromJS(...args) - }, - - isState(...args) { - logger.deprecate('0.29.0', 'The `State` model has been renamed to `Value`.') - return Value.isValue(...args) - }, - -} - -/** - * Export. - * - * @type {Object} - */ - -export default State diff --git a/packages/slate/src/models/text.js b/packages/slate/src/models/text.js index 533c2c476..178a6b078 100644 --- a/packages/slate/src/models/text.js +++ b/packages/slate/src/models/text.js @@ -1,6 +1,5 @@ import isPlainObject from 'is-plain-object' -import logger from 'slate-dev-logger' import { List, OrderedSet, Record, Set, is } from 'immutable' import Character from './character' @@ -85,21 +84,11 @@ class Text extends Record(DEFAULTS) { return object } - let { + const { leaves = [], key = generateKey(), } = object - if (object.ranges) { - logger.deprecate('0.27.0', 'Passing `object.ranges` to `Text.fromJSON` has been renamed to `object.leaves`.') - leaves = object.ranges - } - - if (object.text) { - logger.deprecate('0.23.0', 'Passing `object.text` to `Text.fromJSON` has been deprecated, please use `object.leaves` instead.') - leaves = [{ text: object.text }] - } - const characters = leaves .map(Leaf.fromJSON) .reduce((l, r) => l.concat(r.getCharacters()), new List()) @@ -140,24 +129,6 @@ class Text extends Record(DEFAULTS) { return List.isList(any) && any.every(item => Text.isText(item)) } - /** - * Deprecated. - */ - - static createFromString(string) { - logger.deprecate('0.22.0', 'The `Text.createFromString(string)` method is deprecated, use `Text.create(string)` instead.') - return Text.create(string) - } - - /** - * Deprecated. - */ - - static createFromRanges(ranges) { - logger.deprecate('0.22.0', 'The `Text.createFromRanges(ranges)` method is deprecated, use `Text.create(ranges)` instead.') - return Text.create(ranges) - } - /** * Get the node's kind. * @@ -516,15 +487,6 @@ class Text extends Record(DEFAULTS) { return schema.validateNode(this) } - /** - * Deprecated. - */ - - getRanges(...args) { - logger.deprecate('0.27.0', 'The `Text.getRanges()` method was renamed to `Text.getLeaves`.') - return this.getLeaves(...args) - } - } /** diff --git a/packages/slate/src/models/value.js b/packages/slate/src/models/value.js index 5effde0bd..d87358f44 100644 --- a/packages/slate/src/models/value.js +++ b/packages/slate/src/models/value.js @@ -1,6 +1,5 @@ import isPlainObject from 'is-plain-object' -import logger from 'slate-dev-logger' import { Record, Set, List, Map } from 'immutable' import MODEL_TYPES from '../constants/model-types' @@ -620,17 +619,6 @@ class Value extends Record(DEFAULTS) { return new Change({ ...attrs, value: this }) } - /** - * Deprecated. - * - * @return {Change} - */ - - transform(...args) { - logger.deprecate('0.22.0', 'The `value.transform()` method has been deprecated in favor of `value.change()`.') - return this.change(...args) - } - /** * Return a JSON representation of the value. * @@ -644,11 +632,6 @@ class Value extends Record(DEFAULTS) { document: this.document.toJSON(options), } - if ('preserveStateData' in options) { - logger.deprecate('0.26.0', 'The `preserveStateData` option to `value.toJSON` has been deprecated in favor of `options.preserveData`.') - options.preserveData = options.preserveStateData - } - if (options.preserveData) { object.data = this.data.toJSON() } diff --git a/packages/slate/src/operations/apply.js b/packages/slate/src/operations/apply.js index 29cd0a77f..3e3333eea 100644 --- a/packages/slate/src/operations/apply.js +++ b/packages/slate/src/operations/apply.js @@ -1,6 +1,5 @@ import Debug from 'debug' -import logger from 'slate-dev-logger' import Node from '../models/node' import Mark from '../models/mark' @@ -342,15 +341,9 @@ const APPLIERS = { let { document } = value let node = document.assertPath(path) - if ('nodes' in properties) { - logger.warn('Updating a Node\'s `nodes` property via `setNode()` is not allowed. Use the appropriate insertion and removal methods instead. The operation in question was:', operation) - delete properties.nodes - } - - if ('key' in properties) { - logger.warn('Updating a Node\'s `key` property via `setNode()` is not allowed. There should be no reason to do this. The operation in question was:', operation) - delete properties.key - } + // Delete properties that are not allowed to be updated. + delete properties.nodes + delete properties.key node = node.merge(properties) document = document.updateNode(node) @@ -405,20 +398,10 @@ const APPLIERS = { set_value(value, operation) { const { properties } = operation - if ('document' in properties) { - logger.warn('Updating `value.document` property via `setValue()` is not allowed. Use the appropriate document updating methods instead. The operation in question was:', operation) - delete properties.document - } - - if ('selection' in properties) { - logger.warn('Updating `value.selection` property via `setValue()` is not allowed. Use the appropriate selection updating methods instead. The operation in question was:', operation) - delete properties.selection - } - - if ('history' in properties) { - logger.warn('Updating `value.history` property via `setValue()` is not allowed. Use the appropriate history updating methods instead. The operation in question was:', operation) - delete properties.history - } + // Delete properties that are not allowed to be updated. + delete properties.document + delete properties.selection + delete properties.history value = value.merge(properties) return value