diff --git a/package-lock.json b/package-lock.json index 6141f98e..b844dc7f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,17 +19,17 @@ "@popperjs/core": "^2.4.4", "diff": "^4.0.2", "lodash": "^4.17.11", - "prosemirror-changeset": "^2.1.2", - "prosemirror-example-setup": "^1.1.2", - "prosemirror-history": "^1.1.2", - "prosemirror-keymap": "^1.0.0", - "prosemirror-menu": "^1.1.1", - "prosemirror-model": "^1.8.2", - "prosemirror-schema-basic": "^1.1.2", - "prosemirror-state": "^1.3.4", - "prosemirror-test-builder": "^1.0.1", - "prosemirror-utils": "^0.6.7", - "prosemirror-view": "^1.13.4", + "prosemirror-changeset": "^2.2.0", + "prosemirror-example-setup": "^1.2.1", + "prosemirror-history": "^1.3.0", + "prosemirror-keymap": "^1.2.0", + "prosemirror-menu": "^1.2.1", + "prosemirror-model": "^1.18.2", + "prosemirror-schema-basic": "^1.2.0", + "prosemirror-state": "^1.4.2", + "prosemirror-test-builder": "^1.1.0", + "prosemirror-utils": "^0.9.6", + "prosemirror-view": "^1.29.1", "react": "^17.0.2", "react-dom": "^17.0.2", "react-popper": "^2.2.5", @@ -8090,8 +8090,9 @@ } }, "node_modules/orderedmap": { - "version": "1.1.1", - "license": "MIT" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.0.tgz", + "integrity": "sha512-/pIFexOm6S70EPdznemIz3BQZoJ4VTFrhqzu0ACBqBgeLsLxq8e6Jim63ImIfwW/zAD1AlXpRMlOv3aghmo4dA==" }, "node_modules/p-limit": { "version": "3.1.0", @@ -8443,8 +8444,9 @@ "license": "MIT" }, "node_modules/prosemirror-changeset": { - "version": "2.1.2", - "license": "MIT", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.2.0.tgz", + "integrity": "sha512-QM7ohGtkpVpwVGmFb8wqVhaz9+6IUXcIQBGZ81YNAKYuHiFJ1ShvSzab4pKqTinJhwciZbrtBEk/2WsqSt2PYg==", "dependencies": { "prosemirror-transform": "^1.0.0" } @@ -8539,8 +8541,9 @@ } }, "node_modules/prosemirror-example-setup": { - "version": "1.1.2", - "license": "MIT", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prosemirror-example-setup/-/prosemirror-example-setup-1.2.1.tgz", + "integrity": "sha512-sxFBVjxP+Mgd7sPigjN4QenrEn8e1vgX/YWsB+Bv6nPZf9Eakx7TDdjLPs+7v/iCXFqCdRX7C20LcYdUQhvWpA==", "dependencies": { "prosemirror-commands": "^1.0.0", "prosemirror-dropcursor": "^1.0.0", @@ -8564,8 +8567,9 @@ } }, "node_modules/prosemirror-history": { - "version": "1.2.0", - "license": "MIT", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.3.0.tgz", + "integrity": "sha512-qo/9Wn4B/Bq89/YD+eNWFbAytu6dmIM85EhID+fz9Jcl9+DfGEo8TTSrRhP15+fFEoaPqpHSxlvSzSEbmlxlUA==", "dependencies": { "prosemirror-state": "^1.2.2", "prosemirror-transform": "^1.0.0", @@ -8581,16 +8585,18 @@ } }, "node_modules/prosemirror-keymap": { - "version": "1.1.5", - "license": "MIT", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.0.tgz", + "integrity": "sha512-TdSfu+YyLDd54ufN/ZeD1VtBRYpgZnTPnnbY+4R08DDgs84KrIPEPbJL8t1Lm2dkljFx6xeBE26YWH3aIzkPKg==", "dependencies": { "prosemirror-state": "^1.0.0", "w3c-keyname": "^2.2.0" } }, "node_modules/prosemirror-menu": { - "version": "1.1.4", - "license": "MIT", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.1.tgz", + "integrity": "sha512-sBirXxVfHalZO4f1ZS63WzewINK4182+7dOmoMeBkqYO8wqMBvBS7wQuwVOHnkMWPEh0+N0LJ856KYUN+vFkmQ==", "dependencies": { "crelt": "^1.0.0", "prosemirror-commands": "^1.0.0", @@ -8599,15 +8605,17 @@ } }, "node_modules/prosemirror-model": { - "version": "1.15.0", - "license": "MIT", + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.18.2.tgz", + "integrity": "sha512-uOQorJr20qVvqp2hs2RdWtWoidQxJ1ceE11bSmkf57XS989mdg1zKPJIp5HOHfY8/KjXPn3cLZqUYYwRrfBBPw==", "dependencies": { - "orderedmap": "^1.1.0" + "orderedmap": "^2.0.0" } }, "node_modules/prosemirror-schema-basic": { - "version": "1.1.2", - "license": "MIT", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.0.tgz", + "integrity": "sha512-JMN/ammP94ObOUS6cpIy121r0MEDN9V95mAxFVALwC4bbmhpWXGjBGHTA5LHPPdbqZKyR6Jar1Akv4Z5k9CNLw==", "dependencies": { "prosemirror-model": "^1.2.0" } @@ -8621,16 +8629,19 @@ } }, "node_modules/prosemirror-state": { - "version": "1.3.4", - "license": "MIT", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.2.tgz", + "integrity": "sha512-puuzLD2mz/oTdfgd8msFbe0A42j5eNudKAAPDB0+QJRw8cO1ygjLmhLrg9RvDpf87Dkd6D4t93qdef00KKNacQ==", "dependencies": { "prosemirror-model": "^1.0.0", - "prosemirror-transform": "^1.0.0" + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.27.0" } }, "node_modules/prosemirror-tables": { - "version": "0.6.5", - "license": "MIT", + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-0.9.5.tgz", + "integrity": "sha512-RlAF/D7OvnDCOL8B6Qt6KuBkb0w3SedTdrou7wH7Nn2ml7+M5xUalW/h1f7dMD3wjsU47/Cn8zTbEkCDIpIggw==", "peer": true, "dependencies": { "prosemirror-keymap": "^1.0.0", @@ -8641,8 +8652,9 @@ } }, "node_modules/prosemirror-test-builder": { - "version": "1.0.5", - "license": "MIT", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/prosemirror-test-builder/-/prosemirror-test-builder-1.1.0.tgz", + "integrity": "sha512-8fHiArJ5U3GyIjEriC02d9AcfFVYRKOarlV2aehdN5qEVO0YFFPCHoeaFeneInA29ubHycNQua7HqgykWHqr+w==", "dependencies": { "prosemirror-model": "^1.0.0", "prosemirror-schema-basic": "^1.0.0", @@ -8657,19 +8669,21 @@ } }, "node_modules/prosemirror-utils": { - "version": "0.6.7", - "license": "Apache-2.0", + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/prosemirror-utils/-/prosemirror-utils-0.9.6.tgz", + "integrity": "sha512-UC+j9hQQ1POYfMc5p7UFxBTptRiGPR7Kkmbl3jVvU8VgQbkI89tR/GK+3QYC8n+VvBZrtAoCrJItNhWSxX3slA==", "peerDependencies": { "prosemirror-model": "^1.0.0", "prosemirror-state": "^1.0.1", - "prosemirror-tables": "^0.6.5" + "prosemirror-tables": "^0.9.1" } }, "node_modules/prosemirror-view": { - "version": "1.23.3", - "license": "MIT", + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.29.1.tgz", + "integrity": "sha512-OhujVZSDsh0l0PyHNdfaBj6DBkbhYaCfbaxmTeFrMKd/eWS+G6IC+OAbmR9IsLC8Se1HSbphMaXnsXjupHL3UQ==", "dependencies": { - "prosemirror-model": "^1.14.3", + "prosemirror-model": "^1.16.0", "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.1.0" } @@ -16168,7 +16182,9 @@ } }, "orderedmap": { - "version": "1.1.1" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.0.tgz", + "integrity": "sha512-/pIFexOm6S70EPdznemIz3BQZoJ4VTFrhqzu0ACBqBgeLsLxq8e6Jim63ImIfwW/zAD1AlXpRMlOv3aghmo4dA==" }, "p-limit": { "version": "3.1.0", @@ -16411,7 +16427,9 @@ } }, "prosemirror-changeset": { - "version": "2.1.2", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.2.0.tgz", + "integrity": "sha512-QM7ohGtkpVpwVGmFb8wqVhaz9+6IUXcIQBGZ81YNAKYuHiFJ1ShvSzab4pKqTinJhwciZbrtBEk/2WsqSt2PYg==", "requires": { "prosemirror-transform": "^1.0.0" } @@ -16491,7 +16509,9 @@ } }, "prosemirror-example-setup": { - "version": "1.1.2", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prosemirror-example-setup/-/prosemirror-example-setup-1.2.1.tgz", + "integrity": "sha512-sxFBVjxP+Mgd7sPigjN4QenrEn8e1vgX/YWsB+Bv6nPZf9Eakx7TDdjLPs+7v/iCXFqCdRX7C20LcYdUQhvWpA==", "requires": { "prosemirror-commands": "^1.0.0", "prosemirror-dropcursor": "^1.0.0", @@ -16514,7 +16534,9 @@ } }, "prosemirror-history": { - "version": "1.2.0", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.3.0.tgz", + "integrity": "sha512-qo/9Wn4B/Bq89/YD+eNWFbAytu6dmIM85EhID+fz9Jcl9+DfGEo8TTSrRhP15+fFEoaPqpHSxlvSzSEbmlxlUA==", "requires": { "prosemirror-state": "^1.2.2", "prosemirror-transform": "^1.0.0", @@ -16529,14 +16551,18 @@ } }, "prosemirror-keymap": { - "version": "1.1.5", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.0.tgz", + "integrity": "sha512-TdSfu+YyLDd54ufN/ZeD1VtBRYpgZnTPnnbY+4R08DDgs84KrIPEPbJL8t1Lm2dkljFx6xeBE26YWH3aIzkPKg==", "requires": { "prosemirror-state": "^1.0.0", "w3c-keyname": "^2.2.0" } }, "prosemirror-menu": { - "version": "1.1.4", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.1.tgz", + "integrity": "sha512-sBirXxVfHalZO4f1ZS63WzewINK4182+7dOmoMeBkqYO8wqMBvBS7wQuwVOHnkMWPEh0+N0LJ856KYUN+vFkmQ==", "requires": { "crelt": "^1.0.0", "prosemirror-commands": "^1.0.0", @@ -16545,13 +16571,17 @@ } }, "prosemirror-model": { - "version": "1.15.0", + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.18.2.tgz", + "integrity": "sha512-uOQorJr20qVvqp2hs2RdWtWoidQxJ1ceE11bSmkf57XS989mdg1zKPJIp5HOHfY8/KjXPn3cLZqUYYwRrfBBPw==", "requires": { - "orderedmap": "^1.1.0" + "orderedmap": "^2.0.0" } }, "prosemirror-schema-basic": { - "version": "1.1.2", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.0.tgz", + "integrity": "sha512-JMN/ammP94ObOUS6cpIy121r0MEDN9V95mAxFVALwC4bbmhpWXGjBGHTA5LHPPdbqZKyR6Jar1Akv4Z5k9CNLw==", "requires": { "prosemirror-model": "^1.2.0" } @@ -16564,14 +16594,19 @@ } }, "prosemirror-state": { - "version": "1.3.4", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.2.tgz", + "integrity": "sha512-puuzLD2mz/oTdfgd8msFbe0A42j5eNudKAAPDB0+QJRw8cO1ygjLmhLrg9RvDpf87Dkd6D4t93qdef00KKNacQ==", "requires": { "prosemirror-model": "^1.0.0", - "prosemirror-transform": "^1.0.0" + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.27.0" } }, "prosemirror-tables": { - "version": "0.6.5", + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-0.9.5.tgz", + "integrity": "sha512-RlAF/D7OvnDCOL8B6Qt6KuBkb0w3SedTdrou7wH7Nn2ml7+M5xUalW/h1f7dMD3wjsU47/Cn8zTbEkCDIpIggw==", "peer": true, "requires": { "prosemirror-keymap": "^1.0.0", @@ -16582,7 +16617,9 @@ } }, "prosemirror-test-builder": { - "version": "1.0.5", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/prosemirror-test-builder/-/prosemirror-test-builder-1.1.0.tgz", + "integrity": "sha512-8fHiArJ5U3GyIjEriC02d9AcfFVYRKOarlV2aehdN5qEVO0YFFPCHoeaFeneInA29ubHycNQua7HqgykWHqr+w==", "requires": { "prosemirror-model": "^1.0.0", "prosemirror-schema-basic": "^1.0.0", @@ -16596,13 +16633,17 @@ } }, "prosemirror-utils": { - "version": "0.6.7", + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/prosemirror-utils/-/prosemirror-utils-0.9.6.tgz", + "integrity": "sha512-UC+j9hQQ1POYfMc5p7UFxBTptRiGPR7Kkmbl3jVvU8VgQbkI89tR/GK+3QYC8n+VvBZrtAoCrJItNhWSxX3slA==", "requires": {} }, "prosemirror-view": { - "version": "1.23.3", + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.29.1.tgz", + "integrity": "sha512-OhujVZSDsh0l0PyHNdfaBj6DBkbhYaCfbaxmTeFrMKd/eWS+G6IC+OAbmR9IsLC8Se1HSbphMaXnsXjupHL3UQ==", "requires": { - "prosemirror-model": "^1.14.3", + "prosemirror-model": "^1.16.0", "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.1.0" } diff --git a/package.json b/package.json index 91981243..472e93cb 100644 --- a/package.json +++ b/package.json @@ -79,17 +79,17 @@ "@popperjs/core": "^2.4.4", "diff": "^4.0.2", "lodash": "^4.17.11", - "prosemirror-changeset": "^2.1.2", - "prosemirror-example-setup": "^1.1.2", - "prosemirror-history": "^1.1.2", - "prosemirror-keymap": "^1.0.0", - "prosemirror-menu": "^1.1.1", - "prosemirror-model": "^1.8.2", - "prosemirror-schema-basic": "^1.1.2", - "prosemirror-state": "^1.3.4", - "prosemirror-test-builder": "^1.0.1", - "prosemirror-utils": "^0.6.7", - "prosemirror-view": "^1.13.4", + "prosemirror-changeset": "^2.2.0", + "prosemirror-example-setup": "^1.2.1", + "prosemirror-history": "^1.3.0", + "prosemirror-keymap": "^1.2.0", + "prosemirror-menu": "^1.2.1", + "prosemirror-model": "^1.18.2", + "prosemirror-schema-basic": "^1.2.0", + "prosemirror-state": "^1.4.2", + "prosemirror-test-builder": "^1.1.0", + "prosemirror-utils": "^0.9.6", + "prosemirror-view": "^1.29.1", "react": "^17.0.2", "react-dom": "^17.0.2", "react-popper": "^2.2.5", diff --git a/src/ts/commands.ts b/src/ts/commands.ts index 98d7a26b..091f0ad8 100644 --- a/src/ts/commands.ts +++ b/src/ts/commands.ts @@ -337,7 +337,7 @@ export const applyAutoFixableSuggestionsCommand = ( */ export const ignoreMatchCommand = (id: string) => (getState: GetState) => ( state: EditorState, - dispatch?: (tr: Transaction) => void + dispatch?: (tr: Transaction) => void ): boolean => { const pluginState = getState(state); if (!pluginState) { @@ -352,7 +352,7 @@ export const ignoreMatchCommand = (id: string) => (getState: GetState) => ( export const clearMatchesCommand = () => (_: GetState) => ( state: EditorState, - dispatch?: (tr: Transaction) => void + dispatch?: (tr: Transaction) => void ): boolean => { if (dispatch) { dispatch( @@ -369,7 +369,7 @@ const maybeApplySuggestions = ( text: string | undefined; }>, state: EditorState, - dispatch?: (tr: Transaction) => void + dispatch?: (tr: Transaction) => void ) => { if (!suggestionsToApply.length) { return false; diff --git a/src/ts/createTyperighterPlugin.ts b/src/ts/createTyperighterPlugin.ts index 7c0679ce..7ea913a7 100644 --- a/src/ts/createTyperighterPlugin.ts +++ b/src/ts/createTyperighterPlugin.ts @@ -41,7 +41,7 @@ import TyperighterTelemetryAdapter from "./services/TyperighterTelemetryAdapter" import { IMatcherAdapter } from "./interfaces/IMatcherAdapter"; import { v4 } from "uuid"; -export type ExpandRanges = (ranges: IRange[], doc: Node) => IRange[]; +export type ExpandRanges = (ranges: IRange[], doc: Node) => IRange[]; export interface IFilterOptions{ /** @@ -173,16 +173,20 @@ const createTyperighterPlugin = ( * We use appendTransaction to handle side effects and dispatch actions * in response to state transitions. */ - appendTransaction(trs: Transaction[], oldState, newState) { - const oldPluginState: IPluginState = plugin.getState(oldState); - const newPluginState: IPluginState = plugin.getState(newState); + appendTransaction(trs, oldState, newState) { + const oldPluginState = plugin.getState(oldState); + const newPluginState = plugin.getState(newState); - const newTr = newState.tr; + if (!oldPluginState || !newPluginState) { + return; + } + const newTr = newState.tr; const newDirtiedRanges = trs.reduce( (acc, tr) => acc.concat(getDirtiedRangesFromTransaction(oldState.doc, tr)), [] as IRange[] ); + if (newDirtiedRanges.length) { if (newPluginState.config.requestMatchesOnDocModified && newPluginState.typerighterEnabled) { // We wait a tick here, as applyNewDirtiedRanges must run @@ -200,6 +204,7 @@ const createTyperighterPlugin = ( oldPluginState, newPluginState ); + blockStates.forEach(({ requestId, pendingBlocks }) => store.emit( STORE_EVENT_NEW_MATCHES, @@ -209,17 +214,22 @@ const createTyperighterPlugin = ( ); }, props: { - decorations: state => plugin.getState(state).decorations, + decorations: state => plugin.getState(state)?.decorations, handleDOMEvents: { mouseleave: (view, event) => { maybeResetHoverStates(view, isElementPartOfTyperighterUI, event); return false; }, click: (view: EditorView, event: Event) => { + const pluginState = plugin.getState(view.state); + if (!pluginState) { + return; + } + const matchId = maybeGetDecorationMatchIdFromEvent(event); const match = matchId && - selectMatchByMatchId(plugin.getState(view.state), matchId); + selectMatchByMatchId(pluginState, matchId); if (match) { onMatchDecorationClicked(match); } @@ -233,7 +243,7 @@ const createTyperighterPlugin = ( stopHoverCommand()(view.state, view.dispatch); } - if (!matchId || matchId === plugin.getState(view.state).hoverId) { + if (!matchId || matchId === plugin.getState(view.state)?.hoverId) { return false; } @@ -276,7 +286,10 @@ const createTyperighterPlugin = ( return { // Update our store with the new state. update: _ => { - store.emit(STORE_EVENT_NEW_STATE, plugin.getState(view.state)); + const pluginState = plugin.getState(view.state); + if (pluginState) { + store.emit(STORE_EVENT_NEW_STATE, pluginState); + } } }; } diff --git a/src/ts/state/test/reducer.spec.ts b/src/ts/state/test/reducer.spec.ts index 58f8acd5..953d7133 100644 --- a/src/ts/state/test/reducer.spec.ts +++ b/src/ts/state/test/reducer.spec.ts @@ -640,11 +640,12 @@ describe("Action handlers", () => { precedingText: "bigger block of text", subsequentText: "" }; + const localState = { ...state, - decorations: new DecorationSet().add(tr.doc, [ - ...createDecorationsForMatch(output, true) - ]), + decorations: DecorationSet.create(tr.doc, + createDecorationsForMatch(output, true) + ), currentMatches: [output], hoverId: "match-id", hoverInfo: undefined @@ -653,7 +654,7 @@ describe("Action handlers", () => { reducer(tr, localState, newHoverIdReceived(undefined, undefined)) ).toEqual({ ...localState, - decorations: new DecorationSet().add(tr.doc, [ + decorations: DecorationSet.create(tr.doc, [ ...createDecorationsForMatch(output, false) ]), hoverId: undefined, diff --git a/src/ts/test/helpers/prosemirror.ts b/src/ts/test/helpers/prosemirror.ts index 763a1bc5..4cc29c7b 100644 --- a/src/ts/test/helpers/prosemirror.ts +++ b/src/ts/test/helpers/prosemirror.ts @@ -4,7 +4,6 @@ import { builders } from "prosemirror-test-builder"; import { EditorView, DecorationSet, - InlineDecorationSpec, Decoration } from "prosemirror-view"; import { getNewDecorationsForCurrentMatches } from "../../utils/decoration"; @@ -31,8 +30,8 @@ export const p = build.p; */ export const getDecorationSpecsFromDoc = ( view: EditorView -): Set => - getDecorationSpecsFromSet(view.someProp("decorations", f => f(view.state))); +) => + getDecorationSpecsFromSet(view.someProp("decorations", f => f(view.state)) as DecorationSet); export const getDecorationSpecsFromMatches = (matches: IMatch[], doc: Node) => { const decorationSet = getNewDecorationsForCurrentMatches(matches, DecorationSet.empty, doc) @@ -41,8 +40,8 @@ export const getDecorationSpecsFromMatches = (matches: IMatch[], doc: Node) => { export const getDecorationSpecsFromSet = ( set: DecorationSet -): Set => new Set(set.find().map(_ => _.spec)); +) => new Set(set.find().map(_ => _.spec)); export const getDecorationSpecs = ( decorations: Decoration[] -): Set => new Set(decorations.map(_ => _.spec)); +) => new Set(decorations.map(_ => _.spec)); diff --git a/src/ts/utils/prosemirror.ts b/src/ts/utils/prosemirror.ts index fb0f52c4..cd0c4331 100644 --- a/src/ts/utils/prosemirror.ts +++ b/src/ts/utils/prosemirror.ts @@ -18,7 +18,9 @@ export const MarkTypes = { export const flatten = (node: Node, descend = true) => { const result: Array<{ node: Node; parent: Node; pos: number }> = []; node.descendants((child, pos, parent) => { - result.push({ node: child, parent, pos }); + if (parent) { + result.push({ node: child, parent, pos }); + } if (!descend) { return false; } @@ -102,7 +104,7 @@ interface ISuggestionPatchInsert extends IBaseSuggestionPatch { // is applied to the document, not when it's first created. This ensures that // positions stored in a patch correctly map to the document, even after previous // patches have altered it. - getMarks: (tr: Transaction) => Array>; + getMarks: (tr: Transaction) => Array; } type ISuggestionPatch = ISuggestionPatchInsert | ISuggestionPatchDelete; diff --git a/src/ts/utils/test/prosemirror.spec.ts b/src/ts/utils/test/prosemirror.spec.ts index 800449fb..4904a648 100644 --- a/src/ts/utils/test/prosemirror.spec.ts +++ b/src/ts/utils/test/prosemirror.spec.ts @@ -1,4 +1,4 @@ -import builder from "prosemirror-test-builder"; +import { doc, p, ul, li } from "prosemirror-test-builder"; import { getBlocksFromDocument, getDirtiedRangesFromTransaction, @@ -8,8 +8,6 @@ import { flatten } from "prosemirror-utils"; import { doNotSkipRanges } from "../block"; import { createEditor } from "../../test/helpers/createEditor"; -const { doc, p, ul, li } = builder; - describe("Prosemirror utils", () => { describe("getBlocksFromDocument", () => { it("should get the ranges of all the leaf block nodes in a given node", () => {