@xylex-group/athena 1.1.0 → 1.1.1

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,7 +1,6 @@
1
1
  # athena-js
2
-
3
- current version: `1.1.0`
4
2
 
3
+ current version: `1.1.1`
5
4
  `@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.
6
5
 
7
6
  ## Install
@@ -30,7 +29,7 @@ const athenaClient = createClient(ATHENA_URL, ATHENA_API_KEY, {
30
29
  backend: { type: "athena" },
31
30
  });
32
31
 
33
- const { data, error } = await athena.from("characters").select(`
32
+ const { data, error } = await athenaClient.from("characters").select(`
34
33
  id,
35
34
  name,
36
35
  from:sender_id(name),
@@ -142,6 +141,10 @@ const { data } = await athena
142
141
  .from("characters")
143
142
  .insert([{ name: "Frodo" }, { name: "Sam" }])
144
143
  .select();
144
+
145
+ // Type inference differs by payload shape:
146
+ // - insert(one) => SupabaseResult<Row>
147
+ // - insert(many) => SupabaseResult<Row[]>
145
148
  ```
146
149
 
147
150
  ### Update
@@ -166,6 +169,10 @@ const { data } = await athena
166
169
  { updateBody: { name: "Rohan" }, onConflict: "id" },
167
170
  )
168
171
  .select();
172
+
173
+ // Type inference differs by payload shape:
174
+ // - upsert(one) => SupabaseResult<Row>
175
+ // - upsert(many) => SupabaseResult<Row[]>
169
176
  ```
170
177
 
171
178
  | Option | Type | Description |
@@ -290,6 +297,17 @@ const { data } = await athena.from<User>("users").select("id, name").eq("active"
290
297
  // data is User[] | null
291
298
  ```
292
299
 
300
+ ## Development Validation
301
+
302
+ For local quality checks:
303
+
304
+ ```bash
305
+ pnpm typecheck # compile-time type compatibility checks
306
+ pnpm check:all # lint + typecheck + test + build
307
+ ```
308
+
309
+ CI and publish workflows run `typecheck` before build/publish.
310
+
293
311
  ## Learn more
294
312
 
295
313
  - [Getting started](docs/getting-started.md) — step-by-step walkthrough
package/dist/index.cjs CHANGED
@@ -344,7 +344,25 @@ function createTableBuilder(tableName, client) {
344
344
  return createSelectChain(columns, options);
345
345
  },
