hazo_connect 2.3.2 → 2.3.4
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/README.md +5 -0
- package/app/hazo_connect/sqlite_admin/page.tsx +1 -2
- package/dist/adapters/postgrest-adapter.d.ts +5 -0
- package/dist/adapters/postgrest-adapter.d.ts.map +1 -1
- package/dist/adapters/postgrest-adapter.js +13 -0
- package/dist/adapters/postgrest-adapter.js.map +1 -1
- package/dist/adapters/supabase-adapter.d.ts +72 -12
- package/dist/adapters/supabase-adapter.d.ts.map +1 -1
- package/dist/adapters/supabase-adapter.js +346 -15
- package/dist/adapters/supabase-adapter.js.map +1 -1
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +25 -0
- package/dist/factory.js.map +1 -1
- package/dist/sqlite/query-translator.d.ts.map +1 -1
- package/dist/sqlite/query-translator.js +3 -59
- package/dist/sqlite/query-translator.js.map +1 -1
- package/dist/ui/components/sqlite-admin-client.d.ts +7 -0
- package/dist/ui/components/sqlite-admin-client.d.ts.map +1 -0
- package/dist/ui/components/sqlite-admin-client.js +411 -0
- package/dist/ui/components/sqlite-admin-client.js.map +1 -0
- package/dist/ui/index.d.ts +7 -5
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +9 -2
- package/dist/ui/index.js.map +1 -1
- package/dist/utils/where-builder.d.ts +10 -0
- package/dist/utils/where-builder.d.ts.map +1 -1
- package/dist/utils/where-builder.js +3 -2
- package/dist/utils/where-builder.js.map +1 -1
- package/package.json +1 -1
- package/app/hazo_connect/sqlite_admin/sqlite-admin-client.tsx +0 -949
package/README.md
CHANGED
|
@@ -371,6 +371,11 @@ const hazo = createHazoConnect({
|
|
|
371
371
|
| `HAZO_CONNECT_ENABLE_ADMIN_UI` | Enable SQLite admin UI | `false` |
|
|
372
372
|
| `POSTGREST_URL` | PostgREST base URL | - |
|
|
373
373
|
| `POSTGREST_API_KEY` | PostgREST API key | - |
|
|
374
|
+
| `SUPABASE_URL` | Supabase project URL | - |
|
|
375
|
+
| `SUPABASE_ANON_KEY` | Supabase anonymous key (respects RLS) | - |
|
|
376
|
+
| `SUPABASE_SERVICE_ROLE_KEY` | Supabase service role key (bypasses RLS) | - |
|
|
377
|
+
| `NEXT_PUBLIC_SUPABASE_URL` | Alternative Supabase URL (for Next.js) | - |
|
|
378
|
+
| `NEXT_PUBLIC_SUPABASE_ANON_KEY` | Alternative Supabase anon key (for Next.js) | - |
|
|
374
379
|
|
|
375
380
|
---
|
|
376
381
|
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { getSqliteAdminService } from "hazo_connect/server"
|
|
2
|
-
import
|
|
3
|
-
import SqliteAdminClient from "./sqlite-admin-client"
|
|
2
|
+
import { SqliteAdminClient } from "hazo_connect/ui"
|
|
4
3
|
|
|
5
4
|
export const dynamic = "force-dynamic"
|
|
6
5
|
|
|
@@ -26,6 +26,11 @@ export declare class PostgrestAdapter extends BaseAdapter implements HazoConnect
|
|
|
26
26
|
* @param logger - Optional logger instance
|
|
27
27
|
*/
|
|
28
28
|
constructor(config: any, logger?: Logger);
|
|
29
|
+
/**
|
|
30
|
+
* Validate QueryBuilder does not contain unsupported features
|
|
31
|
+
* @param builder - QueryBuilder instance
|
|
32
|
+
*/
|
|
33
|
+
private validateQueryBuilder;
|
|
29
34
|
/**
|
|
30
35
|
* Convert QueryBuilder to PostgREST URL
|
|
31
36
|
* @param builder - QueryBuilder instance
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgrest-adapter.d.ts","sourceRoot":"","sources":["../../src/lib/adapters/postgrest-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAG/C;;GAEG;AACH,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,WAAY,YAAW,kBAAkB;IAC7E,OAAO,CAAC,eAAe,CAAiB;IAExC;;;;OAIG;gBACS,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM;IAoBxC;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;
|
|
1
|
+
{"version":3,"file":"postgrest-adapter.d.ts","sourceRoot":"","sources":["../../src/lib/adapters/postgrest-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAG/C;;GAEG;AACH,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,WAAY,YAAW,kBAAkB;IAC7E,OAAO,CAAC,eAAe,CAAiB;IAExC;;;;OAIG;gBACS,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM;IAoBxC;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAW5B;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAuGzB;;;;;;OAMG;IACG,KAAK,CACT,OAAO,EAAE,YAAY,EACrB,MAAM,GAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAgB,EAC3D,IAAI,CAAC,EAAE,GAAG,GACT,OAAO,CAAC,GAAG,CAAC;IAoBf;;;;;OAKG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,GAAG,CAAC;IAwFzE;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IAG3C,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,yBAAyB;IAyBjC,OAAO,CAAC,WAAW;CAKpB"}
|
|
@@ -32,6 +32,17 @@ class PostgrestAdapter extends base_adapter_1.BaseAdapter {
|
|
|
32
32
|
this.postgrestConfig.base_url = this.postgrestConfig.base_url.slice(0, -1);
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Validate QueryBuilder does not contain unsupported features
|
|
37
|
+
* @param builder - QueryBuilder instance
|
|
38
|
+
*/
|
|
39
|
+
validateQueryBuilder(builder) {
|
|
40
|
+
// PostgREST does not support SQL-style JOINs - use nested selects instead
|
|
41
|
+
const joins = builder.getJoins();
|
|
42
|
+
if (joins.length > 0) {
|
|
43
|
+
this.throwError(types_1.ErrorCode.VALIDATION_ERROR, 'PostgREST adapter does not support SQL-style JOINs. Use nestedSelect() instead for related data.');
|
|
44
|
+
}
|
|
45
|
+
}
|
|
35
46
|
/**
|
|
36
47
|
* Convert QueryBuilder to PostgREST URL
|
|
37
48
|
* @param builder - QueryBuilder instance
|
|
@@ -42,6 +53,8 @@ class PostgrestAdapter extends base_adapter_1.BaseAdapter {
|
|
|
42
53
|
if (!table) {
|
|
43
54
|
this.throwError(types_1.ErrorCode.VALIDATION_ERROR, 'Table name is required');
|
|
44
55
|
}
|
|
56
|
+
// Validate QueryBuilder doesn't use unsupported features
|
|
57
|
+
this.validateQueryBuilder(builder);
|
|
45
58
|
const params = [];
|
|
46
59
|
// Select fields
|
|
47
60
|
const selectFields = builder.getSelectFields();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgrest-adapter.js","sourceRoot":"","sources":["../../src/lib/adapters/postgrest-adapter.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"postgrest-adapter.js","sourceRoot":"","sources":["../../src/lib/adapters/postgrest-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Purpose: Supabase adapter
|
|
2
|
+
* Purpose: Supabase adapter implementation
|
|
3
3
|
*
|
|
4
|
-
* This adapter
|
|
5
|
-
*
|
|
4
|
+
* This adapter connects to Supabase PostgreSQL databases via the PostgREST API.
|
|
5
|
+
* Supabase uses PostgREST under the hood, so the query syntax is similar.
|
|
6
|
+
* Supports both anon_key (row-level security) and service_role_key (admin access).
|
|
6
7
|
*
|
|
7
8
|
* Expected config structure:
|
|
8
9
|
* {
|
|
9
10
|
* supabase: {
|
|
10
|
-
* url: string,
|
|
11
|
-
* anon_key: string,
|
|
12
|
-
* service_role_key?: string
|
|
11
|
+
* url: string, // Supabase project URL (e.g., https://xxx.supabase.co)
|
|
12
|
+
* anon_key: string, // Supabase anonymous key (public, respects RLS)
|
|
13
|
+
* service_role_key?: string // Optional service role key (bypasses RLS)
|
|
13
14
|
* }
|
|
14
15
|
* }
|
|
15
16
|
*/
|
|
@@ -17,34 +18,93 @@ import type { HazoConnectAdapter, Logger } from '../types';
|
|
|
17
18
|
import { BaseAdapter } from './base-adapter';
|
|
18
19
|
import { QueryBuilder } from '../query-builder';
|
|
19
20
|
/**
|
|
20
|
-
* Supabase adapter implementation
|
|
21
|
+
* Supabase adapter implementation
|
|
22
|
+
* Uses the PostgREST API provided by Supabase
|
|
21
23
|
*/
|
|
22
24
|
export declare class SupabaseAdapter extends BaseAdapter implements HazoConnectAdapter {
|
|
25
|
+
private supabaseConfig;
|
|
23
26
|
/**
|
|
24
27
|
* Constructor
|
|
25
|
-
* @param config - Supabase configuration
|
|
28
|
+
* @param config - Supabase configuration (must include supabase.url and supabase.anon_key)
|
|
26
29
|
* @param logger - Optional logger instance
|
|
27
30
|
*/
|
|
28
31
|
constructor(config: any, logger?: Logger);
|
|
32
|
+
/**
|
|
33
|
+
* Get the appropriate API key based on context
|
|
34
|
+
* Uses service_role_key if available, otherwise anon_key
|
|
35
|
+
* @param useServiceRole - Whether to use service role key
|
|
36
|
+
* @returns API key string
|
|
37
|
+
*/
|
|
38
|
+
private getApiKey;
|
|
39
|
+
/**
|
|
40
|
+
* Get the REST API base URL
|
|
41
|
+
* Supabase REST API is at /rest/v1/
|
|
42
|
+
* @returns REST API base URL
|
|
43
|
+
*/
|
|
44
|
+
private getRestUrl;
|
|
45
|
+
/**
|
|
46
|
+
* Validate QueryBuilder does not contain unsupported features
|
|
47
|
+
* @param builder - QueryBuilder instance
|
|
48
|
+
*/
|
|
49
|
+
private validateQueryBuilder;
|
|
50
|
+
/**
|
|
51
|
+
* Convert QueryBuilder to Supabase/PostgREST URL
|
|
52
|
+
* @param builder - QueryBuilder instance
|
|
53
|
+
* @returns PostgREST endpoint URL with query parameters
|
|
54
|
+
*/
|
|
55
|
+
private buildSupabaseUrl;
|
|
29
56
|
/**
|
|
30
57
|
* Execute a query using the query builder
|
|
31
58
|
* @param builder - QueryBuilder instance
|
|
32
59
|
* @param method - HTTP method
|
|
33
|
-
* @param body - Request body
|
|
60
|
+
* @param body - Request body for POST/PUT/PATCH
|
|
34
61
|
* @returns Promise with query results
|
|
35
62
|
*/
|
|
36
63
|
query(builder: QueryBuilder, method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE', body?: any): Promise<any>;
|
|
37
64
|
/**
|
|
38
65
|
* Execute a raw query
|
|
39
|
-
* @param endpoint - Raw endpoint string
|
|
66
|
+
* @param endpoint - Raw endpoint string (e.g., '/table?id=eq.123')
|
|
40
67
|
* @param options - Request options
|
|
41
68
|
* @returns Promise with query results
|
|
42
69
|
*/
|
|
43
70
|
rawQuery(endpoint: string, options?: RequestInit): Promise<any>;
|
|
71
|
+
/**
|
|
72
|
+
* Execute a query with service role key (bypasses RLS)
|
|
73
|
+
* Use with caution - this bypasses row-level security
|
|
74
|
+
* @param endpoint - Raw endpoint string
|
|
75
|
+
* @param options - Request options
|
|
76
|
+
* @returns Promise with query results
|
|
77
|
+
*/
|
|
78
|
+
rawQueryAsAdmin(endpoint: string, options?: RequestInit): Promise<any>;
|
|
44
79
|
/**
|
|
45
80
|
* Get the adapter's configuration
|
|
46
|
-
* @returns Promise with adapter-specific config
|
|
81
|
+
* @returns Promise with adapter-specific config (without sensitive keys)
|
|
82
|
+
*/
|
|
83
|
+
getConfig(): Promise<{
|
|
84
|
+
url: string;
|
|
85
|
+
hasServiceRoleKey: boolean;
|
|
86
|
+
}>;
|
|
87
|
+
/**
|
|
88
|
+
* Parse error payload from response
|
|
89
|
+
* @param raw - Raw error response text
|
|
90
|
+
* @returns Parsed error or original string
|
|
91
|
+
*/
|
|
92
|
+
private parseErrorPayload;
|
|
93
|
+
/**
|
|
94
|
+
* Build a friendly error message
|
|
95
|
+
* @param status - HTTP status code
|
|
96
|
+
* @param statusText - HTTP status text
|
|
97
|
+
* @param endpoint - API endpoint
|
|
98
|
+
* @param parsedDetails - Parsed error details
|
|
99
|
+
* @param sanitizedUrl - URL with redacted API key
|
|
100
|
+
* @returns Friendly error message
|
|
101
|
+
*/
|
|
102
|
+
private buildFriendlyErrorMessage;
|
|
103
|
+
/**
|
|
104
|
+
* Sanitize URL by redacting API keys
|
|
105
|
+
* @param url - URL to sanitize
|
|
106
|
+
* @returns Sanitized URL
|
|
47
107
|
*/
|
|
48
|
-
|
|
108
|
+
private sanitizeUrl;
|
|
49
109
|
}
|
|
50
110
|
//# sourceMappingURL=supabase-adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supabase-adapter.d.ts","sourceRoot":"","sources":["../../src/lib/adapters/supabase-adapter.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"supabase-adapter.d.ts","sourceRoot":"","sources":["../../src/lib/adapters/supabase-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAY/C;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,WAAY,YAAW,kBAAkB;IAC5E,OAAO,CAAC,cAAc,CAAgB;IAEtC;;;;OAIG;gBACS,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM;IAgCxC;;;;;OAKG;IACH,OAAO,CAAC,SAAS;IAOjB;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAIlB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAW5B;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAuGxB;;;;;;OAMG;IACG,KAAK,CACT,OAAO,EAAE,YAAY,EACrB,MAAM,GAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAgB,EAC3D,IAAI,CAAC,EAAE,GAAG,GACT,OAAO,CAAC,GAAG,CAAC;IAoBf;;;;;OAKG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,GAAG,CAAC;IA0FzE;;;;;;OAMG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,GAAG,CAAC;IA4EhF;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,OAAO,CAAA;KAAE,CAAC;IAOvE;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;;;;;;;OAQG;IACH,OAAO,CAAC,yBAAyB;IAqCjC;;;;OAIG;IACH,OAAO,CAAC,WAAW;CAUpB"}
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Purpose: Supabase adapter
|
|
3
|
+
* Purpose: Supabase adapter implementation
|
|
4
4
|
*
|
|
5
|
-
* This adapter
|
|
6
|
-
*
|
|
5
|
+
* This adapter connects to Supabase PostgreSQL databases via the PostgREST API.
|
|
6
|
+
* Supabase uses PostgREST under the hood, so the query syntax is similar.
|
|
7
|
+
* Supports both anon_key (row-level security) and service_role_key (admin access).
|
|
7
8
|
*
|
|
8
9
|
* Expected config structure:
|
|
9
10
|
* {
|
|
10
11
|
* supabase: {
|
|
11
|
-
* url: string,
|
|
12
|
-
* anon_key: string,
|
|
13
|
-
* service_role_key?: string
|
|
12
|
+
* url: string, // Supabase project URL (e.g., https://xxx.supabase.co)
|
|
13
|
+
* anon_key: string, // Supabase anonymous key (public, respects RLS)
|
|
14
|
+
* service_role_key?: string // Optional service role key (bypasses RLS)
|
|
14
15
|
* }
|
|
15
16
|
* }
|
|
16
17
|
*/
|
|
@@ -19,43 +20,373 @@ exports.SupabaseAdapter = void 0;
|
|
|
19
20
|
const base_adapter_1 = require("./base-adapter");
|
|
20
21
|
const types_1 = require("../types");
|
|
21
22
|
/**
|
|
22
|
-
* Supabase adapter implementation
|
|
23
|
+
* Supabase adapter implementation
|
|
24
|
+
* Uses the PostgREST API provided by Supabase
|
|
23
25
|
*/
|
|
24
26
|
class SupabaseAdapter extends base_adapter_1.BaseAdapter {
|
|
25
27
|
/**
|
|
26
28
|
* Constructor
|
|
27
|
-
* @param config - Supabase configuration
|
|
29
|
+
* @param config - Supabase configuration (must include supabase.url and supabase.anon_key)
|
|
28
30
|
* @param logger - Optional logger instance
|
|
29
31
|
*/
|
|
30
32
|
constructor(config, logger) {
|
|
31
33
|
super(config, logger);
|
|
32
|
-
//
|
|
34
|
+
// Extract Supabase-specific config
|
|
35
|
+
this.supabaseConfig = config.supabase || config;
|
|
36
|
+
// Validate required fields
|
|
37
|
+
if (!this.supabaseConfig.url) {
|
|
38
|
+
this.throwError(types_1.ErrorCode.CONFIG_ERROR, 'Supabase url is required in configuration. Set supabase.url or SUPABASE_URL environment variable.');
|
|
39
|
+
}
|
|
40
|
+
if (!this.supabaseConfig.anon_key) {
|
|
41
|
+
this.throwError(types_1.ErrorCode.CONFIG_ERROR, 'Supabase anon_key is required in configuration. Set supabase.anon_key or SUPABASE_ANON_KEY environment variable.');
|
|
42
|
+
}
|
|
43
|
+
// Ensure URL doesn't end with /
|
|
44
|
+
if (this.supabaseConfig.url.endsWith('/')) {
|
|
45
|
+
this.supabaseConfig.url = this.supabaseConfig.url.slice(0, -1);
|
|
46
|
+
}
|
|
47
|
+
this.logger.info('Supabase adapter initialized', {
|
|
48
|
+
url: this.supabaseConfig.url,
|
|
49
|
+
hasServiceRoleKey: !!this.supabaseConfig.service_role_key
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get the appropriate API key based on context
|
|
54
|
+
* Uses service_role_key if available, otherwise anon_key
|
|
55
|
+
* @param useServiceRole - Whether to use service role key
|
|
56
|
+
* @returns API key string
|
|
57
|
+
*/
|
|
58
|
+
getApiKey(useServiceRole = false) {
|
|
59
|
+
if (useServiceRole && this.supabaseConfig.service_role_key) {
|
|
60
|
+
return this.supabaseConfig.service_role_key;
|
|
61
|
+
}
|
|
62
|
+
return this.supabaseConfig.anon_key;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get the REST API base URL
|
|
66
|
+
* Supabase REST API is at /rest/v1/
|
|
67
|
+
* @returns REST API base URL
|
|
68
|
+
*/
|
|
69
|
+
getRestUrl() {
|
|
70
|
+
return `${this.supabaseConfig.url}/rest/v1`;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Validate QueryBuilder does not contain unsupported features
|
|
74
|
+
* @param builder - QueryBuilder instance
|
|
75
|
+
*/
|
|
76
|
+
validateQueryBuilder(builder) {
|
|
77
|
+
// Supabase/PostgREST does not support SQL-style JOINs
|
|
78
|
+
const joins = builder.getJoins();
|
|
79
|
+
if (joins.length > 0) {
|
|
80
|
+
this.throwError(types_1.ErrorCode.VALIDATION_ERROR, 'Supabase adapter does not support SQL-style JOINs. Use nestedSelect() instead for related data.');
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Convert QueryBuilder to Supabase/PostgREST URL
|
|
85
|
+
* @param builder - QueryBuilder instance
|
|
86
|
+
* @returns PostgREST endpoint URL with query parameters
|
|
87
|
+
*/
|
|
88
|
+
buildSupabaseUrl(builder) {
|
|
89
|
+
const table = builder.getTable();
|
|
90
|
+
if (!table) {
|
|
91
|
+
this.throwError(types_1.ErrorCode.VALIDATION_ERROR, 'Table name is required');
|
|
92
|
+
}
|
|
93
|
+
// Validate QueryBuilder doesn't use unsupported features
|
|
94
|
+
this.validateQueryBuilder(builder);
|
|
95
|
+
const params = [];
|
|
96
|
+
// Select fields
|
|
97
|
+
const selectFields = builder.getSelectFields();
|
|
98
|
+
const nestedSelects = builder.getNestedSelects();
|
|
99
|
+
if (selectFields.length > 0 || nestedSelects.length > 0) {
|
|
100
|
+
const selectParts = [];
|
|
101
|
+
// Add regular select fields
|
|
102
|
+
if (selectFields.length > 0) {
|
|
103
|
+
selectParts.push(...selectFields);
|
|
104
|
+
}
|
|
105
|
+
// Add nested selects (PostgREST syntax: related_table(field1,field2))
|
|
106
|
+
if (nestedSelects.length > 0) {
|
|
107
|
+
const nestedParts = nestedSelects.map(ns => {
|
|
108
|
+
const fields = ns.fields.join(',');
|
|
109
|
+
return `${ns.table}(${fields})`;
|
|
110
|
+
});
|
|
111
|
+
selectParts.push(...nestedParts);
|
|
112
|
+
}
|
|
113
|
+
if (selectParts.length > 0) {
|
|
114
|
+
params.push(`select=${encodeURIComponent(selectParts.join(','))}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Where conditions
|
|
118
|
+
const whereConditions = builder.getWhereConditions();
|
|
119
|
+
for (const condition of whereConditions) {
|
|
120
|
+
const { field, operator, value } = condition;
|
|
121
|
+
let paramValue;
|
|
122
|
+
if (operator === 'in') {
|
|
123
|
+
// IN operator: field=in.(value1,value2)
|
|
124
|
+
const values = Array.isArray(value) ? value : [value];
|
|
125
|
+
paramValue = `in.(${values.map(v => String(v)).join(',')})`;
|
|
126
|
+
}
|
|
127
|
+
else if (operator === 'is') {
|
|
128
|
+
// IS operator: field=is.null or field=is.not.null
|
|
129
|
+
paramValue = value === null || value === 'null' ? 'is.null' : 'is.not.null';
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
// Standard operators: field=operator.value
|
|
133
|
+
paramValue = `${operator}.${String(value)}`;
|
|
134
|
+
}
|
|
135
|
+
params.push(`${field}=${encodeURIComponent(paramValue)}`);
|
|
136
|
+
}
|
|
137
|
+
// OR conditions
|
|
138
|
+
const whereOrConditions = builder.getWhereOrConditions();
|
|
139
|
+
if (whereOrConditions.length > 0) {
|
|
140
|
+
const orParts = [];
|
|
141
|
+
for (const orGroup of whereOrConditions) {
|
|
142
|
+
const groupParts = orGroup.map(condition => {
|
|
143
|
+
const { field, operator, value } = condition;
|
|
144
|
+
if (operator === 'in') {
|
|
145
|
+
const values = Array.isArray(value) ? value : [value];
|
|
146
|
+
return `${field}.in.(${values.map(v => String(v)).join(',')})`;
|
|
147
|
+
}
|
|
148
|
+
else if (operator === 'is') {
|
|
149
|
+
return `${field}.is.${value === null || value === 'null' ? 'null' : 'not.null'}`;
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
return `${field}.${operator}.${String(value)}`;
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
orParts.push(`(${groupParts.join(',')})`);
|
|
156
|
+
}
|
|
157
|
+
params.push(`or=${encodeURIComponent(orParts.join(','))}`);
|
|
158
|
+
}
|
|
159
|
+
// Order by
|
|
160
|
+
const orderBy = builder.getOrderBy();
|
|
161
|
+
if (orderBy.length > 0) {
|
|
162
|
+
const orderParts = orderBy.map(o => `${o.field}.${o.direction}`);
|
|
163
|
+
params.push(`order=${encodeURIComponent(orderParts.join(','))}`);
|
|
164
|
+
}
|
|
165
|
+
// Limit
|
|
166
|
+
const limit = builder.getLimit();
|
|
167
|
+
if (limit !== null) {
|
|
168
|
+
params.push(`limit=${limit}`);
|
|
169
|
+
}
|
|
170
|
+
// Offset
|
|
171
|
+
const offset = builder.getOffset();
|
|
172
|
+
if (offset !== null) {
|
|
173
|
+
params.push(`offset=${offset}`);
|
|
174
|
+
}
|
|
175
|
+
// Build final URL
|
|
176
|
+
const queryString = params.length > 0 ? `?${params.join('&')}` : '';
|
|
177
|
+
return `/${table}${queryString}`;
|
|
33
178
|
}
|
|
34
179
|
/**
|
|
35
180
|
* Execute a query using the query builder
|
|
36
181
|
* @param builder - QueryBuilder instance
|
|
37
182
|
* @param method - HTTP method
|
|
38
|
-
* @param body - Request body
|
|
183
|
+
* @param body - Request body for POST/PUT/PATCH
|
|
39
184
|
* @returns Promise with query results
|
|
40
185
|
*/
|
|
41
186
|
async query(builder, method = 'GET', body) {
|
|
42
|
-
|
|
187
|
+
const endpoint = this.buildSupabaseUrl(builder);
|
|
188
|
+
this.logQuery('Supabase query', {
|
|
189
|
+
method,
|
|
190
|
+
endpoint,
|
|
191
|
+
hasBody: !!body,
|
|
192
|
+
bodySize: body ? JSON.stringify(body).length : 0
|
|
193
|
+
});
|
|
194
|
+
return this.rawQuery(endpoint, {
|
|
195
|
+
method,
|
|
196
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
197
|
+
headers: {
|
|
198
|
+
'Content-Type': 'application/json',
|
|
199
|
+
'Prefer': 'return=representation'
|
|
200
|
+
}
|
|
201
|
+
});
|
|
43
202
|
}
|
|
44
203
|
/**
|
|
45
204
|
* Execute a raw query
|
|
46
|
-
* @param endpoint - Raw endpoint string
|
|
205
|
+
* @param endpoint - Raw endpoint string (e.g., '/table?id=eq.123')
|
|
47
206
|
* @param options - Request options
|
|
48
207
|
* @returns Promise with query results
|
|
49
208
|
*/
|
|
50
209
|
async rawQuery(endpoint, options = {}) {
|
|
51
|
-
|
|
210
|
+
const url = `${this.getRestUrl()}${endpoint}`;
|
|
211
|
+
const apiKey = this.getApiKey(false); // Use anon key by default
|
|
212
|
+
const headers = {
|
|
213
|
+
'Content-Type': 'application/json',
|
|
214
|
+
'apikey': apiKey,
|
|
215
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
216
|
+
...options.headers,
|
|
217
|
+
};
|
|
218
|
+
// Log request (redact sensitive data)
|
|
219
|
+
this.logQuery('Supabase raw query', {
|
|
220
|
+
url: this.sanitizeUrl(url),
|
|
221
|
+
method: options.method || 'GET',
|
|
222
|
+
hasBody: !!options.body
|
|
223
|
+
});
|
|
224
|
+
try {
|
|
225
|
+
const response = await fetch(url, { ...options, headers });
|
|
226
|
+
if (!response.ok) {
|
|
227
|
+
const errorData = await response.text();
|
|
228
|
+
const parsedDetails = this.parseErrorPayload(errorData);
|
|
229
|
+
const sanitizedUrl = this.sanitizeUrl(url);
|
|
230
|
+
const friendlyMessage = this.buildFriendlyErrorMessage(response.status, response.statusText, endpoint, parsedDetails, sanitizedUrl);
|
|
231
|
+
this.logger.error('Supabase request failed', {
|
|
232
|
+
status: response.status,
|
|
233
|
+
statusText: response.statusText,
|
|
234
|
+
error: parsedDetails ?? errorData,
|
|
235
|
+
url: sanitizedUrl
|
|
236
|
+
});
|
|
237
|
+
this.throwError(types_1.ErrorCode.QUERY_ERROR, friendlyMessage, response.status, parsedDetails ?? errorData);
|
|
238
|
+
}
|
|
239
|
+
// Handle empty response
|
|
240
|
+
const responseBody = await response.text();
|
|
241
|
+
if (!responseBody) {
|
|
242
|
+
return null;
|
|
243
|
+
}
|
|
244
|
+
const parsedData = JSON.parse(responseBody);
|
|
245
|
+
// Log successful response
|
|
246
|
+
this.logger.info('Supabase request succeeded', {
|
|
247
|
+
status: response.status,
|
|
248
|
+
dataType: Array.isArray(parsedData) ? 'array' : typeof parsedData,
|
|
249
|
+
dataLength: Array.isArray(parsedData) ? parsedData.length : 1
|
|
250
|
+
});
|
|
251
|
+
return parsedData;
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
// Handle connection errors
|
|
255
|
+
if (this.isConnectionError(error)) {
|
|
256
|
+
this.throwError(types_1.ErrorCode.CONNECTION_FAILED, 'Lost connection to Supabase database', undefined, error);
|
|
257
|
+
}
|
|
258
|
+
// Re-throw with error code if not already set
|
|
259
|
+
if (error.code) {
|
|
260
|
+
throw error;
|
|
261
|
+
}
|
|
262
|
+
this.throwError(types_1.ErrorCode.QUERY_ERROR, `Supabase request error: ${error.message || String(error)}`, undefined, error);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Execute a query with service role key (bypasses RLS)
|
|
267
|
+
* Use with caution - this bypasses row-level security
|
|
268
|
+
* @param endpoint - Raw endpoint string
|
|
269
|
+
* @param options - Request options
|
|
270
|
+
* @returns Promise with query results
|
|
271
|
+
*/
|
|
272
|
+
async rawQueryAsAdmin(endpoint, options = {}) {
|
|
273
|
+
if (!this.supabaseConfig.service_role_key) {
|
|
274
|
+
this.throwError(types_1.ErrorCode.CONFIG_ERROR, 'Service role key is required for admin queries. Set supabase.service_role_key in configuration.');
|
|
275
|
+
}
|
|
276
|
+
const url = `${this.getRestUrl()}${endpoint}`;
|
|
277
|
+
const apiKey = this.supabaseConfig.service_role_key;
|
|
278
|
+
const headers = {
|
|
279
|
+
'Content-Type': 'application/json',
|
|
280
|
+
'apikey': apiKey,
|
|
281
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
282
|
+
...options.headers,
|
|
283
|
+
};
|
|
284
|
+
this.logQuery('Supabase admin query', {
|
|
285
|
+
url: this.sanitizeUrl(url),
|
|
286
|
+
method: options.method || 'GET',
|
|
287
|
+
hasBody: !!options.body,
|
|
288
|
+
isAdminQuery: true
|
|
289
|
+
});
|
|
290
|
+
try {
|
|
291
|
+
const response = await fetch(url, { ...options, headers });
|
|
292
|
+
if (!response.ok) {
|
|
293
|
+
const errorData = await response.text();
|
|
294
|
+
const parsedDetails = this.parseErrorPayload(errorData);
|
|
295
|
+
this.logger.error('Supabase admin request failed', {
|
|
296
|
+
status: response.status,
|
|
297
|
+
statusText: response.statusText,
|
|
298
|
+
error: parsedDetails ?? errorData
|
|
299
|
+
});
|
|
300
|
+
this.throwError(types_1.ErrorCode.QUERY_ERROR, `Supabase admin request failed (${response.status} ${response.statusText})`, response.status, parsedDetails ?? errorData);
|
|
301
|
+
}
|
|
302
|
+
const responseBody = await response.text();
|
|
303
|
+
if (!responseBody) {
|
|
304
|
+
return null;
|
|
305
|
+
}
|
|
306
|
+
return JSON.parse(responseBody);
|
|
307
|
+
}
|
|
308
|
+
catch (error) {
|
|
309
|
+
if (this.isConnectionError(error)) {
|
|
310
|
+
this.throwError(types_1.ErrorCode.CONNECTION_FAILED, 'Lost connection to Supabase database', undefined, error);
|
|
311
|
+
}
|
|
312
|
+
if (error.code) {
|
|
313
|
+
throw error;
|
|
314
|
+
}
|
|
315
|
+
this.throwError(types_1.ErrorCode.QUERY_ERROR, `Supabase admin request error: ${error.message || String(error)}`, undefined, error);
|
|
316
|
+
}
|
|
52
317
|
}
|
|
53
318
|
/**
|
|
54
319
|
* Get the adapter's configuration
|
|
55
|
-
* @returns Promise with adapter-specific config
|
|
320
|
+
* @returns Promise with adapter-specific config (without sensitive keys)
|
|
56
321
|
*/
|
|
57
322
|
async getConfig() {
|
|
58
|
-
return Promise.resolve(
|
|
323
|
+
return Promise.resolve({
|
|
324
|
+
url: this.supabaseConfig.url,
|
|
325
|
+
hasServiceRoleKey: !!this.supabaseConfig.service_role_key
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Parse error payload from response
|
|
330
|
+
* @param raw - Raw error response text
|
|
331
|
+
* @returns Parsed error or original string
|
|
332
|
+
*/
|
|
333
|
+
parseErrorPayload(raw) {
|
|
334
|
+
if (!raw) {
|
|
335
|
+
return undefined;
|
|
336
|
+
}
|
|
337
|
+
try {
|
|
338
|
+
return JSON.parse(raw);
|
|
339
|
+
}
|
|
340
|
+
catch {
|
|
341
|
+
return raw;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Build a friendly error message
|
|
346
|
+
* @param status - HTTP status code
|
|
347
|
+
* @param statusText - HTTP status text
|
|
348
|
+
* @param endpoint - API endpoint
|
|
349
|
+
* @param parsedDetails - Parsed error details
|
|
350
|
+
* @param sanitizedUrl - URL with redacted API key
|
|
351
|
+
* @returns Friendly error message
|
|
352
|
+
*/
|
|
353
|
+
buildFriendlyErrorMessage(status, statusText, endpoint, parsedDetails, sanitizedUrl) {
|
|
354
|
+
const resource = endpoint.replace(/^\//, '').split('?')[0] || 'resource';
|
|
355
|
+
const detailMessage = parsedDetails && typeof parsedDetails === 'object' && parsedDetails.message
|
|
356
|
+
? ` Details: ${parsedDetails.message}`
|
|
357
|
+
: '';
|
|
358
|
+
const hint = parsedDetails && typeof parsedDetails === 'object' && parsedDetails.hint
|
|
359
|
+
? ` Hint: ${parsedDetails.hint}`
|
|
360
|
+
: '';
|
|
361
|
+
const requestInfo = ` Request: ${sanitizedUrl}`;
|
|
362
|
+
if (status === 404) {
|
|
363
|
+
return `Supabase could not find resource '${resource}'. Verify the table name and ensure it exists in your database. (${statusText}).${detailMessage}${hint}${requestInfo}`;
|
|
364
|
+
}
|
|
365
|
+
if (status === 401) {
|
|
366
|
+
return `Supabase rejected the request (401 Unauthorized). Check that your API key is valid and has access to '${resource}'.${detailMessage}${hint}${requestInfo}`;
|
|
367
|
+
}
|
|
368
|
+
if (status === 403) {
|
|
369
|
+
return `Supabase denied access to '${resource}' (403 Forbidden). Check row-level security policies or use service_role_key for admin access.${detailMessage}${hint}${requestInfo}`;
|
|
370
|
+
}
|
|
371
|
+
if (status === 409) {
|
|
372
|
+
return `Supabase request failed due to a conflict (409). This may be a unique constraint violation.${detailMessage}${hint}${requestInfo}`;
|
|
373
|
+
}
|
|
374
|
+
return `Supabase request failed (${status} ${statusText}).${detailMessage}${hint}${requestInfo}`;
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Sanitize URL by redacting API keys
|
|
378
|
+
* @param url - URL to sanitize
|
|
379
|
+
* @returns Sanitized URL
|
|
380
|
+
*/
|
|
381
|
+
sanitizeUrl(url) {
|
|
382
|
+
let sanitized = url;
|
|
383
|
+
if (this.supabaseConfig.anon_key) {
|
|
384
|
+
sanitized = sanitized.replace(this.supabaseConfig.anon_key, '...REDACTED...');
|
|
385
|
+
}
|
|
386
|
+
if (this.supabaseConfig.service_role_key) {
|
|
387
|
+
sanitized = sanitized.replace(this.supabaseConfig.service_role_key, '...REDACTED...');
|
|
388
|
+
}
|
|
389
|
+
return sanitized;
|
|
59
390
|
}
|
|
60
391
|
}
|
|
61
392
|
exports.SupabaseAdapter = SupabaseAdapter;
|