@blocknote/core
Version:
A "Notion-style" block-based extensible text editor built on top of Prosemirror and Tiptap.
2 lines • 16.1 kB
JavaScript
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./blocks-BqHv0xhc.cjs"),t=require("./BlockNoteExtension-M0znTzxP.cjs"),n=require("./ThreadStore-Bx-gSEh1.cjs");let r=require("prosemirror-model"),i=require("lib0/random"),a=require("@tiptap/pm/state"),o=require("y-prosemirror"),s=require("yjs");s=e.tr(s,1);function c(e,t){let n=e.doc;if(!n)throw Error(`type does not have a ydoc`);if(e._item===null){let r=Array.from(n.share.keys()).find(t=>n.share.get(t)===e);if(r==null)throw Error(`type does not exist in other ydoc`);return t.get(r,e.constructor)}else{let n=e._item,r=t.store.clients.get(n.id.client)??[],i=r[s.findIndexSS(r,n.id.clock)];if(!i)throw Error(`type does not exist in other ydoc`);let a=i.content;if(!a)throw Error(`type does not exist in other ydoc`);return a.type}}function l(t,n){return e.vn(t.pmSchema.nodeFromJSON(n))}function u(t,n){let r=n.map(n=>e.jt(n,t.pmSchema));return t.pmSchema.topNodeType.create(null,t.pmSchema.nodes.blockGroup.create(null,r))}function d(t,n){return e.vn((0,o.yXmlFragmentToProseMirrorRootNode)(n,t.pmSchema))}function f(e,t,n){return(0,o.prosemirrorToYXmlFragment)(u(e,t),n)}function p(e,t,n=`prosemirror`){return d(e,t.getXmlFragment(n))}function m(e,t,n=`prosemirror`){return(0,o.prosemirrorToYDoc)(u(e,t),n)}var h=t.t(({editor:t})=>(t.on(`create`,()=>{let n=t.pmSchema,i,a=n.nodes.doc.createAndFill;n.nodes.doc.createAndFill=((...e)=>{if(i)return i;let t=a.apply(n.nodes.doc,e),o=JSON.parse(JSON.stringify(t.toJSON()));return o.content[0].content[0].attrs.id=`initialBlockId`,i=r.Node.fromJSON(n,o),i});let o=n.node;n.node=function(t,n,r,i){let a=typeof t==`string`?this.nodes[t]:t;return a&&e.On(this,a)&&Array.isArray(r)&&(r=r.map(e=>e?.isText&&e.marks.length?e.mark(a.allowedMarks(e.marks)):e)),o.call(this,t,n,r,i)}}),{key:`fixUpSchema`}));function g(e){let t=e.charAt(0)===`#`?e.substring(1,7):e,n=parseInt(t.substring(0,2),16),r=parseInt(t.substring(2,4),16),i=parseInt(t.substring(4,6),16),a=[n/255,r/255,i/255].map(e=>e<=.03928?e/12.92:((e+.055)/1.055)**2.4);return .2126*a[0]+.7152*a[1]+.0722*a[2]<=.179}function _(e){let t=document.createElement(`span`);t.classList.add(`bn-collaboration-cursor__base`);let n=document.createElement(`span`);n.setAttribute(`contentedEditable`,`false`),n.classList.add(`bn-collaboration-cursor__caret`),n.setAttribute(`style`,`background-color: ${e.color}; color: ${g(e.color)?`white`:`black`}`);let r=document.createElement(`span`);return r.classList.add(`bn-collaboration-cursor__label`),r.setAttribute(`style`,`background-color: ${e.color}; color: ${g(e.color)?`white`:`black`}`),r.insertBefore(document.createTextNode(e.name),null),n.insertBefore(r,null),t.insertBefore(document.createTextNode(``),null),t.insertBefore(n,null),t.insertBefore(document.createTextNode(``),null),t}var v=t.t(({options:e})=>{let t=new Map,n=e.provider&&`awareness`in e.provider&&typeof e.provider.awareness==`object`?e.provider.awareness:void 0;n&&`setLocalStateField`in n&&typeof n.setLocalStateField==`function`&&n.setLocalStateField(`user`,e.user);let r=({updated:e})=>{for(let n of e){let e=t.get(n);e&&(setTimeout(()=>{e.element.setAttribute(`data-active`,``)},10),e.hideTimeout&&clearTimeout(e.hideTimeout),t.set(n,{element:e.element,hideTimeout:setTimeout(()=>{e.element.removeAttribute(`data-active`)},2e3)}))}};return{key:`yCursor`,mount(){if(n&&e.showCursorLabels!==`always`&&`on`in n&&typeof n.on==`function`)return n.on(`change`,r),()=>{`off`in n&&typeof n.off==`function`&&n.off(`change`,r)}},prosemirrorPlugins:[n?(0,o.yCursorPlugin)(n,{selectionBuilder:o.defaultSelectionBuilder,cursorBuilder(n,r){let i=t.get(r);if(!i){let a=(e.renderCursor??_)(n);e.showCursorLabels!==`always`&&(a.addEventListener(`mouseenter`,()=>{let e=t.get(r);e.element.setAttribute(`data-active`,``),e.hideTimeout&&(clearTimeout(e.hideTimeout),t.set(r,{element:e.element,hideTimeout:void 0}))}),a.addEventListener(`mouseleave`,()=>{let e=t.get(r);t.set(r,{element:e.element,hideTimeout:setTimeout(()=>{e.element.removeAttribute(`data-active`)},2e3)})})),i={element:a,hideTimeout:void 0},t.set(r,i)}return i.element}}):void 0].filter(Boolean),dependsOn:[`ySync`],updateUser(e){n?.setLocalStateField(`user`,e)},getUser(){let e=n?.getLocalState();if(e)return e.user}}}),y=t.t(({options:e})=>({key:`ySync`,prosemirrorPlugins:[(0,o.ySyncPlugin)(e.fragment)],runsBefore:[`default`]})),b=t.t(()=>({key:`yUndo`,prosemirrorPlugins:[(0,o.yUndoPlugin)()],dependsOn:[`yCursor`,`ySync`],undoCommand:o.undoCommand,redoCommand:o.redoCommand})),x=t.t(({editor:e,options:n})=>{let r,i=t.n({isForked:!1});return{key:`yForkDoc`,store:i,fork({initialUpdate:t}={}){if(r)return;let a=n.fragment;if(!a)throw Error(`No fragment to fork from`);let l=new s.Doc;s.applyUpdate(l,t??s.encodeStateAsUpdate(a.doc));let u=c(a,l);r={undoStack:o.yUndoPluginKey.getState(e.prosemirrorState).undoManager.undoStack,originalFragment:a,forkedFragment:u};let d={...n,fragment:u};e.replaceExtension([`ySync`,`yCursor`,`yUndo`],[y(d),b()]),i.setState({isForked:!0})},merge({keepChanges:t}){if(!r)return;let{originalFragment:a,forkedFragment:c,undoStack:l}=r;if(e.replaceExtension([`ySync`,`yCursor`,`yUndo`],[y(n),v(n),b()]),o.yUndoPluginKey.getState(e.prosemirrorState).undoManager.undoStack=l,t){let t=s.encodeStateAsUpdate(c.doc,s.encodeStateVector(a.doc));s.applyUpdate(a.doc,t,e)}r=void 0,i.setState({isForked:!1})}}}),S=t.t(({editor:e})=>({key:`yPositionMapping`,mapPosition:(t,n=`left`)=>{let r=o.ySyncPluginKey.getState(e.prosemirrorState);if(!r)throw Error(`YSync plugin state not found`);if(t===0)return()=>0;if(r.binding.type.length===0){let r=e.getExtension(`positionMapping`);if(!r)throw Error(`positionMapping extension is not available; cannot map position before sync`);return r.mapPosition(t,n)}let i=(0,o.absolutePositionToRelativePosition)(t+(n===`right`?1:-1),r.binding.type,r.binding.mapping);return()=>{let t=o.ySyncPluginKey.getState(e.prosemirrorState),r=(0,o.relativePositionToAbsolutePosition)(t.doc,t.binding.type,i,t.binding.mapping);if(r===null)throw Error(`Position not found, cannot track positions`);return r+(n===`right`?-1:1)}}})),C=(e,t)=>{t(e),e.forEach(e=>{e instanceof s.XmlElement&&C(e,t)})},w=[(t,n)=>{let r=new Map;return t.forEach(t=>{t instanceof s.XmlElement&&C(t,t=>{if(t.nodeName===`blockContainer`&&t.hasAttribute(`id`)){let n=t.getAttribute(`textColor`),i=t.getAttribute(`backgroundColor`),a={textColor:n===e.vt.textColor.default?void 0:n,backgroundColor:i===e.vt.backgroundColor.default?void 0:i};(a.textColor||a.backgroundColor)&&r.set(t.getAttribute(`id`),a)}})}),r.size===0?!1:(n.doc.descendants((e,t)=>{if(e.type.name===`blockContainer`&&r.has(e.attrs.id)){let i=n.doc.nodeAt(t+1);if(!i)throw Error(`No element found`);n.setNodeMarkup(t+1,void 0,{...i.attrs,...r.get(e.attrs.id)})}}),!0)}],T=t.t(({options:e})=>{let t=!1;return{key:`schemaMigration`,prosemirrorPlugins:[new a.Plugin({key:new a.PluginKey(`schemaMigration`),appendTransaction:(n,r,i)=>{if(t||!n.some(e=>e.getMeta(`y-sync$`))||n.every(e=>!e.docChanged)||!e.fragment.firstChild)return;let a=i.tr;for(let t of w)t(e.fragment,a);if(t=!0,a.docChanged)return a}})]}});function E(e,t){let{fragment:n}=t;function r(){let t=e.getExtension(x);if(!t)throw Error(`ForkYDocExtension is required for the Yjs versioning adapter. Make sure it is registered before the VersioningExtension.`);return t}return{getCurrentDocument:()=>n,serializeCurrentContent:()=>s.encodeStateAsUpdateV2(n.doc),preview:{supportsComparison:!1,enterPreview(e,t){let n=r();n.store.state.isForked&&n.merge({keepChanges:!1}),n.fork({initialUpdate:e})},exitPreview(){let e=r();e.store.state.isForked&&e.merge({keepChanges:!1})},applyRestore(e){throw Error(`Restore is not yet implemented for Yjs v13 versioning adapter.`)}}}}var D=t.t(({options:e})=>({key:`collaboration`,blockNoteExtensions:[h(),x(e),S(),T(e),v(e),y(e),b()]}));function O(e){return{...e,extensions:[...e.extensions??[],D(e.collaboration)],disableExtensions:[`history`,...e.disableExtensions??[]],initialContent:[{type:`paragraph`,id:`initialBlockId`}]}}function k(e){let t=new s.Map;if(t.set(`id`,e.id),t.set(`userId`,e.userId),t.set(`createdAt`,e.createdAt.getTime()),t.set(`updatedAt`,e.updatedAt.getTime()),e.deletedAt?(t.set(`deletedAt`,e.deletedAt.getTime()),t.set(`body`,void 0)):t.set(`body`,e.body),e.reactions.length>0)throw Error(`Reactions should be empty in commentToYMap`);return t.set(`reactionsByUser`,new s.Map),t.set(`metadata`,e.metadata),t}function A(e){let t=new s.Map;t.set(`id`,e.id),t.set(`createdAt`,e.createdAt.getTime()),t.set(`updatedAt`,e.updatedAt.getTime());let n=new s.Array;return n.push(e.comments.map(e=>k(e))),t.set(`comments`,n),t.set(`resolved`,e.resolved),t.set(`resolvedUpdatedAt`,e.resolvedUpdatedAt?.getTime()),t.set(`resolvedBy`,e.resolvedBy),t.set(`metadata`,e.metadata),t}function j(e){return{emoji:e.get(`emoji`),createdAt:new Date(e.get(`createdAt`)),userId:e.get(`userId`)}}function M(e){return[...e.values()].map(e=>j(e)).reduce((e,t)=>{let n=e.find(e=>e.emoji===t.emoji);return n?(n.userIds.push(t.userId),n.createdAt=new Date(Math.min(n.createdAt.getTime(),t.createdAt.getTime()))):e.push({emoji:t.emoji,createdAt:t.createdAt,userIds:[t.userId]}),e},[])}function N(e){return{type:`comment`,id:e.get(`id`),userId:e.get(`userId`),createdAt:new Date(e.get(`createdAt`)),updatedAt:new Date(e.get(`updatedAt`)),deletedAt:e.get(`deletedAt`)?new Date(e.get(`deletedAt`)):void 0,reactions:M(e.get(`reactionsByUser`)),metadata:e.get(`metadata`),body:e.get(`body`)}}function P(e){return{type:`thread`,id:e.get(`id`),createdAt:new Date(e.get(`createdAt`)),updatedAt:new Date(e.get(`updatedAt`)),comments:(e.get(`comments`)||[]).map(e=>N(e)),resolved:e.get(`resolved`),resolvedUpdatedAt:new Date(e.get(`resolvedUpdatedAt`)),resolvedBy:e.get(`resolvedBy`),metadata:e.get(`metadata`)}}var F=class extends n.t{threadsYMap;constructor(e,t){super(t),this.threadsYMap=e}getThread(e){let t=this.threadsYMap.get(e);if(!t)throw Error(`Thread not found`);return P(t)}getThreads(){let e=new Map;return this.threadsYMap.forEach((t,n)=>{t instanceof s.Map&&e.set(n,P(t))}),e}subscribe(e){let t=()=>{e(this.getThreads())};return this.threadsYMap.observeDeep(t),()=>{this.threadsYMap.unobserveDeep(t)}}},I=class extends F{BASE_URL;headers;constructor(e,t,n,r){super(n,r),this.BASE_URL=e,this.headers=t}doRequest=async(e,t,n)=>{let r=await fetch(`${this.BASE_URL}${e}`,{method:t,body:JSON.stringify(n),headers:{"Content-Type":`application/json`,...this.headers}});if(!r.ok)throw Error(`Failed to ${t} ${e}: ${r.statusText}`);return r.json()};addThreadToDocument=async e=>{let{threadId:t,selection:n}=e,r=o.ySyncPluginKey.getState(e.editor.prosemirrorState),i=r?{head:(0,o.absolutePositionToRelativePosition)(n.head,r.type,r.mapping),anchor:(0,o.absolutePositionToRelativePosition)(n.anchor,r.type,r.mapping)}:void 0;return this.doRequest(`/${t}/addToDocument`,`POST`,{selection:{prosemirror:n,yjs:i}})};createThread=async e=>this.doRequest(``,`POST`,e);addComment=e=>{let{threadId:t,...n}=e;return this.doRequest(`/${t}/comments`,`POST`,n)};updateComment=e=>{let{threadId:t,commentId:n,...r}=e;return this.doRequest(`/${t}/comments/${n}`,`PUT`,r)};deleteComment=e=>{let{threadId:t,commentId:n,...r}=e;return this.doRequest(`/${t}/comments/${n}?soft=${!!r.softDelete}`,`DELETE`)};deleteThread=e=>this.doRequest(`/${e.threadId}`,`DELETE`);resolveThread=e=>this.doRequest(`/${e.threadId}/resolve`,`POST`);unresolveThread=e=>this.doRequest(`/${e.threadId}/unresolve`,`POST`);addReaction=e=>{let{threadId:t,commentId:n,...r}=e;return this.doRequest(`/${t}/comments/${n}/reactions`,`POST`,r)};deleteReaction=e=>this.doRequest(`/${e.threadId}/comments/${e.commentId}/reactions/${e.emoji}`,`DELETE`)},L=class extends F{userId;constructor(e,t,n){super(t,n),this.userId=e}transact=e=>async t=>this.threadsYMap.doc.transact(()=>e(t));createThread=this.transact(e=>{if(!this.auth.canCreateThread())throw Error(`Not authorized`);let t=new Date,n={type:`comment`,id:(0,i.uuidv4)(),userId:this.userId,createdAt:t,updatedAt:t,reactions:[],metadata:e.initialComment.metadata,body:e.initialComment.body},r={type:`thread`,id:(0,i.uuidv4)(),createdAt:t,updatedAt:t,comments:[n],resolved:!1,metadata:e.metadata};return this.threadsYMap.set(r.id,A(r)),r});addThreadToDocument=void 0;addComment=this.transact(e=>{let t=this.threadsYMap.get(e.threadId);if(!t)throw Error(`Thread not found`);if(!this.auth.canAddComment(P(t)))throw Error(`Not authorized`);let n=new Date,r={type:`comment`,id:(0,i.uuidv4)(),userId:this.userId,createdAt:n,updatedAt:n,deletedAt:void 0,reactions:[],metadata:e.comment.metadata,body:e.comment.body};return t.get(`comments`).push([k(r)]),t.set(`updatedAt`,new Date().getTime()),r});updateComment=this.transact(e=>{let t=this.threadsYMap.get(e.threadId);if(!t)throw Error(`Thread not found`);let n=R(t.get(`comments`),t=>t.get(`id`)===e.commentId);if(n===-1)throw Error(`Comment not found`);let r=t.get(`comments`).get(n);if(!this.auth.canUpdateComment(N(r)))throw Error(`Not authorized`);r.set(`body`,e.comment.body),r.set(`updatedAt`,new Date().getTime()),r.set(`metadata`,e.comment.metadata)});deleteComment=this.transact(e=>{let t=this.threadsYMap.get(e.threadId);if(!t)throw Error(`Thread not found`);let n=R(t.get(`comments`),t=>t.get(`id`)===e.commentId);if(n===-1)throw Error(`Comment not found`);let r=t.get(`comments`).get(n);if(!this.auth.canDeleteComment(N(r)))throw Error(`Not authorized`);if(r.get(`deletedAt`))throw Error(`Comment already deleted`);e.softDelete?(r.set(`deletedAt`,new Date().getTime()),r.set(`body`,void 0)):t.get(`comments`).delete(n),t.get(`comments`).toArray().every(e=>e.get(`deletedAt`))&&(e.softDelete?t.set(`deletedAt`,new Date().getTime()):this.threadsYMap.delete(e.threadId)),t.set(`updatedAt`,new Date().getTime())});deleteThread=this.transact(e=>{if(!this.auth.canDeleteThread(P(this.threadsYMap.get(e.threadId))))throw Error(`Not authorized`);this.threadsYMap.delete(e.threadId)});resolveThread=this.transact(e=>{let t=this.threadsYMap.get(e.threadId);if(!t)throw Error(`Thread not found`);if(!this.auth.canResolveThread(P(t)))throw Error(`Not authorized`);t.set(`resolved`,!0),t.set(`resolvedUpdatedAt`,new Date().getTime()),t.set(`resolvedBy`,this.userId)});unresolveThread=this.transact(e=>{let t=this.threadsYMap.get(e.threadId);if(!t)throw Error(`Thread not found`);if(!this.auth.canUnresolveThread(P(t)))throw Error(`Not authorized`);t.set(`resolved`,!1),t.set(`resolvedUpdatedAt`,new Date().getTime())});addReaction=this.transact(e=>{let t=this.threadsYMap.get(e.threadId);if(!t)throw Error(`Thread not found`);let n=R(t.get(`comments`),t=>t.get(`id`)===e.commentId);if(n===-1)throw Error(`Comment not found`);let r=t.get(`comments`).get(n);if(!this.auth.canAddReaction(N(r),e.emoji))throw Error(`Not authorized`);let i=new Date,a=`${this.userId}-${e.emoji}`,o=r.get(`reactionsByUser`);if(!o.has(a)){let t=new s.Map;t.set(`emoji`,e.emoji),t.set(`createdAt`,i.getTime()),t.set(`userId`,this.userId),o.set(a,t)}});deleteReaction=this.transact(e=>{let t=this.threadsYMap.get(e.threadId);if(!t)throw Error(`Thread not found`);let n=R(t.get(`comments`),t=>t.get(`id`)===e.commentId);if(n===-1)throw Error(`Comment not found`);let r=t.get(`comments`).get(n);if(!this.auth.canDeleteReaction(N(r),e.emoji))throw Error(`Not authorized`);let i=`${this.userId}-${e.emoji}`;r.get(`reactionsByUser`).delete(i)})};function R(e,t){for(let n=0;n<e.length;n++)if(t(e.get(n)))return n;return-1}exports.CollaborationExtension=D,exports.ForkYDocExtension=x,exports.RESTYjsThreadStore=I,exports.RelativePositionMappingExtension=S,exports.SchemaMigration=T,exports.YCursorExtension=v,exports.YSyncExtension=y,exports.YUndoExtension=b,exports.YjsThreadStore=L,exports.YjsThreadStoreBase=F,exports._blocksToProsemirrorNode=u,exports._prosemirrorJSONToBlocks=l,exports.blocksToYDoc=m,exports.blocksToYXmlFragment=f,exports.createYjsVersioningAdapter=E,exports.findTypeInOtherYdoc=c,exports.withCollaboration=O,exports.yDocToBlocks=p,exports.yXmlFragmentToBlocks=d;
//# sourceMappingURL=yjs.cjs.map