@framers/sql-storage-adapter 0.1.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 (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +363 -0
  3. package/dist/adapters/baseStorageAdapter.d.ts +204 -0
  4. package/dist/adapters/baseStorageAdapter.d.ts.map +1 -0
  5. package/dist/adapters/baseStorageAdapter.js +364 -0
  6. package/dist/adapters/baseStorageAdapter.js.map +1 -0
  7. package/dist/adapters/betterSqliteAdapter.d.ts +64 -0
  8. package/dist/adapters/betterSqliteAdapter.d.ts.map +1 -0
  9. package/dist/adapters/betterSqliteAdapter.js +206 -0
  10. package/dist/adapters/betterSqliteAdapter.js.map +1 -0
  11. package/dist/adapters/capacitorSqliteAdapter.d.ts +33 -0
  12. package/dist/adapters/capacitorSqliteAdapter.d.ts.map +1 -0
  13. package/dist/adapters/capacitorSqliteAdapter.js +95 -0
  14. package/dist/adapters/capacitorSqliteAdapter.js.map +1 -0
  15. package/dist/adapters/postgresAdapter.d.ts +180 -0
  16. package/dist/adapters/postgresAdapter.d.ts.map +1 -0
  17. package/dist/adapters/postgresAdapter.js +271 -0
  18. package/dist/adapters/postgresAdapter.js.map +1 -0
  19. package/dist/adapters/sqlJsAdapter.d.ts +28 -0
  20. package/dist/adapters/sqlJsAdapter.d.ts.map +1 -0
  21. package/dist/adapters/sqlJsAdapter.js +136 -0
  22. package/dist/adapters/sqlJsAdapter.js.map +1 -0
  23. package/dist/adapters/supabase.d.ts +58 -0
  24. package/dist/adapters/supabase.d.ts.map +1 -0
  25. package/dist/adapters/supabase.js +385 -0
  26. package/dist/adapters/supabase.js.map +1 -0
  27. package/dist/database.d.ts +124 -0
  28. package/dist/database.d.ts.map +1 -0
  29. package/dist/database.js +136 -0
  30. package/dist/database.js.map +1 -0
  31. package/dist/index.d.ts +17 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +25 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/resolver.d.ts +24 -0
  36. package/dist/resolver.d.ts.map +1 -0
  37. package/dist/resolver.js +91 -0
  38. package/dist/resolver.js.map +1 -0
  39. package/dist/types/context.d.ts +221 -0
  40. package/dist/types/context.d.ts.map +1 -0
  41. package/dist/types/context.js +9 -0
  42. package/dist/types/context.js.map +1 -0
  43. package/dist/types/events.d.ts +225 -0
  44. package/dist/types/events.d.ts.map +1 -0
  45. package/dist/types/events.js +8 -0
  46. package/dist/types/events.js.map +1 -0
  47. package/dist/types/extensions.d.ts +73 -0
  48. package/dist/types/extensions.d.ts.map +1 -0
  49. package/dist/types/extensions.js +7 -0
  50. package/dist/types/extensions.js.map +1 -0
  51. package/dist/types/limitations.d.ts +46 -0
  52. package/dist/types/limitations.d.ts.map +1 -0
  53. package/dist/types/limitations.js +154 -0
  54. package/dist/types/limitations.js.map +1 -0
  55. package/dist/types.d.ts +235 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +18 -0
  58. package/dist/types.js.map +1 -0
  59. package/dist/utils/cloudBackup.d.ts +219 -0
  60. package/dist/utils/cloudBackup.d.ts.map +1 -0
  61. package/dist/utils/cloudBackup.js +289 -0
  62. package/dist/utils/cloudBackup.js.map +1 -0
  63. package/dist/utils/dataExport.d.ts +77 -0
  64. package/dist/utils/dataExport.d.ts.map +1 -0
  65. package/dist/utils/dataExport.js +212 -0
  66. package/dist/utils/dataExport.js.map +1 -0
  67. package/dist/utils/dataImport.d.ts +54 -0
  68. package/dist/utils/dataImport.d.ts.map +1 -0
  69. package/dist/utils/dataImport.js +324 -0
  70. package/dist/utils/dataImport.js.map +1 -0
  71. package/dist/utils/migration.d.ts +89 -0
  72. package/dist/utils/migration.d.ts.map +1 -0
  73. package/dist/utils/migration.js +184 -0
  74. package/dist/utils/migration.js.map +1 -0
  75. package/dist/utils/parameterUtils.d.ts +9 -0
  76. package/dist/utils/parameterUtils.d.ts.map +1 -0
  77. package/dist/utils/parameterUtils.js +17 -0
  78. package/dist/utils/parameterUtils.js.map +1 -0
  79. package/dist/utils/syncManager.d.ts +342 -0
  80. package/dist/utils/syncManager.d.ts.map +1 -0
  81. package/dist/utils/syncManager.js +533 -0
  82. package/dist/utils/syncManager.js.map +1 -0
  83. package/package.json +108 -0
@@ -0,0 +1,124 @@
1
+ /**
2
+ * High-level, user-friendly API for SQL storage.
3
+ *
4
+ * This module provides simple functions like:
5
+ * - createDatabase() - Automatically picks the best database for your environment
6
+ * - connectDatabase() - Explicit connection with clear options
7
+ * - openDatabase() - Simple file-based database
8
+ */
9
+ import type { StorageAdapter } from './types';
10
+ import { type AdapterKind } from './resolver';
11
+ import type { PostgresAdapterOptions } from './adapters/postgresAdapter';
12
+ import type { CapacitorAdapterOptions } from './adapters/capacitorSqliteAdapter';
13
+ /**
14
+ * Database connection options.
15
+ */
16
+ export interface DatabaseOptions {
17
+ /**
18
+ * Database URL (e.g., postgresql://user:pass@host/db).
19
+ * If provided, PostgreSQL will be used.
20
+ */
21
+ url?: string;
22
+ /**
23
+ * File path for SQLite database.
24
+ * Used for local/offline storage.
25
+ */
26
+ file?: string;
27
+ /**
28
+ * PostgreSQL-specific configuration.
29
+ * Automatically uses PostgreSQL when provided.
30
+ */
31
+ postgres?: PostgresAdapterOptions;
32
+ /**
33
+ * Mobile (Capacitor) configuration.
34
+ * Automatically detected on mobile platforms.
35
+ */
36
+ mobile?: CapacitorAdapterOptions;
37
+ /**
38
+ * Force a specific database type.
39
+ * Leave empty to auto-detect.
40
+ */
41
+ type?: 'postgres' | 'sqlite' | 'browser' | 'mobile' | 'memory';
42
+ /**
43
+ * Custom priority order for adapter selection.
44
+ * Advanced: Only use if you need fine-grained control.
45
+ */
46
+ priority?: AdapterKind[];
47
+ }
48
+ /**
49
+ * Create a database connection.
50
+ * Automatically picks the best database for your environment.
51
+ *
52
+ * @example
53
+ * ```typescript
54
+ * // Auto-detect (PostgreSQL in prod, SQLite locally)
55
+ * const db = await createDatabase();
56
+ *
57
+ * // Specify database URL
58
+ * const db = await createDatabase({
59
+ * url: process.env.DATABASE_URL
60
+ * });
61
+ *
62
+ * // Specify file path
63
+ * const db = await createDatabase({
64
+ * file: './my-app.db'
65
+ * });
66
+ *
67
+ * // Full PostgreSQL config
68
+ * const db = await createDatabase({
69
+ * postgres: {
70
+ * host: 'db.example.com',
71
+ * database: 'myapp',
72
+ * user: 'dbuser',
73
+ * password: process.env.DB_PASSWORD,
74
+ * ssl: true
75
+ * }
76
+ * });
77
+ * ```
78
+ */
79
+ export declare function createDatabase(options?: DatabaseOptions): Promise<StorageAdapter>;
80
+ /**
81
+ * Connect to a remote database.
82
+ *
83
+ * @example
84
+ * ```typescript
85
+ * // Simple connection string
86
+ * const db = await connectDatabase('postgresql://user:pass@host/db');
87
+ *
88
+ * // With full config
89
+ * const db = await connectDatabase({
90
+ * host: 'db.example.com',
91
+ * database: 'myapp',
92
+ * user: 'dbuser',
93
+ * password: process.env.DB_PASSWORD,
94
+ * ssl: true
95
+ * });
96
+ * ```
97
+ */
98
+ export declare function connectDatabase(config: string | PostgresAdapterOptions): Promise<StorageAdapter>;
99
+ /**
100
+ * Open a local database file.
101
+ *
102
+ * @example
103
+ * ```typescript
104
+ * // SQLite file
105
+ * const db = await openDatabase('./my-app.db');
106
+ *
107
+ * // In-memory database
108
+ * const db = await openDatabase(':memory:');
109
+ * ```
110
+ */
111
+ export declare function openDatabase(filePath: string): Promise<StorageAdapter>;
112
+ /**
113
+ * Create an in-memory database.
114
+ * Perfect for testing or temporary storage.
115
+ *
116
+ * @example
117
+ * ```typescript
118
+ * const db = await createMemoryDatabase();
119
+ * await db.exec('CREATE TABLE users (id INTEGER, name TEXT)');
120
+ * ```
121
+ */
122
+ export declare function createMemoryDatabase(): Promise<StorageAdapter>;
123
+ export { resolveStorageAdapter } from './resolver';
124
+ //# sourceMappingURL=database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAwD,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AACpG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAEjF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAElC;;;OAGG;IACH,MAAM,CAAC,EAAE,uBAAuB,CAAC;IAEjC;;;OAGG;IACH,IAAI,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAE/D;;;OAGG;IACH,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CAgD3F;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,GAAG,sBAAsB,GACtC,OAAO,CAAC,cAAc,CAAC,CAKzB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAE5E;AAED;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,cAAc,CAAC,CAEpE;AAGD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * High-level, user-friendly API for SQL storage.
3
+ *
4
+ * This module provides simple functions like:
5
+ * - createDatabase() - Automatically picks the best database for your environment
6
+ * - connectDatabase() - Explicit connection with clear options
7
+ * - openDatabase() - Simple file-based database
8
+ */
9
+ import { resolveStorageAdapter } from './resolver';
10
+ /**
11
+ * Create a database connection.
12
+ * Automatically picks the best database for your environment.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * // Auto-detect (PostgreSQL in prod, SQLite locally)
17
+ * const db = await createDatabase();
18
+ *
19
+ * // Specify database URL
20
+ * const db = await createDatabase({
21
+ * url: process.env.DATABASE_URL
22
+ * });
23
+ *
24
+ * // Specify file path
25
+ * const db = await createDatabase({
26
+ * file: './my-app.db'
27
+ * });
28
+ *
29
+ * // Full PostgreSQL config
30
+ * const db = await createDatabase({
31
+ * postgres: {
32
+ * host: 'db.example.com',
33
+ * database: 'myapp',
34
+ * user: 'dbuser',
35
+ * password: process.env.DB_PASSWORD,
36
+ * ssl: true
37
+ * }
38
+ * });
39
+ * ```
40
+ */
41
+ export async function createDatabase(options = {}) {
42
+ const resolverOptions = {};
43
+ // Handle URL (PostgreSQL)
44
+ if (options.url) {
45
+ resolverOptions.postgres = { connectionString: options.url };
46
+ }
47
+ // Handle PostgreSQL config
48
+ if (options.postgres) {
49
+ resolverOptions.postgres = options.postgres;
50
+ }
51
+ // Handle file path
52
+ if (options.file) {
53
+ resolverOptions.filePath = options.file;
54
+ }
55
+ // Handle mobile config
56
+ if (options.mobile) {
57
+ resolverOptions.capacitor = options.mobile;
58
+ }
59
+ // Handle explicit type
60
+ if (options.type) {
61
+ const typeMap = {
62
+ 'postgres': 'postgres',
63
+ 'sqlite': 'better-sqlite3',
64
+ 'browser': 'sqljs',
65
+ 'mobile': 'capacitor',
66
+ 'memory': 'better-sqlite3' // Memory mode uses better-sqlite3 with :memory:
67
+ };
68
+ resolverOptions.priority = [typeMap[options.type]];
69
+ // Set in-memory mode for SQLite
70
+ if (options.type === 'memory') {
71
+ resolverOptions.filePath = ':memory:';
72
+ }
73
+ }
74
+ // Handle custom priority
75
+ if (options.priority) {
76
+ resolverOptions.priority = options.priority;
77
+ }
78
+ const adapter = await resolveStorageAdapter(resolverOptions);
79
+ await adapter.open(resolverOptions.openOptions);
80
+ return adapter;
81
+ }
82
+ /**
83
+ * Connect to a remote database.
84
+ *
85
+ * @example
86
+ * ```typescript
87
+ * // Simple connection string
88
+ * const db = await connectDatabase('postgresql://user:pass@host/db');
89
+ *
90
+ * // With full config
91
+ * const db = await connectDatabase({
92
+ * host: 'db.example.com',
93
+ * database: 'myapp',
94
+ * user: 'dbuser',
95
+ * password: process.env.DB_PASSWORD,
96
+ * ssl: true
97
+ * });
98
+ * ```
99
+ */
100
+ export async function connectDatabase(config) {
101
+ if (typeof config === 'string') {
102
+ return createDatabase({ url: config });
103
+ }
104
+ return createDatabase({ postgres: config });
105
+ }
106
+ /**
107
+ * Open a local database file.
108
+ *
109
+ * @example
110
+ * ```typescript
111
+ * // SQLite file
112
+ * const db = await openDatabase('./my-app.db');
113
+ *
114
+ * // In-memory database
115
+ * const db = await openDatabase(':memory:');
116
+ * ```
117
+ */
118
+ export async function openDatabase(filePath) {
119
+ return createDatabase({ file: filePath });
120
+ }
121
+ /**
122
+ * Create an in-memory database.
123
+ * Perfect for testing or temporary storage.
124
+ *
125
+ * @example
126
+ * ```typescript
127
+ * const db = await createMemoryDatabase();
128
+ * await db.exec('CREATE TABLE users (id INTEGER, name TEXT)');
129
+ * ```
130
+ */
131
+ export async function createMemoryDatabase() {
132
+ return openDatabase(':memory:');
133
+ }
134
+ // Re-export for backwards compatibility
135
+ export { resolveStorageAdapter } from './resolver';
136
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,qBAAqB,EAAmD,MAAM,YAAY,CAAC;AA6CpG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAA2B,EAAE;IAChE,MAAM,eAAe,GAA6B,EAAE,CAAC;IAErD,0BAA0B;IAC1B,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,eAAe,CAAC,QAAQ,GAAG,EAAE,gBAAgB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/D,CAAC;IAED,2BAA2B;IAC3B,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,eAAe,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAC9C,CAAC;IAED,mBAAmB;IACnB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,eAAe,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1C,CAAC;IAED,uBAAuB;IACvB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,eAAe,CAAC,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAC7C,CAAC;IAED,uBAAuB;IACvB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG;YACd,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,gBAAgB;YAC1B,SAAS,EAAE,OAAO;YAClB,QAAQ,EAAE,WAAW;YACrB,QAAQ,EAAE,gBAAgB,CAAE,gDAAgD;SACpE,CAAC;QACX,eAAe,CAAC,QAAQ,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAEnD,gCAAgC;QAChC,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,eAAe,CAAC,QAAQ,GAAG,UAAU,CAAC;QACxC,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,eAAe,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAC9C,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,eAAe,CAAC,CAAC;IAC7D,MAAM,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;IAChD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAuC;IAEvC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,cAAc,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,cAAc,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,OAAO,cAAc,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,OAAO,YAAY,CAAC,UAAU,CAAC,CAAC;AAClC,CAAC;AAED,wCAAwC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,17 @@
1
+ export * from './types';
2
+ export * from './types/extensions';
3
+ export * from './types/context';
4
+ export * from './types/events';
5
+ export * from './types/limitations';
6
+ export * from './adapters/betterSqliteAdapter';
7
+ export * from './adapters/sqlJsAdapter';
8
+ export * from './adapters/capacitorSqliteAdapter';
9
+ export * from './adapters/postgresAdapter';
10
+ export * from './database';
11
+ export * from './resolver';
12
+ export * from './utils/dataExport';
13
+ export * from './utils/dataImport';
14
+ export * from './utils/migration';
15
+ export * from './utils/cloudBackup';
16
+ export * from './utils/syncManager';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,SAAS,CAAC;AAGxB,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AAGpC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,mCAAmC,CAAC;AAClD,cAAc,4BAA4B,CAAC;AAG3C,cAAc,YAAY,CAAC;AAG3B,cAAc,YAAY,CAAC;AAG3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,qBAAqB,CAAC;AAGpC,cAAc,qBAAqB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,25 @@
1
+ // Core types and interfaces
2
+ export * from './types';
3
+ // Extended types for advanced features
4
+ export * from './types/extensions';
5
+ export * from './types/context';
6
+ export * from './types/events';
7
+ export * from './types/limitations';
8
+ // Adapter implementations
9
+ export * from './adapters/betterSqliteAdapter';
10
+ export * from './adapters/sqlJsAdapter';
11
+ export * from './adapters/capacitorSqliteAdapter';
12
+ export * from './adapters/postgresAdapter';
13
+ // High-level API (recommended)
14
+ export * from './database';
15
+ // Low-level resolver (advanced usage)
16
+ export * from './resolver';
17
+ // Data export/import/migration utilities
18
+ export * from './utils/dataExport';
19
+ export * from './utils/dataImport';
20
+ export * from './utils/migration';
21
+ // Cloud backup and scheduled backup utilities
22
+ export * from './utils/cloudBackup';
23
+ // Sync manager for offline/online hybrid databases
24
+ export * from './utils/syncManager';
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,cAAc,SAAS,CAAC;AAExB,uCAAuC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AAEpC,0BAA0B;AAC1B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,mCAAmC,CAAC;AAClD,cAAc,4BAA4B,CAAC;AAE3C,+BAA+B;AAC/B,cAAc,YAAY,CAAC;AAE3B,sCAAsC;AACtC,cAAc,YAAY,CAAC;AAE3B,yCAAyC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAElC,8CAA8C;AAC9C,cAAc,qBAAqB,CAAC;AAEpC,mDAAmD;AACnD,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { StorageAdapter, StorageOpenOptions } from './types';
2
+ import type { AdapterKind } from './types/context';
3
+ import { type CapacitorAdapterOptions } from './adapters/capacitorSqliteAdapter';
4
+ export type { AdapterKind } from './types/context';
5
+ export interface StorageResolutionOptions {
6
+ /** Absolute path for sqlite file (used by better-sqlite3/sql.js when persistence is desired). */
7
+ filePath?: string;
8
+ /** Explicit adapter priority override. */
9
+ priority?: AdapterKind[];
10
+ /** Options passed to the Capacitor adapter. */
11
+ capacitor?: CapacitorAdapterOptions;
12
+ /** Options passed to the Postgres adapter. */
13
+ postgres?: {
14
+ connectionString?: string;
15
+ };
16
+ /** Options forwarded to adapter.open. */
17
+ openOptions?: StorageOpenOptions;
18
+ }
19
+ /**
20
+ * Resolves the most appropriate storage adapter for the current runtime.
21
+ * Tries candidates in the supplied priority order and falls back when one fails.
22
+ */
23
+ export declare const resolveStorageAdapter: (options?: StorageResolutionOptions) => Promise<StorageAdapter>;
24
+ //# sourceMappingURL=resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAyB,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAEzF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGnD,OAAO,EAAgC,KAAK,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAI/G,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,WAAW,wBAAwB;IACvC,iGAAiG;IACjG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,uBAAuB,CAAC;IACpC,8CAA8C;IAC9C,QAAQ,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,yCAAyC;IACzC,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC;AAgBD;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAAU,UAAS,wBAA6B,KAAG,OAAO,CAAC,cAAc,CA4E1G,CAAC"}
@@ -0,0 +1,91 @@
1
+ import path from 'path';
2
+ import { StorageResolutionError } from './types';
3
+ import { createBetterSqliteAdapter } from './adapters/betterSqliteAdapter';
4
+ import { createSqlJsAdapter } from './adapters/sqlJsAdapter';
5
+ import { createCapacitorSqliteAdapter } from './adapters/capacitorSqliteAdapter';
6
+ import { createPostgresAdapter } from './adapters/postgresAdapter';
7
+ const isCapacitorRuntime = () => {
8
+ if (typeof window === 'undefined') {
9
+ return false;
10
+ }
11
+ const maybeCapacitor = window.Capacitor;
12
+ return Boolean(maybeCapacitor?.isNativePlatform?.());
13
+ };
14
+ /**
15
+ * Resolves the most appropriate storage adapter for the current runtime.
16
+ * Tries candidates in the supplied priority order and falls back when one fails.
17
+ */
18
+ export const resolveStorageAdapter = async (options = {}) => {
19
+ const envOverride = process.env.STORAGE_ADAPTER;
20
+ const postgresConnection = options.postgres?.connectionString ?? process.env.DATABASE_URL ?? undefined;
21
+ const filePath = options.filePath ?? path.join(process.cwd(), 'db_data', 'app.sqlite3');
22
+ const defaultPriority = (() => {
23
+ if (options.priority && options.priority.length > 0) {
24
+ return options.priority;
25
+ }
26
+ if (envOverride) {
27
+ return [envOverride];
28
+ }
29
+ if (isCapacitorRuntime()) {
30
+ return ['capacitor', 'sqljs'];
31
+ }
32
+ if (postgresConnection) {
33
+ return ['postgres', 'better-sqlite3', 'sqljs'];
34
+ }
35
+ return ['better-sqlite3', 'sqljs'];
36
+ })();
37
+ const candidates = defaultPriority.map((name) => {
38
+ switch (name) {
39
+ case 'postgres': {
40
+ return {
41
+ name,
42
+ factory: async () => {
43
+ if (!postgresConnection) {
44
+ throw new Error('DATABASE_URL or postgres connection string not provided.');
45
+ }
46
+ return createPostgresAdapter(postgresConnection);
47
+ },
48
+ openOptions: { connectionString: postgresConnection }
49
+ };
50
+ }
51
+ case 'better-sqlite3':
52
+ return {
53
+ name,
54
+ factory: async () => createBetterSqliteAdapter(filePath),
55
+ openOptions: { filePath }
56
+ };
57
+ case 'capacitor':
58
+ return {
59
+ name,
60
+ factory: async () => createCapacitorSqliteAdapter(options.capacitor)
61
+ };
62
+ case 'sqljs':
63
+ default:
64
+ return {
65
+ name: 'sqljs',
66
+ factory: async () => createSqlJsAdapter(),
67
+ openOptions: { filePath }
68
+ };
69
+ }
70
+ });
71
+ const errors = [];
72
+ for (const candidate of candidates) {
73
+ try {
74
+ const adapter = await candidate.factory();
75
+ const openOptions = {
76
+ ...candidate.openOptions,
77
+ ...options.openOptions,
78
+ };
79
+ await adapter.open(openOptions);
80
+ console.info(`[StorageAdapter] Using adapter "${candidate.name}".`);
81
+ return adapter;
82
+ }
83
+ catch (error) {
84
+ console.warn(`[StorageAdapter] Failed to initialise adapter "${candidate.name}".`, error);
85
+ errors.push(error);
86
+ continue;
87
+ }
88
+ }
89
+ throw new StorageResolutionError('Unable to resolve a storage adapter for the current environment.', errors);
90
+ };
91
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Runtime context and introspection types for storage adapters.
3
+ *
4
+ * These types enable runtime inspection of adapter capabilities,
5
+ * connection state, and performance characteristics without requiring
6
+ * developers to manually check capability flags.
7
+ */
8
+ import type { StorageAdapter, StorageCapability } from '../types';
9
+ import type { PerformanceMetrics } from './extensions';
10
+ /**
11
+ * Type of database connection.
12
+ */
13
+ export type ConnectionType = 'file' | 'memory' | 'network';
14
+ /**
15
+ * Database engine identifier.
16
+ */
17
+ export type DatabaseEngine = 'sqlite' | 'postgres' | 'mysql' | 'sqljs' | 'capacitor' | 'supabase';
18
+ /**
19
+ * Adapter identifier used by the resolver.
20
+ */
21
+ export type AdapterKind = 'postgres' | 'better-sqlite3' | 'capacitor' | 'sqljs' | 'supabase';
22
+ /**
23
+ * Information about the current database connection.
24
+ */
25
+ export interface ConnectionInfo {
26
+ /** Type of connection (file-based, in-memory, or network) */
27
+ type: ConnectionType;
28
+ /** Database engine being used */
29
+ engine: DatabaseEngine;
30
+ /** Engine version (if available) */
31
+ version?: string;
32
+ /** File path for file-based databases */
33
+ filePath?: string;
34
+ /** Host for network databases */
35
+ host?: string;
36
+ /** Database name for network databases */
37
+ database?: string;
38
+ /** Whether the connection is read-only */
39
+ readOnly: boolean;
40
+ /** When the connection was established */
41
+ connectedAt?: Date;
42
+ }
43
+ /**
44
+ * Concurrency model supported by the adapter.
45
+ */
46
+ export type ConcurrencyModel = 'single' | 'pooled' | 'unlimited';
47
+ /**
48
+ * Persistence model of the adapter.
49
+ */
50
+ export type PersistenceModel = 'memory' | 'file' | 'network';
51
+ /**
52
+ * Performance characteristics of an adapter.
53
+ */
54
+ export interface PerformanceCharacteristics {
55
+ /** Concurrency model */
56
+ concurrency: ConcurrencyModel;
57
+ /** Persistence model */
58
+ persistence: PersistenceModel;
59
+ /** Supported transaction isolation levels */
60
+ transactionIsolation: string[];
61
+ /** Whether the adapter uses connection pooling */
62
+ usesConnectionPool: boolean;
63
+ /** Whether queries are executed asynchronously */
64
+ asyncExecution: boolean;
65
+ }
66
+ /**
67
+ * Adapter-specific limitations and constraints.
68
+ */
69
+ export interface AdapterLimitations {
70
+ /** Maximum number of concurrent connections (if applicable) */
71
+ maxConnections?: number;
72
+ /** Maximum length of a single SQL statement (in bytes/characters) */
73
+ maxStatementLength?: number;
74
+ /** Maximum number of operations in a single batch */
75
+ maxBatchSize?: number;
76
+ /** Maximum size of a single parameter value (in bytes) */
77
+ maxParameterSize?: number;
78
+ /** Data types supported by this adapter */
79
+ supportedDataTypes: string[];
80
+ /** Features that are explicitly not supported */
81
+ unsupportedFeatures: string[];
82
+ /** Performance characteristics */
83
+ performanceCharacteristics: PerformanceCharacteristics;
84
+ /** Additional adapter-specific constraints */
85
+ constraints?: Record<string, unknown>;
86
+ }
87
+ /**
88
+ * Current health and status of the adapter.
89
+ */
90
+ export interface AdapterStatus {
91
+ /** Whether the adapter is functioning correctly */
92
+ healthy: boolean;
93
+ /** Whether the adapter is currently connected */
94
+ connected: boolean;
95
+ /** Last error encountered (if any) */
96
+ lastError?: Error;
97
+ /** Timestamp of last successful query */
98
+ lastQuery?: Date;
99
+ /** Total number of queries executed */
100
+ totalQueries: number;
101
+ /** Total number of errors encountered */
102
+ errors: number;
103
+ /** Time since adapter was opened (in milliseconds) */
104
+ uptime: number;
105
+ /** Performance metrics (if available) */
106
+ metrics?: PerformanceMetrics;
107
+ }
108
+ /**
109
+ * Runtime context providing introspection into the current adapter.
110
+ *
111
+ * This interface provides a high-level API for querying adapter
112
+ * capabilities, connection state, and performance without requiring
113
+ * manual capability flag checking.
114
+ *
115
+ * @example
116
+ * ```typescript
117
+ * const context = adapter.context;
118
+ *
119
+ * // Simple boolean checks
120
+ * if (context.supportsBatch) {
121
+ * await adapter.batch(operations);
122
+ * }
123
+ *
124
+ * // Get detailed status
125
+ * const status = context.getStatus();
126
+ * console.log(`Healthy: ${status.healthy}, Queries: ${status.totalQueries}`);
127
+ *
128
+ * // Get limitations
129
+ * const limits = context.getLimitations();
130
+ * console.log(`Max batch size: ${limits.maxBatchSize}`);
131
+ * ```
132
+ */
133
+ export interface AdapterContext {
134
+ /** Reference to the underlying adapter */
135
+ readonly adapter: StorageAdapter;
136
+ /** Adapter kind identifier */
137
+ readonly kind: AdapterKind;
138
+ /** Set of capabilities supported by this adapter */
139
+ readonly capabilities: ReadonlySet<StorageCapability>;
140
+ /** Whether the adapter is currently open/connected */
141
+ readonly isOpen: boolean;
142
+ /** Whether the adapter supports synchronous operations */
143
+ readonly supportsSync: boolean;
144
+ /** Whether the adapter supports ACID transactions */
145
+ readonly supportsTransactions: boolean;
146
+ /** Whether the adapter supports batch operations */
147
+ readonly supportsBatch: boolean;
148
+ /** Whether the adapter supports prepared statements */
149
+ readonly supportsPrepared: boolean;
150
+ /** Whether the adapter supports streaming results */
151
+ readonly supportsStreaming: boolean;
152
+ /** Whether the adapter supports Write-Ahead Logging */
153
+ readonly supportsWAL: boolean;
154
+ /** Whether the adapter supports native JSON operations */
155
+ readonly supportsJSON: boolean;
156
+ /** Whether the adapter supports array data types */
157
+ readonly supportsArrays: boolean;
158
+ /** Whether the adapter supports concurrent connections */
159
+ readonly supportsConcurrent: boolean;
160
+ /** Whether the adapter persists data across restarts */
161
+ readonly supportsPersistence: boolean;
162
+ /** Information about the current connection */
163
+ readonly connectionInfo: ConnectionInfo;
164
+ /**
165
+ * Check if a specific capability is supported.
166
+ *
167
+ * @param capability - The capability to check
168
+ * @returns True if the capability is supported
169
+ *
170
+ * @example
171
+ * ```typescript
172
+ * if (context.hasCapability('streaming')) {
173
+ * // Use streaming API
174
+ * }
175
+ * ```
176
+ */
177
+ hasCapability(capability: StorageCapability): boolean;
178
+ /**
179
+ * Require a specific capability, throwing an error if not supported.
180
+ *
181
+ * @param capability - The required capability
182
+ * @throws {Error} If the capability is not supported
183
+ *
184
+ * @example
185
+ * ```typescript
186
+ * context.requiresCapability('transactions');
187
+ * // Safe to use transactions now
188
+ * await adapter.transaction(async (trx) => { ... });
189
+ * ```
190
+ */
191
+ requiresCapability(capability: StorageCapability): void;
192
+ /**
193
+ * Get detailed limitations and constraints for this adapter.
194
+ *
195
+ * @returns Adapter-specific limitations
196
+ *
197
+ * @example
198
+ * ```typescript
199
+ * const limits = context.getLimitations();
200
+ * if (operations.length > limits.maxBatchSize) {
201
+ * // Split into chunks
202
+ * }
203
+ * ```
204
+ */
205
+ getLimitations(): AdapterLimitations;
206
+ /**
207
+ * Get current health and status information.
208
+ *
209
+ * @returns Current adapter status
210
+ *
211
+ * @example
212
+ * ```typescript
213
+ * const status = context.getStatus();
214
+ * if (!status.healthy) {
215
+ * logger.error('Database unhealthy', status.lastError);
216
+ * }
217
+ * ```
218
+ */
219
+ getStatus(): AdapterStatus;
220
+ }
221
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/types/context.ts"],"names":[],"mappings":"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"}