@hesprs/sync-engine-sdk 3.0.3 → 3.1.0

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.
@@ -0,0 +1 @@
1
+ function e(e){let t=e,n=[t.status,t.res?.status,t.response?.status];for(let e of n)if(typeof e==`number`)return e}const t=2.5*1024**2;async function n({from:e,to:t,stat:n,key:a}){let o=await r(e,a,n);if(o)return i(t,a,o,n)}async function r(e,n,r){try{return r.size>t?await e.readStream(n,r):await e.read(n,r)}catch(e){if(a(e))return;throw e}}function i(e,t,n,r){return n instanceof ReadableStream?e.writeStream(t,n,r):e.write(t,n,r)}function a(t){return e(t)===404||(t.message??String(t)).toLocaleUpperCase().includes(`ENOENT`)}export{r as n,i as r,n as t};
@@ -1 +1 @@
1
- import e from"./render-progress.js";import t from"../utils/round-percent.js";import n from"../utils/to-error-message.js";import{Modal as r,Notice as i,Setting as a}from"obsidian";var o=class extends r{ctx;options;cleanupCallbacks=[];constructor(e,t){super(e.app),this.ctx=e,this.options=t}onOpen(){let{contentEl:e,options:{content:t,apply:n}}=this,{translate:r}=this.ctx;e.empty(),e.addClass(`markdown-rendered`),this.setTitle(r(`remoteMigration`)),typeof t==`string`?e.createEl(`p`,{cls:`whitespace-pre-wrap`,text:t}):e.append(t),e.createEl(`p`,{cls:`whitespace-pre-wrap`,text:r(`migrationDescription`)}),new a(e).addButton(e=>e.setButtonText(r(`cancel`)).onClick(this.close.bind(this))).addButton(e=>e.setButtonText(r(`toggleWithoutMigration`)).onClick(async()=>{await n(),this.close()})).addButton(e=>e.setButtonText(r(`startMigration`)).setCta().onClick(this.handleMigration))}handleMigration=()=>{let{on:n,translate:r,dispatch:i}=this.ctx;this.contentEl.empty(),this.setTitle(r(`migrationProcess`));let{left:o,right:s,bar:c}=e(this.contentEl,`mb-3`),l,u=e=>{l?.remove(),l=new a(this.contentEl).addButton(t=>t.setButtonText(r(e)).onClick(this.close.bind(this))).settingEl};u(`hide`),this.cleanupCallbacks.push(n(`migrationProgress`,({total:e,completed:n,current:a})=>{n===0&&i(`logGeneral`,`Migration started.`);let l=t(n,e);s.setText(`${n}/${e} ${r(`completed`)}`),a&&o.setText(a),c.setValue(l),l===100&&u(`done`)}),n(`migrationFailed`,()=>{i(`errorGeneral`,`Migration failed.`),o.setText(r(`migrationFailed`)),u(`done`)})),this.migrate()};migrate=async()=>{let{dispatch:e,requestSync:t,initializeSync:r,translate:a,memoryDB:o}=this.ctx;e(`migrationProgress`,{completed:0,current:a(`migrationPhase1Description`),total:3});let s=(await t(`migration`)).result;if(s===`cancelled`||s===`failed`){e(`migrationFailed`,`phase 1 failed`);return}e(`migrationProgress`,{completed:1,current:a(`migrationPhase2Description`),total:3});try{let{record:e,remoteFs:t}=r();await Promise.all([e.clear(),this.options.apply(),...o.getStore(`remoteContext20000`).entries().sort(([e],[t])=>t.length-e.length).map(([e])=>t.delete(e))])}catch(t){let r=n(t);new i(`${a(`migrationFailed`)}: ${r}`),e(`migrationFailed`,r);return}e(`migrationProgress`,{completed:2,current:a(`migrationPhase3Description`),total:3});let c=(await t(`migration`)).result;if(c===`cancelled`||c===`failed`){e(`migrationFailed`,`phase 3 failed`);return}e(`migrationProgress`,{completed:3,current:a(`completed`),total:3})};onClose(){this.cleanupCallbacks.splice(0).forEach(e=>e()),this.contentEl.empty()}};function s(e,{toggle:t,needMigration:n,content:r,apply:i}){let a=!1;t.onChange(s=>{if(a){a=!1;return}let c=async n=>{n?(a=!0,t.setValue(!s),new o(e,{apply:async()=>{await i(s),a=!0,t.setValue(s)},content:r(s)}).open()):await i(s)},l=n?.(s)??!0;l instanceof Promise?l.then(c):c(l)})}export{s as default};
1
+ import e from"./render-progress.js";import t from"../utils/round-percent.js";import n from"../utils/to-error-message.js";import{Modal as r,Notice as i,Setting as a}from"obsidian";var o=class extends r{ctx;options;cleanupCallbacks=[];constructor(e,t){super(e.app),this.ctx=e,this.options=t,this.contentEl.addClass(`markdown-rendered`),this.setTitle(e.translate(`remoteMigration`))}onOpen(){let{contentEl:e,options:{content:t,apply:n}}=this,{translate:r}=this.ctx;e.empty(),typeof t==`string`?e.createEl(`p`,{cls:`whitespace-pre-wrap`,text:t}):e.append(t),e.createEl(`p`,{cls:`whitespace-pre-wrap`,text:r(`migrationDescription`)}),new a(e).addButton(e=>e.setButtonText(r(`cancel`)).onClick(this.close.bind(this))).addButton(e=>e.setButtonText(r(`toggleWithoutMigration`)).onClick(async()=>{await n(),this.close()})).addButton(e=>e.setButtonText(r(`startMigration`)).setCta().onClick(this.handleMigration))}handleMigration=()=>{let{on:n,translate:r,dispatch:i}=this.ctx;this.contentEl.empty(),this.setTitle(r(`migrationProcess`));let{left:o,right:s,bar:c}=e(this.contentEl,`mb-3`),l,u=e=>{l?.remove(),l=new a(this.contentEl).addButton(t=>t.setButtonText(r(e)).onClick(this.close.bind(this))).settingEl};u(`hide`),this.cleanupCallbacks.push(n(`migrationProgress`,({total:e,completed:n,current:a})=>{n===0&&i(`logGeneral`,`Migration started.`);let l=t(n,e);s.setText(`${n}/${e} ${r(`completed`)}`),a&&o.setText(a),c.setValue(l),l===100&&u(`done`)}),n(`migrationFailed`,()=>{i(`errorGeneral`,`Migration failed.`),o.setText(r(`migrationFailed`)),u(`done`)})),this.migrate()};migrate=async()=>{let{dispatch:e,requestSync:t,initializeSync:r,translate:a,memoryDB:o}=this.ctx;e(`migrationProgress`,{completed:0,current:a(`migrationPhase1Description`),total:3});let s=(await t(`migration`)).result;if(s===`cancelled`||s===`failed`){e(`migrationFailed`,`phase 1 failed`);return}e(`migrationProgress`,{completed:1,current:a(`migrationPhase2Description`),total:3});try{let{record:e,remoteFs:t}=r();await Promise.all([e.clear(),this.options.apply(),...o.getStore(`remoteContext20000`).entries().sort(([e],[t])=>t.length-e.length).map(([e])=>t.delete(e))])}catch(t){let r=n(t);new i(`${a(`migrationFailed`)}: ${r}`),e(`migrationFailed`,r);return}e(`migrationProgress`,{completed:2,current:a(`migrationPhase3Description`),total:3});let c=(await t(`migration`)).result;if(c===`cancelled`||c===`failed`){e(`migrationFailed`,`phase 3 failed`);return}e(`migrationProgress`,{completed:3,current:a(`completed`),total:3})};onClose(){this.cleanupCallbacks.splice(0).forEach(e=>e()),this.contentEl.empty()}};function s(e,{toggle:t,needMigration:n,content:r,apply:i}){let a=!1;t.onChange(s=>{if(a){a=!1;return}let c=async n=>{n?(a=!0,t.setValue(!s),new o(e,{apply:async()=>{await i(s),a=!0,t.setValue(s)},content:r(s)}).open()):await i(s)},l=n?.(s)??!0;l instanceof Promise?l.then(c):c(l)})}export{s as default};
@@ -0,0 +1 @@
1
+ import"obsidian";function e(e,t){return t?Object.assign(e,t):e}export{e as s};
@@ -0,0 +1 @@
1
+ import e from"../tasks/CreateLocalDir.js";import t from"../tasks/CreateRemoteDir.js";import n from"../tasks/Download.js";import r from"../tasks/Upload.js";import i from"../tasks/RemoveLocal.js";import a from"../tasks/RemoveRemote.js";import o from"../tasks/AddRecord.js";import s from"../tasks/RemoveRecord.js";import c from"../tasks/ResolveConflict.js";import l from"../tasks/MoveLocal.js";import u from"../tasks/MoveRemote.js";const d={addRecord:o,createLocalDir:e,createRemoteDir:t,download:n,moveLocal:l,moveRemote:u,removeLocal:i,removeRecord:s,removeRemote:a,resolveConflict:c,upload:r};export{d as taskMap};
@@ -0,0 +1 @@
1
+ import{BaseTask as e}from"./interface.js";var t=class extends e{async exec(){await this.record.set(this.key,n(this.local,this.remote))}};function n(e,t){return!e.isDir&&!t.isDir?{isDir:!1,local:e.uid,remote:t.uid}:{isDir:!0}}export{t as default};
@@ -0,0 +1 @@
1
+ import{BaseTask as e}from"./interface.js";var t=class extends e{async exec(){await this.localFs.mkdir(this.key),await this.record.set(this.key,{isDir:!0})}};export{t as default};
@@ -0,0 +1 @@
1
+ import{BaseTask as e}from"./interface.js";var t=class extends e{async exec(){await this.remoteFs.mkdir(this.key),await this.record.set(this.key,{isDir:!0})}};export{t as default};
@@ -0,0 +1 @@
1
+ import{BaseTask as e}from"./interface.js";import{pipe as t}from"../../utils/pipe.js";var n=class extends e{async exec(){let{remote:e,record:n,remoteFs:r,localFs:i,key:a}=this,o=await t({from:r,key:a,stat:e,to:i});o&&await n.set(a,{isDir:!1,local:o,remote:e.uid})}};export{n as default};
@@ -0,0 +1 @@
1
+ import{BaseTask as e}from"./interface.js";import t from"../../utils/move-value.js";var n=class extends e{async exec(){let{key:e,oldKey:n}=this.options;await this.localFs.move(n,e),await t({newKey:e,oldKey:n,store:this.record})}};export{n as default};
@@ -0,0 +1 @@
1
+ import{BaseTask as e}from"./interface.js";import t from"../../utils/move-value.js";var n=class extends e{async exec(){let{key:e,oldKey:n}=this.options;await this.remoteFs.move(n,e),await t({newKey:e,oldKey:n,store:this.record})}};export{n as default};
@@ -0,0 +1 @@
1
+ import{BaseTask as e}from"./interface.js";var t=class extends e{async exec(){await this.localFs.delete(this.key),await this.record.delete(this.key)}};export{t as default};
@@ -0,0 +1 @@
1
+ import{BaseTask as e}from"./interface.js";var t=class extends e{async exec(){await this.record.delete(this.key)}};export{t as default};
@@ -0,0 +1 @@
1
+ import{BaseTask as e}from"./interface.js";var t=class extends e{async exec(){await this.remoteFs.delete(this.key),await this.record.delete(this.key)}};export{t as default};
@@ -0,0 +1 @@
1
+ import{BaseTask as e}from"./interface.js";var t=class extends e{exec=()=>this.options.resolver({key:this.key,local:this.local,localFs:this.localFs,record:this.record,remote:this.remote,remoteFs:this.remoteFs})};export{t as default};
@@ -0,0 +1 @@
1
+ import{BaseTask as e}from"./interface.js";import{pipe as t}from"../../utils/pipe.js";var n=class extends e{async exec(){let{local:e,record:n,remoteFs:r,localFs:i,key:a}=this,o=await t({from:i,key:a,stat:e,to:r});o&&await n.set(a,{isDir:!1,local:e.uid,remote:o})}};export{n as default};
@@ -0,0 +1 @@
1
+ var e=class{options;constructor(e){this.options=e,this.remoteFs=e.remoteFs,this.localFs=e.localFs,this.record=e.record,this.key=e.key,this.local=e.local,this.remote=e.remote}remoteFs;localFs;record;key;local;remote};export{e as BaseTask};
@@ -0,0 +1 @@
1
+ async function e({store:e,newKey:t,oldKey:n}){let r=await e.get(n);r!==void 0&&await e.batch([{key:t,type:`set`,value:r},{key:n,type:`delete`}])}export{e as default};
@@ -1 +1 @@
1
- const e=new TextEncoder;function t(t){return e.encode(t)}function n(e,t={}){let{mtime:n=1,size:r=5,uid:i=`${e}-uid`}=t;return{isDir:!1,key:e,mtime:n,size:r,uid:i}}function r(e){return{isDir:!0,key:e}}function i(e){return e===`/`||e.endsWith(`/`)?r(e):n(e,{mtime:10,size:5,uid:`uid`})}function a(e=[]){return new ReadableStream({start(n){for(let r of e)n.enqueue(typeof r==`string`?t(r):r);n.close()}})}function o(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),reject:t,resolve:e}}async function s(e=4){for(let t=0;t<e;t+=1)await new Promise(e=>{queueMicrotask(e)})}function c(){return{delete:[],exists:[],list:[],mkdir:[],move:[],read:[],readStream:[],stat:[],write:[],writeStream:[]}}function l(e={}){return{delete:()=>{},exists:()=>!1,getUid:()=>`FsControl`,list:e=>[i(e),r(`${e}folder/`),n(`${e}folder/note.md`,{mtime:12,size:7,uid:`note-2`})],mkdir:()=>{},move:()=>{},read:()=>t(``),readStream:()=>a(),stat:e=>i(e),write:()=>`write-uid`,writeStream:()=>`stream-uid`,...e}}function u(e){let t=[];return{calls:t,request:n=>(t.push(n),e(n))}}function d(e={}){let t=c(),n=l(e.control),r=e.uid??`uid`;return{calls:t,control:n,fs:{delete:e=>(t.delete.push(e),n.delete(e)),exists:e=>(t.exists.push(e),n.exists(e)),getUid:()=>r,list:(e,r)=>(t.list.push(e),n.list(e,r)),mkdir:(e,r)=>(t.mkdir.push(e),n.mkdir(e,r)),move:(e,r)=>(t.move.push([e,r]),n.move(e,r)),read:(e,r)=>(t.read.push([e,r]),n.read(e,r)),readStream:(e,r)=>(t.readStream.push([e,r]),n.readStream(e,r)),stat:e=>(t.stat.push(e),n.stat(e)),write:(e,r,i)=>(t.write.push([e,r,i]),n.write(e,r,i)),writeStream:(e,r,i)=>(t.writeStream.push([e,i]),n.writeStream(e,r,i))}}}const f={bytes:t,deferred:o,file:n,flush:s,folder:r,fs:d,request:u,stream:a};export{f as default};
1
+ import{taskMap as e}from"../src/sync/decision/interface.js";const t=new TextEncoder;function n(e){return t.encode(e)}function r(e,t={}){let{mtime:n=1,size:r=5,uid:i=`${e}-uid`}=t;return{isDir:!1,key:e,mtime:n,size:r,uid:i}}function i(e){return{isDir:!0,key:e}}function a(e,t){return{isDir:!1,local:e,remote:t}}function o(){return{isDir:!0}}function s(t,n){let r=n.localStats??new Map,i=n.remoteStats??new Map,a=n.records??new Map,o=[];return t({localStats:r,logger:()=>{},records:a,remoteStats:i,taskFactory:((t,n)=>{let r=e[t],i=new r({...n,localFs:{},record:{},remoteFs:{}});return i.name=t,i.prettyName=t,o.push({key:n.key,name:t,...n.local!==void 0&&{local:n.local},...n.remote!==void 0&&{remote:n.remote}}),i})}),o}function c(e){return e.map(e=>e.name)}function l(e){return e.map(e=>e.key)}function u(e,t){let n=e.filter(e=>e.key===t);if(n.length!==1)throw Error(`Expected one task for ${t}, found ${n.length}.`);return n[0]}function d(e){return e===`/`||e.endsWith(`/`)?i(e):r(e,{mtime:10,size:5,uid:`uid`})}function f(e=[]){return new ReadableStream({start(t){for(let r of e)t.enqueue(typeof r==`string`?n(r):r);t.close()}})}function p(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),reject:t,resolve:e}}async function m(e=4){for(let t=0;t<e;t+=1)await new Promise(e=>{queueMicrotask(e)})}function h(){return{delete:[],exists:[],list:[],mkdir:[],move:[],read:[],readStream:[],stat:[],write:[],writeStream:[]}}function g(e={}){return{delete:()=>{},exists:()=>!1,getUid:()=>`FsControl`,list:e=>[d(e),i(`${e}folder/`),r(`${e}folder/note.md`,{mtime:12,size:7,uid:`note-2`})],mkdir:()=>{},move:()=>{},read:()=>n(``),readStream:()=>f(),stat:e=>d(e),write:()=>`write-uid`,writeStream:()=>`stream-uid`,...e}}function _(e){let t=[];return{calls:t,request:n=>(t.push(n),e(n))}}function v(e={}){let t=h(),n=g(e.control),r=e.uid??`uid`;return{calls:t,control:n,fs:{delete:e=>(t.delete.push(e),n.delete(e)),exists:e=>(t.exists.push(e),n.exists(e)),getUid:()=>r,list:(e,r)=>(t.list.push(e),n.list(e,r)),mkdir:(e,r)=>(t.mkdir.push(e),n.mkdir(e,r)),move:(e,r)=>(t.move.push([e,r]),n.move(e,r)),read:(e,r)=>(t.read.push([e,r]),n.read(e,r)),readStream:(e,r)=>(t.readStream.push([e,r]),n.readStream(e,r)),stat:e=>(t.stat.push(e),n.stat(e)),write:(e,r,i)=>(t.write.push([e,r,i]),n.write(e,r,i)),writeStream:(e,r,i)=>(t.writeStream.push([e,i]),n.writeStream(e,r,i))}}}const y={bytes:n,deferred:p,file:r,fileRecord:a,findTask:u,flush:m,folder:i,folderRecord:o,fs:v,request:_,runDecider:s,stream:f,taskKeys:l,taskNames:c};export{y as default};
package/dist/transform.js CHANGED
@@ -1 +1 @@
1
- function e(){return{name:`sync-engine-transform`,renderChunk(e){let t=e.replaceAll(/^\s*import\s+(?<name>[A-Za-z_$][\w$]*)\s+from\s+(?<quote>['"])obsidian\k<quote>\s*;?\s*$/gmv,(e,t)=>`const ${t} = window.syncEngineApiBridge;`).replaceAll(/^\s*import\s+\*\s+as\s+(?<name>[A-Za-z_$][\w$]*)\s+from\s+(?<quote>['"])obsidian\k<quote>\s*;?\s*$/gmv,(e,t)=>`const ${t} = window.syncEngineApiBridge;`).replaceAll(/^\s*import\s+(?!(?:type\b|\*\s+as\s+))(?<name>.+?)\s+from\s+(?<quote>['"])obsidian\k<quote>\s*;?\s*$/gmv,(e,t)=>`const ${t} = window.syncEngineApiBridge;`);return t===e?void 0:{code:t}},tsdownConfig(e){e.deps??={};let{neverBundle:t}=e.deps;t!==!0&&(typeof t==`function`?e.deps.neverBundle=(e,n,r)=>e===`obsidian`||t(e,n,r):Array.isArray(t)?t.push(`obsidian`):t?e.deps.neverBundle=[t,`obsidian`]:e.deps.neverBundle=[`obsidian`])}}}export{e as default};
1
+ function e(){return{name:`sync-engine-transform`,renderChunk(e){let t=e.replaceAll(/^[ \t]*import\s+['"]obsidian['"]\s*;?[ \t]*$/gmu,``).replaceAll(/^\s*import\s+(?<name>[A-Za-z_$][\w$]*)\s+from\s+(?<quote>['"])obsidian\k<quote>\s*;?\s*$/gmu,(e,t)=>`const ${t} = window.syncEngineApiBridge;`).replaceAll(/^\s*import\s+\*\s+as\s+(?<name>[A-Za-z_$][\w$]*)\s+from\s+(?<quote>['"])obsidian\k<quote>\s*;?\s*$/gmu,(e,t)=>`const ${t} = window.syncEngineApiBridge;`).replaceAll(/^\s*import\s+(?!(?:type\b|\*\s+as\s+))(?<name>.+?)\s+from\s+(?<quote>['"])obsidian\k<quote>\s*;?\s*$/gmu,(e,t)=>`const ${t} = window.syncEngineApiBridge;`);return t===e?void 0:{code:t}},tsdownConfig(e){e.deps??={};let{neverBundle:t}=e.deps;t!==!0&&(typeof t==`function`?e.deps.neverBundle=(e,n,r)=>e===`obsidian`||t(e,n,r):Array.isArray(t)?t.push(`obsidian`):t?e.deps.neverBundle=[t,`obsidian`]:e.deps.neverBundle=[`obsidian`])}}}export{e as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hesprs/sync-engine-sdk",
3
- "version": "3.0.3",
3
+ "version": "3.1.0",
4
4
  "description": "Official SDK for developing modules targeting Sync Engine, the extensible Obsidian syncing plugin.",
5
5
  "keywords": [
6
6
  "obsidian-plugin",
@@ -42,10 +42,10 @@
42
42
  "provenance": true
43
43
  },
44
44
  "scripts": {
45
- "dev:plugin": "MODE=dev BUILD=plugin tsdown",
46
- "build:plugin": "BUILD=plugin tsdown",
47
- "dev": "MODE=dev PASS=dts tsdown && MODE=dev tsdown",
48
- "compile": "PASS=dts tsdown && tsdown",
45
+ "dev:plugin": "MODE=dev BUILD=plugin bun --bun tsdown",
46
+ "build:plugin": "BUILD=plugin bun --bun tsdown",
47
+ "dev": "MODE=dev PASS=dts bun --bun tsdown && MODE=dev bun --bun tsdown",
48
+ "compile": "PASS=dts bun --bun tsdown && bun --bun tsdown",
49
49
  "fix": "oxlint --silent --fix && oxfmt",
50
50
  "check": "tsc && oxlint && oxfmt --check",
51
51
  "tests": "bun --preload=./test/mocks test"
@@ -56,7 +56,7 @@
56
56
  "devDependencies": {
57
57
  "@repo/shared": "workspace:*",
58
58
  "@unocss/postcss": "^66.7.5",
59
- "postcss-merge-rules": "^8.0.2",
59
+ "postcss-merge-rules": "^8.0.3",
60
60
  "solid-js": "^1.9.13",
61
61
  "synthkernel": "./synthkernel.tgz",
62
62
  "uni-kv": "../../uni-kv.tgz",