@aerogel/plugin-local-first 0.0.0-next.020894e17f1efa306d7e18794314d1f529cfc8a5

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 (45) hide show
  1. package/dist/aerogel-plugin-local-first.d.ts +298 -0
  2. package/dist/aerogel-plugin-local-first.js +1653 -0
  3. package/dist/aerogel-plugin-local-first.js.map +1 -0
  4. package/package.json +50 -0
  5. package/src/components/Account.vue +9 -0
  6. package/src/components/AccountLoggedIn.vue +85 -0
  7. package/src/components/AccountLoggedOut.vue +26 -0
  8. package/src/components/AccountLoginModal.vue +36 -0
  9. package/src/components/AccountModal.vue +206 -0
  10. package/src/components/index.ts +5 -0
  11. package/src/components/settings/PurgeData.vue +43 -0
  12. package/src/components/settings/index.ts +10 -0
  13. package/src/index.css +1 -0
  14. package/src/index.ts +33 -0
  15. package/src/jobs/Backup.ts +98 -0
  16. package/src/jobs/Migrate.test.ts +217 -0
  17. package/src/jobs/Migrate.ts +179 -0
  18. package/src/jobs/Sync.test.ts +1198 -0
  19. package/src/jobs/Sync.ts +697 -0
  20. package/src/jobs/mixins/LoadsChildren.ts +229 -0
  21. package/src/jobs/mixins/LoadsTypeIndex.ts +25 -0
  22. package/src/jobs/mixins/TracksLocalModels.ts +32 -0
  23. package/src/lib/SyncQueue.ts +94 -0
  24. package/src/lib/inference.ts +124 -0
  25. package/src/lib/mirroring.ts +348 -0
  26. package/src/lib/utils.ts +21 -0
  27. package/src/services/Cloud.state.ts +111 -0
  28. package/src/services/Cloud.ts +494 -0
  29. package/src/services/DocumentsCache.ts +39 -0
  30. package/src/testing/cloud.ts +193 -0
  31. package/src/testing/mocks/Solid.mock.ts +34 -0
  32. package/src/testing/setup.ts +33 -0
  33. package/src/testing/stubs/LegacyTask.schema.ts +15 -0
  34. package/src/testing/stubs/Movie.schema.ts +15 -0
  35. package/src/testing/stubs/Movie.ts +3 -0
  36. package/src/testing/stubs/MoviesContainer.ts +20 -0
  37. package/src/testing/stubs/Person.schema.ts +9 -0
  38. package/src/testing/stubs/Person.ts +18 -0
  39. package/src/testing/stubs/Post.schema.ts +17 -0
  40. package/src/testing/stubs/Post.ts +18 -0
  41. package/src/testing/stubs/Task.schema.ts +12 -0
  42. package/src/testing/stubs/Task.ts +3 -0
  43. package/src/testing/stubs/TasksList.ts +20 -0
  44. package/src/testing/stubs/Workspace.ts +15 -0
  45. package/src/types/shims.d.ts +7 -0
