diff --git a/editors/demo/src/Editoria/config/config.js b/editors/demo/src/Editoria/config/config.js index 332bad0418d997014e9678510d312e33c3061b01..5cc22496654502259e273a5874f1b40c93253104 100644 --- a/editors/demo/src/Editoria/config/config.js +++ b/editors/demo/src/Editoria/config/config.js @@ -44,6 +44,7 @@ import { CustomTagBlockToolGroupService, CustomTagService, YjsService, + disallowPasteImagesPlugin, } from 'wax-prosemirror-services'; import { EditoriaSchema } from 'wax-prosemirror-core'; @@ -72,6 +73,10 @@ const updateTrackStatus = status => { // console.log('status', status); }; +const onWarning = message => { + alert(message); +}; + export default { MenuService: [ { @@ -140,7 +145,16 @@ export default { reject: true, }, }, - PmPlugins: [columnResizing(), tableEditing(), invisibles([hardBreak()])], + PmPlugins: [ + columnResizing(), + tableEditing(), + invisibles([hardBreak()]), + disallowPasteImagesPlugin(() => + onWarning( + 'Images are not allowed. Please upload them through filemanager', + ), + ), + ], ImageService: { showAlt: true }, CustomTagService: { tags: [ diff --git a/package.json b/package.json index 04dcb6545ab61e96f3f050203c56e636062cb7cc..faae4dd53510c42e5f70b3e028e68c65ab67312f 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,10 @@ } }, "resolutions": { - "prosemirror-view": "1.23.7", + "prosemirror-view": "1.30.2", + "prosemirror-model": "1.19.0", + "prosemirror-state": "1.4.2", + "prosemirror-transform": "1.7.1", "styled-components": "5.3.1" }, "devDependencies": { diff --git a/wax-prosemirror-core/package.json b/wax-prosemirror-core/package.json index b6f07d66adc194cb9a8544f94ba8c2d161ed658f..9e480b4a221f8e980e5a854a3daa2e4044e9ffe2 100644 --- a/wax-prosemirror-core/package.json +++ b/wax-prosemirror-core/package.json @@ -21,17 +21,17 @@ "lodash": "^4.17.4", "moment": "^2.29.0", "prop-types": "^15.7.2", - "prosemirror-commands": "1.2.1", - "prosemirror-dropcursor": "1.6.1", - "prosemirror-gapcursor": "1.2.2", - "prosemirror-history": "1.2.0", - "prosemirror-inputrules": "1.1.3", - "prosemirror-keymap": "1.1.5", - "prosemirror-model": "1.16.1", + "prosemirror-commands": "1.5.1", + "prosemirror-dropcursor": "1.7.1", + "prosemirror-gapcursor": "1.3.1", + "prosemirror-history": "1.3.0", + "prosemirror-inputrules": "1.2.0", + "prosemirror-keymap": "1.2.1", + "prosemirror-model": "1.19.0", "prosemirror-schema-list": "^1.1.6", - "prosemirror-state": "1.3.3", - "prosemirror-transform": "1.3.4", - "prosemirror-view": "1.23.7", + "prosemirror-state": "1.4.2", + "prosemirror-transform": "1.7.1", + "prosemirror-view": "1.30.2", "reflect-metadata": "^0.1.13", "uuid": "^7.0.3" }, diff --git a/wax-prosemirror-core/src/utilities/track-changes/helpers/markDeletion.js b/wax-prosemirror-core/src/utilities/track-changes/helpers/markDeletion.js index 2599ef535aa0c2585c346207b29eb5a962aefc38..8b4dce4c8ac1a5e8edc4cef349a7052f9614a894 100644 --- a/wax-prosemirror-core/src/utilities/track-changes/helpers/markDeletion.js +++ b/wax-prosemirror-core/src/utilities/track-changes/helpers/markDeletion.js @@ -1,6 +1,10 @@ +/* eslint-disable prefer-object-spread */ +/* eslint-disable consistent-return */ import { Selection, TextSelection } from 'prosemirror-state'; +import { v4 as uuidv4 } from 'uuid'; import { Slice } from 'prosemirror-model'; import { ReplaceStep, Mapping } from 'prosemirror-transform'; +import removeNode from './removeNode'; const markDeletion = (tr, from, to, user, date, group, viewId) => { const deletionMark = tr.doc.type.schema.marks.deletion.create({ @@ -53,11 +57,15 @@ const markDeletion = (tr, from, to, user, date, group, viewId) => { ) ) { let removeStep; + if (node.isTextblock && node.nodeSize === 2) { + return removeNode(tr, node, pos, deletionMap); + } if (node.isTextblock && to < pos + node.nodeSize) { const selectionBefore = Selection.findFrom(tr.doc.resolve(pos), -1); if (selectionBefore instanceof TextSelection) { removeStep = new ReplaceStep( - deletionMap.map(selectionBefore.$anchor.pos), + // deletionMap.map(selectionBefore.$anchor.pos), + deletionMap.map(Math.min(to, pos + node.nodeSize)), deletionMap.map(to), Slice.empty, ); @@ -91,13 +99,19 @@ const markDeletion = (tr, from, to, user, date, group, viewId) => { user: user.userId, username: user.username, style: `color: ${user.userColor.deletion};`, - - // date + date, + group, + viewid: viewId, }); tr.setNodeMarkup( deletionMap.map(pos), null, - Object.assign(node.attrs.track, { track }), + Object.assign({}, node.attrs, { + track, + group, + id: uuidv4(), + }), + // Object.assign(node.attrs.track, { track }), node.marks, ); } diff --git a/wax-prosemirror-core/src/utilities/track-changes/helpers/markInsertion.js b/wax-prosemirror-core/src/utilities/track-changes/helpers/markInsertion.js index 21ff69f48ff5207c291bcec18a33b9be2d11f7e3..d66ad1ae3732616d853af968fdcab78c5143f7d6 100644 --- a/wax-prosemirror-core/src/utilities/track-changes/helpers/markInsertion.js +++ b/wax-prosemirror-core/src/utilities/track-changes/helpers/markInsertion.js @@ -1,3 +1,4 @@ +/* eslint-disable no-else-return */ import { v4 as uuidv4 } from 'uuid'; const markInsertion = (tr, from, to, user, date, group, viewId) => { @@ -39,10 +40,12 @@ const markInsertion = (tr, from, to, user, date, group, viewId) => { tr.setNodeMarkup( pos, null, + // eslint-disable-next-line prefer-object-spread Object.assign({}, node.attrs, { track, group, id: uuidv4(), + viewid: viewId, }), node.marks, ); diff --git a/wax-prosemirror-core/src/utilities/track-changes/helpers/replaceAroundStep.js b/wax-prosemirror-core/src/utilities/track-changes/helpers/replaceAroundStep.js index db8f7c2f14da9af34168a243dc6b2c7a1f1dc95a..44cba88381c7d53c908d6d666583d1a7b7ef4214 100644 --- a/wax-prosemirror-core/src/utilities/track-changes/helpers/replaceAroundStep.js +++ b/wax-prosemirror-core/src/utilities/track-changes/helpers/replaceAroundStep.js @@ -21,7 +21,7 @@ const replaceAroundStep = ( newTr.step(step); const from = step.getMap().map(step.from, -1); const to = step.getMap().map(step.gapFrom); - markInsertion(newTr, from, to, user, date, group); + markInsertion(newTr, from, to, user, date, group, viewId); } else if (!step.slice.size || step.slice.content.content.length === 2) { const invertStep = originalStep.invert(tr.docs[originalStepIndex]).map(map); // unwrapped from something diff --git a/wax-prosemirror-core/src/utilities/track-changes/helpers/replaceStep.js b/wax-prosemirror-core/src/utilities/track-changes/helpers/replaceStep.js index e26da3edccd2761869525cd14903bad7c937d532..98fd4204711fea0b3230761d7ef656eb6ee6a77d 100644 --- a/wax-prosemirror-core/src/utilities/track-changes/helpers/replaceStep.js +++ b/wax-prosemirror-core/src/utilities/track-changes/helpers/replaceStep.js @@ -44,7 +44,15 @@ const replaceStep = ( } const mappedNewStepTo = newStep.getMap().map(newStep.to); - markInsertion(trTemp, newStep.from, mappedNewStepTo, user, date, group); + markInsertion( + trTemp, + newStep.from, + mappedNewStepTo, + user, + date, + group, + viewId, + ); // We condense it down to a single replace step. const condensedStep = new ReplaceStep( newStep.from, diff --git a/wax-prosemirror-core/src/utilities/track-changes/trackedTransaction.js b/wax-prosemirror-core/src/utilities/track-changes/trackedTransaction.js index fcb0c961394ba129f034d6dbb227bed374f9a77b..36c00d8152e5ce7062df89072f39580bf67d0722 100644 --- a/wax-prosemirror-core/src/utilities/track-changes/trackedTransaction.js +++ b/wax-prosemirror-core/src/utilities/track-changes/trackedTransaction.js @@ -60,7 +60,6 @@ const trackedTransaction = ( const step = originalStep.map(map); const { doc } = newTr; if (!step) return; - switch (step.constructor) { case ReplaceStep: replaceStep( diff --git a/wax-prosemirror-services/index.js b/wax-prosemirror-services/index.js index f58d39841de99d028fcd65b3eaf3f57e7d52f012..e413c6e6ad8de85cc606246d4baa92c0eab4d3db 100644 --- a/wax-prosemirror-services/index.js +++ b/wax-prosemirror-services/index.js @@ -68,3 +68,7 @@ export { default as QuestionsDropDownToolGroupService } from './src/WaxToolGroup export { default as OENContainersToolGroupService } from './src/WaxToolGroups/OENContainersToolGroupService/OENContainersToolGroupService'; export { default as OENLeftToolGroupService } from './src/WaxToolGroups/OENLeftToolGroupService/OENLeftToolGroupService'; export { default as FindAndReplaceToolGroupService } from './src/WaxToolGroups/FindAndReplaceToolGroupService/FindAndReplaceToolGroupService'; + +/* Plugins */ + +export { default as disallowPasteImagesPlugin } from './src/ImageService/plugins/disallowPasteImagesPlugin'; diff --git a/wax-prosemirror-services/package.json b/wax-prosemirror-services/package.json index b2567e55ede0a6680c532b16b7282a5a12bea67e..0970a17c6f3b46b4b81eb27a770b858136939876 100644 --- a/wax-prosemirror-services/package.json +++ b/wax-prosemirror-services/package.json @@ -21,17 +21,17 @@ "lodash": "^4.17.4", "mathjax-full": "3.1.4", "prop-types": "^15.7.2", - "prosemirror-commands": "1.2.1", + "prosemirror-commands": "1.5.1", "prosemirror-highlightjs": "^0.2.0", - "prosemirror-history": "1.2.0", - "prosemirror-inputrules": "1.1.3", - "prosemirror-keymap": "1.1.5", - "prosemirror-model": "1.16.1", + "prosemirror-history": "1.3.0", + "prosemirror-inputrules": "1.2.0", + "prosemirror-keymap": "1.2.1", + "prosemirror-model": "1.19.0", "prosemirror-schema-list": "1.1.6", - "prosemirror-state": "1.3.3", + "prosemirror-state": "1.4.2", "prosemirror-tables": "^1.1.1", - "prosemirror-transform": "1.3.4", - "prosemirror-view": "1.23.7", + "prosemirror-transform": "1.7.1", + "prosemirror-view": "1.30.2", "rc-switch": "^3.2.2", "react-dropdown": "^1.6.2", "use-deep-compare-effect": "^1.3.1", diff --git a/wax-prosemirror-services/src/CommentsService/components/ConnectedTrackChange.js b/wax-prosemirror-services/src/CommentsService/components/ConnectedTrackChange.js index 8c8ea1b2c56c410be7bb63a04f7e67aad6c006af..042ea5e1a9d56ccd1b7a8cf3a7a6c26a591b91e7 100644 --- a/wax-prosemirror-services/src/CommentsService/components/ConnectedTrackChange.js +++ b/wax-prosemirror-services/src/CommentsService/components/ConnectedTrackChange.js @@ -26,6 +26,7 @@ export default ({ trackChangeId, top, recalculateTops, trackChange }) => { const viewId = trackChange.attrs ? trackChange.attrs.viewid : trackChange.node.attrs.viewid; + const styles = { top: `${top}px`, }; diff --git a/wax-prosemirror-services/src/ImageService/plugins/disallowPasteImagesPlugin.js b/wax-prosemirror-services/src/ImageService/plugins/disallowPasteImagesPlugin.js new file mode 100644 index 0000000000000000000000000000000000000000..bc562c059eefd2571eb5c0b5af9754da7600274d --- /dev/null +++ b/wax-prosemirror-services/src/ImageService/plugins/disallowPasteImagesPlugin.js @@ -0,0 +1,33 @@ +/* eslint-disable no-param-reassign */ +import { Plugin, PluginKey } from 'prosemirror-state'; + +const disallowPasteImagesPlugin = new PluginKey('disallowPasteImagesPlugin'); + +export default onWarning => { + return new Plugin({ + key: disallowPasteImagesPlugin, + props: { + transformPasted: slice => { + const { + content: { content }, + } = slice; + + let imageFound = false; + content.forEach(node => { + if (node.type.name === 'image') { + node.attrs.src = ''; + node.attrs.alt = ''; + imageFound = true; + } + if (node.type.name === 'figure') { + node.lastChild.attrs.src = ''; + node.lastChild.attrs.alt = ''; + imageFound = true; + } + }); + if (imageFound) onWarning(); + return slice; + }, + }, + }); +}; diff --git a/wax-prosemirror-services/src/ImageService/schema/imageNode.js b/wax-prosemirror-services/src/ImageService/schema/imageNode.js index f009e4f13b98457c1f92935b4814a50aee5e504a..f8141b8f0206b1ee63b97df4e1d90a662123d0c8 100644 --- a/wax-prosemirror-services/src/ImageService/schema/imageNode.js +++ b/wax-prosemirror-services/src/ImageService/schema/imageNode.js @@ -42,7 +42,10 @@ const imageNode = { hook.value = [ 'img', { - src, + src: + src !== '' + ? src + : 'data:image/png;base64,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', alt, title, 'data-id': id, diff --git a/wax-prosemirror-services/src/TrackChangeService/plugins/FindSelectedChanges.js b/wax-prosemirror-services/src/TrackChangeService/plugins/FindSelectedChanges.js index 91cc07aea34ccaeba90dde16be4bdc6a89dd3f28..82905816e9ce1acde4e50520468d31c46bb789ed 100644 --- a/wax-prosemirror-services/src/TrackChangeService/plugins/FindSelectedChanges.js +++ b/wax-prosemirror-services/src/TrackChangeService/plugins/FindSelectedChanges.js @@ -41,6 +41,47 @@ const findSelectedChanges = state => { formatChangePos = selection.from; } } + + /* TEMP */ + state.doc.nodesBetween(selection.from, selection.to, (node, pos) => { + if (!insertionMark) { + insertionMark = node.attrs.track + ? node.attrs.track.find(trackAttr => trackAttr.type === 'insertion') + : node.marks.find( + mark => mark.type.name === 'insertion' && !mark.attrs.approved, + ); + if (insertionMark) { + insertionPos = pos; + if (!node.isInline) { + insertionSize = node.nodeSize; + } + } + } + if (!deletionMark) { + deletionMark = node.attrs.track + ? node.attrs.track.find(trackAttr => trackAttr.type === 'deletion') + : node.marks.find(mark => mark.type.name === 'deletion'); + if (deletionMark) { + deletionPos = pos; + if (!node.isInline) { + deletionSize = node.nodeSize; + } + } + } + if (!formatChangeMark) { + formatChangeMark = node.marks.find( + mark => mark.type.name === 'format_change', + ); + if (formatChangeMark) { + formatChangePos = pos; + if (!node.isInline) { + formatChangeSize = node.nodeSize; + } + } + } + return false; + }); + /* TILL HERE */ } else { state.doc.nodesBetween(selection.from, selection.to, (node, pos) => { if (pos < selection.from) { @@ -105,7 +146,7 @@ const findSelectedChanges = state => { 'format_change', ); } + return selectedChanges; }; - export default findSelectedChanges; diff --git a/wax-prosemirror-services/src/TrackChangeService/plugins/TrackChangePlugin.js b/wax-prosemirror-services/src/TrackChangeService/plugins/TrackChangePlugin.js index 450507216cb7e82e443d3c109a57cc0cfc64058c..bd396b0b7fad9324ae5177190eb70a51ca6db484 100644 --- a/wax-prosemirror-services/src/TrackChangeService/plugins/TrackChangePlugin.js +++ b/wax-prosemirror-services/src/TrackChangeService/plugins/TrackChangePlugin.js @@ -31,7 +31,6 @@ export default options => { const { insertion, deletion, formatChange } = findSelectedChanges( state, ); - const decoType = tr.selection.node ? Decoration.node : Decoration.inline; @@ -39,7 +38,12 @@ export default options => { state.doc.nodesBetween(from, to, (node, pos) => { if ( node.attrs.track && - node.attrs.track.find(track => track.type === 'block_change') + node.attrs.track.find( + track => + track.type === 'block_change' || + track.type === 'insertion' || + track.type === 'deletion', + ) ) { let nodeSize = pos; node.descendants((childNode, childPos) => { diff --git a/yarn.lock b/yarn.lock index 6a25848b77cf48beb8c65aa728772a40009644c9..853628cd5ac76a0aa1f98a7e818feff41e216294 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10416,10 +10416,10 @@ optionator@^0.8.1, optionator@^0.8.3: type-check "~0.3.2" word-wrap "~1.2.3" -orderedmap@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-1.1.1.tgz#c618e77611b3b21d0fe3edc92586265e0059c789" - integrity sha512-3Ux8um0zXbVacKUkcytc0u3HgC0b0bBLT+I60r2J/En72cI0nZffqrA7Xtf2Hqs27j1g82llR5Mhbd0Z1XW4AQ== +orderedmap@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-2.1.0.tgz#819457082fa3a06abd316d83a281a1ca467437cd" + integrity sha512-/pIFexOm6S70EPdznemIz3BQZoJ4VTFrhqzu0ACBqBgeLsLxq8e6Jim63ImIfwW/zAD1AlXpRMlOv3aghmo4dA== original@^1.0.0: version "1.0.2" @@ -11995,28 +11995,28 @@ prop-types@^15.6.1, prop-types@^15.7.2: object-assign "^4.1.1" react-is "^16.8.1" -prosemirror-commands@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.2.1.tgz#eae0cb714df695260659b78ff5d201d3a037e50d" - integrity sha512-S/IkpXfpuLFsRynC2HQ5iYROUPiZskKS1+ClcWycGJvj4HMb/mVfeEkQrixYxgTl96EAh+RZQNWPC06GZXk5tQ== +prosemirror-commands@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.5.1.tgz#89ddfa14e144dcc7fb0938aa0e2568c7fdde306f" + integrity sha512-ga1ga/RkbzxfAvb6iEXYmrEpekn5NCwTb8w1dr/gmhSoaGcQ0VPuCzOn5qDEpC45ql2oDkKoKQbRxLJwKLpMTQ== dependencies: prosemirror-model "^1.0.0" prosemirror-state "^1.0.0" prosemirror-transform "^1.0.0" -prosemirror-dropcursor@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/prosemirror-dropcursor/-/prosemirror-dropcursor-1.6.1.tgz#31f696172105f232bd17543ccf305e0f33e59d1d" - integrity sha512-LtyqQpkIknaT7NnZl3vDr3TpkNcG4ABvGRXx37XJ8tJNUGtcrZBh40A0344rDwlRTfUEmynQS/grUsoSWz+HgA== +prosemirror-dropcursor@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/prosemirror-dropcursor/-/prosemirror-dropcursor-1.7.1.tgz#b6921ef866ca95b6f6c8b197767f60dc39598416" + integrity sha512-GmWk9bAwhfHwA8xmJhBFjPcebxUG9zAPYtqpIr7NTDigWZZEJCgUYyUQeqgyscLr8ZHoh9aeprX9kW7BihUT+w== dependencies: prosemirror-state "^1.0.0" prosemirror-transform "^1.1.0" prosemirror-view "^1.1.0" -prosemirror-gapcursor@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/prosemirror-gapcursor/-/prosemirror-gapcursor-1.2.2.tgz#7394613ba4a1601fad1f36f1cff8961968c22ffa" - integrity sha512-7YzuRBbu9W7HGQde84kCHfIjaRLNcAdeijbgqrm/R9dsdTWkV+rrdcmic/sCc+bptiNpvjCEE+R6hrbT8zFQeQ== +prosemirror-gapcursor@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.1.tgz#8cfd874592e4504d63720e14ed680c7866e64554" + integrity sha512-GKTeE7ZoMsx5uVfc51/ouwMFPq0o8YrZ7Hx4jTF4EeGbXxBveUV8CGv46mSHuBBeXGmvu50guoV2kSnOeZZnUA== dependencies: prosemirror-keymap "^1.0.0" prosemirror-model "^1.0.0" @@ -12028,27 +12028,27 @@ prosemirror-highlightjs@^0.2.0: resolved "https://registry.yarnpkg.com/prosemirror-highlightjs/-/prosemirror-highlightjs-0.2.0.tgz#601932dea9060f72d9e4701ce2531140d03c735c" integrity sha512-2qI/M6FTSfhtshAWfUC+tiCgJzReGQGSLc6EtXtxe5lgiqFUqfsICiyna69x8GUrO30zr5JW9acsearX8/r37w== -prosemirror-history@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/prosemirror-history/-/prosemirror-history-1.2.0.tgz#04cc4df8d2f7b2a46651a2780de191ada6d465ea" - integrity sha512-B9v9xtf4fYbKxQwIr+3wtTDNLDZcmMMmGiI3TAPShnUzvo+Rmv1GiUrsQChY1meetHl7rhML2cppF3FTs7f7UQ== +prosemirror-history@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/prosemirror-history/-/prosemirror-history-1.3.0.tgz#bf5a1ff7759aca759ddf0c722c2fa5b14fb0ddc1" + integrity sha512-qo/9Wn4B/Bq89/YD+eNWFbAytu6dmIM85EhID+fz9Jcl9+DfGEo8TTSrRhP15+fFEoaPqpHSxlvSzSEbmlxlUA== dependencies: prosemirror-state "^1.2.2" prosemirror-transform "^1.0.0" rope-sequence "^1.3.0" -prosemirror-inputrules@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/prosemirror-inputrules/-/prosemirror-inputrules-1.1.3.tgz#93f9199ca02473259c30d7e352e4c14022d54638" - integrity sha512-ZaHCLyBtvbyIHv0f5p6boQTIJjlD6o2NPZiEaZWT2DA+j591zS29QQEMT4lBqwcLW3qRSf7ZvoKNbf05YrsStw== +prosemirror-inputrules@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/prosemirror-inputrules/-/prosemirror-inputrules-1.2.0.tgz#476dde2dc244050b3aca00cf58a82adfad6749e7" + integrity sha512-eAW/M/NTSSzpCOxfR8Abw6OagdG0MiDAiWHQMQveIsZtoKVYzm0AflSPq/ymqJd56/Su1YPbwy9lM13wgHOFmQ== dependencies: prosemirror-state "^1.0.0" prosemirror-transform "^1.0.0" -prosemirror-keymap@1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/prosemirror-keymap/-/prosemirror-keymap-1.1.5.tgz#b5984c7d30f5c75956c853126c54e9e624c0327b" - integrity sha512-8SZgPH3K+GLsHL2wKuwBD9rxhsbnVBTwpHCO4VUO5GmqUQlxd/2GtBVWTsyLq4Dp3N9nGgPd3+lZFKUDuVp+Vw== +prosemirror-keymap@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prosemirror-keymap/-/prosemirror-keymap-1.2.1.tgz#3839e7db66cecddae7451f4246e73bdd8489be1d" + integrity sha512-kVK6WGC+83LZwuSJnuCb9PsADQnFZllt94qPP3Rx/vLcOUV65+IbBeH2nS5cFggPyEVJhGkGrgYFRrG250WhHQ== dependencies: prosemirror-state "^1.0.0" w3c-keyname "^2.2.0" @@ -12061,12 +12061,12 @@ prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.2: prosemirror-state "^1.0.0" w3c-keyname "^2.2.0" -prosemirror-model@1.16.1, prosemirror-model@^1.0.0, prosemirror-model@^1.16.0, prosemirror-model@^1.2.0, prosemirror-model@^1.8.1: - version "1.16.1" - resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.16.1.tgz#fb388270bc9609b66298d6a7e15d0cc1d6c61253" - integrity sha512-r1/w0HDU40TtkXp0DyKBnFPYwd8FSlUSJmGCGFv4DeynfeSlyQF2FD0RQbVEMOe6P3PpUSXM6LZBV7W/YNZ4mA== +prosemirror-model@1.19.0, prosemirror-model@^1.0.0, prosemirror-model@^1.16.0, prosemirror-model@^1.2.0, prosemirror-model@^1.8.1: + version "1.19.0" + resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.19.0.tgz#d7ad9a65ada0bb12196f64fe0dd4fc392c841c29" + integrity sha512-/CvFGJnwc41EJSfDkQLly1cAJJJmBpZwwUJtwZPTjY2RqZJfM8HVbCreOY/jti8wTRbVyjagcylyGoeJH/g/3w== dependencies: - orderedmap "^1.1.0" + orderedmap "^2.0.0" prosemirror-schema-basic@^1.0.0: version "1.1.2" @@ -12091,13 +12091,14 @@ prosemirror-schema-list@^1.0.0: prosemirror-model "^1.0.0" prosemirror-transform "^1.0.0" -prosemirror-state@1.3.3, prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.3.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/prosemirror-state/-/prosemirror-state-1.3.3.tgz#b2862866b14dec2b3ae1ab18229f2bd337651a2c" - integrity sha512-PLXh2VJsIgvlgSTH6I2Yg6vk1CzPDp21DFreVpQtDMY2S6WaMmrQgDTLRcsrD8X38v8Yc873H7+ogdGzyIPn+w== +prosemirror-state@1.4.2, prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.3.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/prosemirror-state/-/prosemirror-state-1.4.2.tgz#f93bd8a33a4454efab917ba9b738259d828db7e5" + integrity sha512-puuzLD2mz/oTdfgd8msFbe0A42j5eNudKAAPDB0+QJRw8cO1ygjLmhLrg9RvDpf87Dkd6D4t93qdef00KKNacQ== dependencies: prosemirror-model "^1.0.0" prosemirror-transform "^1.0.0" + prosemirror-view "^1.27.0" prosemirror-tables@^1.1.1: version "1.1.1" @@ -12119,17 +12120,17 @@ prosemirror-test-builder@^1.0.1: prosemirror-schema-basic "^1.0.0" prosemirror-schema-list "^1.0.0" -prosemirror-transform@1.3.4, prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.2.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.3.4.tgz#1d1997009b7b145c2aa2773f7f670c8a3d4cb46f" - integrity sha512-gTsg3UIeaFuEY6+YmNPMgTpEkCKPedkFIUnsPpOMbclU701fEVI/e4VOXACXh3BO5rZJaBbEBwrnzB0mLp6eBA== +prosemirror-transform@1.7.1, prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.2.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.7.1.tgz#b516e818c3add0bdf960f4ca8ccb9d057a3ba21b" + integrity sha512-VteoifAfpt46z0yEt6Fc73A5OID9t/y2QIeR5MgxEwTuitadEunD/V0c9jQW8ziT8pbFM54uTzRLJ/nLuQjMxg== dependencies: prosemirror-model "^1.0.0" -prosemirror-view@1.23.7, prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, prosemirror-view@^1.5.1: - version "1.23.7" - resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.23.7.tgz#f003af94445ef456e397c18cf4bb995e7072097f" - integrity sha512-ugY+g/4UI2Ree1zzdvbyQWF2KpbFa7kxKMLHaEJcxiPaErnZiD5wZFqIgFinc7fY2v/QM3DLnJ++2I45ULRdrg== +prosemirror-view@1.30.2, prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, prosemirror-view@^1.27.0, prosemirror-view@^1.5.1: + version "1.30.2" + resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.30.2.tgz#57a9d15c5baa454f0d0f4a3028ddbd9be1e8ed9b" + integrity sha512-nTNzZvalQf9kHeEyO407LiV6DoOs/pXsid88UqW9Vvybo4ozJW2PJhkfZUxCUF1hR/9vJLdhxX84wuw9P9HsXA== dependencies: prosemirror-model "^1.16.0" prosemirror-state "^1.0.0"