@xylex-group/athena 0.2.1 → 1.0.2

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 CHANGED
@@ -1,103 +1,293 @@
1
- # athena-js
2
-
3
- Athena is a database driver + API gateway SDK that lets you interact with SQL backends using the familiar `supabase-js` syntax.
4
-
5
- ## Gateway query builder
6
-
7
- ```ts
8
- import { createClient } from "athena-js";
9
-
10
- const athena = createClient(
11
- "https://athena-db.com",
12
- process.env.ATHENA_API_KEY,
13
- );
14
-
15
- const { data, error } = await athena.from("characters").select(`
16
- id,
17
- name,
18
- from:sender_id(name),
19
- to:receiver_id(name)
20
- `);
21
-
22
- if (error) {
23
- console.error("gateway error", error);
24
- } else {
25
- console.table(data);
26
- }
27
- ```
28
-
29
- Use `select`, `insert`, `update`, `delete`, and `upsert` just like Supabase. The builder now exposes Supabase-style helpers such as `.range()`, `.gt()`, `.lt()`, `.ilike()`, `.contains()`, `.not()`, `.or()`, and `.maybeSingle()` so existing Supabase code runs without changes.
30
-
31
- ### Filters & modifiers
32
-
33
- Filters are cumulative and stack on the query builder:
34
-
35
- ```ts
36
- const { data } = await athena
37
- .from('characters')
38
- .select('id, name')
39
- .gt('level', 5)
40
- .lte('created_at', '2024-01-01')
41
- .contains('tags', ['hero'])
42
- .range(0, 49)
43
- ```
44
-
45
- Modifiers like `.limit()`, `.offset()`, `.range()`, and `.match()` behave the same as in Supabase. The fetch call automatically sends `strip_nulls`, `count`, `head`, and `defaultToNull` options when provided.
46
-
47
- ### Mutations
48
-
49
- Mutation methods return a Supabase-compatible `MutationQuery` so you can chain `.select()`, `.single()`, and `.returning()` after invoking them:
50
-
51
- ```ts
52
- const { data: inserted, error } = await athena
53
- .from('countries')
54
- .insert({ id: 1, name: 'Mordor' })
55
- .select('id, name')
56
-
57
- const { data: updated } = await athena
58
- .from('countries')
59
- .update({ name: 'Gondor' })
60
- .eq('id', 1)
61
- .select()
62
-
63
- const { data: upserted } = await athena
64
- .from('countries')
65
- .upsert({ id: 2, name: 'Rohan' }, { updateBody: { name: 'Rohan' }, onConflict: 'id' })
66
- .select()
67
- ```
68
-
69
- Insert and upsert calls accept Supabase-compatible options such as `defaultToNull`, `count`, `head`, and `onConflict`. Delete operations allow filtering by `.eq()` or by passing `options.resourceId` as in Supabase.
70
-
71
- ## React hook
72
-
73
- ```tsx
74
- "use client";
75
-
76
- import { useAthenaGateway } from "athena-js/react";
77
- import { useEffect } from "react";
78
-
79
- export function UsersPanel() {
80
- const { fetchGateway, lastResponse, isLoading, error } = useAthenaGateway({
81
- baseUrl: "https://athena-db.com",
82
- apiKey: process.env.NEXT_PUBLIC_ATHENA_API_KEY,
83
- });
84
-
85
- useEffect(() => {
86
- fetchGateway({
87
- table_name: "users",
88
- columns: ["id", "email"],
89
- limit: 25,
90
- });
91
- }, [fetchGateway]);
92
-
93
- if (error) return <div>Error: {error}</div>;
94
- if (isLoading) return <div>Loading…</div>;
95
-
96
- return <pre>{JSON.stringify(lastResponse?.data, null, 2)}</pre>;
97
- }
98
- ```
99
-
100
- ## Learn more
101
-
102
- - [API reference](docs/api-reference.md)
103
- - [Getting started](docs/getting-started.md)
1
+ # athena-js
2
+
3
+ `@xylex-group/athena` is a database driver and API gateway SDK that lets you interact with SQL backends over HTTP through a fluent builder API. It ships a typed query builder for Node.js / server environments and a React hook for client-side use.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @xylex-group/athena
9
+ # or
10
+ pnpm add @xylex-group/athena
11
+ # or
12
+ yarn add @xylex-group/athena
13
+ ```
14
+
15
+ React peer dependency is optional only needed if you use `useAthenaGateway`.
16
+
17
+ ```bash
18
+ npm install react # React >=17 required for the hook
19
+ ```
20
+
21
+ ## Quick start
22
+
23
+ ```ts
24
+ import { createClient } from "@xylex-group/athena";
25
+
26
+ const athena = createClient(
27
+ "https://athena-db.com",
28
+ process.env.ATHENA_API_KEY,
29
+ );
30
+
31
+ const { data, error } = await athena.from("characters").select(`
32
+ id,
33
+ name,
34
+ from:sender_id(name),
35
+ to:receiver_id(name)
36
+ `);
37
+
38
+ if (error) {
39
+ console.error("gateway error", error);
40
+ } else {
41
+ console.table(data);
42
+ }
43
+ ```
44
+
45
+ Every query resolves to `{ data, error, status, raw }`. `data` is `null` on error; `error` is `null` on success.
46
+
47
+ ## Query builder
48
+
49
+ ### Reading rows
50
+
51
+ ```ts
52
+ // select all columns
53
+ const { data } = await athena.from("users").select();
54
+
55
+ // select specific columns
56
+ const { data } = await athena.from("users").select("id, name, email");
57
+
58
+ // select with type annotation
59
+ const { data } = await athena.from<User>("users").select("id, name");
60
+ ```
61
+
62
+ ### Filters
63
+
64
+ Filters accumulate on the builder and are sent together when the query executes.
65
+
66
+ ```ts
67
+ const { data } = await athena
68
+ .from("characters")
69
+ .select("id, name")
70
+ .eq("active", true) // column = value
71
+ .neq("role", "guest") // column != value
72
+ .gt("level", 5) // column > value
73
+ .gte("score", 100) // column >= value
74
+ .lt("age", 30) // column < value
75
+ .lte("created_at", "2024-01-01") // column <= value
76
+ .like("name", "Ali%") // SQL LIKE (case-sensitive)
77
+ .ilike("email", "%@example%") // SQL ILIKE (case-insensitive)
78
+ .is("deleted_at", null) // IS NULL / IS TRUE etc.
79
+ .in("status", ["active", "pending"]) // IN ()
80
+ .contains("tags", ["hero"]) // array contains value
81
+ .containedBy("tags", ["hero", "villain"]) // array is subset of value
82
+ .match({ role: "admin", active: true }) // multiple eq filters at once
83
+ .not("role", "eq", "banned") // NOT col op val
84
+ .or("status.eq.active,status.eq.pending"); // OR expression
85
+ ```
86
+
87
+ ### Pagination
88
+
89
+ ```ts
90
+ // explicit limit and offset
91
+ const { data } = await athena.from("users").select().limit(25).offset(50);
92
+
93
+ // range shorthand — equivalent to offset(from).limit(to - from + 1)
94
+ const { data } = await athena.from("users").select().range(0, 24);
95
+ ```
96
+
97
+ ### Single row
98
+
99
+ ```ts
100
+ // returns the first row or null instead of an array
101
+ const { data: user } = await athena
102
+ .from("users")
103
+ .select("id, name")
104
+ .eq("id", 42)
105
+ .single();
106
+ ```
107
+
108
+ `maybeSingle` behaves identically — both return the first element of the result set.
109
+
110
+ ### Options
111
+
112
+ Pass options as the second argument to `.select()`:
113
+
114
+ | Option | Type | Description |
115
+ |--------|------|-------------|
116
+ | `count` | `"exact" \| "planned" \| "estimated"` | request a row count alongside the data |
117
+ | `head` | `boolean` | return response headers only (no rows) |
118
+ | `stripNulls` | `boolean` | strip null values from rows (default `true`) |
119
+
120
+ ```ts
121
+ const { data } = await athena
122
+ .from("orders")
123
+ .select("id", { count: "exact", stripNulls: false });
124
+ ```
125
+
126
+ ## Mutations
127
+
128
+ Insert, update, upsert, and delete all return a `MutationQuery` that you can await directly or chain further calls onto before the request fires.
129
+
130
+ ### Insert
131
+
132
+ ```ts
133
+ const { data: inserted } = await athena
134
+ .from("countries")
135
+ .insert({ name: "Mordor" })
136
+ .select("id, name");
137
+
138
+ // insert multiple rows
139
+ const { data } = await athena
140
+ .from("characters")
141
+ .insert([{ name: "Frodo" }, { name: "Sam" }])
142
+ .select();
143
+ ```
144
+
145
+ ### Update
146
+
147
+ ```ts
148
+ const { data: updated } = await athena
149
+ .from("countries")
150
+ .update({ name: "Gondor" })
151
+ .eq("id", 1)
152
+ .select();
153
+ ```
154
+
155
+ Filters (`.eq()`, `.match()`, etc.) applied before `.update()` are used as `WHERE` conditions.
156
+
157
+ ### Upsert
158
+
159
+ ```ts
160
+ const { data } = await athena
161
+ .from("countries")
162
+ .upsert(
163
+ { id: 2, name: "Rohan" },
164
+ { updateBody: { name: "Rohan" }, onConflict: "id" },
165
+ )
166
+ .select();
167
+ ```
168
+
169
+ | Option | Type | Description |
170
+ |--------|------|-------------|
171
+ | `onConflict` | `string \| string[]` | column(s) that determine a conflict |
172
+ | `updateBody` | `object` | fields to apply when a conflict occurs |
173
+ | `defaultToNull` | `boolean` | write explicit `null` for missing fields |
174
+ | `count` | `"exact" \| "planned" \| "estimated"` | request a row count |
175
+ | `head` | `boolean` | return headers only |
176
+
177
+ ### Delete
178
+
179
+ ```ts
180
+ // delete by id filter
181
+ await athena.from("countries").eq("id", 1).delete();
182
+
183
+ // delete with explicit resourceId option
184
+ await athena.from("countries").delete({ resourceId: "abc-123" });
185
+
186
+ // chain .select() to get the deleted row back
187
+ const { data: deleted } = await athena
188
+ .from("countries")
189
+ .eq("resource_id", "abc-123")
190
+ .delete()
191
+ .select("id, name");
192
+ ```
193
+
194
+ Delete requires either `.eq("resource_id", …)`, `.eq("id", …)`, or `options.resourceId` — calling `.delete()` without any of these throws an error.
195
+
196
+ ### MutationQuery chaining
197
+
198
+ All mutation methods return a `MutationQuery` which supports:
199
+
200
+ ```ts
201
+ const mutation = athena.from("users").insert({ name: "Alice" });
202
+
203
+ await mutation.select("id, name"); // fire request, return rows
204
+ await mutation.returning("id"); // alias for .select()
205
+ await mutation.single("id"); // return first row or null
206
+ await mutation.maybeSingle("id"); // same as .single()
207
+ await mutation; // fire request, return default columns
208
+ mutation.then(({ data }) => …); // thenable
209
+ mutation.catch(err => …);
210
+ mutation.finally(() => …);
211
+ ```
212
+
213
+ The request fires only once regardless of how many times you call `.then()` or await the object.
214
+
215
+ ## React hook
216
+
217
+ ```tsx
218
+ "use client";
219
+
220
+ import { useAthenaGateway } from "@xylex-group/athena/react";
221
+ import { useEffect } from "react";
222
+
223
+ export function UsersPanel() {
224
+ const { fetchGateway, lastResponse, isLoading, error } = useAthenaGateway({
225
+ baseUrl: "https://athena-db.com",
226
+ apiKey: process.env.NEXT_PUBLIC_ATHENA_API_KEY,
227
+ });
228
+
229
+ useEffect(() => {
230
+ fetchGateway({
231
+ table_name: "users",
232
+ columns: ["id", "email"],
233
+ limit: 25,
234
+ });
235
+ }, [fetchGateway]);
236
+
237
+ if (error) return <div>Error: {error}</div>;
238
+ if (isLoading) return <div>Loading…</div>;
239
+
240
+ return <pre>{JSON.stringify(lastResponse?.data, null, 2)}</pre>;
241
+ }
242
+ ```
243
+
244
+ The hook returns `fetchGateway`, `insertGateway`, `updateGateway`, `deleteGateway`, `isLoading`, `error`, `lastRequest`, `lastResponse`, and `baseUrl`.
245
+
246
+ Hook config options mirror the client options: `baseUrl`, `apiKey`, `stripNulls`, `headers`, `userId`, `companyId`, `organizationId`, `supabaseUrl`, `supabaseKey`, `publishEvent`.
247
+
248
+ ## User context headers
249
+
250
+ Pass user and tenant context to every request without repeating it on each call:
251
+
252
+ ```ts
253
+ const athena = createClient("https://athena-db.com", process.env.ATHENA_API_KEY, {
254
+ userId: currentUser.id,
255
+ companyId: currentUser.companyId,
256
+ organizationId: currentUser.organizationId,
257
+ });
258
+ ```
259
+
260
+ These are sent as `X-User-Id`, `X-Company-Id`, and `X-Organization-Id` request headers. You can override them per-call by passing the same options to `.select()` or any mutation method.
261
+
262
+ ## Custom headers
263
+
264
+ ```ts
265
+ const athena = createClient("https://athena-db.com", process.env.ATHENA_API_KEY, {
266
+ headers: {
267
+ "X-Custom-Header": "value",
268
+ },
269
+ });
270
+ ```
271
+
272
+ Per-call headers are merged with the client-level headers, with per-call values winning on conflict.
273
+
274
+ ## TypeScript
275
+
276
+ The package is written in TypeScript and ships declaration files. Pass a row type to `.from()` for fully-typed builder methods and results:
277
+
278
+ ```ts
279
+ interface User {
280
+ id: number;
281
+ name: string;
282
+ email: string;
283
+ active: boolean;
284
+ }
285
+
286
+ const { data } = await athena.from<User>("users").select("id, name").eq("active", true);
287
+ // data is User[] | null
288
+ ```
289
+
290
+ ## Learn more
291
+
292
+ - [Getting started](docs/getting-started.md) — step-by-step walkthrough
293
+ - [API reference](docs/api-reference.md) — complete method and type reference
package/bin/athena-js.js CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env node
1
+ #!/usr/bin/env node
2
2
 
3
3
  import('../dist/cli/index.js').then(({ runCLI }) => {
4
4
  runCLI(process.argv.slice(2))
package/dist/index.js CHANGED
@@ -79,10 +79,11 @@ async function callAthena(config, endpoint, method, payload, options) {
79
79
  const parsedPayload = parsed;
80
80
  const parsedError = parsedPayload && typeof parsedPayload === "object" ? parsedPayload.error ?? parsedPayload.message : void 0;
81
81
  const hasError = typeof parsedError === "string" && parsedError.length > 0 ? parsedError : void 0;
82
+ const payloadData = parsedPayload && typeof parsedPayload === "object" && "data" in parsedPayload ? parsedPayload.data : parsed;
82
83
  return {
83
84
  ok: response.ok,
84
85
  status: response.status,
85
- data: parsed ?? null,
86
+ data: payloadData ?? null,
86
87
  error: hasError,
87
88
  raw: parsed
88
89
  };
@@ -298,7 +299,9 @@ function createTableBuilder(tableName, client) {
298
299
  conditions: state.conditions.length ? [...state.conditions] : void 0,
299
300
  limit: state.limit,
300
301
  offset: state.offset,
301
- strip_nulls: options?.stripNulls ?? true
302
+ strip_nulls: options?.stripNulls ?? true,
303
+ count: options?.count,
304
+ head: options?.head
302
305
  };
303
306
  const response = await client.fetchGateway(payload, options);
304
307
  return formatResult(response);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/gateway/client.ts","../src/supabase.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type {\r\n AthenaGatewayBaseOptions,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayEndpointPath,\r\n AthenaGatewayMethod,\r\n AthenaGatewayResponse,\r\n} from \"./types.js\";\r\nimport type {\r\n AthenaDeletePayload,\r\n AthenaFetchPayload,\r\n AthenaInsertPayload,\r\n AthenaUpdatePayload,\r\n} from \"./types.js\";\r\n\r\nconst DEFAULT_BASE_URL = \"https://athena-db.com\";\r\nconst DEFAULT_CLIENT = \"railway_direct\";\r\n\r\nfunction parseResponseText(text: string) {\r\n if (!text) return null;\r\n try {\r\n return JSON.parse(text);\r\n } catch {\r\n return text;\r\n }\r\n}\r\n\r\nfunction normalizeHeaderValue(value?: string | null) {\r\n return value ? value : undefined;\r\n}\r\n\r\nfunction buildHeaders(\r\n config: AthenaGatewayBaseOptions,\r\n options?: AthenaGatewayCallOptions,\r\n): Record<string, string> {\r\n const mergedStripNulls = options?.stripNulls ?? config.stripNulls ?? true;\r\n const finalClient = options?.client ?? config.client ?? DEFAULT_CLIENT;\r\n const finalApiKey = options?.apiKey ?? config.apiKey;\r\n const finalSupabaseUrl = options?.supabaseUrl ?? config.supabaseUrl;\r\n const finalSupabaseKey = options?.supabaseKey ?? config.supabaseKey;\r\n const finalPublishEvent = options?.publishEvent ?? config.publishEvent;\r\n const extraHeaders = {\r\n ...(config.headers ?? {}),\r\n ...(options?.headers ?? {}),\r\n };\r\n\r\n const headers: Record<string, string> = {\r\n \"Content-Type\": \"application/json\",\r\n };\r\n\r\n if (options?.userId ?? config.userId) {\r\n headers[\"X-User-Id\"] = options?.userId ?? config.userId ?? \"\";\r\n }\r\n\r\n if (options?.companyId ?? config.companyId) {\r\n headers[\"X-Company-Id\"] = options?.companyId ?? config.companyId ?? \"\";\r\n }\r\n\r\n if (options?.organizationId ?? config.organizationId) {\r\n headers[\"X-Organization-Id\"] =\r\n options?.organizationId ?? config.organizationId ?? \"\";\r\n }\r\n\r\n if (finalClient) {\r\n headers[\"X-Athena-Client\"] = finalClient;\r\n }\r\n\r\n if (typeof mergedStripNulls === \"boolean\") {\r\n headers[\"X-Strip-Nulls\"] = mergedStripNulls ? \"true\" : \"false\";\r\n }\r\n\r\n if (finalPublishEvent) {\r\n headers[\"X-Publish-Event\"] = finalPublishEvent;\r\n }\r\n\r\n if (finalApiKey) {\r\n headers[\"apikey\"] = finalApiKey;\r\n headers[\"x-api-key\"] = headers[\"x-api-key\"] ?? finalApiKey;\r\n }\r\n\r\n if (finalSupabaseUrl) {\r\n headers[\"x-supabase-url\"] = finalSupabaseUrl;\r\n }\r\n\r\n if (finalSupabaseKey) {\r\n headers[\"x-supabase-key\"] = finalSupabaseKey;\r\n }\r\n\r\n Object.entries(extraHeaders).forEach(([key, value]) => {\r\n const normalized = normalizeHeaderValue(value);\r\n if (normalized) {\r\n headers[key] = normalized;\r\n }\r\n });\r\n\r\n return headers;\r\n}\r\n\r\nasync function callAthena<T>(\r\n config: AthenaGatewayBaseOptions,\r\n endpoint: AthenaGatewayEndpointPath,\r\n method: AthenaGatewayMethod,\r\n payload: unknown,\r\n options?: AthenaGatewayCallOptions,\r\n): Promise<AthenaGatewayResponse<T>> {\r\n const baseUrl = (\r\n options?.baseUrl ??\r\n config.baseUrl ??\r\n DEFAULT_BASE_URL\r\n ).replace(/\\/$/, \"\");\r\n const url = `${baseUrl}${endpoint}`;\r\n const headers = buildHeaders(config, options);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method,\r\n headers,\r\n body: JSON.stringify(payload),\r\n });\r\n\r\n const rawText = await response.text();\r\n const parsed = parseResponseText(rawText ?? \"\");\r\n const parsedPayload = parsed as Record<string, unknown> | null;\r\n const parsedError =\r\n parsedPayload && typeof parsedPayload === \"object\"\r\n ? ((parsedPayload.error as string | undefined) ??\r\n (parsedPayload.message as string | undefined))\r\n : undefined;\r\n const hasError =\r\n typeof parsedError === \"string\" && parsedError.length > 0\r\n ? parsedError\r\n : undefined;\r\n\r\n return {\r\n ok: response.ok,\r\n status: response.status,\r\n data: (parsed as T) ?? null,\r\n error: hasError,\r\n raw: parsed,\r\n };\r\n } catch (callError) {\r\n const message =\r\n callError instanceof Error ? callError.message : String(callError);\r\n return {\r\n ok: false,\r\n status: 0,\r\n data: null,\r\n error: message,\r\n raw: null,\r\n };\r\n }\r\n}\r\n\r\nexport interface AthenaGatewayClient {\r\n baseUrl: string;\r\n buildHeaders(options?: AthenaGatewayCallOptions): Record<string, string>;\r\n fetchGateway<T>(\r\n payload: AthenaFetchPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n insertGateway<T>(\r\n payload: AthenaInsertPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n updateGateway<T>(\r\n payload: AthenaUpdatePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n deleteGateway<T>(\r\n payload: AthenaDeletePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n}\r\n\r\nexport function createAthenaGatewayClient(\r\n config: AthenaGatewayBaseOptions = {},\r\n): AthenaGatewayClient {\r\n return {\r\n baseUrl: (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\"),\r\n buildHeaders(options) {\r\n return buildHeaders(config, options);\r\n },\r\n fetchGateway(payload, options) {\r\n return callAthena(config, \"/gateway/fetch\", \"POST\", payload, options);\r\n },\r\n insertGateway(payload, options) {\r\n return callAthena(config, \"/gateway/insert\", \"PUT\", payload, options);\r\n },\r\n updateGateway(payload, options) {\r\n return callAthena(config, \"/gateway/update\", \"POST\", payload, options);\r\n },\r\n deleteGateway(payload, options) {\r\n return callAthena(config, \"/gateway/delete\", \"DELETE\", payload, options);\r\n },\r\n };\r\n}\r\n","import type {\r\n AthenaConditionArrayValue,\r\n AthenaConditionOperator,\r\n AthenaConditionValue,\r\n AthenaDeletePayload,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayCondition,\r\n AthenaGatewayResponse,\r\n AthenaInsertPayload,\r\n AthenaUpdatePayload,\r\n} from './gateway/types.ts'\r\nimport { createAthenaGatewayClient } from './gateway/client.ts'\r\n\r\nexport interface SupabaseResult<T> {\r\n data: T | null\r\n error: string | null\r\n status: number\r\n raw: unknown\r\n}\r\n\r\ntype TableBuilderState = {\r\n conditions: AthenaGatewayCondition[]\r\n limit?: number\r\n offset?: number\r\n}\r\n\r\ntype MutationSingleResult<Result> = Result extends Array<infer Item> ? Item | null : Result | null\r\nconst DEFAULT_COLUMNS = '*'\r\n\r\nexport interface MutationQuery<Result> extends PromiseLike<SupabaseResult<Result>> {\r\n select(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<Result>>\r\n returning(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<Result>>\r\n single(\r\n columns?: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<SupabaseResult<MutationSingleResult<Result>>>\r\n maybeSingle(\r\n columns?: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<SupabaseResult<MutationSingleResult<Result>>>\r\n then<TResult1 = SupabaseResult<Result>, TResult2 = never>(\r\n onfulfilled?: ((value: SupabaseResult<Result>) => TResult1 | PromiseLike<TResult1>) | undefined | null,\r\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | undefined | null,\r\n ): Promise<TResult1 | TResult2>\r\n catch<TResult = never>(\r\n onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | undefined | null,\r\n ): Promise<SupabaseResult<Result> | TResult>\r\n finally(onfinally?: (() => void) | undefined | null): Promise<SupabaseResult<Result>>\r\n}\r\n\r\nfunction formatResult<T>(response: AthenaGatewayResponse<T>): SupabaseResult<T> {\r\n return {\r\n data: response.data ?? null,\r\n error: response.error ?? null,\r\n status: response.status,\r\n raw: response.raw,\r\n }\r\n}\r\n\r\nfunction toSingleResult<Result>(response: SupabaseResult<Result>): SupabaseResult<MutationSingleResult<Result>> {\r\n const payload = response.data\r\n const singleData =\r\n Array.isArray(payload) ? (payload.length ? payload[0] : null) : payload ?? null\r\n return {\r\n ...response,\r\n data: singleData as MutationSingleResult<Result>,\r\n }\r\n}\r\n\r\nfunction mergeOptions(...options: Array<AthenaGatewayCallOptions | undefined>): AthenaGatewayCallOptions | undefined {\r\n return options.reduce<AthenaGatewayCallOptions | undefined>((acc, next) => {\r\n if (!next) return acc\r\n return { ...acc, ...next }\r\n }, undefined)\r\n}\r\n\r\nfunction createMutationQuery<Result>(\r\n executor: (\r\n columns?: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ) => Promise<SupabaseResult<Result>>,\r\n defaultColumns: string | string[] = DEFAULT_COLUMNS,\r\n): MutationQuery<Result> {\r\n let selectedColumns: string | string[] = defaultColumns\r\n let selectedOptions: AthenaGatewayCallOptions | undefined\r\n let promise: Promise<SupabaseResult<Result>> | null = null\r\n\r\n const run = (columns?: string | string[], options?: AthenaGatewayCallOptions) => {\r\n const payloadColumns = columns ?? selectedColumns\r\n const payloadOptions = options ?? selectedOptions\r\n if (!promise) {\r\n promise = executor(payloadColumns, payloadOptions)\r\n }\r\n return promise\r\n }\r\n\r\n const mutationQuery: MutationQuery<Result> = {\r\n select(columns = selectedColumns, options) {\r\n selectedColumns = columns\r\n selectedOptions = options ?? selectedOptions\r\n return run(columns, options)\r\n },\r\n returning(columns = selectedColumns, options) {\r\n return mutationQuery.select(columns, options)\r\n },\r\n single(columns = selectedColumns, options) {\r\n selectedColumns = columns\r\n selectedOptions = options ?? selectedOptions\r\n return run(columns, options).then(toSingleResult)\r\n },\r\n maybeSingle(columns = selectedColumns, options) {\r\n return mutationQuery.single(columns, options)\r\n },\r\n then(onfulfilled, onrejected) {\r\n return run(selectedColumns, selectedOptions).then(onfulfilled, onrejected)\r\n },\r\n catch(onrejected) {\r\n return run(selectedColumns, selectedOptions).catch(onrejected)\r\n },\r\n finally(onfinally) {\r\n return run(selectedColumns, selectedOptions).finally(onfinally)\r\n },\r\n }\r\n\r\n return mutationQuery\r\n}\r\n\r\nexport interface TableQueryBuilder<Row> {\r\n select<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<T>>\r\n insert(values: Row | Row[], options?: AthenaGatewayCallOptions): MutationQuery<Row | Row[]>\r\n upsert(\r\n values: Row | Row[],\r\n options?: AthenaGatewayCallOptions & {\r\n updateBody?: Partial<Row>\r\n onConflict?: string | string[]\r\n },\r\n ): MutationQuery<Row | Row[]>\r\n update(values: Partial<Row>, options?: AthenaGatewayCallOptions): MutationQuery<Row[]>\r\n delete(options?: AthenaGatewayCallOptions & { resourceId?: string }): MutationQuery<Row | null>\r\n eq(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n match(filters: Record<string, AthenaConditionValue>): TableQueryBuilder<Row>\r\n range(from: number, to: number): TableQueryBuilder<Row>\r\n limit(count: number): TableQueryBuilder<Row>\r\n offset(count: number): TableQueryBuilder<Row>\r\n gt(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n gte(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n lt(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n lte(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n neq(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n like(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n ilike(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n is(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n in(column: string, values: AthenaConditionArrayValue): TableQueryBuilder<Row>\r\n contains(column: string, values: AthenaConditionArrayValue): TableQueryBuilder<Row>\r\n containedBy(column: string, values: AthenaConditionArrayValue): TableQueryBuilder<Row>\r\n not(columnOrExpression: string, operator?: AthenaConditionOperator, value?: AthenaConditionValue): TableQueryBuilder<Row>\r\n or(expression: string): TableQueryBuilder<Row>\r\n single<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<T | null>>\r\n maybeSingle<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<T | null>>\r\n reset(): TableQueryBuilder<Row>\r\n}\r\n\r\nfunction getResourceId(state: TableBuilderState): string | undefined {\r\n const candidate = state.conditions.find(\r\n condition =>\r\n condition.operator === 'eq' &&\r\n (condition.column === 'resource_id' || condition.column === 'id'),\r\n )\r\n return candidate?.value?.toString()\r\n}\r\n\r\nfunction stringifyFilterValue(value: AthenaConditionValue | AthenaConditionArrayValue | string): string {\r\n if (Array.isArray(value)) {\r\n return value.join(',')\r\n }\r\n return String(value)\r\n}\r\n\r\nfunction createTableBuilder<Row>(\r\n tableName: string,\r\n client: ReturnType<typeof createAthenaGatewayClient>,\r\n): TableQueryBuilder<Row> {\r\n const state: TableBuilderState = {\r\n conditions: [],\r\n }\r\n\r\n const addCondition = (\r\n operator: AthenaConditionOperator,\r\n column?: string,\r\n value?: AthenaConditionValue | AthenaConditionArrayValue | string,\r\n ) => {\r\n const condition: AthenaGatewayCondition = { operator }\r\n if (column) condition.column = column\r\n if (value !== undefined) condition.value = value\r\n state.conditions.push(condition)\r\n }\r\n\r\n const builder: TableQueryBuilder<Row> = {\r\n reset() {\r\n state.conditions = []\r\n state.limit = undefined\r\n state.offset = undefined\r\n return builder\r\n },\r\n range(from, to) {\r\n state.offset = from\r\n state.limit = to - from + 1\r\n return builder\r\n },\r\n limit(count) {\r\n state.limit = count\r\n return builder\r\n },\r\n offset(count) {\r\n state.offset = count\r\n return builder\r\n },\r\n match(filters) {\r\n Object.entries(filters).forEach(([column, value]) => {\r\n addCondition('eq', column, value)\r\n })\r\n return builder\r\n },\r\n eq(column, value) {\r\n addCondition('eq', column, value)\r\n return builder\r\n },\r\n gt(column, value) {\r\n addCondition('gt', column, value)\r\n return builder\r\n },\r\n gte(column, value) {\r\n addCondition('gte', column, value)\r\n return builder\r\n },\r\n lt(column, value) {\r\n addCondition('lt', column, value)\r\n return builder\r\n },\r\n lte(column, value) {\r\n addCondition('lte', column, value)\r\n return builder\r\n },\r\n neq(column, value) {\r\n addCondition('neq', column, value)\r\n return builder\r\n },\r\n like(column, value) {\r\n addCondition('like', column, value)\r\n return builder\r\n },\r\n ilike(column, value) {\r\n addCondition('ilike', column, value)\r\n return builder\r\n },\r\n is(column, value) {\r\n addCondition('is', column, value)\r\n return builder\r\n },\r\n in(column, values) {\r\n addCondition('in', column, values)\r\n return builder\r\n },\r\n contains(column, values) {\r\n addCondition('contains', column, values)\r\n return builder\r\n },\r\n containedBy(column, values) {\r\n addCondition('containedBy', column, values)\r\n return builder\r\n },\r\n not(columnOrExpression, operator, value) {\r\n if (operator && value !== undefined) {\r\n addCondition('not', undefined, `${columnOrExpression}.${operator}.${stringifyFilterValue(value)}`)\r\n } else {\r\n addCondition('not', undefined, columnOrExpression)\r\n }\r\n return builder\r\n },\r\n or(expression) {\r\n addCondition('or', undefined, expression)\r\n return builder\r\n },\r\n async select<T = Row>(columns: string | string[] = DEFAULT_COLUMNS, options?: AthenaGatewayCallOptions) {\r\n const payload = {\r\n table_name: tableName,\r\n columns,\r\n conditions: state.conditions.length ? [...state.conditions] : undefined,\r\n limit: state.limit,\r\n offset: state.offset,\r\n strip_nulls: options?.stripNulls ?? true,\r\n }\r\n const response = await client.fetchGateway<T>(payload, options)\r\n return formatResult(response)\r\n },\r\n insert(values, options) {\r\n const executeInsert = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaInsertPayload = {\r\n table_name: tableName,\r\n insert_body: values as Record<string, unknown> | Record<string, unknown>[],\r\n }\r\n if (columns) payload.columns = columns\r\n if (mergedOptions?.count) payload.count = mergedOptions.count\r\n if (mergedOptions?.head) payload.head = mergedOptions.head\r\n if (mergedOptions?.defaultToNull !== undefined) {\r\n payload.default_to_null = mergedOptions.defaultToNull\r\n }\r\n const response = await client.insertGateway<Row | Row[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row | Row[]>(executeInsert)\r\n },\r\n upsert(values, options) {\r\n const executeUpsert = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaInsertPayload = {\r\n table_name: tableName,\r\n insert_body: values as Record<string, unknown> | Record<string, unknown>[],\r\n update_body: options?.updateBody ? (options.updateBody as Record<string, unknown>) : undefined,\r\n }\r\n if (columns) payload.columns = columns\r\n if (options?.onConflict) payload.on_conflict = options.onConflict\r\n if (mergedOptions?.count) payload.count = mergedOptions.count\r\n if (mergedOptions?.head) payload.head = mergedOptions.head\r\n if (mergedOptions?.defaultToNull !== undefined) {\r\n payload.default_to_null = mergedOptions.defaultToNull\r\n }\r\n const response = await client.insertGateway<Row | Row[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row | Row[]>(executeUpsert)\r\n },\r\n update(values, options) {\r\n const filters = state.conditions.length ? [...state.conditions] : undefined\r\n const executeUpdate = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaUpdatePayload = {\r\n table_name: tableName,\r\n update_body: values,\r\n conditions: filters,\r\n columns,\r\n strip_nulls: mergedOptions?.stripNulls ?? true,\r\n }\r\n const response = await client.updateGateway<Row[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row[]>(executeUpdate)\r\n },\r\n delete(options) {\r\n const filters = state.conditions.length ? [...state.conditions] : undefined\r\n const resourceId = options?.resourceId ?? getResourceId(state)\r\n if (!resourceId && !filters?.length) {\r\n throw new Error('delete requires a resource_id either via eq(\"resource_id\", ...) or options.resourceId')\r\n }\r\n const executeDelete = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaDeletePayload = {\r\n table_name: tableName,\r\n resource_id: resourceId,\r\n conditions: filters,\r\n columns,\r\n }\r\n const response = await client.deleteGateway<Row | null>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row | null>(executeDelete)\r\n },\r\n async single<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions) {\r\n const response = await builder.select<T[]>(columns, options)\r\n return toSingleResult(response)\r\n },\r\n async maybeSingle<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions) {\r\n return builder.single<T>(columns, options)\r\n },\r\n }\r\n\r\n return builder\r\n}\r\n\r\nexport interface SupabaseClient {\r\n from<Row = unknown>(table: string): TableQueryBuilder<Row>\r\n}\r\n\r\nexport function createClient(\r\n url: string,\r\n apiKey: string,\r\n options?: AthenaGatewayCallOptions,\r\n): SupabaseClient {\r\n const { baseUrl: optBaseUrl, apiKey: optApiKey, ...restOptions } = options ?? {}\r\n const client = createAthenaGatewayClient({\r\n baseUrl: optBaseUrl ?? url,\r\n apiKey: optApiKey ?? apiKey,\r\n ...restOptions,\r\n })\r\n\r\n return {\r\n from<Row = unknown>(table: string) {\r\n return createTableBuilder<Row>(table, client)\r\n },\r\n }\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/gateway/client.ts","../src/supabase.ts"],"names":[],"mappings":";;;AAcA,IAAM,gBAAA,GAAmB,uBAAA;AACzB,IAAM,cAAA,GAAiB,gBAAA;AAEvB,SAAS,kBAAkB,IAAA,EAAc;AACvC,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACxB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,qBAAqB,KAAA,EAAuB;AACnD,EAAA,OAAO,QAAQ,KAAA,GAAQ,MAAA;AACzB;AAEA,SAAS,YAAA,CACP,QACA,OAAA,EACwB;AACxB,EAAA,MAAM,gBAAA,GAAmB,OAAA,EAAS,UAAA,IAAc,MAAA,CAAO,UAAA,IAAc,IAAA;AACrE,EAAA,MAAM,WAAA,GAAc,OAAA,EAAS,MAAA,IAAU,MAAA,CAAO,MAAA,IAAU,cAAA;AACxD,EAAA,MAAM,WAAA,GAAc,OAAA,EAAS,MAAA,IAAU,MAAA,CAAO,MAAA;AAC9C,EAAA,MAAM,gBAAA,GAAmB,OAAA,EAAS,WAAA,IAAe,MAAA,CAAO,WAAA;AACxD,EAAA,MAAM,gBAAA,GAAmB,OAAA,EAAS,WAAA,IAAe,MAAA,CAAO,WAAA;AACxD,EAAA,MAAM,iBAAA,GAAoB,OAAA,EAAS,YAAA,IAAgB,MAAA,CAAO,YAAA;AAC1D,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,GAAI,MAAA,CAAO,OAAA,IAAW,EAAC;AAAA,IACvB,GAAI,OAAA,EAAS,OAAA,IAAW;AAAC,GAC3B;AAEA,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,cAAA,EAAgB;AAAA,GAClB;AAEA,EAAA,IAAI,OAAA,EAAS,MAAA,IAAU,MAAA,CAAO,MAAA,EAAQ;AACpC,IAAA,OAAA,CAAQ,WAAW,CAAA,GAAI,OAAA,EAAS,MAAA,IAAU,OAAO,MAAA,IAAU,EAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,OAAA,EAAS,SAAA,IAAa,MAAA,CAAO,SAAA,EAAW;AAC1C,IAAA,OAAA,CAAQ,cAAc,CAAA,GAAI,OAAA,EAAS,SAAA,IAAa,OAAO,SAAA,IAAa,EAAA;AAAA,EACtE;AAEA,EAAA,IAAI,OAAA,EAAS,cAAA,IAAkB,MAAA,CAAO,cAAA,EAAgB;AACpD,IAAA,OAAA,CAAQ,mBAAmB,CAAA,GACzB,OAAA,EAAS,cAAA,IAAkB,OAAO,cAAA,IAAkB,EAAA;AAAA,EACxD;AAEA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAA,CAAQ,iBAAiB,CAAA,GAAI,WAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,OAAO,qBAAqB,SAAA,EAAW;AACzC,IAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,gBAAA,GAAmB,MAAA,GAAS,OAAA;AAAA,EACzD;AAEA,EAAA,IAAI,iBAAA,EAAmB;AACrB,IAAA,OAAA,CAAQ,iBAAiB,CAAA,GAAI,iBAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAA,CAAQ,QAAQ,CAAA,GAAI,WAAA;AACpB,IAAA,OAAA,CAAQ,WAAW,CAAA,GAAI,OAAA,CAAQ,WAAW,CAAA,IAAK,WAAA;AAAA,EACjD;AAEA,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,OAAA,CAAQ,gBAAgB,CAAA,GAAI,gBAAA;AAAA,EAC9B;AAEA,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,OAAA,CAAQ,gBAAgB,CAAA,GAAI,gBAAA;AAAA,EAC9B;AAEA,EAAA,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACrD,IAAA,MAAM,UAAA,GAAa,qBAAqB,KAAK,CAAA;AAC7C,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,UAAA;AAAA,IACjB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,OAAA;AACT;AAEA,eAAe,UAAA,CACb,MAAA,EACA,QAAA,EACA,MAAA,EACA,SACA,OAAA,EACmC;AACnC,EAAA,MAAM,OAAA,GAAA,CACJ,SAAS,OAAA,IACT,MAAA,CAAO,WACP,gBAAA,EACA,OAAA,CAAQ,OAAO,EAAE,CAAA;AACnB,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA;AACjC,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,MAAA,EAAQ,OAAO,CAAA;AAE5C,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,MAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,KAC7B,CAAA;AAED,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAK;AACpC,IAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,OAAA,IAAW,EAAE,CAAA;AAC9C,IAAA,MAAM,aAAA,GAAgB,MAAA;AACtB,IAAA,MAAM,WAAA,GACJ,iBAAiB,OAAO,aAAA,KAAkB,WACpC,aAAA,CAAc,KAAA,IACf,cAAc,OAAA,GACf,KAAA,CAAA;AACN,IAAA,MAAM,WACJ,OAAO,WAAA,KAAgB,YAAY,WAAA,CAAY,MAAA,GAAS,IACpD,WAAA,GACA,KAAA,CAAA;AAIN,IAAA,MAAM,WAAA,GACJ,iBACA,OAAO,aAAA,KAAkB,YACzB,MAAA,IAAU,aAAA,GACL,cAAc,IAAA,GACd,MAAA;AAEP,IAAA,OAAO;AAAA,MACL,IAAI,QAAA,CAAS,EAAA;AAAA,MACb,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,MAAM,WAAA,IAAe,IAAA;AAAA,MACrB,KAAA,EAAO,QAAA;AAAA,MACP,GAAA,EAAK;AAAA,KACP;AAAA,EACF,SAAS,SAAA,EAAW;AAClB,IAAA,MAAM,UACJ,SAAA,YAAqB,KAAA,GAAQ,SAAA,CAAU,OAAA,GAAU,OAAO,SAAS,CAAA;AACnE,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,CAAA;AAAA,MACR,IAAA,EAAM,IAAA;AAAA,MACN,KAAA,EAAO,OAAA;AAAA,MACP,GAAA,EAAK;AAAA,KACP;AAAA,EACF;AACF;AAuBO,SAAS,yBAAA,CACd,MAAA,GAAmC,EAAC,EACf;AACrB,EAAA,OAAO;AAAA,IACL,UAAU,MAAA,CAAO,OAAA,IAAW,gBAAA,EAAkB,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,IAC/D,aAAa,OAAA,EAAS;AACpB,MAAA,OAAO,YAAA,CAAa,QAAQ,OAAO,CAAA;AAAA,IACrC,CAAA;AAAA,IACA,YAAA,CAAa,SAAS,OAAA,EAAS;AAC7B,MAAA,OAAO,UAAA,CAAW,MAAA,EAAQ,gBAAA,EAAkB,MAAA,EAAQ,SAAS,OAAO,CAAA;AAAA,IACtE,CAAA;AAAA,IACA,aAAA,CAAc,SAAS,OAAA,EAAS;AAC9B,MAAA,OAAO,UAAA,CAAW,MAAA,EAAQ,iBAAA,EAAmB,KAAA,EAAO,SAAS,OAAO,CAAA;AAAA,IACtE,CAAA;AAAA,IACA,aAAA,CAAc,SAAS,OAAA,EAAS;AAC9B,MAAA,OAAO,UAAA,CAAW,MAAA,EAAQ,iBAAA,EAAmB,MAAA,EAAQ,SAAS,OAAO,CAAA;AAAA,IACvE,CAAA;AAAA,IACA,aAAA,CAAc,SAAS,OAAA,EAAS;AAC9B,MAAA,OAAO,UAAA,CAAW,MAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAU,SAAS,OAAO,CAAA;AAAA,IACzE;AAAA,GACF;AACF;;;AChLA,IAAM,eAAA,GAAkB,GAAA;AAuBxB,SAAS,aAAgB,QAAA,EAAuD;AAC9E,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,SAAS,IAAA,IAAQ,IAAA;AAAA,IACvB,KAAA,EAAO,SAAS,KAAA,IAAS,IAAA;AAAA,IACzB,QAAQ,QAAA,CAAS,MAAA;AAAA,IACjB,KAAK,QAAA,CAAS;AAAA,GAChB;AACF;AAEA,SAAS,eAAuB,QAAA,EAAgF;AAC9G,EAAA,MAAM,UAAU,QAAA,CAAS,IAAA;AACzB,EAAA,MAAM,UAAA,GACJ,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAAK,OAAA,CAAQ,MAAA,GAAS,OAAA,CAAQ,CAAC,CAAA,GAAI,IAAA,GAAQ,OAAA,IAAW,IAAA;AAC7E,EAAA,OAAO;AAAA,IACL,GAAG,QAAA;AAAA,IACH,IAAA,EAAM;AAAA,GACR;AACF;AAEA,SAAS,gBAAgB,OAAA,EAA4F;AACnH,EAAA,OAAO,OAAA,CAAQ,MAAA,CAA6C,CAAC,GAAA,EAAK,IAAA,KAAS;AACzE,IAAA,IAAI,CAAC,MAAM,OAAO,GAAA;AAClB,IAAA,OAAO,EAAE,GAAG,GAAA,EAAK,GAAG,IAAA,EAAK;AAAA,EAC3B,GAAG,MAAS,CAAA;AACd;AAEA,SAAS,mBAAA,CACP,QAAA,EAIA,cAAA,GAAoC,eAAA,EACb;AACvB,EAAA,IAAI,eAAA,GAAqC,cAAA;AACzC,EAAA,IAAI,eAAA;AACJ,EAAA,IAAI,OAAA,GAAkD,IAAA;AAEtD,EAAA,MAAM,GAAA,GAAM,CAAC,OAAA,EAA6B,OAAA,KAAuC;AAC/E,IAAA,MAAM,iBAAiB,OAAA,IAAW,eAAA;AAClC,IAAA,MAAM,iBAAiB,OAAA,IAAW,eAAA;AAClC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAA,GAAU,QAAA,CAAS,gBAAgB,cAAc,CAAA;AAAA,IACnD;AACA,IAAA,OAAO,OAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,aAAA,GAAuC;AAAA,IAC3C,MAAA,CAAO,OAAA,GAAU,eAAA,EAAiB,OAAA,EAAS;AACzC,MAAA,eAAA,GAAkB,OAAA;AAClB,MAAA,eAAA,GAAkB,OAAA,IAAW,eAAA;AAC7B,MAAA,OAAO,GAAA,CAAI,SAAS,OAAO,CAAA;AAAA,IAC7B,CAAA;AAAA,IACA,SAAA,CAAU,OAAA,GAAU,eAAA,EAAiB,OAAA,EAAS;AAC5C,MAAA,OAAO,aAAA,CAAc,MAAA,CAAO,OAAA,EAAS,OAAO,CAAA;AAAA,IAC9C,CAAA;AAAA,IACA,MAAA,CAAO,OAAA,GAAU,eAAA,EAAiB,OAAA,EAAS;AACzC,MAAA,eAAA,GAAkB,OAAA;AAClB,MAAA,eAAA,GAAkB,OAAA,IAAW,eAAA;AAC7B,MAAA,OAAO,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA,CAAE,KAAK,cAAc,CAAA;AAAA,IAClD,CAAA;AAAA,IACA,WAAA,CAAY,OAAA,GAAU,eAAA,EAAiB,OAAA,EAAS;AAC9C,MAAA,OAAO,aAAA,CAAc,MAAA,CAAO,OAAA,EAAS,OAAO,CAAA;AAAA,IAC9C,CAAA;AAAA,IACA,IAAA,CAAK,aAAa,UAAA,EAAY;AAC5B,MAAA,OAAO,IAAI,eAAA,EAAiB,eAAe,CAAA,CAAE,IAAA,CAAK,aAAa,UAAU,CAAA;AAAA,IAC3E,CAAA;AAAA,IACA,MAAM,UAAA,EAAY;AAChB,MAAA,OAAO,GAAA,CAAI,eAAA,EAAiB,eAAe,CAAA,CAAE,MAAM,UAAU,CAAA;AAAA,IAC/D,CAAA;AAAA,IACA,QAAQ,SAAA,EAAW;AACjB,MAAA,OAAO,GAAA,CAAI,eAAA,EAAiB,eAAe,CAAA,CAAE,QAAQ,SAAS,CAAA;AAAA,IAChE;AAAA,GACF;AAEA,EAAA,OAAO,aAAA;AACT;AAqCA,SAAS,cAAc,KAAA,EAA8C;AACnE,EAAA,MAAM,SAAA,GAAY,MAAM,UAAA,CAAW,IAAA;AAAA,IACjC,CAAA,SAAA,KACE,UAAU,QAAA,KAAa,IAAA,KACtB,UAAU,MAAA,KAAW,aAAA,IAAiB,UAAU,MAAA,KAAW,IAAA;AAAA,GAChE;AACA,EAAA,OAAO,SAAA,EAAW,OAAO,QAAA,EAAS;AACpC;AAEA,SAAS,qBAAqB,KAAA,EAA0E;AACtG,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,EACvB;AACA,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAEA,SAAS,kBAAA,CACP,WACA,MAAA,EACwB;AACxB,EAAA,MAAM,KAAA,GAA2B;AAAA,IAC/B,YAAY;AAAC,GACf;AAEA,EAAA,MAAM,YAAA,GAAe,CACnB,QAAA,EACA,MAAA,EACA,KAAA,KACG;AACH,IAAA,MAAM,SAAA,GAAoC,EAAE,QAAA,EAAS;AACrD,IAAA,IAAI,MAAA,YAAkB,MAAA,GAAS,MAAA;AAC/B,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,SAAA,CAAU,KAAA,GAAQ,KAAA;AAC3C,IAAA,KAAA,CAAM,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,EACjC,CAAA;AAEA,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,KAAA,GAAQ;AACN,MAAA,KAAA,CAAM,aAAa,EAAC;AACpB,MAAA,KAAA,CAAM,KAAA,GAAQ,MAAA;AACd,MAAA,KAAA,CAAM,MAAA,GAAS,MAAA;AACf,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,KAAA,CAAM,MAAM,EAAA,EAAI;AACd,MAAA,KAAA,CAAM,MAAA,GAAS,IAAA;AACf,MAAA,KAAA,CAAM,KAAA,GAAQ,KAAK,IAAA,GAAO,CAAA;AAC1B,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,MAAM,KAAA,EAAO;AACX,MAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AACd,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,OAAO,KAAA,EAAO;AACZ,MAAA,KAAA,CAAM,MAAA,GAAS,KAAA;AACf,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,MAAM,OAAA,EAAS;AACb,MAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,MAAA,EAAQ,KAAK,CAAA,KAAM;AACnD,QAAA,YAAA,CAAa,IAAA,EAAM,QAAQ,KAAK,CAAA;AAAA,MAClC,CAAC,CAAA;AACD,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,EAAA,CAAG,QAAQ,KAAA,EAAO;AAChB,MAAA,YAAA,CAAa,IAAA,EAAM,QAAQ,KAAK,CAAA;AAChC,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,EAAA,CAAG,QAAQ,KAAA,EAAO;AAChB,MAAA,YAAA,CAAa,IAAA,EAAM,QAAQ,KAAK,CAAA;AAChC,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,GAAA,CAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,YAAA,CAAa,KAAA,EAAO,QAAQ,KAAK,CAAA;AACjC,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,EAAA,CAAG,QAAQ,KAAA,EAAO;AAChB,MAAA,YAAA,CAAa,IAAA,EAAM,QAAQ,KAAK,CAAA;AAChC,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,GAAA,CAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,YAAA,CAAa,KAAA,EAAO,QAAQ,KAAK,CAAA;AACjC,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,GAAA,CAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,YAAA,CAAa,KAAA,EAAO,QAAQ,KAAK,CAAA;AACjC,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,IAAA,CAAK,QAAQ,KAAA,EAAO;AAClB,MAAA,YAAA,CAAa,MAAA,EAAQ,QAAQ,KAAK,CAAA;AAClC,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,KAAA,CAAM,QAAQ,KAAA,EAAO;AACnB,MAAA,YAAA,CAAa,OAAA,EAAS,QAAQ,KAAK,CAAA;AACnC,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,EAAA,CAAG,QAAQ,KAAA,EAAO;AAChB,MAAA,YAAA,CAAa,IAAA,EAAM,QAAQ,KAAK,CAAA;AAChC,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,EAAA,CAAG,QAAQ,MAAA,EAAQ;AACjB,MAAA,YAAA,CAAa,IAAA,EAAM,QAAQ,MAAM,CAAA;AACjC,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,QAAA,CAAS,QAAQ,MAAA,EAAQ;AACvB,MAAA,YAAA,CAAa,UAAA,EAAY,QAAQ,MAAM,CAAA;AACvC,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,WAAA,CAAY,QAAQ,MAAA,EAAQ;AAC1B,MAAA,YAAA,CAAa,aAAA,EAAe,QAAQ,MAAM,CAAA;AAC1C,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,GAAA,CAAI,kBAAA,EAAoB,QAAA,EAAU,KAAA,EAAO;AACvC,MAAA,IAAI,QAAA,IAAY,UAAU,MAAA,EAAW;AACnC,QAAA,YAAA,CAAa,KAAA,EAAO,MAAA,EAAW,CAAA,EAAG,kBAAkB,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,oBAAA,CAAqB,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,MACnG,CAAA,MAAO;AACL,QAAA,YAAA,CAAa,KAAA,EAAO,QAAW,kBAAkB,CAAA;AAAA,MACnD;AACA,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,GAAG,UAAA,EAAY;AACb,MAAA,YAAA,CAAa,IAAA,EAAM,QAAW,UAAU,CAAA;AACxC,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,MAAM,MAAA,CAAgB,OAAA,GAA6B,eAAA,EAAiB,OAAA,EAAoC;AACtG,MAAA,MAAM,OAAA,GAAU;AAAA,QACd,UAAA,EAAY,SAAA;AAAA,QACZ,OAAA;AAAA,QACA,UAAA,EAAY,MAAM,UAAA,CAAW,MAAA,GAAS,CAAC,GAAG,KAAA,CAAM,UAAU,CAAA,GAAI,MAAA;AAAA,QAC9D,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,WAAA,EAAa,SAAS,UAAA,IAAc,IAAA;AAAA,QACpC,OAAO,OAAA,EAAS,KAAA;AAAA,QAChB,MAAM,OAAA,EAAS;AAAA,OACjB;AACA,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,YAAA,CAAgB,SAAS,OAAO,CAAA;AAC9D,MAAA,OAAO,aAAa,QAAQ,CAAA;AAAA,IAC9B,CAAA;AAAA,IACA,MAAA,CAAO,QAAQ,OAAA,EAAS;AACtB,MAAA,MAAM,aAAA,GAAgB,OACpB,OAAA,EACA,aAAA,KACG;AACH,QAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,OAAA,EAAS,aAAa,CAAA;AACzD,QAAA,MAAM,OAAA,GAA+B;AAAA,UACnC,UAAA,EAAY,SAAA;AAAA,UACZ,WAAA,EAAa;AAAA,SACf;AACA,QAAA,IAAI,OAAA,UAAiB,OAAA,GAAU,OAAA;AAC/B,QAAA,IAAI,aAAA,EAAe,KAAA,EAAO,OAAA,CAAQ,KAAA,GAAQ,aAAA,CAAc,KAAA;AACxD,QAAA,IAAI,aAAA,EAAe,IAAA,EAAM,OAAA,CAAQ,IAAA,GAAO,aAAA,CAAc,IAAA;AACtD,QAAA,IAAI,aAAA,EAAe,kBAAkB,MAAA,EAAW;AAC9C,UAAA,OAAA,CAAQ,kBAAkB,aAAA,CAAc,aAAA;AAAA,QAC1C;AACA,QAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,aAAA,CAA2B,SAAS,aAAa,CAAA;AAC/E,QAAA,OAAO,aAAa,QAAQ,CAAA;AAAA,MAC9B,CAAA;AACA,MAAA,OAAO,oBAAiC,aAAa,CAAA;AAAA,IACvD,CAAA;AAAA,IACA,MAAA,CAAO,QAAQ,OAAA,EAAS;AACtB,MAAA,MAAM,aAAA,GAAgB,OACpB,OAAA,EACA,aAAA,KACG;AACH,QAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,OAAA,EAAS,aAAa,CAAA;AACzD,QAAA,MAAM,OAAA,GAA+B;AAAA,UACnC,UAAA,EAAY,SAAA;AAAA,UACZ,WAAA,EAAa,MAAA;AAAA,UACb,WAAA,EAAa,OAAA,EAAS,UAAA,GAAc,OAAA,CAAQ,UAAA,GAAyC;AAAA,SACvF;AACA,QAAA,IAAI,OAAA,UAAiB,OAAA,GAAU,OAAA;AAC/B,QAAA,IAAI,OAAA,EAAS,UAAA,EAAY,OAAA,CAAQ,WAAA,GAAc,OAAA,CAAQ,UAAA;AACvD,QAAA,IAAI,aAAA,EAAe,KAAA,EAAO,OAAA,CAAQ,KAAA,GAAQ,aAAA,CAAc,KAAA;AACxD,QAAA,IAAI,aAAA,EAAe,IAAA,EAAM,OAAA,CAAQ,IAAA,GAAO,aAAA,CAAc,IAAA;AACtD,QAAA,IAAI,aAAA,EAAe,kBAAkB,MAAA,EAAW;AAC9C,UAAA,OAAA,CAAQ,kBAAkB,aAAA,CAAc,aAAA;AAAA,QAC1C;AACA,QAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,aAAA,CAA2B,SAAS,aAAa,CAAA;AAC/E,QAAA,OAAO,aAAa,QAAQ,CAAA;AAAA,MAC9B,CAAA;AACA,MAAA,OAAO,oBAAiC,aAAa,CAAA;AAAA,IACvD,CAAA;AAAA,IACA,MAAA,CAAO,QAAQ,OAAA,EAAS;AACtB,MAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,MAAA,GAAS,CAAC,GAAG,KAAA,CAAM,UAAU,CAAA,GAAI,MAAA;AAClE,MAAA,MAAM,aAAA,GAAgB,OACpB,OAAA,EACA,aAAA,KACG;AACH,QAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,OAAA,EAAS,aAAa,CAAA;AACzD,QAAA,MAAM,OAAA,GAA+B;AAAA,UACnC,UAAA,EAAY,SAAA;AAAA,UACZ,WAAA,EAAa,MAAA;AAAA,UACb,UAAA,EAAY,OAAA;AAAA,UACZ,OAAA;AAAA,UACA,WAAA,EAAa,eAAe,UAAA,IAAc;AAAA,SAC5C;AACA,QAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,aAAA,CAAqB,SAAS,aAAa,CAAA;AACzE,QAAA,OAAO,aAAa,QAAQ,CAAA;AAAA,MAC9B,CAAA;AACA,MAAA,OAAO,oBAA2B,aAAa,CAAA;AAAA,IACjD,CAAA;AAAA,IACA,OAAO,OAAA,EAAS;AACd,MAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,MAAA,GAAS,CAAC,GAAG,KAAA,CAAM,UAAU,CAAA,GAAI,MAAA;AAClE,MAAA,MAAM,UAAA,GAAa,OAAA,EAAS,UAAA,IAAc,aAAA,CAAc,KAAK,CAAA;AAC7D,MAAA,IAAI,CAAC,UAAA,IAAc,CAAC,OAAA,EAAS,MAAA,EAAQ;AACnC,QAAA,MAAM,IAAI,MAAM,uFAAuF,CAAA;AAAA,MACzG;AACA,MAAA,MAAM,aAAA,GAAgB,OACpB,OAAA,EACA,aAAA,KACG;AACH,QAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,OAAA,EAAS,aAAa,CAAA;AACzD,QAAA,MAAM,OAAA,GAA+B;AAAA,UACnC,UAAA,EAAY,SAAA;AAAA,UACZ,WAAA,EAAa,UAAA;AAAA,UACb,UAAA,EAAY,OAAA;AAAA,UACZ;AAAA,SACF;AACA,QAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,aAAA,CAA0B,SAAS,aAAa,CAAA;AAC9E,QAAA,OAAO,aAAa,QAAQ,CAAA;AAAA,MAC9B,CAAA;AACA,MAAA,OAAO,oBAAgC,aAAa,CAAA;AAAA,IACtD,CAAA;AAAA,IACA,MAAM,MAAA,CAAgB,OAAA,EAA6B,OAAA,EAAoC;AACrF,MAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,MAAA,CAAY,SAAS,OAAO,CAAA;AAC3D,MAAA,OAAO,eAAe,QAAQ,CAAA;AAAA,IAChC,CAAA;AAAA,IACA,MAAM,WAAA,CAAqB,OAAA,EAA6B,OAAA,EAAoC;AAC1F,MAAA,OAAO,OAAA,CAAQ,MAAA,CAAU,OAAA,EAAS,OAAO,CAAA;AAAA,IAC3C;AAAA,GACF;AAEA,EAAA,OAAO,OAAA;AACT;AAMO,SAAS,YAAA,CACd,GAAA,EACA,MAAA,EACA,OAAA,EACgB;AAChB,EAAA,MAAM,EAAE,SAAS,UAAA,EAAY,MAAA,EAAQ,WAAW,GAAG,WAAA,EAAY,GAAI,OAAA,IAAW,EAAC;AAC/E,EAAA,MAAM,SAAS,yBAAA,CAA0B;AAAA,IACvC,SAAS,UAAA,IAAc,GAAA;AAAA,IACvB,QAAQ,SAAA,IAAa,MAAA;AAAA,IACrB,GAAG;AAAA,GACJ,CAAA;AAED,EAAA,OAAO;AAAA,IACL,KAAoB,KAAA,EAAe;AACjC,MAAA,OAAO,kBAAA,CAAwB,OAAO,MAAM,CAAA;AAAA,IAC9C;AAAA,GACF;AACF","file":"index.js","sourcesContent":["import type {\r\n AthenaGatewayBaseOptions,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayEndpointPath,\r\n AthenaGatewayMethod,\r\n AthenaGatewayResponse,\r\n} from \"./types.js\";\r\nimport type {\r\n AthenaDeletePayload,\r\n AthenaFetchPayload,\r\n AthenaInsertPayload,\r\n AthenaUpdatePayload,\r\n} from \"./types.js\";\r\n\r\nconst DEFAULT_BASE_URL = \"https://athena-db.com\";\r\nconst DEFAULT_CLIENT = \"railway_direct\";\r\n\r\nfunction parseResponseText(text: string) {\r\n if (!text) return null;\r\n try {\r\n return JSON.parse(text);\r\n } catch {\r\n return text;\r\n }\r\n}\r\n\r\nfunction normalizeHeaderValue(value?: string | null) {\r\n return value ? value : undefined;\r\n}\r\n\r\nfunction buildHeaders(\r\n config: AthenaGatewayBaseOptions,\r\n options?: AthenaGatewayCallOptions,\r\n): Record<string, string> {\r\n const mergedStripNulls = options?.stripNulls ?? config.stripNulls ?? true;\r\n const finalClient = options?.client ?? config.client ?? DEFAULT_CLIENT;\r\n const finalApiKey = options?.apiKey ?? config.apiKey;\r\n const finalSupabaseUrl = options?.supabaseUrl ?? config.supabaseUrl;\r\n const finalSupabaseKey = options?.supabaseKey ?? config.supabaseKey;\r\n const finalPublishEvent = options?.publishEvent ?? config.publishEvent;\r\n const extraHeaders = {\r\n ...(config.headers ?? {}),\r\n ...(options?.headers ?? {}),\r\n };\r\n\r\n const headers: Record<string, string> = {\r\n \"Content-Type\": \"application/json\",\r\n };\r\n\r\n if (options?.userId ?? config.userId) {\r\n headers[\"X-User-Id\"] = options?.userId ?? config.userId ?? \"\";\r\n }\r\n\r\n if (options?.companyId ?? config.companyId) {\r\n headers[\"X-Company-Id\"] = options?.companyId ?? config.companyId ?? \"\";\r\n }\r\n\r\n if (options?.organizationId ?? config.organizationId) {\r\n headers[\"X-Organization-Id\"] =\r\n options?.organizationId ?? config.organizationId ?? \"\";\r\n }\r\n\r\n if (finalClient) {\r\n headers[\"X-Athena-Client\"] = finalClient;\r\n }\r\n\r\n if (typeof mergedStripNulls === \"boolean\") {\r\n headers[\"X-Strip-Nulls\"] = mergedStripNulls ? \"true\" : \"false\";\r\n }\r\n\r\n if (finalPublishEvent) {\r\n headers[\"X-Publish-Event\"] = finalPublishEvent;\r\n }\r\n\r\n if (finalApiKey) {\r\n headers[\"apikey\"] = finalApiKey;\r\n headers[\"x-api-key\"] = headers[\"x-api-key\"] ?? finalApiKey;\r\n }\r\n\r\n if (finalSupabaseUrl) {\r\n headers[\"x-supabase-url\"] = finalSupabaseUrl;\r\n }\r\n\r\n if (finalSupabaseKey) {\r\n headers[\"x-supabase-key\"] = finalSupabaseKey;\r\n }\r\n\r\n Object.entries(extraHeaders).forEach(([key, value]) => {\r\n const normalized = normalizeHeaderValue(value);\r\n if (normalized) {\r\n headers[key] = normalized;\r\n }\r\n });\r\n\r\n return headers;\r\n}\r\n\r\nasync function callAthena<T>(\r\n config: AthenaGatewayBaseOptions,\r\n endpoint: AthenaGatewayEndpointPath,\r\n method: AthenaGatewayMethod,\r\n payload: unknown,\r\n options?: AthenaGatewayCallOptions,\r\n): Promise<AthenaGatewayResponse<T>> {\r\n const baseUrl = (\r\n options?.baseUrl ??\r\n config.baseUrl ??\r\n DEFAULT_BASE_URL\r\n ).replace(/\\/$/, \"\");\r\n const url = `${baseUrl}${endpoint}`;\r\n const headers = buildHeaders(config, options);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method,\r\n headers,\r\n body: JSON.stringify(payload),\r\n });\r\n\r\n const rawText = await response.text();\r\n const parsed = parseResponseText(rawText ?? \"\");\r\n const parsedPayload = parsed as Record<string, unknown> | null;\r\n const parsedError =\r\n parsedPayload && typeof parsedPayload === \"object\"\r\n ? ((parsedPayload.error as string | undefined) ??\r\n (parsedPayload.message as string | undefined))\r\n : undefined;\r\n const hasError =\r\n typeof parsedError === \"string\" && parsedError.length > 0\r\n ? parsedError\r\n : undefined;\r\n\r\n // Unwrap envelope: API may return { data: [...], error: null } (e.g. when cached)\r\n // vs raw array when uncached. Use inner data when present to avoid double nesting.\r\n const payloadData =\r\n parsedPayload &&\r\n typeof parsedPayload === \"object\" &&\r\n \"data\" in parsedPayload\r\n ? (parsedPayload.data as T)\r\n : (parsed as T);\r\n\r\n return {\r\n ok: response.ok,\r\n status: response.status,\r\n data: payloadData ?? null,\r\n error: hasError,\r\n raw: parsed,\r\n };\r\n } catch (callError) {\r\n const message =\r\n callError instanceof Error ? callError.message : String(callError);\r\n return {\r\n ok: false,\r\n status: 0,\r\n data: null,\r\n error: message,\r\n raw: null,\r\n };\r\n }\r\n}\r\n\r\nexport interface AthenaGatewayClient {\r\n baseUrl: string;\r\n buildHeaders(options?: AthenaGatewayCallOptions): Record<string, string>;\r\n fetchGateway<T>(\r\n payload: AthenaFetchPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n insertGateway<T>(\r\n payload: AthenaInsertPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n updateGateway<T>(\r\n payload: AthenaUpdatePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n deleteGateway<T>(\r\n payload: AthenaDeletePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n}\r\n\r\nexport function createAthenaGatewayClient(\r\n config: AthenaGatewayBaseOptions = {},\r\n): AthenaGatewayClient {\r\n return {\r\n baseUrl: (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\"),\r\n buildHeaders(options) {\r\n return buildHeaders(config, options);\r\n },\r\n fetchGateway(payload, options) {\r\n return callAthena(config, \"/gateway/fetch\", \"POST\", payload, options);\r\n },\r\n insertGateway(payload, options) {\r\n return callAthena(config, \"/gateway/insert\", \"PUT\", payload, options);\r\n },\r\n updateGateway(payload, options) {\r\n return callAthena(config, \"/gateway/update\", \"POST\", payload, options);\r\n },\r\n deleteGateway(payload, options) {\r\n return callAthena(config, \"/gateway/delete\", \"DELETE\", payload, options);\r\n },\r\n };\r\n}\r\n","import type {\r\n AthenaConditionArrayValue,\r\n AthenaConditionOperator,\r\n AthenaConditionValue,\r\n AthenaDeletePayload,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayCondition,\r\n AthenaGatewayResponse,\r\n AthenaInsertPayload,\r\n AthenaUpdatePayload,\r\n} from './gateway/types.ts'\r\nimport { createAthenaGatewayClient } from './gateway/client.ts'\r\n\r\nexport interface SupabaseResult<T> {\r\n data: T | null\r\n error: string | null\r\n status: number\r\n raw: unknown\r\n}\r\n\r\ntype TableBuilderState = {\r\n conditions: AthenaGatewayCondition[]\r\n limit?: number\r\n offset?: number\r\n}\r\n\r\ntype MutationSingleResult<Result> = Result extends Array<infer Item> ? Item | null : Result | null\r\nconst DEFAULT_COLUMNS = '*'\r\n\r\nexport interface MutationQuery<Result> extends PromiseLike<SupabaseResult<Result>> {\r\n select(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<Result>>\r\n returning(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<Result>>\r\n single(\r\n columns?: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<SupabaseResult<MutationSingleResult<Result>>>\r\n maybeSingle(\r\n columns?: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<SupabaseResult<MutationSingleResult<Result>>>\r\n then<TResult1 = SupabaseResult<Result>, TResult2 = never>(\r\n onfulfilled?: ((value: SupabaseResult<Result>) => TResult1 | PromiseLike<TResult1>) | undefined | null,\r\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | undefined | null,\r\n ): Promise<TResult1 | TResult2>\r\n catch<TResult = never>(\r\n onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | undefined | null,\r\n ): Promise<SupabaseResult<Result> | TResult>\r\n finally(onfinally?: (() => void) | undefined | null): Promise<SupabaseResult<Result>>\r\n}\r\n\r\nfunction formatResult<T>(response: AthenaGatewayResponse<T>): SupabaseResult<T> {\r\n return {\r\n data: response.data ?? null,\r\n error: response.error ?? null,\r\n status: response.status,\r\n raw: response.raw,\r\n }\r\n}\r\n\r\nfunction toSingleResult<Result>(response: SupabaseResult<Result>): SupabaseResult<MutationSingleResult<Result>> {\r\n const payload = response.data\r\n const singleData =\r\n Array.isArray(payload) ? (payload.length ? payload[0] : null) : payload ?? null\r\n return {\r\n ...response,\r\n data: singleData as MutationSingleResult<Result>,\r\n }\r\n}\r\n\r\nfunction mergeOptions(...options: Array<AthenaGatewayCallOptions | undefined>): AthenaGatewayCallOptions | undefined {\r\n return options.reduce<AthenaGatewayCallOptions | undefined>((acc, next) => {\r\n if (!next) return acc\r\n return { ...acc, ...next }\r\n }, undefined)\r\n}\r\n\r\nfunction createMutationQuery<Result>(\r\n executor: (\r\n columns?: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ) => Promise<SupabaseResult<Result>>,\r\n defaultColumns: string | string[] = DEFAULT_COLUMNS,\r\n): MutationQuery<Result> {\r\n let selectedColumns: string | string[] = defaultColumns\r\n let selectedOptions: AthenaGatewayCallOptions | undefined\r\n let promise: Promise<SupabaseResult<Result>> | null = null\r\n\r\n const run = (columns?: string | string[], options?: AthenaGatewayCallOptions) => {\r\n const payloadColumns = columns ?? selectedColumns\r\n const payloadOptions = options ?? selectedOptions\r\n if (!promise) {\r\n promise = executor(payloadColumns, payloadOptions)\r\n }\r\n return promise\r\n }\r\n\r\n const mutationQuery: MutationQuery<Result> = {\r\n select(columns = selectedColumns, options) {\r\n selectedColumns = columns\r\n selectedOptions = options ?? selectedOptions\r\n return run(columns, options)\r\n },\r\n returning(columns = selectedColumns, options) {\r\n return mutationQuery.select(columns, options)\r\n },\r\n single(columns = selectedColumns, options) {\r\n selectedColumns = columns\r\n selectedOptions = options ?? selectedOptions\r\n return run(columns, options).then(toSingleResult)\r\n },\r\n maybeSingle(columns = selectedColumns, options) {\r\n return mutationQuery.single(columns, options)\r\n },\r\n then(onfulfilled, onrejected) {\r\n return run(selectedColumns, selectedOptions).then(onfulfilled, onrejected)\r\n },\r\n catch(onrejected) {\r\n return run(selectedColumns, selectedOptions).catch(onrejected)\r\n },\r\n finally(onfinally) {\r\n return run(selectedColumns, selectedOptions).finally(onfinally)\r\n },\r\n }\r\n\r\n return mutationQuery\r\n}\r\n\r\nexport interface TableQueryBuilder<Row> {\r\n select<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<T>>\r\n insert(values: Row | Row[], options?: AthenaGatewayCallOptions): MutationQuery<Row | Row[]>\r\n upsert(\r\n values: Row | Row[],\r\n options?: AthenaGatewayCallOptions & {\r\n updateBody?: Partial<Row>\r\n onConflict?: string | string[]\r\n },\r\n ): MutationQuery<Row | Row[]>\r\n update(values: Partial<Row>, options?: AthenaGatewayCallOptions): MutationQuery<Row[]>\r\n delete(options?: AthenaGatewayCallOptions & { resourceId?: string }): MutationQuery<Row | null>\r\n eq(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n match(filters: Record<string, AthenaConditionValue>): TableQueryBuilder<Row>\r\n range(from: number, to: number): TableQueryBuilder<Row>\r\n limit(count: number): TableQueryBuilder<Row>\r\n offset(count: number): TableQueryBuilder<Row>\r\n gt(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n gte(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n lt(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n lte(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n neq(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n like(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n ilike(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n is(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n in(column: string, values: AthenaConditionArrayValue): TableQueryBuilder<Row>\r\n contains(column: string, values: AthenaConditionArrayValue): TableQueryBuilder<Row>\r\n containedBy(column: string, values: AthenaConditionArrayValue): TableQueryBuilder<Row>\r\n not(columnOrExpression: string, operator?: AthenaConditionOperator, value?: AthenaConditionValue): TableQueryBuilder<Row>\r\n or(expression: string): TableQueryBuilder<Row>\r\n single<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<T | null>>\r\n maybeSingle<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<T | null>>\r\n reset(): TableQueryBuilder<Row>\r\n}\r\n\r\nfunction getResourceId(state: TableBuilderState): string | undefined {\r\n const candidate = state.conditions.find(\r\n condition =>\r\n condition.operator === 'eq' &&\r\n (condition.column === 'resource_id' || condition.column === 'id'),\r\n )\r\n return candidate?.value?.toString()\r\n}\r\n\r\nfunction stringifyFilterValue(value: AthenaConditionValue | AthenaConditionArrayValue | string): string {\r\n if (Array.isArray(value)) {\r\n return value.join(',')\r\n }\r\n return String(value)\r\n}\r\n\r\nfunction createTableBuilder<Row>(\r\n tableName: string,\r\n client: ReturnType<typeof createAthenaGatewayClient>,\r\n): TableQueryBuilder<Row> {\r\n const state: TableBuilderState = {\r\n conditions: [],\r\n }\r\n\r\n const addCondition = (\r\n operator: AthenaConditionOperator,\r\n column?: string,\r\n value?: AthenaConditionValue | AthenaConditionArrayValue | string,\r\n ) => {\r\n const condition: AthenaGatewayCondition = { operator }\r\n if (column) condition.column = column\r\n if (value !== undefined) condition.value = value\r\n state.conditions.push(condition)\r\n }\r\n\r\n const builder: TableQueryBuilder<Row> = {\r\n reset() {\r\n state.conditions = []\r\n state.limit = undefined\r\n state.offset = undefined\r\n return builder\r\n },\r\n range(from, to) {\r\n state.offset = from\r\n state.limit = to - from + 1\r\n return builder\r\n },\r\n limit(count) {\r\n state.limit = count\r\n return builder\r\n },\r\n offset(count) {\r\n state.offset = count\r\n return builder\r\n },\r\n match(filters) {\r\n Object.entries(filters).forEach(([column, value]) => {\r\n addCondition('eq', column, value)\r\n })\r\n return builder\r\n },\r\n eq(column, value) {\r\n addCondition('eq', column, value)\r\n return builder\r\n },\r\n gt(column, value) {\r\n addCondition('gt', column, value)\r\n return builder\r\n },\r\n gte(column, value) {\r\n addCondition('gte', column, value)\r\n return builder\r\n },\r\n lt(column, value) {\r\n addCondition('lt', column, value)\r\n return builder\r\n },\r\n lte(column, value) {\r\n addCondition('lte', column, value)\r\n return builder\r\n },\r\n neq(column, value) {\r\n addCondition('neq', column, value)\r\n return builder\r\n },\r\n like(column, value) {\r\n addCondition('like', column, value)\r\n return builder\r\n },\r\n ilike(column, value) {\r\n addCondition('ilike', column, value)\r\n return builder\r\n },\r\n is(column, value) {\r\n addCondition('is', column, value)\r\n return builder\r\n },\r\n in(column, values) {\r\n addCondition('in', column, values)\r\n return builder\r\n },\r\n contains(column, values) {\r\n addCondition('contains', column, values)\r\n return builder\r\n },\r\n containedBy(column, values) {\r\n addCondition('containedBy', column, values)\r\n return builder\r\n },\r\n not(columnOrExpression, operator, value) {\r\n if (operator && value !== undefined) {\r\n addCondition('not', undefined, `${columnOrExpression}.${operator}.${stringifyFilterValue(value)}`)\r\n } else {\r\n addCondition('not', undefined, columnOrExpression)\r\n }\r\n return builder\r\n },\r\n or(expression) {\r\n addCondition('or', undefined, expression)\r\n return builder\r\n },\r\n async select<T = Row>(columns: string | string[] = DEFAULT_COLUMNS, options?: AthenaGatewayCallOptions) {\r\n const payload = {\r\n table_name: tableName,\r\n columns,\r\n conditions: state.conditions.length ? [...state.conditions] : undefined,\r\n limit: state.limit,\r\n offset: state.offset,\r\n strip_nulls: options?.stripNulls ?? true,\r\n count: options?.count,\r\n head: options?.head,\r\n }\r\n const response = await client.fetchGateway<T>(payload, options)\r\n return formatResult(response)\r\n },\r\n insert(values, options) {\r\n const executeInsert = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaInsertPayload = {\r\n table_name: tableName,\r\n insert_body: values as Record<string, unknown> | Record<string, unknown>[],\r\n }\r\n if (columns) payload.columns = columns\r\n if (mergedOptions?.count) payload.count = mergedOptions.count\r\n if (mergedOptions?.head) payload.head = mergedOptions.head\r\n if (mergedOptions?.defaultToNull !== undefined) {\r\n payload.default_to_null = mergedOptions.defaultToNull\r\n }\r\n const response = await client.insertGateway<Row | Row[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row | Row[]>(executeInsert)\r\n },\r\n upsert(values, options) {\r\n const executeUpsert = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaInsertPayload = {\r\n table_name: tableName,\r\n insert_body: values as Record<string, unknown> | Record<string, unknown>[],\r\n update_body: options?.updateBody ? (options.updateBody as Record<string, unknown>) : undefined,\r\n }\r\n if (columns) payload.columns = columns\r\n if (options?.onConflict) payload.on_conflict = options.onConflict\r\n if (mergedOptions?.count) payload.count = mergedOptions.count\r\n if (mergedOptions?.head) payload.head = mergedOptions.head\r\n if (mergedOptions?.defaultToNull !== undefined) {\r\n payload.default_to_null = mergedOptions.defaultToNull\r\n }\r\n const response = await client.insertGateway<Row | Row[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row | Row[]>(executeUpsert)\r\n },\r\n update(values, options) {\r\n const filters = state.conditions.length ? [...state.conditions] : undefined\r\n const executeUpdate = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaUpdatePayload = {\r\n table_name: tableName,\r\n update_body: values,\r\n conditions: filters,\r\n columns,\r\n strip_nulls: mergedOptions?.stripNulls ?? true,\r\n }\r\n const response = await client.updateGateway<Row[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row[]>(executeUpdate)\r\n },\r\n delete(options) {\r\n const filters = state.conditions.length ? [...state.conditions] : undefined\r\n const resourceId = options?.resourceId ?? getResourceId(state)\r\n if (!resourceId && !filters?.length) {\r\n throw new Error('delete requires a resource_id either via eq(\"resource_id\", ...) or options.resourceId')\r\n }\r\n const executeDelete = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaDeletePayload = {\r\n table_name: tableName,\r\n resource_id: resourceId,\r\n conditions: filters,\r\n columns,\r\n }\r\n const response = await client.deleteGateway<Row | null>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row | null>(executeDelete)\r\n },\r\n async single<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions) {\r\n const response = await builder.select<T[]>(columns, options)\r\n return toSingleResult(response)\r\n },\r\n async maybeSingle<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions) {\r\n return builder.single<T>(columns, options)\r\n },\r\n }\r\n\r\n return builder\r\n}\r\n\r\nexport interface SupabaseClient {\r\n from<Row = unknown>(table: string): TableQueryBuilder<Row>\r\n}\r\n\r\nexport function createClient(\r\n url: string,\r\n apiKey: string,\r\n options?: AthenaGatewayCallOptions,\r\n): SupabaseClient {\r\n const { baseUrl: optBaseUrl, apiKey: optApiKey, ...restOptions } = options ?? {}\r\n const client = createAthenaGatewayClient({\r\n baseUrl: optBaseUrl ?? url,\r\n apiKey: optApiKey ?? apiKey,\r\n ...restOptions,\r\n })\r\n\r\n return {\r\n from<Row = unknown>(table: string) {\r\n return createTableBuilder<Row>(table, client)\r\n },\r\n }\r\n}\r\n"]}
package/dist/index.mjs CHANGED
@@ -77,10 +77,11 @@ async function callAthena(config, endpoint, method, payload, options) {
77
77
  const parsedPayload = parsed;
78
78
  const parsedError = parsedPayload && typeof parsedPayload === "object" ? parsedPayload.error ?? parsedPayload.message : void 0;
79
79
  const hasError = typeof parsedError === "string" && parsedError.length > 0 ? parsedError : void 0;
80
+ const payloadData = parsedPayload && typeof parsedPayload === "object" && "data" in parsedPayload ? parsedPayload.data : parsed;
80
81
  return {
81
82
  ok: response.ok,
82
83
  status: response.status,
83
- data: parsed ?? null,
84
+ data: payloadData ?? null,
84
85
  error: hasError,
85
86
  raw: parsed
86
87
  };
@@ -296,7 +297,9 @@ function createTableBuilder(tableName, client) {
296
297
  conditions: state.conditions.length ? [...state.conditions] : void 0,
297
298
  limit: state.limit,
298
299
  offset: state.offset,
299
- strip_nulls: options?.stripNulls ?? true
300
+ strip_nulls: options?.stripNulls ?? true,
301
+ count: options?.count,
302
+ head: options?.head
300
303
  };
301
304
  const response = await client.fetchGateway(payload, options);
302
305
  return formatResult(response);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/gateway/client.ts","../src/supabase.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type {\r\n AthenaGatewayBaseOptions,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayEndpointPath,\r\n AthenaGatewayMethod,\r\n AthenaGatewayResponse,\r\n} from \"./types.js\";\r\nimport type {\r\n AthenaDeletePayload,\r\n AthenaFetchPayload,\r\n AthenaInsertPayload,\r\n AthenaUpdatePayload,\r\n} from \"./types.js\";\r\n\r\nconst DEFAULT_BASE_URL = \"https://athena-db.com\";\r\nconst DEFAULT_CLIENT = \"railway_direct\";\r\n\r\nfunction parseResponseText(text: string) {\r\n if (!text) return null;\r\n try {\r\n return JSON.parse(text);\r\n } catch {\r\n return text;\r\n }\r\n}\r\n\r\nfunction normalizeHeaderValue(value?: string | null) {\r\n return value ? value : undefined;\r\n}\r\n\r\nfunction buildHeaders(\r\n config: AthenaGatewayBaseOptions,\r\n options?: AthenaGatewayCallOptions,\r\n): Record<string, string> {\r\n const mergedStripNulls = options?.stripNulls ?? config.stripNulls ?? true;\r\n const finalClient = options?.client ?? config.client ?? DEFAULT_CLIENT;\r\n const finalApiKey = options?.apiKey ?? config.apiKey;\r\n const finalSupabaseUrl = options?.supabaseUrl ?? config.supabaseUrl;\r\n const finalSupabaseKey = options?.supabaseKey ?? config.supabaseKey;\r\n const finalPublishEvent = options?.publishEvent ?? config.publishEvent;\r\n const extraHeaders = {\r\n ...(config.headers ?? {}),\r\n ...(options?.headers ?? {}),\r\n };\r\n\r\n const headers: Record<string, string> = {\r\n \"Content-Type\": \"application/json\",\r\n };\r\n\r\n if (options?.userId ?? config.userId) {\r\n headers[\"X-User-Id\"] = options?.userId ?? config.userId ?? \"\";\r\n }\r\n\r\n if (options?.companyId ?? config.companyId) {\r\n headers[\"X-Company-Id\"] = options?.companyId ?? config.companyId ?? \"\";\r\n }\r\n\r\n if (options?.organizationId ?? config.organizationId) {\r\n headers[\"X-Organization-Id\"] =\r\n options?.organizationId ?? config.organizationId ?? \"\";\r\n }\r\n\r\n if (finalClient) {\r\n headers[\"X-Athena-Client\"] = finalClient;\r\n }\r\n\r\n if (typeof mergedStripNulls === \"boolean\") {\r\n headers[\"X-Strip-Nulls\"] = mergedStripNulls ? \"true\" : \"false\";\r\n }\r\n\r\n if (finalPublishEvent) {\r\n headers[\"X-Publish-Event\"] = finalPublishEvent;\r\n }\r\n\r\n if (finalApiKey) {\r\n headers[\"apikey\"] = finalApiKey;\r\n headers[\"x-api-key\"] = headers[\"x-api-key\"] ?? finalApiKey;\r\n }\r\n\r\n if (finalSupabaseUrl) {\r\n headers[\"x-supabase-url\"] = finalSupabaseUrl;\r\n }\r\n\r\n if (finalSupabaseKey) {\r\n headers[\"x-supabase-key\"] = finalSupabaseKey;\r\n }\r\n\r\n Object.entries(extraHeaders).forEach(([key, value]) => {\r\n const normalized = normalizeHeaderValue(value);\r\n if (normalized) {\r\n headers[key] = normalized;\r\n }\r\n });\r\n\r\n return headers;\r\n}\r\n\r\nasync function callAthena<T>(\r\n config: AthenaGatewayBaseOptions,\r\n endpoint: AthenaGatewayEndpointPath,\r\n method: AthenaGatewayMethod,\r\n payload: unknown,\r\n options?: AthenaGatewayCallOptions,\r\n): Promise<AthenaGatewayResponse<T>> {\r\n const baseUrl = (\r\n options?.baseUrl ??\r\n config.baseUrl ??\r\n DEFAULT_BASE_URL\r\n ).replace(/\\/$/, \"\");\r\n const url = `${baseUrl}${endpoint}`;\r\n const headers = buildHeaders(config, options);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method,\r\n headers,\r\n body: JSON.stringify(payload),\r\n });\r\n\r\n const rawText = await response.text();\r\n const parsed = parseResponseText(rawText ?? \"\");\r\n const parsedPayload = parsed as Record<string, unknown> | null;\r\n const parsedError =\r\n parsedPayload && typeof parsedPayload === \"object\"\r\n ? ((parsedPayload.error as string | undefined) ??\r\n (parsedPayload.message as string | undefined))\r\n : undefined;\r\n const hasError =\r\n typeof parsedError === \"string\" && parsedError.length > 0\r\n ? parsedError\r\n : undefined;\r\n\r\n return {\r\n ok: response.ok,\r\n status: response.status,\r\n data: (parsed as T) ?? null,\r\n error: hasError,\r\n raw: parsed,\r\n };\r\n } catch (callError) {\r\n const message =\r\n callError instanceof Error ? callError.message : String(callError);\r\n return {\r\n ok: false,\r\n status: 0,\r\n data: null,\r\n error: message,\r\n raw: null,\r\n };\r\n }\r\n}\r\n\r\nexport interface AthenaGatewayClient {\r\n baseUrl: string;\r\n buildHeaders(options?: AthenaGatewayCallOptions): Record<string, string>;\r\n fetchGateway<T>(\r\n payload: AthenaFetchPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n insertGateway<T>(\r\n payload: AthenaInsertPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n updateGateway<T>(\r\n payload: AthenaUpdatePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n deleteGateway<T>(\r\n payload: AthenaDeletePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n}\r\n\r\nexport function createAthenaGatewayClient(\r\n config: AthenaGatewayBaseOptions = {},\r\n): AthenaGatewayClient {\r\n return {\r\n baseUrl: (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\"),\r\n buildHeaders(options) {\r\n return buildHeaders(config, options);\r\n },\r\n fetchGateway(payload, options) {\r\n return callAthena(config, \"/gateway/fetch\", \"POST\", payload, options);\r\n },\r\n insertGateway(payload, options) {\r\n return callAthena(config, \"/gateway/insert\", \"PUT\", payload, options);\r\n },\r\n updateGateway(payload, options) {\r\n return callAthena(config, \"/gateway/update\", \"POST\", payload, options);\r\n },\r\n deleteGateway(payload, options) {\r\n return callAthena(config, \"/gateway/delete\", \"DELETE\", payload, options);\r\n },\r\n };\r\n}\r\n","import type {\r\n AthenaConditionArrayValue,\r\n AthenaConditionOperator,\r\n AthenaConditionValue,\r\n AthenaDeletePayload,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayCondition,\r\n AthenaGatewayResponse,\r\n AthenaInsertPayload,\r\n AthenaUpdatePayload,\r\n} from './gateway/types.ts'\r\nimport { createAthenaGatewayClient } from './gateway/client.ts'\r\n\r\nexport interface SupabaseResult<T> {\r\n data: T | null\r\n error: string | null\r\n status: number\r\n raw: unknown\r\n}\r\n\r\ntype TableBuilderState = {\r\n conditions: AthenaGatewayCondition[]\r\n limit?: number\r\n offset?: number\r\n}\r\n\r\ntype MutationSingleResult<Result> = Result extends Array<infer Item> ? Item | null : Result | null\r\nconst DEFAULT_COLUMNS = '*'\r\n\r\nexport interface MutationQuery<Result> extends PromiseLike<SupabaseResult<Result>> {\r\n select(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<Result>>\r\n returning(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<Result>>\r\n single(\r\n columns?: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<SupabaseResult<MutationSingleResult<Result>>>\r\n maybeSingle(\r\n columns?: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<SupabaseResult<MutationSingleResult<Result>>>\r\n then<TResult1 = SupabaseResult<Result>, TResult2 = never>(\r\n onfulfilled?: ((value: SupabaseResult<Result>) => TResult1 | PromiseLike<TResult1>) | undefined | null,\r\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | undefined | null,\r\n ): Promise<TResult1 | TResult2>\r\n catch<TResult = never>(\r\n onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | undefined | null,\r\n ): Promise<SupabaseResult<Result> | TResult>\r\n finally(onfinally?: (() => void) | undefined | null): Promise<SupabaseResult<Result>>\r\n}\r\n\r\nfunction formatResult<T>(response: AthenaGatewayResponse<T>): SupabaseResult<T> {\r\n return {\r\n data: response.data ?? null,\r\n error: response.error ?? null,\r\n status: response.status,\r\n raw: response.raw,\r\n }\r\n}\r\n\r\nfunction toSingleResult<Result>(response: SupabaseResult<Result>): SupabaseResult<MutationSingleResult<Result>> {\r\n const payload = response.data\r\n const singleData =\r\n Array.isArray(payload) ? (payload.length ? payload[0] : null) : payload ?? null\r\n return {\r\n ...response,\r\n data: singleData as MutationSingleResult<Result>,\r\n }\r\n}\r\n\r\nfunction mergeOptions(...options: Array<AthenaGatewayCallOptions | undefined>): AthenaGatewayCallOptions | undefined {\r\n return options.reduce<AthenaGatewayCallOptions | undefined>((acc, next) => {\r\n if (!next) return acc\r\n return { ...acc, ...next }\r\n }, undefined)\r\n}\r\n\r\nfunction createMutationQuery<Result>(\r\n executor: (\r\n columns?: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ) => Promise<SupabaseResult<Result>>,\r\n defaultColumns: string | string[] = DEFAULT_COLUMNS,\r\n): MutationQuery<Result> {\r\n let selectedColumns: string | string[] = defaultColumns\r\n let selectedOptions: AthenaGatewayCallOptions | undefined\r\n let promise: Promise<SupabaseResult<Result>> | null = null\r\n\r\n const run = (columns?: string | string[], options?: AthenaGatewayCallOptions) => {\r\n const payloadColumns = columns ?? selectedColumns\r\n const payloadOptions = options ?? selectedOptions\r\n if (!promise) {\r\n promise = executor(payloadColumns, payloadOptions)\r\n }\r\n return promise\r\n }\r\n\r\n const mutationQuery: MutationQuery<Result> = {\r\n select(columns = selectedColumns, options) {\r\n selectedColumns = columns\r\n selectedOptions = options ?? selectedOptions\r\n return run(columns, options)\r\n },\r\n returning(columns = selectedColumns, options) {\r\n return mutationQuery.select(columns, options)\r\n },\r\n single(columns = selectedColumns, options) {\r\n selectedColumns = columns\r\n selectedOptions = options ?? selectedOptions\r\n return run(columns, options).then(toSingleResult)\r\n },\r\n maybeSingle(columns = selectedColumns, options) {\r\n return mutationQuery.single(columns, options)\r\n },\r\n then(onfulfilled, onrejected) {\r\n return run(selectedColumns, selectedOptions).then(onfulfilled, onrejected)\r\n },\r\n catch(onrejected) {\r\n return run(selectedColumns, selectedOptions).catch(onrejected)\r\n },\r\n finally(onfinally) {\r\n return run(selectedColumns, selectedOptions).finally(onfinally)\r\n },\r\n }\r\n\r\n return mutationQuery\r\n}\r\n\r\nexport interface TableQueryBuilder<Row> {\r\n select<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<T>>\r\n insert(values: Row | Row[], options?: AthenaGatewayCallOptions): MutationQuery<Row | Row[]>\r\n upsert(\r\n values: Row | Row[],\r\n options?: AthenaGatewayCallOptions & {\r\n updateBody?: Partial<Row>\r\n onConflict?: string | string[]\r\n },\r\n ): MutationQuery<Row | Row[]>\r\n update(values: Partial<Row>, options?: AthenaGatewayCallOptions): MutationQuery<Row[]>\r\n delete(options?: AthenaGatewayCallOptions & { resourceId?: string }): MutationQuery<Row | null>\r\n eq(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n match(filters: Record<string, AthenaConditionValue>): TableQueryBuilder<Row>\r\n range(from: number, to: number): TableQueryBuilder<Row>\r\n limit(count: number): TableQueryBuilder<Row>\r\n offset(count: number): TableQueryBuilder<Row>\r\n gt(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n gte(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n lt(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n lte(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n neq(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n like(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n ilike(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n is(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n in(column: string, values: AthenaConditionArrayValue): TableQueryBuilder<Row>\r\n contains(column: string, values: AthenaConditionArrayValue): TableQueryBuilder<Row>\r\n containedBy(column: string, values: AthenaConditionArrayValue): TableQueryBuilder<Row>\r\n not(columnOrExpression: string, operator?: AthenaConditionOperator, value?: AthenaConditionValue): TableQueryBuilder<Row>\r\n or(expression: string): TableQueryBuilder<Row>\r\n single<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<T | null>>\r\n maybeSingle<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<T | null>>\r\n reset(): TableQueryBuilder<Row>\r\n}\r\n\r\nfunction getResourceId(state: TableBuilderState): string | undefined {\r\n const candidate = state.conditions.find(\r\n condition =>\r\n condition.operator === 'eq' &&\r\n (condition.column === 'resource_id' || condition.column === 'id'),\r\n )\r\n return candidate?.value?.toString()\r\n}\r\n\r\nfunction stringifyFilterValue(value: AthenaConditionValue | AthenaConditionArrayValue | string): string {\r\n if (Array.isArray(value)) {\r\n return value.join(',')\r\n }\r\n return String(value)\r\n}\r\n\r\nfunction createTableBuilder<Row>(\r\n tableName: string,\r\n client: ReturnType<typeof createAthenaGatewayClient>,\r\n): TableQueryBuilder<Row> {\r\n const state: TableBuilderState = {\r\n conditions: [],\r\n }\r\n\r\n const addCondition = (\r\n operator: AthenaConditionOperator,\r\n column?: string,\r\n value?: AthenaConditionValue | AthenaConditionArrayValue | string,\r\n ) => {\r\n const condition: AthenaGatewayCondition = { operator }\r\n if (column) condition.column = column\r\n if (value !== undefined) condition.value = value\r\n state.conditions.push(condition)\r\n }\r\n\r\n const builder: TableQueryBuilder<Row> = {\r\n reset() {\r\n state.conditions = []\r\n state.limit = undefined\r\n state.offset = undefined\r\n return builder\r\n },\r\n range(from, to) {\r\n state.offset = from\r\n state.limit = to - from + 1\r\n return builder\r\n },\r\n limit(count) {\r\n state.limit = count\r\n return builder\r\n },\r\n offset(count) {\r\n state.offset = count\r\n return builder\r\n },\r\n match(filters) {\r\n Object.entries(filters).forEach(([column, value]) => {\r\n addCondition('eq', column, value)\r\n })\r\n return builder\r\n },\r\n eq(column, value) {\r\n addCondition('eq', column, value)\r\n return builder\r\n },\r\n gt(column, value) {\r\n addCondition('gt', column, value)\r\n return builder\r\n },\r\n gte(column, value) {\r\n addCondition('gte', column, value)\r\n return builder\r\n },\r\n lt(column, value) {\r\n addCondition('lt', column, value)\r\n return builder\r\n },\r\n lte(column, value) {\r\n addCondition('lte', column, value)\r\n return builder\r\n },\r\n neq(column, value) {\r\n addCondition('neq', column, value)\r\n return builder\r\n },\r\n like(column, value) {\r\n addCondition('like', column, value)\r\n return builder\r\n },\r\n ilike(column, value) {\r\n addCondition('ilike', column, value)\r\n return builder\r\n },\r\n is(column, value) {\r\n addCondition('is', column, value)\r\n return builder\r\n },\r\n in(column, values) {\r\n addCondition('in', column, values)\r\n return builder\r\n },\r\n contains(column, values) {\r\n addCondition('contains', column, values)\r\n return builder\r\n },\r\n containedBy(column, values) {\r\n addCondition('containedBy', column, values)\r\n return builder\r\n },\r\n not(columnOrExpression, operator, value) {\r\n if (operator && value !== undefined) {\r\n addCondition('not', undefined, `${columnOrExpression}.${operator}.${stringifyFilterValue(value)}`)\r\n } else {\r\n addCondition('not', undefined, columnOrExpression)\r\n }\r\n return builder\r\n },\r\n or(expression) {\r\n addCondition('or', undefined, expression)\r\n return builder\r\n },\r\n async select<T = Row>(columns: string | string[] = DEFAULT_COLUMNS, options?: AthenaGatewayCallOptions) {\r\n const payload = {\r\n table_name: tableName,\r\n columns,\r\n conditions: state.conditions.length ? [...state.conditions] : undefined,\r\n limit: state.limit,\r\n offset: state.offset,\r\n strip_nulls: options?.stripNulls ?? true,\r\n }\r\n const response = await client.fetchGateway<T>(payload, options)\r\n return formatResult(response)\r\n },\r\n insert(values, options) {\r\n const executeInsert = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaInsertPayload = {\r\n table_name: tableName,\r\n insert_body: values as Record<string, unknown> | Record<string, unknown>[],\r\n }\r\n if (columns) payload.columns = columns\r\n if (mergedOptions?.count) payload.count = mergedOptions.count\r\n if (mergedOptions?.head) payload.head = mergedOptions.head\r\n if (mergedOptions?.defaultToNull !== undefined) {\r\n payload.default_to_null = mergedOptions.defaultToNull\r\n }\r\n const response = await client.insertGateway<Row | Row[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row | Row[]>(executeInsert)\r\n },\r\n upsert(values, options) {\r\n const executeUpsert = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaInsertPayload = {\r\n table_name: tableName,\r\n insert_body: values as Record<string, unknown> | Record<string, unknown>[],\r\n update_body: options?.updateBody ? (options.updateBody as Record<string, unknown>) : undefined,\r\n }\r\n if (columns) payload.columns = columns\r\n if (options?.onConflict) payload.on_conflict = options.onConflict\r\n if (mergedOptions?.count) payload.count = mergedOptions.count\r\n if (mergedOptions?.head) payload.head = mergedOptions.head\r\n if (mergedOptions?.defaultToNull !== undefined) {\r\n payload.default_to_null = mergedOptions.defaultToNull\r\n }\r\n const response = await client.insertGateway<Row | Row[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row | Row[]>(executeUpsert)\r\n },\r\n update(values, options) {\r\n const filters = state.conditions.length ? [...state.conditions] : undefined\r\n const executeUpdate = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaUpdatePayload = {\r\n table_name: tableName,\r\n update_body: values,\r\n conditions: filters,\r\n columns,\r\n strip_nulls: mergedOptions?.stripNulls ?? true,\r\n }\r\n const response = await client.updateGateway<Row[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row[]>(executeUpdate)\r\n },\r\n delete(options) {\r\n const filters = state.conditions.length ? [...state.conditions] : undefined\r\n const resourceId = options?.resourceId ?? getResourceId(state)\r\n if (!resourceId && !filters?.length) {\r\n throw new Error('delete requires a resource_id either via eq(\"resource_id\", ...) or options.resourceId')\r\n }\r\n const executeDelete = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaDeletePayload = {\r\n table_name: tableName,\r\n resource_id: resourceId,\r\n conditions: filters,\r\n columns,\r\n }\r\n const response = await client.deleteGateway<Row | null>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row | null>(executeDelete)\r\n },\r\n async single<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions) {\r\n const response = await builder.select<T[]>(columns, options)\r\n return toSingleResult(response)\r\n },\r\n async maybeSingle<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions) {\r\n return builder.single<T>(columns, options)\r\n },\r\n }\r\n\r\n return builder\r\n}\r\n\r\nexport interface SupabaseClient {\r\n from<Row = unknown>(table: string): TableQueryBuilder<Row>\r\n}\r\n\r\nexport function createClient(\r\n url: string,\r\n apiKey: string,\r\n options?: AthenaGatewayCallOptions,\r\n): SupabaseClient {\r\n const { baseUrl: optBaseUrl, apiKey: optApiKey, ...restOptions } = options ?? {}\r\n const client = createAthenaGatewayClient({\r\n baseUrl: optBaseUrl ?? url,\r\n apiKey: optApiKey ?? apiKey,\r\n ...restOptions,\r\n })\r\n\r\n return {\r\n from<Row = unknown>(table: string) {\r\n return createTableBuilder<Row>(table, client)\r\n },\r\n }\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/gateway/client.ts","../src/supabase.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type {\r\n AthenaGatewayBaseOptions,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayEndpointPath,\r\n AthenaGatewayMethod,\r\n AthenaGatewayResponse,\r\n} from \"./types.js\";\r\nimport type {\r\n AthenaDeletePayload,\r\n AthenaFetchPayload,\r\n AthenaInsertPayload,\r\n AthenaUpdatePayload,\r\n} from \"./types.js\";\r\n\r\nconst DEFAULT_BASE_URL = \"https://athena-db.com\";\r\nconst DEFAULT_CLIENT = \"railway_direct\";\r\n\r\nfunction parseResponseText(text: string) {\r\n if (!text) return null;\r\n try {\r\n return JSON.parse(text);\r\n } catch {\r\n return text;\r\n }\r\n}\r\n\r\nfunction normalizeHeaderValue(value?: string | null) {\r\n return value ? value : undefined;\r\n}\r\n\r\nfunction buildHeaders(\r\n config: AthenaGatewayBaseOptions,\r\n options?: AthenaGatewayCallOptions,\r\n): Record<string, string> {\r\n const mergedStripNulls = options?.stripNulls ?? config.stripNulls ?? true;\r\n const finalClient = options?.client ?? config.client ?? DEFAULT_CLIENT;\r\n const finalApiKey = options?.apiKey ?? config.apiKey;\r\n const finalSupabaseUrl = options?.supabaseUrl ?? config.supabaseUrl;\r\n const finalSupabaseKey = options?.supabaseKey ?? config.supabaseKey;\r\n const finalPublishEvent = options?.publishEvent ?? config.publishEvent;\r\n const extraHeaders = {\r\n ...(config.headers ?? {}),\r\n ...(options?.headers ?? {}),\r\n };\r\n\r\n const headers: Record<string, string> = {\r\n \"Content-Type\": \"application/json\",\r\n };\r\n\r\n if (options?.userId ?? config.userId) {\r\n headers[\"X-User-Id\"] = options?.userId ?? config.userId ?? \"\";\r\n }\r\n\r\n if (options?.companyId ?? config.companyId) {\r\n headers[\"X-Company-Id\"] = options?.companyId ?? config.companyId ?? \"\";\r\n }\r\n\r\n if (options?.organizationId ?? config.organizationId) {\r\n headers[\"X-Organization-Id\"] =\r\n options?.organizationId ?? config.organizationId ?? \"\";\r\n }\r\n\r\n if (finalClient) {\r\n headers[\"X-Athena-Client\"] = finalClient;\r\n }\r\n\r\n if (typeof mergedStripNulls === \"boolean\") {\r\n headers[\"X-Strip-Nulls\"] = mergedStripNulls ? \"true\" : \"false\";\r\n }\r\n\r\n if (finalPublishEvent) {\r\n headers[\"X-Publish-Event\"] = finalPublishEvent;\r\n }\r\n\r\n if (finalApiKey) {\r\n headers[\"apikey\"] = finalApiKey;\r\n headers[\"x-api-key\"] = headers[\"x-api-key\"] ?? finalApiKey;\r\n }\r\n\r\n if (finalSupabaseUrl) {\r\n headers[\"x-supabase-url\"] = finalSupabaseUrl;\r\n }\r\n\r\n if (finalSupabaseKey) {\r\n headers[\"x-supabase-key\"] = finalSupabaseKey;\r\n }\r\n\r\n Object.entries(extraHeaders).forEach(([key, value]) => {\r\n const normalized = normalizeHeaderValue(value);\r\n if (normalized) {\r\n headers[key] = normalized;\r\n }\r\n });\r\n\r\n return headers;\r\n}\r\n\r\nasync function callAthena<T>(\r\n config: AthenaGatewayBaseOptions,\r\n endpoint: AthenaGatewayEndpointPath,\r\n method: AthenaGatewayMethod,\r\n payload: unknown,\r\n options?: AthenaGatewayCallOptions,\r\n): Promise<AthenaGatewayResponse<T>> {\r\n const baseUrl = (\r\n options?.baseUrl ??\r\n config.baseUrl ??\r\n DEFAULT_BASE_URL\r\n ).replace(/\\/$/, \"\");\r\n const url = `${baseUrl}${endpoint}`;\r\n const headers = buildHeaders(config, options);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method,\r\n headers,\r\n body: JSON.stringify(payload),\r\n });\r\n\r\n const rawText = await response.text();\r\n const parsed = parseResponseText(rawText ?? \"\");\r\n const parsedPayload = parsed as Record<string, unknown> | null;\r\n const parsedError =\r\n parsedPayload && typeof parsedPayload === \"object\"\r\n ? ((parsedPayload.error as string | undefined) ??\r\n (parsedPayload.message as string | undefined))\r\n : undefined;\r\n const hasError =\r\n typeof parsedError === \"string\" && parsedError.length > 0\r\n ? parsedError\r\n : undefined;\r\n\r\n // Unwrap envelope: API may return { data: [...], error: null } (e.g. when cached)\r\n // vs raw array when uncached. Use inner data when present to avoid double nesting.\r\n const payloadData =\r\n parsedPayload &&\r\n typeof parsedPayload === \"object\" &&\r\n \"data\" in parsedPayload\r\n ? (parsedPayload.data as T)\r\n : (parsed as T);\r\n\r\n return {\r\n ok: response.ok,\r\n status: response.status,\r\n data: payloadData ?? null,\r\n error: hasError,\r\n raw: parsed,\r\n };\r\n } catch (callError) {\r\n const message =\r\n callError instanceof Error ? callError.message : String(callError);\r\n return {\r\n ok: false,\r\n status: 0,\r\n data: null,\r\n error: message,\r\n raw: null,\r\n };\r\n }\r\n}\r\n\r\nexport interface AthenaGatewayClient {\r\n baseUrl: string;\r\n buildHeaders(options?: AthenaGatewayCallOptions): Record<string, string>;\r\n fetchGateway<T>(\r\n payload: AthenaFetchPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n insertGateway<T>(\r\n payload: AthenaInsertPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n updateGateway<T>(\r\n payload: AthenaUpdatePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n deleteGateway<T>(\r\n payload: AthenaDeletePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n}\r\n\r\nexport function createAthenaGatewayClient(\r\n config: AthenaGatewayBaseOptions = {},\r\n): AthenaGatewayClient {\r\n return {\r\n baseUrl: (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\"),\r\n buildHeaders(options) {\r\n return buildHeaders(config, options);\r\n },\r\n fetchGateway(payload, options) {\r\n return callAthena(config, \"/gateway/fetch\", \"POST\", payload, options);\r\n },\r\n insertGateway(payload, options) {\r\n return callAthena(config, \"/gateway/insert\", \"PUT\", payload, options);\r\n },\r\n updateGateway(payload, options) {\r\n return callAthena(config, \"/gateway/update\", \"POST\", payload, options);\r\n },\r\n deleteGateway(payload, options) {\r\n return callAthena(config, \"/gateway/delete\", \"DELETE\", payload, options);\r\n },\r\n };\r\n}\r\n","import type {\r\n AthenaConditionArrayValue,\r\n AthenaConditionOperator,\r\n AthenaConditionValue,\r\n AthenaDeletePayload,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayCondition,\r\n AthenaGatewayResponse,\r\n AthenaInsertPayload,\r\n AthenaUpdatePayload,\r\n} from './gateway/types.ts'\r\nimport { createAthenaGatewayClient } from './gateway/client.ts'\r\n\r\nexport interface SupabaseResult<T> {\r\n data: T | null\r\n error: string | null\r\n status: number\r\n raw: unknown\r\n}\r\n\r\ntype TableBuilderState = {\r\n conditions: AthenaGatewayCondition[]\r\n limit?: number\r\n offset?: number\r\n}\r\n\r\ntype MutationSingleResult<Result> = Result extends Array<infer Item> ? Item | null : Result | null\r\nconst DEFAULT_COLUMNS = '*'\r\n\r\nexport interface MutationQuery<Result> extends PromiseLike<SupabaseResult<Result>> {\r\n select(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<Result>>\r\n returning(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<Result>>\r\n single(\r\n columns?: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<SupabaseResult<MutationSingleResult<Result>>>\r\n maybeSingle(\r\n columns?: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<SupabaseResult<MutationSingleResult<Result>>>\r\n then<TResult1 = SupabaseResult<Result>, TResult2 = never>(\r\n onfulfilled?: ((value: SupabaseResult<Result>) => TResult1 | PromiseLike<TResult1>) | undefined | null,\r\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | undefined | null,\r\n ): Promise<TResult1 | TResult2>\r\n catch<TResult = never>(\r\n onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | undefined | null,\r\n ): Promise<SupabaseResult<Result> | TResult>\r\n finally(onfinally?: (() => void) | undefined | null): Promise<SupabaseResult<Result>>\r\n}\r\n\r\nfunction formatResult<T>(response: AthenaGatewayResponse<T>): SupabaseResult<T> {\r\n return {\r\n data: response.data ?? null,\r\n error: response.error ?? null,\r\n status: response.status,\r\n raw: response.raw,\r\n }\r\n}\r\n\r\nfunction toSingleResult<Result>(response: SupabaseResult<Result>): SupabaseResult<MutationSingleResult<Result>> {\r\n const payload = response.data\r\n const singleData =\r\n Array.isArray(payload) ? (payload.length ? payload[0] : null) : payload ?? null\r\n return {\r\n ...response,\r\n data: singleData as MutationSingleResult<Result>,\r\n }\r\n}\r\n\r\nfunction mergeOptions(...options: Array<AthenaGatewayCallOptions | undefined>): AthenaGatewayCallOptions | undefined {\r\n return options.reduce<AthenaGatewayCallOptions | undefined>((acc, next) => {\r\n if (!next) return acc\r\n return { ...acc, ...next }\r\n }, undefined)\r\n}\r\n\r\nfunction createMutationQuery<Result>(\r\n executor: (\r\n columns?: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ) => Promise<SupabaseResult<Result>>,\r\n defaultColumns: string | string[] = DEFAULT_COLUMNS,\r\n): MutationQuery<Result> {\r\n let selectedColumns: string | string[] = defaultColumns\r\n let selectedOptions: AthenaGatewayCallOptions | undefined\r\n let promise: Promise<SupabaseResult<Result>> | null = null\r\n\r\n const run = (columns?: string | string[], options?: AthenaGatewayCallOptions) => {\r\n const payloadColumns = columns ?? selectedColumns\r\n const payloadOptions = options ?? selectedOptions\r\n if (!promise) {\r\n promise = executor(payloadColumns, payloadOptions)\r\n }\r\n return promise\r\n }\r\n\r\n const mutationQuery: MutationQuery<Result> = {\r\n select(columns = selectedColumns, options) {\r\n selectedColumns = columns\r\n selectedOptions = options ?? selectedOptions\r\n return run(columns, options)\r\n },\r\n returning(columns = selectedColumns, options) {\r\n return mutationQuery.select(columns, options)\r\n },\r\n single(columns = selectedColumns, options) {\r\n selectedColumns = columns\r\n selectedOptions = options ?? selectedOptions\r\n return run(columns, options).then(toSingleResult)\r\n },\r\n maybeSingle(columns = selectedColumns, options) {\r\n return mutationQuery.single(columns, options)\r\n },\r\n then(onfulfilled, onrejected) {\r\n return run(selectedColumns, selectedOptions).then(onfulfilled, onrejected)\r\n },\r\n catch(onrejected) {\r\n return run(selectedColumns, selectedOptions).catch(onrejected)\r\n },\r\n finally(onfinally) {\r\n return run(selectedColumns, selectedOptions).finally(onfinally)\r\n },\r\n }\r\n\r\n return mutationQuery\r\n}\r\n\r\nexport interface TableQueryBuilder<Row> {\r\n select<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<T>>\r\n insert(values: Row | Row[], options?: AthenaGatewayCallOptions): MutationQuery<Row | Row[]>\r\n upsert(\r\n values: Row | Row[],\r\n options?: AthenaGatewayCallOptions & {\r\n updateBody?: Partial<Row>\r\n onConflict?: string | string[]\r\n },\r\n ): MutationQuery<Row | Row[]>\r\n update(values: Partial<Row>, options?: AthenaGatewayCallOptions): MutationQuery<Row[]>\r\n delete(options?: AthenaGatewayCallOptions & { resourceId?: string }): MutationQuery<Row | null>\r\n eq(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n match(filters: Record<string, AthenaConditionValue>): TableQueryBuilder<Row>\r\n range(from: number, to: number): TableQueryBuilder<Row>\r\n limit(count: number): TableQueryBuilder<Row>\r\n offset(count: number): TableQueryBuilder<Row>\r\n gt(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n gte(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n lt(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n lte(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n neq(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n like(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n ilike(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n is(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>\r\n in(column: string, values: AthenaConditionArrayValue): TableQueryBuilder<Row>\r\n contains(column: string, values: AthenaConditionArrayValue): TableQueryBuilder<Row>\r\n containedBy(column: string, values: AthenaConditionArrayValue): TableQueryBuilder<Row>\r\n not(columnOrExpression: string, operator?: AthenaConditionOperator, value?: AthenaConditionValue): TableQueryBuilder<Row>\r\n or(expression: string): TableQueryBuilder<Row>\r\n single<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<T | null>>\r\n maybeSingle<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<T | null>>\r\n reset(): TableQueryBuilder<Row>\r\n}\r\n\r\nfunction getResourceId(state: TableBuilderState): string | undefined {\r\n const candidate = state.conditions.find(\r\n condition =>\r\n condition.operator === 'eq' &&\r\n (condition.column === 'resource_id' || condition.column === 'id'),\r\n )\r\n return candidate?.value?.toString()\r\n}\r\n\r\nfunction stringifyFilterValue(value: AthenaConditionValue | AthenaConditionArrayValue | string): string {\r\n if (Array.isArray(value)) {\r\n return value.join(',')\r\n }\r\n return String(value)\r\n}\r\n\r\nfunction createTableBuilder<Row>(\r\n tableName: string,\r\n client: ReturnType<typeof createAthenaGatewayClient>,\r\n): TableQueryBuilder<Row> {\r\n const state: TableBuilderState = {\r\n conditions: [],\r\n }\r\n\r\n const addCondition = (\r\n operator: AthenaConditionOperator,\r\n column?: string,\r\n value?: AthenaConditionValue | AthenaConditionArrayValue | string,\r\n ) => {\r\n const condition: AthenaGatewayCondition = { operator }\r\n if (column) condition.column = column\r\n if (value !== undefined) condition.value = value\r\n state.conditions.push(condition)\r\n }\r\n\r\n const builder: TableQueryBuilder<Row> = {\r\n reset() {\r\n state.conditions = []\r\n state.limit = undefined\r\n state.offset = undefined\r\n return builder\r\n },\r\n range(from, to) {\r\n state.offset = from\r\n state.limit = to - from + 1\r\n return builder\r\n },\r\n limit(count) {\r\n state.limit = count\r\n return builder\r\n },\r\n offset(count) {\r\n state.offset = count\r\n return builder\r\n },\r\n match(filters) {\r\n Object.entries(filters).forEach(([column, value]) => {\r\n addCondition('eq', column, value)\r\n })\r\n return builder\r\n },\r\n eq(column, value) {\r\n addCondition('eq', column, value)\r\n return builder\r\n },\r\n gt(column, value) {\r\n addCondition('gt', column, value)\r\n return builder\r\n },\r\n gte(column, value) {\r\n addCondition('gte', column, value)\r\n return builder\r\n },\r\n lt(column, value) {\r\n addCondition('lt', column, value)\r\n return builder\r\n },\r\n lte(column, value) {\r\n addCondition('lte', column, value)\r\n return builder\r\n },\r\n neq(column, value) {\r\n addCondition('neq', column, value)\r\n return builder\r\n },\r\n like(column, value) {\r\n addCondition('like', column, value)\r\n return builder\r\n },\r\n ilike(column, value) {\r\n addCondition('ilike', column, value)\r\n return builder\r\n },\r\n is(column, value) {\r\n addCondition('is', column, value)\r\n return builder\r\n },\r\n in(column, values) {\r\n addCondition('in', column, values)\r\n return builder\r\n },\r\n contains(column, values) {\r\n addCondition('contains', column, values)\r\n return builder\r\n },\r\n containedBy(column, values) {\r\n addCondition('containedBy', column, values)\r\n return builder\r\n },\r\n not(columnOrExpression, operator, value) {\r\n if (operator && value !== undefined) {\r\n addCondition('not', undefined, `${columnOrExpression}.${operator}.${stringifyFilterValue(value)}`)\r\n } else {\r\n addCondition('not', undefined, columnOrExpression)\r\n }\r\n return builder\r\n },\r\n or(expression) {\r\n addCondition('or', undefined, expression)\r\n return builder\r\n },\r\n async select<T = Row>(columns: string | string[] = DEFAULT_COLUMNS, options?: AthenaGatewayCallOptions) {\r\n const payload = {\r\n table_name: tableName,\r\n columns,\r\n conditions: state.conditions.length ? [...state.conditions] : undefined,\r\n limit: state.limit,\r\n offset: state.offset,\r\n strip_nulls: options?.stripNulls ?? true,\r\n count: options?.count,\r\n head: options?.head,\r\n }\r\n const response = await client.fetchGateway<T>(payload, options)\r\n return formatResult(response)\r\n },\r\n insert(values, options) {\r\n const executeInsert = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaInsertPayload = {\r\n table_name: tableName,\r\n insert_body: values as Record<string, unknown> | Record<string, unknown>[],\r\n }\r\n if (columns) payload.columns = columns\r\n if (mergedOptions?.count) payload.count = mergedOptions.count\r\n if (mergedOptions?.head) payload.head = mergedOptions.head\r\n if (mergedOptions?.defaultToNull !== undefined) {\r\n payload.default_to_null = mergedOptions.defaultToNull\r\n }\r\n const response = await client.insertGateway<Row | Row[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row | Row[]>(executeInsert)\r\n },\r\n upsert(values, options) {\r\n const executeUpsert = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaInsertPayload = {\r\n table_name: tableName,\r\n insert_body: values as Record<string, unknown> | Record<string, unknown>[],\r\n update_body: options?.updateBody ? (options.updateBody as Record<string, unknown>) : undefined,\r\n }\r\n if (columns) payload.columns = columns\r\n if (options?.onConflict) payload.on_conflict = options.onConflict\r\n if (mergedOptions?.count) payload.count = mergedOptions.count\r\n if (mergedOptions?.head) payload.head = mergedOptions.head\r\n if (mergedOptions?.defaultToNull !== undefined) {\r\n payload.default_to_null = mergedOptions.defaultToNull\r\n }\r\n const response = await client.insertGateway<Row | Row[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row | Row[]>(executeUpsert)\r\n },\r\n update(values, options) {\r\n const filters = state.conditions.length ? [...state.conditions] : undefined\r\n const executeUpdate = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaUpdatePayload = {\r\n table_name: tableName,\r\n update_body: values,\r\n conditions: filters,\r\n columns,\r\n strip_nulls: mergedOptions?.stripNulls ?? true,\r\n }\r\n const response = await client.updateGateway<Row[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row[]>(executeUpdate)\r\n },\r\n delete(options) {\r\n const filters = state.conditions.length ? [...state.conditions] : undefined\r\n const resourceId = options?.resourceId ?? getResourceId(state)\r\n if (!resourceId && !filters?.length) {\r\n throw new Error('delete requires a resource_id either via eq(\"resource_id\", ...) or options.resourceId')\r\n }\r\n const executeDelete = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaDeletePayload = {\r\n table_name: tableName,\r\n resource_id: resourceId,\r\n conditions: filters,\r\n columns,\r\n }\r\n const response = await client.deleteGateway<Row | null>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row | null>(executeDelete)\r\n },\r\n async single<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions) {\r\n const response = await builder.select<T[]>(columns, options)\r\n return toSingleResult(response)\r\n },\r\n async maybeSingle<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions) {\r\n return builder.single<T>(columns, options)\r\n },\r\n }\r\n\r\n return builder\r\n}\r\n\r\nexport interface SupabaseClient {\r\n from<Row = unknown>(table: string): TableQueryBuilder<Row>\r\n}\r\n\r\nexport function createClient(\r\n url: string,\r\n apiKey: string,\r\n options?: AthenaGatewayCallOptions,\r\n): SupabaseClient {\r\n const { baseUrl: optBaseUrl, apiKey: optApiKey, ...restOptions } = options ?? {}\r\n const client = createAthenaGatewayClient({\r\n baseUrl: optBaseUrl ?? url,\r\n apiKey: optApiKey ?? apiKey,\r\n ...restOptions,\r\n })\r\n\r\n return {\r\n from<Row = unknown>(table: string) {\r\n return createTableBuilder<Row>(table, client)\r\n },\r\n }\r\n}\r\n"]}
package/dist/react.js CHANGED
@@ -83,10 +83,11 @@ async function callAthena(config, endpoint, method, payload, options) {
83
83
  const parsedPayload = parsed;
84
84
  const parsedError = parsedPayload && typeof parsedPayload === "object" ? parsedPayload.error ?? parsedPayload.message : void 0;
85
85
  const hasError = typeof parsedError === "string" && parsedError.length > 0 ? parsedError : void 0;
86
+ const payloadData = parsedPayload && typeof parsedPayload === "object" && "data" in parsedPayload ? parsedPayload.data : parsed;
86
87
  return {
87
88
  ok: response.ok,
88
89
  status: response.status,
89
- data: parsed ?? null,
90
+ data: payloadData ?? null,
90
91
  error: hasError,
91
92
  raw: parsed
92
93
  };
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/gateway/client.ts","../src/gateway/use-athena-gateway.ts"],"names":["useState","useMemo","useCallback"],"mappings":"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","file":"react.js","sourcesContent":["import type {\r\n AthenaGatewayBaseOptions,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayEndpointPath,\r\n AthenaGatewayMethod,\r\n AthenaGatewayResponse,\r\n} from \"./types.js\";\r\nimport type {\r\n AthenaDeletePayload,\r\n AthenaFetchPayload,\r\n AthenaInsertPayload,\r\n AthenaUpdatePayload,\r\n} from \"./types.js\";\r\n\r\nconst DEFAULT_BASE_URL = \"https://athena-db.com\";\r\nconst DEFAULT_CLIENT = \"railway_direct\";\r\n\r\nfunction parseResponseText(text: string) {\r\n if (!text) return null;\r\n try {\r\n return JSON.parse(text);\r\n } catch {\r\n return text;\r\n }\r\n}\r\n\r\nfunction normalizeHeaderValue(value?: string | null) {\r\n return value ? value : undefined;\r\n}\r\n\r\nfunction buildHeaders(\r\n config: AthenaGatewayBaseOptions,\r\n options?: AthenaGatewayCallOptions,\r\n): Record<string, string> {\r\n const mergedStripNulls = options?.stripNulls ?? config.stripNulls ?? true;\r\n const finalClient = options?.client ?? config.client ?? DEFAULT_CLIENT;\r\n const finalApiKey = options?.apiKey ?? config.apiKey;\r\n const finalSupabaseUrl = options?.supabaseUrl ?? config.supabaseUrl;\r\n const finalSupabaseKey = options?.supabaseKey ?? config.supabaseKey;\r\n const finalPublishEvent = options?.publishEvent ?? config.publishEvent;\r\n const extraHeaders = {\r\n ...(config.headers ?? {}),\r\n ...(options?.headers ?? {}),\r\n };\r\n\r\n const headers: Record<string, string> = {\r\n \"Content-Type\": \"application/json\",\r\n };\r\n\r\n if (options?.userId ?? config.userId) {\r\n headers[\"X-User-Id\"] = options?.userId ?? config.userId ?? \"\";\r\n }\r\n\r\n if (options?.companyId ?? config.companyId) {\r\n headers[\"X-Company-Id\"] = options?.companyId ?? config.companyId ?? \"\";\r\n }\r\n\r\n if (options?.organizationId ?? config.organizationId) {\r\n headers[\"X-Organization-Id\"] =\r\n options?.organizationId ?? config.organizationId ?? \"\";\r\n }\r\n\r\n if (finalClient) {\r\n headers[\"X-Athena-Client\"] = finalClient;\r\n }\r\n\r\n if (typeof mergedStripNulls === \"boolean\") {\r\n headers[\"X-Strip-Nulls\"] = mergedStripNulls ? \"true\" : \"false\";\r\n }\r\n\r\n if (finalPublishEvent) {\r\n headers[\"X-Publish-Event\"] = finalPublishEvent;\r\n }\r\n\r\n if (finalApiKey) {\r\n headers[\"apikey\"] = finalApiKey;\r\n headers[\"x-api-key\"] = headers[\"x-api-key\"] ?? finalApiKey;\r\n }\r\n\r\n if (finalSupabaseUrl) {\r\n headers[\"x-supabase-url\"] = finalSupabaseUrl;\r\n }\r\n\r\n if (finalSupabaseKey) {\r\n headers[\"x-supabase-key\"] = finalSupabaseKey;\r\n }\r\n\r\n Object.entries(extraHeaders).forEach(([key, value]) => {\r\n const normalized = normalizeHeaderValue(value);\r\n if (normalized) {\r\n headers[key] = normalized;\r\n }\r\n });\r\n\r\n return headers;\r\n}\r\n\r\nasync function callAthena<T>(\r\n config: AthenaGatewayBaseOptions,\r\n endpoint: AthenaGatewayEndpointPath,\r\n method: AthenaGatewayMethod,\r\n payload: unknown,\r\n options?: AthenaGatewayCallOptions,\r\n): Promise<AthenaGatewayResponse<T>> {\r\n const baseUrl = (\r\n options?.baseUrl ??\r\n config.baseUrl ??\r\n DEFAULT_BASE_URL\r\n ).replace(/\\/$/, \"\");\r\n const url = `${baseUrl}${endpoint}`;\r\n const headers = buildHeaders(config, options);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method,\r\n headers,\r\n body: JSON.stringify(payload),\r\n });\r\n\r\n const rawText = await response.text();\r\n const parsed = parseResponseText(rawText ?? \"\");\r\n const parsedPayload = parsed as Record<string, unknown> | null;\r\n const parsedError =\r\n parsedPayload && typeof parsedPayload === \"object\"\r\n ? ((parsedPayload.error as string | undefined) ??\r\n (parsedPayload.message as string | undefined))\r\n : undefined;\r\n const hasError =\r\n typeof parsedError === \"string\" && parsedError.length > 0\r\n ? parsedError\r\n : undefined;\r\n\r\n return {\r\n ok: response.ok,\r\n status: response.status,\r\n data: (parsed as T) ?? null,\r\n error: hasError,\r\n raw: parsed,\r\n };\r\n } catch (callError) {\r\n const message =\r\n callError instanceof Error ? callError.message : String(callError);\r\n return {\r\n ok: false,\r\n status: 0,\r\n data: null,\r\n error: message,\r\n raw: null,\r\n };\r\n }\r\n}\r\n\r\nexport interface AthenaGatewayClient {\r\n baseUrl: string;\r\n buildHeaders(options?: AthenaGatewayCallOptions): Record<string, string>;\r\n fetchGateway<T>(\r\n payload: AthenaFetchPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n insertGateway<T>(\r\n payload: AthenaInsertPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n updateGateway<T>(\r\n payload: AthenaUpdatePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n deleteGateway<T>(\r\n payload: AthenaDeletePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n}\r\n\r\nexport function createAthenaGatewayClient(\r\n config: AthenaGatewayBaseOptions = {},\r\n): AthenaGatewayClient {\r\n return {\r\n baseUrl: (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\"),\r\n buildHeaders(options) {\r\n return buildHeaders(config, options);\r\n },\r\n fetchGateway(payload, options) {\r\n return callAthena(config, \"/gateway/fetch\", \"POST\", payload, options);\r\n },\r\n insertGateway(payload, options) {\r\n return callAthena(config, \"/gateway/insert\", \"PUT\", payload, options);\r\n },\r\n updateGateway(payload, options) {\r\n return callAthena(config, \"/gateway/update\", \"POST\", payload, options);\r\n },\r\n deleteGateway(payload, options) {\r\n return callAthena(config, \"/gateway/delete\", \"DELETE\", payload, options);\r\n },\r\n };\r\n}\r\n","import { useCallback, useMemo, useState } from \"react\";\r\nimport type {\r\n AthenaDeletePayload,\r\n AthenaFetchPayload,\r\n AthenaGatewayCallLog,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayHookConfig,\r\n AthenaGatewayHookResult,\r\n AthenaGatewayResponse,\r\n AthenaGatewayResponseLog,\r\n AthenaInsertPayload,\r\n AthenaUpdatePayload,\r\n} from \"./types.js\";\r\nimport { createAthenaGatewayClient } from \"./client.js\";\r\n\r\nexport function useAthenaGateway(\r\n config?: AthenaGatewayHookConfig,\r\n): AthenaGatewayHookResult {\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [lastRequest, setLastRequest] = useState<AthenaGatewayCallLog | null>(\r\n null,\r\n );\r\n const [lastResponse, setLastResponse] =\r\n useState<AthenaGatewayResponseLog | null>(null);\r\n\r\n const client = useMemo(\r\n () =>\r\n createAthenaGatewayClient({\r\n client: config?.client,\r\n baseUrl: config?.baseUrl,\r\n apiKey: config?.apiKey,\r\n supabaseUrl: config?.supabaseUrl,\r\n supabaseKey: config?.supabaseKey,\r\n publishEvent: config?.publishEvent,\r\n stripNulls: config?.stripNulls,\r\n headers: config?.headers,\r\n userId: config?.userId,\r\n companyId: config?.companyId,\r\n organizationId: config?.organizationId,\r\n }),\r\n [\r\n config?.baseUrl,\r\n config?.client,\r\n config?.apiKey,\r\n config?.supabaseUrl,\r\n config?.supabaseKey,\r\n config?.publishEvent,\r\n config?.stripNulls,\r\n config?.headers,\r\n config?.userId,\r\n config?.companyId,\r\n config?.organizationId,\r\n ],\r\n );\r\n\r\n const callWithLifecycle = useCallback(\r\n async <T>(\r\n fn: () => Promise<AthenaGatewayResponse<T>>,\r\n metadata: {\r\n endpoint: string;\r\n method: string;\r\n payload: unknown;\r\n options?: AthenaGatewayCallOptions;\r\n },\r\n ): Promise<AthenaGatewayResponse<T>> => {\r\n const requestLog: AthenaGatewayCallLog = {\r\n endpoint: metadata.endpoint as any,\r\n method: metadata.method as any,\r\n payload: metadata.payload,\r\n headers: client.buildHeaders(metadata.options),\r\n timestamp: new Date().toISOString(),\r\n };\r\n\r\n setLastRequest(requestLog);\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n let response: AthenaGatewayResponse<T> | undefined;\r\n try {\r\n response = await fn();\r\n setLastResponse({ ...response, timestamp: new Date().toISOString() });\r\n\r\n if (!response.ok) {\r\n const message =\r\n response.error ||\r\n `Athena gateway ${metadata.method} ${metadata.endpoint} failed`;\r\n setError(message);\r\n throw new Error(message);\r\n }\r\n\r\n return response;\r\n } catch (callError) {\r\n const message =\r\n callError instanceof Error ? callError.message : String(callError);\r\n setError(message);\r\n setLastResponse({\r\n timestamp: new Date().toISOString(),\r\n status: response?.status ?? 0,\r\n ok: false,\r\n data: null,\r\n raw: null,\r\n error: message,\r\n });\r\n throw callError;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [client],\r\n );\r\n\r\n const normalizedConfigStripNulls = useMemo(\r\n () => config?.stripNulls ?? true,\r\n [config?.stripNulls],\r\n );\r\n\r\n const fetchGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaFetchPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n const normalizedPayload: AthenaFetchPayload = {\r\n ...payload,\r\n conditions: payload.conditions ?? [],\r\n strip_nulls:\r\n payload.strip_nulls ??\r\n options?.stripNulls ??\r\n normalizedConfigStripNulls,\r\n };\r\n return callWithLifecycle<T>(\r\n () => client.fetchGateway<T>(normalizedPayload, options),\r\n {\r\n endpoint: \"/gateway/fetch\",\r\n method: \"POST\",\r\n payload: normalizedPayload,\r\n options,\r\n },\r\n );\r\n },\r\n [callWithLifecycle, client, normalizedConfigStripNulls],\r\n );\r\n\r\n const insertGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaInsertPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) =>\r\n callWithLifecycle<T>(() => client.insertGateway<T>(payload, options), {\r\n endpoint: \"/gateway/insert\",\r\n method: \"PUT\",\r\n payload,\r\n options,\r\n }),\r\n [callWithLifecycle, client],\r\n );\r\n\r\n const updateGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaUpdatePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n const normalizedPayload: AthenaUpdatePayload = {\r\n ...payload,\r\n conditions: payload.conditions ?? [],\r\n strip_nulls:\r\n payload.strip_nulls ??\r\n options?.stripNulls ??\r\n normalizedConfigStripNulls,\r\n };\r\n return callWithLifecycle<T>(\r\n () => client.updateGateway<T>(normalizedPayload, options),\r\n {\r\n endpoint: \"/gateway/update\",\r\n method: \"POST\",\r\n payload: normalizedPayload,\r\n options,\r\n },\r\n );\r\n },\r\n [callWithLifecycle, client, normalizedConfigStripNulls],\r\n );\r\n\r\n const deleteGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaDeletePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n if (!payload.resource_id) {\r\n throw new Error(\r\n \"deleteGateway requires resource_id (the unique identifier of the record to delete)\",\r\n );\r\n }\r\n return callWithLifecycle<T>(\r\n () => client.deleteGateway<T>(payload, options),\r\n { endpoint: \"/gateway/delete\", method: \"DELETE\", payload, options },\r\n );\r\n },\r\n [callWithLifecycle, client],\r\n );\r\n\r\n return {\r\n fetchGateway,\r\n insertGateway,\r\n updateGateway,\r\n deleteGateway,\r\n isLoading,\r\n error,\r\n lastRequest,\r\n lastResponse,\r\n baseUrl: client.baseUrl,\r\n };\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/gateway/client.ts","../src/gateway/use-athena-gateway.ts"],"names":["useState","useMemo","useCallback"],"mappings":"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","file":"react.js","sourcesContent":["import type {\r\n AthenaGatewayBaseOptions,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayEndpointPath,\r\n AthenaGatewayMethod,\r\n AthenaGatewayResponse,\r\n} from \"./types.js\";\r\nimport type {\r\n AthenaDeletePayload,\r\n AthenaFetchPayload,\r\n AthenaInsertPayload,\r\n AthenaUpdatePayload,\r\n} from \"./types.js\";\r\n\r\nconst DEFAULT_BASE_URL = \"https://athena-db.com\";\r\nconst DEFAULT_CLIENT = \"railway_direct\";\r\n\r\nfunction parseResponseText(text: string) {\r\n if (!text) return null;\r\n try {\r\n return JSON.parse(text);\r\n } catch {\r\n return text;\r\n }\r\n}\r\n\r\nfunction normalizeHeaderValue(value?: string | null) {\r\n return value ? value : undefined;\r\n}\r\n\r\nfunction buildHeaders(\r\n config: AthenaGatewayBaseOptions,\r\n options?: AthenaGatewayCallOptions,\r\n): Record<string, string> {\r\n const mergedStripNulls = options?.stripNulls ?? config.stripNulls ?? true;\r\n const finalClient = options?.client ?? config.client ?? DEFAULT_CLIENT;\r\n const finalApiKey = options?.apiKey ?? config.apiKey;\r\n const finalSupabaseUrl = options?.supabaseUrl ?? config.supabaseUrl;\r\n const finalSupabaseKey = options?.supabaseKey ?? config.supabaseKey;\r\n const finalPublishEvent = options?.publishEvent ?? config.publishEvent;\r\n const extraHeaders = {\r\n ...(config.headers ?? {}),\r\n ...(options?.headers ?? {}),\r\n };\r\n\r\n const headers: Record<string, string> = {\r\n \"Content-Type\": \"application/json\",\r\n };\r\n\r\n if (options?.userId ?? config.userId) {\r\n headers[\"X-User-Id\"] = options?.userId ?? config.userId ?? \"\";\r\n }\r\n\r\n if (options?.companyId ?? config.companyId) {\r\n headers[\"X-Company-Id\"] = options?.companyId ?? config.companyId ?? \"\";\r\n }\r\n\r\n if (options?.organizationId ?? config.organizationId) {\r\n headers[\"X-Organization-Id\"] =\r\n options?.organizationId ?? config.organizationId ?? \"\";\r\n }\r\n\r\n if (finalClient) {\r\n headers[\"X-Athena-Client\"] = finalClient;\r\n }\r\n\r\n if (typeof mergedStripNulls === \"boolean\") {\r\n headers[\"X-Strip-Nulls\"] = mergedStripNulls ? \"true\" : \"false\";\r\n }\r\n\r\n if (finalPublishEvent) {\r\n headers[\"X-Publish-Event\"] = finalPublishEvent;\r\n }\r\n\r\n if (finalApiKey) {\r\n headers[\"apikey\"] = finalApiKey;\r\n headers[\"x-api-key\"] = headers[\"x-api-key\"] ?? finalApiKey;\r\n }\r\n\r\n if (finalSupabaseUrl) {\r\n headers[\"x-supabase-url\"] = finalSupabaseUrl;\r\n }\r\n\r\n if (finalSupabaseKey) {\r\n headers[\"x-supabase-key\"] = finalSupabaseKey;\r\n }\r\n\r\n Object.entries(extraHeaders).forEach(([key, value]) => {\r\n const normalized = normalizeHeaderValue(value);\r\n if (normalized) {\r\n headers[key] = normalized;\r\n }\r\n });\r\n\r\n return headers;\r\n}\r\n\r\nasync function callAthena<T>(\r\n config: AthenaGatewayBaseOptions,\r\n endpoint: AthenaGatewayEndpointPath,\r\n method: AthenaGatewayMethod,\r\n payload: unknown,\r\n options?: AthenaGatewayCallOptions,\r\n): Promise<AthenaGatewayResponse<T>> {\r\n const baseUrl = (\r\n options?.baseUrl ??\r\n config.baseUrl ??\r\n DEFAULT_BASE_URL\r\n ).replace(/\\/$/, \"\");\r\n const url = `${baseUrl}${endpoint}`;\r\n const headers = buildHeaders(config, options);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method,\r\n headers,\r\n body: JSON.stringify(payload),\r\n });\r\n\r\n const rawText = await response.text();\r\n const parsed = parseResponseText(rawText ?? \"\");\r\n const parsedPayload = parsed as Record<string, unknown> | null;\r\n const parsedError =\r\n parsedPayload && typeof parsedPayload === \"object\"\r\n ? ((parsedPayload.error as string | undefined) ??\r\n (parsedPayload.message as string | undefined))\r\n : undefined;\r\n const hasError =\r\n typeof parsedError === \"string\" && parsedError.length > 0\r\n ? parsedError\r\n : undefined;\r\n\r\n // Unwrap envelope: API may return { data: [...], error: null } (e.g. when cached)\r\n // vs raw array when uncached. Use inner data when present to avoid double nesting.\r\n const payloadData =\r\n parsedPayload &&\r\n typeof parsedPayload === \"object\" &&\r\n \"data\" in parsedPayload\r\n ? (parsedPayload.data as T)\r\n : (parsed as T);\r\n\r\n return {\r\n ok: response.ok,\r\n status: response.status,\r\n data: payloadData ?? null,\r\n error: hasError,\r\n raw: parsed,\r\n };\r\n } catch (callError) {\r\n const message =\r\n callError instanceof Error ? callError.message : String(callError);\r\n return {\r\n ok: false,\r\n status: 0,\r\n data: null,\r\n error: message,\r\n raw: null,\r\n };\r\n }\r\n}\r\n\r\nexport interface AthenaGatewayClient {\r\n baseUrl: string;\r\n buildHeaders(options?: AthenaGatewayCallOptions): Record<string, string>;\r\n fetchGateway<T>(\r\n payload: AthenaFetchPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n insertGateway<T>(\r\n payload: AthenaInsertPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n updateGateway<T>(\r\n payload: AthenaUpdatePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n deleteGateway<T>(\r\n payload: AthenaDeletePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n}\r\n\r\nexport function createAthenaGatewayClient(\r\n config: AthenaGatewayBaseOptions = {},\r\n): AthenaGatewayClient {\r\n return {\r\n baseUrl: (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\"),\r\n buildHeaders(options) {\r\n return buildHeaders(config, options);\r\n },\r\n fetchGateway(payload, options) {\r\n return callAthena(config, \"/gateway/fetch\", \"POST\", payload, options);\r\n },\r\n insertGateway(payload, options) {\r\n return callAthena(config, \"/gateway/insert\", \"PUT\", payload, options);\r\n },\r\n updateGateway(payload, options) {\r\n return callAthena(config, \"/gateway/update\", \"POST\", payload, options);\r\n },\r\n deleteGateway(payload, options) {\r\n return callAthena(config, \"/gateway/delete\", \"DELETE\", payload, options);\r\n },\r\n };\r\n}\r\n","import { useCallback, useMemo, useState } from \"react\";\r\nimport type {\r\n AthenaDeletePayload,\r\n AthenaFetchPayload,\r\n AthenaGatewayCallLog,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayHookConfig,\r\n AthenaGatewayHookResult,\r\n AthenaGatewayResponse,\r\n AthenaGatewayResponseLog,\r\n AthenaInsertPayload,\r\n AthenaUpdatePayload,\r\n} from \"./types.js\";\r\nimport { createAthenaGatewayClient } from \"./client.js\";\r\n\r\nexport function useAthenaGateway(\r\n config?: AthenaGatewayHookConfig,\r\n): AthenaGatewayHookResult {\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [lastRequest, setLastRequest] = useState<AthenaGatewayCallLog | null>(\r\n null,\r\n );\r\n const [lastResponse, setLastResponse] =\r\n useState<AthenaGatewayResponseLog | null>(null);\r\n\r\n const client = useMemo(\r\n () =>\r\n createAthenaGatewayClient({\r\n client: config?.client,\r\n baseUrl: config?.baseUrl,\r\n apiKey: config?.apiKey,\r\n supabaseUrl: config?.supabaseUrl,\r\n supabaseKey: config?.supabaseKey,\r\n publishEvent: config?.publishEvent,\r\n stripNulls: config?.stripNulls,\r\n headers: config?.headers,\r\n userId: config?.userId,\r\n companyId: config?.companyId,\r\n organizationId: config?.organizationId,\r\n }),\r\n [\r\n config?.baseUrl,\r\n config?.client,\r\n config?.apiKey,\r\n config?.supabaseUrl,\r\n config?.supabaseKey,\r\n config?.publishEvent,\r\n config?.stripNulls,\r\n config?.headers,\r\n config?.userId,\r\n config?.companyId,\r\n config?.organizationId,\r\n ],\r\n );\r\n\r\n const callWithLifecycle = useCallback(\r\n async <T>(\r\n fn: () => Promise<AthenaGatewayResponse<T>>,\r\n metadata: {\r\n endpoint: string;\r\n method: string;\r\n payload: unknown;\r\n options?: AthenaGatewayCallOptions;\r\n },\r\n ): Promise<AthenaGatewayResponse<T>> => {\r\n const requestLog: AthenaGatewayCallLog = {\r\n endpoint: metadata.endpoint as any,\r\n method: metadata.method as any,\r\n payload: metadata.payload,\r\n headers: client.buildHeaders(metadata.options),\r\n timestamp: new Date().toISOString(),\r\n };\r\n\r\n setLastRequest(requestLog);\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n let response: AthenaGatewayResponse<T> | undefined;\r\n try {\r\n response = await fn();\r\n setLastResponse({ ...response, timestamp: new Date().toISOString() });\r\n\r\n if (!response.ok) {\r\n const message =\r\n response.error ||\r\n `Athena gateway ${metadata.method} ${metadata.endpoint} failed`;\r\n setError(message);\r\n throw new Error(message);\r\n }\r\n\r\n return response;\r\n } catch (callError) {\r\n const message =\r\n callError instanceof Error ? callError.message : String(callError);\r\n setError(message);\r\n setLastResponse({\r\n timestamp: new Date().toISOString(),\r\n status: response?.status ?? 0,\r\n ok: false,\r\n data: null,\r\n raw: null,\r\n error: message,\r\n });\r\n throw callError;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [client],\r\n );\r\n\r\n const normalizedConfigStripNulls = useMemo(\r\n () => config?.stripNulls ?? true,\r\n [config?.stripNulls],\r\n );\r\n\r\n const fetchGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaFetchPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n const normalizedPayload: AthenaFetchPayload = {\r\n ...payload,\r\n conditions: payload.conditions ?? [],\r\n strip_nulls:\r\n payload.strip_nulls ??\r\n options?.stripNulls ??\r\n normalizedConfigStripNulls,\r\n };\r\n return callWithLifecycle<T>(\r\n () => client.fetchGateway<T>(normalizedPayload, options),\r\n {\r\n endpoint: \"/gateway/fetch\",\r\n method: \"POST\",\r\n payload: normalizedPayload,\r\n options,\r\n },\r\n );\r\n },\r\n [callWithLifecycle, client, normalizedConfigStripNulls],\r\n );\r\n\r\n const insertGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaInsertPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) =>\r\n callWithLifecycle<T>(() => client.insertGateway<T>(payload, options), {\r\n endpoint: \"/gateway/insert\",\r\n method: \"PUT\",\r\n payload,\r\n options,\r\n }),\r\n [callWithLifecycle, client],\r\n );\r\n\r\n const updateGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaUpdatePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n const normalizedPayload: AthenaUpdatePayload = {\r\n ...payload,\r\n conditions: payload.conditions ?? [],\r\n strip_nulls:\r\n payload.strip_nulls ??\r\n options?.stripNulls ??\r\n normalizedConfigStripNulls,\r\n };\r\n return callWithLifecycle<T>(\r\n () => client.updateGateway<T>(normalizedPayload, options),\r\n {\r\n endpoint: \"/gateway/update\",\r\n method: \"POST\",\r\n payload: normalizedPayload,\r\n options,\r\n },\r\n );\r\n },\r\n [callWithLifecycle, client, normalizedConfigStripNulls],\r\n );\r\n\r\n const deleteGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaDeletePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n if (!payload.resource_id) {\r\n throw new Error(\r\n \"deleteGateway requires resource_id (the unique identifier of the record to delete)\",\r\n );\r\n }\r\n return callWithLifecycle<T>(\r\n () => client.deleteGateway<T>(payload, options),\r\n { endpoint: \"/gateway/delete\", method: \"DELETE\", payload, options },\r\n );\r\n },\r\n [callWithLifecycle, client],\r\n );\r\n\r\n return {\r\n fetchGateway,\r\n insertGateway,\r\n updateGateway,\r\n deleteGateway,\r\n isLoading,\r\n error,\r\n lastRequest,\r\n lastResponse,\r\n baseUrl: client.baseUrl,\r\n };\r\n}\r\n"]}
package/dist/react.mjs CHANGED
@@ -81,10 +81,11 @@ async function callAthena(config, endpoint, method, payload, options) {
81
81
  const parsedPayload = parsed;
82
82
  const parsedError = parsedPayload && typeof parsedPayload === "object" ? parsedPayload.error ?? parsedPayload.message : void 0;
83
83
  const hasError = typeof parsedError === "string" && parsedError.length > 0 ? parsedError : void 0;
84
+ const payloadData = parsedPayload && typeof parsedPayload === "object" && "data" in parsedPayload ? parsedPayload.data : parsed;
84
85
  return {
85
86
  ok: response.ok,
86
87
  status: response.status,
87
- data: parsed ?? null,
88
+ data: payloadData ?? null,
88
89
  error: hasError,
89
90
  raw: parsed
90
91
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/gateway/client.ts","../src/gateway/use-athena-gateway.ts"],"names":[],"mappings":"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","file":"react.mjs","sourcesContent":["import type {\r\n AthenaGatewayBaseOptions,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayEndpointPath,\r\n AthenaGatewayMethod,\r\n AthenaGatewayResponse,\r\n} from \"./types.js\";\r\nimport type {\r\n AthenaDeletePayload,\r\n AthenaFetchPayload,\r\n AthenaInsertPayload,\r\n AthenaUpdatePayload,\r\n} from \"./types.js\";\r\n\r\nconst DEFAULT_BASE_URL = \"https://athena-db.com\";\r\nconst DEFAULT_CLIENT = \"railway_direct\";\r\n\r\nfunction parseResponseText(text: string) {\r\n if (!text) return null;\r\n try {\r\n return JSON.parse(text);\r\n } catch {\r\n return text;\r\n }\r\n}\r\n\r\nfunction normalizeHeaderValue(value?: string | null) {\r\n return value ? value : undefined;\r\n}\r\n\r\nfunction buildHeaders(\r\n config: AthenaGatewayBaseOptions,\r\n options?: AthenaGatewayCallOptions,\r\n): Record<string, string> {\r\n const mergedStripNulls = options?.stripNulls ?? config.stripNulls ?? true;\r\n const finalClient = options?.client ?? config.client ?? DEFAULT_CLIENT;\r\n const finalApiKey = options?.apiKey ?? config.apiKey;\r\n const finalSupabaseUrl = options?.supabaseUrl ?? config.supabaseUrl;\r\n const finalSupabaseKey = options?.supabaseKey ?? config.supabaseKey;\r\n const finalPublishEvent = options?.publishEvent ?? config.publishEvent;\r\n const extraHeaders = {\r\n ...(config.headers ?? {}),\r\n ...(options?.headers ?? {}),\r\n };\r\n\r\n const headers: Record<string, string> = {\r\n \"Content-Type\": \"application/json\",\r\n };\r\n\r\n if (options?.userId ?? config.userId) {\r\n headers[\"X-User-Id\"] = options?.userId ?? config.userId ?? \"\";\r\n }\r\n\r\n if (options?.companyId ?? config.companyId) {\r\n headers[\"X-Company-Id\"] = options?.companyId ?? config.companyId ?? \"\";\r\n }\r\n\r\n if (options?.organizationId ?? config.organizationId) {\r\n headers[\"X-Organization-Id\"] =\r\n options?.organizationId ?? config.organizationId ?? \"\";\r\n }\r\n\r\n if (finalClient) {\r\n headers[\"X-Athena-Client\"] = finalClient;\r\n }\r\n\r\n if (typeof mergedStripNulls === \"boolean\") {\r\n headers[\"X-Strip-Nulls\"] = mergedStripNulls ? \"true\" : \"false\";\r\n }\r\n\r\n if (finalPublishEvent) {\r\n headers[\"X-Publish-Event\"] = finalPublishEvent;\r\n }\r\n\r\n if (finalApiKey) {\r\n headers[\"apikey\"] = finalApiKey;\r\n headers[\"x-api-key\"] = headers[\"x-api-key\"] ?? finalApiKey;\r\n }\r\n\r\n if (finalSupabaseUrl) {\r\n headers[\"x-supabase-url\"] = finalSupabaseUrl;\r\n }\r\n\r\n if (finalSupabaseKey) {\r\n headers[\"x-supabase-key\"] = finalSupabaseKey;\r\n }\r\n\r\n Object.entries(extraHeaders).forEach(([key, value]) => {\r\n const normalized = normalizeHeaderValue(value);\r\n if (normalized) {\r\n headers[key] = normalized;\r\n }\r\n });\r\n\r\n return headers;\r\n}\r\n\r\nasync function callAthena<T>(\r\n config: AthenaGatewayBaseOptions,\r\n endpoint: AthenaGatewayEndpointPath,\r\n method: AthenaGatewayMethod,\r\n payload: unknown,\r\n options?: AthenaGatewayCallOptions,\r\n): Promise<AthenaGatewayResponse<T>> {\r\n const baseUrl = (\r\n options?.baseUrl ??\r\n config.baseUrl ??\r\n DEFAULT_BASE_URL\r\n ).replace(/\\/$/, \"\");\r\n const url = `${baseUrl}${endpoint}`;\r\n const headers = buildHeaders(config, options);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method,\r\n headers,\r\n body: JSON.stringify(payload),\r\n });\r\n\r\n const rawText = await response.text();\r\n const parsed = parseResponseText(rawText ?? \"\");\r\n const parsedPayload = parsed as Record<string, unknown> | null;\r\n const parsedError =\r\n parsedPayload && typeof parsedPayload === \"object\"\r\n ? ((parsedPayload.error as string | undefined) ??\r\n (parsedPayload.message as string | undefined))\r\n : undefined;\r\n const hasError =\r\n typeof parsedError === \"string\" && parsedError.length > 0\r\n ? parsedError\r\n : undefined;\r\n\r\n return {\r\n ok: response.ok,\r\n status: response.status,\r\n data: (parsed as T) ?? null,\r\n error: hasError,\r\n raw: parsed,\r\n };\r\n } catch (callError) {\r\n const message =\r\n callError instanceof Error ? callError.message : String(callError);\r\n return {\r\n ok: false,\r\n status: 0,\r\n data: null,\r\n error: message,\r\n raw: null,\r\n };\r\n }\r\n}\r\n\r\nexport interface AthenaGatewayClient {\r\n baseUrl: string;\r\n buildHeaders(options?: AthenaGatewayCallOptions): Record<string, string>;\r\n fetchGateway<T>(\r\n payload: AthenaFetchPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n insertGateway<T>(\r\n payload: AthenaInsertPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n updateGateway<T>(\r\n payload: AthenaUpdatePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n deleteGateway<T>(\r\n payload: AthenaDeletePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n}\r\n\r\nexport function createAthenaGatewayClient(\r\n config: AthenaGatewayBaseOptions = {},\r\n): AthenaGatewayClient {\r\n return {\r\n baseUrl: (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\"),\r\n buildHeaders(options) {\r\n return buildHeaders(config, options);\r\n },\r\n fetchGateway(payload, options) {\r\n return callAthena(config, \"/gateway/fetch\", \"POST\", payload, options);\r\n },\r\n insertGateway(payload, options) {\r\n return callAthena(config, \"/gateway/insert\", \"PUT\", payload, options);\r\n },\r\n updateGateway(payload, options) {\r\n return callAthena(config, \"/gateway/update\", \"POST\", payload, options);\r\n },\r\n deleteGateway(payload, options) {\r\n return callAthena(config, \"/gateway/delete\", \"DELETE\", payload, options);\r\n },\r\n };\r\n}\r\n","import { useCallback, useMemo, useState } from \"react\";\r\nimport type {\r\n AthenaDeletePayload,\r\n AthenaFetchPayload,\r\n AthenaGatewayCallLog,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayHookConfig,\r\n AthenaGatewayHookResult,\r\n AthenaGatewayResponse,\r\n AthenaGatewayResponseLog,\r\n AthenaInsertPayload,\r\n AthenaUpdatePayload,\r\n} from \"./types.js\";\r\nimport { createAthenaGatewayClient } from \"./client.js\";\r\n\r\nexport function useAthenaGateway(\r\n config?: AthenaGatewayHookConfig,\r\n): AthenaGatewayHookResult {\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [lastRequest, setLastRequest] = useState<AthenaGatewayCallLog | null>(\r\n null,\r\n );\r\n const [lastResponse, setLastResponse] =\r\n useState<AthenaGatewayResponseLog | null>(null);\r\n\r\n const client = useMemo(\r\n () =>\r\n createAthenaGatewayClient({\r\n client: config?.client,\r\n baseUrl: config?.baseUrl,\r\n apiKey: config?.apiKey,\r\n supabaseUrl: config?.supabaseUrl,\r\n supabaseKey: config?.supabaseKey,\r\n publishEvent: config?.publishEvent,\r\n stripNulls: config?.stripNulls,\r\n headers: config?.headers,\r\n userId: config?.userId,\r\n companyId: config?.companyId,\r\n organizationId: config?.organizationId,\r\n }),\r\n [\r\n config?.baseUrl,\r\n config?.client,\r\n config?.apiKey,\r\n config?.supabaseUrl,\r\n config?.supabaseKey,\r\n config?.publishEvent,\r\n config?.stripNulls,\r\n config?.headers,\r\n config?.userId,\r\n config?.companyId,\r\n config?.organizationId,\r\n ],\r\n );\r\n\r\n const callWithLifecycle = useCallback(\r\n async <T>(\r\n fn: () => Promise<AthenaGatewayResponse<T>>,\r\n metadata: {\r\n endpoint: string;\r\n method: string;\r\n payload: unknown;\r\n options?: AthenaGatewayCallOptions;\r\n },\r\n ): Promise<AthenaGatewayResponse<T>> => {\r\n const requestLog: AthenaGatewayCallLog = {\r\n endpoint: metadata.endpoint as any,\r\n method: metadata.method as any,\r\n payload: metadata.payload,\r\n headers: client.buildHeaders(metadata.options),\r\n timestamp: new Date().toISOString(),\r\n };\r\n\r\n setLastRequest(requestLog);\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n let response: AthenaGatewayResponse<T> | undefined;\r\n try {\r\n response = await fn();\r\n setLastResponse({ ...response, timestamp: new Date().toISOString() });\r\n\r\n if (!response.ok) {\r\n const message =\r\n response.error ||\r\n `Athena gateway ${metadata.method} ${metadata.endpoint} failed`;\r\n setError(message);\r\n throw new Error(message);\r\n }\r\n\r\n return response;\r\n } catch (callError) {\r\n const message =\r\n callError instanceof Error ? callError.message : String(callError);\r\n setError(message);\r\n setLastResponse({\r\n timestamp: new Date().toISOString(),\r\n status: response?.status ?? 0,\r\n ok: false,\r\n data: null,\r\n raw: null,\r\n error: message,\r\n });\r\n throw callError;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [client],\r\n );\r\n\r\n const normalizedConfigStripNulls = useMemo(\r\n () => config?.stripNulls ?? true,\r\n [config?.stripNulls],\r\n );\r\n\r\n const fetchGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaFetchPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n const normalizedPayload: AthenaFetchPayload = {\r\n ...payload,\r\n conditions: payload.conditions ?? [],\r\n strip_nulls:\r\n payload.strip_nulls ??\r\n options?.stripNulls ??\r\n normalizedConfigStripNulls,\r\n };\r\n return callWithLifecycle<T>(\r\n () => client.fetchGateway<T>(normalizedPayload, options),\r\n {\r\n endpoint: \"/gateway/fetch\",\r\n method: \"POST\",\r\n payload: normalizedPayload,\r\n options,\r\n },\r\n );\r\n },\r\n [callWithLifecycle, client, normalizedConfigStripNulls],\r\n );\r\n\r\n const insertGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaInsertPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) =>\r\n callWithLifecycle<T>(() => client.insertGateway<T>(payload, options), {\r\n endpoint: \"/gateway/insert\",\r\n method: \"PUT\",\r\n payload,\r\n options,\r\n }),\r\n [callWithLifecycle, client],\r\n );\r\n\r\n const updateGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaUpdatePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n const normalizedPayload: AthenaUpdatePayload = {\r\n ...payload,\r\n conditions: payload.conditions ?? [],\r\n strip_nulls:\r\n payload.strip_nulls ??\r\n options?.stripNulls ??\r\n normalizedConfigStripNulls,\r\n };\r\n return callWithLifecycle<T>(\r\n () => client.updateGateway<T>(normalizedPayload, options),\r\n {\r\n endpoint: \"/gateway/update\",\r\n method: \"POST\",\r\n payload: normalizedPayload,\r\n options,\r\n },\r\n );\r\n },\r\n [callWithLifecycle, client, normalizedConfigStripNulls],\r\n );\r\n\r\n const deleteGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaDeletePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n if (!payload.resource_id) {\r\n throw new Error(\r\n \"deleteGateway requires resource_id (the unique identifier of the record to delete)\",\r\n );\r\n }\r\n return callWithLifecycle<T>(\r\n () => client.deleteGateway<T>(payload, options),\r\n { endpoint: \"/gateway/delete\", method: \"DELETE\", payload, options },\r\n );\r\n },\r\n [callWithLifecycle, client],\r\n );\r\n\r\n return {\r\n fetchGateway,\r\n insertGateway,\r\n updateGateway,\r\n deleteGateway,\r\n isLoading,\r\n error,\r\n lastRequest,\r\n lastResponse,\r\n baseUrl: client.baseUrl,\r\n };\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/gateway/client.ts","../src/gateway/use-athena-gateway.ts"],"names":[],"mappings":"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","file":"react.mjs","sourcesContent":["import type {\r\n AthenaGatewayBaseOptions,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayEndpointPath,\r\n AthenaGatewayMethod,\r\n AthenaGatewayResponse,\r\n} from \"./types.js\";\r\nimport type {\r\n AthenaDeletePayload,\r\n AthenaFetchPayload,\r\n AthenaInsertPayload,\r\n AthenaUpdatePayload,\r\n} from \"./types.js\";\r\n\r\nconst DEFAULT_BASE_URL = \"https://athena-db.com\";\r\nconst DEFAULT_CLIENT = \"railway_direct\";\r\n\r\nfunction parseResponseText(text: string) {\r\n if (!text) return null;\r\n try {\r\n return JSON.parse(text);\r\n } catch {\r\n return text;\r\n }\r\n}\r\n\r\nfunction normalizeHeaderValue(value?: string | null) {\r\n return value ? value : undefined;\r\n}\r\n\r\nfunction buildHeaders(\r\n config: AthenaGatewayBaseOptions,\r\n options?: AthenaGatewayCallOptions,\r\n): Record<string, string> {\r\n const mergedStripNulls = options?.stripNulls ?? config.stripNulls ?? true;\r\n const finalClient = options?.client ?? config.client ?? DEFAULT_CLIENT;\r\n const finalApiKey = options?.apiKey ?? config.apiKey;\r\n const finalSupabaseUrl = options?.supabaseUrl ?? config.supabaseUrl;\r\n const finalSupabaseKey = options?.supabaseKey ?? config.supabaseKey;\r\n const finalPublishEvent = options?.publishEvent ?? config.publishEvent;\r\n const extraHeaders = {\r\n ...(config.headers ?? {}),\r\n ...(options?.headers ?? {}),\r\n };\r\n\r\n const headers: Record<string, string> = {\r\n \"Content-Type\": \"application/json\",\r\n };\r\n\r\n if (options?.userId ?? config.userId) {\r\n headers[\"X-User-Id\"] = options?.userId ?? config.userId ?? \"\";\r\n }\r\n\r\n if (options?.companyId ?? config.companyId) {\r\n headers[\"X-Company-Id\"] = options?.companyId ?? config.companyId ?? \"\";\r\n }\r\n\r\n if (options?.organizationId ?? config.organizationId) {\r\n headers[\"X-Organization-Id\"] =\r\n options?.organizationId ?? config.organizationId ?? \"\";\r\n }\r\n\r\n if (finalClient) {\r\n headers[\"X-Athena-Client\"] = finalClient;\r\n }\r\n\r\n if (typeof mergedStripNulls === \"boolean\") {\r\n headers[\"X-Strip-Nulls\"] = mergedStripNulls ? \"true\" : \"false\";\r\n }\r\n\r\n if (finalPublishEvent) {\r\n headers[\"X-Publish-Event\"] = finalPublishEvent;\r\n }\r\n\r\n if (finalApiKey) {\r\n headers[\"apikey\"] = finalApiKey;\r\n headers[\"x-api-key\"] = headers[\"x-api-key\"] ?? finalApiKey;\r\n }\r\n\r\n if (finalSupabaseUrl) {\r\n headers[\"x-supabase-url\"] = finalSupabaseUrl;\r\n }\r\n\r\n if (finalSupabaseKey) {\r\n headers[\"x-supabase-key\"] = finalSupabaseKey;\r\n }\r\n\r\n Object.entries(extraHeaders).forEach(([key, value]) => {\r\n const normalized = normalizeHeaderValue(value);\r\n if (normalized) {\r\n headers[key] = normalized;\r\n }\r\n });\r\n\r\n return headers;\r\n}\r\n\r\nasync function callAthena<T>(\r\n config: AthenaGatewayBaseOptions,\r\n endpoint: AthenaGatewayEndpointPath,\r\n method: AthenaGatewayMethod,\r\n payload: unknown,\r\n options?: AthenaGatewayCallOptions,\r\n): Promise<AthenaGatewayResponse<T>> {\r\n const baseUrl = (\r\n options?.baseUrl ??\r\n config.baseUrl ??\r\n DEFAULT_BASE_URL\r\n ).replace(/\\/$/, \"\");\r\n const url = `${baseUrl}${endpoint}`;\r\n const headers = buildHeaders(config, options);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method,\r\n headers,\r\n body: JSON.stringify(payload),\r\n });\r\n\r\n const rawText = await response.text();\r\n const parsed = parseResponseText(rawText ?? \"\");\r\n const parsedPayload = parsed as Record<string, unknown> | null;\r\n const parsedError =\r\n parsedPayload && typeof parsedPayload === \"object\"\r\n ? ((parsedPayload.error as string | undefined) ??\r\n (parsedPayload.message as string | undefined))\r\n : undefined;\r\n const hasError =\r\n typeof parsedError === \"string\" && parsedError.length > 0\r\n ? parsedError\r\n : undefined;\r\n\r\n // Unwrap envelope: API may return { data: [...], error: null } (e.g. when cached)\r\n // vs raw array when uncached. Use inner data when present to avoid double nesting.\r\n const payloadData =\r\n parsedPayload &&\r\n typeof parsedPayload === \"object\" &&\r\n \"data\" in parsedPayload\r\n ? (parsedPayload.data as T)\r\n : (parsed as T);\r\n\r\n return {\r\n ok: response.ok,\r\n status: response.status,\r\n data: payloadData ?? null,\r\n error: hasError,\r\n raw: parsed,\r\n };\r\n } catch (callError) {\r\n const message =\r\n callError instanceof Error ? callError.message : String(callError);\r\n return {\r\n ok: false,\r\n status: 0,\r\n data: null,\r\n error: message,\r\n raw: null,\r\n };\r\n }\r\n}\r\n\r\nexport interface AthenaGatewayClient {\r\n baseUrl: string;\r\n buildHeaders(options?: AthenaGatewayCallOptions): Record<string, string>;\r\n fetchGateway<T>(\r\n payload: AthenaFetchPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n insertGateway<T>(\r\n payload: AthenaInsertPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n updateGateway<T>(\r\n payload: AthenaUpdatePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n deleteGateway<T>(\r\n payload: AthenaDeletePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n}\r\n\r\nexport function createAthenaGatewayClient(\r\n config: AthenaGatewayBaseOptions = {},\r\n): AthenaGatewayClient {\r\n return {\r\n baseUrl: (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\"),\r\n buildHeaders(options) {\r\n return buildHeaders(config, options);\r\n },\r\n fetchGateway(payload, options) {\r\n return callAthena(config, \"/gateway/fetch\", \"POST\", payload, options);\r\n },\r\n insertGateway(payload, options) {\r\n return callAthena(config, \"/gateway/insert\", \"PUT\", payload, options);\r\n },\r\n updateGateway(payload, options) {\r\n return callAthena(config, \"/gateway/update\", \"POST\", payload, options);\r\n },\r\n deleteGateway(payload, options) {\r\n return callAthena(config, \"/gateway/delete\", \"DELETE\", payload, options);\r\n },\r\n };\r\n}\r\n","import { useCallback, useMemo, useState } from \"react\";\r\nimport type {\r\n AthenaDeletePayload,\r\n AthenaFetchPayload,\r\n AthenaGatewayCallLog,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayHookConfig,\r\n AthenaGatewayHookResult,\r\n AthenaGatewayResponse,\r\n AthenaGatewayResponseLog,\r\n AthenaInsertPayload,\r\n AthenaUpdatePayload,\r\n} from \"./types.js\";\r\nimport { createAthenaGatewayClient } from \"./client.js\";\r\n\r\nexport function useAthenaGateway(\r\n config?: AthenaGatewayHookConfig,\r\n): AthenaGatewayHookResult {\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [lastRequest, setLastRequest] = useState<AthenaGatewayCallLog | null>(\r\n null,\r\n );\r\n const [lastResponse, setLastResponse] =\r\n useState<AthenaGatewayResponseLog | null>(null);\r\n\r\n const client = useMemo(\r\n () =>\r\n createAthenaGatewayClient({\r\n client: config?.client,\r\n baseUrl: config?.baseUrl,\r\n apiKey: config?.apiKey,\r\n supabaseUrl: config?.supabaseUrl,\r\n supabaseKey: config?.supabaseKey,\r\n publishEvent: config?.publishEvent,\r\n stripNulls: config?.stripNulls,\r\n headers: config?.headers,\r\n userId: config?.userId,\r\n companyId: config?.companyId,\r\n organizationId: config?.organizationId,\r\n }),\r\n [\r\n config?.baseUrl,\r\n config?.client,\r\n config?.apiKey,\r\n config?.supabaseUrl,\r\n config?.supabaseKey,\r\n config?.publishEvent,\r\n config?.stripNulls,\r\n config?.headers,\r\n config?.userId,\r\n config?.companyId,\r\n config?.organizationId,\r\n ],\r\n );\r\n\r\n const callWithLifecycle = useCallback(\r\n async <T>(\r\n fn: () => Promise<AthenaGatewayResponse<T>>,\r\n metadata: {\r\n endpoint: string;\r\n method: string;\r\n payload: unknown;\r\n options?: AthenaGatewayCallOptions;\r\n },\r\n ): Promise<AthenaGatewayResponse<T>> => {\r\n const requestLog: AthenaGatewayCallLog = {\r\n endpoint: metadata.endpoint as any,\r\n method: metadata.method as any,\r\n payload: metadata.payload,\r\n headers: client.buildHeaders(metadata.options),\r\n timestamp: new Date().toISOString(),\r\n };\r\n\r\n setLastRequest(requestLog);\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n let response: AthenaGatewayResponse<T> | undefined;\r\n try {\r\n response = await fn();\r\n setLastResponse({ ...response, timestamp: new Date().toISOString() });\r\n\r\n if (!response.ok) {\r\n const message =\r\n response.error ||\r\n `Athena gateway ${metadata.method} ${metadata.endpoint} failed`;\r\n setError(message);\r\n throw new Error(message);\r\n }\r\n\r\n return response;\r\n } catch (callError) {\r\n const message =\r\n callError instanceof Error ? callError.message : String(callError);\r\n setError(message);\r\n setLastResponse({\r\n timestamp: new Date().toISOString(),\r\n status: response?.status ?? 0,\r\n ok: false,\r\n data: null,\r\n raw: null,\r\n error: message,\r\n });\r\n throw callError;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [client],\r\n );\r\n\r\n const normalizedConfigStripNulls = useMemo(\r\n () => config?.stripNulls ?? true,\r\n [config?.stripNulls],\r\n );\r\n\r\n const fetchGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaFetchPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n const normalizedPayload: AthenaFetchPayload = {\r\n ...payload,\r\n conditions: payload.conditions ?? [],\r\n strip_nulls:\r\n payload.strip_nulls ??\r\n options?.stripNulls ??\r\n normalizedConfigStripNulls,\r\n };\r\n return callWithLifecycle<T>(\r\n () => client.fetchGateway<T>(normalizedPayload, options),\r\n {\r\n endpoint: \"/gateway/fetch\",\r\n method: \"POST\",\r\n payload: normalizedPayload,\r\n options,\r\n },\r\n );\r\n },\r\n [callWithLifecycle, client, normalizedConfigStripNulls],\r\n );\r\n\r\n const insertGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaInsertPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) =>\r\n callWithLifecycle<T>(() => client.insertGateway<T>(payload, options), {\r\n endpoint: \"/gateway/insert\",\r\n method: \"PUT\",\r\n payload,\r\n options,\r\n }),\r\n [callWithLifecycle, client],\r\n );\r\n\r\n const updateGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaUpdatePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n const normalizedPayload: AthenaUpdatePayload = {\r\n ...payload,\r\n conditions: payload.conditions ?? [],\r\n strip_nulls:\r\n payload.strip_nulls ??\r\n options?.stripNulls ??\r\n normalizedConfigStripNulls,\r\n };\r\n return callWithLifecycle<T>(\r\n () => client.updateGateway<T>(normalizedPayload, options),\r\n {\r\n endpoint: \"/gateway/update\",\r\n method: \"POST\",\r\n payload: normalizedPayload,\r\n options,\r\n },\r\n );\r\n },\r\n [callWithLifecycle, client, normalizedConfigStripNulls],\r\n );\r\n\r\n const deleteGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaDeletePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n if (!payload.resource_id) {\r\n throw new Error(\r\n \"deleteGateway requires resource_id (the unique identifier of the record to delete)\",\r\n );\r\n }\r\n return callWithLifecycle<T>(\r\n () => client.deleteGateway<T>(payload, options),\r\n { endpoint: \"/gateway/delete\", method: \"DELETE\", payload, options },\r\n );\r\n },\r\n [callWithLifecycle, client],\r\n );\r\n\r\n return {\r\n fetchGateway,\r\n insertGateway,\r\n updateGateway,\r\n deleteGateway,\r\n isLoading,\r\n error,\r\n lastRequest,\r\n lastResponse,\r\n baseUrl: client.baseUrl,\r\n };\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@xylex-group/athena",
3
- "version": "0.2.1",
3
+ "version": "1.0.2",
4
4
  "description": "Athena SDK",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
7
7
  "types": "./dist/index.d.ts",
8
8
  "bin": {
9
- "athena-js": "./bin/athena-js.js"
9
+ "athena-js": "bin/athena-js.js"
10
10
  },
11
11
  "exports": {
12
12
  ".": {
@@ -29,9 +29,9 @@
29
29
  "scripts": {
30
30
  "build": "tsup",
31
31
  "dev": "tsup --watch",
32
- "test": "node --test test/**/*.test.ts",
33
- "test:watch": "node --test --watch test/**/*.test.ts",
34
- "lint": "eslint \"src/**/*.ts\" \"examples/**/*.ts\" \"test/**/*.ts\"",
32
+ "test": "node --test test/*.test.ts",
33
+ "test:watch": "node --test --watch test/*.test.ts",
34
+ "lint": "eslint \"src/**/*.ts\" \"test/**/*.ts\"",
35
35
  "lint:fix": "npm run lint -- --fix",
36
36
  "prepublishOnly": "npm run build",
37
37
  "publish:token": "node scripts/publish.js",
@@ -41,7 +41,6 @@
41
41
  "example:retry-patterns": "cd examples/retry-patterns && bun run start",
42
42
  "example:email-resend": "cd examples/email-resend && bun run start",
43
43
  "example:api-call": "cd examples/api-call && bun run start",
44
- "example:supabase-fetch": "cd examples/supabase-fetch && bun run start",
45
44
  "example:postgres-connection": "cd examples/postgres-connection && bun run start"
46
45
  },
47
46
  "keywords": [
@@ -53,7 +52,6 @@
53
52
  "hooks",
54
53
  "http",
55
54
  "postgres",
56
- "supabase",
57
55
  "query-builder"
58
56
  ],
59
57
  "author": "floris@xylex.group",
@@ -61,9 +59,10 @@
61
59
  "license": "MIT",
62
60
  "repository": {
63
61
  "type": "git",
64
- "url": "https://github.com/xylex-group/athena-js"
62
+ "url": "git+https://github.com/xylex-group/athena-js.git"
65
63
  },
66
64
  "dependencies": {
65
+ "@xylex-group/athena": "^0.2.1",
67
66
  "blessed": "^0.1.81",
68
67
  "chalk": "^4.1.2",
69
68
  "cron-parser": "^4.9.0",