collabmd 0.1.45 → 0.1.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -19
- package/bin/collabmd.js +27 -1
- package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-CYM5nxUi.js +1 -0
- package/dist/client/assets/browser-utils--H_DkyEF.js +1 -0
- package/dist/client/assets/chunk-ERSWUTIN-hHdvnhaY.js +41 -0
- package/dist/client/assets/comment-thread-store-CdcwrObc.js +1 -0
- package/dist/client/assets/comment-threads-9J6Em-_y.js +4 -0
- package/dist/client/assets/comment-ui-shared-BC4pt4w8.js +7 -0
- package/dist/client/assets/dist-B5HTH2BO.js +1 -0
- package/dist/client/assets/{dist-DhLvC8DS.js → dist-B5Jf1SLZ.js} +2 -2
- package/dist/client/assets/{dist-CnL7Y2sM.js → dist-BDt3rz7l.js} +1 -1
- package/dist/client/assets/dist-BEwK4csK.js +1 -0
- package/dist/client/assets/dist-BKW4PALF.js +1 -0
- package/dist/client/assets/dist-BWcHHOx-.js +1 -0
- package/dist/client/assets/{dist-CYZmbokb.js → dist-BalScOwZ.js} +9 -9
- package/dist/client/assets/dist-Bf8f4HmM.js +6 -0
- package/dist/client/assets/dist-BjHJDtyU.js +1 -0
- package/dist/client/assets/dist-Bm6pf9Bl.js +1 -0
- package/dist/client/assets/dist-BoVBdSjk.js +1 -0
- package/dist/client/assets/dist-CC5IrQMG.js +1 -0
- package/dist/client/assets/{dist-C11hHqv_.js → dist-CCP_AKPG.js} +12 -12
- package/dist/client/assets/dist-CZgOmxK6.js +1 -0
- package/dist/client/assets/{dist-D2AQ-76g.js → dist-Cqhv5LAk.js} +1 -1
- package/dist/client/assets/{dist-MvcV4190.js → dist-D-Z6FLem.js} +1 -1
- package/dist/client/assets/dist-DLMiIsNC.js +11 -0
- package/dist/client/assets/{dist-3bgCp7iY.js → dist-DZKu9Cs8.js} +1 -1
- package/dist/client/assets/dist-DaYdhcVs.js +1 -0
- package/dist/client/assets/dist-FWJsgGYI.js +1 -0
- package/dist/client/assets/dist-Kh2COra_.js +1 -0
- package/dist/client/assets/{dist-JYEDRrPT.js → dist-PDZ3bSqm.js} +1 -1
- package/dist/client/assets/{dist-Drp8uu5J.js → dist-TjMh8n1u.js} +1 -1
- package/dist/client/assets/{dist-DGb27Dl6.js → dist-dtAdgL39.js} +1 -1
- package/dist/client/assets/dist-jv4WdPnK.js +9 -0
- package/dist/client/assets/{dist-DK5Gs2wa.js → dist-rGBmqxC7.js} +1 -1
- package/dist/client/assets/{dist-DCzuX1AF.js → dist-shrl6K_0.js} +1 -1
- package/dist/client/assets/dist-tOaegDYS2.js +1 -0
- package/dist/client/assets/dist-ule2n6ak.js +1 -0
- package/dist/client/assets/dist-xElaxbia.js +1 -0
- package/dist/client/assets/{drawio-editor-ClE8jpoG.js → drawio-editor-FzY1cVw8.js} +1 -1
- package/dist/client/assets/drawioEditor-BjiKJqlc.js +2 -0
- package/dist/client/assets/editor-session-Cm9ekeNo.js +54 -0
- package/dist/client/assets/embedded-editor-base-CwTkk911.css +1 -0
- package/dist/client/assets/{preview-render-profile-BZzGSg6K.js → es-DXGV3RHd.js} +13 -13
- package/dist/client/assets/excalidraw-editor-B46zsTFI.js +9 -0
- package/dist/client/assets/{excalidraw-editor-CyGwOhLz.css → excalidraw-editor-Bt7gMSoh.css} +1 -1
- package/dist/client/assets/excalidraw-scene-BOben2gr.js +1 -0
- package/dist/client/assets/excalidrawEditor-CT2pHq7e.js +2 -0
- package/dist/client/assets/{export-page-CUfws2T-.js → export-page-A7NHawJY.js} +3 -3
- package/dist/client/assets/exportDocument-B2L8fe34.css +1 -0
- package/dist/client/assets/exportDocument-BaqcOAAW.js +2 -0
- package/dist/client/assets/file-icon-svg-CQAjlWjK.js +1 -0
- package/dist/client/assets/file-kind-BbqgGzpc.js +1 -0
- package/dist/client/assets/image-QXRYHUNP-SWEV8H0J.js +1 -0
- package/dist/client/assets/index-ClbjMBVt.js +2 -0
- package/dist/client/assets/index-Pum8ET-5.css +1 -0
- package/dist/client/assets/main-B3uPyqic.js +893 -0
- package/dist/client/assets/pdf-BL9Pr2D5.js +54 -0
- package/dist/client/assets/pdf.worker-CLesOks4.mjs +64857 -0
- package/dist/client/assets/pdf_viewer-FVkkThnz.js +551 -0
- package/dist/client/assets/{preview-render-compiler-BSaQO_p3.js → preview-render-compiler-BD-XhkS2.js} +2 -2
- package/dist/client/assets/preview-render-compiler-BKedaMxx.js +1 -0
- package/dist/client/assets/preview-render-profile-CE-5rVTC.js +1 -0
- package/dist/client/assets/{preview-render-worker-B42LWvrD.js → preview-render-worker-CiPqc9n6.js} +20 -20
- package/dist/client/assets/prod-Dy20X7eT.js +1 -0
- package/dist/client/assets/prod-hnwh7wRM.js +177 -0
- package/dist/client/assets/quick-switcher-controller-fqOYR7qR.js +12 -0
- package/dist/client/assets/runtime-config-BLrEKVO1.js +1 -0
- package/dist/client/assets/vault-api-client-_LpV1aIn.js +6 -0
- package/dist/client/drawio-editor.html +1 -1
- package/dist/client/excalidraw-editor.html +1 -1
- package/dist/client/export-document.html +2 -2
- package/dist/client/index.html +15 -3
- package/docker-compose.yml +42 -0
- package/package.json +17 -4
- package/scripts/local-structurizr-compose.mjs +101 -0
- package/src/client/app/index.html +13 -1
- package/src/client/application/app-shell/comments-feature.js +19 -10
- package/src/client/application/app-shell/git-feature.js +12 -0
- package/src/client/application/app-shell/presence-feature.js +2 -1
- package/src/client/application/app-shell/ui-feature-shell.js +45 -2
- package/src/client/application/app-shell/ui-feature-toolbar.js +2 -52
- package/src/client/application/app-shell/workspace-feature.js +5 -1
- package/src/client/application/app-shell-elements.js +2 -0
- package/src/client/application/pdf-preview-controller.js +992 -0
- package/src/client/application/structurizr-preview-controller.js +395 -0
- package/src/client/application/workspace-coordinator.js +25 -3
- package/src/client/application/workspace-preview-controller.js +91 -2
- package/src/client/bootstrap/collabmd-app-shell.js +31 -5
- package/src/client/browser-utils.js +44 -0
- package/src/client/domain/runtime-paths.js +26 -5
- package/src/client/domain/structurizr-language.js +99 -0
- package/src/client/domain/vault-paths.js +48 -0
- package/src/client/excalidraw-editor.js +833 -51
- package/src/client/infrastructure/browser-preferences-port.js +10 -0
- package/src/client/infrastructure/comment-thread-store.js +34 -13
- package/src/client/infrastructure/editor-session.js +10 -0
- package/src/client/infrastructure/editor-view-adapter.js +46 -2
- package/src/client/infrastructure/excalidraw-room-client.js +103 -14
- package/src/client/infrastructure/git-api-client.js +5 -0
- package/src/client/infrastructure/vault-api-client.js +26 -0
- package/src/client/presentation/comment-ui/comment-ui-shared.js +4 -0
- package/src/client/presentation/drawio-embed-controller.js +9 -102
- package/src/client/presentation/drawio-viewer.js +118 -0
- package/src/client/presentation/excalidraw-embed-controller.js +74 -8
- package/src/client/presentation/file-action-controller.js +102 -0
- package/src/client/presentation/file-explorer-view.js +10 -29
- package/src/client/presentation/file-icon-svg.js +40 -0
- package/src/client/presentation/file-tree-state.js +2 -0
- package/src/client/presentation/git-diff-view-controller.js +731 -3
- package/src/client/presentation/outline-controller.js +86 -0
- package/src/client/presentation/quick-switcher-controller.js +25 -13
- package/src/client/presentation/quick-switcher-text-search.js +1 -1
- package/src/client/styles/components/navigation.css +11 -1
- package/src/client/styles/features/diagram-preview.css +76 -0
- package/src/client/styles/features/diff-special.css +309 -0
- package/src/client/styles/foundation/themes.css +6 -0
- package/src/client/styles/layout/shell.css +358 -1
- package/src/client/styles/layout/view-modes.css +1 -0
- package/src/client/styles/style.css +1 -0
- package/src/client/styles/surfaces/excalidraw-editor.css +294 -0
- package/src/domain/comment-threads.js +63 -5
- package/src/domain/excalidraw-room-codec.js +6 -4
- package/src/domain/file-kind.js +35 -3
- package/src/server/config/env.js +79 -0
- package/src/server/create-app-server.js +12 -0
- package/src/server/domain/bases/base-definition.js +1 -1
- package/src/server/domain/bases/base-expression-runtime.js +1 -4
- package/src/server/domain/bases/base-index-snapshot-store.js +1 -4
- package/src/server/domain/bases/base-transform.js +1 -4
- package/src/server/domain/collaboration/collaboration-room.js +55 -21
- package/src/server/domain/comment-overview.js +15 -5
- package/src/server/domain/ripgrep-search-service.js +4 -0
- package/src/server/infrastructure/git/diff-service.js +5 -0
- package/src/server/infrastructure/git/git-service.js +21 -0
- package/src/server/infrastructure/git/history-service.js +54 -0
- package/src/server/infrastructure/git/image-mime.js +14 -0
- package/src/server/infrastructure/git/untracked-files.js +28 -1
- package/src/server/infrastructure/http/create-git-api-query-handler.js +31 -1
- package/src/server/infrastructure/http/create-request-handler.js +16 -23
- package/src/server/infrastructure/http/create-static-handler.js +5 -2
- package/src/server/infrastructure/http/create-structurizr-api-handler.js +145 -0
- package/src/server/infrastructure/http/create-vault-api-command-handler.js +66 -4
- package/src/server/infrastructure/http/create-vault-api-query-handler.js +51 -3
- package/src/server/infrastructure/http/http-request-helpers.js +22 -0
- package/src/server/infrastructure/persistence/path-utils.js +1 -1
- package/src/server/infrastructure/persistence/vault-file-store.js +3 -0
- package/src/server/infrastructure/structurizr/structurizr-embed.css +43 -0
- package/src/server/infrastructure/structurizr/structurizr-workspace-service.js +374 -0
- package/src/server/infrastructure/websocket/attach-collaboration-gateway.js +4 -22
- package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-CbSISC1w.js +0 -1
- package/dist/client/assets/browser-utils-CKtI_rZl.js +0 -1
- package/dist/client/assets/chunk-ERSWUTIN-ME9RVNel.js +0 -41
- package/dist/client/assets/comment-threads-DDegmaFO.js +0 -4
- package/dist/client/assets/dist-BH87JoHx.js +0 -11
- package/dist/client/assets/dist-BIkPRZO7.js +0 -6
- package/dist/client/assets/dist-BqCsFpx4.js +0 -1
- package/dist/client/assets/dist-C2JHCt8U.js +0 -1
- package/dist/client/assets/dist-CZjTtmTu.js +0 -1
- package/dist/client/assets/dist-Cig4Ov_X.js +0 -1
- package/dist/client/assets/dist-CqQEC8gR.js +0 -1
- package/dist/client/assets/dist-D4Rzqod1.js +0 -1
- package/dist/client/assets/dist-D5sn-mwk.js +0 -9
- package/dist/client/assets/dist-D7G-n87v.js +0 -1
- package/dist/client/assets/dist-DRqOrNgN.js +0 -1
- package/dist/client/assets/dist-DetkMS_4.js +0 -1
- package/dist/client/assets/dist-Dp6FVkQ1.js +0 -1
- package/dist/client/assets/dist-DtbjNB28.js +0 -1
- package/dist/client/assets/dist-DyrYcvpo2.js +0 -1
- package/dist/client/assets/dist-GrygD2zE.js +0 -1
- package/dist/client/assets/dist-HmEpWUow.js +0 -1
- package/dist/client/assets/dist-RTa81Km7.js +0 -1
- package/dist/client/assets/drawioEditor-CXaTM9Ds.js +0 -2
- package/dist/client/assets/editor-session-GTwZS6Df.js +0 -16
- package/dist/client/assets/embedded-editor-base-CiNEc8vy.css +0 -1
- package/dist/client/assets/excalidraw-editor-BZVM81BO.js +0 -9
- package/dist/client/assets/excalidraw-scene-C8n9CHsK.js +0 -176
- package/dist/client/assets/excalidrawEditor-DxJanCze.js +0 -2
- package/dist/client/assets/exportDocument-BCuxqXDY.js +0 -2
- package/dist/client/assets/exportDocument-DV-OX74E.css +0 -1
- package/dist/client/assets/file-kind-BKPOIRPE.js +0 -1
- package/dist/client/assets/image-QXRYHUNP-lfTHE3bb.js +0 -1
- package/dist/client/assets/index-C3YnUgMD.css +0 -1
- package/dist/client/assets/index-D2wXraJ1.js +0 -2
- package/dist/client/assets/main-DtiGz7uI.js +0 -795
- package/dist/client/assets/preview-render-compiler-csGM5ZFz.js +0 -1
- package/dist/client/assets/quick-switcher-controller-shW_6vPY.js +0 -12
- package/dist/client/assets/room-CQLoqtMo.js +0 -1
- package/dist/client/assets/runtime-config-DSGmGE9V.js +0 -1
- package/dist/client/assets/vault-api-client-C6bcGwy-.js +0 -5
- package/src/server/domain/collaboration/room-persistence-controller.js +0 -80
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./preview-render-compiler-BSaQO_p3.js";export{e as compilePreviewDocument};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import{f as e}from"./file-kind-BKPOIRPE.js";import{n as t}from"./vault-utils-wdQ0RNR9.js";var n=50;function r(e=0,{truncated:t=!1}={}){let n=Number(e)||0;return`${n}${t?`+`:``} ${n===1?`match`:`matches`}`}function i(e={}){let t=[];return(e.files??[]).forEach(e=>{(e.snippets??[]).forEach(n=>{t.push({column:n.column,file:e.file,kind:e.kind,line:n.line,matchLength:Math.max((n.matchEnd??0)-(n.matchStart??0),0),snippet:n})})}),t}var a=class{constructor({debounceMs:e=220,resultLimit:t=n}={}){this.debounceMs=e,this.resultLimit=t,this.controller=null,this.timer=null,this.token=0}abort({invalidate:e=!0}={}){clearTimeout(this.timer),this.timer=null,e&&(this.token+=1),this.controller?.abort(),this.controller=null}schedule({isActive:e=()=>!0,onResults:t,onState:n,query:r=``,searchConfig:i={},searchText:a=null}={}){let o=Math.max(Number(i.minQueryLength)||2,1);if(this.abort(),!i.available){n?.(`Global text search requires ripgrep on the server.`);return}if(!a){n?.(`Global text search is unavailable.`);return}if(r.length<o){n?.(`Type at least ${o} characters to search file text.`);return}n?.(`Searching...`),this.timer=setTimeout(()=>{this.run({isActive:e,onResults:t,onState:n,query:r,searchText:a})},this.debounceMs)}async run({isActive:e=()=>!0,onResults:t,onState:n,query:r=``,searchText:i}={}){let a=this.token+1;this.token=a;let o=new AbortController;this.controller=o;let s=()=>e()&&a===this.token&&this.controller===o;try{let e=await i({limit:this.resultLimit,query:r,signal:o.signal});s()&&t?.(e,r)}catch(e){if(e?.name===`AbortError`||!s())return;n?.(e?.body?.error||e?.message||`Failed to search file text.`)}finally{this.controller===o&&(this.controller=null)}}},o=30,s=2**53-1,c=`quick-switcher-file-`,l=`quick-switcher-text-`;function u(e){return String(e??``).split(`/`).pop()||String(e??``)}function d(t){let n=e(t),r=n.split(`/`).pop()||n;return{displayName:n,fileName:r,filePath:t,lowerDisplayName:n.toLowerCase(),lowerFileName:r.toLowerCase(),lowerPath:String(t).toLowerCase()}}function f(t){let n=e(t);return n.split(`/`).pop()||n}function p(t){let n=e(t);return n.includes(`/`)?n.substring(0,n.lastIndexOf(`/`)):``}function m(e,t){return Array.from({length:t},(t,n)=>e+n)}function h(e,t){let n=[],r=0,i=0,a=0;for(let o=0;o<e.length&&r<t.length;o+=1){if(e[o]!==t[r]){a=0;continue}r+=1,n.push(o),a+=1,i+=a,(o===0||e[o-1]===`/`||e[o-1]===`-`||e[o-1]===`_`||e[o-1]===` `)&&(i+=5)}return r===t.length&&i>0?{indices:n,score:i}:null}function g(e,t){let n=e.lowerFileName.indexOf(t);if(n>=0)return{indices:m(n+(e.displayName.length-e.fileName.length),t.length),score:100+1/e.fileName.length};let r=e.lowerDisplayName.indexOf(t);return r>=0?{indices:m(r,t.length),score:50+1/e.displayName.length}:h(e.lowerDisplayName,t)}function _(e,t=[]){let n=e.displayName.length-e.fileName.length;return{dirPath:t.filter(e=>e<n),fileName:t.filter(e=>e>=n).map(e=>e-n)}}function v(e,n=[]){if(n.length===0)return t(e);let r=new Set(n),i=``,a=null,o=0,s=n=>{i+=t(e.slice(o,a)),i+=`<mark>${t(e.slice(a,n+1))}</mark>`,o=n+1,a=null};for(let t=0;t<e.length;t+=1){if(!r.has(t)){a!==null&&s(t-1);continue}a===null&&(a=t)}return a!==null&&s(e.length-1),i+=t(e.slice(o)),i}var y=class{constructor({getFileList:e,getFileMetadata:t=()=>[],getRecentFiles:n=()=>[],getSearchConfig:r=()=>({}),onFileSelect:i,onTextMatchSelect:o=null,searchDebounceMs:s=220,searchText:c=null}){this.getFileList=e,this.getFileMetadata=t,this.getRecentFiles=n,this.getSearchConfig=r,this.onFileSelect=i,this.onTextMatchSelect=o,this.searchDebounceMs=s,this.searchText=c,this.overlay=document.getElementById(`quickSwitcher`),this.input=document.getElementById(`quickSwitcherInput`),this.resultsList=document.getElementById(`quickSwitcherResults`),this.hint=document.getElementById(`quickSwitcherHint`),this.scope=document.getElementById(`quickSwitcherScope`),this.modeTabs=Array.from(document.querySelectorAll?.(`[data-qs-mode]`)??[]),this.filteredFiles=[],this.fileMatches=new Map,this.fileNameCounts=new Map,this.fileMatchCount=0,this.fileResultsTruncated=!1,this.fileCorpus=[],this.lastFileListRef=null,this.selectedIndex=0,this.selectedTextIndex=0,this.isOpen=!1,this.previousActiveElement=null,this.mode=`files`,this.textResults=null,this.textResultItems=[],this.textSearchRunner=new a({debounceMs:this.searchDebounceMs}),this.bindEvents()}bindEvents(){this.overlay?.addEventListener(`mousedown`,e=>{e.target===this.overlay&&this.close()}),this.modeTabs.forEach(e=>{e.addEventListener(`click`,()=>{this.setMode(e.dataset.qsMode===`text`?`text`:`files`,{preserveInput:!0})})}),this.input?.addEventListener(`input`,()=>{this.handleInput()}),this.input?.addEventListener(`keydown`,e=>{switch(e.key){case`ArrowDown`:e.preventDefault(),this.moveSelection(1);break;case`ArrowUp`:e.preventDefault(),this.moveSelection(-1);break;case`Enter`:e.preventDefault(),this.confirmSelection();break;case`Escape`:e.preventDefault(),this.close();break;case`Tab`:e.preventDefault(),this.modeTabs.length>1&&!e.shiftKey?this.setMode(this.mode===`files`?`text`:`files`,{preserveInput:!0}):this.moveSelection(e.shiftKey?-1:1)}})}open(){this.overlay&&(this.previousActiveElement=document.activeElement,this.isOpen=!0,this.input.value=``,this.selectedIndex=0,this.selectedTextIndex=0,this.overlay.classList.add(`visible`),this.overlay.setAttribute(`aria-hidden`,`false`),this.setMode(`files`,{preserveInput:!0}),this._focusAfterTransition())}_focusAfterTransition(){this._cancelPendingFocus();let e=()=>{this._focusCleanup=null,this.input?.focus(),this.isOpen&&this.input&&document.activeElement!==this.input&&setTimeout(()=>this.input?.focus(),50)},t=r=>{(r.propertyName===`visibility`||r.propertyName===`opacity`)&&(this.overlay.removeEventListener(`transitionend`,t),clearTimeout(n),e())};this.overlay.addEventListener(`transitionend`,t);let n=setTimeout(()=>{this.overlay.removeEventListener(`transitionend`,t),e()},160);this._focusCleanup=()=>{this.overlay.removeEventListener(`transitionend`,t),clearTimeout(n)}}_cancelPendingFocus(){this._focusCleanup&&=(this._focusCleanup(),null)}close({restoreFocus:e=!0}={}){if(!this.overlay)return;let t=this.previousActiveElement;this._cancelPendingFocus(),this.abortTextSearch(),this.isOpen=!1,this.overlay.classList.remove(`visible`),this.overlay.setAttribute(`aria-hidden`,`true`),this.input.value=``,this.resultsList.innerHTML=``,this.setActiveDescendant(``),this.previousActiveElement=null,e&&t?.focus?.()}toggle(){this.isOpen?this.close():this.open()}setMode(e=`files`,{preserveInput:t=!1}={}){let n=e===`text`?`text`:`files`;this.mode=n,this.selectedIndex=0,this.selectedTextIndex=0,!t&&this.input&&(this.input.value=``),this.modeTabs.forEach(e=>{let t=e.dataset.qsMode===n;e.classList.toggle(`active`,t),e.setAttribute(`aria-selected`,t?`true`:`false`)}),this.scope?.classList.toggle(`hidden`,n!==`text`),this.scope?.setAttribute(`aria-hidden`,n===`text`?`false`:`true`),this.input&&(this.input.placeholder=n===`text`?`Search text in files...`:`Search files...`,this.input.setAttribute(`aria-label`,n===`text`?`Search text in files`:`Search files`)),this.handleInput()}handleInput(){if(this.mode===`text`){this.scheduleTextSearch();return}this.abortTextSearch(),this.filterFiles()}filterFiles(){let e=this.input?.value.trim().toLowerCase()??``,t=this.getFileList?.()??[];t!==this.lastFileListRef&&(this.lastFileListRef=t,this.fileCorpus=t.map(e=>d(e)),this.fileNameCounts=new Map,this.fileCorpus.forEach(e=>{let t=this.fileNameCounts.get(e.lowerFileName)??0;this.fileNameCounts.set(e.lowerFileName,t+1)})),this.fileMatches.clear();let n=this.getFileMetadata?.()??[],r=new Map((Array.isArray(n)?n:[]).map(e=>[e?.path,Number.isFinite(Number(e?.mtimeMs))?Number(e.mtimeMs):0])),i=this.getRecentFiles?.()??[],a=new Map((Array.isArray(i)?i:[]).map((e,t)=>[e,t]));if(!e)this.filteredFiles=[...this.fileCorpus].sort((e,t)=>{let n=(r.get(t.filePath)??0)-(r.get(e.filePath)??0);return n===0?(a.get(e.filePath)??s)-(a.get(t.filePath)??s):n}).slice(0,o).map(e=>e.filePath),this.fileMatchCount=this.fileCorpus.length;else{let t=[],n=0;this.fileCorpus.forEach(r=>{let i=g(r,e);if(!i)return;n+=1,this.fileMatches.set(r.filePath,i);let c={filePath:r.filePath,recentRank:a.get(r.filePath)??s,score:i.score},l=!1;for(let e=0;e<t.length;e+=1){let n=t[e];if(c.score>n.score||c.score===n.score&&(c.recentRank<n.recentRank||c.recentRank===n.recentRank&&r.lowerPath<String(n.filePath).toLowerCase())){t.splice(e,0,c),l=!0;break}}!l&&t.length<o&&t.push(c),t.length>o&&(t.length=o)}),this.filteredFiles=t.map(e=>e.filePath),this.fileMatchCount=n}this.fileResultsTruncated=this.fileMatchCount>o,this.selectedIndex=0,this.renderResults(e)}renderResults(e){if(!this.resultsList)return;if(this.resultsList.innerHTML=``,this.filteredFiles.length===0){this.setActiveDescendant(``),this.hint&&(this.hint.textContent=e?`No files found`:`No files in vault`,this.hint.classList.remove(`hidden`));return}if(this.hint){let t=this.fileResultsTruncated?e?`Showing the top ${o} of ${this.fileMatchCount} matches. Refine the query to narrow results.`:`Showing the first ${o} of ${this.fileMatchCount} files.`:``;this.hint.textContent=t,this.hint.classList.toggle(`hidden`,!t)}let t=document.createDocumentFragment();this.filteredFiles.forEach((e,n)=>{let r=document.createElement(`button`);r.type=`button`,r.className=`qs-result-item`,n===this.selectedIndex&&r.classList.add(`selected`),r.id=`${c}${n}`,r.setAttribute(`role`,`option`),r.setAttribute(`aria-selected`,n===this.selectedIndex?`true`:`false`),r.dataset.index=String(n);let i=f(e),a=u(e),o=p(e),s=this.fileMatches.get(e),l=this.fileCorpus.find(t=>t.filePath===e),d=l?_(l,s?.indices):{dirPath:[],fileName:[]};r.innerHTML=`
|
|
2
|
-
<svg class="qs-result-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>
|
|
3
|
-
<span class="qs-result-name">${v((this.fileNameCounts.get(i.toLowerCase())??0)>1?a:i,d.fileName)}</span>
|
|
4
|
-
${o?`<span class="qs-result-path">${v(o,d.dirPath)}</span>`:``}
|
|
5
|
-
`,r.addEventListener(`click`,()=>{this.selectedIndex=n,this.confirmSelection()}),r.addEventListener(`mouseenter`,()=>{this.selectedIndex=n,this.updateSelection()}),t.appendChild(r)}),this.resultsList.appendChild(t),this.updateSelection()}abortTextSearch({invalidate:e=!0}={}){this.textSearchRunner.abort({invalidate:e})}scheduleTextSearch(){let e=this.input?.value.trim()??``,t=this.getSearchConfig?.()??{};this.textResults=null,this.textResultItems=[],this.textSearchRunner.schedule({isActive:()=>this.isOpen&&this.mode===`text`,onResults:(e,t)=>{this.textResults=e,this.textResultItems=i(e),this.selectedTextIndex=0,this.renderTextResults(t)},onState:e=>this.renderTextState(e),query:e,searchConfig:t,searchText:this.searchText})}renderTextState(e){this.resultsList&&(this.resultsList.innerHTML=``,this.resultsList.setAttribute(`aria-busy`,e===`Searching...`?`true`:`false`),this.setActiveDescendant(``),this.hint&&(this.hint.textContent=e,this.hint.classList.remove(`hidden`)))}renderTextResults(e=``){if(!this.resultsList)return;if(this.resultsList.innerHTML=``,this.resultsList.setAttribute(`aria-busy`,`false`),!this.textResults?.files?.length||this.textResultItems.length===0){this.setActiveDescendant(``),this.renderTextState(e?`No text matches found`:`Type to search file text`);return}if(this.hint){let e=this.textResults.truncated?`Showing partial results: ${this.textResults.files.length} files and ${r(this.textResults.matchCount,{truncated:!0})}. Refine the query to narrow results.`:``;this.hint.textContent=e,this.hint.classList.toggle(`hidden`,!e)}let n=document.createDocumentFragment(),i=0;this.textResults.files.forEach(e=>{let a=document.createElement(`section`);a.className=`qs-text-group`,a.setAttribute(`role`,`group`),a.setAttribute(`aria-label`,e.file);let o=document.createElement(`div`);o.className=`qs-text-group-header`,o.innerHTML=`
|
|
6
|
-
<span class="qs-text-file-name">${t(f(e.file))}</span>
|
|
7
|
-
<span class="qs-text-file-meta">${t(p(e.file))}</span>
|
|
8
|
-
<span class="qs-text-count">${t(r(e.matchCount,{truncated:e.truncated}))}</span>
|
|
9
|
-
`,a.appendChild(o),(e.snippets??[]).forEach(e=>{let n=i,r=document.createElement(`button`);r.type=`button`,r.className=`qs-text-item`,n===this.selectedTextIndex&&r.classList.add(`selected`),r.id=`${l}${n}`,r.setAttribute(`role`,`option`),r.setAttribute(`aria-selected`,n===this.selectedTextIndex?`true`:`false`),r.dataset.textIndex=String(n),r.innerHTML=`
|
|
10
|
-
<span class="qs-text-line">L${t(String(e.line??1))}</span>
|
|
11
|
-
<span class="qs-text-snippet">${this.highlightSnippet(e)}</span>
|
|
12
|
-
`,r.addEventListener(`click`,()=>{this.selectedTextIndex=n,this.confirmSelection()}),r.addEventListener(`mouseenter`,()=>{this.selectedTextIndex=n,this.updateSelection()}),a.appendChild(r),i+=1}),n.appendChild(a)}),this.resultsList.appendChild(n),this.updateSelection()}highlightSnippet(e={}){let n=String(e.text??``),r=Math.min(Math.max(Number(e.matchStart)||0,0),n.length),i=Math.min(Math.max(Number(e.matchEnd)||r,r),n.length);return`${t(n.slice(0,r))}<mark>${t(n.slice(r,i))}</mark>${t(n.slice(i))}`}moveSelection(e){if(this.mode===`text`){if(this.textResultItems.length===0)return;this.selectedTextIndex=(this.selectedTextIndex+e+this.textResultItems.length)%this.textResultItems.length,this.updateSelection();return}this.filteredFiles.length!==0&&(this.selectedIndex=(this.selectedIndex+e+this.filteredFiles.length)%this.filteredFiles.length,this.updateSelection())}updateSelection(){if(!this.resultsList)return;if(this.mode===`text`){let e=this.resultsList.querySelectorAll(`.qs-text-item`);e.forEach((e,t)=>{let n=t===this.selectedTextIndex;e.classList.toggle(`selected`,n),e.setAttribute(`aria-selected`,n?`true`:`false`)}),e[this.selectedTextIndex]?.scrollIntoView({block:`nearest`}),this.setActiveDescendant(e[this.selectedTextIndex]?.id??``);return}let e=this.resultsList.querySelectorAll(`.qs-result-item`);e.forEach((e,t)=>{let n=t===this.selectedIndex;e.classList.toggle(`selected`,n),e.setAttribute(`aria-selected`,n?`true`:`false`)}),e[this.selectedIndex]?.scrollIntoView({block:`nearest`}),this.setActiveDescendant(e[this.selectedIndex]?.id??``)}setActiveDescendant(e=``){this.input?.setAttribute(`aria-activedescendant`,e)}confirmSelection(){if(this.mode===`text`){let e=this.textResultItems[this.selectedTextIndex];e&&(this.close({restoreFocus:!1}),this.onTextMatchSelect?.(e));return}let e=this.filteredFiles[this.selectedIndex];e&&(this.close({restoreFocus:!1}),this.onFileSelect?.(e))}};export{y as QuickSwitcherController};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var e=[`Alice`,`Bob`,`Charlie`,`Dana`,`Eve`,`Frank`,`Grace`,`Hank`,`Iris`,`Jack`,`Kim`,`Leo`,`Maya`,`Nate`,`Olivia`,`Pete`,`Quinn`,`Ruby`,`Sam`,`Tara`],t=[`#ef4444`,`#f97316`,`#eab308`,`#22c55e`,`#06b6d4`,`#3b82f6`,`#8b5cf6`,`#ec4899`,`#14b8a6`,`#f59e0b`,`#6366f1`,`#10b981`,`#f43f5e`,`#0ea5e9`,`#a855f7`],n=`collabmd-user-id`,r=/^#(?:[\da-f]{3}|[\da-f]{6})$/iu;function i(e){let t=e/255;return t<=.04045?t/12.92:((t+.055)/1.055)**2.4}function a(e){let[t,n,r]=(e.length===4?e.slice(1).split(``).map(e=>e.repeat(2)).join(``):e.slice(1)).match(/../gu).map(e=>parseInt(e,16));return .2126*i(t)+.7152*i(n)+.0722*i(r)}function o(e,t){let n=Math.max(e,t),r=Math.min(e,t);return(n+.05)/(r+.05)}function s(e){return e[Math.floor(Math.random()*e.length)]}function c(){let e=new Uint8Array(8);return globalThis.crypto?.getRandomValues?.(e),Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``)}function l(){return globalThis.crypto?.randomUUID?globalThis.crypto.randomUUID():`${c()}-${Date.now().toString(36)}`}var u=null,d=null;function f(){return u||=c(),u}function p(e=globalThis.localStorage){if(d)return d;try{let t=e?.getItem?.(n);if(t)return d=t,t}catch{}d=l();try{e?.setItem?.(n,d)}catch{}return d}function m(e){return String(e??``).trim().replace(/\s+/g,` `).slice(0,24)||null}function h(e){let t=String(e??``).trim();if(!r.test(t))return`#fff`;let n=a(t.toLowerCase()),i=o(1,n);return o(0,n)>=i?`#000`:`#fff`}function g(n=null){let r=s(t);return{color:r,colorLight:`${r}33`,name:m(n)??s(e),peerId:f(),userId:p()}}export{m as i,c as n,h as r,g as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var e=Object.freeze({authError:`auth_error`,authPassword:`auth_password`,file:`file`,gitCommit:`git-commit`,gitDiff:`git-diff`,gitFileHistory:`git-file-history`,gitFilePreview:`git-file-preview`,gitHistory:`git-history`});function t(e=``){let t=String(e??``),n=t.startsWith(`#`)?t.slice(1):t;return new URLSearchParams(n)}function n(e=``){let t=String(e??``);return t.startsWith(`#`)?t.slice(1):t}function r(r=``){if(!n(r).trim().includes(`=`))return!1;let i=t(r);return Object.values(e).some(e=>i.has(e))}function i(t,{anchor:n=null,column:r=null,drawioMode:i=null,line:a=null,matchLength:o=null}={}){let s=new URLSearchParams;return t&&s.set(e.file,t),i&&s.set(`drawio`,i),n&&s.set(`anchor`,String(n).trim()),a!=null&&s.set(`line`,String(Math.max(1,Math.round(Number(a)||1)))),r!=null&&s.set(`column`,String(Math.max(1,Math.round(Number(r)||1)))),o!=null&&s.set(`matchLength`,String(Math.max(0,Math.round(Number(o)||0)))),s.toString()}function a(e){return e.endsWith(`/`)?e.slice(0,-1):e}function o(e){let t=a(String(e??``).trim());if(!t||t===`/`)return``;if(/^[a-zA-Z][a-zA-Z\d+.-]*:/u.test(t))try{return o(new URL(t).pathname)}catch{return``}return t.startsWith(`/`)?t:`/${t}`}function s(e,t){let n=a(String(e??``).trim());return!n||n===`/`?t:n.startsWith(`/`)?n:`/${n}`}function c(e,t){let n=o(e),r=String(t??``).trim();return r?/^[a-zA-Z][a-zA-Z\d+.-]*:/u.test(r)||n&&(r===n||r.startsWith(`${n}/`))?r:r===`/`?n||`/`:r.startsWith(`/`)?n?`${n}${r}`:r:n?`${n}/${r}`:`/${r}`:n||`/`}function l(){let e={auth:{enabled:!1,implemented:!0,loginEndpoint:`/api/auth/oidc/login`,provider:``,requiresLogin:!1,sessionEndpoint:`/api/auth/session`,statusEndpoint:`/api/auth/status`,strategy:`none`},basePath:``,build:{id:``,packageVersion:``},drawioBaseUrl:`https://embed.diagrams.net`,environment:`development`,gitEnabled:!0,publicWsBaseUrl:``,search:{available:!1,backend:`ripgrep`,minQueryLength:2,unavailableReason:`ripgrep search is unavailable`,version:``},wikiLinkAutoCreate:!0,wsBasePath:`/ws`,...window.__COLLABMD_CONFIG__??{}},t=o(e.basePath),n={enabled:!1,implemented:!0,loginEndpoint:`/api/auth/oidc/login`,provider:``,requiresLogin:!1,sessionEndpoint:`/api/auth/session`,statusEndpoint:`/api/auth/status`,strategy:`none`,...e.auth??{}},r={id:``,packageVersion:``,...e.build??{}};return{...e,auth:{...n,loginEndpoint:c(t,n.loginEndpoint),sessionEndpoint:c(t,n.sessionEndpoint),statusEndpoint:c(t,n.statusEndpoint)},basePath:t,build:r,wsBasePath:s(e.wsBasePath,`/ws`)}}function u(e=`/`,t=l()){return c(t.basePath,e)}function d(e=`/`,t=l()){return new URL(u(e,t),window.location.origin).toString()}function f(e=`/`,t=l()){let n=String(e??``).trim();return!n||n===`/`?u(`/api`,t):n.startsWith(`/api`)?u(n,t):u(`/api${n.startsWith(`/`)?n:`/${n}`}`,t)}function p(e=l()){let t=new URLSearchParams(window.location.search).get(`server`);return t?a(t):e.publicWsBaseUrl?a(e.publicWsBaseUrl):`${window.location.protocol===`https:`?`wss:`:`ws:`}//${window.location.host}${u(e.wsBasePath,e)}`}function m(){return l()}function h(){return t(window.location.hash)}function g(e){return e===`staged`||e===`all`||e===`working-tree`?e:`all`}function _(){let t=h();if(t.has(e.gitFilePreview)){let n=t.get(e.gitFilePreview)||null;return{currentFilePath:t.get(`current`)||n,filePath:n,hash:t.get(`hash`)||null,type:`git-file-preview`}}if(t.has(e.gitFileHistory))return{filePath:t.get(e.gitFileHistory)||null,type:`git-file-history`};if(t.has(e.gitHistory))return{type:`git-history`};if(t.has(e.gitCommit))return{hash:t.get(e.gitCommit)||null,historyFilePath:t.get(`history`)||null,path:t.get(`path`)||null,type:`git-commit`};if(t.has(e.gitDiff)){let n=t.get(e.gitDiff)||null;return{filePath:n,scope:g(t.get(`scope`)||(n?`working-tree`:`all`)),type:`git-diff`}}return t.has(e.file)?{anchor:t.get(`anchor`)||null,column:t.has(`column`)&&Number(t.get(`column`))||null,drawioMode:t.get(`drawio`)||null,filePath:t.get(e.file),line:t.has(`line`)&&Number(t.get(`line`))||null,matchLength:t.has(`matchLength`)&&Number(t.get(`matchLength`))||null,type:`file`}:{type:`empty`}}function v(e,{anchor:t=null,column:n=null,drawioMode:r=null,line:a=null,matchLength:o=null}={}){window.location.hash=i(e,{anchor:t,column:n,drawioMode:r,line:a,matchLength:o})}function y({filePath:e=null,scope:t=`all`}={}){let n=new URLSearchParams;n.set(`git-diff`,e??``),n.set(`scope`,g(t)),window.location.hash=n.toString()}function b({hash:e,path:t=null,historyFilePath:n=null}={}){let r=String(e??``).trim(),i=new URLSearchParams;i.set(`git-commit`,r),n&&i.set(`history`,n),t&&i.set(`path`,t),window.location.hash=i.toString()}function x(){let e=new URLSearchParams;e.set(`git-history`,`1`),window.location.hash=e.toString()}function S({filePath:e}={}){let t=new URLSearchParams;t.set(`git-file-history`,e??``),window.location.hash=t.toString()}function C({hash:e,path:t,currentFilePath:n=null}={}){let r=String(e??``).trim(),i=new URLSearchParams;i.set(`git-file-preview`,t??``),n&&i.set(`current`,n),i.set(`hash`,r),window.location.hash=i.toString()}export{y as a,x as c,d,p as f,r as h,b as i,f as l,t as m,m as n,S as o,i as p,v as r,C as s,_ as t,u};
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import{d as e,f as t,i as n,o as r,u as i}from"./file-kind-BKPOIRPE.js";import{l as a,m as o,n as s}from"./runtime-config-DSGmGE9V.js";import{i as c,n as l}from"./browser-utils-CKtI_rZl.js";var u={enabled:!1,implemented:!0,loginEndpoint:`/api/auth/oidc/login`,passwordLabel:`Password`,provider:``,requiresLogin:!1,sessionEndpoint:`/api/auth/session`,statusEndpoint:`/api/auth/status`,strategy:`none`,submitLabel:`Continue`},d=`data:image/png;base64,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`;function f(){return{...u,...s().auth??{}}}function p(){return o(window.location.hash).get(`auth_password`)||``}function m(){let e=o(window.location.hash);if(!e.has(`auth_password`))return;e.delete(`auth_password`);let t=e.toString(),n=`${window.location.pathname}${window.location.search}${t?`#${t}`:``}`;window.history.replaceState(null,``,n)}function h(e){let t=o(window.location.hash),n=t.get(e)||``;if(!n)return``;t.delete(e);let r=t.toString(),i=`${window.location.pathname}${window.location.search}${r?`#${r}`:``}`;return window.history.replaceState(null,``,i),n}function g(){return`${window.location.pathname}${window.location.search}${window.location.hash}`}async function _(e){let t=await fetch(e.statusEndpoint,{headers:{Accept:`application/json`}}),n=await t.json().catch(()=>({}));if(!t.ok)throw Error(n.error||`Failed to read auth status`);return n}function v(e){let t=e?.auth??{};if(t.strategy!==`oidc`||t.provider!==`google`)return;let n=String(e?.user?.name??``).trim();if(n)try{window.localStorage.setItem(`collabmd-user-name`,n)}catch{}}async function y(e,t){let n=await fetch(e.sessionEndpoint,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({password:t})}),r=await n.json().catch(()=>({}));if(!n.ok)throw Error(r.error||`Authentication failed`);return r}function b(){let e=document.createElement(`div`);e.className=`auth-gate-overlay`;let t=document.createElement(`section`);return t.className=`auth-gate-card`,e.append(t),{card:t,overlay:e}}function x(){let e=document.createElement(`span`);e.className=`auth-gate-button__icon`,e.setAttribute(`aria-hidden`,`true`);let t=document.createElement(`img`);return t.alt=``,t.decoding=`async`,t.height=20,t.loading=`eager`,t.src=d,t.width=20,e.append(t),e}function S(e,t,{errorMessage:n=``}){e.replaceChildren();let r=document.createElement(`h1`);r.textContent=`Authentication required`;let i=document.createElement(`p`);i.textContent=`Sign in with Google to join this session.`;let a=document.createElement(`div`);a.className=`auth-gate-actions`;let o=document.createElement(`button`);o.className=`ui-button ui-button--secondary auth-gate-button auth-gate-button--google`,o.type=`button`,o.append(x(),document.createTextNode(t.submitLabel||`Continue with Google`));let s=document.createElement(`div`);s.className=`auth-gate-error`,s.textContent=n,a.append(o),e.append(r,i,s,a),o.addEventListener(`click`,()=>{let e=new URL(t.loginEndpoint,window.location.origin);e.searchParams.set(`returnTo`,g()),window.location.assign(e.toString())})}function C(e,{title:t,body:n,secondaryActionLabel:r=``,onSecondaryAction:i=null}){e.replaceChildren();let a=document.createElement(`h1`);a.textContent=t;let o=document.createElement(`p`);if(o.textContent=n,e.append(a,o),r&&typeof i==`function`){let t=document.createElement(`button`);t.className=`ui-button ui-button--secondary auth-gate-secondary-button`,t.type=`button`,t.textContent=r,t.addEventListener(`click`,()=>{i()}),e.append(t)}}function w(e,t,{onSubmit:n}){e.replaceChildren();let r=document.createElement(`h1`);r.textContent=`Authentication required`;let i=document.createElement(`p`);i.textContent=`Enter the host password to join this shared session.`;let a=document.createElement(`form`);a.className=`auth-gate-form`;let o=document.createElement(`label`);o.className=`auth-gate-label`,o.textContent=t.passwordLabel;let s=document.createElement(`input`);s.className=`ui-input auth-gate-input`,s.type=`password`,s.name=`password`,s.autocomplete=`current-password`,s.required=!0;let c=document.createElement(`div`);c.className=`auth-gate-error`;let l=document.createElement(`div`);l.className=`auth-gate-actions`;let u=document.createElement(`button`);u.className=`ui-button ui-button--primary auth-gate-button`,u.type=`submit`,u.textContent=t.submitLabel,l.append(u),o.append(s),a.append(r,i,o,c,l),e.append(a),a.addEventListener(`submit`,e=>{e.preventDefault();let t=s.value;s.disabled=!0,u.disabled=!0,c.textContent=``,n(t).catch(e=>{c.textContent=e instanceof Error?e.message:`Authentication failed`,s.disabled=!1,u.disabled=!1,s.select(),s.focus()})}),queueMicrotask(()=>{s.focus()})}async function T(){let e=f();if(!e.enabled||e.strategy===`none`)return{authenticated:!0,auth:e};let{card:t,overlay:n}=b();document.body.append(n);let r=h(`auth_error`);return new Promise(i=>{let a=(t=null)=>{m(),v(t),n.remove(),i({authenticated:!0,auth:t?.auth??e,user:t?.user??null})};(async()=>{C(t,{body:`Checking access to this session…`,title:`CollabMD`});try{let t=await _(e);if(t.authenticated){a(t);return}}catch(e){C(t,{body:e instanceof Error?`${e.message} Refresh the page and try again.`:`Failed to contact the auth service. Refresh the page and try again.`,title:`Cannot verify access`});return}if(e.strategy===`password`){let n=p();if(n)try{m(),await y(e,n),a();return}catch{}w(t,e,{onSubmit:async t=>{await y(e,t),a()}});return}if(e.strategy===`oidc`){S(t,e,{errorMessage:r}),r=``;return}C(t,{body:`This authentication strategy is not available.`,title:`Authentication unavailable`})})()})}function E(e){return!e||e.repeat||!e.metaKey&&!e.ctrlKey||e.shiftKey||e.altKey?!1:String(e.key??``).toLowerCase()===`k`||e.code===`KeyK`}function D(e){let t=String(e??``).trim().replace(/\\/g,`/`).replace(/^\/+/u,``).split(`/`).map(e=>e.trim()).filter(Boolean);return t.some(e=>e===`.`||e===`..`)?``:t.join(`/`)}function O(e,t){let n=D(e),r=D(t);return n?r?`${n}/${r}`:n:r}function k(e=``){return String(e??``).replace(/\/+$/u,``).split(`/`).filter(Boolean).pop()||``}function A(e=``){let t=String(e??``).replace(/\/+$/u,``),n=t.lastIndexOf(`/`);return n>=0?t.slice(0,n):``}function j(e,t){return e.toLowerCase().endsWith(t.toLowerCase())?e:`${e}${t}`}function M(e){return`# ${t(String(e??``).split(`/`).pop()||``)||`Untitled`}\n\n`}function N(e){let t=D(e),r=n(t)?t:`${t}.base`;return{content:[`views:`,` - type: table`,` name: Table`,` order:`,` - file.name`,``].join(`
|
|
2
|
-
`),path:r}}function P(e){let t=D(e),n=i(t)?t:`${t}.mmd`;return{content:[`flowchart TD`,` A[Start] --> B{Decide}`,` B -->|Yes| C[Ship it]`,` B -->|No| D[Revise]`,``].join(`
|
|
3
|
-
`),path:n}}function F(e){let t=D(e),n=r(t)?t:`${t}.drawio`;return{content:[`<mxfile host="app.diagrams.net" modified="2026-01-01T00:00:00.000Z" agent="CollabMD" version="24.7.17">`,` <diagram id="page-1" name="Page-1">`,` <mxGraphModel dx="1200" dy="800" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">`,` <root>`,` <mxCell id="0" />`,` <mxCell id="1" parent="0" />`,` </root>`,` </mxGraphModel>`,` </diagram>`,`</mxfile>`,``].join(`
|
|
4
|
-
`),path:n}}function I(t){let n=D(t),r=e(n)?n:`${n}.puml`;return{content:[`@startuml`,`Alice -> Bob: Hello`,`@enduml`,``].join(`
|
|
5
|
-
`),path:r}}function L(e,t={}){let n={...t};return e&&(n[`X-CollabMD-Request-Id`]=String(e)),n}async function R(e,t){let n=await e.json().catch(()=>({}));if(!e.ok||n.ok===!1){let r=Error(n.error||t);throw r.status=e.status,r.body=n,typeof n?.code==`string`&&(r.code=n.code),r}return n}function z(e){return encodeURIComponent(String(e??``))}async function B(e,{fallbackError:t,fallbackFileName:n}={}){let r=await fetch(e);if(!r.ok){let e=await r.json().catch(()=>({}));throw Error(e.error||t)}let i=await r.blob();return l(i,c(r.headers.get(`content-disposition`)||``,n),{removeDelayMs:0,revokeDelayMs:0}),r}var V=new class{async readTree(){return R(await fetch(a(`/files`)),`Failed to load file tree`)}async readCommentOverview(){return R(await fetch(a(`/comments/overview`)),`Failed to load comment overview`)}async readFile(e){return R(await fetch(a(`/file?path=${encodeURIComponent(e)}`)),`Failed to read file`)}async readBacklinks(e,{signal:t}={}){let n=await R(await fetch(a(`/backlinks?file=${encodeURIComponent(e)}`),{signal:t}),`Failed to load backlinks`);return Array.isArray(n.backlinks)?n.backlinks:[]}async renderSvg(e){let t=await R(await fetch(a(`/plantuml/render`),{body:JSON.stringify({source:e}),headers:{"Content-Type":`application/json`},method:`POST`}),`Failed to render PlantUML`);if(!t.ok||typeof t.svg!=`string`)throw Error(t.error||`Failed to render PlantUML`);return t.svg}async searchText({limit:e=50,query:t=``,signal:n=null}={}){let r=new URLSearchParams({limit:String(e),q:String(t??``)});return R(await fetch(a(`/search?${r.toString()}`),{signal:n}),`Failed to search files`)}async queryBase({activeFilePath:e=``,path:t=``,search:n=``,source:r=null,sourcePath:i=``,view:o=``}={}){return R(await fetch(a(`/base/query`),{body:JSON.stringify({activeFilePath:e,path:t,search:n,source:r,sourcePath:i,view:o}),headers:{"Content-Type":`application/json`},method:`POST`}),`Failed to query base`)}async exportBaseCsv({activeFilePath:e=``,path:t=``,search:n=``,source:r=null,sourcePath:i=``,view:o=``}={}){let s=await fetch(a(`/base/export`),{body:JSON.stringify({activeFilePath:e,path:t,search:n,source:r,sourcePath:i,view:o}),headers:{"Content-Type":`application/json`},method:`POST`});if(!s.ok){let e=await s.json().catch(()=>({}));throw Error(e.error||`Failed to export base CSV`)}return{blob:await s.blob(),contentDisposition:s.headers.get(`content-disposition`)||``}}async queryBasePropertyValues({activeFilePath:e=``,path:t=``,propertyId:n=``,query:r=``,source:i=null,sourcePath:o=``,view:s=``}={}){return R(await fetch(a(`/base/property-values`),{body:JSON.stringify({activeFilePath:e,path:t,propertyId:n,query:r,source:i,sourcePath:o,view:s}),headers:{"Content-Type":`application/json`},method:`POST`}),`Failed to load base property values`)}async transformBase({activeFilePath:e=``,mutation:t=null,path:n=``,source:r=null,sourcePath:i=``,view:o=``}={}){return R(await fetch(a(`/base/transform`),{body:JSON.stringify({activeFilePath:e,mutation:t,path:n,source:r,sourcePath:i,view:o}),headers:{"Content-Type":`application/json`},method:`POST`}),`Failed to transform base`)}async createFile({content:e,path:t,requestId:n=null}){return R(await fetch(a(`/file`),{body:JSON.stringify({content:e,path:t}),headers:L(n,{"Content-Type":`application/json`}),method:`POST`}),`Failed to create file`)}async writeFile({content:e,path:t,requestId:n=null}){return R(await fetch(a(`/file`),{body:JSON.stringify({content:e,path:t}),headers:L(n,{"Content-Type":`application/json`}),method:`PUT`}),`Failed to write file`)}async renameFile({oldPath:e,newPath:t,requestId:n=null}){return R(await fetch(a(`/file`),{body:JSON.stringify({newPath:t,oldPath:e}),headers:L(n,{"Content-Type":`application/json`}),method:`PATCH`}),`Failed to rename file`)}async deleteFile(e,{requestId:t=null}={}){return R(await fetch(a(`/file?path=${encodeURIComponent(e)}`),{headers:t?L(t):void 0,method:`DELETE`}),`Failed to delete file`)}async createDirectory(e,{requestId:t=null}={}){return R(await fetch(a(`/directory`),{body:JSON.stringify({path:e}),headers:L(t,{"Content-Type":`application/json`}),method:`POST`}),`Failed to create folder`)}async renameDirectory({oldPath:e,newPath:t,requestId:n=null}){return R(await fetch(a(`/directory`),{body:JSON.stringify({newPath:t,oldPath:e}),headers:L(n,{"Content-Type":`application/json`}),method:`PATCH`}),`Failed to rename folder`)}async deleteDirectory(e,{recursive:t=!1,requestId:n=null}={}){let r=new URLSearchParams({path:String(e??``)});return t&&r.set(`recursive`,`1`),R(await fetch(a(`/directory?${r.toString()}`),{headers:n?L(n):void 0,method:`DELETE`}),`Failed to delete folder`)}async uploadImageAttachment({file:e,fileName:t=``,sourcePath:n}){return R(await fetch(a(`/attachments`),{body:e,headers:{"Content-Type":e?.type||`application/octet-stream`,"X-CollabMD-File-Name":z(t),"X-CollabMD-Source-Path":z(n)},method:`POST`}),`Failed to upload image`)}async downloadFile(e){let t=k(e)||`download`;return B(a(`/download/file?path=${encodeURIComponent(e)}`),{fallbackError:`Failed to download file`,fallbackFileName:t})}async downloadDirectory(e){let t=k(e)||`vault`;return B(a(`/download/directory?path=${encodeURIComponent(e)}`),{fallbackError:`Failed to download folder`,fallbackFileName:`${t}.zip`})}};export{N as a,P as c,k as d,A as f,T as h,O as i,I as l,E as m,L as n,F as o,D as p,R as r,M as s,V as t,j as u};
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
export class RoomPersistenceController {
|
|
2
|
-
constructor({
|
|
3
|
-
idleGraceMs = 0,
|
|
4
|
-
onDestroy = null,
|
|
5
|
-
onPersist = null,
|
|
6
|
-
}) {
|
|
7
|
-
this.idleGraceMs = idleGraceMs;
|
|
8
|
-
this.onDestroy = onDestroy;
|
|
9
|
-
this.onPersist = onPersist;
|
|
10
|
-
this.persistTimer = null;
|
|
11
|
-
this.destroyTimer = null;
|
|
12
|
-
this.finalizePromise = null;
|
|
13
|
-
this.shutdownGeneration = 0;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
markActivity() {
|
|
17
|
-
this.shutdownGeneration += 1;
|
|
18
|
-
clearTimeout(this.destroyTimer);
|
|
19
|
-
this.destroyTimer = null;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
cancelAll() {
|
|
23
|
-
this.shutdownGeneration += 1;
|
|
24
|
-
clearTimeout(this.persistTimer);
|
|
25
|
-
clearTimeout(this.destroyTimer);
|
|
26
|
-
this.persistTimer = null;
|
|
27
|
-
this.destroyTimer = null;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
schedulePersist(callback = this.onPersist) {
|
|
31
|
-
clearTimeout(this.persistTimer);
|
|
32
|
-
this.persistTimer = setTimeout(() => {
|
|
33
|
-
Promise.resolve(callback?.()).catch((error) => {
|
|
34
|
-
console.error(error);
|
|
35
|
-
});
|
|
36
|
-
}, 500);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
async finalizeIfIdle({
|
|
40
|
-
isIdle,
|
|
41
|
-
onPersistError = null,
|
|
42
|
-
onDestroy = this.onDestroy,
|
|
43
|
-
onPersist = this.onPersist,
|
|
44
|
-
}) {
|
|
45
|
-
if (!isIdle()) {
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
if (this.finalizePromise) {
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
const generation = ++this.shutdownGeneration;
|
|
53
|
-
|
|
54
|
-
this.finalizePromise = (async () => {
|
|
55
|
-
clearTimeout(this.persistTimer);
|
|
56
|
-
this.persistTimer = null;
|
|
57
|
-
|
|
58
|
-
try {
|
|
59
|
-
await onPersist?.();
|
|
60
|
-
} catch (error) {
|
|
61
|
-
onPersistError?.(error);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (!isIdle() || generation !== this.shutdownGeneration) {
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
this.destroyTimer = setTimeout(() => {
|
|
69
|
-
if (!isIdle() || generation !== this.shutdownGeneration) {
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
onDestroy?.();
|
|
74
|
-
}, this.idleGraceMs);
|
|
75
|
-
this.destroyTimer.unref?.();
|
|
76
|
-
})().finally(() => {
|
|
77
|
-
this.finalizePromise = null;
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
}
|