@hesprs/sync-engine-sdk 3.1.4 → 3.1.7

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.
Files changed (36) hide show
  1. package/dist/dev.js +1 -1
  2. package/dist/dev.spec.d.ts +1 -1
  3. package/dist/index-lLeUlsPq.spec.d.ts +1404 -0
  4. package/dist/index.js +1 -1
  5. package/dist/index.spec.d.ts +2 -833
  6. package/dist/node_modules/.bun/synthkernel@._synthkernel.tgz/node_modules/synthkernel/dist/reactive.js +1 -0
  7. package/dist/packages/plugin/src/components/MigrationModal.js +1 -0
  8. package/dist/prefix.js +1 -1
  9. package/dist/tsdown-plugin.spec.d.ts +2 -3
  10. package/package.json +7 -7
  11. package/dist/index-g3mTMY1u.spec.d.ts +0 -560
  12. package/dist/plugin/src/components/MigrationModal.js +0 -1
  13. /package/dist/{plugin → packages/plugin}/src/components/render-progress.js +0 -0
  14. /package/dist/{plugin → packages/plugin}/src/fs/wrappers/memory-control.js +0 -0
  15. /package/dist/{plugin → packages/plugin}/src/settings/utils.js +0 -0
  16. /package/dist/{plugin → packages/plugin}/src/sync/decision/interface.js +0 -0
  17. /package/dist/{plugin → packages/plugin}/src/sync/tasks/AddRecord.js +0 -0
  18. /package/dist/{plugin → packages/plugin}/src/sync/tasks/CreateLocalDir.js +0 -0
  19. /package/dist/{plugin → packages/plugin}/src/sync/tasks/CreateRemoteDir.js +0 -0
  20. /package/dist/{plugin → packages/plugin}/src/sync/tasks/Download.js +0 -0
  21. /package/dist/{plugin → packages/plugin}/src/sync/tasks/MoveLocal.js +0 -0
  22. /package/dist/{plugin → packages/plugin}/src/sync/tasks/MoveRemote.js +0 -0
  23. /package/dist/{plugin → packages/plugin}/src/sync/tasks/RemoveLocal.js +0 -0
  24. /package/dist/{plugin → packages/plugin}/src/sync/tasks/RemoveRecord.js +0 -0
  25. /package/dist/{plugin → packages/plugin}/src/sync/tasks/RemoveRemote.js +0 -0
  26. /package/dist/{plugin → packages/plugin}/src/sync/tasks/ResolveConflict.js +0 -0
  27. /package/dist/{plugin → packages/plugin}/src/sync/tasks/Upload.js +0 -0
  28. /package/dist/{plugin → packages/plugin}/src/sync/tasks/interface.js +0 -0
  29. /package/dist/{plugin → packages/plugin}/src/utils/move-value.js +0 -0
  30. /package/dist/{plugin → packages/plugin}/src/utils/pipe.js +0 -0
  31. /package/dist/{plugin → packages/plugin}/src/utils/round-percent.js +0 -0
  32. /package/dist/{plugin → packages/plugin}/src/utils/sha-256.js +0 -0
  33. /package/dist/{plugin → packages/plugin}/src/utils/to-error-message.js +0 -0
  34. /package/dist/{plugin → packages/plugin}/test/test-kit.js +0 -0
  35. /package/dist/{shared → packages/shared}/src/get-status.js +0 -0
  36. /package/dist/{shared → packages/shared}/src/path.js +0 -0