@@ -0,0 +1,298 @@
1
+ import { AcceptRefs } from '@aerogel/core';
2
+ import { Authenticator } from '@aerogel/plugin-solid';
3
+ import { ComponentOptionsMixin } from 'vue';
4
+ import { ComponentProvideOptions } from 'vue';
5
+ import { Cr } from '@noeldemartin/utils';
6
+ import { DefineComponent } from 'vue';
7
+ import { Engine } from 'soukai';
8
+ import { ErrorSource } from '@aerogel/core';
9
+ import { Facade } from '@noeldemartin/utils';
10
+ import { Job } from '@aerogel/core';
11
+ import { JobListener } from '@aerogel/core';
12
+ import { JobStatus } from '@aerogel/core';
13
+ import { ModalExpose } from '@aerogel/core';
14
+ import { Nullable } from '@noeldemartin/utils';
15
+ import { ObjectsMap } from '@noeldemartin/utils';
16
+ import { Plugin as Plugin_2 } from '@aerogel/core';
17
+ import { PublicProps } from 'vue';
18
+ import { Replace } from '@aerogel/core';
19
+ import { Semaphore } from '@noeldemartin/utils';
20
+ import { ServiceWithState } from '@aerogel/core';
21
+ import { ShallowUnwrapRef } from 'vue';
22
+ import { SolidContainer } from 'soukai-solid';
23
+ import { SolidDocument } from 'soukai-solid';
24
+ import { SolidModel } from 'soukai-solid';
25
+ import { SolidModelConstructor } from 'soukai-solid';
26
+ import { SolidSchemaDefinition } from 'soukai-solid';
27
+ import { SolidTypeIndex } from 'soukai-solid';
28
+ import { Tombstone } from 'soukai-solid';
29
+
30
+ export declare const Account: DefineComponent< {}, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
31
+
32
+ export declare const AccountLoggedIn: DefineComponent< {}, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, true, {}, HTMLDivElement>;
33
+
34
+ export declare const AccountLoggedOut: DefineComponent< {}, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
35
+
36
+ export declare const AccountLoginModal: DefineComponent< {}, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
37
+
38
+ export declare const AccountModal: DefineComponent< {}, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, true, {
39
+ $modalRef: ShallowUnwrapRef<AcceptRefs<ModalExpose<void>>> | null;
40
+ }, any>;
41
+
42
+ export declare const Cloud: Facade<CloudService>;
43
+
44
+ export declare class CloudService extends _default {
45
+ protected asyncLock: Semaphore;
46
+ protected engine: Engine | null;
47
+ protected pollingInterval: NodeJS.Timeout | null;
48
+ whenReady<T>(callback: () => T): Promise<T>;
49
+ setup(modelUrlMappings?: WeakMap<SolidModelConstructor, Record<string, string>>): Promise<void>;
50
+ dismissSetup(): void;
51
+ dismissMigration(): void;
52
+ postponeMigration(): void;
53
+ syncIfOnline(options?: SyncOptions): Promise<void>;
54
+ syncIfOnline(model: SolidModel): Promise<void>;
55
+ syncIfOnline(models: SolidModel[]): Promise<void>;
56
+ sync(options?: SyncOptions): Promise<void>;
57
+ sync(model: SolidModel): Promise<void>;
58
+ sync(models: SolidModel[]): Promise<void>;
59
+ shouldMigrate(): boolean;
60
+ migrate(listener?: JobListener): Promise<void>;
61
+ register(modelClass: SolidModelConstructor, options?: RegisterOptions): Promise<void>;
62
+ registerSchemaMigration(modelClass: SolidModelConstructor, schema: SolidModelConstructor | SolidSchemaDefinition): void;
63
+ requireRemoteCollection(modelClass: SolidModelConstructor): string;
64
+ protected boot(): Promise<void>;
65
+ protected getDirtyLocalModels(): SolidModel[];
66
+ protected getModelsIn(urls: string[], model: SolidModel): SolidModel[];
67
+ protected requireEngine(): Engine;
68
+ protected setReady(ready: boolean): Promise<void>;
69
+ protected backup(modelUrlMappings?: WeakMap<SolidModelConstructor, Record<string, string>>): Promise<void>;
70
+ protected onApplicationReady(): Promise<void>;
71
+ protected onApplicationMounted(): Promise<void>;
72
+ protected login(authenticator: Authenticator): void;
73
+ protected logout(): void;
74
+ private syncOnStartup;
75
+ private bustDocumentsCache;
76
+ private registerModels;
77
+ }
78
+
79
+ declare const CloudStatus: {
80
+ readonly Disconnected: "disconnected";
81
+ readonly Online: "online";
82
+ readonly Syncing: "syncing";
83
+ readonly Migrating: "migrating";
84
+ };
85
+
86
+ declare const _default: ServiceWithState< {
87
+ autoPush: boolean;
88
+ localModelUpdates: Record<string, number>;
89
+ migrationDismissed: boolean;
90
+ migrationJob: Nullable<Migrate>;
91
+ migrationPostponed: boolean;
92
+ modelCollections: Record<string, string[]>;
93
+ pollingEnabled: boolean;
94
+ pollingMinutes: number;
95
+ ready: boolean;
96
+ registeredModels: ModelRegistration[];
97
+ schemaMigrations: Map<SolidModelConstructor, SolidModelConstructor | SolidSchemaDefinition>;
98
+ setupDismissed: boolean;
99
+ setupOngoing: boolean;
100
+ startupSync: boolean;
101
+ status: TCloudStatus;
102
+ syncError: Nullable<ErrorSource>;
103
+ syncJob: Nullable<Sync>;
104
+ }, {
105
+ disconnected: boolean;
106
+ online: boolean;
107
+ syncing: boolean;
108
+ migrating: boolean;
109
+ localChanges: number;
110
+ dirty: boolean;
111
+ migrationStarted: boolean;
112
+ migrationDisabledReason: string | null;
113
+ }, Replace<Partial<{
114
+ autoPush: boolean;
115
+ localModelUpdates: Record<string, number>;
116
+ migrationDismissed: boolean;
117
+ migrationJob: Nullable<Migrate>;
118
+ migrationPostponed: boolean;
119
+ modelCollections: Record<string, string[]>;
120
+ pollingEnabled: boolean;
121
+ pollingMinutes: number;
122
+ ready: boolean;
123
+ registeredModels: ModelRegistration[];
124
+ schemaMigrations: Map<SolidModelConstructor, SolidModelConstructor | SolidSchemaDefinition>;
125
+ setupDismissed: boolean;
126
+ setupOngoing: boolean;
127
+ startupSync: boolean;
128
+ status: TCloudStatus;
129
+ syncError: Nullable<ErrorSource>;
130
+ syncJob: Nullable<Sync>;
131
+ }>, {
132
+ migrationJob: MigrateJobStatus | undefined;
133
+ }>>;
134
+
135
+ declare class LoadsChildren {
136
+ protected localModels?: ObjectsMap<SolidModel>;
137
+ protected loadContainedModels(model: SolidContainer, options?: {
138
+ ignoreTombstones?: boolean;
139
+ status?: ResourceJobStatus;
140
+ onDocumentsLoaded?: (urls: string[]) => unknown;
141
+ onDocumentError?: (error: unknown) => unknown;
142
+ onDocumentRead?: (document: SolidDocument) => unknown;
143
+ }): Promise<SolidModel[]>;
144
+ protected loadDocumentChildren(model: SolidContainer, documentUrl: string, documents: ObjectsMap<SolidDocument>, onDocumentError?: (error: unknown) => unknown, onDocumentRead?: (document: SolidDocument) => unknown): Promise<{
145
+ children: Record<string, SolidModel[]>;
146
+ tombstones: Tombstone[];
147
+ }>;
148
+ protected loadDocumentChildrenFromLocal(model: SolidModel, document: SolidDocument): Promise<Record<string, SolidModel[]>>;
149
+ protected loadDocumentChildrenFromRemote(model: SolidContainer, documentUrl: string, onDocumentError?: (error: unknown) => unknown, onDocumentRead?: (document: SolidDocument) => unknown): Promise<{
150
+ children: Record<string, SolidModel[]>;
151
+ tombstones: Tombstone[];
152
+ }>;
153
+ }
154
+
155
+ declare class LoadsTypeIndex {
156
+ protected loadTypeIndex(options?: {
157
+ create?: false;
158
+ fresh?: boolean;
159
+ }): Promise<SolidTypeIndex | null>;
160
+ protected loadTypeIndex(options?: {
161
+ create?: true;
162
+ fresh?: boolean;
163
+ }): Promise<SolidTypeIndex>;
164
+ }
165
+
166
+ declare function localFirst(): Plugin_2;
167
+ export default localFirst;
168
+
169
+ export declare type LocalFirstServices = typeof services;
170
+
171
+ declare class Migrate extends Migrate_base {
172
+ static restore(status: MigrateJobStatus): Migrate;
173
+ protected _models?: SolidModel[];
174
+ get models(): SolidModel[] | undefined;
175
+ set models(models: SolidModel[] | undefined);
176
+ protected run(): Promise<void>;
177
+ protected migrateRegisteredModel(model: SolidModel, status: MigrateModelJobStatus, typeIndex?: Nullable<SolidTypeIndex>): Promise<void>;
178
+ protected migrate(localModel: SolidModel, status: MigrateModelJobStatus): Promise<void>;
179
+ protected migrateChildren(localModel: SolidModel, status: MigrateModelJobStatus): Promise<void>;
180
+ }
181
+
182
+ declare const Migrate_base: typeof Job<JobListener, MigrateJobStatus, MigrateJobStatus> & Cr<LoadsChildren & LoadsTypeIndex & TracksLocalModels>;
183
+
184
+ declare interface MigrateJobStatus extends JobStatus {
185
+ children?: MigrateModelJobStatus[];
186
+ }
187
+
188
+ declare interface MigrateModelJobStatus extends JobStatus {
189
+ modelUrl: string;
190
+ children?: MigrateModelJobStatus[];
191
+ }
192
+
193
+ declare interface ModelRegistration {
194
+ modelClass: SolidModelConstructor;
195
+ path?: string;
196
+ }
197
+
198
+ export declare interface RegisterOptions {
199
+ path?: string;
200
+ }
201
+
202
+ declare interface ResourceJobStatus extends JobStatus {
203
+ documentUrl?: string;
204
+ children?: ResourceJobStatus[];
205
+ }
206
+
207
+ declare const services: {
208
+ $cloud: Facade<CloudService>;
209
+ };
210
+
211
+ declare class Sync extends Sync_base {
212
+ protected models?: SolidModel[];
213
+ protected dirtyRemoteModels?: SolidModel[];
214
+ protected rootLocalModels: SolidModel[];
215
+ protected tombstones: ObjectsMap<Tombstone>;
216
+ protected documentsWithErrors: Set<string>;
217
+ protected syncedModelUrls: Set<string>;
218
+ protected documentsModifiedAt: Record<string, Date>;
219
+ protected screenLock: Promise<void | {
220
+ release(): Promise<void>;
221
+ }> | null;
222
+ protected localModels: ObjectsMap<SolidModel>;
223
+ constructor(models?: SolidModel[]);
224
+ protected run(): Promise<void>;
225
+ protected lockScreen(): void;
226
+ protected releaseScreen(): void;
227
+ protected getInitialStatus(): SyncJobStatus;
228
+ protected calculateCurrentProgress(status?: JobStatus): number;
229
+ private pullChanges;
230
+ private pushChanges;
231
+ private fetchRemoteModels;
232
+ private fetchRemoteModelsForLocal;
233
+ private getTypeRegistrations;
234
+ private updateTypeRegistrations;
235
+ private loadChildren;
236
+ private deleteChild;
237
+ private saveModelAndChildren;
238
+ private synchronizeModels;
239
+ private reconcileInconsistencies;
240
+ private synchronizeContainerDocuments;
241
+ private rememberModelDocuments;
242
+ private ignoringDocumentErrors;
243
+ private handleDocumentError;
244
+ }
245
+
246
+ declare const Sync_base: typeof Job<JobListener, SyncJobStatus, SyncJobStatus> & Cr<LoadsChildren & LoadsTypeIndex & TracksLocalModels>;
247
+
248
+ declare interface SyncJobStatus extends JobStatus {
249
+ root: true;
250
+ children: [SyncPullJobStatus, JobStatus];
251
+ }
252
+
253
+ export declare interface SyncOptions extends JobListener {
254
+ refreshUserProfile?: boolean;
255
+ model?: SolidModel;
256
+ models?: SolidModel[];
257
+ }
258
+
259
+ declare interface SyncPullJobStatus extends JobStatus {
260
+ children?: ResourceJobStatus[];
261
+ }
262
+
263
+ declare type TCloudStatus = (typeof CloudStatus)[keyof typeof CloudStatus];
264
+
265
+ declare class TracksLocalModels {
266
+ protected localModels?: ObjectsMap<SolidModel>;
267
+ protected indexLocalModels(models: SolidModel[]): Promise<void>;
268
+ protected addLocalModel(localModel: SolidModel): Promise<void>;
269
+ }
270
+
271
+ export { }
272
+
273
+
274
+ declare module '@aerogel/core' {
275
+ interface Services extends LocalFirstServices {
276
+ }
277
+ }
278
+
279
+
280
+ declare module '@aerogel/core' {
281
+ interface EventsPayload {
282
+ 'cloud:ready': void;
283
+ 'cloud:backup-started': void;
284
+ 'cloud:backup-completed': void;
285
+ 'cloud:migration-started': SolidModel[];
286
+ 'cloud:migration-cancelled': SolidModel[];
287
+ 'cloud:migration-completed': SolidModel[];
288
+ 'cloud:sync-started': SolidModel[] | undefined;
289
+ 'cloud:sync-completed': SolidModel[] | undefined;
290
+ }
291
+ }
292
+
293
+
294
+ declare module 'soukai-solid' {
295
+ namespace SolidModel {
296
+ const cloud: boolean | RegisterOptions | undefined;
297
+ }
298
+ }