@hesprs/sync-engine-sdk 3.1.9 → 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.
Files changed (37) hide show
  1. package/dist/dev.js +1 -1
  2. package/dist/dev.spec.d.ts +1 -1
  3. package/dist/{index-DbHTJm2U.spec.d.ts → index-DbDrKV7S.spec.d.ts} +125 -149
  4. package/dist/index.js +1 -1
  5. package/dist/index.spec.d.ts +2 -2
  6. package/dist/pipe-wkp7flXx.js +1 -0
  7. package/dist/plugin/src/components/MigrationModal.js +1 -0
  8. package/dist/{packages/plugin → plugin}/src/settings/utils.js +1 -1
  9. package/dist/plugin/test/test-kit.js +1 -0
  10. package/dist/prefix.js +1 -1
  11. package/dist/shared/src/error.js +1 -0
  12. package/package.json +1 -1
  13. package/dist/node_modules/.bun/synthkernel@._synthkernel.tgz/node_modules/synthkernel/dist/reactive.js +0 -1
  14. package/dist/packages/plugin/src/components/MigrationModal.js +0 -1
  15. package/dist/packages/plugin/src/components/render-progress.js +0 -1
  16. package/dist/packages/plugin/src/utils/round-percent.js +0 -1
  17. package/dist/packages/plugin/test/test-kit.js +0 -1
  18. package/dist/packages/shared/src/error.js +0 -1
  19. package/dist/pipe-DuPrzktU.js +0 -1
  20. /package/dist/{packages/plugin → plugin}/src/fs/wrappers/memory-control.js +0 -0
  21. /package/dist/{packages/plugin → plugin}/src/sync/decision/interface.js +0 -0
  22. /package/dist/{packages/plugin → plugin}/src/sync/tasks/AddRecord.js +0 -0
  23. /package/dist/{packages/plugin → plugin}/src/sync/tasks/CreateLocalDir.js +0 -0
  24. /package/dist/{packages/plugin → plugin}/src/sync/tasks/CreateRemoteDir.js +0 -0
  25. /package/dist/{packages/plugin → plugin}/src/sync/tasks/Download.js +0 -0
  26. /package/dist/{packages/plugin → plugin}/src/sync/tasks/MoveLocal.js +0 -0
  27. /package/dist/{packages/plugin → plugin}/src/sync/tasks/MoveRemote.js +0 -0
  28. /package/dist/{packages/plugin → plugin}/src/sync/tasks/RemoveLocal.js +0 -0
  29. /package/dist/{packages/plugin → plugin}/src/sync/tasks/RemoveRecord.js +0 -0
  30. /package/dist/{packages/plugin → plugin}/src/sync/tasks/RemoveRemote.js +0 -0
  31. /package/dist/{packages/plugin → plugin}/src/sync/tasks/ResolveConflict.js +0 -0
  32. /package/dist/{packages/plugin → plugin}/src/sync/tasks/Upload.js +0 -0
  33. /package/dist/{packages/plugin → plugin}/src/sync/tasks/interface.js +0 -0
  34. /package/dist/{packages/plugin → plugin}/src/utils/move-value.js +0 -0
  35. /package/dist/{packages/plugin → plugin}/src/utils/pipe.js +0 -0
  36. /package/dist/{packages/plugin → plugin}/src/utils/sha-256.js +0 -0
  37. /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"./packages/plugin/test/test-kit.js";import n from"./packages/plugin/src/utils/sha-256.js";export{e as debugWrapper,n as sha256,t as testKit};
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};
@@ -1,4 +1,4 @@
1
- import { At as FileStat, Dt as RootFs, Ft as RecordStatsMap, It as Stat, Lt as StatsMap, Mt as MaybePromise, Ot as WrappedFs, Pt as RecordStat, Rt as Binary, d as RequestParam, f as RequestResponse, jt as FolderStat, lt as TaskNames, q as Decider, u as Request, yt as Fs } from "./index-DbHTJm2U.spec.js";
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
@@ -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 GlobMatchRule = {
35
+ type GlobStrategy = {
36
36
  expr: string;
37
- caseSensitive: boolean;
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 ListReporter = (progress: Required<Progress>) => MaybePromise<'include' | 'exclude' | 'advance'>;
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?: string) => {
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: string;
420
- errorGeneral: string;
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
- migrationProcess: string;
770
- startMigration: string;
771
- migrationDescription: string;
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
- requestSync: (trigger: string) => Promise<SyncTerminateReason>;
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: string;
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 & FilterSettingTranslations & HeadSettingTranslations & MiscellaneousSettingTranslations & UntrustedModuleTranslations & FileTreeTranslations & ModulesTranslations;
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
- exclusionRules: Array<GlobMatchRule>;
1107
- inclusionRules: Array<GlobMatchRule>;
1154
+ syncStrategy: Array<GlobStrategy>;
1108
1155
  avoidAutoSyncWhenOffline: boolean;
1109
1156
  };
1110
1157
  private readonly requestSync;
@@ -1138,84 +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/utils/glob-match.d.ts
1142
- type GlobMatchResult = 'include' | 'exclude' | 'advance' | 'probe';
1143
- //#endregion
1144
- //#region src/modules/Sync.d.ts
1145
- type SyncTerminateReason = {
1146
- result: 'cancelled';
1147
- } | {
1148
- result: 'completed';
1149
- } | {
1150
- result: 'failed';
1151
- error: string;
1152
- } | {
1153
- result: 'noop';
1154
- };
1155
- type TaskInfo = {
1156
- name: TaskNames;
1157
- key: string;
1158
- prettyName: string;
1159
- isDir: boolean;
1160
- };
1161
- type FailedTaskInfo = TaskInfo & {
1162
- error: string;
1163
- };
1164
- type RemoteLister = (info: Infras & {
1165
- reporter: ListReporter;
1166
- }) => MaybePromise<Array<Stat$1>>;
1167
- type SyncOptions = {
1168
- decider?: Decider;
1169
- remoteLister?: RemoteLister;
1170
- conflictResolver?: ConflictResolver;
1171
- detectMoves?: boolean;
1172
- needConfirmTasks?: boolean;
1173
- needConfirmDeletion?: boolean;
1174
- exclusionRules?: Array<GlobMatchRule>;
1175
- inclusionRules?: Array<GlobMatchRule>;
1176
- };
1177
- declare class Sync {
1178
- private readonly ctx;
1179
- constructor(ctx: {
1180
- dispatch: Dispatch<Events>;
1181
- initializeSync: () => Infras;
1182
- getDecider: () => Decider;
1183
- on: On<Events>;
1184
- translate: Translate<Translations>;
1185
- getConflictResolver: () => ConflictResolver;
1186
- });
1187
- readonly events: {
1188
- syncStarted: {
1189
- isCancelled: Ref<boolean>;
1190
- trigger: string;
1191
- };
1192
- syncInitialized: Infras & {
1193
- match: (path: string) => GlobMatchResult;
1194
- };
1195
- remoteWalkProgress: Progress;
1196
- syncTerminated: SyncTerminateReason;
1197
- requestConfirmDelete: Array<RemoveLocal>;
1198
- requestConfirmTasks: Array<BaseTask>;
1199
- syncCanceled: undefined;
1200
- taskCompleted: TaskInfo;
1201
- taskFailed: FailedTaskInfo;
1202
- executionStarted: Array<BaseTask>;
1203
- };
1204
- readonly settings: {
1205
- maxFileSize: TogglableValue;
1206
- exclusionRules: Array<GlobMatchRule>;
1207
- inclusionRules: Array<GlobMatchRule>;
1208
- };
1209
- private readonly postProcess;
1210
- private readonly confirmTasks;
1211
- private readonly confirmDeletion;
1212
- private readonly executeSync;
1213
- private readonly convertDeleteToUpload;
1214
- root: {
1215
- executeSync: (trigger: string, options?: SyncOptions) => Promise<SyncTerminateReason>;
1216
- };
1217
- }
1218
- //#endregion
1219
1188
  //#region src/modules/Registrar.d.ts
1220
1189
  type RejectableWrapper<T> = (value: T) => T | undefined;
1221
1190
  type OrderedWrapperEntry<T> = {
@@ -1225,16 +1194,10 @@ type OrderedWrapperEntry<T> = {
1225
1194
  type RemoteRequestMiddlewareEntry = OrderedWrapperEntry<Request>;
1226
1195
  type LocalRequestMiddlewareEntry = OrderedWrapperEntry<VaultRequest>;
1227
1196
  type FsWrapperEntry = OrderedWrapperEntry<Fs>;
1228
- type CheckConnectionResult = {
1229
- success: true;
1230
- } | {
1231
- success: false;
1232
- reason: string;
1233
- };
1234
1197
  type RemoteFsEntry = {
1235
1198
  instantiate: (request: Request) => RootFs;
1236
1199
  prettyName: () => string;
1237
- checkConnection: (request: Request) => MaybePromise<CheckConnectionResult>;
1200
+ checkConnection: (request: Request) => MaybePromise<void | Error>;
1238
1201
  };
1239
1202
  type DeciderEntry = {
1240
1203
  decider: Decider;
@@ -1272,6 +1235,12 @@ type RequestResponse = {
1272
1235
  status: number;
1273
1236
  };
1274
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;
1243
+ };
1275
1244
  declare class Registrar {
1276
1245
  private readonly ctx;
1277
1246
  private readonly cleanupCallbacks;
@@ -1287,19 +1256,26 @@ declare class Registrar {
1287
1256
  private readonly conflictResolverRegistry;
1288
1257
  readonly settings: {
1289
1258
  remoteFs: string;
1290
- decider: string;
1291
1259
  conflictResolver: string;
1292
1260
  };
1261
+ readonly i18n: {
1262
+ pleaseSetBackend: string;
1263
+ backendNotInstalled: Snippet<string>;
1264
+ syncStrategyNotInstalled: Snippet<string>;
1265
+ conflictResolveStrategyNotInstalled: Snippet<string>;
1266
+ };
1293
1267
  constructor(ctx: {
1294
1268
  app: App;
1295
- getRecordStore: (namespace?: string) => StoreAsync<RecordStat>;
1269
+ getRecordStore: (namespace: string) => RecordStore;
1270
+ translate: Translate<Translations>;
1271
+ dispatch: Dispatch<Events>;
1296
1272
  });
1297
1273
  private readonly getVaultRequest;
1298
1274
  private readonly createLocalFs;
1299
1275
  private readonly createRemoteFs;
1300
1276
  private readonly getRequest;
1301
1277
  private readonly getCheckConnection;
1302
- private readonly getDecider;
1278
+ private readonly decideTasks;
1303
1279
  private readonly optimizeLocal;
1304
1280
  private readonly optimizeRemote;
1305
1281
  private readonly reduceTriggers;
@@ -1309,12 +1285,12 @@ declare class Registrar {
1309
1285
  root: {
1310
1286
  conflictResolverRegistry: Map<string, ConflictResolverEntry>;
1311
1287
  createLocalFs: () => Fs;
1312
- createRemoteFs: (remoteFs?: string) => Fs;
1288
+ createRemoteFs: (remoteFs?: string) => Fs | Error;
1289
+ decideTasks: ({ local, record, remote, taskFactory }: DecideTasksInput) => BaseTask<TaskOptions>[];
1313
1290
  deciderRegistry: Map<string, DeciderEntry>;
1314
- getCheckConnection: (remoteFs?: string) => () => MaybePromise<CheckConnectionResult>;
1291
+ getCheckConnection: (remoteFs?: string) => () => MaybePromise<void | Error>;
1315
1292
  getConflictResolver: () => ConflictResolver;
1316
- getDecider: () => Decider;
1317
- getNamespace: (localFs?: Fs, remoteFs?: Fs) => string;
1293
+ getNamespace: <R extends Fs | undefined>(localFs?: Fs, remoteFs?: R) => R extends Fs ? string : string | Error;
1318
1294
  getRequest: () => Request;
1319
1295
  getVaultRequest: () => VaultRequest;
1320
1296
  initializeSync: () => Infras;
@@ -1392,4 +1368,4 @@ type VaultRequest = <T extends VaultRequestParam = {
1392
1368
  }>(key: string, params?: T) => Promise<VaultRequestResponseMap[T['method']]>;
1393
1369
  type TrashOption = 'local' | 'system' | 'permanent';
1394
1370
  //#endregion
1395
- export { RemoveRecord as $, setNeedMigration as A, FileStat as At, ObsidianLanguageCode as B, digOriginal as C, MoveAtom as Ct, readWithSize as D, RootFs as Dt, pipe as E, OutputAtom as Et, CallableOrObjectTree as F, RecordStatsMap as Ft, On as G, Translate as H, SettingEntry as I, Stat$1 as It, DeciderInput as J, CreateLocalDir as K, AugmentedModuleMeta as L, StatsMap as Lt, generateEditableList as M, MaybePromise as Mt, reactivelyValidate as N, Progress as Nt, writeWithValue as O, WrappedFs as Ot, s as P, RecordStat as Pt, RemoveRemote as Q, ModuleMeta as R, Binary as Rt, SelectFromContext as S, MkdirAtom as St, concurrency as T, OptimizerOutput as Tt, TranslationResource as U, Snippet as V, Dispatch as W, Upload as X, TaskFactory as Y, ResolveConflict as Z, Context as _, CustomAtom as _t, FsWrapperEntry as a, AddRecord as at, Translations as b, InputAtom as bt, RemoteFsEntry as c, ConflictResolverPayload as ct, RequestParam as d, DatabaseAsync as dt, RemoveLocal as et, RequestResponse as f, DatabaseSync as ft, SyncTerminateReason as g, BatchOptimizer as gt, SyncOptions as h, StoreSync as ht, DeciderEntry as i, CreateRemoteDir as it, LabelDefinition as j, FolderStat as jt, prefixWrapper as k, WriteAtom as kt, RemoteRequestMiddlewareEntry as l, TaskNames as lt, RemoteLister as m, StoreOperations as mt, CheckConnectionResult as n, MoveLocal as nt, LocalRequestMiddlewareEntry as o, BaseTask as ot, TriggerEntry as p, StoreAsync as pt, Decider as q, ConflictResolverEntry as r, Download as rt, OptimizerEntry as s, ConflictResolver as st, VaultRequest as t, MoveRemote as tt, Request as u, RecordStore as ut, Events as v, DeleteAtom as vt, chunkSize as w, OptimizerInput as wt, ExistingMemoryDB as x, ListReporter as xt, Settings as y, Fs as yt, Fragment as z };
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"./packages/plugin/src/utils/pipe.js";import a from"./packages/plugin/src/components/MigrationModal.js";import o from"./prefix.js";import{generateEditableList as s,reactivelyValidate as c,s as l}from"./packages/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};
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};
@@ -1,2 +1,2 @@
1
- import { $ as RemoveRecord, A as setNeedMigration, At as FileStat, B as ObsidianLanguageCode, C as digOriginal, Ct as MoveAtom, D as readWithSize, Dt as RootFs, E as pipe, Et as OutputAtom, F as CallableOrObjectTree, Ft as RecordStatsMap, G as On, H as Translate, I as SettingEntry, It as Stat, J as DeciderInput, K as CreateLocalDir, L as AugmentedModuleMeta, Lt as StatsMap, M as generateEditableList, Mt as MaybePromise, N as reactivelyValidate, Nt as Progress, O as writeWithValue, Ot as WrappedFs, P as s, Pt as RecordStat, Q as RemoveRemote, R as ModuleMeta, Rt as Binary, S as SelectFromContext, St as MkdirAtom, T as concurrency, Tt as OptimizerOutput, U as TranslationResource, V as Snippet, W as Dispatch, X as Upload, Y as TaskFactory, Z as ResolveConflict, _ as Context, _t as CustomAtom, a as FsWrapperEntry, at as AddRecord, b as Translations, bt as InputAtom, c as RemoteFsEntry, ct as ConflictResolverPayload, d as RequestParam, dt as DatabaseAsync, et as RemoveLocal, f as RequestResponse, ft as DatabaseSync, g as SyncTerminateReason, gt as BatchOptimizer, h as SyncOptions, ht as StoreSync, i as DeciderEntry, it as CreateRemoteDir, j as LabelDefinition, jt as FolderStat, k as prefixWrapper, kt as WriteAtom, l as RemoteRequestMiddlewareEntry, lt as TaskNames, m as RemoteLister, mt as StoreOperations, n as CheckConnectionResult, nt as MoveLocal, o as LocalRequestMiddlewareEntry, ot as BaseTask, p as TriggerEntry, pt as StoreAsync, q as Decider, r as ConflictResolverEntry, rt as Download, s as OptimizerEntry, st as ConflictResolver, t as VaultRequest, tt as MoveRemote, u as Request, ut as RecordStore, v as Events, vt as DeleteAtom, w as chunkSize, wt as OptimizerInput, x as ExistingMemoryDB, xt as ListReporter, y as Settings, yt as Fs, z as Fragment } from "./index-DbHTJm2U.spec.js";
2
- export { type AddRecord, type AugmentedModuleMeta, type BaseTask, type BatchOptimizer, type Binary, type CallableOrObjectTree, type CheckConnectionResult, 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 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 };
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{Platform as e}from"obsidian";function t(e){let t=e,n=[t.status,t.res?.status,t.response?.status];for(let e of n)if(typeof e==`number`)return e}function n(){let t=5*1024**2;`deviceMemory`in navigator&&typeof navigator.deviceMemory==`number`?navigator.deviceMemory<=4&&(t/=2):navigator.hardwareConcurrency<=4&&(t/=2),e.isAndroidApp&&(t/=2);let n=t*.8;return{chunkSize:n,concurrency:Math.floor(16777216/n),streamThreshold:t}}const{chunkSize:r,concurrency:i,streamThreshold:a}=n();async function o({from:e,to:t,stat:n,key:r}){let i=await s(e,r,n);if(i)return c(t,r,i,n)}async function s(e,t,n){try{return n.size>a?await e.readStream(t,n):await e.read(t,n)}catch(e){if(l(e))return;throw e}}function c(e,t,n,r){return n instanceof ReadableStream?e.writeStream(t,n,r):e.write(t,n,r)}function l(e){return t(e)===404||(e.message??String(e)).toLocaleUpperCase().includes(`ENOENT`)}export{c as a,s as i,i as n,o as r,r as t};
@@ -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 d=e.getStore(`ephemeralEditableLists`),f=d.get(n),p;f?p=f:(p=t.map(e=>({new:!1,valid:!0,value:e})),d.set(n,p));let m=()=>{let e=p.filter(({valid:e})=>e).map(({value:e})=>e);JSON.stringify(e)!==JSON.stringify(t)&&(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`),t.settingEl.querySelector(`.setting-item-control`)?.addClass(`w-100%!`),o(t,e,m)),searchable:!1})),onDelete:e=>{p.splice(e,1),m(),i()},type:`list`}}export{a as generateEditableList,i as reactivelyValidate,n as s};
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{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"./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};
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};
@@ -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}export{e as getStatus};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hesprs/sync-engine-sdk",
3
- "version": "3.1.9",
3
+ "version": "3.2.0",
4
4
  "description": "Official SDK for developing modules targeting Sync Engine, the extensible Obsidian syncing plugin.",
5
5
  "keywords": [
6
6
  "obsidian-plugin",
@@ -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{getMessage as e}from"../../../shared/src/error.js";import{ref as t}from"../../../../node_modules/.bun/synthkernel@._synthkernel.tgz/node_modules/synthkernel/dist/reactive.js";import n from"./render-progress.js";import r from"../utils/round-percent.js";import{Modal as i,Notice as a,Setting as o}from"obsidian";var s=class extends i{ctx;options;cleanupCallbacks=[];completed=t(0);current=t(``);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:t,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}=n(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(t.subscribe(e=>{f.setText(`${e}/3 ${l(`completed`)}`),p.setValue(r(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:t,completed:n,ctx:r}=this,{dispatch:i,requestSync:o,initializeSync:s,translate:c,memoryDB:l}=r,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.`),n(0),t(c(`migrationPhase1Description`));let d=u(await o(`nonInteractiveManual`),1);if(d)return d;n(1),t(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(t){let n=e(t);return new a(`${c(`migrationFailed`)}: ${n}`),{reason:`Phase 2: ${n}`,success:!1}}return n(2),t(c(`migrationPhase3Description`)),u(await o(`migration`),3)||(n(3),t(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
- function e(e,t){return Math.round(e/(t||1)*1e4)/100}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}}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};
@@ -1 +0,0 @@
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}function t(e){return e instanceof Error?e.message:String(e)}export{t as getMessage,e as getStatus};
@@ -1 +0,0 @@
1
- import{Platform as e}from"obsidian";function t(e){let t=e,n=[t.status,t.res?.status,t.response?.status];for(let e of n)if(typeof e==`number`)return e}function n(e){return e instanceof Error?e.message:String(e)}function r(){let t=5*1024**2;`deviceMemory`in navigator&&typeof navigator.deviceMemory==`number`?navigator.deviceMemory<=4&&(t/=2):navigator.hardwareConcurrency<=4&&(t/=2),e.isAndroidApp&&(t/=2);let n=t*.8;return{chunkSize:n,concurrency:Math.floor(16777216/n),streamThreshold:t}}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(e){return t(e)===404||(e.message??String(e)).toLocaleUpperCase().includes(`ENOENT`)}export{l as a,c as i,a as n,n as o,s as r,i as t};
File without changes