From e5789a42a49c0582345102c7c66125ba11968321 Mon Sep 17 00:00:00 2001 From: Hans Pagel Date: Tue, 26 Jan 2021 17:27:52 +0100 Subject: [PATCH] remove prosemirror-utils dependency --- packages/tiptap-commands/package.json | 1 - .../src/commands/toggleList.js | 2 +- packages/tiptap-extensions/package.json | 1 - packages/tiptap-extensions/src/nodes/Table.js | 2 +- .../src/plugins/Highlight.js | 2 +- packages/tiptap-utils/package.json | 3 +- packages/tiptap-utils/src/index.js | 13 +++++++- packages/tiptap-utils/src/utils/createCell.js | 7 ++++ .../tiptap-utils/src/utils/createTable.js | 33 +++++++++++++++++++ .../tiptap-utils/src/utils/equalNodeType.js | 3 ++ .../tiptap-utils/src/utils/findBlockNodes.js | 5 +++ .../tiptap-utils/src/utils/findChildren.js | 10 ++++++ .../tiptap-utils/src/utils/findParentNode.js | 5 +++ .../src/utils/findParentNodeClosestToPos.js | 15 +++++++++ .../src/utils/findSelectedNodeOfType.js | 16 +++++++++ packages/tiptap-utils/src/utils/flatten.js | 17 ++++++++++ .../src/utils/getTableNodeTypes.js | 20 +++++++++++ .../tiptap-utils/src/utils/isNodeSelection.js | 5 +++ .../tiptap-utils/src/utils/nodeIsActive.js | 6 ++-- yarn.lock | 5 --- 20 files changed, 154 insertions(+), 17 deletions(-) create mode 100644 packages/tiptap-utils/src/utils/createCell.js create mode 100644 packages/tiptap-utils/src/utils/createTable.js create mode 100644 packages/tiptap-utils/src/utils/equalNodeType.js create mode 100644 packages/tiptap-utils/src/utils/findBlockNodes.js create mode 100644 packages/tiptap-utils/src/utils/findChildren.js create mode 100644 packages/tiptap-utils/src/utils/findParentNode.js create mode 100644 packages/tiptap-utils/src/utils/findParentNodeClosestToPos.js create mode 100644 packages/tiptap-utils/src/utils/findSelectedNodeOfType.js create mode 100644 packages/tiptap-utils/src/utils/flatten.js create mode 100644 packages/tiptap-utils/src/utils/getTableNodeTypes.js create mode 100644 packages/tiptap-utils/src/utils/isNodeSelection.js diff --git a/packages/tiptap-commands/package.json b/packages/tiptap-commands/package.json index 5fb610b2..b161a7d4 100644 --- a/packages/tiptap-commands/package.json +++ b/packages/tiptap-commands/package.json @@ -26,7 +26,6 @@ "prosemirror-schema-list": "^1.1.4", "prosemirror-state": "^1.3.3", "prosemirror-tables": "^1.1.1", - "prosemirror-utils": "^0.9.6", "tiptap-utils": "^1.12.0" } } diff --git a/packages/tiptap-commands/src/commands/toggleList.js b/packages/tiptap-commands/src/commands/toggleList.js index a44e74fb..e6cbde7f 100644 --- a/packages/tiptap-commands/src/commands/toggleList.js +++ b/packages/tiptap-commands/src/commands/toggleList.js @@ -1,5 +1,5 @@ import { wrapInList, liftListItem } from 'prosemirror-schema-list' -import { findParentNode } from 'prosemirror-utils' +import { findParentNode } from 'tiptap-utils' function isList(node, schema) { return (node.type === schema.nodes.bullet_list diff --git a/packages/tiptap-extensions/package.json b/packages/tiptap-extensions/package.json index 31e53cac..8cffd0e4 100644 --- a/packages/tiptap-extensions/package.json +++ b/packages/tiptap-extensions/package.json @@ -28,7 +28,6 @@ "prosemirror-state": "^1.3.3", "prosemirror-tables": "^1.1.1", "prosemirror-transform": "^1.2.8", - "prosemirror-utils": "^0.9.6", "prosemirror-view": "^1.16.5", "tiptap": "^1.31.0", "tiptap-commands": "^1.16.0", diff --git a/packages/tiptap-extensions/src/nodes/Table.js b/packages/tiptap-extensions/src/nodes/Table.js index 78d28ebb..0839cd0d 100644 --- a/packages/tiptap-extensions/src/nodes/Table.js +++ b/packages/tiptap-extensions/src/nodes/Table.js @@ -18,7 +18,7 @@ import { setCellAttr, fixTables, } from 'prosemirror-tables' -import { createTable } from 'prosemirror-utils' +import { createTable } from 'tiptap-utils' import { TextSelection } from 'prosemirror-state' import TableNodes from './TableNodes' diff --git a/packages/tiptap-extensions/src/plugins/Highlight.js b/packages/tiptap-extensions/src/plugins/Highlight.js index 59449d6d..f66b0d02 100644 --- a/packages/tiptap-extensions/src/plugins/Highlight.js +++ b/packages/tiptap-extensions/src/plugins/Highlight.js @@ -1,6 +1,6 @@ import { Plugin, PluginKey } from 'tiptap' import { Decoration, DecorationSet } from 'prosemirror-view' -import { findBlockNodes } from 'prosemirror-utils' +import { findBlockNodes } from 'tiptap-utils' import low from 'lowlight/lib/core' function getDecorations({ doc, name }) { diff --git a/packages/tiptap-utils/package.json b/packages/tiptap-utils/package.json index 2f86c7f8..638ac5bc 100644 --- a/packages/tiptap-utils/package.json +++ b/packages/tiptap-utils/package.json @@ -22,7 +22,6 @@ "dependencies": { "prosemirror-model": "^1.13.1", "prosemirror-state": "^1.3.3", - "prosemirror-tables": "^1.1.1", - "prosemirror-utils": "^0.9.6" + "prosemirror-tables": "^1.1.1" } } diff --git a/packages/tiptap-utils/src/index.js b/packages/tiptap-utils/src/index.js index 4223f07e..94eff5b6 100644 --- a/packages/tiptap-utils/src/index.js +++ b/packages/tiptap-utils/src/index.js @@ -1,6 +1,17 @@ +export { default as createCell } from './utils/createCell' +export { default as createTable } from './utils/createTable' +export { default as equalNodeType } from './utils/equalNodeType' +export { default as findBlockNodes } from './utils/findBlockNodes' +export { default as findChildren } from './utils/findChildren' +export { default as findParentNode } from './utils/findParentNode' +export { default as findParentNodeClosestToPos } from './utils/findParentNodeClosestToPos' +export { default as findSelectedNodeOfType } from './utils/findSelectedNodeOfType' +export { default as flatten } from './utils/flatten' export { default as getMarkAttrs } from './utils/getMarkAttrs' -export { default as getNodeAttrs } from './utils/getNodeAttrs' export { default as getMarkRange } from './utils/getMarkRange' +export { default as getNodeAttrs } from './utils/getNodeAttrs' +export { default as getTableNodeTypes } from './utils/getTableNodeTypes' +export { default as isNodeSelection } from './utils/isNodeSelection' export { default as markIsActive } from './utils/markIsActive' export { default as nodeEqualsType } from './utils/nodeEqualsType' export { default as nodeIsActive } from './utils/nodeIsActive' diff --git a/packages/tiptap-utils/src/utils/createCell.js b/packages/tiptap-utils/src/utils/createCell.js new file mode 100644 index 00000000..a27123cd --- /dev/null +++ b/packages/tiptap-utils/src/utils/createCell.js @@ -0,0 +1,7 @@ +export default function createCell(cellType, cellContent) { + if (cellContent) { + return cellType.createChecked(null, cellContent) + } + + return cellType.createAndFill() +} diff --git a/packages/tiptap-utils/src/utils/createTable.js b/packages/tiptap-utils/src/utils/createTable.js new file mode 100644 index 00000000..63fbe26d --- /dev/null +++ b/packages/tiptap-utils/src/utils/createTable.js @@ -0,0 +1,33 @@ +import createCell from './createCell' +import getTableNodeTypes from './getTableNodeTypes' + +export default function createTable(schema, rowsCount, colsCount, withHeaderRow, cellContent) { + const types = getTableNodeTypes(schema) + + const headerCells = [] + const cells = [] + + for (let index = 0; index < colsCount; index += 1) { + const cell = createCell(types.cell, cellContent) + + if (cell) { + cells.push(cell) + } + + if (withHeaderRow) { + const headerCell = createCell(types.header_cell, cellContent) + + if (headerCell) { + headerCells.push(headerCell) + } + } + } + + const rows = [] + + for (let index = 0; index < rowsCount; index += 1) { + rows.push(types.row.createChecked(null, withHeaderRow && index === 0 ? headerCells : cells)) + } + + return types.table.createChecked(null, rows) +} diff --git a/packages/tiptap-utils/src/utils/equalNodeType.js b/packages/tiptap-utils/src/utils/equalNodeType.js new file mode 100644 index 00000000..948b77e8 --- /dev/null +++ b/packages/tiptap-utils/src/utils/equalNodeType.js @@ -0,0 +1,3 @@ +export default function equalNodeType(nodeType, node) { + return Array.isArray(nodeType) && (nodeType.indexOf(node.type) > -1 || node.type === nodeType) +} diff --git a/packages/tiptap-utils/src/utils/findBlockNodes.js b/packages/tiptap-utils/src/utils/findBlockNodes.js new file mode 100644 index 00000000..228ecf03 --- /dev/null +++ b/packages/tiptap-utils/src/utils/findBlockNodes.js @@ -0,0 +1,5 @@ +import findChildren from './findChildren' + +export default function findBlockNodes(node, descend) { + return findChildren(node, child => child.isBlock, descend) +} diff --git a/packages/tiptap-utils/src/utils/findChildren.js b/packages/tiptap-utils/src/utils/findChildren.js new file mode 100644 index 00000000..cc6282eb --- /dev/null +++ b/packages/tiptap-utils/src/utils/findChildren.js @@ -0,0 +1,10 @@ +import flatten from './flatten' + +export default function findChildren(node, predicate, descend) { + if (!node) { + throw new Error('Invalid "node" parameter') + } else if (!predicate) { + throw new Error('Invalid "predicate" parameter') + } + return flatten(node, descend).filter(child => predicate(child.node)) +} diff --git a/packages/tiptap-utils/src/utils/findParentNode.js b/packages/tiptap-utils/src/utils/findParentNode.js new file mode 100644 index 00000000..b194795b --- /dev/null +++ b/packages/tiptap-utils/src/utils/findParentNode.js @@ -0,0 +1,5 @@ +import findParentNodeClosestToPos from './findParentNodeClosestToPos' + +export default function findParentNode(predicate) { + return selection => findParentNodeClosestToPos(selection.$from, predicate) +} diff --git a/packages/tiptap-utils/src/utils/findParentNodeClosestToPos.js b/packages/tiptap-utils/src/utils/findParentNodeClosestToPos.js new file mode 100644 index 00000000..c1529c4a --- /dev/null +++ b/packages/tiptap-utils/src/utils/findParentNodeClosestToPos.js @@ -0,0 +1,15 @@ +// eslint-disable-next-line +export default function findParentNodeClosestToPos($pos, predicate) { + for (let i = $pos.depth; i > 0; i -= 1) { + const node = $pos.node(i) + + if (predicate(node)) { + return { + pos: i > 0 ? $pos.before(i) : 0, + start: $pos.start(i), + depth: i, + node, + } + } + } +} diff --git a/packages/tiptap-utils/src/utils/findSelectedNodeOfType.js b/packages/tiptap-utils/src/utils/findSelectedNodeOfType.js new file mode 100644 index 00000000..a796b685 --- /dev/null +++ b/packages/tiptap-utils/src/utils/findSelectedNodeOfType.js @@ -0,0 +1,16 @@ +import isNodeSelection from './isNodeSelection' +import equalNodeType from './equalNodeType' + +export default function findSelectedNodeOfType(nodeType) { + // eslint-disable-next-line + return function (selection) { + if (isNodeSelection(selection)) { + const { node } = selection + const { $from } = selection + + if (equalNodeType(nodeType, node)) { + return { node, pos: $from.pos, depth: $from.depth } + } + } + } +} diff --git a/packages/tiptap-utils/src/utils/flatten.js b/packages/tiptap-utils/src/utils/flatten.js new file mode 100644 index 00000000..adcf4dff --- /dev/null +++ b/packages/tiptap-utils/src/utils/flatten.js @@ -0,0 +1,17 @@ +export default function flatten(node) { + // eslint-disable-next-line + const descend = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true + + if (!node) { + throw new Error('Invalid "node" parameter') + } + const result = [] + // eslint-disable-next-line + node.descendants((child, pos) => { + result.push({ node: child, pos }) + if (!descend) { + return false + } + }) + return result +} diff --git a/packages/tiptap-utils/src/utils/getTableNodeTypes.js b/packages/tiptap-utils/src/utils/getTableNodeTypes.js new file mode 100644 index 00000000..002c3638 --- /dev/null +++ b/packages/tiptap-utils/src/utils/getTableNodeTypes.js @@ -0,0 +1,20 @@ +export default function getTableNodeTypes(schema) { + if (schema.cached.tableNodeTypes) { + return schema.cached.tableNodeTypes + } + + const roles = {} + + Object.keys(schema.nodes).forEach(type => { + const nodeType = schema.nodes[type] + + if (nodeType.spec.tableRole) { + roles[nodeType.spec.tableRole] = nodeType + } + }) + + // eslint-disable-next-line + schema.cached.tableNodeTypes = roles + + return roles +} diff --git a/packages/tiptap-utils/src/utils/isNodeSelection.js b/packages/tiptap-utils/src/utils/isNodeSelection.js new file mode 100644 index 00000000..078ef080 --- /dev/null +++ b/packages/tiptap-utils/src/utils/isNodeSelection.js @@ -0,0 +1,5 @@ +import { NodeSelection } from 'prosemirror-state' + +export default function isNodeSelection(selection) { + return selection instanceof NodeSelection +} diff --git a/packages/tiptap-utils/src/utils/nodeIsActive.js b/packages/tiptap-utils/src/utils/nodeIsActive.js index 550c11f0..fa2813b8 100644 --- a/packages/tiptap-utils/src/utils/nodeIsActive.js +++ b/packages/tiptap-utils/src/utils/nodeIsActive.js @@ -1,7 +1,5 @@ -import { - findParentNode, - findSelectedNodeOfType, -} from 'prosemirror-utils' +import findSelectedNodeOfType from './findSelectedNodeOfType' +import findParentNode from './findParentNode' export default function nodeIsActive(state, type, attrs = {}) { const predicate = node => node.type === type diff --git a/yarn.lock b/yarn.lock index f14da338..2e489873 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10538,11 +10538,6 @@ prosemirror-transform@^1.2.1: dependencies: prosemirror-model "^1.0.0" -prosemirror-utils@^0.9.6: - version "0.9.6" - resolved "https://registry.yarnpkg.com/prosemirror-utils/-/prosemirror-utils-0.9.6.tgz#3d97bd85897e3b535555867dc95a51399116a973" - integrity sha512-UC+j9hQQ1POYfMc5p7UFxBTptRiGPR7Kkmbl3jVvU8VgQbkI89tR/GK+3QYC8n+VvBZrtAoCrJItNhWSxX3slA== - prosemirror-view@1.16.5, prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3: version "1.16.5" resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.16.5.tgz#1a4646832e16c1cf116b54b9becf4b0663821125"