@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,136 @@
1
+ import initSqlJs from 'sql.js';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import { normaliseParameters } from '../utils/parameterUtils';
5
+ const hasFsAccess = () => {
6
+ try {
7
+ return typeof fs.accessSync === 'function';
8
+ }
9
+ catch {
10
+ return false;
11
+ }
12
+ };
13
+ /**
14
+ * Storage adapter backed by sql.js (WebAssembly) for environments without native SQLite bindings.
15
+ */
16
+ export class SqlJsAdapter {
17
+ constructor(adapterOptions = {}) {
18
+ this.adapterOptions = adapterOptions;
19
+ this.kind = 'sqljs';
20
+ this.SQL = null;
21
+ this.db = null;
22
+ const caps = ['transactions'];
23
+ if (hasFsAccess()) {
24
+ caps.push('persistence');
25
+ }
26
+ this.capabilities = new Set(caps);
27
+ }
28
+ async open(options) {
29
+ if (this.db) {
30
+ return;
31
+ }
32
+ this.SQL = await initSqlJs(this.adapterOptions);
33
+ this.filePath = options?.filePath;
34
+ if (this.filePath && hasFsAccess() && fs.existsSync(this.filePath)) {
35
+ const buffer = fs.readFileSync(this.filePath);
36
+ this.db = new this.SQL.Database(buffer);
37
+ }
38
+ else {
39
+ this.db = new this.SQL.Database();
40
+ }
41
+ }
42
+ async run(statement, parameters) {
43
+ const stmt = this.prepareInternal(statement);
44
+ try {
45
+ const { named, positional } = normaliseParameters(parameters);
46
+ if (named) {
47
+ stmt.bind(named);
48
+ }
49
+ else if (positional) {
50
+ stmt.bind(positional);
51
+ }
52
+ stmt.step();
53
+ return { changes: this.db.getRowsModified(), lastInsertRowid: this.db.exec('SELECT last_insert_rowid() AS id')[0]?.values?.[0]?.[0] ?? null };
54
+ }
55
+ finally {
56
+ stmt.free();
57
+ await this.persistIfNeeded();
58
+ }
59
+ }
60
+ async get(statement, parameters) {
61
+ const rows = await this.all(statement, parameters);
62
+ return rows.length > 0 ? rows[0] : null;
63
+ }
64
+ async all(statement, parameters) {
65
+ const stmt = this.prepareInternal(statement);
66
+ try {
67
+ const { named, positional } = normaliseParameters(parameters);
68
+ if (named) {
69
+ stmt.bind(named);
70
+ }
71
+ else if (positional) {
72
+ stmt.bind(positional);
73
+ }
74
+ const results = [];
75
+ while (stmt.step()) {
76
+ const row = {};
77
+ stmt.getColumnNames().forEach((column, index) => {
78
+ row[column] = stmt.get()[index];
79
+ });
80
+ results.push(row);
81
+ }
82
+ return results;
83
+ }
84
+ finally {
85
+ stmt.free();
86
+ }
87
+ }
88
+ async exec(script) {
89
+ this.ensureOpen();
90
+ this.db.run(script);
91
+ await this.persistIfNeeded();
92
+ }
93
+ async transaction(fn) {
94
+ this.ensureOpen();
95
+ this.db.run('BEGIN TRANSACTION;');
96
+ try {
97
+ const result = await fn(this);
98
+ this.db.run('COMMIT;');
99
+ await this.persistIfNeeded();
100
+ return result;
101
+ }
102
+ catch (error) {
103
+ this.db.run('ROLLBACK;');
104
+ throw error;
105
+ }
106
+ }
107
+ async close() {
108
+ if (this.db) {
109
+ await this.persistIfNeeded();
110
+ this.db.close();
111
+ this.db = null;
112
+ }
113
+ }
114
+ prepareInternal(statement) {
115
+ this.ensureOpen();
116
+ return this.db.prepare(statement);
117
+ }
118
+ ensureOpen() {
119
+ if (!this.db) {
120
+ throw new Error('Storage adapter not opened. Call open() first.');
121
+ }
122
+ }
123
+ async persistIfNeeded() {
124
+ if (!this.filePath || !hasFsAccess()) {
125
+ return;
126
+ }
127
+ const dir = path.dirname(this.filePath);
128
+ if (!fs.existsSync(dir)) {
129
+ fs.mkdirSync(dir, { recursive: true });
130
+ }
131
+ const data = this.db.export();
132
+ fs.writeFileSync(this.filePath, Buffer.from(data));
133
+ }
134
+ }
135
+ export const createSqlJsAdapter = (options) => new SqlJsAdapter(options);
136
+ //# sourceMappingURL=sqlJsAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlJsAdapter.js","sourceRoot":"","sources":["../../src/adapters/sqlJsAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,QAAQ,CAAC;AAE/B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAI9D,MAAM,WAAW,GAAG,GAAY,EAAE;IAChC,IAAI,CAAC;QACH,OAAO,OAAO,EAAE,CAAC,UAAU,KAAK,UAAU,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,YAAY;IAQvB,YAA6B,iBAAsC,EAAE;QAAxC,mBAAc,GAAd,cAAc,CAA0B;QAPrD,SAAI,GAAG,OAAO,CAAC;QAGvB,QAAG,GAAuB,IAAI,CAAC;QAC/B,OAAE,GAAyB,IAAI,CAAC;QAItC,MAAM,IAAI,GAAwB,CAAC,cAAc,CAAC,CAAC;QACnD,IAAI,WAAW,EAAE,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,OAA4B;QAC5C,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,IAAI,CAAC,GAAG,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,GAAG,OAAO,EAAE,QAAQ,CAAC;QAElC,IAAI,IAAI,CAAC,QAAQ,IAAI,WAAW,EAAE,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnE,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC9C,IAAI,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACpC,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,SAAiB,EAAE,UAA8B;QAChE,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;YAC9D,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;iBAAM,IAAI,UAAU,EAAE,CAAC;gBACtB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACxB,CAAC;YACD,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAG,CAAC,eAAe,EAAE,EAAE,eAAe,EAAE,IAAI,CAAC,EAAG,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;QAClJ,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,GAAG,CAAI,SAAiB,EAAE,UAA8B;QACnE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAI,SAAS,EAAE,UAAU,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1C,CAAC;IAEM,KAAK,CAAC,GAAG,CAAI,SAAiB,EAAE,UAA8B;QACnE,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;YAC9D,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;iBAAM,IAAI,UAAU,EAAE,CAAC;gBACtB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACxB,CAAC;YAED,MAAM,OAAO,GAAQ,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBACnB,MAAM,GAAG,GAA4B,EAAE,CAAC;gBACxC,IAAI,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC,MAAc,EAAE,KAAa,EAAE,EAAE;oBAC9D,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;gBAClC,CAAC,CAAC,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,GAAQ,CAAC,CAAC;YACzB,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,MAAc;QAC9B,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,EAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrB,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;IAC/B,CAAC;IAEM,KAAK,CAAC,WAAW,CAAI,EAAuC;QACjE,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,EAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,CAAC,EAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACxB,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC7B,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,EAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAC1B,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC7B,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,SAAiB;QACvC,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC,EAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACrC,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAG,CAAC,MAAM,EAAE,CAAC;QAC/B,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,CAAC;CACF;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,OAA6B,EAAkB,EAAE,CAAC,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Supabase Postgres Storage Adapter
3
+ * Provides full Postgres capabilities with Supabase's managed infrastructure
4
+ */
5
+ import type { StorageAdapter, StorageCapability, StorageOpenOptions, StorageParameters, StorageRunResult, BatchResult } from '../types';
6
+ import type { StorageAdapterExtensions, ExtendedBatchOperation, Migration, PerformanceMetrics, StreamOptions } from '../types/extensions';
7
+ export interface SupabaseAdapterOptions extends StorageOpenOptions {
8
+ connectionString?: string;
9
+ poolConfig?: {
10
+ max?: number;
11
+ min?: number;
12
+ idleTimeoutMillis?: number;
13
+ connectionTimeoutMillis?: number;
14
+ };
15
+ ssl?: boolean | {
16
+ rejectUnauthorized: boolean;
17
+ };
18
+ }
19
+ export declare class SupabaseAdapter implements StorageAdapter, StorageAdapterExtensions {
20
+ readonly kind = "supabase-postgres";
21
+ readonly capabilities: ReadonlySet<StorageCapability>;
22
+ private pool?;
23
+ private options?;
24
+ private metrics;
25
+ private profilingEnabled;
26
+ private queryCache;
27
+ private cacheEnabled;
28
+ private maxCacheSize;
29
+ open(options?: SupabaseAdapterOptions): Promise<void>;
30
+ close(): Promise<void>;
31
+ private trackQuery;
32
+ private getCacheKey;
33
+ run(statement: string, parameters?: StorageParameters): Promise<StorageRunResult>;
34
+ get<T = unknown>(statement: string, parameters?: StorageParameters): Promise<T | null>;
35
+ all<T = unknown>(statement: string, parameters?: StorageParameters): Promise<T[]>;
36
+ exec(script: string): Promise<void>;
37
+ transaction<T>(fn: (trx: StorageAdapter) => Promise<T>): Promise<T>;
38
+ stream<T = unknown>(query: string, parameters?: any, options?: StreamOptions): AsyncIterableIterator<T>;
39
+ batchWrite(operations: ExtendedBatchOperation[]): Promise<BatchResult>;
40
+ migrate(migrations: Migration[]): Promise<void>;
41
+ getMigrationStatus(): Promise<Migration[]>;
42
+ backup(_destination: string): Promise<void>;
43
+ restore(_source: string): Promise<void>;
44
+ enableProfiling(): void;
45
+ disableProfiling(): void;
46
+ getMetrics(): PerformanceMetrics;
47
+ clearMetrics(): void;
48
+ enableCache(maxSize?: number): void;
49
+ disableCache(): void;
50
+ clearCache(): void;
51
+ getPoolStatus(): {
52
+ active: number;
53
+ idle: number;
54
+ waiting: number;
55
+ max: number;
56
+ };
57
+ }
58
+ //# sourceMappingURL=supabase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../src/adapters/supabase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,385 @@
1
+ /**
2
+ * Supabase Postgres Storage Adapter
3
+ * Provides full Postgres capabilities with Supabase's managed infrastructure
4
+ */
5
+ export class SupabaseAdapter {
6
+ constructor() {
7
+ this.kind = 'supabase-postgres';
8
+ this.capabilities = new Set([
9
+ 'transactions',
10
+ 'persistence',
11
+ 'locks',
12
+ 'streaming',
13
+ 'batch'
14
+ ]);
15
+ this.metrics = {
16
+ totalQueries: 0,
17
+ totalDuration: 0,
18
+ averageDuration: 0,
19
+ slowQueries: [],
20
+ cacheHits: 0,
21
+ cacheMisses: 0
22
+ };
23
+ this.profilingEnabled = false;
24
+ this.queryCache = new Map();
25
+ this.cacheEnabled = false;
26
+ this.maxCacheSize = 100;
27
+ }
28
+ async open(options) {
29
+ this.options = options;
30
+ // Dynamic import to avoid bundling pg when not needed
31
+ const pg = await import('pg');
32
+ const { Pool } = pg;
33
+ const connectionString = options?.connectionString || process.env.DATABASE_URL;
34
+ if (!connectionString) {
35
+ throw new Error('Supabase connection string required (DATABASE_URL or connectionString option)');
36
+ }
37
+ this.pool = new Pool({
38
+ connectionString,
39
+ max: options?.poolConfig?.max || 20,
40
+ min: options?.poolConfig?.min || 2,
41
+ idleTimeoutMillis: options?.poolConfig?.idleTimeoutMillis || 30000,
42
+ connectionTimeoutMillis: options?.poolConfig?.connectionTimeoutMillis || 5000,
43
+ ssl: options?.ssl !== false ? { rejectUnauthorized: false } : undefined
44
+ });
45
+ // Test connection
46
+ try {
47
+ const client = await this.pool.connect();
48
+ client.release();
49
+ }
50
+ catch (error) {
51
+ throw new Error(`Failed to connect to Supabase: ${error}`);
52
+ }
53
+ }
54
+ async close() {
55
+ if (this.pool) {
56
+ await this.pool.end();
57
+ this.pool = undefined;
58
+ }
59
+ this.clearCache();
60
+ }
61
+ trackQuery(query, startTime) {
62
+ if (!this.profilingEnabled)
63
+ return;
64
+ const duration = Date.now() - startTime;
65
+ this.metrics.totalQueries++;
66
+ this.metrics.totalDuration += duration;
67
+ this.metrics.averageDuration = this.metrics.totalDuration / this.metrics.totalQueries;
68
+ if (duration > 100) {
69
+ if (!this.metrics.slowQueries) {
70
+ this.metrics.slowQueries = [];
71
+ }
72
+ this.metrics.slowQueries.push({
73
+ query: query.substring(0, 200),
74
+ duration,
75
+ timestamp: new Date(Date.now())
76
+ });
77
+ // Keep only last 100 slow queries
78
+ if (this.metrics.slowQueries.length > 100) {
79
+ this.metrics.slowQueries.shift();
80
+ }
81
+ }
82
+ }
83
+ getCacheKey(query, params) {
84
+ return `${query}::${JSON.stringify(params || {})}`;
85
+ }
86
+ async run(statement, parameters) {
87
+ if (!this.pool)
88
+ throw new Error('Storage adapter not opened');
89
+ const startTime = Date.now();
90
+ try {
91
+ const result = await this.pool.query(statement, Array.isArray(parameters) ? parameters : undefined);
92
+ this.trackQuery(statement, startTime);
93
+ return {
94
+ changes: result.rowCount || 0,
95
+ lastInsertRowid: result.rows[0]?.id || 0
96
+ };
97
+ }
98
+ catch (error) {
99
+ throw new Error(`Query failed: ${error}`);
100
+ }
101
+ }
102
+ async get(statement, parameters) {
103
+ if (!this.pool)
104
+ throw new Error('Storage adapter not opened');
105
+ // Check cache
106
+ if (this.cacheEnabled) {
107
+ const cacheKey = this.getCacheKey(statement, parameters);
108
+ if (this.queryCache.has(cacheKey)) {
109
+ if (this.metrics.cacheHits !== undefined) {
110
+ this.metrics.cacheHits++;
111
+ }
112
+ return this.queryCache.get(cacheKey);
113
+ }
114
+ if (this.metrics.cacheMisses !== undefined) {
115
+ this.metrics.cacheMisses++;
116
+ }
117
+ }
118
+ const startTime = Date.now();
119
+ try {
120
+ const result = await this.pool.query(statement, Array.isArray(parameters) ? parameters : undefined);
121
+ this.trackQuery(statement, startTime);
122
+ const value = result.rows[0] || null;
123
+ // Update cache
124
+ if (this.cacheEnabled && value) {
125
+ const cacheKey = this.getCacheKey(statement, parameters);
126
+ this.queryCache.set(cacheKey, value);
127
+ // Enforce cache size limit
128
+ if (this.queryCache.size > this.maxCacheSize) {
129
+ const firstKey = this.queryCache.keys().next().value;
130
+ if (firstKey !== undefined) {
131
+ this.queryCache.delete(firstKey);
132
+ }
133
+ }
134
+ }
135
+ return value;
136
+ }
137
+ catch (error) {
138
+ throw new Error(`Query failed: ${error}`);
139
+ }
140
+ }
141
+ async all(statement, parameters) {
142
+ if (!this.pool)
143
+ throw new Error('Storage adapter not opened');
144
+ // Check cache
145
+ if (this.cacheEnabled) {
146
+ const cacheKey = this.getCacheKey(statement, parameters);
147
+ if (this.queryCache.has(cacheKey)) {
148
+ if (this.metrics.cacheHits !== undefined) {
149
+ this.metrics.cacheHits++;
150
+ }
151
+ return this.queryCache.get(cacheKey);
152
+ }
153
+ if (this.metrics.cacheMisses !== undefined) {
154
+ this.metrics.cacheMisses++;
155
+ }
156
+ }
157
+ const startTime = Date.now();
158
+ try {
159
+ const result = await this.pool.query(statement, Array.isArray(parameters) ? parameters : undefined);
160
+ this.trackQuery(statement, startTime);
161
+ const rows = result.rows;
162
+ // Update cache
163
+ if (this.cacheEnabled) {
164
+ const cacheKey = this.getCacheKey(statement, parameters);
165
+ this.queryCache.set(cacheKey, rows);
166
+ // Enforce cache size limit
167
+ if (this.queryCache.size > this.maxCacheSize) {
168
+ const firstKey = this.queryCache.keys().next().value;
169
+ if (firstKey !== undefined) {
170
+ this.queryCache.delete(firstKey);
171
+ }
172
+ }
173
+ }
174
+ return rows;
175
+ }
176
+ catch (error) {
177
+ throw new Error(`Query failed: ${error}`);
178
+ }
179
+ }
180
+ async exec(script) {
181
+ if (!this.pool)
182
+ throw new Error('Storage adapter not opened');
183
+ const startTime = Date.now();
184
+ try {
185
+ await this.pool.query(script);
186
+ this.trackQuery(script, startTime);
187
+ }
188
+ catch (error) {
189
+ throw new Error(`Script execution failed: ${error}`);
190
+ }
191
+ }
192
+ async transaction(fn) {
193
+ if (!this.pool)
194
+ throw new Error('Storage adapter not opened');
195
+ const client = await this.pool.connect();
196
+ try {
197
+ await client.query('BEGIN');
198
+ // Create a transaction-scoped adapter
199
+ const trxAdapter = {
200
+ kind: this.kind,
201
+ capabilities: this.capabilities,
202
+ open: async () => { },
203
+ close: async () => { },
204
+ run: async (stmt, params) => {
205
+ const result = await client.query(stmt, Array.isArray(params) ? params : undefined);
206
+ return { changes: result.rowCount || 0, lastInsertRowid: 0 };
207
+ },
208
+ get: async (stmt, params) => {
209
+ const result = await client.query(stmt, Array.isArray(params) ? params : undefined);
210
+ return result.rows[0] || null;
211
+ },
212
+ all: async (stmt, params) => {
213
+ const result = await client.query(stmt, Array.isArray(params) ? params : undefined);
214
+ return result.rows;
215
+ },
216
+ exec: async (script) => {
217
+ await client.query(script);
218
+ },
219
+ transaction: async (fn) => fn(trxAdapter)
220
+ };
221
+ const result = await fn(trxAdapter);
222
+ await client.query('COMMIT');
223
+ return result;
224
+ }
225
+ catch (error) {
226
+ await client.query('ROLLBACK');
227
+ throw error;
228
+ }
229
+ finally {
230
+ client.release();
231
+ }
232
+ }
233
+ // Extension methods
234
+ async *stream(query, parameters, options) {
235
+ if (!this.pool)
236
+ throw new Error('Storage adapter not opened');
237
+ const batchSize = options?.batchSize || 100;
238
+ let offset = 0;
239
+ let hasMore = true;
240
+ while (hasMore) {
241
+ const paginatedQuery = `${query} LIMIT ${batchSize} OFFSET ${offset}`;
242
+ const rows = await this.all(paginatedQuery, parameters);
243
+ if (rows.length < batchSize) {
244
+ hasMore = false;
245
+ }
246
+ for (const row of rows) {
247
+ yield row;
248
+ }
249
+ offset += batchSize;
250
+ }
251
+ }
252
+ async batchWrite(operations) {
253
+ return this.transaction(async (trx) => {
254
+ let successful = 0;
255
+ let failed = 0;
256
+ const errors = [];
257
+ for (let index = 0; index < operations.length; index++) {
258
+ const op = operations[index];
259
+ try {
260
+ switch (op.type) {
261
+ case 'insert': {
262
+ const keys = Object.keys(op.values || {});
263
+ const values = Object.values(op.values || {});
264
+ const placeholders = keys.map((_, i) => `$${i + 1}`).join(', ');
265
+ const query = `INSERT INTO ${op.table} (${keys.join(', ')}) VALUES (${placeholders})`;
266
+ await trx.run(query, values);
267
+ successful++;
268
+ break;
269
+ }
270
+ case 'update': {
271
+ const sets = Object.keys(op.values || {}).map((k, i) => `${k} = $${i + 1}`).join(', ');
272
+ const whereClause = Object.keys(op.where || {})
273
+ .map((k, i) => `${k} = $${i + Object.keys(op.values || {}).length + 1}`)
274
+ .join(' AND ');
275
+ const query = `UPDATE ${op.table} SET ${sets} WHERE ${whereClause}`;
276
+ const params = [...Object.values(op.values || {}), ...Object.values(op.where || {})];
277
+ await trx.run(query, params);
278
+ successful++;
279
+ break;
280
+ }
281
+ case 'delete': {
282
+ const whereClause = Object.keys(op.where || {})
283
+ .map((k, i) => `${k} = $${i + 1}`)
284
+ .join(' AND ');
285
+ const query = `DELETE FROM ${op.table} WHERE ${whereClause}`;
286
+ await trx.run(query, Object.values(op.where || {}));
287
+ successful++;
288
+ break;
289
+ }
290
+ }
291
+ }
292
+ catch (error) {
293
+ failed++;
294
+ errors.push({
295
+ index,
296
+ error: error instanceof Error ? error : new Error(String(error))
297
+ });
298
+ }
299
+ }
300
+ return { successful, failed, errors: errors.length > 0 ? errors : undefined };
301
+ });
302
+ }
303
+ async migrate(migrations) {
304
+ // Create migrations table if it doesn't exist
305
+ await this.exec(`
306
+ CREATE TABLE IF NOT EXISTS _migrations (
307
+ id TEXT PRIMARY KEY,
308
+ version INTEGER NOT NULL,
309
+ applied_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
310
+ )
311
+ `);
312
+ // Get applied migrations
313
+ const applied = await this.all('SELECT id, version FROM _migrations');
314
+ const appliedSet = new Set(applied.map(m => m.id));
315
+ // Apply pending migrations
316
+ for (const migration of migrations) {
317
+ if (!appliedSet.has(migration.id)) {
318
+ await this.transaction(async (trx) => {
319
+ await trx.exec(migration.up);
320
+ await trx.run('INSERT INTO _migrations (id, version) VALUES ($1, $2)', [migration.id, migration.version]);
321
+ });
322
+ }
323
+ }
324
+ }
325
+ async getMigrationStatus() {
326
+ const applied = await this.all('SELECT * FROM _migrations ORDER BY version');
327
+ return applied.map(m => ({
328
+ id: m.id,
329
+ version: m.version,
330
+ up: '',
331
+ down: '',
332
+ timestamp: new Date(m.applied_at).getTime()
333
+ }));
334
+ }
335
+ async backup(_destination) {
336
+ // For Supabase, we can use pg_dump via command line or API
337
+ throw new Error('Backup not implemented for Supabase adapter. Use Supabase dashboard or pg_dump.');
338
+ }
339
+ async restore(_source) {
340
+ // For Supabase, we can use pg_restore via command line or API
341
+ throw new Error('Restore not implemented for Supabase adapter. Use Supabase dashboard or pg_restore.');
342
+ }
343
+ enableProfiling() {
344
+ this.profilingEnabled = true;
345
+ }
346
+ disableProfiling() {
347
+ this.profilingEnabled = false;
348
+ }
349
+ getMetrics() {
350
+ return { ...this.metrics };
351
+ }
352
+ clearMetrics() {
353
+ this.metrics = {
354
+ totalQueries: 0,
355
+ totalDuration: 0,
356
+ averageDuration: 0,
357
+ slowQueries: [],
358
+ cacheHits: 0,
359
+ cacheMisses: 0
360
+ };
361
+ }
362
+ enableCache(maxSize = 100) {
363
+ this.cacheEnabled = true;
364
+ this.maxCacheSize = maxSize;
365
+ }
366
+ disableCache() {
367
+ this.cacheEnabled = false;
368
+ this.clearCache();
369
+ }
370
+ clearCache() {
371
+ this.queryCache.clear();
372
+ }
373
+ getPoolStatus() {
374
+ if (!this.pool) {
375
+ return { active: 0, idle: 0, waiting: 0, max: 0 };
376
+ }
377
+ return {
378
+ active: this.pool.totalCount || 0,
379
+ idle: this.pool.idleCount || 0,
380
+ waiting: this.pool.waitingCount || 0,
381
+ max: this.pool._config?.max || 0
382
+ };
383
+ }
384
+ }
385
+ //# sourceMappingURL=supabase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.js","sourceRoot":"","sources":["../../src/adapters/supabase.ts"],"names":[],"mappings":"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"}