strata-storage 1.6.0 → 2.0.1

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 (61) hide show
  1. package/Readme.md +66 -20
  2. package/android/build.gradle +58 -0
  3. package/android/proguard-rules.pro +11 -0
  4. package/android/settings.gradle +2 -0
  5. package/android/src/main/AndroidManifest.xml +2 -0
  6. package/dist/README.md +66 -20
  7. package/dist/adapters/web/MemoryAdapter.js +1 -1
  8. package/dist/android/build.gradle +58 -0
  9. package/dist/android/proguard-rules.pro +11 -0
  10. package/dist/android/settings.gradle +2 -0
  11. package/dist/android/src/main/AndroidManifest.xml +2 -0
  12. package/dist/capacitor.d.ts +20 -0
  13. package/dist/capacitor.d.ts.map +1 -0
  14. package/dist/capacitor.js +48 -0
  15. package/dist/core/Strata.d.ts +28 -3
  16. package/dist/core/Strata.d.ts.map +1 -1
  17. package/dist/core/Strata.js +51 -52
  18. package/dist/features/compression/index.d.ts +2 -0
  19. package/dist/features/compression/index.d.ts.map +1 -0
  20. package/dist/features/compression/index.js +1 -0
  21. package/dist/features/encryption/index.d.ts +2 -0
  22. package/dist/features/encryption/index.d.ts.map +1 -0
  23. package/dist/features/encryption/index.js +1 -0
  24. package/dist/features/observer/index.d.ts +2 -0
  25. package/dist/features/observer/index.d.ts.map +1 -0
  26. package/dist/features/observer/index.js +1 -0
  27. package/dist/features/observer.d.ts +20 -0
  28. package/dist/features/observer.d.ts.map +1 -0
  29. package/dist/features/observer.js +32 -0
  30. package/dist/features/query/index.d.ts +2 -0
  31. package/dist/features/query/index.d.ts.map +1 -0
  32. package/dist/features/query/index.js +1 -0
  33. package/dist/features/query.d.ts.map +1 -1
  34. package/dist/features/query.js +8 -1
  35. package/dist/features/sync/index.d.ts +2 -0
  36. package/dist/features/sync/index.d.ts.map +1 -0
  37. package/dist/features/sync/index.js +1 -0
  38. package/dist/features/ttl/index.d.ts +2 -0
  39. package/dist/features/ttl/index.d.ts.map +1 -0
  40. package/dist/features/ttl/index.js +1 -0
  41. package/dist/firebase.d.ts +26 -0
  42. package/dist/firebase.d.ts.map +1 -0
  43. package/dist/firebase.js +147 -0
  44. package/dist/index.d.ts +13 -47
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +46 -50
  47. package/dist/package.json +11 -2
  48. package/dist/plugin/definitions.d.ts +2 -2
  49. package/dist/plugin/definitions.d.ts.map +1 -1
  50. package/dist/plugin/index.d.ts +2 -1
  51. package/dist/plugin/index.d.ts.map +1 -1
  52. package/dist/plugin/index.js +76 -10
  53. package/dist/types/index.d.ts +190 -0
  54. package/dist/types/index.d.ts.map +1 -1
  55. package/dist/types/index.js +13 -0
  56. package/dist/utils/index.d.ts +20 -0
  57. package/dist/utils/index.d.ts.map +1 -1
  58. package/dist/utils/index.js +34 -0
  59. package/package.json +12 -2
  60. package/scripts/build.js +8 -0
  61. package/scripts/postinstall.js +15 -8
@@ -3,7 +3,7 @@
3
3
  * Zero-dependency universal storage solution
4
4
  */
5
5
  import { AdapterRegistry } from "./AdapterRegistry.js";
6
- import { isBrowser, isNode, isCapacitor } from "../utils/index.js";
6
+ import { isBrowser, isNode } from "../utils/index.js";
7
7
  import { StorageError, EncryptionError } from "../utils/errors.js";
8
8
  import { EncryptionManager } from "../features/encryption.js";
9
9
  import { CompressionManager } from "../features/compression.js";