@@ -0,0 +1 @@
1
+ function e(e,n){let{equals:r=(e,t)=>e===t}=n??{},i=e,a=new Set,o=(e=>{if(e===void 0)return t?.(o),i;if(r(e,i))return;let n=i;i=e;for(let t of[...a])if(t(e,n)===`stop`)break});return o.subscribe=(e,t)=>(a.add(e),t?.immediate&&e(i,i),()=>o.unsubscribe(e)),o.clear=a.clear.bind(a),o.unsubscribe=e=>a.delete(e),o}let t;export{e as ref};
@@ -0,0 +1 @@
1
+ import{ref as e}from"../../../../node_modules/.bun/synthkernel@._synthkernel.tgz/node_modules/synthkernel/dist/reactive.js";import t from"./render-progress.js";import n from"../utils/round-percent.js";import r from"../utils/to-error-message.js";import{Modal as i,Notice as a,Setting as o}from"obsidian";var s=class extends i{ctx;options;cleanupCallbacks=[];completed=e(0);current=e(``);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 o(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{current:e,completed:r,ctx:i,cleanupCallbacks:a,contentEl:s,migrate:c}=this,{translate:l,dispatch:u}=i;s.empty(),this.setTitle(l(`migrationProcess`));let{left:d,right:f,bar:p}=t(s,`mb-3`),m,h=e=>{m?.remove(),m=new o(s).addButton(t=>t.setButtonText(l(e)).onClick(()=>this.close())).settingEl};h(`hide`),a.push(r.subscribe(e=>{f.setText(`${e}/3 ${l(`completed`)}`),p.setValue(n(e,3))}),e.subscribe(e=>d.setText(e))),c().then(e=>{h(`done`),e.success||(u(`errorGeneral`,`Migration failed.`),d.setText(l(`migrationFailed`)))})};migrate=async()=>{let{current:e,completed:t,ctx:n}=this,{dispatch:i,requestSync:o,initializeSync:s,translate:c,memoryDB:l}=n,u=(e,t)=>{if(e.result===`failed`)return{reason:`Phase ${t}: ${e.error}`,success:!1};if(e.result===`cancelled`)return{reason:`Phase ${t}: sync cancelled`,success:!1}};i(`logGeneral`,`Migration started.`),t(0),e(c(`migrationPhase1Description`));let d=u(await o(`nonInteractiveManual`),1);if(d)return d;t(1),e(c(`migrationPhase2Description`));try{let{record:e,remoteFs:t}=s();await Promise.all([e.clear(),this.options.apply(),...l.getStore(`remoteContext20000`).keys().sort((e,t)=>t.length-e.length).map(e=>t.delete(e))])}catch(e){let t=r(e);return new a(`${c(`migrationFailed`)}: ${t}`),{reason:`Phase 2: ${t}`,success:!1}}return t(2),e(c(`migrationPhase3Description`)),u(await o(`migration`),3)||(t(3),e(c(`completed`)),{success:!0})};onClose(){this.cleanupCallbacks.splice(0).forEach(e=>e()),this.contentEl.empty()}};function c(e,{toggle:t,needMigration:n,content:r,apply:i}){let a=!1;t.onChange(o=>{if(a){a=!1;return}let c=async n=>{n?(a=!0,t.setValue(!o),new s(e,{apply:async()=>{await i(o),a=!0,t.setValue(o)},content:r(o)}).open()):await i(o)},l=n?.(o)??!0;l instanceof Promise?l.then(c):c(l)})}export{c as default};
package/dist/prefix.js CHANGED
@@ -1 +1 @@
1
- import{normalizeBaseDir as e}from"./shared/src/path.js";function t(e,t){return t===`/`?e:e===`/`?t:`${e}${t}`}function n(e,t){if(e===`/`)return t;if(!t.startsWith(e))throw Error(`Accessed out-of-scope path "${t}"`);return t=t.slice(e.length),t===``?`/`:t}function r(e,t){return Object.assign(t,{key:n(e,t.key)})}function i(e,t){return t.map(t=>r(e,t)).filter(e=>e.key!==`/`)}var a=class{original;prefix;constructor(e,t){this.original=e,this.prefix=t}getUid(){return`${this.original.getUid()}~${this.prefix}`}read(e,n){return this.original.read(t(this.prefix,e),n)}readStream(e,n){return this.original.readStream(t(this.prefix,e),n)}write(e,n,r){return this.original.write(t(this.prefix,e),n,r)}writeStream(e,n,r){return this.original.writeStream(t(this.prefix,e),n,r)}delete(e){return this.original.delete(t(this.prefix,e))}move(e,n){return this.original.move(t(this.prefix,e),t(this.prefix,n))}mkdir(e,n){return this.original.mkdir(t(this.prefix,e),n)}async stat(e){let n=await this.original.stat(t(this.prefix,e));return r(this.prefix,n)}exists(e){return this.original.exists(t(this.prefix,e))}async list(e,r){let a=await this.original.list(t(this.prefix,e),e=>r(Object.assign(e,{current:n(this.prefix,e.current)})));return i(this.prefix,a)}};function o(t,n){return new a(t,e(n))}export{o as default};
1
+ import{normalizeBaseDir as e}from"./packages/shared/src/path.js";function t(e,t){return t===`/`?e:e===`/`?t:`${e}${t}`}function n(e,t){if(e===`/`)return t;if(!t.startsWith(e))throw Error(`Accessed out-of-scope path "${t}"`);return t=t.slice(e.length),t===``?`/`:t}function r(e,t){return Object.assign(t,{key:n(e,t.key)})}function i(e,t){return t.map(t=>r(e,t)).filter(e=>e.key!==`/`)}var a=class{original;prefix;constructor(e,t){this.original=e,this.prefix=t}getUid(){return`${this.original.getUid()}~${this.prefix}`}read(e,n){return this.original.read(t(this.prefix,e),n)}readStream(e,n){return this.original.readStream(t(this.prefix,e),n)}write(e,n,r){return this.original.write(t(this.prefix,e),n,r)}writeStream(e,n,r){return this.original.writeStream(t(this.prefix,e),n,r)}delete(e){return this.original.delete(t(this.prefix,e))}move(e,n){return this.original.move(t(this.prefix,e),t(this.prefix,n))}mkdir(e,n){return this.original.mkdir(t(this.prefix,e),n)}async stat(e){let n=await this.original.stat(t(this.prefix,e));return r(this.prefix,n)}exists(e){return this.original.exists(t(this.prefix,e))}async list(e,r){let a=await this.original.list(t(this.prefix,e),e=>r(Object.assign(e,{current:n(this.prefix,e.current)})));return i(this.prefix,a)}};function o(t,n){return new a(t,e(n))}export{o as default};
@@ -8,7 +8,7 @@ type ModuleMeta = Partial<Record<'name' | 'icon' | 'description' | 'source' | 'v
8
8
  type ModuleMetaWithId = ModuleMeta & {
9
9
  id: string;
10
10
  };
