fauxbase 0.5.9 → 0.6.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/index.d.cts CHANGED
@@ -67,7 +67,32 @@ interface HttpDriverConfig {
67
67
  };
68
68
  headers?: Record<string, string>;
69
69
  }
70
- type DriverConfig = LocalDriverConfig | HttpDriverConfig;
70
+ interface SyncDriverConfig$1 {
71
+ type: 'sync';
72
+ local: {
73
+ persist?: 'localStorage' | 'indexeddb';
74
+ dbName?: string;
75
+ };
76
+ remote: {
77
+ baseUrl: string;
78
+ preset?: string;
79
+ timeout?: number;
80
+ retry?: {
81
+ maxRetries?: number;
82
+ baseDelay?: number;
83
+ };
84
+ headers?: Record<string, string>;
85
+ };
86
+ sync?: {
87
+ interval?: number;
88
+ retryDelay?: number;
89
+ maxRetries?: number;
90
+ conflictStrategy?: 'last-write-wins' | 'server-wins' | 'client-wins';
91
+ resources?: string[];
92
+ pingUrl?: string;
93
+ };
94
+ }
95
+ type DriverConfig = LocalDriverConfig | HttpDriverConfig | SyncDriverConfig$1;
71
96
  interface SeedDefinition<T = any> {
72
97
  entityName: string;
73
98
  entityClass: any;
@@ -244,7 +269,7 @@ declare abstract class Service<T extends Entity> {
244
269
  private runHooks;
245
270
  }
246
271
 
247
- type AuthProvider$1 = () => {
272
+ type AuthProvider$2 = () => {
248
273
  token: string;
249
274
  } | null;
250
275
  interface HttpDriverOptions extends HttpDriverConfig {
@@ -266,7 +291,7 @@ declare class HttpDriver implements Driver {
266
291
  private authProvider;
267
292
  private onUnauthorized;
268
293
  constructor(config: HttpDriverOptions);
269
- setAuthProvider(provider: AuthProvider$1): void;
294
+ setAuthProvider(provider: AuthProvider$2): void;
270
295
  /** @internal — set callback to refresh token on 401 */
271
296
  setOnUnauthorized(handler: () => Promise<boolean>): void;
272
297
  registerEndpoint(resource: string, endpoint: string): void;
@@ -397,7 +422,7 @@ interface StorageBackend {
397
422
  getMeta(key: string): string | null;
398
423
  setMeta(key: string, value: string): void;
399
424
  }
400
- type AuthProvider = () => {
425
+ type AuthProvider$1 = () => {
401
426
  userId: string;
402
427
  userName?: string;
403
428
  } | null;
@@ -414,7 +439,7 @@ declare class LocalDriver implements Driver {
414
439
  private getLatency;
415
440
  get ready(): Promise<void>;
416
441
  get isReady(): boolean;
417
- setAuthProvider(provider: AuthProvider): void;
442
+ setAuthProvider(provider: AuthProvider$1): void;
418
443
  getStorageBackend(): StorageBackend;
419
444
  registerEntity(resource: string, entityClass: Function): void;
420
445
  list<T>(resource: string, query: QueryParams): Promise<PagedResponse<T>>;
@@ -443,6 +468,151 @@ declare class LocalDriver implements Driver {
443
468
  clear(resource: string): void;
444
469
  }
445
470
 
471
+ interface SyncDriverConfig {
472
+ type: 'sync';
473
+ local: {
474
+ persist?: 'localStorage' | 'indexeddb';
475
+ dbName?: string;
476
+ };
477
+ remote: {
478
+ baseUrl: string;
479
+ preset?: string;
480
+ timeout?: number;
481
+ retry?: {
482
+ maxRetries?: number;
483
+ baseDelay?: number;
484
+ };
485
+ headers?: Record<string, string>;
486
+ };
487
+ sync?: {
488
+ interval?: number;
489
+ retryDelay?: number;
490
+ maxRetries?: number;
491
+ conflictStrategy?: 'last-write-wins' | 'server-wins' | 'client-wins';
492
+ resources?: string[];
493
+ pingUrl?: string;
494
+ };
495
+ }
496
+ interface QueueEntry {
497
+ id: string;
498
+ resource: string;
499
+ action: 'create' | 'update' | 'delete';
500
+ entityId: string;
501
+ data: Record<string, any> | null;
502
+ timestamp: number;
503
+ status: 'pending' | 'syncing' | 'failed';
504
+ retries: number;
505
+ error?: string;
506
+ }
507
+ interface SyncState {
508
+ isOnline: boolean;
509
+ isSyncing: boolean;
510
+ pendingCount: number;
511
+ lastSynced: number | null;
512
+ }
513
+
514
+ declare class SyncQueue {
515
+ private db;
516
+ private cache;
517
+ private _ready;
518
+ constructor(dbName?: string);
519
+ get ready(): Promise<void>;
520
+ private open;
521
+ private loadAll;
522
+ private persist;
523
+ private removeFromDb;
524
+ enqueue(entry: Omit<QueueEntry, 'id' | 'status' | 'retries'>): Promise<void>;
525
+ getPending(): QueueEntry[];
526
+ getPendingCount(): number;
527
+ markSyncing(id: string): Promise<void>;
528
+ remove(id: string): Promise<void>;
529
+ markFailed(id: string, error: string): Promise<void>;
530
+ getDeadLetters(maxRetries: number): QueueEntry[];
531
+ }
532
+
533
+ declare class SyncEngine {
534
+ private localDriver;
535
+ private httpDriver;
536
+ private queue;
537
+ private config;
538
+ private eventBus;
539
+ private online;
540
+ private syncing;
541
+ private pullTimer;
542
+ private pushTimer;
543
+ private lastSynced;
544
+ private registeredResources;
545
+ private _syncPromise;
546
+ constructor(localDriver: LocalDriver, httpDriver: HttpDriver, queue: SyncQueue, syncConfig?: SyncDriverConfig['sync']);
547
+ setEventBus(bus: EventBus): void;
548
+ registerResource(resource: string, endpoint: string): void;
549
+ start(): void;
550
+ stop(): void;
551
+ sync(): Promise<{
552
+ pushed: number;
553
+ pulled: number;
554
+ }>;
555
+ private _doSync;
556
+ private push;
557
+ private pull;
558
+ private pullResource;
559
+ private handleConflict;
560
+ private setupConnectivityListeners;
561
+ private checkOnline;
562
+ private handleOnline;
563
+ private handleOffline;
564
+ getSyncState(): SyncState;
565
+ private emitEvent;
566
+ private emitSyncState;
567
+ }
568
+
569
+ type AuthProvider = () => {
570
+ token: string;
571
+ } | null;
572
+ declare class SyncDriver implements Driver {
573
+ private localDriver;
574
+ private httpDriver;
575
+ private queue;
576
+ private _syncEngine;
577
+ private _ready;
578
+ private _isReady;
579
+ constructor(config: SyncDriverConfig);
580
+ get ready(): Promise<void>;
581
+ get isReady(): boolean;
582
+ get syncEngine(): SyncEngine;
583
+ /** @internal — exposed for createClient auth wiring */
584
+ get _httpDriver(): HttpDriver;
585
+ list<T>(resource: string, query: QueryParams): Promise<PagedResponse<T>>;
586
+ get<T>(resource: string, id: string): Promise<ApiResponse<T>>;
587
+ count(resource: string, filter?: Record<string, any>): Promise<number>;
588
+ create<T>(resource: string, data: Partial<T>): Promise<ApiResponse<T>>;
589
+ update<T>(resource: string, id: string, data: Partial<T>): Promise<ApiResponse<T>>;
590
+ delete<T>(resource: string, id: string): Promise<ApiResponse<T>>;
591
+ bulkCreate<T>(resource: string, data: Array<Partial<T>>): Promise<ApiResponse<T[]>>;
592
+ bulkUpdate<T>(resource: string, updates: Array<{
593
+ id: string;
594
+ data: Partial<T>;
595
+ }>): Promise<ApiResponse<T[]>>;
596
+ bulkDelete(resource: string, ids: string[]): Promise<ApiResponse<{
597
+ count: number;
598
+ }>>;
599
+ request<R = any>(resource: string, path: string, options?: {
600
+ method?: string;
601
+ body?: any;
602
+ query?: Record<string, string>;
603
+ local?: () => R | Promise<R>;
604
+ }): Promise<R>;
605
+ seed(resource: string, data: Array<Record<string, any>>, entityClass: Function): void;
606
+ getSeedVersion(): string | null;
607
+ setSeedVersion(version: string): void;
608
+ clear(resource: string): void;
609
+ setAuthProvider(provider: AuthProvider): void;
610
+ setOnUnauthorized(handler: () => Promise<boolean>): void;
611
+ registerEndpoint(resource: string, endpoint: string): void;
612
+ registerEntity(resource: string, entityClass: Function): void;
613
+ getStorageBackend(): ReturnType<LocalDriver['getStorageBackend']>;
614
+ }
615
+
446
616
  type FilterStyle = 'django' | 'dot' | 'bracket' | 'nestjs';
447
617
  interface Preset {
448
618
  name: string;
@@ -502,4 +672,4 @@ declare const expressPreset: Preset;
502
672
 
503
673
  declare function getPreset(name: string): Preset;
504
674
 
505
- export { type ApiResponse, type AuthContext, AuthService, type AuthState, type BaseFields, ConflictError, type Driver, type DriverConfig, Entity, type EventAction, EventBus, type EventHandler, type EventHandlersConfig, type EventSourceAdapter, type EventSourceConfig, type EventsConfig, FauxbaseError, type FauxbaseErrorPayload, type FauxbaseEvent, type FieldOptions, type FilterOperator, type FilterStyle, ForbiddenError, type HookType, HttpDriver, type HttpDriverConfig, HttpError, LocalDriver, type LocalDriverConfig, type LoginCredentials, NetworkError, NotFoundError, type PageMeta, type PagedResponse, type Preset, type QueryParams, type SSEConfig, type STOMPConfig, type SeedDefinition, Service, type SortParams, TimeoutError, ValidationError, afterCreate, afterUpdate, beforeCreate, beforeUpdate, computed, createClient, defaultPreset, definePreset, djangoPreset, expressPreset, field, getPreset, laravelPreset, nestjsPreset, relation, seed, springBootPreset };
675
+ export { type ApiResponse, type AuthContext, AuthService, type AuthState, type BaseFields, ConflictError, type Driver, type DriverConfig, Entity, type EventAction, EventBus, type EventHandler, type EventHandlersConfig, type EventSourceAdapter, type EventSourceConfig, type EventsConfig, FauxbaseError, type FauxbaseErrorPayload, type FauxbaseEvent, type FieldOptions, type FilterOperator, type FilterStyle, ForbiddenError, type HookType, HttpDriver, type HttpDriverConfig, HttpError, LocalDriver, type LocalDriverConfig, type LoginCredentials, NetworkError, NotFoundError, type PageMeta, type PagedResponse, type Preset, type QueryParams, type QueueEntry, type SSEConfig, type STOMPConfig, type SeedDefinition, Service, type SortParams, SyncDriver, type SyncDriverConfig$1 as SyncDriverConfig, type SyncState, TimeoutError, ValidationError, afterCreate, afterUpdate, beforeCreate, beforeUpdate, computed, createClient, defaultPreset, definePreset, djangoPreset, expressPreset, field, getPreset, laravelPreset, nestjsPreset, relation, seed, springBootPreset };
package/dist/index.d.ts CHANGED
@@ -67,7 +67,32 @@ interface HttpDriverConfig {
67
67
  };
68
68
  headers?: Record<string, string>;
69
69
  }
70
- type DriverConfig = LocalDriverConfig | HttpDriverConfig;
70
+ interface SyncDriverConfig$1 {
71
+ type: 'sync';
72
+ local: {
73
+ persist?: 'localStorage' | 'indexeddb';
74
+ dbName?: string;
75
+ };
76
+ remote: {
77
+ baseUrl: string;
78
+ preset?: string;
79
+ timeout?: number;
80
+ retry?: {
81
+ maxRetries?: number;
82
+ baseDelay?: number;
83
+ };
84
+ headers?: Record<string, string>;
85
+ };
86
+ sync?: {
87
+ interval?: number;
88
+ retryDelay?: number;
89
+ maxRetries?: number;
90
+ conflictStrategy?: 'last-write-wins' | 'server-wins' | 'client-wins';
91
+ resources?: string[];
92
+ pingUrl?: string;
93
+ };
94
+ }
95
+ type DriverConfig = LocalDriverConfig | HttpDriverConfig | SyncDriverConfig$1;
71
96
  interface SeedDefinition<T = any> {
72
97
  entityName: string;
73
98
  entityClass: any;
@@ -244,7 +269,7 @@ declare abstract class Service<T extends Entity> {
244
269
  private runHooks;
245
270
  }
246
271
 
247
- type AuthProvider$1 = () => {
272
+ type AuthProvider$2 = () => {
248
273
  token: string;
249
274
  } | null;
250
275
  interface HttpDriverOptions extends HttpDriverConfig {
@@ -266,7 +291,7 @@ declare class HttpDriver implements Driver {
266
291
  private authProvider;
267
292
  private onUnauthorized;
268
293
  constructor(config: HttpDriverOptions);
269
- setAuthProvider(provider: AuthProvider$1): void;
294
+ setAuthProvider(provider: AuthProvider$2): void;
270
295
  /** @internal — set callback to refresh token on 401 */
271
296
  setOnUnauthorized(handler: () => Promise<boolean>): void;
272
297
  registerEndpoint(resource: string, endpoint: string): void;
@@ -397,7 +422,7 @@ interface StorageBackend {
397
422
  getMeta(key: string): string | null;
398
423
  setMeta(key: string, value: string): void;
399
424
  }
400
- type AuthProvider = () => {
425
+ type AuthProvider$1 = () => {
401
426
  userId: string;
402
427
  userName?: string;
403
428
  } | null;
@@ -414,7 +439,7 @@ declare class LocalDriver implements Driver {
414
439
  private getLatency;
415
440
  get ready(): Promise<void>;
416
441
  get isReady(): boolean;
417
- setAuthProvider(provider: AuthProvider): void;
442
+ setAuthProvider(provider: AuthProvider$1): void;
418
443
  getStorageBackend(): StorageBackend;
419
444
  registerEntity(resource: string, entityClass: Function): void;
420
445
  list<T>(resource: string, query: QueryParams): Promise<PagedResponse<T>>;
@@ -443,6 +468,151 @@ declare class LocalDriver implements Driver {
443
468
  clear(resource: string): void;
444
469
  }
445
470
 
471
+ interface SyncDriverConfig {
472
+ type: 'sync';
473
+ local: {
474
+ persist?: 'localStorage' | 'indexeddb';
475
+ dbName?: string;
476
+ };
477
+ remote: {
478
+ baseUrl: string;
479
+ preset?: string;
480
+ timeout?: number;
481
+ retry?: {
482
+ maxRetries?: number;
483
+ baseDelay?: number;
484
+ };
485
+ headers?: Record<string, string>;
486
+ };
487
+ sync?: {
488
+ interval?: number;
489
+ retryDelay?: number;
490
+ maxRetries?: number;
491
+ conflictStrategy?: 'last-write-wins' | 'server-wins' | 'client-wins';
492
+ resources?: string[];
493
+ pingUrl?: string;
494
+ };
495
+ }
496
+ interface QueueEntry {
497
+ id: string;
498
+ resource: string;
499
+ action: 'create' | 'update' | 'delete';
500
+ entityId: string;
501
+ data: Record<string, any> | null;
502
+ timestamp: number;
503
+ status: 'pending' | 'syncing' | 'failed';
504
+ retries: number;
505
+ error?: string;
506
+ }
507
+ interface SyncState {
508
+ isOnline: boolean;
509
+ isSyncing: boolean;
510
+ pendingCount: number;
511
+ lastSynced: number | null;
512
+ }
513
+
514
+ declare class SyncQueue {
515
+ private db;
516
+ private cache;
517
+ private _ready;
518
+ constructor(dbName?: string);
519
+ get ready(): Promise<void>;
520
+ private open;
521
+ private loadAll;
522
+ private persist;
523
+ private removeFromDb;
524
+ enqueue(entry: Omit<QueueEntry, 'id' | 'status' | 'retries'>): Promise<void>;
525
+ getPending(): QueueEntry[];
526
+ getPendingCount(): number;
527
+ markSyncing(id: string): Promise<void>;
528
+ remove(id: string): Promise<void>;
529
+ markFailed(id: string, error: string): Promise<void>;
530
+ getDeadLetters(maxRetries: number): QueueEntry[];
531
+ }
532
+
533
+ declare class SyncEngine {
534
+ private localDriver;
535
+ private httpDriver;
536
+ private queue;
537
+ private config;
538
+ private eventBus;
539
+ private online;
540
+ private syncing;
541
+ private pullTimer;
542
+ private pushTimer;
543
+ private lastSynced;
544
+ private registeredResources;
545
+ private _syncPromise;
546
+ constructor(localDriver: LocalDriver, httpDriver: HttpDriver, queue: SyncQueue, syncConfig?: SyncDriverConfig['sync']);
547
+ setEventBus(bus: EventBus): void;
548
+ registerResource(resource: string, endpoint: string): void;
549
+ start(): void;
550
+ stop(): void;
551
+ sync(): Promise<{
552
+ pushed: number;
553
+ pulled: number;
554
+ }>;
555
+ private _doSync;
556
+ private push;
557
+ private pull;
558
+ private pullResource;
559
+ private handleConflict;
560
+ private setupConnectivityListeners;
561
+ private checkOnline;
562
+ private handleOnline;
563
+ private handleOffline;
564
+ getSyncState(): SyncState;
565
+ private emitEvent;
566
+ private emitSyncState;
567
+ }
568
+
569
+ type AuthProvider = () => {
570
+ token: string;
571
+ } | null;
572
+ declare class SyncDriver implements Driver {
573
+ private localDriver;
574
+ private httpDriver;
575
+ private queue;
576
+ private _syncEngine;
577
+ private _ready;
578
+ private _isReady;
579
+ constructor(config: SyncDriverConfig);
580
+ get ready(): Promise<void>;
581
+ get isReady(): boolean;
582
+ get syncEngine(): SyncEngine;
583
+ /** @internal — exposed for createClient auth wiring */
584
+ get _httpDriver(): HttpDriver;
585
+ list<T>(resource: string, query: QueryParams): Promise<PagedResponse<T>>;
586
+ get<T>(resource: string, id: string): Promise<ApiResponse<T>>;
587
+ count(resource: string, filter?: Record<string, any>): Promise<number>;
588
+ create<T>(resource: string, data: Partial<T>): Promise<ApiResponse<T>>;
589
+ update<T>(resource: string, id: string, data: Partial<T>): Promise<ApiResponse<T>>;
590
+ delete<T>(resource: string, id: string): Promise<ApiResponse<T>>;
591
+ bulkCreate<T>(resource: string, data: Array<Partial<T>>): Promise<ApiResponse<T[]>>;
592
+ bulkUpdate<T>(resource: string, updates: Array<{
593
+ id: string;
594
+ data: Partial<T>;
595
+ }>): Promise<ApiResponse<T[]>>;
596
+ bulkDelete(resource: string, ids: string[]): Promise<ApiResponse<{
597
+ count: number;
598
+ }>>;
599
+ request<R = any>(resource: string, path: string, options?: {
600
+ method?: string;
601
+ body?: any;
602
+ query?: Record<string, string>;
603
+ local?: () => R | Promise<R>;
604
+ }): Promise<R>;
605
+ seed(resource: string, data: Array<Record<string, any>>, entityClass: Function): void;
606
+ getSeedVersion(): string | null;
607
+ setSeedVersion(version: string): void;
608
+ clear(resource: string): void;
609
+ setAuthProvider(provider: AuthProvider): void;
610
+ setOnUnauthorized(handler: () => Promise<boolean>): void;
611
+ registerEndpoint(resource: string, endpoint: string): void;
612
+ registerEntity(resource: string, entityClass: Function): void;
613
+ getStorageBackend(): ReturnType<LocalDriver['getStorageBackend']>;
614
+ }
615
+
446
616
  type FilterStyle = 'django' | 'dot' | 'bracket' | 'nestjs';
447
617
  interface Preset {
448
618
  name: string;
@@ -502,4 +672,4 @@ declare const expressPreset: Preset;
502
672
 
503
673
  declare function getPreset(name: string): Preset;
504
674
 
505
- export { type ApiResponse, type AuthContext, AuthService, type AuthState, type BaseFields, ConflictError, type Driver, type DriverConfig, Entity, type EventAction, EventBus, type EventHandler, type EventHandlersConfig, type EventSourceAdapter, type EventSourceConfig, type EventsConfig, FauxbaseError, type FauxbaseErrorPayload, type FauxbaseEvent, type FieldOptions, type FilterOperator, type FilterStyle, ForbiddenError, type HookType, HttpDriver, type HttpDriverConfig, HttpError, LocalDriver, type LocalDriverConfig, type LoginCredentials, NetworkError, NotFoundError, type PageMeta, type PagedResponse, type Preset, type QueryParams, type SSEConfig, type STOMPConfig, type SeedDefinition, Service, type SortParams, TimeoutError, ValidationError, afterCreate, afterUpdate, beforeCreate, beforeUpdate, computed, createClient, defaultPreset, definePreset, djangoPreset, expressPreset, field, getPreset, laravelPreset, nestjsPreset, relation, seed, springBootPreset };
675
+ export { type ApiResponse, type AuthContext, AuthService, type AuthState, type BaseFields, ConflictError, type Driver, type DriverConfig, Entity, type EventAction, EventBus, type EventHandler, type EventHandlersConfig, type EventSourceAdapter, type EventSourceConfig, type EventsConfig, FauxbaseError, type FauxbaseErrorPayload, type FauxbaseEvent, type FieldOptions, type FilterOperator, type FilterStyle, ForbiddenError, type HookType, HttpDriver, type HttpDriverConfig, HttpError, LocalDriver, type LocalDriverConfig, type LoginCredentials, NetworkError, NotFoundError, type PageMeta, type PagedResponse, type Preset, type QueryParams, type QueueEntry, type SSEConfig, type STOMPConfig, type SeedDefinition, Service, type SortParams, SyncDriver, type SyncDriverConfig$1 as SyncDriverConfig, type SyncState, TimeoutError, ValidationError, afterCreate, afterUpdate, beforeCreate, beforeUpdate, computed, createClient, defaultPreset, definePreset, djangoPreset, expressPreset, field, getPreset, laravelPreset, nestjsPreset, relation, seed, springBootPreset };