346
346
  insert(values, options) {
347
- const executeInsert = async (columns, selectOptions) => {
347
+ if (Array.isArray(values)) {
348
+ const executeInsertMany = async (columns, selectOptions) => {
349
+ const mergedOptions = mergeOptions(options, selectOptions);
350
+ const payload = {
351
+ table_name: tableName,
352
+ insert_body: values
353
+ };
354
+ if (columns) payload.columns = columns;
355
+ if (mergedOptions?.count) payload.count = mergedOptions.count;
356
+ if (mergedOptions?.head) payload.head = mergedOptions.head;
357
+ if (mergedOptions?.defaultToNull !== void 0) {
358
+ payload.default_to_null = mergedOptions.defaultToNull;
359
+ }
360
+ const response = await client.insertGateway(payload, mergedOptions);
361
+ return formatResult(response);
362
+ };
363
+ return createMutationQuery(executeInsertMany);
364
+ }
365
+ const executeInsertOne = async (columns, selectOptions) => {
348
366
  const mergedOptions = mergeOptions(options, selectOptions);
349
367
  const payload = {
350
368
  table_name: tableName,
@@ -359,10 +377,30 @@ function createTableBuilder(tableName, client) {
359
377
  const response = await client.insertGateway(payload, mergedOptions);
360
378
  return formatResult(response);
361
379
  };
362
- return createMutationQuery(executeInsert);
380
+ return createMutationQuery(executeInsertOne);
363
381
  },
364
382
  upsert(values, options) {
365
- const executeUpsert = async (columns, selectOptions) => {
383
+ if (Array.isArray(values)) {
384
+ const executeUpsertMany = async (columns, selectOptions) => {
385
+ const mergedOptions = mergeOptions(options, selectOptions);
386
+ const payload = {
387
+ table_name: tableName,
388
+ insert_body: values,
389
+ update_body: options?.updateBody ? options.updateBody : void 0
390
+ };
391
+ if (columns) payload.columns = columns;
392
+ if (options?.onConflict) payload.on_conflict = options.onConflict;
393
+ if (mergedOptions?.count) payload.count = mergedOptions.count;
394
+ if (mergedOptions?.head) payload.head = mergedOptions.head;
395
+ if (mergedOptions?.defaultToNull !== void 0) {
396
+ payload.default_to_null = mergedOptions.defaultToNull;
397
+ }
398
+ const response = await client.insertGateway(payload, mergedOptions);
399
+ return formatResult(response);
400
+ };
401
+ return createMutationQuery(executeUpsertMany);
402
+ }
403
+ const executeUpsertOne = async (columns, selectOptions) => {
366
404
  const mergedOptions = mergeOptions(options, selectOptions);
367
405
  const payload = {
368
406
  table_name: tableName,
@@ -379,7 +417,7 @@ function createTableBuilder(tableName, client) {
379
417
  const response = await client.insertGateway(payload, mergedOptions);
380
418
  return formatResult(response);
381
419
  };
382
- return createMutationQuery(executeUpsert);
420
+ return createMutationQuery(executeUpsertOne);
383
421
  },
384
422
  update(values, options) {
385
423
  const executeUpdate = async (columns, selectOptions) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/gateway/client.ts","../src/supabase.ts","../src/gateway/types.ts"],"names":["filterMethods"],"mappings":"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","file":"index.cjs","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) {\r\n condition.column = column\r\n if (operator === 'eq') {\r\n // include legacy gateway shape for compatibility\r\n condition.eq_column = column\r\n }\r\n }\r\n if (value !== undefined) {\r\n condition.value = value\r\n if (operator === 'eq') {\r\n condition.eq_value = value\r\n }\r\n }\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 /** Back-compat shape expected by older gateway implementations */\r\n eq_column?: string\r\n eq_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"]}
1
+ {"version":3,"sources":["../src/gateway/client.ts","../src/supabase.ts","../src/gateway/types.ts"],"names":["filterMethods"],"mappings":"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","file":"index.cjs","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, options?: AthenaGatewayCallOptions): MutationQuery<Row>\r\n insert(values: Row[], options?: AthenaGatewayCallOptions): MutationQuery<Row[]>\r\n upsert(\r\n values: Row,\r\n options?: AthenaGatewayCallOptions & {\r\n updateBody?: Partial<Row>\r\n onConflict?: string | string[]\r\n },\r\n ): MutationQuery<Row>\r\n upsert(\r\n values: Row[],\r\n options?: AthenaGatewayCallOptions & {\r\n updateBody?: Partial<Row>\r\n onConflict?: string | string[]\r\n },\r\n ): MutationQuery<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) {\r\n condition.column = column\r\n if (operator === 'eq') {\r\n // include legacy gateway shape for compatibility\r\n condition.eq_column = column\r\n }\r\n }\r\n if (value !== undefined) {\r\n condition.value = value\r\n if (operator === 'eq') {\r\n condition.eq_value = value\r\n }\r\n }\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 = <SelectedRow>(\r\n columns: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ): SelectChain<SelectedRow> => {\r\n const chain = {} as SelectChain<SelectedRow>\r\n const filterMethods = createFilterMethods(state, addCondition, chain)\r\n Object.assign(chain, filterMethods, {\r\n async single<T = SelectedRow>(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 = SelectedRow>(cols?: string | string[], opts?: AthenaGatewayCallOptions) {\r\n return chain.single<T>(cols, opts)\r\n },\r\n then<T1 = SupabaseResult<SelectedRow[]>, T2 = never>(\r\n onfulfilled?: (v: SupabaseResult<SelectedRow[]>) => T1 | PromiseLike<T1>,\r\n onrejected?: (reason: unknown) => T2 | PromiseLike<T2>,\r\n ) {\r\n return runSelect<SelectedRow[]>(columns, options).then(onfulfilled, onrejected)\r\n },\r\n catch<T = never>(onrejected?: (reason: unknown) => T | PromiseLike<T>) {\r\n return runSelect<SelectedRow[]>(columns, options).catch(onrejected)\r\n },\r\n finally(onfinally?: () => void) {\r\n return runSelect<SelectedRow[]>(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<T>(columns, options)\r\n },\r\n insert(values: Row | Row[], options?: AthenaGatewayCallOptions) {\r\n if (Array.isArray(values)) {\r\n const executeInsertMany = 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>[],\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[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row[]>(executeInsertMany)\r\n }\r\n const executeInsertOne = 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>,\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>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row>(executeInsertOne)\r\n },\r\n upsert(\r\n values: Row | Row[],\r\n options?: AthenaGatewayCallOptions & { updateBody?: Partial<Row>; onConflict?: string | string[] },\r\n ) {\r\n if (Array.isArray(values)) {\r\n const executeUpsertMany = 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>[],\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[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row[]>(executeUpsertMany)\r\n }\r\n const executeUpsertOne = 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>,\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>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row>(executeUpsertOne)\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 /** Back-compat shape expected by older gateway implementations */\r\n eq_column?: string\r\n eq_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 type AthenaGatewayHookConfig = 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"]}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { B as BackendConfig, a as BackendType, A as AthenaConditionValue, b as AthenaConditionArrayValue, c as AthenaConditionOperator, d as AthenaGatewayCallOptions } from './types-IHkO67Tl.cjs';
2
- export { e as Backend } from './types-IHkO67Tl.cjs';
1
+ import { B as BackendConfig, a as BackendType, A as AthenaConditionValue, b as AthenaConditionArrayValue, c as AthenaConditionOperator, d as AthenaGatewayCallOptions } from './types-DorEXMAz.cjs';
2
+ export { e as Backend } from './types-DorEXMAz.cjs';
3
3
 
4
4
  interface SupabaseResult<T> {
5
5
  data: T | null;
@@ -48,11 +48,16 @@ interface UpdateChain<Row> extends FilterChain<UpdateChain<Row>>, MutationQuery<
48
48
  }
49
49
  interface TableQueryBuilder<Row> extends FilterChain<TableQueryBuilder<Row>> {
50
50
  select<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): SelectChain<T>;
51
- insert(values: Row | Row[], options?: AthenaGatewayCallOptions): MutationQuery<Row | Row[]>;
52
- upsert(values: Row | Row[], options?: AthenaGatewayCallOptions & {
51
+ insert(values: Row, options?: AthenaGatewayCallOptions): MutationQuery<Row>;
52
+ insert(values: Row[], options?: AthenaGatewayCallOptions): MutationQuery<Row[]>;
53
+ upsert(values: Row, options?: AthenaGatewayCallOptions & {
53
54
  updateBody?: Partial<Row>;
54
55
  onConflict?: string | string[];
55
- }): MutationQuery<Row | Row[]>;
56
+ }): MutationQuery<Row>;
57
+ upsert(values: Row[], options?: AthenaGatewayCallOptions & {
58
+ updateBody?: Partial<Row>;
59
+ onConflict?: string | string[];
60
+ }): MutationQuery<Row[]>;
56
61
  update(values: Partial<Row>, options?: AthenaGatewayCallOptions): UpdateChain<Row>;
57
62
  delete(options?: AthenaGatewayCallOptions & {
58
63
  resourceId?: string;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { B as BackendConfig, a as BackendType, A as AthenaConditionValue, b as AthenaConditionArrayValue, c as AthenaConditionOperator, d as AthenaGatewayCallOptions } from './types-IHkO67Tl.js';
2
- export { e as Backend } from './types-IHkO67Tl.js';
1
+ import { B as BackendConfig, a as BackendType, A as AthenaConditionValue, b as AthenaConditionArrayValue, c as AthenaConditionOperator, d as AthenaGatewayCallOptions } from './types-DorEXMAz.js';
2
+ export { e as Backend } from './types-DorEXMAz.js';
3
3
 
4
4
  interface SupabaseResult<T> {
5
5
  data: T | null;
@@ -48,11 +48,16 @@ interface UpdateChain<Row> extends FilterChain<UpdateChain<Row>>, MutationQuery<
48
48
  }
49
49
  interface TableQueryBuilder<Row> extends FilterChain<TableQueryBuilder<Row>> {
50
50
  select<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): SelectChain<T>;
51
- insert(values: Row | Row[], options?: AthenaGatewayCallOptions): MutationQuery<Row | Row[]>;
52
- upsert(values: Row | Row[], options?: AthenaGatewayCallOptions & {
51
+ insert(values: Row, options?: AthenaGatewayCallOptions): MutationQuery<Row>;
52
+ insert(values: Row[], options?: AthenaGatewayCallOptions): MutationQuery<Row[]>;
53
+ upsert(values: Row, options?: AthenaGatewayCallOptions & {
53
54
  updateBody?: Partial<Row>;
54
55
  onConflict?: string | string[];
55
- }): MutationQuery<Row | Row[]>;
56
+ }): MutationQuery<Row>;
57
+ upsert(values: Row[], options?: AthenaGatewayCallOptions & {
58
+ updateBody?: Partial<Row>;
59
+ onConflict?: string | string[];
60
+ }): MutationQuery<Row[]>;
56
61
  update(values: Partial<Row>, options?: AthenaGatewayCallOptions): UpdateChain<Row>;
57
62
  delete(options?: AthenaGatewayCallOptions & {
58
63
  resourceId?: string;
package/dist/index.js CHANGED
@@ -342,7 +342,25 @@ function createTableBuilder(tableName, client) {
342
342
  return createSelectChain(columns, options);
343
343
  },
344
344
  insert(values, options) {
345
- const executeInsert = async (columns, selectOptions) => {
345
+ if (Array.isArray(values)) {
346
+ const executeInsertMany = async (columns, selectOptions) => {
347
+ const mergedOptions = mergeOptions(options, selectOptions);
348
+ const payload = {
349
+ table_name: tableName,
350
+ insert_body: values
351
+ };
352
+ if (columns) payload.columns = columns;
353
+ if (mergedOptions?.count) payload.count = mergedOptions.count;
354
+ if (mergedOptions?.head) payload.head = mergedOptions.head;
355
+ if (mergedOptions?.defaultToNull !== void 0) {
356
+ payload.default_to_null = mergedOptions.defaultToNull;
357
+ }
358
+ const response = await client.insertGateway(payload, mergedOptions);
359
+ return formatResult(response);
360
+ };
361
+ return createMutationQuery(executeInsertMany);
362
+ }
363
+ const executeInsertOne = async (columns, selectOptions) => {
346
364
  const mergedOptions = mergeOptions(options, selectOptions);
347
365
  const payload = {
348
366
  table_name: tableName,
@@ -357,10 +375,30 @@ function createTableBuilder(tableName, client) {
357
375
  const response = await client.insertGateway(payload, mergedOptions);
358
376
  return formatResult(response);
359
377
  };
360
- return createMutationQuery(executeInsert);
378
+ return createMutationQuery(executeInsertOne);
361
379
  },
362
380
  upsert(values, options) {
363
- const executeUpsert = async (columns, selectOptions) => {
381
+ if (Array.isArray(values)) {
382
+ const executeUpsertMany = async (columns, selectOptions) => {
383
+ const mergedOptions = mergeOptions(options, selectOptions);
384
+ const payload = {
385
+ table_name: tableName,
386
+ insert_body: values,
387
+ update_body: options?.updateBody ? options.updateBody : void 0
388
+ };
389
+ if (columns) payload.columns = columns;
390
+ if (options?.onConflict) payload.on_conflict = options.onConflict;
391
+ if (mergedOptions?.count) payload.count = mergedOptions.count;
392
+ if (mergedOptions?.head) payload.head = mergedOptions.head;
393
+ if (mergedOptions?.defaultToNull !== void 0) {
394
+ payload.default_to_null = mergedOptions.defaultToNull;
395
+ }
396
+ const response = await client.insertGateway(payload, mergedOptions);
397
+ return formatResult(response);
398
+ };
399
+ return createMutationQuery(executeUpsertMany);
400
+ }
401
+ const executeUpsertOne = async (columns, selectOptions) => {
364
402
  const mergedOptions = mergeOptions(options, selectOptions);
365
403
  const payload = {
366
404
  table_name: tableName,
@@ -377,7 +415,7 @@ function createTableBuilder(tableName, client) {
377
415
  const response = await client.insertGateway(payload, mergedOptions);
378
416
  return formatResult(response);
379
417
  };
380
- return createMutationQuery(executeUpsert);
418
+ return createMutationQuery(executeUpsertOne);
381
419
  },
382
420
  update(values, options) {
383
421
  const executeUpdate = async (columns, selectOptions) => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
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) {\r\n condition.column = column\r\n if (operator === 'eq') {\r\n // include legacy gateway shape for compatibility\r\n condition.eq_column = column\r\n }\r\n }\r\n if (value !== undefined) {\r\n condition.value = value\r\n if (operator === 'eq') {\r\n condition.eq_value = value\r\n }\r\n }\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 /** Back-compat shape expected by older gateway implementations */\r\n eq_column?: string\r\n eq_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"]}
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, options?: AthenaGatewayCallOptions): MutationQuery<Row>\r\n insert(values: Row[], options?: AthenaGatewayCallOptions): MutationQuery<Row[]>\r\n upsert(\r\n values: Row,\r\n options?: AthenaGatewayCallOptions & {\r\n updateBody?: Partial<Row>\r\n onConflict?: string | string[]\r\n },\r\n ): MutationQuery<Row>\r\n upsert(\r\n values: Row[],\r\n options?: AthenaGatewayCallOptions & {\r\n updateBody?: Partial<Row>\r\n onConflict?: string | string[]\r\n },\r\n ): MutationQuery<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) {\r\n condition.column = column\r\n if (operator === 'eq') {\r\n // include legacy gateway shape for compatibility\r\n condition.eq_column = column\r\n }\r\n }\r\n if (value !== undefined) {\r\n condition.value = value\r\n if (operator === 'eq') {\r\n condition.eq_value = value\r\n }\r\n }\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 = <SelectedRow>(\r\n columns: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ): SelectChain<SelectedRow> => {\r\n const chain = {} as SelectChain<SelectedRow>\r\n const filterMethods = createFilterMethods(state, addCondition, chain)\r\n Object.assign(chain, filterMethods, {\r\n async single<T = SelectedRow>(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 = SelectedRow>(cols?: string | string[], opts?: AthenaGatewayCallOptions) {\r\n return chain.single<T>(cols, opts)\r\n },\r\n then<T1 = SupabaseResult<SelectedRow[]>, T2 = never>(\r\n onfulfilled?: (v: SupabaseResult<SelectedRow[]>) => T1 | PromiseLike<T1>,\r\n onrejected?: (reason: unknown) => T2 | PromiseLike<T2>,\r\n ) {\r\n return runSelect<SelectedRow[]>(columns, options).then(onfulfilled, onrejected)\r\n },\r\n catch<T = never>(onrejected?: (reason: unknown) => T | PromiseLike<T>) {\r\n return runSelect<SelectedRow[]>(columns, options).catch(onrejected)\r\n },\r\n finally(onfinally?: () => void) {\r\n return runSelect<SelectedRow[]>(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<T>(columns, options)\r\n },\r\n insert(values: Row | Row[], options?: AthenaGatewayCallOptions) {\r\n if (Array.isArray(values)) {\r\n const executeInsertMany = 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>[],\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[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row[]>(executeInsertMany)\r\n }\r\n const executeInsertOne = 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>,\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>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row>(executeInsertOne)\r\n },\r\n upsert(\r\n values: Row | Row[],\r\n options?: AthenaGatewayCallOptions & { updateBody?: Partial<Row>; onConflict?: string | string[] },\r\n ) {\r\n if (Array.isArray(values)) {\r\n const executeUpsertMany = 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>[],\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[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row[]>(executeUpsertMany)\r\n }\r\n const executeUpsertOne = 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>,\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>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row>(executeUpsertOne)\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 /** Back-compat shape expected by older gateway implementations */\r\n eq_column?: string\r\n eq_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 type AthenaGatewayHookConfig = 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"]}
package/dist/react.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { f as AthenaGatewayHookConfig, g as AthenaGatewayHookResult } from './types-IHkO67Tl.cjs';
2
- export { h as AthenaDeletePayload, i as AthenaFetchPayload, d as AthenaGatewayCallOptions, j as AthenaGatewayResponse, k as AthenaInsertPayload, l as AthenaUpdatePayload } from './types-IHkO67Tl.cjs';
1
+ import { f as AthenaGatewayHookConfig, g as AthenaGatewayHookResult } from './types-DorEXMAz.cjs';
2
+ export { h as AthenaDeletePayload, i as AthenaFetchPayload, d as AthenaGatewayCallOptions, j as AthenaGatewayResponse, k as AthenaInsertPayload, l as AthenaUpdatePayload } from './types-DorEXMAz.cjs';
3
3
 
4
4
  declare function useAthenaGateway(config?: AthenaGatewayHookConfig): AthenaGatewayHookResult;
5
5
 
package/dist/react.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { f as AthenaGatewayHookConfig, g as AthenaGatewayHookResult } from './types-IHkO67Tl.js';
2
- export { h as AthenaDeletePayload, i as AthenaFetchPayload, d as AthenaGatewayCallOptions, j as AthenaGatewayResponse, k as AthenaInsertPayload, l as AthenaUpdatePayload } from './types-IHkO67Tl.js';
1
+ import { f as AthenaGatewayHookConfig, g as AthenaGatewayHookResult } from './types-DorEXMAz.js';
2
+ export { h as AthenaDeletePayload, i as AthenaFetchPayload, d as AthenaGatewayCallOptions, j as AthenaGatewayResponse, k as AthenaInsertPayload, l as AthenaUpdatePayload } from './types-DorEXMAz.js';
3
3
 
4
4
  declare function useAthenaGateway(config?: AthenaGatewayHookConfig): AthenaGatewayHookResult;
5
5
 
@@ -89,8 +89,7 @@ interface AthenaGatewayBaseOptions {
89
89
  userId?: string | null;
90
90
  organizationId?: string | null;
91
91
  }
92
- interface AthenaGatewayHookConfig extends AthenaGatewayBaseOptions {
93
- }
92
+ type AthenaGatewayHookConfig = AthenaGatewayBaseOptions;
94
93
  interface AthenaGatewayCallOptions extends AthenaGatewayBaseOptions {
95
94
  count?: AthenaCountOption;
96
95
  head?: boolean;
@@ -89,8 +89,7 @@ interface AthenaGatewayBaseOptions {
89
89
  userId?: string | null;
90
90
  organizationId?: string | null;
91
91
  }
92
- interface AthenaGatewayHookConfig extends AthenaGatewayBaseOptions {
93
- }
92
+ type AthenaGatewayHookConfig = AthenaGatewayBaseOptions;
94
93
  interface AthenaGatewayCallOptions extends AthenaGatewayBaseOptions {
95
94
  count?: AthenaCountOption;
96
95
  head?: boolean;
package/package.json CHANGED
@@ -16,8 +16,8 @@
16
16
  "@types/node": "^20.10.5",
17
17
  "@types/react": "^18.3.12",
18
18
  "@types/uuid": "^9.0.7",
19
- "@typescript-eslint/eslint-plugin": "^7.18.0",
20
- "@typescript-eslint/parser": "^7.18.0",
19
+ "@typescript-eslint/eslint-plugin": "^8.57.0",
20
+ "@typescript-eslint/parser": "^8.57.0",
21
21
  "eslint": "^8.57.1",
22
22
  "tsup": "^8.5.1",
23
23
  "tsx": "^4.7.0",
@@ -28,14 +28,14 @@
28
28
  },
29
29
  "exports": {
30
30
  ".": {
31
- "import": "./dist/index.mjs",
32
- "require": "./dist/index.js",
33
- "types": "./dist/index.d.ts"
31
+ "types": "./dist/index.d.ts",
32
+ "import": "./dist/index.js",
33
+ "require": "./dist/index.cjs"
34
34
  },
35
35
  "./react": {
36
- "import": "./dist/react.mjs",
37
- "require": "./dist/react.js",
38
- "types": "./dist/react.d.ts"
36
+ "types": "./dist/react.d.ts",
37
+ "import": "./dist/react.js",
38
+ "require": "./dist/react.cjs"
39
39
  }
40
40
  },
41
41
  "files": [
@@ -56,8 +56,8 @@
56
56
  "query-builder"
57
57
  ],
58
58
  "license": "MIT",
59
- "main": "./dist/index.js",
60
- "module": "./dist/index.mjs",
59
+ "main": "./dist/index.cjs",
60
+ "module": "./dist/index.js",
61
61
  "name": "@xylex-group/athena",
62
62
  "peerDependencies": {
63
63
  "react": ">=17.0.0"
@@ -74,6 +74,7 @@
74
74
  },
75
75
  "scripts": {
76
76
  "build": "tsup",
77
+ "check:all": "pnpm lint && pnpm typecheck && pnpm test && pnpm build",
77
78
  "dev": "tsup --watch",
78
79
  "example:api-call": "cd examples/api-call && bun run start",
79
80
  "example:email-resend": "cd examples/email-resend && bun run start",
@@ -83,13 +84,24 @@
83
84
  "example:recurring-invoice": "cd examples/recurring-invoice && bun run start",
84
85
  "example:retry-patterns": "cd examples/retry-patterns && bun run start",
85
86
  "lint": "eslint \"src/**/*.ts\" \"test/**/*.ts\"",
86
- "lint:fix": "npm run lint -- --fix",
87
- "prepublishOnly": "npm run build",
87
+ "lint:fix": "pnpm lint -- --fix",
88
+ "prepublishOnly": "pnpm typecheck && pnpm build",
88
89
  "publish:token": "node scripts/publish.js",
89
90
  "test": "node --test test/*.test.ts",
90
- "test:watch": "node --test --watch test/*.test.ts"
91
+ "test:watch": "node --test --watch test/*.test.ts",
92
+ "typecheck": "tsc -p tsconfig.typecheck.json"
91
93
  },
92
94
  "type": "module",
93
95
  "types": "./dist/index.d.ts",
94
- "version": "1.1.0"
96
+ "typesVersions": {
97
+ "*": {
98
+ "*": [
99
+ "dist/index.d.ts"
100
+ ],
101
+ "react": [
102
+ "dist/react.d.ts"
103
+ ]
104
+ }
105
+ },
106
+ "version": "1.1.1"
95
107
  }