@xylex-group/athena 0.1.0 → 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/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 Floris (XYLEX Group)
3
+ Copyright (c) 2026 Floris (XYLEX Group)
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,63 +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`, and `delete` just like Supabase. The builder supports `.eq()`, `.match()`, `.limit()`, `.offset()`, and `.single()` / `.maybeSingle()`.
30
-
31
- ## React hook
32
-
33
- ```tsx
34
- "use client";
35
-
36
- import { useAthenaGateway } from "athena-js/react";
37
- import { useEffect } from "react";
38
-
39
- export function UsersPanel() {
40
- const { fetchGateway, lastResponse, isLoading, error } = useAthenaGateway({
41
- baseUrl: "https://athena-db.com",
42
- apiKey: process.env.NEXT_PUBLIC_ATHENA_API_KEY,
43
- });
44
-
45
- useEffect(() => {
46
- fetchGateway({
47
- table_name: "users",
48
- columns: ["id", "email"],
49
- limit: 25,
50
- });
51
- }, [fetchGateway]);
52
-
53
- if (error) return <div>Error: {error}</div>;
54
- if (isLoading) return <div>Loading…</div>;
55
-
56
- return <pre>{JSON.stringify(lastResponse?.data, null, 2)}</pre>;
57
- }
58
- ```
59
-
60
- ## Learn more
61
-
62
- - [API reference](docs/api-reference.md)
63
- - [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.d.mts CHANGED
@@ -1,24 +1,51 @@
1
- import { A as AthenaGatewayCallOptions } from './types-DFvltfTX.mjs';
2
- export { a as AthenaDeletePayload, b as AthenaFetchPayload, c as AthenaGatewayBaseOptions, d as AthenaGatewayCallLog, e as AthenaGatewayCondition, f as AthenaGatewayEndpointPath, g as AthenaGatewayHookConfig, h as AthenaGatewayHookResult, i as AthenaGatewayMethod, j as AthenaGatewayResponse, k as AthenaGatewayResponseLog, l as AthenaInsertPayload, m as AthenaUpdatePayload } from './types-DFvltfTX.mjs';
1
+ import { A as AthenaGatewayCallOptions, a as AthenaConditionValue, b as AthenaConditionArrayValue, c as AthenaConditionOperator } from './types-DzCf3v76.mjs';
2
+ export { d as AthenaDeletePayload, e as AthenaFetchPayload, f as AthenaGatewayBaseOptions, g as AthenaGatewayCallLog, h as AthenaGatewayCondition, i as AthenaGatewayEndpointPath, j as AthenaGatewayHookConfig, k as AthenaGatewayHookResult, l as AthenaGatewayMethod, m as AthenaGatewayResponse, n as AthenaGatewayResponseLog, o as AthenaInsertPayload, p as AthenaUpdatePayload } from './types-DzCf3v76.mjs';
3
3
 
4
- type AthenaConditionValue = string | number | boolean | null;
5
4
  interface SupabaseResult<T> {
6
5
  data: T | null;
7
6
  error: string | null;
8
7
  status: number;
9
8
  raw: unknown;
10
9
  }
10
+ type MutationSingleResult<Result> = Result extends Array<infer Item> ? Item | null : Result | null;
11
+ interface MutationQuery<Result> extends PromiseLike<SupabaseResult<Result>> {
12
+ select(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<Result>>;
13
+ returning(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<Result>>;
14
+ single(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<MutationSingleResult<Result>>>;
15
+ maybeSingle(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<MutationSingleResult<Result>>>;
16
+ then<TResult1 = SupabaseResult<Result>, TResult2 = never>(onfulfilled?: ((value: SupabaseResult<Result>) => TResult1 | PromiseLike<TResult1>) | undefined | null, onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | undefined | null): Promise<TResult1 | TResult2>;
17
+ catch<TResult = never>(onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | undefined | null): Promise<SupabaseResult<Result> | TResult>;
18
+ finally(onfinally?: (() => void) | undefined | null): Promise<SupabaseResult<Result>>;
19
+ }
11
20
  interface TableQueryBuilder<Row> {
12
21
  select<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<T>>;
13
- insert(values: Row | Row[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<Row | Row[]>>;
14
- update(values: Partial<Row>, options?: AthenaGatewayCallOptions): Promise<SupabaseResult<Row[]>>;
22
+ insert(values: Row | Row[], options?: AthenaGatewayCallOptions): MutationQuery<Row | Row[]>;
23
+ upsert(values: Row | Row[], options?: AthenaGatewayCallOptions & {
24
+ updateBody?: Partial<Row>;
25
+ onConflict?: string | string[];
26
+ }): MutationQuery<Row | Row[]>;
27
+ update(values: Partial<Row>, options?: AthenaGatewayCallOptions): MutationQuery<Row[]>;
15
28
  delete(options?: AthenaGatewayCallOptions & {
16
29
  resourceId?: string;
17
- }): Promise<SupabaseResult<null>>;
30
+ }): MutationQuery<Row | null>;
18
31
  eq(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>;
19
32
  match(filters: Record<string, AthenaConditionValue>): TableQueryBuilder<Row>;
33
+ range(from: number, to: number): TableQueryBuilder<Row>;
20
34
  limit(count: number): TableQueryBuilder<Row>;
21
35
  offset(count: number): TableQueryBuilder<Row>;
36
+ gt(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>;
37
+ gte(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>;
38
+ lt(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>;
39
+ lte(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>;
40
+ neq(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>;
41
+ like(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>;
42
+ ilike(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>;
43
+ is(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>;
44
+ in(column: string, values: AthenaConditionArrayValue): TableQueryBuilder<Row>;
45
+ contains(column: string, values: AthenaConditionArrayValue): TableQueryBuilder<Row>;
46
+ containedBy(column: string, values: AthenaConditionArrayValue): TableQueryBuilder<Row>;
47
+ not(columnOrExpression: string, operator?: AthenaConditionOperator, value?: AthenaConditionValue): TableQueryBuilder<Row>;
48
+ or(expression: string): TableQueryBuilder<Row>;
22
49
  single<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<T | null>>;
23
50
  maybeSingle<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<T | null>>;
24
51
  reset(): TableQueryBuilder<Row>;
package/dist/index.d.ts CHANGED
@@ -1,24 +1,51 @@
1
- import { A as AthenaGatewayCallOptions } from './types-DFvltfTX.js';
2
- export { a as AthenaDeletePayload, b as AthenaFetchPayload, c as AthenaGatewayBaseOptions, d as AthenaGatewayCallLog, e as AthenaGatewayCondition, f as AthenaGatewayEndpointPath, g as AthenaGatewayHookConfig, h as AthenaGatewayHookResult, i as AthenaGatewayMethod, j as AthenaGatewayResponse, k as AthenaGatewayResponseLog, l as AthenaInsertPayload, m as AthenaUpdatePayload } from './types-DFvltfTX.js';
1
+ import { A as AthenaGatewayCallOptions, a as AthenaConditionValue, b as AthenaConditionArrayValue, c as AthenaConditionOperator } from './types-DzCf3v76.js';
2
+ export { d as AthenaDeletePayload, e as AthenaFetchPayload, f as AthenaGatewayBaseOptions, g as AthenaGatewayCallLog, h as AthenaGatewayCondition, i as AthenaGatewayEndpointPath, j as AthenaGatewayHookConfig, k as AthenaGatewayHookResult, l as AthenaGatewayMethod, m as AthenaGatewayResponse, n as AthenaGatewayResponseLog, o as AthenaInsertPayload, p as AthenaUpdatePayload } from './types-DzCf3v76.js';
3
3
 
4
- type AthenaConditionValue = string | number | boolean | null;
5
4
  interface SupabaseResult<T> {
6
5
  data: T | null;
7
6
  error: string | null;
8
7
  status: number;
9
8
  raw: unknown;
10
9
  }
10
+ type MutationSingleResult<Result> = Result extends Array<infer Item> ? Item | null : Result | null;
11
+ interface MutationQuery<Result> extends PromiseLike<SupabaseResult<Result>> {
12
+ select(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<Result>>;
13
+ returning(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<Result>>;
14
+ single(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<MutationSingleResult<Result>>>;
15
+ maybeSingle(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<MutationSingleResult<Result>>>;
16
+ then<TResult1 = SupabaseResult<Result>, TResult2 = never>(onfulfilled?: ((value: SupabaseResult<Result>) => TResult1 | PromiseLike<TResult1>) | undefined | null, onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | undefined | null): Promise<TResult1 | TResult2>;
17
+ catch<TResult = never>(onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | undefined | null): Promise<SupabaseResult<Result> | TResult>;
18
+ finally(onfinally?: (() => void) | undefined | null): Promise<SupabaseResult<Result>>;
19
+ }
11
20
  interface TableQueryBuilder<Row> {
12
21
  select<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<T>>;
13
- insert(values: Row | Row[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<Row | Row[]>>;
14
- update(values: Partial<Row>, options?: AthenaGatewayCallOptions): Promise<SupabaseResult<Row[]>>;
22
+ insert(values: Row | Row[], options?: AthenaGatewayCallOptions): MutationQuery<Row | Row[]>;
23
+ upsert(values: Row | Row[], options?: AthenaGatewayCallOptions & {
24
+ updateBody?: Partial<Row>;
25
+ onConflict?: string | string[];
26
+ }): MutationQuery<Row | Row[]>;
27
+ update(values: Partial<Row>, options?: AthenaGatewayCallOptions): MutationQuery<Row[]>;
15
28
  delete(options?: AthenaGatewayCallOptions & {
16
29
  resourceId?: string;
17
- }): Promise<SupabaseResult<null>>;
30
+ }): MutationQuery<Row | null>;
18
31
  eq(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>;
19
32
  match(filters: Record<string, AthenaConditionValue>): TableQueryBuilder<Row>;
33
+ range(from: number, to: number): TableQueryBuilder<Row>;
20
34
  limit(count: number): TableQueryBuilder<Row>;
21
35
  offset(count: number): TableQueryBuilder<Row>;
36
+ gt(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>;
37
+ gte(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>;
38
+ lt(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>;
39
+ lte(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>;
40
+ neq(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>;
41
+ like(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>;
42
+ ilike(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>;
43
+ is(column: string, value: AthenaConditionValue): TableQueryBuilder<Row>;
44
+ in(column: string, values: AthenaConditionArrayValue): TableQueryBuilder<Row>;
45
+ contains(column: string, values: AthenaConditionArrayValue): TableQueryBuilder<Row>;
46
+ containedBy(column: string, values: AthenaConditionArrayValue): TableQueryBuilder<Row>;
47
+ not(columnOrExpression: string, operator?: AthenaConditionOperator, value?: AthenaConditionValue): TableQueryBuilder<Row>;
48
+ or(expression: string): TableQueryBuilder<Row>;
22
49
  single<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<T | null>>;
23
50
  maybeSingle<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<T | null>>;
24
51
  reset(): TableQueryBuilder<Row>;