@@ -17,22 +17,35 @@ export class Strata {
17
17
  registry;
18
18
  defaultAdapter;
19
19
  adapters = new Map();
20
- platform;
20
+ _platform;
21
21
  encryptionManager;
22
22
  compressionManager;
23
23
  syncManager;
24
24
  ttlManager;
25
+ _initialized = false;
25
26
  constructor(config = {}) {
26
27
  this.config = this.normalizeConfig(config);
27
- this.platform = this.detectPlatform();
28
+ this._platform = this.detectPlatform();
28
29
  this.registry = new AdapterRegistry();
29
30
  }
31
+ /**
32
+ * Check if Strata has been initialized
33
+ */
34
+ get isInitialized() {
35
+ return this._initialized;
36
+ }
37
+ /**
38
+ * Get the detected platform
39
+ */
40
+ get platform() {
41
+ return this._platform;
42
+ }
30
43
  /**
31
44
  * Initialize Strata with available adapters
32
45
  */
33
46
  async initialize() {
34
- // Register all adapters based on platform
35
- await this.registerAdapters();
47
+ // No automatic adapter registration - adapters should be registered before initialize()
48
+ // This allows for zero-dependency operation and explicit opt-in for features
36
49
  // Find and set default adapter
37
50
  await this.selectDefaultAdapter();
38
51
  // Initialize configured adapters
@@ -64,6 +77,8 @@ export class Strata {
64
77
  if (this.defaultAdapter && this.config.ttl?.autoCleanup !== false) {
65
78
  this.ttlManager.startAutoCleanup(() => this.defaultAdapter.keys(), (key) => this.defaultAdapter.get(key), (key) => this.defaultAdapter.remove(key));
66
79
  }
80
+ // Mark as initialized
81
+ this._initialized = true;
67
82
  }
68
83
  /**
69
84
  * Get a value from storage
@@ -429,6 +444,26 @@ export class Strata {
429
444
  const expired = await this.ttlManager.cleanup(() => adapter.keys(), (key) => adapter.get(key), (key) => adapter.remove(key));
430
445
  return expired.length;
431
446
  }
447
+ /**
448
+ * Register a custom storage adapter
449
+ * This allows external adapters to be registered after initialization
450
+ *
451
+ * @example
452
+ * ```typescript
453
+ * import { MyCustomAdapter } from "./my-adapter.js";
454
+ * storage.registerAdapter(new MyCustomAdapter());
455
+ * ```
456
+ */
457
+ registerAdapter(adapter) {
458
+ this.registry.register(adapter);
459
+ }
460
+ /**
461
+ * Get the adapter registry (for advanced use cases)
462
+ * @internal
463
+ */
464
+ getRegistry() {
465
+ return this.registry;
466
+ }
432
467
  /**
433
468
  * Close all adapters
434
469
  */
@@ -456,13 +491,11 @@ export class Strata {
456
491
  normalizeConfig(config) {
457
492
  return {
458
493
  platform: config.platform || this.detectPlatform(),
459
- defaultStorages: config.defaultStorages || this.getDefaultStorages(),
494
+ defaultStorages: config.defaultStorages || ['memory'], // Default to memory adapter
460
495
  ...config,
461
496
  };
462
497
  }
463
498
  detectPlatform() {
464
- if (isCapacitor())
465
- return 'web'; // Capacitor runs in web context
466
499
  if (isBrowser())
467
500
  return 'web';
468
501
  if (isNode())
@@ -470,50 +503,16 @@ export class Strata {
470
503
  return 'web'; // Default to web
471
504
  }
472
505
  getDefaultStorages() {
473
- switch (this.platform) {
474
- case 'web':
475
- if (isCapacitor()) {
476
- return ['preferences', 'sqlite', 'indexedDB', 'localStorage', 'memory'];
477
- }
478
- return ['indexedDB', 'localStorage', 'memory'];
479
- case 'node':
480
- return ['filesystem', 'memory'];
481
- case 'ios':
482
- case 'android':
483
- return ['preferences', 'sqlite', 'secure', 'memory'];
484
- default:
485
- return ['memory'];
486
- }
487
- }
488
- async registerAdapters() {
489
- // Register adapters based on platform
490
- if (this.platform === 'web') {
491
- // Dynamically import and register web adapters
492
- const { MemoryAdapter } = await import("../adapters/web/MemoryAdapter.js");
493
- const { LocalStorageAdapter } = await import("../adapters/web/LocalStorageAdapter.js");
494
- const { SessionStorageAdapter } = await import("../adapters/web/SessionStorageAdapter.js");
495
- const { IndexedDBAdapter } = await import("../adapters/web/IndexedDBAdapter.js");
496
- const { CookieAdapter } = await import("../adapters/web/CookieAdapter.js");
497
- const { CacheAdapter } = await import("../adapters/web/CacheAdapter.js");
498
- this.registry.register(new MemoryAdapter());
499
- this.registry.register(new LocalStorageAdapter());
500
- this.registry.register(new SessionStorageAdapter());
501
- this.registry.register(new IndexedDBAdapter());
502
- this.registry.register(new CookieAdapter());
503
- this.registry.register(new CacheAdapter());
504
- // If running in Capacitor, also register native adapters
505
- if (isCapacitor()) {
506
- const { PreferencesAdapter } = await import("../adapters/capacitor/PreferencesAdapter.js");
507
- const { SqliteAdapter } = await import("../adapters/capacitor/SqliteAdapter.js");
508
- const { SecureAdapter } = await import("../adapters/capacitor/SecureAdapter.js");
509
- const { FilesystemAdapter } = await import("../adapters/capacitor/FilesystemAdapter.js");
510
- this.registry.register(new PreferencesAdapter());
511
- this.registry.register(new SqliteAdapter());
512
- this.registry.register(new SecureAdapter());
513
- this.registry.register(new FilesystemAdapter());
514
- }
515
- }
516
- // Additional adapters will be registered as they are implemented
506
+ // Only return adapters that are actually registered
507
+ const registered = Array.from(this.registry.getAll().keys()).map((key) => String(key));
508
+ // Prefer these storages in order if available
509
+ const preferredOrder = ['indexedDB', 'localStorage', 'sessionStorage', 'memory'];
510
+ const available = preferredOrder.filter((storage) => registered.includes(storage));
511
+ // Always include memory as fallback if registered
512
+ if (available.length === 0 && registered.includes('memory')) {
513
+ return ['memory'];
514
+ }
515
+ return (available.length > 0 ? available : registered);
517
516
  }
518
517
  async selectDefaultAdapter() {
519
518
  const storages = this.config.defaultStorages || this.getDefaultStorages();
@@ -0,0 +1,2 @@
1
+ export * from '../compression';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/features/compression/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1 @@
1
+ export * from "../compression.js";
@@ -0,0 +1,2 @@
1
+ export * from '../encryption';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/features/encryption/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
@@ -0,0 +1 @@
1
+ export * from "../encryption.js";
@@ -0,0 +1,2 @@
1
+ export * from '../observer';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/features/observer/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
@@ -0,0 +1 @@
1
+ export * from "../observer.js";
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Storage Observer - Watch for storage changes
3
+ */
4
+ import type { ObserverCallback, StorageEvent } from '@/types';
5
+ export declare class StorageObserver {
6
+ private observers;
7
+ /**
8
+ * Subscribe to storage events
9
+ */
10
+ subscribe(callback: ObserverCallback): () => void;
11
+ /**
12
+ * Emit a storage event
13
+ */
14
+ emit(event: StorageEvent): void;
15
+ /**
16
+ * Clear all observers
17
+ */
18
+ clear(): void;
19
+ }
20
+ //# sourceMappingURL=observer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observer.d.ts","sourceRoot":"","sources":["../../src/features/observer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE9D,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAoC;IAErD;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,IAAI;IAKjD;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAU/B;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Storage Observer - Watch for storage changes
3
+ */
4
+ export class StorageObserver {
5
+ observers = new Set();
6
+ /**
7
+ * Subscribe to storage events
8
+ */
9
+ subscribe(callback) {
10
+ this.observers.add(callback);
11
+ return () => this.observers.delete(callback);
12
+ }
13
+ /**
14
+ * Emit a storage event
15
+ */
16
+ emit(event) {
17
+ this.observers.forEach((callback) => {
18
+ try {
19
+ callback(event);
20
+ }
21
+ catch (error) {
22
+ console.error('Error in storage observer:', error);
23
+ }
24
+ });
25
+ }
26
+ /**
27
+ * Clear all observers
28
+ */
29
+ clear() {
30
+ this.observers.clear();
31
+ }
32
+ }
@@ -0,0 +1,2 @@
1
+ export * from '../query';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/features/query/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC"}
@@ -0,0 +1 @@
1
+ export * from "../query.js";
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/features/query.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,SAAS,CAAC;AAE9D;;GAEG;AACH,qBAAa,WAAW;IACtB;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,GAAG,OAAO;IAwB3D;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IASxB;;OAEG;IACH,OAAO,CAAC,eAAe;IAqDvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAkBrB;;OAEG;IACH,OAAO,CAAC,cAAc;IAmBtB;;OAEG;IACH,OAAO,CAAC,MAAM;IA+Bd;;OAEG;IACH,OAAO,CAAC,OAAO;IAyBf;;OAEG;IACH,OAAO,CAAC,YAAY;IAOpB;;OAEG;IACH,OAAO,CAAC,OAAO;IASf;;OAEG;IACH,OAAO,CAAC,WAAW;IAcnB;;OAEG;IACH,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;IAoBxD;;OAEG;IACH,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IA2B5E;;OAEG;IACH,OAAO,CAAC,cAAc;IAetB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAc1B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,WAAW,CAE/C"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/features/query.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,SAAS,CAAC;AAE9D;;GAEG;AACH,qBAAa,WAAW;IACtB;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,GAAG,OAAO;IAwB3D;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IASxB;;OAEG;IACH,OAAO,CAAC,eAAe;IA2DvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAkBrB;;OAEG;IACH,OAAO,CAAC,cAAc;IAmBtB;;OAEG;IACH,OAAO,CAAC,MAAM;IA+Bd;;OAEG;IACH,OAAO,CAAC,OAAO;IAyBf;;OAEG;IACH,OAAO,CAAC,YAAY;IAOpB;;OAEG;IACH,OAAO,CAAC,OAAO;IASf;;OAEG;IACH,OAAO,CAAC,WAAW;IAcnB;;OAEG;IACH,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;IAoBxD;;OAEG;IACH,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IA2B5E;;OAEG;IACH,OAAO,CAAC,cAAc;IAetB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAc1B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,WAAW,CAE/C"}
@@ -63,7 +63,14 @@ export class QueryEngine {
63
63
  case '$lte':
64
64
  return this.compare(value, operand) <= 0;
65
65
  case '$in':
66
- return Array.isArray(operand) && operand.some((v) => this.equals(value, v));
66
+ if (!Array.isArray(operand))
67
+ return false;
68
+ // If value is an array, check if any operand value is in the array
69
+ if (Array.isArray(value)) {
70
+ return operand.some((v) => value.some((item) => this.equals(item, v)));
71
+ }
72
+ // Otherwise check if value equals any operand value
73
+ return operand.some((v) => this.equals(value, v));
67
74
  case '$nin':
68
75
  return Array.isArray(operand) && !operand.some((v) => this.equals(value, v));
69
76
  case '$regex':
@@ -0,0 +1,2 @@
1
+ export * from '../sync';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/features/sync/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC"}
@@ -0,0 +1 @@
1
+ export * from "../sync.js";
@@ -0,0 +1,2 @@
1
+ export * from '../ttl';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/features/ttl/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC"}
@@ -0,0 +1 @@
1
+ export * from "../ttl.js";
@@ -0,0 +1,26 @@
1
+ import type { Strata } from './core/Strata';
2
+ /**
3
+ * Firebase sync configuration
4
+ */
5
+ export interface FirebaseSyncConfig {
6
+ apiKey: string;
7
+ authDomain: string;
8
+ projectId: string;
9
+ storageBucket?: string;
10
+ messagingSenderId?: string;
11
+ appId: string;
12
+ realtimeDatabase?: boolean;
13
+ firestore?: boolean;
14
+ collectionName?: string;
15
+ syncInterval?: number;
16
+ }
17
+ /**
18
+ * Enable Firebase sync for Strata Storage
19
+ * This dynamically imports Firebase SDK only when needed
20
+ */
21
+ export declare function enableFirebaseSync(storage: Strata, config: FirebaseSyncConfig): Promise<void>;
22
+ /**
23
+ * Check if Firebase is available in the environment
24
+ */
25
+ export declare function isFirebaseAvailable(): Promise<boolean>;
26
+ //# sourceMappingURL=firebase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firebase.d.ts","sourceRoot":"","sources":["../src/firebase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,IAAI,CAAC,CA2If;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAO5D"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Enable Firebase sync for Strata Storage
3
+ * This dynamically imports Firebase SDK only when needed
4
+ */
5
+ export async function enableFirebaseSync(storage, config) {
6
+ // Dynamically import Firebase only when this function is called
7
+ try {
8
+ const { initializeApp, getApps } = await import('firebase/app');
9
+ // Initialize Firebase if not already initialized
10
+ if (!getApps().length) {
11
+ initializeApp({
12
+ apiKey: config.apiKey,
13
+ authDomain: config.authDomain,
14
+ projectId: config.projectId,
15
+ storageBucket: config.storageBucket,
16
+ messagingSenderId: config.messagingSenderId,
17
+ appId: config.appId,
18
+ });
19
+ }
20
+ if (config.firestore) {
21
+ const { getFirestore, doc, setDoc, getDoc, deleteDoc } = await import('firebase/firestore');
22
+ const db = getFirestore();
23
+ const collectionName = config.collectionName || 'strata-storage';
24
+ // Create custom adapter for Firestore
25
+ const firestoreAdapter = {
26
+ name: 'firestore',
27
+ capabilities: {
28
+ persistent: true,
29
+ synchronous: false,
30
+ observable: true,
31
+ transactional: false,
32
+ queryable: true,
33
+ maxSize: -1,
34
+ binary: true,
35
+ encrypted: false,
36
+ crossTab: true,
37
+ },
38
+ async get(key) {
39
+ const docRef = doc(db, collectionName, key);
40
+ const docSnap = await getDoc(docRef);
41
+ return docSnap.exists() ? docSnap.data() : null;
42
+ },
43
+ async set(key, value) {
44
+ const docRef = doc(db, collectionName, key);
45
+ await setDoc(docRef, { value, timestamp: Date.now() });
46
+ },
47
+ async remove(key) {
48
+ const docRef = doc(db, collectionName, key);
49
+ await deleteDoc(docRef);
50
+ },
51
+ async has(key) {
52
+ const docRef = doc(db, collectionName, key);
53
+ const docSnap = await getDoc(docRef);
54
+ return docSnap.exists();
55
+ },
56
+ async clear() {
57
+ // Firestore doesn't have a direct clear method
58
+ console.warn('Clear operation not supported for Firestore adapter');
59
+ },
60
+ async keys() {
61
+ // Would need to implement with queries
62
+ return [];
63
+ },
64
+ async size() {
65
+ return { total: 0, count: 0 };
66
+ },
67
+ async initialize() {
68
+ // Already initialized
69
+ },
70
+ async isAvailable() {
71
+ return true;
72
+ },
73
+ };
74
+ // Register the Firestore adapter
75
+ storage.registerAdapter(firestoreAdapter);
76
+ }
77
+ if (config.realtimeDatabase) {
78
+ const { getDatabase, ref, set, get, remove } = await import('firebase/database');
79
+ const db = getDatabase();
80
+ // Create custom adapter for Realtime Database
81
+ const realtimeAdapter = {
82
+ name: 'realtime',
83
+ capabilities: {
84
+ persistent: true,
85
+ synchronous: false,
86
+ observable: true,
87
+ transactional: false,
88
+ queryable: false,
89
+ maxSize: -1,
90
+ binary: false,
91
+ encrypted: false,
92
+ crossTab: true,
93
+ },
94
+ async get(key) {
95
+ const snapshot = await get(ref(db, `strata-storage/${key}`));
96
+ return snapshot.exists() ? snapshot.val() : null;
97
+ },
98
+ async set(key, value) {
99
+ await set(ref(db, `strata-storage/${key}`), value);
100
+ },
101
+ async remove(key) {
102
+ await remove(ref(db, `strata-storage/${key}`));
103
+ },
104
+ async has(key) {
105
+ const snapshot = await get(ref(db, `strata-storage/${key}`));
106
+ return snapshot.exists();
107
+ },
108
+ async clear() {
109
+ await remove(ref(db, 'strata-storage'));
110
+ },
111
+ async keys() {
112
+ const snapshot = await get(ref(db, 'strata-storage'));
113
+ return snapshot.exists() ? Object.keys(snapshot.val()) : [];
114
+ },
115
+ async size() {
116
+ const snapshot = await get(ref(db, 'strata-storage'));
117
+ const count = snapshot.exists() ? Object.keys(snapshot.val()).length : 0;
118
+ return { total: count * 100, count }; // Rough estimate
119
+ },
120
+ async initialize() {
121
+ // Already initialized
122
+ },
123
+ async isAvailable() {
124
+ return true;
125
+ },
126
+ };
127
+ // Register the Realtime Database adapter
128
+ storage.registerAdapter(realtimeAdapter);
129
+ }
130
+ console.log('Firebase sync enabled successfully');
131
+ }
132
+ catch (error) {
133
+ throw new Error(`Failed to enable Firebase sync: ${error instanceof Error ? error.message : 'Unknown error'}`);
134
+ }
135
+ }
136
+ /**
137
+ * Check if Firebase is available in the environment
138
+ */
139
+ export async function isFirebaseAvailable() {
140
+ try {
141
+ await import('firebase/app');
142
+ return true;
143
+ }
144
+ catch {
145
+ return false;
146
+ }
147
+ }
package/dist/index.d.ts CHANGED
@@ -1,56 +1,22 @@
1
- /**
2
- * Strata Storage - Zero-dependency universal storage plugin
3
- *
4
- * @packageDocumentation
5
- */
6
1
  export { Strata } from './core/Strata';
7
- import { Strata } from './core/Strata';
8
- export type { Platform, StorageType, StorageStrategy, StorageOptions, StorageValue, StorageChange, StorageCapabilities, StrataConfig, StorageAdapter, Transaction, ClearOptions, SizeInfo, ExportOptions, ImportOptions, QueryCondition, QueryOperators, SubscriptionCallback, UnsubscribeFunction, Migration, ExportFormat, } from './types';
9
- export { StrataError, StorageError, NotFoundError, QuotaExceededError, AdapterNotAvailableError, NotSupportedError, EncryptionError, CompressionError, SerializationError, ValidationError, TransactionError, MigrationError, SyncError, isStrataError, isQuotaError, } from './utils/errors';
10
- export { serialize, deserialize, deepClone, deepMerge, formatBytes, parseSize, EventEmitter, } from './utils';
11
2
  export { BaseAdapter } from './core/BaseAdapter';
12
3
  export { AdapterRegistry } from './core/AdapterRegistry';
13
- export { EncryptionManager } from './features/encryption';
14
- export type { EncryptionConfig, EncryptedData } from './features/encryption';
15
- export { CompressionManager } from './features/compression';
16
- export type { CompressionConfig, CompressedData } from './features/compression';
17
- export { SyncManager, createSyncManager } from './features/sync';
18
- export type { SyncConfig, SyncMessage } from './features/sync';
19
- export { QueryEngine, createQueryEngine } from './features/query';
20
- export { TTLManager, createTTLManager } from './features/ttl';
21
- export type { TTLConfig, TTLOptions, ExpiredItem } from './features/ttl';
22
- export { MigrationManager } from './features/migration';
23
- export type { Migration as MigrationDefinition } from './features/migration';
24
- export * from './plugin/definitions';
25
- export { StrataStorage } from './plugin';
26
- export { MemoryAdapter } from './adapters/web/MemoryAdapter';
27
4
  export { LocalStorageAdapter } from './adapters/web/LocalStorageAdapter';
28
5
  export { SessionStorageAdapter } from './adapters/web/SessionStorageAdapter';
29
6
  export { IndexedDBAdapter } from './adapters/web/IndexedDBAdapter';
30
7
  export { CookieAdapter } from './adapters/web/CookieAdapter';
31
8
  export { CacheAdapter } from './adapters/web/CacheAdapter';
32
- export { PreferencesAdapter } from './adapters/capacitor/PreferencesAdapter';
33
- export { SqliteAdapter } from './adapters/capacitor/SqliteAdapter';
34
- export type { SqliteConfig } from './adapters/capacitor/SqliteAdapter';
35
- export { SecureAdapter } from './adapters/capacitor/SecureAdapter';
36
- export { FilesystemAdapter } from './adapters/capacitor/FilesystemAdapter';
37
- /**
38
- * Create a new Strata instance with optional configuration
39
- *
40
- * @example
41
- * ```typescript
42
- * import { Strata } from 'strata-storage';
43
- *
44
- * const storage = new Strata({
45
- * defaultStorages: ['indexedDB', 'localStorage', 'memory'],
46
- * encryption: { enabled: true },
47
- * compression: { enabled: true }
48
- * });
49
- *
50
- * await storage.initialize();
51
- * await storage.set('key', 'value');
52
- * const value = await storage.get('key');
53
- * ```
54
- */
55
- export declare function createStrata(config?: import('./types').StrataConfig): InstanceType<typeof Strata>;
9
+ export { MemoryAdapter } from './adapters/web/MemoryAdapter';
10
+ export { EncryptionManager } from './features/encryption';
11
+ export { CompressionManager } from './features/compression';
12
+ export { TTLManager } from './features/ttl';
13
+ export { QueryEngine } from './features/query';
14
+ export { SyncManager } from './features/sync';
15
+ export { StorageObserver } from './features/observer';
16
+ export type { StorageType, StorageOptions, StorageValue, StorageAdapter, AdapterConfig, QueryOptions, SyncConfig, EncryptionConfig, CompressionConfig, ObserverCallback, StorageEvent, StorageError, StorageCapabilities, StorageMetadata, TTLConfig, } from './types';
17
+ export { isValidKey, isValidValue, serializeValue, deserializeValue, generateId, createError, retry, debounce, throttle, } from './utils';
18
+ import { Strata } from './core/Strata';
19
+ declare const storage: Strata;
20
+ export { storage };
21
+ export default storage;
56
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAGvC,YAAY,EAEV,QAAQ,EACR,WAAW,EACX,eAAe,EACf,cAAc,EACd,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,YAAY,EAGZ,cAAc,EACd,WAAW,EAGX,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,aAAa,EACb,cAAc,EACd,cAAc,EAGd,oBAAoB,EACpB,mBAAmB,EAGnB,SAAS,EACT,YAAY,GACb,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,WAAW,EACX,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,wBAAwB,EACxB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,SAAS,EACT,aAAa,EACb,YAAY,GACb,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,SAAS,EACT,WAAW,EACX,SAAS,EACT,SAAS,EACT,WAAW,EACX,SAAS,EACT,YAAY,GACb,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACjE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC9D,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,YAAY,EAAE,SAAS,IAAI,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAG7E,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,YAAY,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAE3E;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,OAAO,SAAS,EAAE,YAAY,GAAG,YAAY,CAAC,OAAO,MAAM,CAAC,CAEjG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAG7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,YAAY,EACV,WAAW,EACX,cAAc,EACd,YAAY,EACZ,cAAc,EACd,aAAa,EACb,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,SAAS,GACV,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,UAAU,EACV,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,KAAK,EACL,QAAQ,EACR,QAAQ,GACT,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AASvC,QAAA,MAAM,OAAO,QAGX,CAAC;AAqBH,OAAO,EAAE,OAAO,EAAE,CAAC;AAGnB,eAAe,OAAO,CAAC"}