@hesprs/sync-engine-sdk 3.1.8 → 3.2.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.
- package/dist/dev.js +1 -1
- package/dist/dev.spec.d.ts +9 -3
- package/dist/{index-CC4NddoN.spec.d.ts → index-DbDrKV7S.spec.d.ts} +139 -162
- package/dist/index.js +1 -1
- package/dist/index.spec.d.ts +2 -2
- package/dist/plugin/src/components/MigrationModal.js +1 -0
- package/dist/{packages/plugin → plugin}/src/settings/utils.js +1 -1
- package/dist/plugin/src/utils/pipe.js +1 -0
- package/dist/plugin/test/test-kit.js +1 -0
- package/dist/prefix.js +1 -1
- package/package.json +1 -1
- package/dist/node_modules/.bun/synthkernel@._synthkernel.tgz/node_modules/synthkernel/dist/reactive.js +0 -1
- package/dist/packages/plugin/src/components/MigrationModal.js +0 -1
- package/dist/packages/plugin/src/components/render-progress.js +0 -1
- package/dist/packages/plugin/src/utils/pipe.js +0 -1
- package/dist/packages/plugin/src/utils/round-percent.js +0 -1
- package/dist/packages/plugin/src/utils/to-error-message.js +0 -1
- package/dist/packages/plugin/test/test-kit.js +0 -1
- /package/dist/{packages/plugin → plugin}/src/fs/wrappers/memory-control.js +0 -0
- /package/dist/{packages/plugin → plugin}/src/sync/decision/interface.js +0 -0
- /package/dist/{packages/plugin → plugin}/src/sync/tasks/AddRecord.js +0 -0
- /package/dist/{packages/plugin → plugin}/src/sync/tasks/CreateLocalDir.js +0 -0
- /package/dist/{packages/plugin → plugin}/src/sync/tasks/CreateRemoteDir.js +0 -0
- /package/dist/{packages/plugin → plugin}/src/sync/tasks/Download.js +0 -0
- /package/dist/{packages/plugin → plugin}/src/sync/tasks/MoveLocal.js +0 -0
- /package/dist/{packages/plugin → plugin}/src/sync/tasks/MoveRemote.js +0 -0
- /package/dist/{packages/plugin → plugin}/src/sync/tasks/RemoveLocal.js +0 -0
- /package/dist/{packages/plugin → plugin}/src/sync/tasks/RemoveRecord.js +0 -0
- /package/dist/{packages/plugin → plugin}/src/sync/tasks/RemoveRemote.js +0 -0
- /package/dist/{packages/plugin → plugin}/src/sync/tasks/ResolveConflict.js +0 -0
- /package/dist/{packages/plugin → plugin}/src/sync/tasks/Upload.js +0 -0
- /package/dist/{packages/plugin → plugin}/src/sync/tasks/interface.js +0 -0
- /package/dist/{packages/plugin → plugin}/src/utils/move-value.js +0 -0
- /package/dist/{packages/plugin → plugin}/src/utils/sha-256.js +0 -0
- /package/dist/{packages/shared/src/get-status.js → shared/src/error.js} +0 -0
- /package/dist/{packages/shared → shared}/src/path.js +0 -0
package/dist/dev.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import e from"./debug-wrapper.js";import t from"./
|
|
1
|
+
import e from"./debug-wrapper.js";import t from"./plugin/test/test-kit.js";import n from"./plugin/src/utils/sha-256.js";export{e as debugWrapper,n as sha256,t as testKit};
|
package/dist/dev.spec.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { At as FileStat, Dt as RootFs, Ft as RecordStatsMap, It as Stat, Lt as StatsMap, Ot as WrappedFs, Pt as RecordStat, Rt as Binary,
|
|
1
|
+
import { At as FileStat, Dt as RootFs, Ft as RecordStatsMap, It as Stat, K as Decider, Lt as StatsMap, Mt as MaybePromise, Ot as WrappedFs, Pt as RecordStat, Rt as Binary, ct as TaskNames, d as RequestResponse, jt as FolderStat, l as Request, u as RequestParam, vt as Fs } from "./index-DbDrKV7S.spec.js";
|
|
2
2
|
//#region src/sdk/debug-wrapper.d.ts
|
|
3
3
|
declare function debugWrapper(original: Fs, log: (content: string) => void): WrappedFs;
|
|
4
4
|
//#endregion
|
|
@@ -24,8 +24,11 @@ type FsHarness = {
|
|
|
24
24
|
control: Fs;
|
|
25
25
|
fs: RootFs;
|
|
26
26
|
};
|
|
27
|
+
type ResponseControl = (url: string, params: RequestParam) => MaybePromise<ResponseOverrides>;
|
|
27
28
|
type RequestHarness = {
|
|
28
|
-
calls: Array<RequestParam
|
|
29
|
+
calls: Array<RequestParam & {
|
|
30
|
+
url: string;
|
|
31
|
+
}>;
|
|
29
32
|
request: Request;
|
|
30
33
|
};
|
|
31
34
|
type ExtractedTask = {
|
|
@@ -58,7 +61,10 @@ declare function deferred<T>(): {
|
|
|
58
61
|
resolve: (value: T | PromiseLike<T>) => void;
|
|
59
62
|
};
|
|
60
63
|
declare function flush(turns?: number): Promise<void>;
|
|
61
|
-
|
|
64
|
+
type ResponseOverrides = Partial<Omit<RequestResponse, 'json'>> & {
|
|
65
|
+
json?: () => unknown;
|
|
66
|
+
};
|
|
67
|
+
declare function request(control: ResponseControl): RequestHarness;
|
|
62
68
|
declare function fs(options?: FsOptions): FsHarness;
|
|
63
69
|
declare const testKit: {
|
|
64
70
|
bytes: typeof bytes;
|
|
@@ -32,9 +32,9 @@ type RecordStat = {
|
|
|
32
32
|
};
|
|
33
33
|
type StatsMap = Map<string, Stat$1>;
|
|
34
34
|
type RecordStatsMap = Map<string, RecordStat>;
|
|
35
|
-
type
|
|
35
|
+
type GlobStrategy = {
|
|
36
36
|
expr: string;
|
|
37
|
-
|
|
37
|
+
strategy: string;
|
|
38
38
|
};
|
|
39
39
|
type Progress<T = string> = {
|
|
40
40
|
total: number;
|
|
@@ -62,7 +62,8 @@ type RootFs = {
|
|
|
62
62
|
exists(key: string): MaybePromise<boolean>;
|
|
63
63
|
list(key: string, reporter: ListReporter): MaybePromise<Array<Stat$1>>;
|
|
64
64
|
};
|
|
65
|
-
type
|
|
65
|
+
type ListOptions = 'include' | 'exclude' | 'advance';
|
|
66
|
+
type ListReporter = (progress: Required<Progress>) => MaybePromise<ListOptions>;
|
|
66
67
|
type WrappedFs = RootFs & {
|
|
67
68
|
original: Fs;
|
|
68
69
|
};
|
|
@@ -203,7 +204,7 @@ declare class Storage {
|
|
|
203
204
|
private readonly memoryDB;
|
|
204
205
|
private readonly indexedDB;
|
|
205
206
|
constructor(ctx: {
|
|
206
|
-
getNamespace: () => string;
|
|
207
|
+
getNamespace: () => string | Error;
|
|
207
208
|
});
|
|
208
209
|
private readonly getRecordStore;
|
|
209
210
|
private readonly deleteRecordStore;
|
|
@@ -212,16 +213,7 @@ declare class Storage {
|
|
|
212
213
|
readonly root: {
|
|
213
214
|
clearRecordStores: () => Promise<void>;
|
|
214
215
|
deleteRecordStore: (namespace?: string) => MaybePromise<void>;
|
|
215
|
-
getRecordStore: (namespace?:
|
|
216
|
-
get(key: string): Promise<RecordStat | undefined>;
|
|
217
|
-
set(key: string, value: RecordStat): Promise<void>;
|
|
218
|
-
delete(key: string): Promise<void>;
|
|
219
|
-
clear(): Promise<void>;
|
|
220
|
-
keys(): Promise<string[]>;
|
|
221
|
-
values(): Promise<RecordStat[]>;
|
|
222
|
-
entries(): Promise<[string, RecordStat][]>;
|
|
223
|
-
batch(operations: StoreOperations<RecordStat>[]): Promise<GetResult<RecordStat>[]>;
|
|
224
|
-
};
|
|
216
|
+
getRecordStore: <N extends string | undefined>(namespace?: N) => N extends string ? RecordStore : RecordStore | undefined;
|
|
225
217
|
indexedDB: DatabaseAsync<General$1, General$1>;
|
|
226
218
|
memoryDB: {
|
|
227
219
|
getStore<K extends string | number | symbol>(name: K): {
|
|
@@ -401,7 +393,6 @@ type DeciderInput = {
|
|
|
401
393
|
remoteStats: StatsMap;
|
|
402
394
|
records: RecordStatsMap;
|
|
403
395
|
taskFactory: TaskFactory;
|
|
404
|
-
logger: (log: string) => void;
|
|
405
396
|
};
|
|
406
397
|
//#endregion
|
|
407
398
|
//#region src/sync/tasks/CreateLocalDir.d.ts
|
|
@@ -416,8 +407,8 @@ declare class EventBus {
|
|
|
416
407
|
readonly events: {
|
|
417
408
|
logSync: string;
|
|
418
409
|
logGeneral: string;
|
|
419
|
-
errorSync:
|
|
420
|
-
errorGeneral:
|
|
410
|
+
errorSync: Error;
|
|
411
|
+
errorGeneral: Error;
|
|
421
412
|
};
|
|
422
413
|
private readonly cleanupCallbacks;
|
|
423
414
|
private readonly isIdle;
|
|
@@ -427,6 +418,8 @@ declare class EventBus {
|
|
|
427
418
|
private readonly getThisSync;
|
|
428
419
|
private readonly putSyncLog;
|
|
429
420
|
private readonly putGeneralLog;
|
|
421
|
+
private readonly putSyncError;
|
|
422
|
+
private readonly putGeneralError;
|
|
430
423
|
private readonly subscribers;
|
|
431
424
|
private readonly on;
|
|
432
425
|
private readonly dispatch;
|
|
@@ -460,6 +453,84 @@ declare class I18n {
|
|
|
460
453
|
};
|
|
461
454
|
}
|
|
462
455
|
//#endregion
|
|
456
|
+
//#region src/utils/glob-match.d.ts
|
|
457
|
+
type GlobMatchResult = {
|
|
458
|
+
strategy: string;
|
|
459
|
+
advance?: boolean;
|
|
460
|
+
};
|
|
461
|
+
//#endregion
|
|
462
|
+
//#region src/modules/Sync.d.ts
|
|
463
|
+
type SyncTerminateReason = {
|
|
464
|
+
result: 'cancelled';
|
|
465
|
+
} | {
|
|
466
|
+
result: 'completed';
|
|
467
|
+
} | {
|
|
468
|
+
result: 'failed';
|
|
469
|
+
error: Error;
|
|
470
|
+
} | {
|
|
471
|
+
result: 'noop';
|
|
472
|
+
};
|
|
473
|
+
type TaskInfo = {
|
|
474
|
+
name: TaskNames;
|
|
475
|
+
key: string;
|
|
476
|
+
prettyName: string;
|
|
477
|
+
isDir: boolean;
|
|
478
|
+
};
|
|
479
|
+
type FailedTaskInfo = TaskInfo & {
|
|
480
|
+
error: Error;
|
|
481
|
+
};
|
|
482
|
+
type RemoteLister = (info: Infras & {
|
|
483
|
+
reporter: ListReporter;
|
|
484
|
+
}) => MaybePromise<Array<Stat$1>>;
|
|
485
|
+
type SyncOptions = {
|
|
486
|
+
remoteLister?: RemoteLister;
|
|
487
|
+
conflictResolver?: ConflictResolver;
|
|
488
|
+
detectMoves?: boolean;
|
|
489
|
+
needConfirmTasks?: boolean;
|
|
490
|
+
needConfirmDeletion?: boolean;
|
|
491
|
+
syncStrategy?: Array<GlobStrategy>;
|
|
492
|
+
};
|
|
493
|
+
declare class Sync {
|
|
494
|
+
private readonly ctx;
|
|
495
|
+
constructor(ctx: {
|
|
496
|
+
dispatch: Dispatch<Events>;
|
|
497
|
+
initializeSync: () => Infras;
|
|
498
|
+
on: On<Events>;
|
|
499
|
+
translate: Translate<Translations>;
|
|
500
|
+
getConflictResolver: () => ConflictResolver;
|
|
501
|
+
decideTasks: (input: DecideTasksInput) => Array<BaseTask>;
|
|
502
|
+
});
|
|
503
|
+
readonly events: {
|
|
504
|
+
syncStarted: {
|
|
505
|
+
isCancelled: Ref<boolean>;
|
|
506
|
+
trigger: string;
|
|
507
|
+
};
|
|
508
|
+
syncInitialized: Infras & {
|
|
509
|
+
match: (path: string) => GlobMatchResult;
|
|
510
|
+
};
|
|
511
|
+
remoteWalkProgress: Progress;
|
|
512
|
+
syncTerminated: SyncTerminateReason;
|
|
513
|
+
requestConfirmDelete: Array<RemoveLocal>;
|
|
514
|
+
requestConfirmTasks: Array<BaseTask>;
|
|
515
|
+
syncCanceled: undefined;
|
|
516
|
+
taskCompleted: TaskInfo;
|
|
517
|
+
taskFailed: FailedTaskInfo;
|
|
518
|
+
executionStarted: Array<BaseTask>;
|
|
519
|
+
};
|
|
520
|
+
readonly settings: {
|
|
521
|
+
maxFileSize: TogglableValue;
|
|
522
|
+
syncStrategy: Array<GlobStrategy>;
|
|
523
|
+
};
|
|
524
|
+
private readonly postProcess;
|
|
525
|
+
private readonly confirmTasks;
|
|
526
|
+
private readonly confirmDeletion;
|
|
527
|
+
private readonly executeSync;
|
|
528
|
+
private readonly convertDeleteToUpload;
|
|
529
|
+
root: {
|
|
530
|
+
executeSync: (trigger: string, options?: SyncOptions) => Promise<SyncTerminateReason>;
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
//#endregion
|
|
463
534
|
//#region src/modules/Observability.d.ts
|
|
464
535
|
type SyncStage = 'none' | 'walkingRemote' | 'awaitingConfirmation' | 'executing' | 'completed' | 'completedNoop' | 'cancelled' | 'failed';
|
|
465
536
|
type AddRibbonIcon = (icon: IconName, title: string, callback: (evt: MouseEvent) => void) => HTMLElement;
|
|
@@ -709,7 +780,7 @@ declare function reactivelyValidate<T>({ text, parse, onSave, format, immediate
|
|
|
709
780
|
onSave: (value: T) => void;
|
|
710
781
|
immediate?: boolean;
|
|
711
782
|
}): void;
|
|
712
|
-
declare function generateEditableList<T>({ memoryDB, items, identifier, saveSettings, rerenderSettingTab, defaultValue, render, translations: { add, empty, heading }, extraButtons }: {
|
|
783
|
+
declare function generateEditableList<T>({ memoryDB, items, identifier, saveSettings, rerenderSettingTab, defaultValue, render, translations: { add, empty, heading }, extraButtons, reorder }: {
|
|
713
784
|
memoryDB: DatabaseSync<EphemeralEditableListSchema>;
|
|
714
785
|
items: Array<T>;
|
|
715
786
|
identifier: string;
|
|
@@ -723,6 +794,7 @@ declare function generateEditableList<T>({ memoryDB, items, identifier, saveSett
|
|
|
723
794
|
heading?: string;
|
|
724
795
|
};
|
|
725
796
|
extraButtons?: Array<(button: ExtraButtonComponent, list: Array<EphemeralEditableItem<T>>, save: () => void) => void>;
|
|
797
|
+
reorder?: boolean;
|
|
726
798
|
}): SettingDefinitionList;
|
|
727
799
|
//#endregion
|
|
728
800
|
//#region src/settings/controls.d.ts
|
|
@@ -765,28 +837,14 @@ type DevelopmentSettingTranslations = {
|
|
|
765
837
|
//#region src/components/MigrationModal.d.ts
|
|
766
838
|
type MigrationModalTranslations = {
|
|
767
839
|
cancel: string;
|
|
840
|
+
confirm: string;
|
|
768
841
|
remoteMigration: string;
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
migrationPhase1Description: string;
|
|
773
|
-
migrationPhase2Description: string;
|
|
774
|
-
migrationPhase3Description: string;
|
|
775
|
-
toggleWithoutMigration: string;
|
|
776
|
-
migrationFailed: string;
|
|
777
|
-
completed: string;
|
|
778
|
-
hide: string;
|
|
779
|
-
done: string;
|
|
780
|
-
};
|
|
781
|
-
type MigrationContext = {
|
|
842
|
+
migrationInstruction: Fragment;
|
|
843
|
+
};
|
|
844
|
+
declare function setNeedMigration({ app, translate }: {
|
|
782
845
|
app: App;
|
|
783
|
-
dispatch: Dispatch<Events>;
|
|
784
846
|
translate: Translate<MigrationModalTranslations>;
|
|
785
|
-
|
|
786
|
-
initializeSync: () => Infras;
|
|
787
|
-
memoryDB: ExistingMemoryDB;
|
|
788
|
-
};
|
|
789
|
-
declare function setNeedMigration(ctx: MigrationContext, { toggle, needMigration, content, apply }: {
|
|
847
|
+
}, { toggle, needMigration, content, apply }: {
|
|
790
848
|
toggle: ToggleComponent;
|
|
791
849
|
needMigration?: (value: boolean) => MaybePromise<boolean>;
|
|
792
850
|
content: (value: boolean) => string | DocumentFragment;
|
|
@@ -812,21 +870,6 @@ type FeaturesSettingTranslations = {
|
|
|
812
870
|
asymmetricStorageMigration: Fragment<boolean>;
|
|
813
871
|
} & MigrationModalTranslations;
|
|
814
872
|
//#endregion
|
|
815
|
-
//#region src/settings/filter.d.ts
|
|
816
|
-
type FilterSettingTranslations = {
|
|
817
|
-
filterRules: string;
|
|
818
|
-
inclusionRules: string;
|
|
819
|
-
inclusionRulesDescription: Fragment;
|
|
820
|
-
exclusionRules: string;
|
|
821
|
-
exclusionRulesDescription: Fragment;
|
|
822
|
-
xConfigured: Snippet<number>;
|
|
823
|
-
addInclusionRule: string;
|
|
824
|
-
addExclusionRule: string;
|
|
825
|
-
noRuleConfigured: string;
|
|
826
|
-
filterPlaceholder: string;
|
|
827
|
-
caseSensitive: string;
|
|
828
|
-
};
|
|
829
|
-
//#endregion
|
|
830
873
|
//#region src/sdk/prefix.d.ts
|
|
831
874
|
declare function prefixWrapper(original: Fs, prefix: string): WrappedFs;
|
|
832
875
|
//#endregion
|
|
@@ -854,17 +897,22 @@ type HeadSettingTranslations = {
|
|
|
854
897
|
backend: string;
|
|
855
898
|
backendDescription: string;
|
|
856
899
|
syncStrategy: string;
|
|
857
|
-
syncStrategyDescription:
|
|
900
|
+
syncStrategyDescription: Fragment;
|
|
901
|
+
globPlaceholder: string;
|
|
858
902
|
checkConnectionFailed: string;
|
|
859
903
|
checkConnectionSuccess: string;
|
|
860
904
|
checkConnection: string;
|
|
861
905
|
conflictResolveStrategy: string;
|
|
862
906
|
conflictResolveStrategyDescription: string;
|
|
863
907
|
xEnabled: Snippet<number>;
|
|
908
|
+
xConfigured: Snippet<number>;
|
|
864
909
|
settingTips: Fragment<{
|
|
865
910
|
labels: Array<LabelDefinition>;
|
|
866
911
|
addLabel: typeof addLabel;
|
|
867
912
|
}>;
|
|
913
|
+
addStrategy: string;
|
|
914
|
+
noStrategyConfigured: string;
|
|
915
|
+
dontSync: string;
|
|
868
916
|
};
|
|
869
917
|
declare function addLabel(element: Element, { text, tooltip, color, textColor }: LabelDefinition): HTMLSpanElement;
|
|
870
918
|
//#endregion
|
|
@@ -981,7 +1029,7 @@ declare class Bootstrap {
|
|
|
981
1029
|
keepRemote: string;
|
|
982
1030
|
renameAndKeepBoth: string;
|
|
983
1031
|
skip: string;
|
|
984
|
-
} & ControlsSettingTranslations & DevelopmentSettingTranslations & FeaturesSettingTranslations &
|
|
1032
|
+
} & ControlsSettingTranslations & DevelopmentSettingTranslations & FeaturesSettingTranslations & HeadSettingTranslations & MiscellaneousSettingTranslations & UntrustedModuleTranslations & FileTreeTranslations & ModulesTranslations;
|
|
985
1033
|
readonly settings: {
|
|
986
1034
|
maxMemoryConsumption: TogglableValue;
|
|
987
1035
|
maxRequestConcurrency: TogglableValue;
|
|
@@ -1103,8 +1151,7 @@ declare class Scheduler {
|
|
|
1103
1151
|
startupSync: TogglableValue;
|
|
1104
1152
|
scheduledSync: TogglableValue;
|
|
1105
1153
|
realtimeSync: TogglableValue;
|
|
1106
|
-
|
|
1107
|
-
inclusionRules: Array<GlobMatchRule>;
|
|
1154
|
+
syncStrategy: Array<GlobStrategy>;
|
|
1108
1155
|
avoidAutoSyncWhenOffline: boolean;
|
|
1109
1156
|
};
|
|
1110
1157
|
private readonly requestSync;
|
|
@@ -1138,78 +1185,6 @@ type Events = MergeSingleKey<InternalModules, 'events'>;
|
|
|
1138
1185
|
type Settings = MergeSingleKey<InternalModules, 'settings'>;
|
|
1139
1186
|
type Translations = MergeSingleKey<InternalModules, 'i18n'>;
|
|
1140
1187
|
//#endregion
|
|
1141
|
-
//#region src/modules/Sync.d.ts
|
|
1142
|
-
type SyncTerminateReason = {
|
|
1143
|
-
result: 'cancelled';
|
|
1144
|
-
} | {
|
|
1145
|
-
result: 'completed';
|
|
1146
|
-
} | {
|
|
1147
|
-
result: 'failed';
|
|
1148
|
-
error: string;
|
|
1149
|
-
} | {
|
|
1150
|
-
result: 'noop';
|
|
1151
|
-
};
|
|
1152
|
-
type TaskInfo = {
|
|
1153
|
-
name: TaskNames;
|
|
1154
|
-
key: string;
|
|
1155
|
-
prettyName: string;
|
|
1156
|
-
isDir: boolean;
|
|
1157
|
-
};
|
|
1158
|
-
type FailedTaskInfo = TaskInfo & {
|
|
1159
|
-
error: string;
|
|
1160
|
-
};
|
|
1161
|
-
type RemoteLister = (info: Infras & {
|
|
1162
|
-
reporter: ListReporter;
|
|
1163
|
-
}) => MaybePromise<Array<Stat$1>>;
|
|
1164
|
-
type SyncOptions = {
|
|
1165
|
-
decider?: Decider;
|
|
1166
|
-
remoteLister?: RemoteLister;
|
|
1167
|
-
conflictResolver?: ConflictResolver;
|
|
1168
|
-
detectMoves?: boolean;
|
|
1169
|
-
needConfirmTasks?: boolean;
|
|
1170
|
-
needConfirmDeletion?: boolean;
|
|
1171
|
-
exclusionRules?: Array<GlobMatchRule>;
|
|
1172
|
-
inclusionRules?: Array<GlobMatchRule>;
|
|
1173
|
-
};
|
|
1174
|
-
declare class Sync {
|
|
1175
|
-
private readonly ctx;
|
|
1176
|
-
constructor(ctx: {
|
|
1177
|
-
dispatch: Dispatch<Events>;
|
|
1178
|
-
initializeSync: () => Infras;
|
|
1179
|
-
getDecider: () => Decider;
|
|
1180
|
-
on: On<Events>;
|
|
1181
|
-
translate: Translate<Translations>;
|
|
1182
|
-
getConflictResolver: () => ConflictResolver;
|
|
1183
|
-
});
|
|
1184
|
-
readonly events: {
|
|
1185
|
-
syncStarted: {
|
|
1186
|
-
isCancelled: Ref<boolean>;
|
|
1187
|
-
trigger: string;
|
|
1188
|
-
};
|
|
1189
|
-
remoteWalkProgress: Progress;
|
|
1190
|
-
syncTerminated: SyncTerminateReason;
|
|
1191
|
-
requestConfirmDelete: Array<RemoveLocal>;
|
|
1192
|
-
requestConfirmTasks: Array<BaseTask>;
|
|
1193
|
-
syncCanceled: undefined;
|
|
1194
|
-
taskCompleted: TaskInfo;
|
|
1195
|
-
taskFailed: FailedTaskInfo;
|
|
1196
|
-
executionStarted: Array<BaseTask>;
|
|
1197
|
-
};
|
|
1198
|
-
readonly settings: {
|
|
1199
|
-
maxFileSize: TogglableValue;
|
|
1200
|
-
exclusionRules: Array<GlobMatchRule>;
|
|
1201
|
-
inclusionRules: Array<GlobMatchRule>;
|
|
1202
|
-
};
|
|
1203
|
-
private readonly postProcess;
|
|
1204
|
-
private readonly confirmTasks;
|
|
1205
|
-
private readonly confirmDeletion;
|
|
1206
|
-
private readonly executeSync;
|
|
1207
|
-
private readonly convertDeleteToUpload;
|
|
1208
|
-
root: {
|
|
1209
|
-
executeSync: (trigger: string, options?: SyncOptions) => Promise<SyncTerminateReason>;
|
|
1210
|
-
};
|
|
1211
|
-
}
|
|
1212
|
-
//#endregion
|
|
1213
1188
|
//#region src/modules/Registrar.d.ts
|
|
1214
1189
|
type RejectableWrapper<T> = (value: T) => T | undefined;
|
|
1215
1190
|
type OrderedWrapperEntry<T> = {
|
|
@@ -1219,16 +1194,10 @@ type OrderedWrapperEntry<T> = {
|
|
|
1219
1194
|
type RemoteRequestMiddlewareEntry = OrderedWrapperEntry<Request>;
|
|
1220
1195
|
type LocalRequestMiddlewareEntry = OrderedWrapperEntry<VaultRequest>;
|
|
1221
1196
|
type FsWrapperEntry = OrderedWrapperEntry<Fs>;
|
|
1222
|
-
type CheckConnectionResult = {
|
|
1223
|
-
success: true;
|
|
1224
|
-
} | {
|
|
1225
|
-
success: false;
|
|
1226
|
-
reason: string;
|
|
1227
|
-
};
|
|
1228
1197
|
type RemoteFsEntry = {
|
|
1229
1198
|
instantiate: (request: Request) => RootFs;
|
|
1230
1199
|
prettyName: () => string;
|
|
1231
|
-
checkConnection: (request: Request) => MaybePromise<
|
|
1200
|
+
checkConnection: (request: Request) => MaybePromise<void | Error>;
|
|
1232
1201
|
};
|
|
1233
1202
|
type DeciderEntry = {
|
|
1234
1203
|
decider: Decider;
|
|
@@ -1249,21 +1218,28 @@ type TriggerEntry = {
|
|
|
1249
1218
|
priority: number;
|
|
1250
1219
|
options?: () => SyncOptions;
|
|
1251
1220
|
};
|
|
1252
|
-
type
|
|
1221
|
+
type Infras = {
|
|
1222
|
+
localFs: Fs;
|
|
1223
|
+
remoteFs: Fs;
|
|
1224
|
+
record: RecordStore;
|
|
1225
|
+
};
|
|
1226
|
+
type RequestParam = Omit<RequestUrlParam, 'body' | 'url'> & {
|
|
1253
1227
|
body?: string | Binary;
|
|
1228
|
+
ignoreCancellation?: boolean;
|
|
1254
1229
|
};
|
|
1255
1230
|
type RequestResponse = {
|
|
1256
1231
|
text: () => string;
|
|
1257
1232
|
bytes: () => Binary;
|
|
1258
|
-
json: () =>
|
|
1233
|
+
json: <T extends object = object>() => T;
|
|
1259
1234
|
headers: Record<string, string>;
|
|
1260
1235
|
status: number;
|
|
1261
1236
|
};
|
|
1262
|
-
type Request = (
|
|
1263
|
-
type
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
record:
|
|
1237
|
+
type Request = (url: string, params?: RequestParam) => Promise<RequestResponse>;
|
|
1238
|
+
type DecideTasksInput = {
|
|
1239
|
+
local: Record<string, StatsMap>;
|
|
1240
|
+
remote: Record<string, StatsMap>;
|
|
1241
|
+
record: Record<string, RecordStatsMap>;
|
|
1242
|
+
taskFactory: TaskFactory;
|
|
1267
1243
|
};
|
|
1268
1244
|
declare class Registrar {
|
|
1269
1245
|
private readonly ctx;
|
|
@@ -1280,19 +1256,26 @@ declare class Registrar {
|
|
|
1280
1256
|
private readonly conflictResolverRegistry;
|
|
1281
1257
|
readonly settings: {
|
|
1282
1258
|
remoteFs: string;
|
|
1283
|
-
decider: string;
|
|
1284
1259
|
conflictResolver: string;
|
|
1285
1260
|
};
|
|
1261
|
+
readonly i18n: {
|
|
1262
|
+
pleaseSetBackend: string;
|
|
1263
|
+
backendNotInstalled: Snippet<string>;
|
|
1264
|
+
syncStrategyNotInstalled: Snippet<string>;
|
|
1265
|
+
conflictResolveStrategyNotInstalled: Snippet<string>;
|
|
1266
|
+
};
|
|
1286
1267
|
constructor(ctx: {
|
|
1287
1268
|
app: App;
|
|
1288
|
-
getRecordStore: (namespace
|
|
1269
|
+
getRecordStore: (namespace: string) => RecordStore;
|
|
1270
|
+
translate: Translate<Translations>;
|
|
1271
|
+
dispatch: Dispatch<Events>;
|
|
1289
1272
|
});
|
|
1290
1273
|
private readonly getVaultRequest;
|
|
1291
1274
|
private readonly createLocalFs;
|
|
1292
1275
|
private readonly createRemoteFs;
|
|
1293
1276
|
private readonly getRequest;
|
|
1294
1277
|
private readonly getCheckConnection;
|
|
1295
|
-
private readonly
|
|
1278
|
+
private readonly decideTasks;
|
|
1296
1279
|
private readonly optimizeLocal;
|
|
1297
1280
|
private readonly optimizeRemote;
|
|
1298
1281
|
private readonly reduceTriggers;
|
|
@@ -1302,12 +1285,12 @@ declare class Registrar {
|
|
|
1302
1285
|
root: {
|
|
1303
1286
|
conflictResolverRegistry: Map<string, ConflictResolverEntry>;
|
|
1304
1287
|
createLocalFs: () => Fs;
|
|
1305
|
-
createRemoteFs: (remoteFs?: string) => Fs;
|
|
1288
|
+
createRemoteFs: (remoteFs?: string) => Fs | Error;
|
|
1289
|
+
decideTasks: ({ local, record, remote, taskFactory }: DecideTasksInput) => BaseTask<TaskOptions>[];
|
|
1306
1290
|
deciderRegistry: Map<string, DeciderEntry>;
|
|
1307
|
-
getCheckConnection: (remoteFs?: string) => () => MaybePromise<
|
|
1291
|
+
getCheckConnection: (remoteFs?: string) => () => MaybePromise<void | Error>;
|
|
1308
1292
|
getConflictResolver: () => ConflictResolver;
|
|
1309
|
-
|
|
1310
|
-
getNamespace: (localFs?: Fs, remoteFs?: Fs) => string;
|
|
1293
|
+
getNamespace: <R extends Fs | undefined>(localFs?: Fs, remoteFs?: R) => R extends Fs ? string : string | Error;
|
|
1311
1294
|
getRequest: () => Request;
|
|
1312
1295
|
getVaultRequest: () => VaultRequest;
|
|
1313
1296
|
initializeSync: () => Infras;
|
|
@@ -1334,47 +1317,39 @@ declare class Registrar {
|
|
|
1334
1317
|
}
|
|
1335
1318
|
//#endregion
|
|
1336
1319
|
//#region src/fs/vault/request.d.ts
|
|
1337
|
-
type VaultRequestParam = {
|
|
1320
|
+
type VaultRequestParam = ({
|
|
1338
1321
|
method: 'GET';
|
|
1339
|
-
key: string;
|
|
1340
1322
|
} | {
|
|
1341
1323
|
method: 'GET_STREAM';
|
|
1342
|
-
key: string;
|
|
1343
1324
|
size: number;
|
|
1344
1325
|
} | {
|
|
1345
1326
|
method: 'PUT';
|
|
1346
|
-
key: string;
|
|
1347
1327
|
value: Binary;
|
|
1348
1328
|
mtime?: number;
|
|
1349
1329
|
ctime?: number;
|
|
1350
1330
|
} | {
|
|
1351
1331
|
method: 'APPEND';
|
|
1352
|
-
key: string;
|
|
1353
1332
|
value: Binary;
|
|
1354
1333
|
mtime?: number;
|
|
1355
1334
|
ctime?: number;
|
|
1356
1335
|
} | {
|
|
1357
1336
|
method: 'DELETE';
|
|
1358
|
-
key: string;
|
|
1359
1337
|
trash?: TrashOption;
|
|
1360
1338
|
} | {
|
|
1361
1339
|
method: 'MOVE';
|
|
1362
|
-
key: string;
|
|
1363
1340
|
destination: string;
|
|
1364
1341
|
} | {
|
|
1365
1342
|
method: 'MKDIR';
|
|
1366
|
-
key: string;
|
|
1367
1343
|
} | {
|
|
1368
1344
|
method: 'EXISTS';
|
|
1369
|
-
key: string;
|
|
1370
1345
|
} | {
|
|
1371
1346
|
method: 'STAT';
|
|
1372
|
-
key: string;
|
|
1373
1347
|
cached?: boolean;
|
|
1374
1348
|
} | {
|
|
1375
1349
|
method: 'LIST';
|
|
1376
|
-
key: string;
|
|
1377
1350
|
cached?: boolean;
|
|
1351
|
+
}) & {
|
|
1352
|
+
ignoreCancellation?: boolean;
|
|
1378
1353
|
};
|
|
1379
1354
|
type VaultRequestResponseMap = {
|
|
1380
1355
|
GET: Binary;
|
|
@@ -1388,7 +1363,9 @@ type VaultRequestResponseMap = {
|
|
|
1388
1363
|
STAT: Stat;
|
|
1389
1364
|
LIST: ListedFiles;
|
|
1390
1365
|
};
|
|
1391
|
-
type VaultRequest = <T extends VaultRequestParam
|
|
1366
|
+
type VaultRequest = <T extends VaultRequestParam = {
|
|
1367
|
+
method: 'GET';
|
|
1368
|
+
}>(key: string, params?: T) => Promise<VaultRequestResponseMap[T['method']]>;
|
|
1392
1369
|
type TrashOption = 'local' | 'system' | 'permanent';
|
|
1393
1370
|
//#endregion
|
|
1394
|
-
export {
|
|
1371
|
+
export { RemoveLocal as $, s as A, FileStat as At, Snippet as B, readWithSize as C, MoveAtom as Ct, LabelDefinition as D, RootFs as Dt, setNeedMigration as E, OutputAtom as Et, RemoteLister as F, RecordStatsMap as Ft, CreateLocalDir as G, TranslationResource as H, SyncOptions as I, Stat$1 as It, TaskFactory as J, Decider as K, SyncTerminateReason as L, StatsMap as Lt, SettingEntry as M, MaybePromise as Mt, AugmentedModuleMeta as N, Progress as Nt, generateEditableList as O, WrappedFs as Ot, ModuleMeta as P, RecordStat as Pt, RemoveRecord as Q, Fragment as R, Binary as Rt, pipe as S, MkdirAtom as St, prefixWrapper as T, OptimizerOutput as Tt, Dispatch as U, Translate as V, On as W, ResolveConflict as X, Upload as Y, RemoveRemote as Z, ExistingMemoryDB as _, DeleteAtom as _t, LocalRequestMiddlewareEntry as a, BaseTask as at, chunkSize as b, ListOptions as bt, RemoteRequestMiddlewareEntry as c, TaskNames as ct, RequestResponse as d, DatabaseSync as dt, MoveRemote as et, TriggerEntry as f, StoreAsync as ft, Translations as g, CustomAtom as gt, Settings as h, BatchOptimizer as ht, FsWrapperEntry as i, AddRecord as it, CallableOrObjectTree as j, FolderStat as jt, reactivelyValidate as k, WriteAtom as kt, Request as l, RecordStore as lt, Events as m, StoreSync as mt, ConflictResolverEntry as n, Download as nt, OptimizerEntry as o, ConflictResolver as ot, Context as p, StoreOperations as pt, DeciderInput as q, DeciderEntry as r, CreateRemoteDir as rt, RemoteFsEntry as s, ConflictResolverPayload as st, VaultRequest as t, MoveLocal as tt, RequestParam as u, DatabaseAsync as ut, SelectFromContext as v, Fs as vt, writeWithValue as w, OptimizerInput as wt, concurrency as x, ListReporter as xt, digOriginal as y, InputAtom as yt, ObsidianLanguageCode as z };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{chunkSize as e,concurrency as t,pipe as n,readWithSize as r,writeWithValue as i}from"./
|
|
1
|
+
import{chunkSize as e,concurrency as t,pipe as n,readWithSize as r,writeWithValue as i}from"./plugin/src/utils/pipe.js";import a from"./plugin/src/components/MigrationModal.js";import o from"./prefix.js";import{generateEditableList as s,reactivelyValidate as c,s as l}from"./plugin/src/settings/utils.js";function u(e){let t=e;for(;`original`in t;)t=t.original;return t}export{e as chunkSize,t as concurrency,u as digOriginal,s as generateEditableList,n as pipe,o as prefixWrapper,c as reactivelyValidate,r as readWithSize,l as s,a as setNeedMigration,i as writeWithValue};
|
package/dist/index.spec.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { $ as
|
|
2
|
-
export { type AddRecord, type AugmentedModuleMeta, type BaseTask, type BatchOptimizer, type Binary, type CallableOrObjectTree, type
|
|
1
|
+
import { $ as RemoveLocal, A as s, At as FileStat, B as Snippet, C as readWithSize, Ct as MoveAtom, D as LabelDefinition, Dt as RootFs, E as setNeedMigration, Et as OutputAtom, F as RemoteLister, Ft as RecordStatsMap, G as CreateLocalDir, H as TranslationResource, I as SyncOptions, It as Stat, J as TaskFactory, K as Decider, L as SyncTerminateReason, Lt as StatsMap, M as SettingEntry, Mt as MaybePromise, N as AugmentedModuleMeta, Nt as Progress, O as generateEditableList, Ot as WrappedFs, P as ModuleMeta, Pt as RecordStat, Q as RemoveRecord, R as Fragment, Rt as Binary, S as pipe, St as MkdirAtom, T as prefixWrapper, Tt as OptimizerOutput, U as Dispatch, V as Translate, W as On, X as ResolveConflict, Y as Upload, Z as RemoveRemote, _ as ExistingMemoryDB, _t as DeleteAtom, a as LocalRequestMiddlewareEntry, at as BaseTask, b as chunkSize, bt as ListOptions, c as RemoteRequestMiddlewareEntry, ct as TaskNames, d as RequestResponse, dt as DatabaseSync, et as MoveRemote, f as TriggerEntry, ft as StoreAsync, g as Translations, gt as CustomAtom, h as Settings, ht as BatchOptimizer, i as FsWrapperEntry, it as AddRecord, j as CallableOrObjectTree, jt as FolderStat, k as reactivelyValidate, kt as WriteAtom, l as Request, lt as RecordStore, m as Events, mt as StoreSync, n as ConflictResolverEntry, nt as Download, o as OptimizerEntry, ot as ConflictResolver, p as Context, pt as StoreOperations, q as DeciderInput, r as DeciderEntry, rt as CreateRemoteDir, s as RemoteFsEntry, st as ConflictResolverPayload, t as VaultRequest, tt as MoveLocal, u as RequestParam, ut as DatabaseAsync, v as SelectFromContext, vt as Fs, w as writeWithValue, wt as OptimizerInput, x as concurrency, xt as ListReporter, y as digOriginal, yt as InputAtom, z as ObsidianLanguageCode } from "./index-DbDrKV7S.spec.js";
|
|
2
|
+
export { type AddRecord, type AugmentedModuleMeta, type BaseTask, type BatchOptimizer, type Binary, type CallableOrObjectTree, type ConflictResolver, type ConflictResolverEntry, type ConflictResolverPayload, type Context, type CreateLocalDir, type CreateRemoteDir, type CustomAtom, type DatabaseAsync, type DatabaseSync, type Decider, type DeciderEntry, type DeciderInput, type DeleteAtom, type Dispatch, type Download, type Events, type ExistingMemoryDB, type FileStat, type FolderStat, type Fragment, type Fs, type FsWrapperEntry, type InputAtom, type LabelDefinition, type ListOptions, type ListReporter, type LocalRequestMiddlewareEntry, type MaybePromise, type MkdirAtom, type ModuleMeta, type MoveAtom, type MoveLocal, type MoveRemote, type ObsidianLanguageCode, type On, type OptimizerEntry, type OptimizerInput, type OptimizerOutput, type OutputAtom, type Progress, type RecordStat, type RecordStatsMap, type RecordStore, type RemoteFsEntry, type RemoteLister, type RemoteRequestMiddlewareEntry, type RemoveLocal, type RemoveRecord, type RemoveRemote, type Request, type RequestParam, type RequestResponse, type ResolveConflict, type RootFs, SelectFromContext, type SettingEntry, type Settings, type Snippet, type Stat, type StatsMap, type StoreAsync, type StoreOperations, type StoreSync, type SyncOptions, type SyncTerminateReason, type TaskFactory, type TaskNames, type Translate, type TranslationResource, type Translations, type TriggerEntry, type Upload, type VaultRequest, type WrappedFs, type WriteAtom, chunkSize, concurrency, digOriginal, generateEditableList, pipe, prefixWrapper, reactivelyValidate, readWithSize, s, setNeedMigration, writeWithValue };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ConfirmationModal as e}from"obsidian";function t({app:t,translate:n},{toggle:r,needMigration:i,content:a,apply:o}){let s=!1;r.onChange(c=>{if(s){s=!1;return}let l=async i=>{if(i){s=!0,r.setValue(!c);let i=new e(t).setTitle(n(`remoteMigration`)).setContent(createFragment(e=>{let t=a(c);e.append(t instanceof DocumentFragment?t:createEl(`p`,{text:t}),n(`migrationInstruction`))})).addCancelButton(n(`cancel`)).addButton(e=>e.setButtonText(n(`confirm`)).setCta().onClick(()=>(s=!0,r.setValue(c),o(c))));i.contentEl.addClass(`markdown-rendered`),i.open()}else await o(c)},u=i?.(c)??!0;u instanceof Promise?u.then(l):l(u)})}export{t as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{encodeURIComponent3986 as e}from"../../../shared/src/path.js";import{setIcon as t}from"obsidian";function n(e,t){return t?Object.assign(e,t):e}function r(){let n=`--sync-engine-warning`;if(activeDocument.body.style.getPropertyValue(n))return;let r=createDiv();t(r,`triangle-alert`),r.firstElementChild.setAttr(`stroke`,getComputedStyle(activeDocument.body).getPropertyValue(`--text-warning`)),activeDocument.body.style.setProperty(n,`url("data:image/svg+xml,${e(r.innerHTML)}")`)}function i({text:e,parse:t,onSave:n,format:i=String,immediate:a=!1}){r();let o,s=`sync-engine-invalid-input`,c=n=>{o=t(n),o===void 0?e.inputEl.addClass(s):e.inputEl.removeClass(s)};e.onChange(c).inputEl.addEventListener(`blur`,()=>{o!==void 0&&(n(o),e.setValue(i(o)))}),a&&c(e.getValue())}function a({memoryDB:e,items:t,identifier:n,saveSettings:r,rerenderSettingTab:i,defaultValue:a,render:o,translations:{add:s,empty:c,heading:l},extraButtons:u}){let
|
|
1
|
+
import{encodeURIComponent3986 as e}from"../../../shared/src/path.js";import{setIcon as t}from"obsidian";function n(e,t){return t?Object.assign(e,t):e}function r(){let n=`--sync-engine-warning`;if(activeDocument.body.style.getPropertyValue(n))return;let r=createDiv();t(r,`triangle-alert`),r.firstElementChild.setAttr(`stroke`,getComputedStyle(activeDocument.body).getPropertyValue(`--text-warning`)),activeDocument.body.style.setProperty(n,`url("data:image/svg+xml,${e(r.innerHTML)}")`)}function i({text:e,parse:t,onSave:n,format:i=String,immediate:a=!1}){r();let o,s=`sync-engine-invalid-input`,c=n=>{o=t(n),o===void 0?e.inputEl.addClass(s):e.inputEl.removeClass(s)};e.onChange(c).inputEl.addEventListener(`blur`,()=>{o!==void 0&&(n(o),e.setValue(i(o)))}),a&&c(e.getValue())}function a({memoryDB:e,items:t,identifier:n,saveSettings:r,rerenderSettingTab:i,defaultValue:a,render:o,translations:{add:s,empty:c,heading:l},extraButtons:u,reorder:d}){let f=e.getStore(`ephemeralEditableLists`),p=f.get(n)??t.map(e=>({new:!1,valid:!0,value:e}));f.set(n,p);let m=()=>{let e=p.filter(({valid:e})=>e).map(({value:e})=>e);t.length=0,t.push(...e),r()};return{addItem:{action:()=>{p.push({new:!0,valid:!1,value:structuredClone(a)}),i()},name:s},emptyState:c,extraButtons:u?u.map(e=>t=>e(t,p,m)):void 0,heading:l,items:p.map(e=>({name:``,render:t=>{t.settingEl.addClass(`sync-engine-editable-list`);let n=o(t,e,m);return e.new&&=!1,n},searchable:!1})),onDelete:e=>{p.splice(e,1),m(),i()},onReorder:d?(e,t)=>{let[n]=p.splice(e,1);p.splice(t,0,n),m(),i()}:void 0,type:`list`}}export{a as generateEditableList,i as reactivelyValidate,n as s};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{getStatus as e}from"../../../shared/src/error.js";import{STREAM_RESERVATION_SIZE as t}from"../fs/wrappers/memory-control.js";import{Platform as n}from"obsidian";function r(){let e=5*1024**2;`deviceMemory`in navigator&&typeof navigator.deviceMemory==`number`?navigator.deviceMemory<=4&&(e/=2):navigator.hardwareConcurrency<=4&&(e/=2),n.isAndroidApp&&(e/=2);let r=e*.8;return{chunkSize:r,concurrency:Math.floor(t/r),streamThreshold:e}}const{chunkSize:i,concurrency:a,streamThreshold:o}=r();async function s({from:e,to:t,stat:n,key:r}){let i=await c(e,r,n);if(i)return l(t,r,i,n)}async function c(e,t,n){try{return n.size>o?await e.readStream(t,n):await e.read(t,n)}catch(e){if(u(e))return;throw e}}function l(e,t,n,r){return n instanceof ReadableStream?e.writeStream(t,n,r):e.write(t,n,r)}function u(t){return e(t)===404||(t.message??String(t)).toLocaleUpperCase().includes(`ENOENT`)}export{i as chunkSize,a as concurrency,s as pipe,c as readWithSize,l as writeWithValue};
|
|
@@ -0,0 +1 @@
|
|
|
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??/* @__PURE__ */ new Map,i=n.remoteStats??/* @__PURE__ */ new Map,a=n.records??/* @__PURE__ */ new Map,o=[];return t({localStats:r,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}}const _=()=>n(`ok`),v=()=>`ok`,y=()=>({});function b(e={}){return{bytes:_,headers:{},status:200,text:v,...e,json:e.json??y}}function x(e){let t=[];return{calls:t,request:async(n,r)=>(t.push({url:n,...r}),b(await e(n,r??{})))}}function S(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 C={bytes:n,deferred:p,file:r,fileRecord:a,findTask:u,flush:m,folder:i,folderRecord:o,fs:S,request:x,runDecider:s,stream:f,taskKeys:l,taskNames:c};export{C as default};
|
package/dist/prefix.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{normalizeBaseDir as e}from"./
|
|
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};
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
function e(e,n){let{equals:r=(e,t)=>e===t}=n??{},i=e,a=/* @__PURE__ */ 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};
|
|
@@ -1 +0,0 @@
|
|
|
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};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{ProgressBarComponent as e}from"obsidian";function t(t,n){let r=t.createDiv(`flex flex-col gap-2 ${n??``}`),i=r.createDiv(`flex flex-row text-3 text-[--text-muted] whitespace-nowrap`),a=i.createDiv(`truncate mr-auto`),o=i.createDiv(`ml-2`);return{bar:new e(r),left:a,right:o}}export{t as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{getStatus as e}from"../../../shared/src/get-status.js";import{STREAM_RESERVATION_SIZE as t}from"../fs/wrappers/memory-control.js";import{Platform as n}from"obsidian";function r(){let e=5*1024**2;`deviceMemory`in navigator&&typeof navigator.deviceMemory==`number`?navigator.deviceMemory<=4&&(e/=2):navigator.hardwareConcurrency<=4&&(e/=2),n.isAndroidApp&&(e/=2);let r=e*.8;return{chunkSize:r,concurrency:Math.floor(t/r),streamThreshold:e}}const{chunkSize:i,concurrency:a,streamThreshold:o}=r();async function s({from:e,to:t,stat:n,key:r}){let i=await c(e,r,n);if(i)return l(t,r,i,n)}async function c(e,t,n){try{return n.size>o?await e.readStream(t,n):await e.read(t,n)}catch(e){if(u(e))return;throw e}}function l(e,t,n,r){return n instanceof ReadableStream?e.writeStream(t,n,r):e.write(t,n,r)}function u(t){return e(t)===404||(t.message??String(t)).toLocaleUpperCase().includes(`ENOENT`)}export{i as chunkSize,a as concurrency,s as pipe,c as readWithSize,l as writeWithValue};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
function e(e,t){return Math.round(e/(t||1)*1e4)/100}export{e as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
function e(e){return e instanceof Error?e.message:String(e)}export{e as default};
|
|
@@ -1 +0,0 @@
|
|
|
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??/* @__PURE__ */ new Map,i=n.remoteStats??/* @__PURE__ */ new Map,a=n.records??/* @__PURE__ */ 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};
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|