@xylex-group/athena 0.2.1 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -15,31 +15,32 @@ function normalizeHeaderValue(value) {
15
15
  return value ? value : void 0;
16
16
  }
17
17
  function buildHeaders(config, options) {
18
- const mergedStripNulls = options?.stripNulls ?? config.stripNulls ?? true;
19
- const finalClient = options?.client ?? config.client ?? DEFAULT_CLIENT;
20
- const finalApiKey = options?.apiKey ?? config.apiKey;
21
- const finalSupabaseUrl = options?.supabaseUrl ?? config.supabaseUrl;
22
- const finalSupabaseKey = options?.supabaseKey ?? config.supabaseKey;
23
- const finalPublishEvent = options?.publishEvent ?? config.publishEvent;
18
+ const mergedStripNulls = options?.stripNulls ?? true;
24
19
  const extraHeaders = {
25
20
  ...config.headers ?? {},
26
21
  ...options?.headers ?? {}
27
22
  };
23
+ const headerClient = extraHeaders["x-athena-client"] ?? extraHeaders["X-Athena-Client"];
24
+ const finalClient = options?.client ?? config.client ?? (typeof headerClient === "string" ? headerClient : void 0) ?? DEFAULT_CLIENT;
25
+ const finalApiKey = options?.apiKey ?? config.apiKey;
26
+ const finalPublishEvent = options?.publishEvent ?? config.publishEvent;
28
27
  const headers = {
29
28
  "Content-Type": "application/json"
30
29
  };
31
30
  if (options?.userId ?? config.userId) {
32
31
  headers["X-User-Id"] = options?.userId ?? config.userId ?? "";
33
32
  }
34
- if (options?.companyId ?? config.companyId) {
35
- headers["X-Company-Id"] = options?.companyId ?? config.companyId ?? "";
36
- }
37
33
  if (options?.organizationId ?? config.organizationId) {
38
34
  headers["X-Organization-Id"] = options?.organizationId ?? config.organizationId ?? "";
39
35
  }
40
36
  if (finalClient) {
41
37
  headers["X-Athena-Client"] = finalClient;
42
38
  }
39
+ const finalBackend = options?.backend ?? config.backend;
40
+ if (finalBackend) {
41
+ const type = typeof finalBackend === "string" ? finalBackend : finalBackend.type;
42
+ if (type) headers["X-Backend-Type"] = type;
43
+ }
43
44
  if (typeof mergedStripNulls === "boolean") {
44
45
  headers["X-Strip-Nulls"] = mergedStripNulls ? "true" : "false";
45
46
  }
@@ -50,13 +51,9 @@ function buildHeaders(config, options) {
50
51
  headers["apikey"] = finalApiKey;
51
52
  headers["x-api-key"] = headers["x-api-key"] ?? finalApiKey;
52
53
  }
53
- if (finalSupabaseUrl) {
54
- headers["x-supabase-url"] = finalSupabaseUrl;
55
- }
56
- if (finalSupabaseKey) {
57
- headers["x-supabase-key"] = finalSupabaseKey;
58
- }
54
+ const athenaClientKeys = ["x-athena-client", "X-Athena-Client"];
59
55
  Object.entries(extraHeaders).forEach(([key, value]) => {
56
+ if (athenaClientKeys.includes(key)) return;
60
57
  const normalized = normalizeHeaderValue(value);
61
58
  if (normalized) {
62
59
  headers[key] = normalized;
@@ -79,10 +76,11 @@ async function callAthena(config, endpoint, method, payload, options) {
79
76
  const parsedPayload = parsed;
80
77
  const parsedError = parsedPayload && typeof parsedPayload === "object" ? parsedPayload.error ?? parsedPayload.message : void 0;
81
78
  const hasError = typeof parsedError === "string" && parsedError.length > 0 ? parsedError : void 0;
79
+ const payloadData = parsedPayload && typeof parsedPayload === "object" && "data" in parsedPayload ? parsedPayload.data : parsed;
82
80
  return {
83
81
  ok: response.ok,
84
82
  status: response.status,
85
- data: parsed ?? null,
83
+ data: payloadData ?? null,
86
84
  error: hasError,
87
85
  raw: parsed
88
86
  };
@@ -195,113 +193,145 @@ function stringifyFilterValue(value) {
195
193
  }
196
194
  return String(value);
197
195
  }
198
- function createTableBuilder(tableName, client) {
199
- const state = {
200
- conditions: []
201
- };
202
- const addCondition = (operator, column, value) => {
203
- const condition = { operator };
204
- if (column) condition.column = column;
205
- if (value !== void 0) condition.value = value;
206
- state.conditions.push(condition);
207
- };
208
- const builder = {
209
- reset() {
210
- state.conditions = [];
211
- state.limit = void 0;
212
- state.offset = void 0;
213
- return builder;
196
+ function createFilterMethods(state, addCondition, self) {
197
+ return {
198
+ eq(column, value) {
199
+ addCondition("eq", column, value);
200
+ return self;
201
+ },
202
+ match(filters) {
203
+ Object.entries(filters).forEach(([column, value]) => addCondition("eq", column, value));
204
+ return self;
214
205
  },
215
206
  range(from, to) {
216
207
  state.offset = from;
217
208
  state.limit = to - from + 1;
218
- return builder;
209
+ return self;
219
210
  },
220
211
  limit(count) {
221
212
  state.limit = count;
222
- return builder;
213
+ return self;
223
214
  },
224
215
  offset(count) {
225
216
  state.offset = count;
226
- return builder;
227
- },
228
- match(filters) {
229
- Object.entries(filters).forEach(([column, value]) => {
230
- addCondition("eq", column, value);
231
- });
232
- return builder;
233
- },
234
- eq(column, value) {
235
- addCondition("eq", column, value);
236
- return builder;
217
+ return self;
237
218
  },
238
219
  gt(column, value) {
239
220
  addCondition("gt", column, value);
240
- return builder;
221
+ return self;
241
222
  },
242
223
  gte(column, value) {
243
224
  addCondition("gte", column, value);
244
- return builder;
225
+ return self;
245
226
  },
246
227
  lt(column, value) {
247
228
  addCondition("lt", column, value);
248
- return builder;
229
+ return self;
249
230
  },
250
231
  lte(column, value) {
251
232
  addCondition("lte", column, value);
252
- return builder;
233
+ return self;
253
234
  },
254
235
  neq(column, value) {
255
236
  addCondition("neq", column, value);
256
- return builder;
237
+ return self;
257
238
  },
258
239
  like(column, value) {
259
240
  addCondition("like", column, value);
260
- return builder;
241
+ return self;
261
242
  },
262
243
  ilike(column, value) {
263
244
  addCondition("ilike", column, value);
264
- return builder;
245
+ return self;
265
246
  },
266
247
  is(column, value) {
267
248
  addCondition("is", column, value);
268
- return builder;
249
+ return self;
269
250
  },
270
251
  in(column, values) {
271
252
  addCondition("in", column, values);
272
- return builder;
253
+ return self;
273
254
  },
274
255
  contains(column, values) {
275
256
  addCondition("contains", column, values);
276
- return builder;
257
+ return self;
277
258
  },
278
259
  containedBy(column, values) {
279
260
  addCondition("containedBy", column, values);
280
- return builder;
261
+ return self;
281
262
  },
282
263
  not(columnOrExpression, operator, value) {
283
- if (operator && value !== void 0) {
264
+ if (operator != null && value !== void 0) {
284
265
  addCondition("not", void 0, `${columnOrExpression}.${operator}.${stringifyFilterValue(value)}`);
285
266
  } else {
286
267
  addCondition("not", void 0, columnOrExpression);
287
268
  }
288
- return builder;
269
+ return self;
289
270
  },
290
271
  or(expression) {
291
272
  addCondition("or", void 0, expression);
273
+ return self;
274
+ }
275
+ };
276
+ }
277
+ function createTableBuilder(tableName, client) {
278
+ const state = {
279
+ conditions: []
280
+ };
281
+ const addCondition = (operator, column, value) => {
282
+ const condition = { operator };
283
+ if (column) condition.column = column;
284
+ if (value !== void 0) condition.value = value;
285
+ state.conditions.push(condition);
286
+ };
287
+ const builder = {};
288
+ const filterMethods = createFilterMethods(state, addCondition, builder);
289
+ const runSelect = async (columns = DEFAULT_COLUMNS, options) => {
290
+ const payload = {
291
+ table_name: tableName,
292
+ columns,
293
+ conditions: state.conditions.length ? [...state.conditions] : void 0,
294
+ limit: state.limit,
295
+ offset: state.offset,
296
+ strip_nulls: options?.stripNulls ?? true,
297
+ count: options?.count,
298
+ head: options?.head
299
+ };
300
+ const response = await client.fetchGateway(payload, options);
301
+ return formatResult(response);
302
+ };
303
+ const createSelectChain = (columns, options) => {
304
+ const chain = {};
305
+ const filterMethods2 = createFilterMethods(state, addCondition, chain);
306
+ Object.assign(chain, filterMethods2, {
307
+ async single(cols, opts) {
308
+ const r = await runSelect(cols ?? columns, opts ?? options);
309
+ return toSingleResult(r);
310
+ },
311
+ maybeSingle(cols, opts) {
312
+ return chain.single(cols, opts);
313
+ },
314
+ then(onfulfilled, onrejected) {
315
+ return runSelect(columns, options).then(onfulfilled, onrejected);
316
+ },
317
+ catch(onrejected) {
318
+ return runSelect(columns, options).catch(onrejected);
319
+ },
320
+ finally(onfinally) {
321
+ return runSelect(columns, options).finally(onfinally);
322
+ }
323
+ });
324
+ return chain;
325
+ };
326
+ Object.assign(builder, filterMethods, {
327
+ reset() {
328
+ state.conditions = [];
329
+ state.limit = void 0;
330
+ state.offset = void 0;
292
331
  return builder;
293
332
  },
294
- async select(columns = DEFAULT_COLUMNS, options) {
295
- const payload = {
296
- table_name: tableName,
297
- columns,
298
- conditions: state.conditions.length ? [...state.conditions] : void 0,
299
- limit: state.limit,
300
- offset: state.offset,
301
- strip_nulls: options?.stripNulls ?? true
302
- };
303
- const response = await client.fetchGateway(payload, options);
304
- return formatResult(response);
333
+ select(columns = DEFAULT_COLUMNS, options) {
334
+ return createSelectChain(columns, options);
305
335
  },
306
336
  insert(values, options) {
307
337
  const executeInsert = async (columns, selectOptions) => {
@@ -342,8 +372,8 @@ function createTableBuilder(tableName, client) {
342
372
  return createMutationQuery(executeUpsert);
343
373
  },
344
374
  update(values, options) {
345
- const filters = state.conditions.length ? [...state.conditions] : void 0;
346
375
  const executeUpdate = async (columns, selectOptions) => {
376
+ const filters = state.conditions.length ? [...state.conditions] : void 0;
347
377
  const mergedOptions = mergeOptions(options, selectOptions);
348
378
  const payload = {
349
379
  table_name: tableName,
@@ -355,7 +385,11 @@ function createTableBuilder(tableName, client) {
355
385
  const response = await client.updateGateway(payload, mergedOptions);
356
386
  return formatResult(response);
357
387
  };
358
- return createMutationQuery(executeUpdate);
388
+ const mutation = createMutationQuery(executeUpdate);
389
+ const updateChain = {};
390
+ const filterMethods2 = createFilterMethods(state, addCondition, updateChain);
391
+ Object.assign(updateChain, filterMethods2, mutation);
392
+ return updateChain;
359
393
  },
360
394
  delete(options) {
361
395
  const filters = state.conditions.length ? [...state.conditions] : void 0;
@@ -383,23 +417,103 @@ function createTableBuilder(tableName, client) {
383
417
  async maybeSingle(columns, options) {
384
418
  return builder.single(columns, options);
385
419
  }
386
- };
420
+ });
387
421
  return builder;
388
422
  }
389
- function createClient(url, apiKey, options) {
390
- const { baseUrl: optBaseUrl, apiKey: optApiKey, ...restOptions } = options ?? {};
391
- const client = createAthenaGatewayClient({
392
- baseUrl: optBaseUrl ?? url,
393
- apiKey: optApiKey ?? apiKey,
394
- ...restOptions
423
+ function createClientFromConfig(config) {
424
+ const gateway = createAthenaGatewayClient({
425
+ baseUrl: config.baseUrl,
426
+ apiKey: config.apiKey,
427
+ client: config.client,
428
+ backend: config.backend,
429
+ headers: config.headers
395
430
  });
396
431
  return {
397
432
  from(table) {
398
- return createTableBuilder(table, client);
433
+ return createTableBuilder(table, gateway);
399
434
  }
400
435
  };
401
436
  }
437
+ var DEFAULT_BACKEND = { type: "athena" };
438
+ function toBackendConfig(b) {
439
+ if (!b) return DEFAULT_BACKEND;
440
+ return typeof b === "string" ? { type: b } : b;
441
+ }
442
+ var AthenaClient = {
443
+ builder() {
444
+ let url;
445
+ let key;
446
+ let backend = DEFAULT_BACKEND;
447
+ let clientName;
448
+ let headers;
449
+ const builder = {
450
+ url(u) {
451
+ url = u;
452
+ return builder;
453
+ },
454
+ key(k) {
455
+ key = k;
456
+ return builder;
457
+ },
458
+ backend(b) {
459
+ backend = toBackendConfig(b);
460
+ return builder;
461
+ },
462
+ client(c) {
463
+ clientName = c;
464
+ return builder;
465
+ },
466
+ headers(h) {
467
+ headers = h;
468
+ return builder;
469
+ },
470
+ healthTracking(enabled) {
471
+ return builder;
472
+ },
473
+ build() {
474
+ if (!url || !key) {
475
+ throw new Error("AthenaClient requires url and key; call .url() and .key() before .build()");
476
+ }
477
+ return createClientFromConfig({
478
+ baseUrl: url,
479
+ apiKey: key,
480
+ client: clientName,
481
+ backend,
482
+ headers});
483
+ }
484
+ };
485
+ return builder;
486
+ },
487
+ /** Build client from env: ATHENA_SUPABASE_URL, ATHENA_SUPABASE_KEY (or SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY) */
488
+ fromSupabaseEnv() {
489
+ const url = process.env.ATHENA_SUPABASE_URL ?? process.env.SUPABASE_URL;
490
+ const key = process.env.ATHENA_SUPABASE_KEY ?? process.env.SUPABASE_SERVICE_ROLE_KEY;
491
+ if (!url || !key) {
492
+ throw new Error(
493
+ "ATHENA_SUPABASE_URL and ATHENA_SUPABASE_KEY (or SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY) are required"
494
+ );
495
+ }
496
+ return AthenaClient.builder().backend({ type: "supabase" }).url(url).key(key).build();
497
+ }
498
+ };
499
+ function createClient(url, apiKey, options) {
500
+ const b = AthenaClient.builder().url(url).key(apiKey).backend(toBackendConfig(options?.backend));
501
+ if (options?.client) b.client(options.client);
502
+ if (options?.headers && Object.keys(options.headers).length > 0) b.headers(options.headers);
503
+ return b.build();
504
+ }
505
+
506
+ // src/gateway/types.ts
507
+ var Backend = {
508
+ Athena: { type: "athena" },
509
+ Supabase: { type: "supabase" },
510
+ Postgrest: { type: "postgrest" },
511
+ PostgreSQL: { type: "postgresql" },
512
+ ScyllaDB: { type: "scylladb" }
513
+ };
402
514
 
515
+ exports.AthenaClient = AthenaClient;
516
+ exports.Backend = Backend;
403
517
  exports.createClient = createClient;
404
518
  //# sourceMappingURL=index.js.map
405
519
  //# sourceMappingURL=index.js.map
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","../src/gateway/types.ts"],"names":["filterMethods"],"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 ?? true;\r\n const extraHeaders = {\r\n ...(config.headers ?? {}),\r\n ...(options?.headers ?? {}),\r\n };\r\n const headerClient =\r\n extraHeaders[\"x-athena-client\"] ??\r\n extraHeaders[\"X-Athena-Client\"];\r\n const finalClient =\r\n options?.client ??\r\n config.client ??\r\n (typeof headerClient === \"string\" ? headerClient : undefined) ??\r\n DEFAULT_CLIENT;\r\n const finalApiKey = options?.apiKey ?? config.apiKey;\r\n const finalPublishEvent = options?.publishEvent ?? config.publishEvent;\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?.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 const finalBackend = options?.backend ?? config.backend;\r\n if (finalBackend) {\r\n const type = typeof finalBackend === \"string\" ? finalBackend : finalBackend.type;\r\n if (type) headers[\"X-Backend-Type\"] = type;\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 const athenaClientKeys = [\"x-athena-client\", \"X-Athena-Client\"];\r\n Object.entries(extraHeaders).forEach(([key, value]) => {\r\n if (athenaClientKeys.includes(key)) return;\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 type { BackendConfig, BackendType } 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\n/** Shared filter chain - supports eq, limit, etc. in any order relative to select/update */\r\ninterface FilterChain<Self> {\r\n eq(column: string, value: AthenaConditionValue): Self\r\n match(filters: Record<string, AthenaConditionValue>): Self\r\n range(from: number, to: number): Self\r\n limit(count: number): Self\r\n offset(count: number): Self\r\n gt(column: string, value: AthenaConditionValue): Self\r\n gte(column: string, value: AthenaConditionValue): Self\r\n lt(column: string, value: AthenaConditionValue): Self\r\n lte(column: string, value: AthenaConditionValue): Self\r\n neq(column: string, value: AthenaConditionValue): Self\r\n like(column: string, value: AthenaConditionValue): Self\r\n ilike(column: string, value: AthenaConditionValue): Self\r\n is(column: string, value: AthenaConditionValue): Self\r\n in(column: string, values: AthenaConditionArrayValue): Self\r\n contains(column: string, values: AthenaConditionArrayValue): Self\r\n containedBy(column: string, values: AthenaConditionArrayValue): Self\r\n not(\r\n columnOrExpression: string,\r\n operator?: AthenaConditionOperator,\r\n value?: AthenaConditionValue,\r\n ): Self\r\n or(expression: string): Self\r\n}\r\n\r\n/** Chain returned by select() - supports filters and single/maybeSingle before execution */\r\nexport interface SelectChain<Row> extends FilterChain<SelectChain<Row>>, PromiseLike<SupabaseResult<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}\r\n\r\n/** Chain returned by update() - supports filters before execution, plus select/returning */\r\nexport interface UpdateChain<Row> extends FilterChain<UpdateChain<Row>>, MutationQuery<Row[]> {}\r\n\r\nexport interface TableQueryBuilder<Row> extends FilterChain<TableQueryBuilder<Row>> {\r\n select<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): SelectChain<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): UpdateChain<Row>\r\n delete(options?: AthenaGatewayCallOptions & { resourceId?: string }): MutationQuery<Row | null>\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 createFilterMethods<Self>(\r\n state: TableBuilderState,\r\n addCondition: (\r\n operator: AthenaConditionOperator,\r\n column?: string,\r\n value?: AthenaConditionValue | AthenaConditionArrayValue | string,\r\n ) => void,\r\n self: Self,\r\n) {\r\n return {\r\n eq(column: string, value: AthenaConditionValue) {\r\n addCondition('eq', column, value)\r\n return self\r\n },\r\n match(filters: Record<string, AthenaConditionValue>) {\r\n Object.entries(filters).forEach(([column, value]) => addCondition('eq', column, value))\r\n return self\r\n },\r\n range(from: number, to: number) {\r\n state.offset = from\r\n state.limit = to - from + 1\r\n return self\r\n },\r\n limit(count: number) {\r\n state.limit = count\r\n return self\r\n },\r\n offset(count: number) {\r\n state.offset = count\r\n return self\r\n },\r\n gt(column: string, value: AthenaConditionValue) {\r\n addCondition('gt', column, value)\r\n return self\r\n },\r\n gte(column: string, value: AthenaConditionValue) {\r\n addCondition('gte', column, value)\r\n return self\r\n },\r\n lt(column: string, value: AthenaConditionValue) {\r\n addCondition('lt', column, value)\r\n return self\r\n },\r\n lte(column: string, value: AthenaConditionValue) {\r\n addCondition('lte', column, value)\r\n return self\r\n },\r\n neq(column: string, value: AthenaConditionValue) {\r\n addCondition('neq', column, value)\r\n return self\r\n },\r\n like(column: string, value: AthenaConditionValue) {\r\n addCondition('like', column, value)\r\n return self\r\n },\r\n ilike(column: string, value: AthenaConditionValue) {\r\n addCondition('ilike', column, value)\r\n return self\r\n },\r\n is(column: string, value: AthenaConditionValue) {\r\n addCondition('is', column, value)\r\n return self\r\n },\r\n in(column: string, values: AthenaConditionArrayValue) {\r\n addCondition('in', column, values)\r\n return self\r\n },\r\n contains(column: string, values: AthenaConditionArrayValue) {\r\n addCondition('contains', column, values)\r\n return self\r\n },\r\n containedBy(column: string, values: AthenaConditionArrayValue) {\r\n addCondition('containedBy', column, values)\r\n return self\r\n },\r\n not(columnOrExpression: string, operator?: AthenaConditionOperator, value?: AthenaConditionValue) {\r\n if (operator != null && 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 self\r\n },\r\n or(expression: string) {\r\n addCondition('or', undefined, expression)\r\n return self\r\n },\r\n }\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 = {} as TableQueryBuilder<Row>\r\n\r\n const filterMethods = createFilterMethods(state, addCondition, builder)\r\n\r\n const runSelect = async <T = Row>(\r\n columns: string | string[] = DEFAULT_COLUMNS,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\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\r\n const createSelectChain = (\r\n columns: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ): SelectChain<Row> => {\r\n const chain = {} as SelectChain<Row>\r\n const filterMethods = createFilterMethods(state, addCondition, chain)\r\n Object.assign(chain, filterMethods, {\r\n async single<T = Row>(cols?: string | string[], opts?: AthenaGatewayCallOptions) {\r\n const r = await runSelect<T[]>(cols ?? columns, opts ?? options)\r\n return toSingleResult(r)\r\n },\r\n maybeSingle<T = Row>(cols?: string | string[], opts?: AthenaGatewayCallOptions) {\r\n return chain.single<T>(cols, opts)\r\n },\r\n then<T1 = SupabaseResult<Row[]>, T2 = never>(\r\n onfulfilled?: (v: SupabaseResult<Row[]>) => T1 | PromiseLike<T1>,\r\n onrejected?: (reason: unknown) => T2 | PromiseLike<T2>,\r\n ) {\r\n return runSelect<Row[]>(columns, options).then(onfulfilled, onrejected)\r\n },\r\n catch<T = never>(onrejected?: (reason: unknown) => T | PromiseLike<T>) {\r\n return runSelect<Row[]>(columns, options).catch(onrejected)\r\n },\r\n finally(onfinally?: () => void) {\r\n return runSelect<Row[]>(columns, options).finally(onfinally)\r\n },\r\n })\r\n return chain\r\n }\r\n\r\n Object.assign(builder, filterMethods, {\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 select<T = Row>(columns: string | string[] = DEFAULT_COLUMNS, options?: AthenaGatewayCallOptions) {\r\n return createSelectChain(columns, options) as unknown as SelectChain<T>\r\n },\r\n insert(values: Row | Row[], options?: AthenaGatewayCallOptions) {\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(\r\n values: Row | Row[],\r\n options?: AthenaGatewayCallOptions & { updateBody?: Partial<Row>; onConflict?: string | string[] },\r\n ) {\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: Partial<Row>, options?: AthenaGatewayCallOptions) {\r\n const executeUpdate = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const filters = state.conditions.length ? [...state.conditions] : undefined\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 const mutation = createMutationQuery<Row[]>(executeUpdate)\r\n const updateChain = {} as UpdateChain<Row>\r\n const filterMethods = createFilterMethods(state, addCondition, updateChain)\r\n Object.assign(updateChain, filterMethods, mutation)\r\n return updateChain\r\n },\r\n delete(options?: AthenaGatewayCallOptions & { resourceId?: string }) {\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\n/** Client config for builder */\r\nexport interface AthenaClientConfig {\r\n baseUrl: string\r\n apiKey: string\r\n client?: string\r\n backend?: BackendConfig\r\n headers?: Record<string, string>\r\n healthTracking?: boolean\r\n}\r\n\r\nfunction createClientFromConfig(config: AthenaClientConfig): SupabaseClient {\r\n const gateway = createAthenaGatewayClient({\r\n baseUrl: config.baseUrl,\r\n apiKey: config.apiKey,\r\n client: config.client,\r\n backend: config.backend,\r\n headers: config.headers,\r\n })\r\n return {\r\n from<Row = unknown>(table: string) {\r\n return createTableBuilder<Row>(table, gateway)\r\n },\r\n }\r\n}\r\n\r\nexport interface AthenaClientBuilder {\r\n url(url: string): AthenaClientBuilder\r\n key(apiKey: string): AthenaClientBuilder\r\n backend(backend: BackendConfig | BackendType): AthenaClientBuilder\r\n client(clientName: string): AthenaClientBuilder\r\n headers(headers: Record<string, string>): AthenaClientBuilder\r\n healthTracking(enabled: boolean): AthenaClientBuilder\r\n build(): SupabaseClient\r\n}\r\n\r\nconst DEFAULT_BACKEND: BackendConfig = { type: 'athena' }\r\n\r\nfunction toBackendConfig(b: BackendConfig | BackendType | undefined): BackendConfig {\r\n if (!b) return DEFAULT_BACKEND\r\n return typeof b === 'string' ? { type: b } : b\r\n}\r\n\r\nexport const AthenaClient = {\r\n builder(): AthenaClientBuilder {\r\n let url: string | undefined\r\n let key: string | undefined\r\n let backend: BackendConfig = DEFAULT_BACKEND\r\n let clientName: string | undefined\r\n let headers: Record<string, string> | undefined\r\n let healthTracking = false\r\n const builder = {\r\n url(u: string) {\r\n url = u\r\n return builder\r\n },\r\n key(k: string) {\r\n key = k\r\n return builder\r\n },\r\n backend(b: BackendConfig | BackendType) {\r\n backend = toBackendConfig(b)\r\n return builder\r\n },\r\n client(c: string) {\r\n clientName = c\r\n return builder\r\n },\r\n headers(h: Record<string, string>) {\r\n headers = h\r\n return builder\r\n },\r\n healthTracking(enabled: boolean) {\r\n healthTracking = enabled\r\n return builder\r\n },\r\n build(): SupabaseClient {\r\n if (!url || !key) {\r\n throw new Error('AthenaClient requires url and key; call .url() and .key() before .build()')\r\n }\r\n return createClientFromConfig({\r\n baseUrl: url,\r\n apiKey: key,\r\n client: clientName,\r\n backend,\r\n headers,\r\n healthTracking,\r\n })\r\n },\r\n }\r\n return builder\r\n },\r\n\r\n /** Build client from env: ATHENA_SUPABASE_URL, ATHENA_SUPABASE_KEY (or SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY) */\r\n fromSupabaseEnv(): SupabaseClient {\r\n const url =\r\n process.env.ATHENA_SUPABASE_URL ??\r\n process.env.SUPABASE_URL\r\n const key =\r\n process.env.ATHENA_SUPABASE_KEY ??\r\n process.env.SUPABASE_SERVICE_ROLE_KEY\r\n if (!url || !key) {\r\n throw new Error(\r\n 'ATHENA_SUPABASE_URL and ATHENA_SUPABASE_KEY (or SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY) are required',\r\n )\r\n }\r\n return AthenaClient.builder()\r\n .backend({ type: 'supabase' })\r\n .url(url)\r\n .key(key)\r\n .build()\r\n },\r\n}\r\n\r\n/** Create client (convenience wrapper; use AthenaClient.builder() for full control) */\r\nexport function createClient(\r\n url: string,\r\n apiKey: string,\r\n options?: Pick<AthenaGatewayCallOptions, 'client' | 'headers' | 'backend'>,\r\n): SupabaseClient {\r\n const b = AthenaClient.builder().url(url).key(apiKey).backend(toBackendConfig(options?.backend))\r\n if (options?.client) b.client(options.client)\r\n if (options?.headers && Object.keys(options.headers).length > 0) b.headers(options.headers)\r\n return b.build()\r\n}\r\n","/**\r\n * athena gateway types\r\n *\r\n * type definitions for the athena gateway api client and react hook\r\n */\r\n\r\nexport type AthenaGatewayMethod = 'POST' | 'PUT' | 'DELETE'\r\nexport type AthenaGatewayEndpointPath =\r\n | '/gateway/fetch'\r\n | '/gateway/insert'\r\n | '/gateway/update'\r\n | '/gateway/delete'\r\n\r\nexport type AthenaCountOption = 'exact' | 'planned' | 'estimated'\r\n\r\nexport type AthenaConditionValue = string | number | boolean | null\r\nexport type AthenaConditionArrayValue = Array<AthenaConditionValue>\r\n\r\nexport type AthenaConditionOperator =\r\n | 'eq'\r\n | 'neq'\r\n | 'gt'\r\n | 'gte'\r\n | 'lt'\r\n | 'lte'\r\n | 'like'\r\n | 'ilike'\r\n | 'is'\r\n | 'in'\r\n | 'contains'\r\n | 'containedBy'\r\n | 'not'\r\n | 'or'\r\n\r\nexport interface AthenaGatewayCondition {\r\n column?: string\r\n operator: AthenaConditionOperator\r\n value?: AthenaConditionValue | AthenaConditionArrayValue | string\r\n}\r\n\r\nexport interface AthenaFetchPayload {\r\n view_name?: string\r\n table_name?: string\r\n columns?: string[] | string\r\n conditions?: AthenaGatewayCondition[]\r\n limit?: number\r\n offset?: number\r\n current_page?: number\r\n page_size?: number\r\n total_pages?: number\r\n strip_nulls?: boolean\r\n group_by?: string\r\n time_granularity?: 'day' | 'hour' | 'minute'\r\n aggregation_column?: string\r\n aggregation_strategy?: 'cumulative_sum'\r\n aggregation_dedup?: boolean\r\n}\r\n\r\nexport interface AthenaInsertPayload {\r\n table_name: string\r\n insert_body: Record<string, unknown> | Record<string, unknown>[]\r\n update_body?: Record<string, unknown>\r\n columns?: string[] | string\r\n count?: AthenaCountOption\r\n head?: boolean\r\n default_to_null?: boolean\r\n on_conflict?: string | string[]\r\n}\r\n\r\nexport interface AthenaDeletePayload {\r\n table_name: string\r\n resource_id?: string\r\n columns?: string[] | string\r\n conditions?: AthenaGatewayCondition[]\r\n}\r\n\r\nexport interface AthenaUpdatePayload extends AthenaFetchPayload {\r\n update_body?: Record<string, unknown>\r\n}\r\n\r\n/** Backend type for Athena client (aligns with athena-rs) */\r\nexport type BackendType = 'athena' | 'postgrest' | 'supabase' | 'postgresql' | 'scylladb'\r\n\r\n/** Backend config: type from SDK + backend-scoped options */\r\nexport interface BackendConfig {\r\n type: BackendType\r\n options?: Record<string, unknown>\r\n}\r\n\r\n/** Pre-defined backends for lean usage: backend: Backend.Athena */\r\nexport const Backend = {\r\n Athena: { type: 'athena' } as const,\r\n Supabase: { type: 'supabase' } as const,\r\n Postgrest: { type: 'postgrest' } as const,\r\n PostgreSQL: { type: 'postgresql' } as const,\r\n ScyllaDB: { type: 'scylladb' } as const,\r\n} as const satisfies Record<string, BackendConfig>\r\n\r\nexport type BackendOption = BackendConfig | BackendType\r\n\r\nexport interface AthenaGatewayBaseOptions {\r\n baseUrl?: string\r\n apiKey?: string\r\n client?: string\r\n backend?: BackendOption\r\n publishEvent?: string\r\n headers?: Record<string, string>\r\n userId?: string | null\r\n organizationId?: string | null\r\n}\r\n\r\nexport interface AthenaGatewayHookConfig extends AthenaGatewayBaseOptions {}\r\nexport interface AthenaGatewayCallOptions extends AthenaGatewayBaseOptions {\r\n count?: AthenaCountOption\r\n head?: boolean\r\n defaultToNull?: boolean\r\n stripNulls?: boolean\r\n onConflict?: string | string[]\r\n updateBody?: Record<string, unknown>\r\n}\r\n\r\nexport interface AthenaGatewayResponse<T = unknown> {\r\n ok: boolean\r\n status: number\r\n data: T | null\r\n error?: string\r\n raw: unknown\r\n}\r\n\r\nexport interface AthenaGatewayResponseLog extends AthenaGatewayResponse {\r\n timestamp: string\r\n}\r\n\r\nexport interface AthenaGatewayCallLog {\r\n endpoint: AthenaGatewayEndpointPath\r\n method: AthenaGatewayMethod\r\n payload: unknown\r\n headers: Record<string, string>\r\n timestamp: string\r\n}\r\n\r\nexport interface AthenaGatewayHookResult {\r\n fetchGateway: <T = unknown>(\r\n payload: AthenaFetchPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => Promise<AthenaGatewayResponse<T>>\r\n insertGateway: <T = unknown>(\r\n payload: AthenaInsertPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => Promise<AthenaGatewayResponse<T>>\r\n updateGateway: <T = unknown>(\r\n payload: AthenaUpdatePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => Promise<AthenaGatewayResponse<T>>\r\n deleteGateway: <T = unknown>(\r\n payload: AthenaDeletePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => Promise<AthenaGatewayResponse<T>>\r\n isLoading: boolean\r\n error: string | null\r\n lastRequest: AthenaGatewayCallLog | null\r\n lastResponse: AthenaGatewayResponseLog | null\r\n baseUrl: string\r\n}\r\n"]}