UNPKG

@blocknote/core

Version:

A "Notion-style" block-based extensible text editor built on top of Prosemirror and Tiptap.

2 lines 28.7 kB
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./blocks-CzkqclGj.cjs"),t=require("./BlockNoteExtension-BJCLnwrE.cjs"),n=require("./src-DM3syMdf.cjs"),r=require("./extensions-CSB9ZvuL.cjs"),i=require("./UserStore-mj3fXW4D.cjs"),a=require("./ThreadStore-Bx-gSEh1.cjs");let o=require("@tiptap/core"),s=require("lib0/random"),c=require("prosemirror-state"),l=require("@y/prosemirror"),u=require("lib0/delta");u=e.cr(u,1);let d=require("@y/y");d=e.cr(d,1);let f=require("lib0/buffer");var p=(e,t)=>e===void 0?void 0:typeof e==`string`?e:e[t],m=(e,t)=>({mark:r,inline:i})=>{let a=t?.editor,o=e===`insert`?`ins`:e===`delete`?`del`:i?`span`:`div`,s=document.createElement(o);Object.assign(s.dataset,{userIds:JSON.stringify(r.attrs.userIds),inline:String(i)}),e===`modification`&&(s.dataset.type=`modification`,s.dataset.format=JSON.stringify(r.attrs.format));let c=p(t?.getAttributionMarkClassName?.({contentType:i?`inline-content`:`block`,modificationType:e===`modification`?`format`:e}),`content`),l=(r.attrs.userIds??[])[0],u=l?n.y(l):n.b[0];if(c)s.style.cssText=`display: contents`;else{let e=l?`var(${n.x(l).light}, ${u.light})`:u.light,t=l?`var(${n.x(l).dark}, ${u.dark})`:u.dark;s.style.cssText=`display: contents; --user-color-light: ${e}; --user-color-dark: ${t}`}let d=document.createElement(`span`);if(i)d.className=c??(e===`delete`?`bn-suggestion-mark bn-suggestion-mark--delete`:`bn-suggestion-mark`);else if(d.style.display=`contents`,d.className=c??(e===`delete`?`bn-suggestion-node bn-suggestion-node--delete`:`bn-suggestion-node`),e===`delete`){let e=a?.dictionary.suggestion_changes.deleted;e&&d.style.setProperty(`--deleted-label`,JSON.stringify(e))}return s.appendChild(d),{dom:s,contentDOM:d}},h=o.Mark.create({name:`y-attributed-insert`,inclusive:!1,excludes:``,group:`${e.O} ${t.a}`,addAttributes(){return{userIds:{default:null}}},addMarkView(){return m(`insert`,{getAttributionMarkClassName:this.options.getAttributionMarkClassName})},extendMarkSchema(e){return e.name===this.name?{blocknoteIgnore:!0}:{}}}),g=o.Mark.create({name:`y-attributed-delete`,inclusive:!1,excludes:``,group:`${e.O} ${t.a}`,addAttributes(){return{userIds:{default:null}}},addMarkView(){return m(`delete`,{editor:this.options.editor,getAttributionMarkClassName:this.options.getAttributionMarkClassName})},extendMarkSchema(e){return e.name===this.name?{blocknoteIgnore:!0}:{}}}),_=o.Mark.create({name:`y-attributed-format`,inclusive:!1,excludes:``,group:`${e.O} ${t.a}`,addAttributes(){return{userIds:{default:null},format:{default:null}}},addMarkView(){return m(`modification`,{getAttributionMarkClassName:this.options.getAttributionMarkClassName})},extendMarkSchema(e){return e.name===this.name?{blocknoteIgnore:!0}:{}}}),v=t.t(({options:e})=>({key:`yAttributionMarks`,tiptapExtensions:[h.configure({getAttributionMarkClassName:e?.getAttributionMarkClassName}),g.configure({getAttributionMarkClassName:e?.getAttributionMarkClassName}),_.configure({getAttributionMarkClassName:e?.getAttributionMarkClassName})]})),y={"y-attributed-insert":`insert`,"y-attributed-delete":`delete`,"y-attributed-format":`format`},ee=new c.PluginKey(`attributionLoadUsers`),b=`[data-user-ids]`,x=e=>{if(!e)return[];let t;try{t=JSON.parse(e)}catch{return[]}return Array.isArray(t)?t.map(String):[]},S=e=>{if(!e)return[];let t;try{t=JSON.parse(e)}catch{return[]}return typeof t!=`object`||!t?[]:Object.keys(t)},C=e=>{let t=e.firstElementChild??e,n=t.getBoundingClientRect();return n.width||n.height?t:t.firstElementChild??t},w=e=>C(e).getBoundingClientRect(),te=e=>C(e).getClientRects(),T=t.t(({options:e})=>{let r=i.n(e?.resolveUsers),a=e?.getAttributionMarkClassName,s=t.n(void 0),l=e=>{let t=(0,o.getChangedRanges)(e);if(t.length===0)return;let n=1/0,i=-1/0;for(let{newRange:e}of t)n=Math.min(n,e.from),i=Math.max(i,e.to);let a=new Set;e.doc.nodesBetween(n,i,e=>{for(let t of e.marks)y[t.type.name]&&t.attrs.userIds?.forEach(e=>a.add(e));return!0}),a.size>0&&r.loadUsers(Array.from(a))};return{key:`attribution`,userStore:r,store:s,prosemirrorPlugins:[new c.Plugin({key:ee,state:{init:()=>null,apply:e=>(e.docChanged&&l(e),null)}})],mount({dom:e,root:t,signal:i}){let o=()=>{for(let[t,i]of r.store.state){let{light:r,dark:a}=n.x(t);i.color&&i.colorLight?(e.style.setProperty(r,i.colorLight),e.style.setProperty(a,i.color)):(e.style.removeProperty(r),e.style.removeProperty(a))}},c,l=e=>x(e).map(e=>r.getUser(e)?.username??e),u=e=>{let t=x(e.dataset.userIds);return t.length===0?``:`${S(e.dataset.format).join(`,`)}:${t.join(`,`)}`},d=e=>{let t=e.dataset.format!==void 0,i=t?`format`:e.tagName===`INS`?`insert`:`delete`,o=e.dataset.inline===`false`?`block`:`inline-content`;return{anchor:e,color:n._(r,x(e.dataset.userIds)).dark,modificationType:i,contentType:o,users:l(e.dataset.userIds),format:t?S(e.dataset.format):void 0,className:p(a?.({contentType:o,modificationType:i}),`tooltip`)}},f=()=>{c&&(c=void 0,s.setState(void 0))},m=e=>{for(;e;){let t=e.closest(b);if(!t)return;if(u(t))return t;e=t.parentElement}};t.addEventListener(`mouseover`,e=>{let t=e.target instanceof Element?e.target:null,n=m(t);if(!n){f();return}let i=u(n),a=n,o=n.parentElement;for(;o;){let e=o.closest(b);if(!e)break;let t=u(e);if(t===i)a=e;else if(t)break;o=e.parentElement}if(c===a)return;c=a,s.setState(d(a));let l=x(a.dataset.userIds);l.length>0&&r.loadUsers(l).then(()=>{c===a&&s.setState(d(a))})},{signal:i}),i.addEventListener(`abort`,f),o();let h=r.store.subscribe(o);i.addEventListener(`abort`,h)},blockNoteExtensions:[v({getAttributionMarkClassName:e?.getAttributionMarkClassName})]}}),E=t.t(({editor:e})=>({key:`yPositionMapping`,mapPosition:(t,n=`left`)=>{let r=l.ySyncPluginKey.getState(e.prosemirrorState);if(!r?.ytype)throw Error(`YSync plugin state not found`);if(t===0)return()=>0;let i=(0,l.relativePositionStore)(e.prosemirrorState.doc.resolve(t+(n===`right`?1:-1)),r.ytype,r.renderer);return()=>{let t=l.ySyncPluginKey.getState(e.prosemirrorState),r=i(e.prosemirrorState.doc,t.ytype,t.renderer);if(r===null)throw Error(`Position not found, cannot track positions`);return r+(n===`right`?-1:1)}}})),D=e=>{for(let t of e.children)if(u.$insertOp.check(t)){for(let e of t.insert)if(u.$deltaAny.check(e))return e}return null},O=e=>{for(let t of e.children)if(u.$insertOp.check(t)){for(let e of t.insert)if(u.$deltaAny.check(e)&&e.name===`blockGroup`)return!0}return!1};function k(e){if(e.name!==`table`)return null;let t=[];for(let n of e.children)if(u.$insertOp.check(n))for(let e of n.insert){if(e.name!==`tableRow`)return null;let n=[];for(let t of e.children)if(u.$insertOp.check(t))for(let e of t.insert){if(e.name!==`tableCell`&&e.name!==`tableHeader`)return null;n.push({colspan:Number(e.attrs.colspan)||1,rowspan:Number(e.attrs.rowspan)||1})}t.push(n)}if(t.length===0)return null;let n=[];for(let e=0;e<t.length;e++){n[e]||(n[e]=[]);let r=0;for(let i of t[e]){for(;n[e][r];)r++;for(let t=0;t<i.rowspan;t++){n[e+t]||(n[e+t]=[]);for(let a=0;a<i.colspan;a++)n[e+t][r+a]=!0}r+=i.colspan}}let r=Math.max(...n.map(e=>e.length));return{rows:t.length,cols:r}}var A=(e,t)=>{if(e.name!==t.name)return!1;if(e.name!==`blockContainer`)return!0;let n=D(e),r=D(t);if(n?.name!==r?.name||O(e)!==O(t))return!1;if(n?.name===`table`&&r?.name===`table`){let e=k(n),t=k(r);if(e!==null&&t!==null&&e.rows!==t.rows&&e.cols!==t.cols)return!1}return!0},j=(e,t)=>{let n={...e};return t.insert&&(n[`y-attributed-insert`]={userIds:t.insert}),t.delete&&(n[`y-attributed-delete`]={userIds:t.delete}),t.format&&(n[`y-attributed-format`]={userIds:[...new Set(Object.values(t.format).flat())],format:t.format}),n},M=t.t(({options:e,editor:t})=>({key:`ySync`,fragment:e.fragment,mount:()=>{let n=()=>{t.exec((0,l.configureYProsemirror)({ytype:e.fragment}))};if(e.provider&&`synced`in e.provider&&typeof e.provider.synced==`boolean`){if(e.provider.synced)n();else if(`on`in e.provider&&typeof e.provider.on==`function`)e.provider.on(`synced`,e=>{e&&n()});else throw Error(`YSyncExtension: provider must have a 'synced' boolean or an 'on' method to listen for 'sync'`)}else n()},prosemirrorPlugins:[(0,l.syncPlugin)({suggestionDoc:e.suggestionDoc,mapAttributionToMark:j,customCompare:A})],runsBefore:[`default`]}));function N(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)}{let n=e._item,r=t.store.clients.get(n.id.client)??[],i=r[d.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 ne(t,n){let r=t.pmSchema.nodeFromJSON(n);return e.wn(r)}function P(t,n){let r=n.map(n=>e.It(n,t.pmSchema));return t.pmSchema.topNodeType.create(null,t.pmSchema.nodes.blockGroup.create(null,r))}function F(t,n){let r=(0,l.deltaToPNode)(n.toDeltaDeep(),t.pmSchema,null);return r===null?[]:e.wn(r)}function re(e,t,n){return n||=new d.Doc().get(`prosemirror`),(0,l.pmToFragment)(P(e,t),n)}function ie(e,t,n=`prosemirror`){return F(e,t.get(n))}function ae(e,t,n=`prosemirror`){let r=(0,l.docToDelta)(P(e,t)),i=new d.Doc;return i.get(n).applyDelta(r),i}function I(e,t){let n=(0,l.nodeToDelta)(e),r=(0,l.nodeToDelta)(t);return u.diff(n.done(),r.done(),{compare:A})}function L({tr:e,fragment:t,renderer:n}){let r=(0,l.deltaAttributionToFormat)(t.toDeltaDeep({renderer:n}),j),i=(0,l.nodeToDelta)(e.doc,void 0,!0),a=u.diff(i.done(),r.done(),{compare:A});return(0,l.deltaToPSteps)(e,a,void 0,void 0)}var R=t.t(({editor:e,options:t})=>{let n=t.suggestionDoc;if(!n)throw Error(`Suggestion doc not found`);let r=i.n(t.resolveUsers);function a(t){let n=e.prosemirrorView.nodeDOM(t);for(;n&&n.parentElement;){if(n.nodeName===`INS`||n.nodeName===`DEL`)return n;n=n.parentElement}return null}function s(t,n){return e.transact(r=>{let i=r.doc.resolve(t),a=i.marks().find(e=>e.type.name===n);if(!a)return;let s=(0,o.getMarkRange)(i,a.type);if(s)return{range:s,mark:a,get text(){return r.doc.textBetween(s.from,s.to)},get position(){return(0,o.posToDOMRect)(e.prosemirrorView,s.from,s.to).toJSON()}}})}function c(){return e.transact(e=>{let t=e.selection;if(t.empty)return s(t.anchor,`insertion`)||s(t.anchor,`deletion`)||s(t.anchor,`modification`)})}return{key:`suggestions`,userStore:r,runsBefore:[`ySync`],viewSuggestions:()=>{t.renderer&&(t.renderer.suggestionMode=!1),e.exec((0,l.configureYProsemirror)({ytype:N(t.fragment,n),renderer:t.renderer}))},enableSuggestions:()=>{t.renderer&&(t.renderer.suggestionMode=!0),e.exec((0,l.configureYProsemirror)({ytype:N(t.fragment,n),renderer:t.renderer}))},disableSuggestions:()=>{e.exec((0,l.configureYProsemirror)({ytype:t.fragment,renderer:null}))},applyAllSuggestions:()=>e.exec((0,l.acceptAllChanges)()),applySuggestion:(t,n)=>e.exec((0,l.acceptChanges)(t,n)),revertSuggestion:(t,n)=>e.exec((0,l.rejectChanges)(t,n)),revertAllSuggestions:()=>e.exec((0,l.rejectAllChanges)()),getSuggestionElementAtPos:a,getMarkAtPos:s,getSuggestionAtSelection:c,getSuggestionAtCoords:t=>e.transact(()=>{let n=e.prosemirrorView.posAtCoords(t);if(n!==null&&n?.inside!==-1)return s(n.pos,`y-attributed-insert`)||s(n.pos,`y-attributed-delete`)||s(n.pos,`y-attributed-format`)}),checkUnresolvedSuggestions:()=>{let t=!1;return e.prosemirrorState.doc.descendants(e=>!t&&(t=e.marks.findIndex(e=>e.type.name===`y-attributed-insert`||e.type.name===`y-attributed-delete`||e.type.name===`y-attributed-format`)!==-1,!0)),t}}});function z(e){e.exec(l.pauseSync),e.removeBlocks(e.document)}function B(e,t){return{getCurrentDocument:()=>t,serializeCurrentContent:()=>d.encodeStateAsUpdateV2(t.doc),preview:{enterPreview:(n,r,i)=>{let a;if(r){let e=new d.Doc({isSuggestionDoc:!0});d.applyUpdateV2(e,r),a={fragment:N(t,e)}}let o=new d.Doc;d.applyUpdateV2(o,n),z(e),e.exec((e,n)=>{let r=L({tr:e.tr,fragment:N(t,o),renderer:a?d.createDiffRenderer(a.fragment.doc,o,i?{attrs:i}:void 0):void 0});return n&&n(r),!0})},exitPreview:()=>{z(e),e.exec((0,l.configureYProsemirror)({ytype:t}))},applyRestore:e=>{}}}}function V(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 oe(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: ${V(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: ${V(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 H=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;return n&&(`setLocalStateField`in n&&typeof n.setLocalStateField==`function`&&n.setLocalStateField(`user`,e.user),`on`in n&&typeof n.on==`function`&&e.showCursorLabels!==`always`&&n.on(`change`,({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)}))}})),{key:`yCursor`,prosemirrorPlugins:[n?(0,l.yCursorPlugin)(n,{selectionBuilder:l.defaultSelectionBuilder,cursorBuilder(n,r){let i=t.get(r);if(!i){let a=(e.renderCursor??oe)(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(e=>e!==void 0),dependsOn:[`ySync`],updateUser(e){n?.setLocalStateField(`user`,e)},getUser(){let e=n?.getLocalState();if(e)return e.user}}}),U=`version:`,se=e=>U+e,W=`This version`,G=`#4363d8`;function ce(e,t){let n=new d.Attributions;return e.on(`beforeObserverCalls`,e=>{e.insertSet.isEmpty()||d.insertIntoIdMap(n.inserts,d.createIdMapFromIdSet(e.insertSet,[d.createContentAttribute(`insert`,t)])),e.deleteSet.isEmpty()||d.insertIntoIdMap(n.deletes,d.createIdMapFromIdSet(e.deleteSet,[d.createContentAttribute(`delete`,t)]))}),n}var le=t.t(({options:e,editor:t})=>{let n=e?.color??G;return{key:`diffVersioning`,blockNoteExtensions:[T({resolveUsers:async e=>e.filter(e=>e.startsWith(U)).map(e=>({id:e,username:e.slice(8),avatarUrl:``,color:n})),getAttributionMarkClassName:e?.getAttributionMarkClassName})],renderDiff:(e,n,r=W)=>{let i=se(r);if(!t.pmSchema.marks[`y-attributed-insert`])throw Error(`DiffVersioningExtension: the y-attributed-* marks are missing from the schema. This should not happen — the extension registers them via AttributionExtension.`);let a=P(t,n),o=P(t,e),s=new d.Doc({gc:!1}),c=s.get(`prosemirror`);s.transact(()=>{c.applyDelta((0,l.docToDelta)(a))});let u=new d.Doc({gc:!1});d.applyUpdateV2(u,d.encodeStateAsUpdateV2(s));let f=N(c,u),p=ce(u,i),m=I(a,o);u.transact(()=>{f.applyDelta(m)},i);let h=d.createDiffRenderer(s,u,{attrs:p});t.replaceBlocks(t.document,[]),t.exec((e,t)=>{let n=L({tr:e.tr,fragment:f,renderer:h});return t&&t(n),!0}),s.destroy(),u.destroy()},clearDiff:e=>{t.replaceBlocks(t.document,[]),t.replaceBlocks(t.document,e)}}}),K=t.t(({editor:e,options:t})=>{let n=i.n(t.resolveUsers),a={...t,resolveUsers:n};return{key:`collaboration`,userStore:n,blockNoteExtensions:[t.suggestionDoc?R(a):null,E(),M(a),H(t),t.versioningEndpoints?r.a({...B(e,t.fragment),endpoints:t.versioningEndpoints,resolveUsers:n}):null,T({resolveUsers:n,getAttributionMarkClassName:t.getAttributionMarkClassName})].filter(e=>e!==null)}});function ue(e){return e.initialContent&&console.warn(`When using Collaboration, initialContent might cause conflicts, because changes should come from the collaboration provider`),{...e,extensions:[...e.extensions??[],K(e.collaboration)],disableExtensions:[`history`,...e.disableExtensions??[]],initialContent:[{type:`paragraph`,id:`initialBlockId`}]}}function q(e){let t=new d.Type;if(t.setAttr(`id`,e.id),t.setAttr(`userId`,e.userId),t.setAttr(`createdAt`,e.createdAt.getTime()),t.setAttr(`updatedAt`,e.updatedAt.getTime()),e.deletedAt?(t.setAttr(`deletedAt`,e.deletedAt.getTime()),t.setAttr(`body`,void 0)):t.setAttr(`body`,e.body),e.reactions.length>0)throw Error(`Reactions should be empty in commentToYType`);return t.setAttr(`reactionsByUser`,new d.Type),t.setAttr(`metadata`,e.metadata),t}function de(e){let t=new d.Type;t.setAttr(`id`,e.id),t.setAttr(`createdAt`,e.createdAt.getTime()),t.setAttr(`updatedAt`,e.updatedAt.getTime());let n=new d.Type;return n.push(e.comments.map(e=>q(e))),t.setAttr(`comments`,n),t.setAttr(`resolved`,e.resolved),t.setAttr(`resolvedUpdatedAt`,e.resolvedUpdatedAt?.getTime()),t.setAttr(`resolvedBy`,e.resolvedBy),t.setAttr(`metadata`,e.metadata),t}function fe(e){return{emoji:e.getAttr(`emoji`),createdAt:new Date(e.getAttr(`createdAt`)),userId:e.getAttr(`userId`)}}function pe(e){return[...e.attrValues()].map(e=>fe(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 J(e){return{type:`comment`,id:e.getAttr(`id`),userId:e.getAttr(`userId`),createdAt:new Date(e.getAttr(`createdAt`)),updatedAt:new Date(e.getAttr(`updatedAt`)),deletedAt:e.getAttr(`deletedAt`)?new Date(e.getAttr(`deletedAt`)):void 0,reactions:pe(e.getAttr(`reactionsByUser`)),metadata:e.getAttr(`metadata`),body:e.getAttr(`body`)}}function Y(e){return{type:`thread`,id:e.getAttr(`id`),createdAt:new Date(e.getAttr(`createdAt`)),updatedAt:new Date(e.getAttr(`updatedAt`)),comments:(e.getAttr(`comments`)?.toArray()||[]).map(e=>J(e)),resolved:e.getAttr(`resolved`),resolvedUpdatedAt:new Date(e.getAttr(`resolvedUpdatedAt`)),resolvedBy:e.getAttr(`resolvedBy`),metadata:e.getAttr(`metadata`)}}var X=class extends a.t{threadsYType;constructor(e,t){super(t),this.threadsYType=e}getThread(e){let t=this.threadsYType.getAttr(e);if(!t)throw Error(`Thread not found`);return Y(t)}getThreads(){let e=new Map;return this.threadsYType.forEachAttr((t,n)=>{t instanceof d.Type&&e.set(String(n),Y(t))}),e}subscribe(e){let t=()=>{e(this.getThreads())};return this.threadsYType.observeDeep(t),()=>{this.threadsYType.unobserveDeep(t)}}},me=class extends X{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,...n}=e;return this.doRequest(`/${t}/addToDocument`,`POST`,n)};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`)},Z=class extends X{userId;constructor(e,t,n){super(t,n),this.userId=e}transact=e=>async t=>this.threadsYType.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,s.uuidv4)(),userId:this.userId,createdAt:t,updatedAt:t,reactions:[],metadata:e.initialComment.metadata,body:e.initialComment.body},r={type:`thread`,id:(0,s.uuidv4)(),createdAt:t,updatedAt:t,comments:[n],resolved:!1,metadata:e.metadata};return this.threadsYType.setAttr(r.id,de(r)),r});addThreadToDocument=void 0;addComment=this.transact(e=>{let t=this.threadsYType.getAttr(e.threadId);if(!t)throw Error(`Thread not found`);if(!this.auth.canAddComment(Y(t)))throw Error(`Not authorized`);let n=new Date,r={type:`comment`,id:(0,s.uuidv4)(),userId:this.userId,createdAt:n,updatedAt:n,deletedAt:void 0,reactions:[],metadata:e.comment.metadata,body:e.comment.body};return t.getAttr(`comments`).push([q(r)]),t.setAttr(`updatedAt`,new Date().getTime()),r});updateComment=this.transact(e=>{let t=this.threadsYType.getAttr(e.threadId);if(!t)throw Error(`Thread not found`);let n=t.getAttr(`comments`),r=Q(n,t=>t.getAttr(`id`)===e.commentId);if(r===-1)throw Error(`Comment not found`);let i=n.get(r);if(!this.auth.canUpdateComment(J(i)))throw Error(`Not authorized`);i.setAttr(`body`,e.comment.body),i.setAttr(`updatedAt`,new Date().getTime()),i.setAttr(`metadata`,e.comment.metadata)});deleteComment=this.transact(e=>{let t=this.threadsYType.getAttr(e.threadId);if(!t)throw Error(`Thread not found`);let n=t.getAttr(`comments`),r=Q(n,t=>t.getAttr(`id`)===e.commentId);if(r===-1)throw Error(`Comment not found`);let i=n.get(r);if(!this.auth.canDeleteComment(J(i)))throw Error(`Not authorized`);if(i.getAttr(`deletedAt`))throw Error(`Comment already deleted`);e.softDelete?(i.setAttr(`deletedAt`,new Date().getTime()),i.setAttr(`body`,void 0)):n.delete(r),n.toArray().every(e=>e.getAttr(`deletedAt`))&&(e.softDelete?t.setAttr(`deletedAt`,new Date().getTime()):this.threadsYType.deleteAttr(e.threadId)),t.setAttr(`updatedAt`,new Date().getTime())});deleteThread=this.transact(e=>{if(!this.auth.canDeleteThread(Y(this.threadsYType.getAttr(e.threadId))))throw Error(`Not authorized`);this.threadsYType.deleteAttr(e.threadId)});resolveThread=this.transact(e=>{let t=this.threadsYType.getAttr(e.threadId);if(!t)throw Error(`Thread not found`);if(!this.auth.canResolveThread(Y(t)))throw Error(`Not authorized`);t.setAttr(`resolved`,!0),t.setAttr(`resolvedUpdatedAt`,new Date().getTime()),t.setAttr(`resolvedBy`,this.userId)});unresolveThread=this.transact(e=>{let t=this.threadsYType.getAttr(e.threadId);if(!t)throw Error(`Thread not found`);if(!this.auth.canUnresolveThread(Y(t)))throw Error(`Not authorized`);t.setAttr(`resolved`,!1),t.setAttr(`resolvedUpdatedAt`,new Date().getTime())});addReaction=this.transact(e=>{let t=this.threadsYType.getAttr(e.threadId);if(!t)throw Error(`Thread not found`);let n=t.getAttr(`comments`),r=Q(n,t=>t.getAttr(`id`)===e.commentId);if(r===-1)throw Error(`Comment not found`);let i=n.get(r);if(!this.auth.canAddReaction(J(i),e.emoji))throw Error(`Not authorized`);let a=new Date,o=`${this.userId}-${e.emoji}`,s=i.getAttr(`reactionsByUser`);if(!s.hasAttr(o)){let t=new d.Type;t.setAttr(`emoji`,e.emoji),t.setAttr(`createdAt`,a.getTime()),t.setAttr(`userId`,this.userId),s.setAttr(o,t)}});deleteReaction=this.transact(e=>{let t=this.threadsYType.getAttr(e.threadId);if(!t)throw Error(`Thread not found`);let n=t.getAttr(`comments`),r=Q(n,t=>t.getAttr(`id`)===e.commentId);if(r===-1)throw Error(`Comment not found`);let i=n.get(r);if(!this.auth.canDeleteReaction(J(i),e.emoji))throw Error(`Not authorized`);let a=`${this.userId}-${e.emoji}`;i.getAttr(`reactionsByUser`).deleteAttr(a)})};function Q(e,t){for(let n=0;n<e.length;n++)if(t(e.get(n)))return n;return-1}var he=`__bn_version_names`;function ge(e){return e.customAttributions?.some(e=>e.k===`type`&&e.v===`version`)??!1}function _e(e,t){let n=e.by?.split(`,`).map(e=>e.trim()).filter(Boolean),r=n&&n.length>0?n:void 0;if(ge(e)){let t=e.customAttributions?.find(e=>e.k===`id`)?.v;return t===void 0?void 0:{id:t,name:e.customAttributions?.find(e=>e.k===`name`)?.v,createdAt:e.to,updatedAt:e.to,by:r}}return{id:`history-${e.to}-${t}`,createdAt:e.to,updatedAt:e.to,by:r}}async function $(e,t,n){let r=await fetch(e,{...n,headers:{...t,...n?.headers instanceof Headers?Object.fromEntries(n.headers.entries()):Array.isArray(n?.headers)?Object.fromEntries(n.headers):n?.headers}});if(!r.ok)throw Error(`YHub request failed: ${r.status} ${r.statusText} (${e})`);return r.arrayBuffer()}function ve(e){let{baseUrl:t,org:n,docId:i,headers:a={},activityLimit:o=50,group:c}=e,l=`${t}/activity/${n}/${i}`,u=`${t}/changeset/${n}/${i}`,p=`${t}/rollback/${n}/${i}`;return m=>{let h=()=>(m.getExtension(`ySync`)?.fragment.doc)?.get(he),g=async()=>{let e=new URLSearchParams({order:`desc`,limit:`1`,customAttributions:`true`}),t=new URLSearchParams({order:`desc`,limit:`1`,customAttributions:`true`,withCustomAttributions:`type:version`}),[n,i]=await Promise.all([$(`${l}?${e}`,a),$(`${l}?${t}`,a)]),o=(0,f.decodeAny)(new Uint8Array(n))[0],s=(0,f.decodeAny)(new Uint8Array(i))[0];if(!o||o.to<=(s?.to??0))return;let c=o.by?.split(`,`).map(e=>e.trim()).filter(Boolean)??[];return{id:r.i,createdAt:o.to,updatedAt:o.to,by:c.length>0?c:void 0}},_=async(e,r,o)=>{if(!e.doc)throw Error(`Cannot patch document: the Y.Type is not attached to a Y.Doc.`);let s=new d.Doc;s.get(`__bn_version_markers`,`XmlFragment`).insert(0,[`v`]);let c={update:d.encodeStateAsUpdate(s),customAttributions:r};await $(`${t}/ydoc/${n}/${i}${o?`?userid=${o}`:``}`,a,{method:`PATCH`,body:(0,f.encodeAny)(c)})},v=async(e,t)=>{let n=String((0,s.uint32)()),r=Date.now();t?.name&&h()?.setAttr(n,t.name);let i=[{k:`type`,v:`version`},{k:`id`,v:n}];t?.name&&i.push({k:`name`,v:t.name});let a=m.getExtension(`yCursor`)?.getUser();return await _(e,i,a?.id),{id:n,name:t?.name,createdAt:r,updatedAt:r,by:a?.id}},y=async e=>{let t=new URLSearchParams({ydoc:`true`,to:String(e)}),n=await $(`${u}?${t}`,a),r=(0,f.decodeAny)(new Uint8Array(n));if(!r.nextDoc)throw Error(`YHub returned no document state at timestamp ${e}.`);return d.convertUpdateFormatV1ToV2(r.nextDoc)};return{list:async()=>{let t=e.groupMaxGap??1e4,n=e.groupMaxDuration,i=e.mergeUsers,s=new URLSearchParams({order:`desc`,limit:String(o),customAttributions:`true`});s.set(`groupMaxGap`,String(t)),c!==void 0&&s.set(`group`,String(c)),n!==void 0&&s.set(`groupMaxDuration`,String(n)),i!==void 0&&s.set(`mergeUsers`,String(i));let u=await $(`${l}?${s}`,a),d=(0,f.decodeAny)(new Uint8Array(u)),p=r.o(d.map((e,t)=>_e(e,t)).filter(e=>e!==void 0).map(e=>{let t=e.name,n=(typeof e.id==`string`?h()?.getAttr(e.id):void 0)??t;return{...e,name:n}})),m=await g();return m?[m,...p]:p},create:v,getContent:async e=>y(e.createdAt),getAttributions:async(e,t)=>{let n=e.createdAt,r=t===void 0?0:t.createdAt,i=new URLSearchParams({from:String(r),to:String(n),attributions:`true`}),o=await $(`${u}?${i}`,a),s=(0,f.decodeAny)(new Uint8Array(o));if(!s.attributions)throw Error(`YHub returned no attributions for snapshot ${String(e.id)}.`);return d.decodeContentMap(s.attributions)},restore:async(e,t)=>{let n=t.createdAt,r=await y(n);return await $(`${p}?from=${n}`,a,{method:`POST`,body:(0,f.encodeAny)({from:n})}),r},rename:async(e,t)=>{if(typeof e.id!=`string`)return;let n=h();if(!n)throw Error(`Cannot rename version: no live collaboration document is available.`);t===void 0||t===``?n.deleteAttr(e.id):n.setAttr(e.id,t)}}}}exports.AttributionExtension=T,exports.CollaborationExtension=K,exports.DiffVersioningExtension=le,exports.RESTYjsThreadStore=me,exports.RelativePositionMappingExtension=E,exports.SuggestionsExtension=R,exports.YAttributedDeletion=g,exports.YAttributedFormat=_,exports.YAttributedInsertion=h,exports.YAttributionMarksExtension=v,exports.YCursorExtension=H,exports.YSyncExtension=M,exports.YjsThreadStore=Z,exports.YjsThreadStoreBase=X,exports._blocksToProsemirrorNode=P,exports._prosemirrorJSONToBlocks=ne,exports.blocksToYDoc=ae,exports.blocksToYType=re,exports.createYHubVersioningEndpoints=ve,exports.createYjsVersioningAdapter=B,exports.docDiffToDelta=I,exports.findTypeInOtherYdoc=N,exports.getProseMirrorTrFromYFragment=L,exports.getReferenceClientRects=te,exports.getReferenceRect=w,exports.mapAttributionToMark=j,exports.resolveAttributionMarkClassName=p,exports.withCollaboration=ue,exports.yDocToBlocks=ie,exports.yfragmentToBlocks=F; //# sourceMappingURL=y.cjs.map