11
- declare function syncEngineModule(meta?: ModuleMeta | Array<ModuleMetaWithId> | Record<string, ModuleMeta>): {
11
+ export default function syncEngineModule(meta?: ModuleMeta | Array<ModuleMetaWithId> | Record<string, ModuleMeta>): {
12
12
  name: string;
13
13
  renderChunk(code: string, chunk: {
14
14
  name: string;
@@ -18,5 +18,4 @@ declare function syncEngineModule(meta?: ModuleMeta | Array<ModuleMetaWithId> |
18
18
  } | undefined;
19
19
  tsdownConfig(config: SyncEngineConfig): void;
20
20
  };
21
- //#endregion
22
- export { syncEngineModule as default };
21
+ //#endregion
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hesprs/sync-engine-sdk",
3
- "version": "3.1.4",
3
+ "version": "3.1.7",
4
4
  "description": "Official SDK for developing modules targeting Sync Engine, the extensible Obsidian syncing plugin.",
5
5
  "keywords": [
6
6
  "obsidian-plugin",
@@ -14,7 +14,7 @@
14
14
  "license": "MIT",
15
15
  "author": {
16
16
  "name": "Hēsperus",
17
- "email": "hesprs@outlook.com"
17
+ "email": "hesprs@yandex.com"
18
18
  },
19
19
  "repository": {
20
20
  "type": "git",
@@ -59,13 +59,13 @@
59
59
  },
60
60
  "devDependencies": {
61
61
  "@repo/shared": "workspace:*",
62
- "@unocss/postcss": "^66.7.5",
63
- "postcss-merge-rules": "^8.0.3",
64
- "solid-js": "^1.9.13",
62
+ "@unocss/postcss": "^66.10.0",
63
+ "postcss-merge-rules": "^9.0.3",
64
+ "solid-js": "^1.9.15",
65
65
  "synthkernel": "./synthkernel.tgz",
66
66
  "uni-kv": "../../uni-kv.tgz",
67
- "unocss": "^66.7.5",
67
+ "unocss": "^66.10.0",
68
68
  "unplugin-solid": "^2.0.0",
69
- "verkit": "^0.3.2"
69
+ "verkit": "^0.4.0"
70
70
  }
71
71
  }
@@ -1,560 +0,0 @@
1
- import { App, ListedFiles, RequestUrlParam, Stat } from "obsidian";
2
- //#region ../shared/src/e2e-utils.spec.d.ts
3
- type General = any;
4
- //#endregion
5
- //#region ../shared/src/binary.d.ts
6
- type Binary = Uint8Array<ArrayBuffer>;
7
- //#endregion
8
- //#region src/types.d.ts
9
- type MaybePromise<T> = Promise<T> | T;
10
- type TogglableValue<T = number> = {
11
- enabled: boolean;
12
- value: T;
13
- };
14
- type FileStat = {
15
- isDir: false;
16
- key: string;
17
- mtime: number;
18
- size: number;
19
- uid: string;
20
- };
21
- type FolderStat = {
22
- isDir: true;
23
- key: string;
24
- };
25
- type Stat$1 = FileStat | FolderStat;
26
- type RecordStat = {
27
- isDir: false;
28
- local: string;
29
- remote: string;
30
- } | {
31
- isDir: true;
32
- };
33
- type StatsMap = Map<string, Stat$1>;
34
- type RecordStatsMap = Map<string, RecordStat>;
35
- type GlobMatchRule = {
36
- expr: string;
37
- caseSensitive: boolean;
38
- };
39
- type Progress<T = string> = {
40
- total: number;
41
- completed: number;
42
- current?: T;
43
- };
44
- //#endregion
45
- //#region src/fs/interface.d.ts
46
- /**
47
- * All keys use unified format:
48
- * - root: `/`
49
- * - file: `note.md`, `folder/note.md`
50
- * - folder: `folder/`, `folder/nested/`
51
- */
52
- type RootFs = {
53
- getUid(): string;
54
- read(key: string, stat: FileStat): MaybePromise<Binary>;
55
- readStream(key: string, stat: FileStat): MaybePromise<ReadableStream<Binary>>;
56
- write(key: string, value: Binary, stat: FileStat): MaybePromise<string>;
57
- writeStream(key: string, value: ReadableStream<Binary>, stat: FileStat): MaybePromise<string>;
58
- delete(key: string): MaybePromise<void>;
59
- move(oldKey: string, newKey: string): MaybePromise<void>;
60
- mkdir(key: string, recursive?: boolean): MaybePromise<void>;
61
- stat(key: string): MaybePromise<Stat$1>;
62
- exists(key: string): MaybePromise<boolean>;
63
- list(key: string, reporter: ListReporter): MaybePromise<Array<Stat$1>>;
64
- };
65
- type ListReporter = (progress: Required<Progress>) => MaybePromise<'include' | 'exclude' | 'advance'>;
66
- type WrappedFs = RootFs & {
67
- original: Fs;
68
- };
69
- type Fs = WrappedFs | RootFs;
70
- type WriteAtom = {
71
- type: 'write';
72
- key: string;
73
- execute: () => MaybePromise<string>;
74
- resolve: (uid: string) => void;
75
- reject: (err: Error) => void;
76
- };
77
- type DeleteAtom = {
78
- type: 'delete';
79
- key: string;
80
- execute: () => MaybePromise<void>;
81
- resolve: () => void;
82
- reject: (err: Error) => void;
83
- };
84
- type MoveAtom = {
85
- type: 'move';
86
- oldKey: string;
87
- newKey: string;
88
- execute: () => MaybePromise<void>;
89
- resolve: () => void;
90
- reject: (err: Error) => void;
91
- };
92
- type MkdirAtom = {
93
- type: 'mkdir';
94
- key: string;
95
- execute: () => MaybePromise<void>;
96
- resolve: () => void;
97
- reject: (err: Error) => void;
98
- };
99
- type InputAtom = WriteAtom | DeleteAtom | MoveAtom | MkdirAtom;
100
- type CustomAtom = {
101
- type: 'custom';
102
- execute: () => MaybePromise<void>;
103
- };
104
- type OutputAtom = InputAtom | CustomAtom;
105
- type OptimizerInput = {
106
- atoms: Array<InputAtom>;
107
- fs: Fs;
108
- executeAtom: (atom: OutputAtom) => Promise<void | string>;
109
- };
110
- type OptimizerOutput = Array<OutputAtom>;
111
- type BatchOptimizer = (input: OptimizerInput) => OptimizerOutput;
112
- //#endregion
113
- //#region ../../node_modules/.bun/uni-kv@..+..+uni-kv.tgz/node_modules/uni-kv/dist/interface.d.ts
114
- //#region src/interface.d.ts
115
- type Database<D extends Record<string, unknown>, M extends Record<string, unknown>, F extends boolean> = {
116
- getStore<K extends keyof D>(name: K): Store<D[K], F>;
117
- getStoreNames(): IsPromise<Array<string>, F>;
118
- deleteStore(name: string): IsPromise<void, F>;
119
- clearStores(): IsPromise<void, F>;
120
- getMeta<T extends keyof M>(key: T): IsPromise<M[T] | undefined, F>;
121
- setMeta<T extends keyof M>(key: T, value: M[T]): IsPromise<void, F>;
122
- dispose(): IsPromise<void, F>;
123
- };
124
- type Store<T, F extends boolean> = {
125
- get(key: string): IsPromise<T | undefined, F>;
126
- set(key: string, value: T): IsPromise<void, F>;
127
- delete(key: string): IsPromise<void, F>;
128
- clear(): IsPromise<void, F>;
129
- keys(): IsPromise<Array<string>, F>;
130
- values(): IsPromise<Array<T>, F>;
131
- entries(): IsPromise<Array<[string, T]>, F>;
132
- batch(operations: Array<StoreOperations<T>>): IsPromise<Array<GetResult<T>>, F>;
133
- };
134
- type StoreSync<T = unknown> = Store<T, false>;
135
- type StoreAsync<T = unknown> = Store<T, true>;
136
- type DatabaseSync<D extends Record<string, unknown> = Record<string, unknown>, M extends Record<string, unknown> = {}> = Database<D, M, false>;
137
- type DatabaseAsync<D extends Record<string, unknown> = Record<string, unknown>, M extends Record<string, unknown> = {}> = Database<D, M, true>;
138
- type GetOperation = {
139
- type: 'get';
140
- key: string;
141
- };
142
- type GetResult<T> = {
143
- key: string;
144
- value: T | undefined;
145
- };
146
- type SetOperation<T> = {
147
- type: 'set';
148
- key: string;
149
- value: T;
150
- };
151
- type DeleteOperation = {
152
- type: 'delete';
153
- key: string;
154
- };
155
- type StoreOperations<T> = GetOperation | SetOperation<T> | DeleteOperation;
156
- type IsPromise<T, F extends boolean> = F extends true ? Promise<T> : T;
157
- //#endregion
158
- //#region src/modules/Storage.d.ts
159
- type RecordStore = StoreAsync<RecordStat>;
160
- declare class Storage {
161
- private readonly ctx;
162
- private readonly memoryDB;
163
- private readonly indexedDB;
164
- constructor(ctx: {
165
- getNamespace: () => string;
166
- });
167
- private readonly getRecordStore;
168
- private readonly deleteRecordStore;
169
- private readonly clearRecordStores;
170
- private readonly recordStoreExists;
171
- readonly root: {
172
- clearRecordStores: () => Promise<void>;
173
- deleteRecordStore: (namespace?: string) => MaybePromise<void>;
174
- getRecordStore: (namespace?: string) => {
175
- get(key: string): Promise<RecordStat | undefined>;
176
- set(key: string, value: RecordStat): Promise<void>;
177
- delete(key: string): Promise<void>;
178
- clear(): Promise<void>;
179
- keys(): Promise<string[]>;
180
- values(): Promise<RecordStat[]>;
181
- entries(): Promise<[string, RecordStat][]>;
182
- batch(operations: StoreOperations<RecordStat>[]): Promise<GetResult<RecordStat>[]>;
183
- };
184
- indexedDB: DatabaseAsync<General, General>;
185
- memoryDB: {
186
- getStore<K extends string | number | symbol>(name: K): {
187
- get(key: string): any;
188
- set(key: string, value: any): void;
189
- delete(key: string): void;
190
- clear(): void;
191
- keys(): string[];
192
- values(): any[];
193
- entries(): [string, any][];
194
- batch(operations: StoreOperations<any>[]): GetResult<any>[];
195
- };
196
- getStoreNames(): string[];
197
- deleteStore(name: string): void;
198
- clearStores(): void;
199
- getMeta<T extends string | number | symbol>(key: T): any;
200
- setMeta<T extends string | number | symbol>(key: T, value: any): void;
201
- dispose(): void;
202
- };
203
- recordStoreExists: (namespace?: string) => MaybePromise<boolean>;
204
- };
205
- readonly dispose: () => void;
206
- }
207
- //#endregion
208
- //#region src/sync/tasks/interface.d.ts
209
- type BaseTaskOptions = {
210
- localFs: Fs;
211
- remoteFs: Fs;
212
- record: RecordStore;
213
- };
214
- type TaskNames = 'addRecord' | 'removeRecord' | 'createLocalDir' | 'createRemoteDir' | 'download' | 'resolveConflict' | 'removeLocal' | 'removeRemote' | 'upload' | 'moveLocal' | 'moveRemote';
215
- type ConflictResolverPayload = {
216
- local: FileStat;
217
- remote: FileStat;
218
- key: string;
219
- localFs: Fs;
220
- remoteFs: Fs;
221
- record: RecordStore;
222
- };
223
- type ConflictResolver = (payload: ConflictResolverPayload) => MaybePromise<void>;
224
- declare abstract class BaseTask<T extends TaskOptions = TaskOptions> {
225
- readonly options: BaseTaskOptions & T;
226
- constructor(options: BaseTaskOptions & T);
227
- protected readonly remoteFs: Fs;
228
- protected readonly localFs: Fs;
229
- protected readonly record: RecordStore;
230
- name: TaskNames;
231
- prettyName: string;
232
- readonly key: string;
233
- readonly local: (BaseTaskOptions & T)['local'];
234
- readonly remote: (BaseTaskOptions & T)['remote'];
235
- abstract exec(): MaybePromise<void>;
236
- }
237
- //#endregion
238
- //#region src/sync/tasks/AddRecord.d.ts
239
- declare class AddRecord extends BaseTask<OptionsWithBothStats> {
240
- exec(): Promise<void>;
241
- }
242
- //#endregion
243
- //#region src/sync/tasks/CreateRemoteDir.d.ts
244
- declare class CreateRemoteDir extends BaseTask<OptionsWithLocalFolderStat> {
245
- exec(): Promise<void>;
246
- }
247
- //#endregion
248
- //#region src/sync/tasks/Download.d.ts
249
- declare class Download extends BaseTask<OptionsWithRemoteFileStat> {
250
- exec(): Promise<void>;
251
- }
252
- //#endregion
253
- //#region src/sync/tasks/MoveLocal.d.ts
254
- declare class MoveLocal extends BaseTask<OptionsWithRemoteStatAndOldKey> {
255
- exec(): Promise<void>;
256
- }
257
- //#endregion
258
- //#region src/sync/tasks/MoveRemote.d.ts
259
- declare class MoveRemote extends BaseTask<OptionsWithLocalStatAndOldKey> {
260
- exec(): Promise<void>;
261
- }
262
- //#endregion
263
- //#region src/sync/tasks/RemoveLocal.d.ts
264
- declare class RemoveLocal extends BaseTask<OptionsWithLocalStat> {
265
- exec(): Promise<void>;
266
- }
267
- //#endregion
268
- //#region src/sync/tasks/RemoveRecord.d.ts
269
- declare class RemoveRecord extends BaseTask {
270
- exec(): Promise<void>;
271
- }
272
- //#endregion
273
- //#region src/sync/tasks/RemoveRemote.d.ts
274
- declare class RemoveRemote extends BaseTask<OptionsWithRemoteStat> {
275
- exec(): Promise<void>;
276
- }
277
- //#endregion
278
- //#region src/sync/tasks/ResolveConflict.d.ts
279
- declare class ResolveConflict extends BaseTask<OptionsWithBothFileStats & {
280
- resolver: ConflictResolver;
281
- }> {
282
- exec: () => MaybePromise<void>;
283
- }
284
- //#endregion
285
- //#region src/sync/tasks/Upload.d.ts
286
- declare class Upload extends BaseTask<OptionsWithLocalFileStat> {
287
- exec(): Promise<void>;
288
- }
289
- //#endregion
290
- //#region src/sync/decision/interface.d.ts
291
- type TaskOptions = {
292
- key: string;
293
- remote?: Stat$1;
294
- local?: Stat$1;
295
- };
296
- type OptionsWithRemoteFileStat = {
297
- remote: FileStat;
298
- } & TaskOptions;
299
- type OptionsWithLocalFileStat = {
300
- local: FileStat;
301
- } & TaskOptions;
302
- type OptionsWithRemoteFolderStat = {
303
- remote: FolderStat;
304
- } & TaskOptions;
305
- type OptionsWithLocalFolderStat = {
306
- local: FolderStat;
307
- } & TaskOptions;
308
- type OptionsWithLocalStat = {
309
- local: Stat$1;
310
- } & TaskOptions;
311
- type OptionsWithRemoteStat = {
312
- remote: Stat$1;
313
- } & TaskOptions;
314
- type OptionsWithBothStats = {
315
- local: Stat$1;
316
- remote: Stat$1;
317
- } & TaskOptions;
318
- type OptionsWithBothFileStats = {
319
- local: FileStat;
320
- remote: FileStat;
321
- } & TaskOptions;
322
- type OptionsWithLocalStatAndOldKey = {
323
- local: Stat$1;
324
- oldKey: string;
325
- } & TaskOptions;
326
- type OptionsWithRemoteStatAndOldKey = {
327
- remote: Stat$1;
328
- oldKey: string;
329
- } & TaskOptions;
330
- type TaskOptionsMap = {
331
- download: OptionsWithRemoteFileStat;
332
- upload: OptionsWithLocalFileStat;
333
- resolveConflict: OptionsWithBothFileStats;
334
- removeLocal: OptionsWithLocalStat;
335
- removeRemote: OptionsWithRemoteStat;
336
- createLocalDir: OptionsWithRemoteFolderStat;
337
- createRemoteDir: OptionsWithLocalFolderStat;
338
- removeRecord: TaskOptions;
339
- addRecord: OptionsWithBothStats;
340
- moveLocal: OptionsWithRemoteStatAndOldKey;
341
- moveRemote: OptionsWithLocalStatAndOldKey;
342
- };
343
- declare const taskMap: {
344
- readonly addRecord: typeof AddRecord;
345
- readonly createLocalDir: typeof CreateLocalDir;
346
- readonly createRemoteDir: typeof CreateRemoteDir;
347
- readonly download: typeof Download;
348
- readonly moveLocal: typeof MoveLocal;
349
- readonly moveRemote: typeof MoveRemote;
350
- readonly removeLocal: typeof RemoveLocal;
351
- readonly removeRecord: typeof RemoveRecord;
352
- readonly removeRemote: typeof RemoveRemote;
353
- readonly resolveConflict: typeof ResolveConflict;
354
- readonly upload: typeof Upload;
355
- };
356
- type TaskFactory = <N extends TaskNames>(name: N, options: TaskOptionsMap[N]) => InstanceType<(typeof taskMap)[N]>;
357
- type Decider = (input: DeciderInput) => Array<BaseTask>;
358
- type DeciderInput = {
359
- localStats: StatsMap;
360
- remoteStats: StatsMap;
361
- records: RecordStatsMap;
362
- taskFactory: TaskFactory;
363
- logger: (log: string) => void;
364
- };
365
- //#endregion
366
- //#region src/sync/tasks/CreateLocalDir.d.ts
367
- declare class CreateLocalDir extends BaseTask<OptionsWithRemoteFolderStat> {
368
- exec(): Promise<void>;
369
- }
370
- //#endregion
371
- //#region src/modules/Registrar.d.ts
372
- type RejectableWrapper<T> = (value: T) => T | undefined;
373
- type OrderedWrapperEntry<T> = {
374
- priority: number;
375
- apply: RejectableWrapper<T>;
376
- };
377
- type RemoteRequestMiddlewareEntry = OrderedWrapperEntry<Request>;
378
- type LocalRequestMiddlewareEntry = OrderedWrapperEntry<VaultRequest>;
379
- type FsWrapperEntry = OrderedWrapperEntry<Fs>;
380
- type CheckConnectionResult = {
381
- success: true;
382
- } | {
383
- success: false;
384
- reason: string;
385
- };
386
- type RemoteFsEntry = {
387
- instantiate: (request: Request) => RootFs;
388
- prettyName: () => string;
389
- checkConnection: (request: Request) => MaybePromise<CheckConnectionResult>;
390
- };
391
- type DeciderEntry = {
392
- decider: Decider;
393
- prettyName: () => string;
394
- };
395
- type ConflictResolverEntry = {
396
- prettyName: () => string;
397
- resolver: ConflictResolver;
398
- };
399
- type GeneralFn = (...args: ReadonlyArray<General>) => unknown;
400
- type RejectableApply<F extends GeneralFn> = (...input: Parameters<F>) => ReturnType<F> | undefined;
401
- type OrderedApplyEntry<F extends GeneralFn> = {
402
- apply: RejectableApply<F>;
403
- priority: number;
404
- };
405
- type RemoteLister = (info: Infras & {
406
- trigger: string;
407
- reporter: ListReporter;
408
- }) => MaybePromise<Array<Stat$1>>;
409
- type RemoteListerEntry = OrderedApplyEntry<RemoteLister>;
410
- type OptimizerEntry = OrderedApplyEntry<BatchOptimizer>;
411
- type RequestParam = Omit<RequestUrlParam, 'body'> & {
412
- body?: string | Binary;
413
- };
414
- type RequestResponse = {
415
- text: () => string;
416
- bytes: () => Binary;
417
- json: () => General;
418
- headers: Record<string, string>;
419
- status: number;
420
- };
421
- type Request = (params: RequestParam | string) => Promise<RequestResponse>;
422
- type Infras = {
423
- localFs: Fs;
424
- remoteFs: Fs;
425
- record: RecordStore;
426
- };
427
- declare class Registrar {
428
- private readonly ctx;
429
- private readonly cleanupCallbacks;
430
- private readonly localFsWrapperRegistry;
431
- private readonly remoteFsWrapperRegistry;
432
- private readonly localOptimizerRegistry;
433
- private readonly remoteOptimizerRegistry;
434
- private readonly remoteListerRegistry;
435
- private readonly remoteRequestMiddlewareRegistry;
436
- private readonly localRequestMiddlewareRegistry;
437
- private readonly remoteFsRegistry;
438
- private readonly deciderRegistry;
439
- private readonly conflictResolverRegistry;
440
- readonly settings: {
441
- remoteFs: string;
442
- decider: string;
443
- conflictResolver: string;
444
- };
445
- constructor(ctx: {
446
- app: App;
447
- getRecordStore: (namespace?: string) => StoreAsync<RecordStat>;
448
- });
449
- private readonly getVaultRequest;
450
- private readonly createLocalFs;
451
- private readonly createRemoteFs;
452
- private readonly getRequest;
453
- private readonly getCheckConnection;
454
- private readonly getDecider;
455
- private readonly optimizeLocal;
456
- private readonly optimizeRemote;
457
- private readonly listRemote;
458
- private readonly getConflictResolver;
459
- private readonly getNamespace;
460
- private readonly initializeSync;
461
- root: {
462
- conflictResolverRegistry: Map<string, ConflictResolverEntry>;
463
- createLocalFs: () => Fs;
464
- createRemoteFs: (remoteFs?: string) => Fs;
465
- deciderRegistry: Map<string, DeciderEntry>;
466
- getCheckConnection: (remoteFs?: string) => () => MaybePromise<CheckConnectionResult>;
467
- getConflictResolver: () => ConflictResolver;
468
- getDecider: () => Decider;
469
- getNamespace: (localFs?: Fs, remoteFs?: Fs) => string;
470
- getRequest: () => Request;
471
- getVaultRequest: () => VaultRequest;
472
- initializeSync: () => Infras;
473
- listRemote: RemoteLister;
474
- optimizeLocal: BatchOptimizer;
475
- optimizeRemote: BatchOptimizer;
476
- registerConflictResolver: (key: string, entry: ConflictResolverEntry) => () => boolean;
477
- registerCss: (css: string) => () => void;
478
- registerDecider: (key: string, entry: DeciderEntry) => () => boolean;
479
- registerLocalFsWrapper: (entry: FsWrapperEntry) => () => boolean;
480
- registerLocalOptimizer: (entry: OptimizerEntry) => () => boolean;
481
- registerLocalRequestMiddleware: (entry: LocalRequestMiddlewareEntry) => () => boolean;
482
- registerRemoteFs: (key: string, entry: RemoteFsEntry) => () => boolean;
483
- registerRemoteFsWrapper: (entry: FsWrapperEntry) => () => boolean;
484
- registerRemoteLister: (entry: RemoteListerEntry) => () => boolean;
485
- registerRemoteOptimizer: (entry: OptimizerEntry) => () => boolean;
486
- registerRemoteRequestMiddleware: (entry: RemoteRequestMiddlewareEntry) => () => boolean;
487
- remoteFsRegistry: Map<string, RemoteFsEntry>;
488
- };
489
- readonly dispose: () => void;
490
- }
491
- //#endregion
492
- //#region src/fs/vault/request.d.ts
493
- type VaultRequestParam = {
494
- method: 'GET';
495
- key: string;
496
- } | {
497
- method: 'GET_STREAM';
498
- key: string;
499
- } | {
500
- method: 'PUT';
501
- key: string;
502
- value: Binary;
503
- headers?: {
504
- mtime?: number;
505
- ctime?: number;
506
- };
507
- } | {
508
- method: 'APPEND';
509
- key: string;
510
- value: Binary;
511
- headers?: {
512
- mtime?: number;
513
- ctime?: number;
514
- };
515
- } | {
516
- method: 'DELETE';
517
- key: string;
518
- headers?: {
519
- permanent?: boolean;
520
- };
521
- } | {
522
- method: 'MOVE';
523
- key: string;
524
- headers: {
525
- destination: string;
526
- };
527
- } | {
528
- method: 'MKDIR';
529
- key: string;
530
- } | {
531
- method: 'EXISTS';
532
- key: string;
533
- } | {
534
- method: 'STAT';
535
- key: string;
536
- headers?: {
537
- cached?: boolean;
538
- };
539
- } | {
540
- method: 'LIST';
541
- key: string;
542
- headers?: {
543
- cached?: boolean;
544
- };
545
- };
546
- type VaultRequestResponseMap = {
547
- GET: Binary;
548
- GET_STREAM: ReadableStream<Binary>;
549
- PUT: void;
550
- APPEND: void;
551
- DELETE: void;
552
- MOVE: void;
553
- MKDIR: void;
554
- EXISTS: boolean;
555
- STAT: Stat;
556
- LIST: ListedFiles;
557
- };
558
- type VaultRequest = <T extends VaultRequestParam>(params: T) => Promise<VaultRequestResponseMap[T['method']]>;
559
- //#endregion
560
- export { RootFs as $, AddRecord as A, StoreOperations as B, RemoveRemote as C, MoveLocal as D, MoveRemote as E, RecordStore as F, Fs as G, BatchOptimizer as H, Storage as I, MkdirAtom as J, InputAtom as K, DatabaseAsync as L, ConflictResolver as M, ConflictResolverPayload as N, Download as O, TaskNames as P, OutputAtom as Q, DatabaseSync as R, ResolveConflict as S, RemoveLocal as T, CustomAtom as U, StoreSync as V, DeleteAtom as W, OptimizerInput as X, MoveAtom as Y, OptimizerOutput as Z, CreateLocalDir as _, FsWrapperEntry as a, MaybePromise as at, TaskFactory as b, OptimizerEntry as c, RecordStatsMap as ct, RemoteLister as d, TogglableValue as dt, WrappedFs as et, RemoteListerEntry as f, Binary as ft, RequestResponse as g, RequestParam as h, DeciderEntry as i, GlobMatchRule as it, BaseTask as j, CreateRemoteDir as k, Registrar as l, Stat$1 as lt, Request as m, CheckConnectionResult as n, FileStat as nt, Infras as o, Progress as ot, RemoteRequestMiddlewareEntry as p, General as pt, ListReporter as q, ConflictResolverEntry as r, FolderStat as rt, LocalRequestMiddlewareEntry as s, RecordStat as st, VaultRequest as t, WriteAtom as tt, RemoteFsEntry as u, StatsMap as ut, Decider as v, RemoveRecord as w, Upload as x, DeciderInput as y, StoreAsync as z };
@@ -1 +0,0 @@
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};