@xylex-group/athena 1.0.4 → 1.1.0

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,4 +1,6 @@
1
1
  # athena-js
2
+
3
+ current version: `1.1.0`
2
4
 
3
5
  `@xylex-group/athena` is a database driver and API gateway SDK that lets you interact with SQL backends over HTTP through a fluent builder API. It ships a typed query builder for Node.js / server environments and a React hook for client-side use.
4
6
 
@@ -23,10 +25,10 @@ npm install react # React >=17 required for the hook
23
25
  ```ts
24
26
  import { createClient } from "@xylex-group/athena";
25
27
 
26
- const athena = createClient(
27
- "https://athena-db.com",
28
- process.env.ATHENA_API_KEY,
29
- );
28
+ const athenaClient = createClient(ATHENA_URL, ATHENA_API_KEY, {
29
+ client: "CLIENT_NAME",
30
+ backend: { type: "athena" },
31
+ });
30
32
 
31
33
  const { data, error } = await athena.from("characters").select(`
32
34
  id,
@@ -1,3 +1,5 @@
1
+ 'use strict';
2
+
1
3
  // src/gateway/client.ts
2
4
  var DEFAULT_BASE_URL = "https://athena-db.com";
3
5
  var DEFAULT_CLIENT = "railway_direct";
@@ -278,8 +280,18 @@ function createTableBuilder(tableName, client) {
278
280
  };
279
281
  const addCondition = (operator, column, value) => {
280
282
  const condition = { operator };
281
- if (column) condition.column = column;
282
- if (value !== void 0) condition.value = value;
283
+ if (column) {
284
+ condition.column = column;
285
+ if (operator === "eq") {
286
+ condition.eq_column = column;
287
+ }
288
+ }
289
+ if (value !== void 0) {
290
+ condition.value = value;
291
+ if (operator === "eq") {
292
+ condition.eq_value = value;
293
+ }
294
+ }
283
295
  state.conditions.push(condition);
284
296
  };
285
297
  const builder = {};
@@ -510,6 +522,8 @@ var Backend = {
510
522
  ScyllaDB: { type: "scylladb" }
511
523
  };
512
524
 
513
- export { AthenaClient, Backend, createClient };
514
- //# sourceMappingURL=index.mjs.map
515
- //# sourceMappingURL=index.mjs.map
525
+ exports.AthenaClient = AthenaClient;
526
+ exports.Backend = Backend;
527
+ exports.createClient = createClient;
528
+ //# sourceMappingURL=index.cjs.map
529
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +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,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-D0uYdUea.mjs';
2
- export { e as Backend } from './types-D0uYdUea.mjs';
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';
3
3
 
4
4
  interface SupabaseResult<T> {
5
5
  data: T | null;
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-D0uYdUea.js';
2
- export { e as Backend } from './types-D0uYdUea.js';
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';
3
3
 
4
4
  interface SupabaseResult<T> {
5
5
  data: T | null;
package/dist/index.js CHANGED
@@ -1,5 +1,3 @@
1
- 'use strict';
2
-
3
1
  // src/gateway/client.ts
4
2
  var DEFAULT_BASE_URL = "https://athena-db.com";
5
3
  var DEFAULT_CLIENT = "railway_direct";
@@ -280,8 +278,18 @@ function createTableBuilder(tableName, client) {
280
278
  };
281
279
  const addCondition = (operator, column, value) => {
282
280
  const condition = { operator };
283
- if (column) condition.column = column;
284
- if (value !== void 0) condition.value = value;
281
+ if (column) {
282
+ condition.column = column;
283
+ if (operator === "eq") {
284
+ condition.eq_column = column;
285
+ }
286
+ }
287
+ if (value !== void 0) {
288
+ condition.value = value;
289
+ if (operator === "eq") {
290
+ condition.eq_value = value;
291
+ }
292
+ }
285
293
  state.conditions.push(condition);
286
294
  };
287
295
  const builder = {};
@@ -512,8 +520,6 @@ var Backend = {
512
520
  ScyllaDB: { type: "scylladb" }
513
521
  };
514
522
 
515
- exports.AthenaClient = AthenaClient;
516
- exports.Backend = Backend;
517
- exports.createClient = createClient;
523
+ export { AthenaClient, Backend, createClient };
518
524
  //# sourceMappingURL=index.js.map
519
525
  //# sourceMappingURL=index.js.map
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) condition.column = column\r\n if (value !== undefined) condition.value = value\r\n state.conditions.push(condition)\r\n }\r\n\r\n const builder = {} as TableQueryBuilder<Row>\r\n\r\n const filterMethods = createFilterMethods(state, addCondition, builder)\r\n\r\n const runSelect = async <T = Row>(\r\n columns: string | string[] = DEFAULT_COLUMNS,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n const payload = {\r\n table_name: tableName,\r\n columns,\r\n conditions: state.conditions.length ? [...state.conditions] : undefined,\r\n limit: state.limit,\r\n offset: state.offset,\r\n strip_nulls: options?.stripNulls ?? true,\r\n count: options?.count,\r\n head: options?.head,\r\n }\r\n const response = await client.fetchGateway<T>(payload, options)\r\n return formatResult(response)\r\n }\r\n\r\n const createSelectChain = (\r\n columns: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ): SelectChain<Row> => {\r\n const chain = {} as SelectChain<Row>\r\n const filterMethods = createFilterMethods(state, addCondition, chain)\r\n Object.assign(chain, filterMethods, {\r\n async single<T = Row>(cols?: string | string[], opts?: AthenaGatewayCallOptions) {\r\n const r = await runSelect<T[]>(cols ?? columns, opts ?? options)\r\n return toSingleResult(r)\r\n },\r\n maybeSingle<T = Row>(cols?: string | string[], opts?: AthenaGatewayCallOptions) {\r\n return chain.single<T>(cols, opts)\r\n },\r\n then<T1 = SupabaseResult<Row[]>, T2 = never>(\r\n onfulfilled?: (v: SupabaseResult<Row[]>) => T1 | PromiseLike<T1>,\r\n onrejected?: (reason: unknown) => T2 | PromiseLike<T2>,\r\n ) {\r\n return runSelect<Row[]>(columns, options).then(onfulfilled, onrejected)\r\n },\r\n catch<T = never>(onrejected?: (reason: unknown) => T | PromiseLike<T>) {\r\n return runSelect<Row[]>(columns, options).catch(onrejected)\r\n },\r\n finally(onfinally?: () => void) {\r\n return runSelect<Row[]>(columns, options).finally(onfinally)\r\n },\r\n })\r\n return chain\r\n }\r\n\r\n Object.assign(builder, filterMethods, {\r\n reset() {\r\n state.conditions = []\r\n state.limit = undefined\r\n state.offset = undefined\r\n return builder\r\n },\r\n select<T = Row>(columns: string | string[] = DEFAULT_COLUMNS, options?: AthenaGatewayCallOptions) {\r\n return createSelectChain(columns, options) as unknown as SelectChain<T>\r\n },\r\n insert(values: Row | Row[], options?: AthenaGatewayCallOptions) {\r\n const executeInsert = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaInsertPayload = {\r\n table_name: tableName,\r\n insert_body: values as Record<string, unknown> | Record<string, unknown>[],\r\n }\r\n if (columns) payload.columns = columns\r\n if (mergedOptions?.count) payload.count = mergedOptions.count\r\n if (mergedOptions?.head) payload.head = mergedOptions.head\r\n if (mergedOptions?.defaultToNull !== undefined) {\r\n payload.default_to_null = mergedOptions.defaultToNull\r\n }\r\n const response = await client.insertGateway<Row | Row[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row | Row[]>(executeInsert)\r\n },\r\n upsert(\r\n values: Row | Row[],\r\n options?: AthenaGatewayCallOptions & { updateBody?: Partial<Row>; onConflict?: string | string[] },\r\n ) {\r\n const executeUpsert = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaInsertPayload = {\r\n table_name: tableName,\r\n insert_body: values as Record<string, unknown> | Record<string, unknown>[],\r\n update_body: options?.updateBody ? (options.updateBody as Record<string, unknown>) : undefined,\r\n }\r\n if (columns) payload.columns = columns\r\n if (options?.onConflict) payload.on_conflict = options.onConflict\r\n if (mergedOptions?.count) payload.count = mergedOptions.count\r\n if (mergedOptions?.head) payload.head = mergedOptions.head\r\n if (mergedOptions?.defaultToNull !== undefined) {\r\n payload.default_to_null = mergedOptions.defaultToNull\r\n }\r\n const response = await client.insertGateway<Row | Row[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row | Row[]>(executeUpsert)\r\n },\r\n update(values: Partial<Row>, options?: AthenaGatewayCallOptions) {\r\n const executeUpdate = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const filters = state.conditions.length ? [...state.conditions] : undefined\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaUpdatePayload = {\r\n table_name: tableName,\r\n update_body: values,\r\n conditions: filters,\r\n columns,\r\n strip_nulls: mergedOptions?.stripNulls ?? true,\r\n }\r\n const response = await client.updateGateway<Row[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n const mutation = createMutationQuery<Row[]>(executeUpdate)\r\n const updateChain = {} as UpdateChain<Row>\r\n const filterMethods = createFilterMethods(state, addCondition, updateChain)\r\n Object.assign(updateChain, filterMethods, mutation)\r\n return updateChain\r\n },\r\n delete(options?: AthenaGatewayCallOptions & { resourceId?: string }) {\r\n const filters = state.conditions.length ? [...state.conditions] : undefined\r\n const resourceId = options?.resourceId ?? getResourceId(state)\r\n if (!resourceId && !filters?.length) {\r\n throw new Error('delete requires a resource_id either via eq(\"resource_id\", ...) or options.resourceId')\r\n }\r\n const executeDelete = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaDeletePayload = {\r\n table_name: tableName,\r\n resource_id: resourceId,\r\n conditions: filters,\r\n columns,\r\n }\r\n const response = await client.deleteGateway<Row | null>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row | null>(executeDelete)\r\n },\r\n async single<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions) {\r\n const response = await builder.select<T[]>(columns, options)\r\n return toSingleResult(response)\r\n },\r\n async maybeSingle<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions) {\r\n return builder.single<T>(columns, options)\r\n },\r\n })\r\n\r\n return builder\r\n}\r\n\r\nexport interface SupabaseClient {\r\n from<Row = unknown>(table: string): TableQueryBuilder<Row>\r\n}\r\n\r\n/** Client config for builder */\r\nexport interface AthenaClientConfig {\r\n baseUrl: string\r\n apiKey: string\r\n client?: string\r\n backend?: BackendConfig\r\n headers?: Record<string, string>\r\n healthTracking?: boolean\r\n}\r\n\r\nfunction createClientFromConfig(config: AthenaClientConfig): SupabaseClient {\r\n const gateway = createAthenaGatewayClient({\r\n baseUrl: config.baseUrl,\r\n apiKey: config.apiKey,\r\n client: config.client,\r\n backend: config.backend,\r\n headers: config.headers,\r\n })\r\n return {\r\n from<Row = unknown>(table: string) {\r\n return createTableBuilder<Row>(table, gateway)\r\n },\r\n }\r\n}\r\n\r\nexport interface AthenaClientBuilder {\r\n url(url: string): AthenaClientBuilder\r\n key(apiKey: string): AthenaClientBuilder\r\n backend(backend: BackendConfig | BackendType): AthenaClientBuilder\r\n client(clientName: string): AthenaClientBuilder\r\n headers(headers: Record<string, string>): AthenaClientBuilder\r\n healthTracking(enabled: boolean): AthenaClientBuilder\r\n build(): SupabaseClient\r\n}\r\n\r\nconst DEFAULT_BACKEND: BackendConfig = { type: 'athena' }\r\n\r\nfunction toBackendConfig(b: BackendConfig | BackendType | undefined): BackendConfig {\r\n if (!b) return DEFAULT_BACKEND\r\n return typeof b === 'string' ? { type: b } : b\r\n}\r\n\r\nexport const AthenaClient = {\r\n builder(): AthenaClientBuilder {\r\n let url: string | undefined\r\n let key: string | undefined\r\n let backend: BackendConfig = DEFAULT_BACKEND\r\n let clientName: string | undefined\r\n let headers: Record<string, string> | undefined\r\n let healthTracking = false\r\n const builder = {\r\n url(u: string) {\r\n url = u\r\n return builder\r\n },\r\n key(k: string) {\r\n key = k\r\n return builder\r\n },\r\n backend(b: BackendConfig | BackendType) {\r\n backend = toBackendConfig(b)\r\n return builder\r\n },\r\n client(c: string) {\r\n clientName = c\r\n return builder\r\n },\r\n headers(h: Record<string, string>) {\r\n headers = h\r\n return builder\r\n },\r\n healthTracking(enabled: boolean) {\r\n healthTracking = enabled\r\n return builder\r\n },\r\n build(): SupabaseClient {\r\n if (!url || !key) {\r\n throw new Error('AthenaClient requires url and key; call .url() and .key() before .build()')\r\n }\r\n return createClientFromConfig({\r\n baseUrl: url,\r\n apiKey: key,\r\n client: clientName,\r\n backend,\r\n headers,\r\n healthTracking,\r\n })\r\n },\r\n }\r\n return builder\r\n },\r\n\r\n /** Build client from env: ATHENA_SUPABASE_URL, ATHENA_SUPABASE_KEY (or SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY) */\r\n fromSupabaseEnv(): SupabaseClient {\r\n const url =\r\n process.env.ATHENA_SUPABASE_URL ??\r\n process.env.SUPABASE_URL\r\n const key =\r\n process.env.ATHENA_SUPABASE_KEY ??\r\n process.env.SUPABASE_SERVICE_ROLE_KEY\r\n if (!url || !key) {\r\n throw new Error(\r\n 'ATHENA_SUPABASE_URL and ATHENA_SUPABASE_KEY (or SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY) are required',\r\n )\r\n }\r\n return AthenaClient.builder()\r\n .backend({ type: 'supabase' })\r\n .url(url)\r\n .key(key)\r\n .build()\r\n },\r\n}\r\n\r\n/** Create client (convenience wrapper; use AthenaClient.builder() for full control) */\r\nexport function createClient(\r\n url: string,\r\n apiKey: string,\r\n options?: Pick<AthenaGatewayCallOptions, 'client' | 'headers' | 'backend'>,\r\n): SupabaseClient {\r\n const b = AthenaClient.builder().url(url).key(apiKey).backend(toBackendConfig(options?.backend))\r\n if (options?.client) b.client(options.client)\r\n if (options?.headers && Object.keys(options.headers).length > 0) b.headers(options.headers)\r\n return b.build()\r\n}\r\n","/**\r\n * athena gateway types\r\n *\r\n * type definitions for the athena gateway api client and react hook\r\n */\r\n\r\nexport type AthenaGatewayMethod = 'POST' | 'PUT' | 'DELETE'\r\nexport type AthenaGatewayEndpointPath =\r\n | '/gateway/fetch'\r\n | '/gateway/insert'\r\n | '/gateway/update'\r\n | '/gateway/delete'\r\n\r\nexport type AthenaCountOption = 'exact' | 'planned' | 'estimated'\r\n\r\nexport type AthenaConditionValue = string | number | boolean | null\r\nexport type AthenaConditionArrayValue = Array<AthenaConditionValue>\r\n\r\nexport type AthenaConditionOperator =\r\n | 'eq'\r\n | 'neq'\r\n | 'gt'\r\n | 'gte'\r\n | 'lt'\r\n | 'lte'\r\n | 'like'\r\n | 'ilike'\r\n | 'is'\r\n | 'in'\r\n | 'contains'\r\n | 'containedBy'\r\n | 'not'\r\n | 'or'\r\n\r\nexport interface AthenaGatewayCondition {\r\n column?: string\r\n operator: AthenaConditionOperator\r\n value?: AthenaConditionValue | AthenaConditionArrayValue | string\r\n}\r\n\r\nexport interface AthenaFetchPayload {\r\n view_name?: string\r\n table_name?: string\r\n columns?: string[] | string\r\n conditions?: AthenaGatewayCondition[]\r\n limit?: number\r\n offset?: number\r\n current_page?: number\r\n page_size?: number\r\n total_pages?: number\r\n strip_nulls?: boolean\r\n group_by?: string\r\n time_granularity?: 'day' | 'hour' | 'minute'\r\n aggregation_column?: string\r\n aggregation_strategy?: 'cumulative_sum'\r\n aggregation_dedup?: boolean\r\n}\r\n\r\nexport interface AthenaInsertPayload {\r\n table_name: string\r\n insert_body: Record<string, unknown> | Record<string, unknown>[]\r\n update_body?: Record<string, unknown>\r\n columns?: string[] | string\r\n count?: AthenaCountOption\r\n head?: boolean\r\n default_to_null?: boolean\r\n on_conflict?: string | string[]\r\n}\r\n\r\nexport interface AthenaDeletePayload {\r\n table_name: string\r\n resource_id?: string\r\n columns?: string[] | string\r\n conditions?: AthenaGatewayCondition[]\r\n}\r\n\r\nexport interface AthenaUpdatePayload extends AthenaFetchPayload {\r\n update_body?: Record<string, unknown>\r\n}\r\n\r\n/** Backend type for Athena client (aligns with athena-rs) */\r\nexport type BackendType = 'athena' | 'postgrest' | 'supabase' | 'postgresql' | 'scylladb'\r\n\r\n/** Backend config: type from SDK + backend-scoped options */\r\nexport interface BackendConfig {\r\n type: BackendType\r\n options?: Record<string, unknown>\r\n}\r\n\r\n/** Pre-defined backends for lean usage: backend: Backend.Athena */\r\nexport const Backend = {\r\n Athena: { type: 'athena' } as const,\r\n Supabase: { type: 'supabase' } as const,\r\n Postgrest: { type: 'postgrest' } as const,\r\n PostgreSQL: { type: 'postgresql' } as const,\r\n ScyllaDB: { type: 'scylladb' } as const,\r\n} as const satisfies Record<string, BackendConfig>\r\n\r\nexport type BackendOption = BackendConfig | BackendType\r\n\r\nexport interface AthenaGatewayBaseOptions {\r\n baseUrl?: string\r\n apiKey?: string\r\n client?: string\r\n backend?: BackendOption\r\n publishEvent?: string\r\n headers?: Record<string, string>\r\n userId?: string | null\r\n organizationId?: string | null\r\n}\r\n\r\nexport interface AthenaGatewayHookConfig extends AthenaGatewayBaseOptions {}\r\nexport interface AthenaGatewayCallOptions extends AthenaGatewayBaseOptions {\r\n count?: AthenaCountOption\r\n head?: boolean\r\n defaultToNull?: boolean\r\n stripNulls?: boolean\r\n onConflict?: string | string[]\r\n updateBody?: Record<string, unknown>\r\n}\r\n\r\nexport interface AthenaGatewayResponse<T = unknown> {\r\n ok: boolean\r\n status: number\r\n data: T | null\r\n error?: string\r\n raw: unknown\r\n}\r\n\r\nexport interface AthenaGatewayResponseLog extends AthenaGatewayResponse {\r\n timestamp: string\r\n}\r\n\r\nexport interface AthenaGatewayCallLog {\r\n endpoint: AthenaGatewayEndpointPath\r\n method: AthenaGatewayMethod\r\n payload: unknown\r\n headers: Record<string, string>\r\n timestamp: string\r\n}\r\n\r\nexport interface AthenaGatewayHookResult {\r\n fetchGateway: <T = unknown>(\r\n payload: AthenaFetchPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => Promise<AthenaGatewayResponse<T>>\r\n insertGateway: <T = unknown>(\r\n payload: AthenaInsertPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => Promise<AthenaGatewayResponse<T>>\r\n updateGateway: <T = unknown>(\r\n payload: AthenaUpdatePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => Promise<AthenaGatewayResponse<T>>\r\n deleteGateway: <T = unknown>(\r\n payload: AthenaDeletePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => Promise<AthenaGatewayResponse<T>>\r\n isLoading: boolean\r\n error: string | null\r\n lastRequest: AthenaGatewayCallLog | null\r\n lastResponse: AthenaGatewayResponseLog | null\r\n baseUrl: string\r\n}\r\n"]}
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,4 +1,6 @@
1
- import { useState, useMemo, useCallback } from 'react';
1
+ 'use strict';
2
+
3
+ var react = require('react');
2
4
 
3
5
  // src/gateway/use-athena-gateway.ts
4
6
 
@@ -120,13 +122,13 @@ function createAthenaGatewayClient(config = {}) {
120
122
 
121
123
  // src/gateway/use-athena-gateway.ts
122
124
  function useAthenaGateway(config) {
123
- const [isLoading, setIsLoading] = useState(false);
124
- const [error, setError] = useState(null);
125
- const [lastRequest, setLastRequest] = useState(
125
+ const [isLoading, setIsLoading] = react.useState(false);
126
+ const [error, setError] = react.useState(null);
127
+ const [lastRequest, setLastRequest] = react.useState(
126
128
  null
127
129
  );
128
- const [lastResponse, setLastResponse] = useState(null);
129
- const client = useMemo(
130
+ const [lastResponse, setLastResponse] = react.useState(null);
131
+ const client = react.useMemo(
130
132
  () => createAthenaGatewayClient({
131
133
  client: config?.client,
132
134
  baseUrl: config?.baseUrl,
@@ -148,7 +150,7 @@ function useAthenaGateway(config) {
148
150
  config?.organizationId
149
151
  ]
150
152
  );
151
- const callWithLifecycle = useCallback(
153
+ const callWithLifecycle = react.useCallback(
152
154
  async (fn, metadata) => {
153
155
  const requestLog = {
154
156
  endpoint: metadata.endpoint,
@@ -189,7 +191,7 @@ function useAthenaGateway(config) {
189
191
  [client]
190
192
  );
191
193
  const defaultStripNulls = true;
192
- const fetchGateway = useCallback(
194
+ const fetchGateway = react.useCallback(
193
195
  (payload, options) => {
194
196
  const normalizedPayload = {
195
197
  ...payload,
@@ -208,7 +210,7 @@ function useAthenaGateway(config) {
208
210
  },
209
211
  [callWithLifecycle, client]
210
212
  );
211
- const insertGateway = useCallback(
213
+ const insertGateway = react.useCallback(
212
214
  (payload, options) => callWithLifecycle(() => client.insertGateway(payload, options), {
213
215
  endpoint: "/gateway/insert",
214
216
  method: "PUT",
@@ -217,7 +219,7 @@ function useAthenaGateway(config) {
217
219
  }),
218
220
  [callWithLifecycle, client]
219
221
  );
220
- const updateGateway = useCallback(
222
+ const updateGateway = react.useCallback(
221
223
  (payload, options) => {
222
224
  const normalizedPayload = {
223
225
  ...payload,
@@ -236,7 +238,7 @@ function useAthenaGateway(config) {
236
238
  },
237
239
  [callWithLifecycle, client]
238
240
  );
239
- const deleteGateway = useCallback(
241
+ const deleteGateway = react.useCallback(
240
242
  (payload, options) => {
241
243
  if (!payload.resource_id) {
242
244
  throw new Error(
@@ -263,6 +265,6 @@ function useAthenaGateway(config) {
263
265
  };
264
266
  }
265
267
 
266
- export { useAthenaGateway };
267
- //# sourceMappingURL=react.mjs.map
268
- //# sourceMappingURL=react.mjs.map
268
+ exports.useAthenaGateway = useAthenaGateway;
269
+ //# sourceMappingURL=react.cjs.map
270
+ //# sourceMappingURL=react.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/gateway/client.ts","../src/gateway/use-athena-gateway.ts"],"names":["useState","useMemo","useCallback"],"mappings":"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","file":"react.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 { useCallback, useMemo, useState } from \"react\";\r\nimport type {\r\n AthenaDeletePayload,\r\n AthenaFetchPayload,\r\n AthenaGatewayCallLog,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayEndpointPath,\r\n AthenaGatewayHookConfig,\r\n AthenaGatewayHookResult,\r\n AthenaGatewayMethod,\r\n AthenaGatewayResponse,\r\n AthenaGatewayResponseLog,\r\n AthenaInsertPayload,\r\n AthenaUpdatePayload,\r\n} from \"./types.js\";\r\nimport { createAthenaGatewayClient } from \"./client.js\";\r\n\r\nexport function useAthenaGateway(\r\n config?: AthenaGatewayHookConfig,\r\n): AthenaGatewayHookResult {\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [lastRequest, setLastRequest] = useState<AthenaGatewayCallLog | null>(\r\n null,\r\n );\r\n const [lastResponse, setLastResponse] =\r\n useState<AthenaGatewayResponseLog | null>(null);\r\n\r\n const client = useMemo(\r\n () =>\r\n createAthenaGatewayClient({\r\n client: config?.client,\r\n baseUrl: config?.baseUrl,\r\n apiKey: config?.apiKey,\r\n backend: config?.backend,\r\n publishEvent: config?.publishEvent,\r\n headers: config?.headers,\r\n userId: config?.userId,\r\n organizationId: config?.organizationId,\r\n }),\r\n [\r\n config?.baseUrl,\r\n config?.client,\r\n config?.apiKey,\r\n config?.backend,\r\n config?.publishEvent,\r\n config?.headers,\r\n config?.userId,\r\n config?.organizationId,\r\n ],\r\n );\r\n\r\n const callWithLifecycle = useCallback(\r\n async <T>(\r\n fn: () => Promise<AthenaGatewayResponse<T>>,\r\n metadata: {\r\n endpoint: string;\r\n method: string;\r\n payload: unknown;\r\n options?: AthenaGatewayCallOptions;\r\n },\r\n ): Promise<AthenaGatewayResponse<T>> => {\r\n const requestLog: AthenaGatewayCallLog = {\r\n endpoint: metadata.endpoint as AthenaGatewayEndpointPath,\r\n method: metadata.method as AthenaGatewayMethod,\r\n payload: metadata.payload,\r\n headers: client.buildHeaders(metadata.options),\r\n timestamp: new Date().toISOString(),\r\n };\r\n\r\n setLastRequest(requestLog);\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n let response: AthenaGatewayResponse<T> | undefined;\r\n try {\r\n response = await fn();\r\n setLastResponse({ ...response, timestamp: new Date().toISOString() });\r\n\r\n if (!response.ok) {\r\n const message =\r\n response.error ||\r\n `Athena gateway ${metadata.method} ${metadata.endpoint} failed`;\r\n setError(message);\r\n throw new Error(message);\r\n }\r\n\r\n return response;\r\n } catch (callError) {\r\n const message =\r\n callError instanceof Error ? callError.message : String(callError);\r\n setError(message);\r\n setLastResponse({\r\n timestamp: new Date().toISOString(),\r\n status: response?.status ?? 0,\r\n ok: false,\r\n data: null,\r\n raw: null,\r\n error: message,\r\n });\r\n throw callError;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [client],\r\n );\r\n\r\n const defaultStripNulls = true;\r\n\r\n const fetchGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaFetchPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n const normalizedPayload: AthenaFetchPayload = {\r\n ...payload,\r\n conditions: payload.conditions ?? [],\r\n strip_nulls:\r\n payload.strip_nulls ??\r\n options?.stripNulls ??\r\n defaultStripNulls,\r\n };\r\n return callWithLifecycle<T>(\r\n () => client.fetchGateway<T>(normalizedPayload, options),\r\n {\r\n endpoint: \"/gateway/fetch\",\r\n method: \"POST\",\r\n payload: normalizedPayload,\r\n options,\r\n },\r\n );\r\n },\r\n [callWithLifecycle, client],\r\n );\r\n\r\n const insertGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaInsertPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) =>\r\n callWithLifecycle<T>(() => client.insertGateway<T>(payload, options), {\r\n endpoint: \"/gateway/insert\",\r\n method: \"PUT\",\r\n payload,\r\n options,\r\n }),\r\n [callWithLifecycle, client],\r\n );\r\n\r\n const updateGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaUpdatePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n const normalizedPayload: AthenaUpdatePayload = {\r\n ...payload,\r\n conditions: payload.conditions ?? [],\r\n strip_nulls:\r\n payload.strip_nulls ??\r\n options?.stripNulls ??\r\n defaultStripNulls,\r\n };\r\n return callWithLifecycle<T>(\r\n () => client.updateGateway<T>(normalizedPayload, options),\r\n {\r\n endpoint: \"/gateway/update\",\r\n method: \"POST\",\r\n payload: normalizedPayload,\r\n options,\r\n },\r\n );\r\n },\r\n [callWithLifecycle, client],\r\n );\r\n\r\n const deleteGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaDeletePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n if (!payload.resource_id) {\r\n throw new Error(\r\n \"deleteGateway requires resource_id (the unique identifier of the record to delete)\",\r\n );\r\n }\r\n return callWithLifecycle<T>(\r\n () => client.deleteGateway<T>(payload, options),\r\n { endpoint: \"/gateway/delete\", method: \"DELETE\", payload, options },\r\n );\r\n },\r\n [callWithLifecycle, client],\r\n );\r\n\r\n return {\r\n fetchGateway,\r\n insertGateway,\r\n updateGateway,\r\n deleteGateway,\r\n isLoading,\r\n error,\r\n lastRequest,\r\n lastResponse,\r\n baseUrl: client.baseUrl,\r\n };\r\n}\r\n"]}
@@ -1,5 +1,5 @@
1
- import { f as AthenaGatewayHookConfig, g as AthenaGatewayHookResult } from './types-D0uYdUea.mjs';
2
- export { h as AthenaDeletePayload, i as AthenaFetchPayload, d as AthenaGatewayCallOptions, j as AthenaGatewayResponse, k as AthenaInsertPayload, l as AthenaUpdatePayload } from './types-D0uYdUea.mjs';
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';
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-D0uYdUea.js';
2
- export { h as AthenaDeletePayload, i as AthenaFetchPayload, d as AthenaGatewayCallOptions, j as AthenaGatewayResponse, k as AthenaInsertPayload, l as AthenaUpdatePayload } from './types-D0uYdUea.js';
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';
3
3
 
4
4
  declare function useAthenaGateway(config?: AthenaGatewayHookConfig): AthenaGatewayHookResult;
5
5
 
package/dist/react.js CHANGED
@@ -1,6 +1,4 @@
1
- 'use strict';
2
-
3
- var react = require('react');
1
+ import { useState, useMemo, useCallback } from 'react';
4
2
 
5
3
  // src/gateway/use-athena-gateway.ts
6
4
 
@@ -122,13 +120,13 @@ function createAthenaGatewayClient(config = {}) {
122
120
 
123
121
  // src/gateway/use-athena-gateway.ts
124
122
  function useAthenaGateway(config) {
125
- const [isLoading, setIsLoading] = react.useState(false);
126
- const [error, setError] = react.useState(null);
127
- const [lastRequest, setLastRequest] = react.useState(
123
+ const [isLoading, setIsLoading] = useState(false);
124
+ const [error, setError] = useState(null);
125
+ const [lastRequest, setLastRequest] = useState(
128
126
  null
129
127
  );
130
- const [lastResponse, setLastResponse] = react.useState(null);
131
- const client = react.useMemo(
128
+ const [lastResponse, setLastResponse] = useState(null);
129
+ const client = useMemo(
132
130
  () => createAthenaGatewayClient({
133
131
  client: config?.client,
134
132
  baseUrl: config?.baseUrl,
@@ -150,7 +148,7 @@ function useAthenaGateway(config) {
150
148
  config?.organizationId
151
149
  ]
152
150
  );
153
- const callWithLifecycle = react.useCallback(
151
+ const callWithLifecycle = useCallback(
154
152
  async (fn, metadata) => {
155
153
  const requestLog = {
156
154
  endpoint: metadata.endpoint,
@@ -191,7 +189,7 @@ function useAthenaGateway(config) {
191
189
  [client]
192
190
  );
193
191
  const defaultStripNulls = true;
194
- const fetchGateway = react.useCallback(
192
+ const fetchGateway = useCallback(
195
193
  (payload, options) => {
196
194
  const normalizedPayload = {
197
195
  ...payload,
@@ -210,7 +208,7 @@ function useAthenaGateway(config) {
210
208
  },
211
209
  [callWithLifecycle, client]
212
210
  );
213
- const insertGateway = react.useCallback(
211
+ const insertGateway = useCallback(
214
212
  (payload, options) => callWithLifecycle(() => client.insertGateway(payload, options), {
215
213
  endpoint: "/gateway/insert",
216
214
  method: "PUT",
@@ -219,7 +217,7 @@ function useAthenaGateway(config) {
219
217
  }),
220
218
  [callWithLifecycle, client]
221
219
  );
222
- const updateGateway = react.useCallback(
220
+ const updateGateway = useCallback(
223
221
  (payload, options) => {
224
222
  const normalizedPayload = {
225
223
  ...payload,
@@ -238,7 +236,7 @@ function useAthenaGateway(config) {
238
236
  },
239
237
  [callWithLifecycle, client]
240
238
  );
241
- const deleteGateway = react.useCallback(
239
+ const deleteGateway = useCallback(
242
240
  (payload, options) => {
243
241
  if (!payload.resource_id) {
244
242
  throw new Error(
@@ -265,6 +263,6 @@ function useAthenaGateway(config) {
265
263
  };
266
264
  }
267
265
 
268
- exports.useAthenaGateway = useAthenaGateway;
266
+ export { useAthenaGateway };
269
267
  //# sourceMappingURL=react.js.map
270
268
  //# sourceMappingURL=react.js.map
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/gateway/client.ts","../src/gateway/use-athena-gateway.ts"],"names":["useState","useMemo","useCallback"],"mappings":"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","file":"react.js","sourcesContent":["import type {\r\n AthenaGatewayBaseOptions,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayEndpointPath,\r\n AthenaGatewayMethod,\r\n AthenaGatewayResponse,\r\n} from \"./types.js\";\r\nimport type {\r\n AthenaDeletePayload,\r\n AthenaFetchPayload,\r\n AthenaInsertPayload,\r\n AthenaUpdatePayload,\r\n} from \"./types.js\";\r\n\r\nconst DEFAULT_BASE_URL = \"https://athena-db.com\";\r\nconst DEFAULT_CLIENT = \"railway_direct\";\r\n\r\nfunction parseResponseText(text: string) {\r\n if (!text) return null;\r\n try {\r\n return JSON.parse(text);\r\n } catch {\r\n return text;\r\n }\r\n}\r\n\r\nfunction normalizeHeaderValue(value?: string | null) {\r\n return value ? value : undefined;\r\n}\r\n\r\nfunction buildHeaders(\r\n config: AthenaGatewayBaseOptions,\r\n options?: AthenaGatewayCallOptions,\r\n): Record<string, string> {\r\n const mergedStripNulls = options?.stripNulls ?? 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 { useCallback, useMemo, useState } from \"react\";\r\nimport type {\r\n AthenaDeletePayload,\r\n AthenaFetchPayload,\r\n AthenaGatewayCallLog,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayEndpointPath,\r\n AthenaGatewayHookConfig,\r\n AthenaGatewayHookResult,\r\n AthenaGatewayMethod,\r\n AthenaGatewayResponse,\r\n AthenaGatewayResponseLog,\r\n AthenaInsertPayload,\r\n AthenaUpdatePayload,\r\n} from \"./types.js\";\r\nimport { createAthenaGatewayClient } from \"./client.js\";\r\n\r\nexport function useAthenaGateway(\r\n config?: AthenaGatewayHookConfig,\r\n): AthenaGatewayHookResult {\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [lastRequest, setLastRequest] = useState<AthenaGatewayCallLog | null>(\r\n null,\r\n );\r\n const [lastResponse, setLastResponse] =\r\n useState<AthenaGatewayResponseLog | null>(null);\r\n\r\n const client = useMemo(\r\n () =>\r\n createAthenaGatewayClient({\r\n client: config?.client,\r\n baseUrl: config?.baseUrl,\r\n apiKey: config?.apiKey,\r\n backend: config?.backend,\r\n publishEvent: config?.publishEvent,\r\n headers: config?.headers,\r\n userId: config?.userId,\r\n organizationId: config?.organizationId,\r\n }),\r\n [\r\n config?.baseUrl,\r\n config?.client,\r\n config?.apiKey,\r\n config?.backend,\r\n config?.publishEvent,\r\n config?.headers,\r\n config?.userId,\r\n config?.organizationId,\r\n ],\r\n );\r\n\r\n const callWithLifecycle = useCallback(\r\n async <T>(\r\n fn: () => Promise<AthenaGatewayResponse<T>>,\r\n metadata: {\r\n endpoint: string;\r\n method: string;\r\n payload: unknown;\r\n options?: AthenaGatewayCallOptions;\r\n },\r\n ): Promise<AthenaGatewayResponse<T>> => {\r\n const requestLog: AthenaGatewayCallLog = {\r\n endpoint: metadata.endpoint as AthenaGatewayEndpointPath,\r\n method: metadata.method as AthenaGatewayMethod,\r\n payload: metadata.payload,\r\n headers: client.buildHeaders(metadata.options),\r\n timestamp: new Date().toISOString(),\r\n };\r\n\r\n setLastRequest(requestLog);\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n let response: AthenaGatewayResponse<T> | undefined;\r\n try {\r\n response = await fn();\r\n setLastResponse({ ...response, timestamp: new Date().toISOString() });\r\n\r\n if (!response.ok) {\r\n const message =\r\n response.error ||\r\n `Athena gateway ${metadata.method} ${metadata.endpoint} failed`;\r\n setError(message);\r\n throw new Error(message);\r\n }\r\n\r\n return response;\r\n } catch (callError) {\r\n const message =\r\n callError instanceof Error ? callError.message : String(callError);\r\n setError(message);\r\n setLastResponse({\r\n timestamp: new Date().toISOString(),\r\n status: response?.status ?? 0,\r\n ok: false,\r\n data: null,\r\n raw: null,\r\n error: message,\r\n });\r\n throw callError;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [client],\r\n );\r\n\r\n const defaultStripNulls = true;\r\n\r\n const fetchGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaFetchPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n const normalizedPayload: AthenaFetchPayload = {\r\n ...payload,\r\n conditions: payload.conditions ?? [],\r\n strip_nulls:\r\n payload.strip_nulls ??\r\n options?.stripNulls ??\r\n defaultStripNulls,\r\n };\r\n return callWithLifecycle<T>(\r\n () => client.fetchGateway<T>(normalizedPayload, options),\r\n {\r\n endpoint: \"/gateway/fetch\",\r\n method: \"POST\",\r\n payload: normalizedPayload,\r\n options,\r\n },\r\n );\r\n },\r\n [callWithLifecycle, client],\r\n );\r\n\r\n const insertGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaInsertPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) =>\r\n callWithLifecycle<T>(() => client.insertGateway<T>(payload, options), {\r\n endpoint: \"/gateway/insert\",\r\n method: \"PUT\",\r\n payload,\r\n options,\r\n }),\r\n [callWithLifecycle, client],\r\n );\r\n\r\n const updateGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaUpdatePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n const normalizedPayload: AthenaUpdatePayload = {\r\n ...payload,\r\n conditions: payload.conditions ?? [],\r\n strip_nulls:\r\n payload.strip_nulls ??\r\n options?.stripNulls ??\r\n defaultStripNulls,\r\n };\r\n return callWithLifecycle<T>(\r\n () => client.updateGateway<T>(normalizedPayload, options),\r\n {\r\n endpoint: \"/gateway/update\",\r\n method: \"POST\",\r\n payload: normalizedPayload,\r\n options,\r\n },\r\n );\r\n },\r\n [callWithLifecycle, client],\r\n );\r\n\r\n const deleteGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaDeletePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n if (!payload.resource_id) {\r\n throw new Error(\r\n \"deleteGateway requires resource_id (the unique identifier of the record to delete)\",\r\n );\r\n }\r\n return callWithLifecycle<T>(\r\n () => client.deleteGateway<T>(payload, options),\r\n { endpoint: \"/gateway/delete\", method: \"DELETE\", payload, options },\r\n );\r\n },\r\n [callWithLifecycle, client],\r\n );\r\n\r\n return {\r\n fetchGateway,\r\n insertGateway,\r\n updateGateway,\r\n deleteGateway,\r\n isLoading,\r\n error,\r\n lastRequest,\r\n lastResponse,\r\n baseUrl: client.baseUrl,\r\n };\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/gateway/client.ts","../src/gateway/use-athena-gateway.ts"],"names":[],"mappings":";;;;;AAcA,IAAM,gBAAA,GAAmB,uBAAA;AACzB,IAAM,cAAA,GAAiB,gBAAA;AAEvB,SAAS,kBAAkB,IAAA,EAAc;AACvC,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACxB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,qBAAqB,KAAA,EAAuB;AACnD,EAAA,OAAO,QAAQ,KAAA,GAAQ,MAAA;AACzB;AAEA,SAAS,YAAA,CACP,QACA,OAAA,EACwB;AACxB,EAAA,MAAM,gBAAA,GAAmB,SAAS,UAAA,IAAc,IAAA;AAChD,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,GAAI,MAAA,CAAO,OAAA,IAAW,EAAC;AAAA,IACvB,GAAI,OAAA,EAAS,OAAA,IAAW;AAAC,GAC3B;AACA,EAAA,MAAM,YAAA,GACJ,YAAA,CAAa,iBAAiB,CAAA,IAC9B,aAAa,iBAAiB,CAAA;AAChC,EAAA,MAAM,WAAA,GACJ,SAAS,MAAA,IACT,MAAA,CAAO,WACN,OAAO,YAAA,KAAiB,QAAA,GAAW,YAAA,GAAe,MAAA,CAAA,IACnD,cAAA;AACF,EAAA,MAAM,WAAA,GAAc,OAAA,EAAS,MAAA,IAAU,MAAA,CAAO,MAAA;AAC9C,EAAA,MAAM,iBAAA,GAAoB,OAAA,EAAS,YAAA,IAAgB,MAAA,CAAO,YAAA;AAE1D,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,cAAA,EAAgB;AAAA,GAClB;AAEA,EAAA,IAAI,OAAA,EAAS,MAAA,IAAU,MAAA,CAAO,MAAA,EAAQ;AACpC,IAAA,OAAA,CAAQ,WAAW,CAAA,GAAI,OAAA,EAAS,MAAA,IAAU,OAAO,MAAA,IAAU,EAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,OAAA,EAAS,cAAA,IAAkB,MAAA,CAAO,cAAA,EAAgB;AACpD,IAAA,OAAA,CAAQ,mBAAmB,CAAA,GACzB,OAAA,EAAS,cAAA,IAAkB,OAAO,cAAA,IAAkB,EAAA;AAAA,EACxD;AAEA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAA,CAAQ,iBAAiB,CAAA,GAAI,WAAA;AAAA,EAC/B;AAEA,EAAA,MAAM,YAAA,GAAe,OAAA,EAAS,OAAA,IAAW,MAAA,CAAO,OAAA;AAChD,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,IAAA,GAAO,OAAO,YAAA,KAAiB,QAAA,GAAW,eAAe,YAAA,CAAa,IAAA;AAC5E,IAAA,IAAI,IAAA,EAAM,OAAA,CAAQ,gBAAgB,CAAA,GAAI,IAAA;AAAA,EACxC;AAEA,EAAA,IAAI,OAAO,qBAAqB,SAAA,EAAW;AACzC,IAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,gBAAA,GAAmB,MAAA,GAAS,OAAA;AAAA,EACzD;AAEA,EAAA,IAAI,iBAAA,EAAmB;AACrB,IAAA,OAAA,CAAQ,iBAAiB,CAAA,GAAI,iBAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAA,CAAQ,QAAQ,CAAA,GAAI,WAAA;AACpB,IAAA,OAAA,CAAQ,WAAW,CAAA,GAAI,OAAA,CAAQ,WAAW,CAAA,IAAK,WAAA;AAAA,EACjD;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,iBAAA,EAAmB,iBAAiB,CAAA;AAC9D,EAAA,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACrD,IAAA,IAAI,gBAAA,CAAiB,QAAA,CAAS,GAAG,CAAA,EAAG;AACpC,IAAA,MAAM,UAAA,GAAa,qBAAqB,KAAK,CAAA;AAC7C,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,UAAA;AAAA,IACjB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,OAAA;AACT;AAEA,eAAe,UAAA,CACb,MAAA,EACA,QAAA,EACA,MAAA,EACA,SACA,OAAA,EACmC;AACnC,EAAA,MAAM,OAAA,GAAA,CACJ,SAAS,OAAA,IACT,MAAA,CAAO,WACP,gBAAA,EACA,OAAA,CAAQ,OAAO,EAAE,CAAA;AACnB,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA;AACjC,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,MAAA,EAAQ,OAAO,CAAA;AAE5C,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,MAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,KAC7B,CAAA;AAED,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAK;AACpC,IAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,OAAA,IAAW,EAAE,CAAA;AAC9C,IAAA,MAAM,aAAA,GAAgB,MAAA;AACtB,IAAA,MAAM,WAAA,GACJ,iBAAiB,OAAO,aAAA,KAAkB,WACpC,aAAA,CAAc,KAAA,IACf,cAAc,OAAA,GACf,KAAA,CAAA;AACN,IAAA,MAAM,WACJ,OAAO,WAAA,KAAgB,YAAY,WAAA,CAAY,MAAA,GAAS,IACpD,WAAA,GACA,KAAA,CAAA;AAIN,IAAA,MAAM,WAAA,GACJ,iBACA,OAAO,aAAA,KAAkB,YACzB,MAAA,IAAU,aAAA,GACL,cAAc,IAAA,GACd,MAAA;AAEP,IAAA,OAAO;AAAA,MACL,IAAI,QAAA,CAAS,EAAA;AAAA,MACb,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,MAAM,WAAA,IAAe,IAAA;AAAA,MACrB,KAAA,EAAO,QAAA;AAAA,MACP,GAAA,EAAK;AAAA,KACP;AAAA,EACF,SAAS,SAAA,EAAW;AAClB,IAAA,MAAM,UACJ,SAAA,YAAqB,KAAA,GAAQ,SAAA,CAAU,OAAA,GAAU,OAAO,SAAS,CAAA;AACnE,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,CAAA;AAAA,MACR,IAAA,EAAM,IAAA;AAAA,MACN,KAAA,EAAO,OAAA;AAAA,MACP,GAAA,EAAK;AAAA,KACP;AAAA,EACF;AACF;AAuBO,SAAS,yBAAA,CACd,MAAA,GAAmC,EAAC,EACf;AACrB,EAAA,OAAO;AAAA,IACL,UAAU,MAAA,CAAO,OAAA,IAAW,gBAAA,EAAkB,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,IAC/D,aAAa,OAAA,EAAS;AACpB,MAAA,OAAO,YAAA,CAAa,QAAQ,OAAO,CAAA;AAAA,IACrC,CAAA;AAAA,IACA,YAAA,CAAa,SAAS,OAAA,EAAS;AAC7B,MAAA,OAAO,UAAA,CAAW,MAAA,EAAQ,gBAAA,EAAkB,MAAA,EAAQ,SAAS,OAAO,CAAA;AAAA,IACtE,CAAA;AAAA,IACA,aAAA,CAAc,SAAS,OAAA,EAAS;AAC9B,MAAA,OAAO,UAAA,CAAW,MAAA,EAAQ,iBAAA,EAAmB,KAAA,EAAO,SAAS,OAAO,CAAA;AAAA,IACtE,CAAA;AAAA,IACA,aAAA,CAAc,SAAS,OAAA,EAAS;AAC9B,MAAA,OAAO,UAAA,CAAW,MAAA,EAAQ,iBAAA,EAAmB,MAAA,EAAQ,SAAS,OAAO,CAAA;AAAA,IACvE,CAAA;AAAA,IACA,aAAA,CAAc,SAAS,OAAA,EAAS;AAC9B,MAAA,OAAO,UAAA,CAAW,MAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAU,SAAS,OAAO,CAAA;AAAA,IACzE;AAAA,GACF;AACF;;;AC3LO,SAAS,iBACd,MAAA,EACyB;AACzB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,QAAA;AAAA,IACpC;AAAA,GACF;AACA,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAClC,SAA0C,IAAI,CAAA;AAEhD,EAAA,MAAM,MAAA,GAAS,OAAA;AAAA,IACb,MACE,yBAAA,CAA0B;AAAA,MACxB,QAAQ,MAAA,EAAQ,MAAA;AAAA,MAChB,SAAS,MAAA,EAAQ,OAAA;AAAA,MACjB,QAAQ,MAAA,EAAQ,MAAA;AAAA,MAChB,SAAS,MAAA,EAAQ,OAAA;AAAA,MACjB,cAAc,MAAA,EAAQ,YAAA;AAAA,MACtB,SAAS,MAAA,EAAQ,OAAA;AAAA,MACjB,QAAQ,MAAA,EAAQ,MAAA;AAAA,MAChB,gBAAgB,MAAA,EAAQ;AAAA,KACzB,CAAA;AAAA,IACH;AAAA,MACE,MAAA,EAAQ,OAAA;AAAA,MACR,MAAA,EAAQ,MAAA;AAAA,MACR,MAAA,EAAQ,MAAA;AAAA,MACR,MAAA,EAAQ,OAAA;AAAA,MACR,MAAA,EAAQ,YAAA;AAAA,MACR,MAAA,EAAQ,OAAA;AAAA,MACR,MAAA,EAAQ,MAAA;AAAA,MACR,MAAA,EAAQ;AAAA;AACV,GACF;AAEA,EAAA,MAAM,iBAAA,GAAoB,WAAA;AAAA,IACxB,OACE,IACA,QAAA,KAMsC;AACtC,MAAA,MAAM,UAAA,GAAmC;AAAA,QACvC,UAAU,QAAA,CAAS,QAAA;AAAA,QACnB,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,SAAS,QAAA,CAAS,OAAA;AAAA,QAClB,OAAA,EAAS,MAAA,CAAO,YAAA,CAAa,QAAA,CAAS,OAAO,CAAA;AAAA,QAC7C,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,OACpC;AAEA,MAAA,cAAA,CAAe,UAAU,CAAA;AACzB,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,QAAA,CAAS,IAAI,CAAA;AAEb,MAAA,IAAI,QAAA;AACJ,MAAA,IAAI;AACF,QAAA,QAAA,GAAW,MAAM,EAAA,EAAG;AACpB,QAAA,eAAA,CAAgB,EAAE,GAAG,QAAA,EAAU,SAAA,EAAA,qBAAe,IAAA,EAAK,EAAE,WAAA,EAAY,EAAG,CAAA;AAEpE,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,OAAA,GACJ,SAAS,KAAA,IACT,CAAA,eAAA,EAAkB,SAAS,MAAM,CAAA,CAAA,EAAI,SAAS,QAAQ,CAAA,OAAA,CAAA;AACxD,UAAA,QAAA,CAAS,OAAO,CAAA;AAChB,UAAA,MAAM,IAAI,MAAM,OAAO,CAAA;AAAA,QACzB;AAEA,QAAA,OAAO,QAAA;AAAA,MACT,SAAS,SAAA,EAAW;AAClB,QAAA,MAAM,UACJ,SAAA,YAAqB,KAAA,GAAQ,SAAA,CAAU,OAAA,GAAU,OAAO,SAAS,CAAA;AACnE,QAAA,QAAA,CAAS,OAAO,CAAA;AAChB,QAAA,eAAA,CAAgB;AAAA,UACd,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UAClC,MAAA,EAAQ,UAAU,MAAA,IAAU,CAAA;AAAA,UAC5B,EAAA,EAAI,KAAA;AAAA,UACJ,IAAA,EAAM,IAAA;AAAA,UACN,GAAA,EAAK,IAAA;AAAA,UACL,KAAA,EAAO;AAAA,SACR,CAAA;AACD,QAAA,MAAM,SAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,MAAM,iBAAA,GAAoB,IAAA;AAE1B,EAAA,MAAM,YAAA,GAAe,WAAA;AAAA,IACnB,CACE,SACA,OAAA,KACG;AACH,MAAA,MAAM,iBAAA,GAAwC;AAAA,QAC5C,GAAG,OAAA;AAAA,QACH,UAAA,EAAY,OAAA,CAAQ,UAAA,IAAc,EAAC;AAAA,QACnC,WAAA,EACE,OAAA,CAAQ,WAAA,IACR,OAAA,EAAS,UAAA,IACT;AAAA,OACJ;AACA,MAAA,OAAO,iBAAA;AAAA,QACL,MAAM,MAAA,CAAO,YAAA,CAAgB,iBAAA,EAAmB,OAAO,CAAA;AAAA,QACvD;AAAA,UACE,QAAA,EAAU,gBAAA;AAAA,UACV,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS,iBAAA;AAAA,UACT;AAAA;AACF,OACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,mBAAmB,MAAM;AAAA,GAC5B;AAEA,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,CACE,SACA,OAAA,KAEA,iBAAA,CAAqB,MAAM,MAAA,CAAO,aAAA,CAAiB,OAAA,EAAS,OAAO,CAAA,EAAG;AAAA,MACpE,QAAA,EAAU,iBAAA;AAAA,MACV,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACH,CAAC,mBAAmB,MAAM;AAAA,GAC5B;AAEA,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,CACE,SACA,OAAA,KACG;AACH,MAAA,MAAM,iBAAA,GAAyC;AAAA,QAC7C,GAAG,OAAA;AAAA,QACH,UAAA,EAAY,OAAA,CAAQ,UAAA,IAAc,EAAC;AAAA,QACnC,WAAA,EACE,OAAA,CAAQ,WAAA,IACR,OAAA,EAAS,UAAA,IACT;AAAA,OACJ;AACA,MAAA,OAAO,iBAAA;AAAA,QACL,MAAM,MAAA,CAAO,aAAA,CAAiB,iBAAA,EAAmB,OAAO,CAAA;AAAA,QACxD;AAAA,UACE,QAAA,EAAU,iBAAA;AAAA,UACV,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS,iBAAA;AAAA,UACT;AAAA;AACF,OACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,mBAAmB,MAAM;AAAA,GAC5B;AAEA,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,CACE,SACA,OAAA,KACG;AACH,MAAA,IAAI,CAAC,QAAQ,WAAA,EAAa;AACxB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,OAAO,iBAAA;AAAA,QACL,MAAM,MAAA,CAAO,aAAA,CAAiB,OAAA,EAAS,OAAO,CAAA;AAAA,QAC9C,EAAE,QAAA,EAAU,iBAAA,EAAmB,MAAA,EAAQ,QAAA,EAAU,SAAS,OAAA;AAAQ,OACpE;AAAA,IACF,CAAA;AAAA,IACA,CAAC,mBAAmB,MAAM;AAAA,GAC5B;AAEA,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAS,MAAA,CAAO;AAAA,GAClB;AACF","file":"react.js","sourcesContent":["import type {\r\n AthenaGatewayBaseOptions,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayEndpointPath,\r\n AthenaGatewayMethod,\r\n AthenaGatewayResponse,\r\n} from \"./types.js\";\r\nimport type {\r\n AthenaDeletePayload,\r\n AthenaFetchPayload,\r\n AthenaInsertPayload,\r\n AthenaUpdatePayload,\r\n} from \"./types.js\";\r\n\r\nconst DEFAULT_BASE_URL = \"https://athena-db.com\";\r\nconst DEFAULT_CLIENT = \"railway_direct\";\r\n\r\nfunction parseResponseText(text: string) {\r\n if (!text) return null;\r\n try {\r\n return JSON.parse(text);\r\n } catch {\r\n return text;\r\n }\r\n}\r\n\r\nfunction normalizeHeaderValue(value?: string | null) {\r\n return value ? value : undefined;\r\n}\r\n\r\nfunction buildHeaders(\r\n config: AthenaGatewayBaseOptions,\r\n options?: AthenaGatewayCallOptions,\r\n): Record<string, string> {\r\n const mergedStripNulls = options?.stripNulls ?? 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 { useCallback, useMemo, useState } from \"react\";\r\nimport type {\r\n AthenaDeletePayload,\r\n AthenaFetchPayload,\r\n AthenaGatewayCallLog,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayEndpointPath,\r\n AthenaGatewayHookConfig,\r\n AthenaGatewayHookResult,\r\n AthenaGatewayMethod,\r\n AthenaGatewayResponse,\r\n AthenaGatewayResponseLog,\r\n AthenaInsertPayload,\r\n AthenaUpdatePayload,\r\n} from \"./types.js\";\r\nimport { createAthenaGatewayClient } from \"./client.js\";\r\n\r\nexport function useAthenaGateway(\r\n config?: AthenaGatewayHookConfig,\r\n): AthenaGatewayHookResult {\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [lastRequest, setLastRequest] = useState<AthenaGatewayCallLog | null>(\r\n null,\r\n );\r\n const [lastResponse, setLastResponse] =\r\n useState<AthenaGatewayResponseLog | null>(null);\r\n\r\n const client = useMemo(\r\n () =>\r\n createAthenaGatewayClient({\r\n client: config?.client,\r\n baseUrl: config?.baseUrl,\r\n apiKey: config?.apiKey,\r\n backend: config?.backend,\r\n publishEvent: config?.publishEvent,\r\n headers: config?.headers,\r\n userId: config?.userId,\r\n organizationId: config?.organizationId,\r\n }),\r\n [\r\n config?.baseUrl,\r\n config?.client,\r\n config?.apiKey,\r\n config?.backend,\r\n config?.publishEvent,\r\n config?.headers,\r\n config?.userId,\r\n config?.organizationId,\r\n ],\r\n );\r\n\r\n const callWithLifecycle = useCallback(\r\n async <T>(\r\n fn: () => Promise<AthenaGatewayResponse<T>>,\r\n metadata: {\r\n endpoint: string;\r\n method: string;\r\n payload: unknown;\r\n options?: AthenaGatewayCallOptions;\r\n },\r\n ): Promise<AthenaGatewayResponse<T>> => {\r\n const requestLog: AthenaGatewayCallLog = {\r\n endpoint: metadata.endpoint as AthenaGatewayEndpointPath,\r\n method: metadata.method as AthenaGatewayMethod,\r\n payload: metadata.payload,\r\n headers: client.buildHeaders(metadata.options),\r\n timestamp: new Date().toISOString(),\r\n };\r\n\r\n setLastRequest(requestLog);\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n let response: AthenaGatewayResponse<T> | undefined;\r\n try {\r\n response = await fn();\r\n setLastResponse({ ...response, timestamp: new Date().toISOString() });\r\n\r\n if (!response.ok) {\r\n const message =\r\n response.error ||\r\n `Athena gateway ${metadata.method} ${metadata.endpoint} failed`;\r\n setError(message);\r\n throw new Error(message);\r\n }\r\n\r\n return response;\r\n } catch (callError) {\r\n const message =\r\n callError instanceof Error ? callError.message : String(callError);\r\n setError(message);\r\n setLastResponse({\r\n timestamp: new Date().toISOString(),\r\n status: response?.status ?? 0,\r\n ok: false,\r\n data: null,\r\n raw: null,\r\n error: message,\r\n });\r\n throw callError;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [client],\r\n );\r\n\r\n const defaultStripNulls = true;\r\n\r\n const fetchGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaFetchPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n const normalizedPayload: AthenaFetchPayload = {\r\n ...payload,\r\n conditions: payload.conditions ?? [],\r\n strip_nulls:\r\n payload.strip_nulls ??\r\n options?.stripNulls ??\r\n defaultStripNulls,\r\n };\r\n return callWithLifecycle<T>(\r\n () => client.fetchGateway<T>(normalizedPayload, options),\r\n {\r\n endpoint: \"/gateway/fetch\",\r\n method: \"POST\",\r\n payload: normalizedPayload,\r\n options,\r\n },\r\n );\r\n },\r\n [callWithLifecycle, client],\r\n );\r\n\r\n const insertGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaInsertPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) =>\r\n callWithLifecycle<T>(() => client.insertGateway<T>(payload, options), {\r\n endpoint: \"/gateway/insert\",\r\n method: \"PUT\",\r\n payload,\r\n options,\r\n }),\r\n [callWithLifecycle, client],\r\n );\r\n\r\n const updateGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaUpdatePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n const normalizedPayload: AthenaUpdatePayload = {\r\n ...payload,\r\n conditions: payload.conditions ?? [],\r\n strip_nulls:\r\n payload.strip_nulls ??\r\n options?.stripNulls ??\r\n defaultStripNulls,\r\n };\r\n return callWithLifecycle<T>(\r\n () => client.updateGateway<T>(normalizedPayload, options),\r\n {\r\n endpoint: \"/gateway/update\",\r\n method: \"POST\",\r\n payload: normalizedPayload,\r\n options,\r\n },\r\n );\r\n },\r\n [callWithLifecycle, client],\r\n );\r\n\r\n const deleteGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaDeletePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n if (!payload.resource_id) {\r\n throw new Error(\r\n \"deleteGateway requires resource_id (the unique identifier of the record to delete)\",\r\n );\r\n }\r\n return callWithLifecycle<T>(\r\n () => client.deleteGateway<T>(payload, options),\r\n { endpoint: \"/gateway/delete\", method: \"DELETE\", payload, options },\r\n );\r\n },\r\n [callWithLifecycle, client],\r\n );\r\n\r\n return {\r\n fetchGateway,\r\n insertGateway,\r\n updateGateway,\r\n deleteGateway,\r\n isLoading,\r\n error,\r\n lastRequest,\r\n lastResponse,\r\n baseUrl: client.baseUrl,\r\n };\r\n}\r\n"]}
@@ -13,6 +13,9 @@ interface AthenaGatewayCondition {
13
13
  column?: string;
14
14
  operator: AthenaConditionOperator;
15
15
  value?: AthenaConditionValue | AthenaConditionArrayValue | string;
16
+ /** Back-compat shape expected by older gateway implementations */
17
+ eq_column?: string;
18
+ eq_value?: AthenaConditionValue | AthenaConditionArrayValue | string;
16
19
  }
17
20
  interface AthenaFetchPayload {
18
21
  view_name?: string;
@@ -13,6 +13,9 @@ interface AthenaGatewayCondition {
13
13
  column?: string;
14
14
  operator: AthenaConditionOperator;
15
15
  value?: AthenaConditionValue | AthenaConditionArrayValue | string;
16
+ /** Back-compat shape expected by older gateway implementations */
17
+ eq_column?: string;
18
+ eq_value?: AthenaConditionValue | AthenaConditionArrayValue | string;
16
19
  }
17
20
  interface AthenaFetchPayload {
18
21
  view_name?: string;
package/package.json CHANGED
@@ -1,23 +1,41 @@
1
1
  {
2
- "name": "@xylex-group/athena",
3
- "version": "1.0.4",
4
- "description": "Athena SDK",
5
- "main": "./dist/index.js",
6
- "module": "./dist/index.mjs",
7
- "types": "./dist/index.d.ts",
2
+ "author": "floris@xylex.group",
8
3
  "bin": {
9
4
  "athena-js": "./bin/athena-js.js"
10
5
  },
6
+ "dependencies": {
7
+ "@xylex-group/athena": "^0.2.1",
8
+ "blessed": "^0.1.81",
9
+ "chalk": "^4.1.2",
10
+ "cron-parser": "^4.9.0",
11
+ "uuid": "^9.0.1"
12
+ },
13
+ "description": "Athena JS SDK",
14
+ "devDependencies": {
15
+ "@types/blessed": "^0.1.25",
16
+ "@types/node": "^20.10.5",
17
+ "@types/react": "^18.3.12",
18
+ "@types/uuid": "^9.0.7",
19
+ "@typescript-eslint/eslint-plugin": "^7.18.0",
20
+ "@typescript-eslint/parser": "^7.18.0",
21
+ "eslint": "^8.57.1",
22
+ "tsup": "^8.5.1",
23
+ "tsx": "^4.7.0",
24
+ "typescript": "^5.3.3"
25
+ },
26
+ "engines": {
27
+ "node": ">=18.0.0"
28
+ },
11
29
  "exports": {
12
30
  ".": {
13
- "types": "./dist/index.d.ts",
14
31
  "import": "./dist/index.mjs",
15
- "require": "./dist/index.js"
32
+ "require": "./dist/index.js",
33
+ "types": "./dist/index.d.ts"
16
34
  },
17
35
  "./react": {
18
- "types": "./dist/react.d.ts",
19
36
  "import": "./dist/react.mjs",
20
- "require": "./dist/react.js"
37
+ "require": "./dist/react.js",
38
+ "types": "./dist/react.d.ts"
21
39
  }
22
40
  },
23
41
  "files": [
@@ -26,23 +44,6 @@
26
44
  "README.md",
27
45
  "LICENSE"
28
46
  ],
29
- "scripts": {
30
- "build": "tsup",
31
- "dev": "tsup --watch",
32
- "test": "node --test test/*.test.ts",
33
- "test:watch": "node --test --watch test/*.test.ts",
34
- "lint": "eslint \"src/**/*.ts\" \"test/**/*.ts\"",
35
- "lint:fix": "npm run lint -- --fix",
36
- "prepublishOnly": "npm run build",
37
- "publish:token": "node scripts/publish.js",
38
- "example:express-api": "cd examples/express-api && bun run start",
39
- "example:order-saga": "cd examples/order-saga && bun run start",
40
- "example:recurring-invoice": "cd examples/recurring-invoice && bun run start",
41
- "example:retry-patterns": "cd examples/retry-patterns && bun run start",
42
- "example:email-resend": "cd examples/email-resend && bun run start",
43
- "example:api-call": "cd examples/api-call && bun run start",
44
- "example:postgres-connection": "cd examples/postgres-connection && bun run start"
45
- },
46
47
  "keywords": [
47
48
  "database",
48
49
  "driver",
@@ -54,20 +55,10 @@
54
55
  "postgres",
55
56
  "query-builder"
56
57
  ],
57
- "author": "floris@xylex.group",
58
- "publisher": "XYLEX Group",
59
58
  "license": "MIT",
60
- "repository": {
61
- "type": "git",
62
- "url": "git+https://github.com/xylex-group/athena-js.git"
63
- },
64
- "dependencies": {
65
- "@xylex-group/athena": "^0.2.1",
66
- "blessed": "^0.1.81",
67
- "chalk": "^4.1.2",
68
- "cron-parser": "^4.9.0",
69
- "uuid": "^9.0.1"
70
- },
59
+ "main": "./dist/index.js",
60
+ "module": "./dist/index.mjs",
61
+ "name": "@xylex-group/athena",
71
62
  "peerDependencies": {
72
63
  "react": ">=17.0.0"
73
64
  },
@@ -76,19 +67,29 @@
76
67
  "optional": true
77
68
  }
78
69
  },
79
- "devDependencies": {
80
- "@types/blessed": "^0.1.25",
81
- "@types/node": "^20.10.5",
82
- "@types/react": "^18.3.12",
83
- "@types/uuid": "^9.0.7",
84
- "@typescript-eslint/eslint-plugin": "^7.18.0",
85
- "@typescript-eslint/parser": "^7.18.0",
86
- "eslint": "^8.57.1",
87
- "tsup": "^8.5.1",
88
- "tsx": "^4.7.0",
89
- "typescript": "^5.3.3"
70
+ "publisher": "XYLEX Group",
71
+ "repository": {
72
+ "type": "git",
73
+ "url": "git+https://github.com/xylex-group/athena-js.git"
90
74
  },
91
- "engines": {
92
- "node": ">=18.0.0"
93
- }
94
- }
75
+ "scripts": {
76
+ "build": "tsup",
77
+ "dev": "tsup --watch",
78
+ "example:api-call": "cd examples/api-call && bun run start",
79
+ "example:email-resend": "cd examples/email-resend && bun run start",
80
+ "example:express-api": "cd examples/express-api && bun run start",
81
+ "example:order-saga": "cd examples/order-saga && bun run start",
82
+ "example:postgres-connection": "cd examples/postgres-connection && bun run start",
83
+ "example:recurring-invoice": "cd examples/recurring-invoice && bun run start",
84
+ "example:retry-patterns": "cd examples/retry-patterns && bun run start",
85
+ "lint": "eslint \"src/**/*.ts\" \"test/**/*.ts\"",
86
+ "lint:fix": "npm run lint -- --fix",
87
+ "prepublishOnly": "npm run build",
88
+ "publish:token": "node scripts/publish.js",
89
+ "test": "node --test test/*.test.ts",
90
+ "test:watch": "node --test --watch test/*.test.ts"
91
+ },
92
+ "type": "module",
93
+ "types": "./dist/index.d.ts",
94
+ "version": "1.1.0"
95
+ }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/gateway/client.ts","../src/supabase.ts","../src/gateway/types.ts"],"names":["filterMethods"],"mappings":"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","file":"index.mjs","sourcesContent":["import type {\r\n AthenaGatewayBaseOptions,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayEndpointPath,\r\n AthenaGatewayMethod,\r\n AthenaGatewayResponse,\r\n} from \"./types.js\";\r\nimport type {\r\n AthenaDeletePayload,\r\n AthenaFetchPayload,\r\n AthenaInsertPayload,\r\n AthenaUpdatePayload,\r\n} from \"./types.js\";\r\n\r\nconst DEFAULT_BASE_URL = \"https://athena-db.com\";\r\nconst DEFAULT_CLIENT = \"railway_direct\";\r\n\r\nfunction parseResponseText(text: string) {\r\n if (!text) return null;\r\n try {\r\n return JSON.parse(text);\r\n } catch {\r\n return text;\r\n }\r\n}\r\n\r\nfunction normalizeHeaderValue(value?: string | null) {\r\n return value ? value : undefined;\r\n}\r\n\r\nfunction buildHeaders(\r\n config: AthenaGatewayBaseOptions,\r\n options?: AthenaGatewayCallOptions,\r\n): Record<string, string> {\r\n const mergedStripNulls = options?.stripNulls ?? true;\r\n const extraHeaders = {\r\n ...(config.headers ?? {}),\r\n ...(options?.headers ?? {}),\r\n };\r\n const headerClient =\r\n extraHeaders[\"x-athena-client\"] ??\r\n extraHeaders[\"X-Athena-Client\"];\r\n const finalClient =\r\n options?.client ??\r\n config.client ??\r\n (typeof headerClient === \"string\" ? headerClient : undefined) ??\r\n DEFAULT_CLIENT;\r\n const finalApiKey = options?.apiKey ?? config.apiKey;\r\n const finalPublishEvent = options?.publishEvent ?? config.publishEvent;\r\n\r\n const headers: Record<string, string> = {\r\n \"Content-Type\": \"application/json\",\r\n };\r\n\r\n if (options?.userId ?? config.userId) {\r\n headers[\"X-User-Id\"] = options?.userId ?? config.userId ?? \"\";\r\n }\r\n\r\n if (options?.organizationId ?? config.organizationId) {\r\n headers[\"X-Organization-Id\"] =\r\n options?.organizationId ?? config.organizationId ?? \"\";\r\n }\r\n\r\n if (finalClient) {\r\n headers[\"X-Athena-Client\"] = finalClient;\r\n }\r\n\r\n const finalBackend = options?.backend ?? config.backend;\r\n if (finalBackend) {\r\n const type = typeof finalBackend === \"string\" ? finalBackend : finalBackend.type;\r\n if (type) headers[\"X-Backend-Type\"] = type;\r\n }\r\n\r\n if (typeof mergedStripNulls === \"boolean\") {\r\n headers[\"X-Strip-Nulls\"] = mergedStripNulls ? \"true\" : \"false\";\r\n }\r\n\r\n if (finalPublishEvent) {\r\n headers[\"X-Publish-Event\"] = finalPublishEvent;\r\n }\r\n\r\n if (finalApiKey) {\r\n headers[\"apikey\"] = finalApiKey;\r\n headers[\"x-api-key\"] = headers[\"x-api-key\"] ?? finalApiKey;\r\n }\r\n\r\n const athenaClientKeys = [\"x-athena-client\", \"X-Athena-Client\"];\r\n Object.entries(extraHeaders).forEach(([key, value]) => {\r\n if (athenaClientKeys.includes(key)) return;\r\n const normalized = normalizeHeaderValue(value);\r\n if (normalized) {\r\n headers[key] = normalized;\r\n }\r\n });\r\n\r\n return headers;\r\n}\r\n\r\nasync function callAthena<T>(\r\n config: AthenaGatewayBaseOptions,\r\n endpoint: AthenaGatewayEndpointPath,\r\n method: AthenaGatewayMethod,\r\n payload: unknown,\r\n options?: AthenaGatewayCallOptions,\r\n): Promise<AthenaGatewayResponse<T>> {\r\n const baseUrl = (\r\n options?.baseUrl ??\r\n config.baseUrl ??\r\n DEFAULT_BASE_URL\r\n ).replace(/\\/$/, \"\");\r\n const url = `${baseUrl}${endpoint}`;\r\n const headers = buildHeaders(config, options);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method,\r\n headers,\r\n body: JSON.stringify(payload),\r\n });\r\n\r\n const rawText = await response.text();\r\n const parsed = parseResponseText(rawText ?? \"\");\r\n const parsedPayload = parsed as Record<string, unknown> | null;\r\n const parsedError =\r\n parsedPayload && typeof parsedPayload === \"object\"\r\n ? ((parsedPayload.error as string | undefined) ??\r\n (parsedPayload.message as string | undefined))\r\n : undefined;\r\n const hasError =\r\n typeof parsedError === \"string\" && parsedError.length > 0\r\n ? parsedError\r\n : undefined;\r\n\r\n // Unwrap envelope: API may return { data: [...], error: null } (e.g. when cached)\r\n // vs raw array when uncached. Use inner data when present to avoid double nesting.\r\n const payloadData =\r\n parsedPayload &&\r\n typeof parsedPayload === \"object\" &&\r\n \"data\" in parsedPayload\r\n ? (parsedPayload.data as T)\r\n : (parsed as T);\r\n\r\n return {\r\n ok: response.ok,\r\n status: response.status,\r\n data: payloadData ?? null,\r\n error: hasError,\r\n raw: parsed,\r\n };\r\n } catch (callError) {\r\n const message =\r\n callError instanceof Error ? callError.message : String(callError);\r\n return {\r\n ok: false,\r\n status: 0,\r\n data: null,\r\n error: message,\r\n raw: null,\r\n };\r\n }\r\n}\r\n\r\nexport interface AthenaGatewayClient {\r\n baseUrl: string;\r\n buildHeaders(options?: AthenaGatewayCallOptions): Record<string, string>;\r\n fetchGateway<T>(\r\n payload: AthenaFetchPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n insertGateway<T>(\r\n payload: AthenaInsertPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n updateGateway<T>(\r\n payload: AthenaUpdatePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n deleteGateway<T>(\r\n payload: AthenaDeletePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n}\r\n\r\nexport function createAthenaGatewayClient(\r\n config: AthenaGatewayBaseOptions = {},\r\n): AthenaGatewayClient {\r\n return {\r\n baseUrl: (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\"),\r\n buildHeaders(options) {\r\n return buildHeaders(config, options);\r\n },\r\n fetchGateway(payload, options) {\r\n return callAthena(config, \"/gateway/fetch\", \"POST\", payload, options);\r\n },\r\n insertGateway(payload, options) {\r\n return callAthena(config, \"/gateway/insert\", \"PUT\", payload, options);\r\n },\r\n updateGateway(payload, options) {\r\n return callAthena(config, \"/gateway/update\", \"POST\", payload, options);\r\n },\r\n deleteGateway(payload, options) {\r\n return callAthena(config, \"/gateway/delete\", \"DELETE\", payload, options);\r\n },\r\n };\r\n}\r\n","import type {\r\n AthenaConditionArrayValue,\r\n AthenaConditionOperator,\r\n AthenaConditionValue,\r\n AthenaDeletePayload,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayCondition,\r\n AthenaGatewayResponse,\r\n AthenaInsertPayload,\r\n AthenaUpdatePayload,\r\n} from './gateway/types.ts'\r\nimport type { BackendConfig, BackendType } from './gateway/types.ts'\r\nimport { createAthenaGatewayClient } from './gateway/client.ts'\r\n\r\nexport interface SupabaseResult<T> {\r\n data: T | null\r\n error: string | null\r\n status: number\r\n raw: unknown\r\n}\r\n\r\ntype TableBuilderState = {\r\n conditions: AthenaGatewayCondition[]\r\n limit?: number\r\n offset?: number\r\n}\r\n\r\ntype MutationSingleResult<Result> = Result extends Array<infer Item> ? Item | null : Result | null\r\nconst DEFAULT_COLUMNS = '*'\r\n\r\nexport interface MutationQuery<Result> extends PromiseLike<SupabaseResult<Result>> {\r\n select(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<Result>>\r\n returning(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<Result>>\r\n single(\r\n columns?: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<SupabaseResult<MutationSingleResult<Result>>>\r\n maybeSingle(\r\n columns?: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<SupabaseResult<MutationSingleResult<Result>>>\r\n then<TResult1 = SupabaseResult<Result>, TResult2 = never>(\r\n onfulfilled?: ((value: SupabaseResult<Result>) => TResult1 | PromiseLike<TResult1>) | undefined | null,\r\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | undefined | null,\r\n ): Promise<TResult1 | TResult2>\r\n catch<TResult = never>(\r\n onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | undefined | null,\r\n ): Promise<SupabaseResult<Result> | TResult>\r\n finally(onfinally?: (() => void) | undefined | null): Promise<SupabaseResult<Result>>\r\n}\r\n\r\nfunction formatResult<T>(response: AthenaGatewayResponse<T>): SupabaseResult<T> {\r\n return {\r\n data: response.data ?? null,\r\n error: response.error ?? null,\r\n status: response.status,\r\n raw: response.raw,\r\n }\r\n}\r\n\r\nfunction toSingleResult<Result>(response: SupabaseResult<Result>): SupabaseResult<MutationSingleResult<Result>> {\r\n const payload = response.data\r\n const singleData =\r\n Array.isArray(payload) ? (payload.length ? payload[0] : null) : payload ?? null\r\n return {\r\n ...response,\r\n data: singleData as MutationSingleResult<Result>,\r\n }\r\n}\r\n\r\nfunction mergeOptions(...options: Array<AthenaGatewayCallOptions | undefined>): AthenaGatewayCallOptions | undefined {\r\n return options.reduce<AthenaGatewayCallOptions | undefined>((acc, next) => {\r\n if (!next) return acc\r\n return { ...acc, ...next }\r\n }, undefined)\r\n}\r\n\r\nfunction createMutationQuery<Result>(\r\n executor: (\r\n columns?: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ) => Promise<SupabaseResult<Result>>,\r\n defaultColumns: string | string[] = DEFAULT_COLUMNS,\r\n): MutationQuery<Result> {\r\n let selectedColumns: string | string[] = defaultColumns\r\n let selectedOptions: AthenaGatewayCallOptions | undefined\r\n let promise: Promise<SupabaseResult<Result>> | null = null\r\n\r\n const run = (columns?: string | string[], options?: AthenaGatewayCallOptions) => {\r\n const payloadColumns = columns ?? selectedColumns\r\n const payloadOptions = options ?? selectedOptions\r\n if (!promise) {\r\n promise = executor(payloadColumns, payloadOptions)\r\n }\r\n return promise\r\n }\r\n\r\n const mutationQuery: MutationQuery<Result> = {\r\n select(columns = selectedColumns, options) {\r\n selectedColumns = columns\r\n selectedOptions = options ?? selectedOptions\r\n return run(columns, options)\r\n },\r\n returning(columns = selectedColumns, options) {\r\n return mutationQuery.select(columns, options)\r\n },\r\n single(columns = selectedColumns, options) {\r\n selectedColumns = columns\r\n selectedOptions = options ?? selectedOptions\r\n return run(columns, options).then(toSingleResult)\r\n },\r\n maybeSingle(columns = selectedColumns, options) {\r\n return mutationQuery.single(columns, options)\r\n },\r\n then(onfulfilled, onrejected) {\r\n return run(selectedColumns, selectedOptions).then(onfulfilled, onrejected)\r\n },\r\n catch(onrejected) {\r\n return run(selectedColumns, selectedOptions).catch(onrejected)\r\n },\r\n finally(onfinally) {\r\n return run(selectedColumns, selectedOptions).finally(onfinally)\r\n },\r\n }\r\n\r\n return mutationQuery\r\n}\r\n\r\n/** Shared filter chain - supports eq, limit, etc. in any order relative to select/update */\r\ninterface FilterChain<Self> {\r\n eq(column: string, value: AthenaConditionValue): Self\r\n match(filters: Record<string, AthenaConditionValue>): Self\r\n range(from: number, to: number): Self\r\n limit(count: number): Self\r\n offset(count: number): Self\r\n gt(column: string, value: AthenaConditionValue): Self\r\n gte(column: string, value: AthenaConditionValue): Self\r\n lt(column: string, value: AthenaConditionValue): Self\r\n lte(column: string, value: AthenaConditionValue): Self\r\n neq(column: string, value: AthenaConditionValue): Self\r\n like(column: string, value: AthenaConditionValue): Self\r\n ilike(column: string, value: AthenaConditionValue): Self\r\n is(column: string, value: AthenaConditionValue): Self\r\n in(column: string, values: AthenaConditionArrayValue): Self\r\n contains(column: string, values: AthenaConditionArrayValue): Self\r\n containedBy(column: string, values: AthenaConditionArrayValue): Self\r\n not(\r\n columnOrExpression: string,\r\n operator?: AthenaConditionOperator,\r\n value?: AthenaConditionValue,\r\n ): Self\r\n or(expression: string): Self\r\n}\r\n\r\n/** Chain returned by select() - supports filters and single/maybeSingle before execution */\r\nexport interface SelectChain<Row> extends FilterChain<SelectChain<Row>>, PromiseLike<SupabaseResult<Row[]>> {\r\n single<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<T | null>>\r\n maybeSingle<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<T | null>>\r\n}\r\n\r\n/** Chain returned by update() - supports filters before execution, plus select/returning */\r\nexport interface UpdateChain<Row> extends FilterChain<UpdateChain<Row>>, MutationQuery<Row[]> {}\r\n\r\nexport interface TableQueryBuilder<Row> extends FilterChain<TableQueryBuilder<Row>> {\r\n select<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): SelectChain<T>\r\n insert(values: Row | Row[], options?: AthenaGatewayCallOptions): MutationQuery<Row | Row[]>\r\n upsert(\r\n values: Row | Row[],\r\n options?: AthenaGatewayCallOptions & {\r\n updateBody?: Partial<Row>\r\n onConflict?: string | string[]\r\n },\r\n ): MutationQuery<Row | Row[]>\r\n update(values: Partial<Row>, options?: AthenaGatewayCallOptions): UpdateChain<Row>\r\n delete(options?: AthenaGatewayCallOptions & { resourceId?: string }): MutationQuery<Row | null>\r\n single<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<T | null>>\r\n maybeSingle<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions): Promise<SupabaseResult<T | null>>\r\n reset(): TableQueryBuilder<Row>\r\n}\r\n\r\nfunction getResourceId(state: TableBuilderState): string | undefined {\r\n const candidate = state.conditions.find(\r\n condition =>\r\n condition.operator === 'eq' &&\r\n (condition.column === 'resource_id' || condition.column === 'id'),\r\n )\r\n return candidate?.value?.toString()\r\n}\r\n\r\nfunction stringifyFilterValue(value: AthenaConditionValue | AthenaConditionArrayValue | string): string {\r\n if (Array.isArray(value)) {\r\n return value.join(',')\r\n }\r\n return String(value)\r\n}\r\n\r\nfunction createFilterMethods<Self>(\r\n state: TableBuilderState,\r\n addCondition: (\r\n operator: AthenaConditionOperator,\r\n column?: string,\r\n value?: AthenaConditionValue | AthenaConditionArrayValue | string,\r\n ) => void,\r\n self: Self,\r\n) {\r\n return {\r\n eq(column: string, value: AthenaConditionValue) {\r\n addCondition('eq', column, value)\r\n return self\r\n },\r\n match(filters: Record<string, AthenaConditionValue>) {\r\n Object.entries(filters).forEach(([column, value]) => addCondition('eq', column, value))\r\n return self\r\n },\r\n range(from: number, to: number) {\r\n state.offset = from\r\n state.limit = to - from + 1\r\n return self\r\n },\r\n limit(count: number) {\r\n state.limit = count\r\n return self\r\n },\r\n offset(count: number) {\r\n state.offset = count\r\n return self\r\n },\r\n gt(column: string, value: AthenaConditionValue) {\r\n addCondition('gt', column, value)\r\n return self\r\n },\r\n gte(column: string, value: AthenaConditionValue) {\r\n addCondition('gte', column, value)\r\n return self\r\n },\r\n lt(column: string, value: AthenaConditionValue) {\r\n addCondition('lt', column, value)\r\n return self\r\n },\r\n lte(column: string, value: AthenaConditionValue) {\r\n addCondition('lte', column, value)\r\n return self\r\n },\r\n neq(column: string, value: AthenaConditionValue) {\r\n addCondition('neq', column, value)\r\n return self\r\n },\r\n like(column: string, value: AthenaConditionValue) {\r\n addCondition('like', column, value)\r\n return self\r\n },\r\n ilike(column: string, value: AthenaConditionValue) {\r\n addCondition('ilike', column, value)\r\n return self\r\n },\r\n is(column: string, value: AthenaConditionValue) {\r\n addCondition('is', column, value)\r\n return self\r\n },\r\n in(column: string, values: AthenaConditionArrayValue) {\r\n addCondition('in', column, values)\r\n return self\r\n },\r\n contains(column: string, values: AthenaConditionArrayValue) {\r\n addCondition('contains', column, values)\r\n return self\r\n },\r\n containedBy(column: string, values: AthenaConditionArrayValue) {\r\n addCondition('containedBy', column, values)\r\n return self\r\n },\r\n not(columnOrExpression: string, operator?: AthenaConditionOperator, value?: AthenaConditionValue) {\r\n if (operator != null && value !== undefined) {\r\n addCondition('not', undefined, `${columnOrExpression}.${operator}.${stringifyFilterValue(value)}`)\r\n } else {\r\n addCondition('not', undefined, columnOrExpression)\r\n }\r\n return self\r\n },\r\n or(expression: string) {\r\n addCondition('or', undefined, expression)\r\n return self\r\n },\r\n }\r\n}\r\n\r\nfunction createTableBuilder<Row>(\r\n tableName: string,\r\n client: ReturnType<typeof createAthenaGatewayClient>,\r\n): TableQueryBuilder<Row> {\r\n const state: TableBuilderState = {\r\n conditions: [],\r\n }\r\n\r\n const addCondition = (\r\n operator: AthenaConditionOperator,\r\n column?: string,\r\n value?: AthenaConditionValue | AthenaConditionArrayValue | string,\r\n ) => {\r\n const condition: AthenaGatewayCondition = { operator }\r\n if (column) condition.column = column\r\n if (value !== undefined) condition.value = value\r\n state.conditions.push(condition)\r\n }\r\n\r\n const builder = {} as TableQueryBuilder<Row>\r\n\r\n const filterMethods = createFilterMethods(state, addCondition, builder)\r\n\r\n const runSelect = async <T = Row>(\r\n columns: string | string[] = DEFAULT_COLUMNS,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n const payload = {\r\n table_name: tableName,\r\n columns,\r\n conditions: state.conditions.length ? [...state.conditions] : undefined,\r\n limit: state.limit,\r\n offset: state.offset,\r\n strip_nulls: options?.stripNulls ?? true,\r\n count: options?.count,\r\n head: options?.head,\r\n }\r\n const response = await client.fetchGateway<T>(payload, options)\r\n return formatResult(response)\r\n }\r\n\r\n const createSelectChain = (\r\n columns: string | string[],\r\n options?: AthenaGatewayCallOptions,\r\n ): SelectChain<Row> => {\r\n const chain = {} as SelectChain<Row>\r\n const filterMethods = createFilterMethods(state, addCondition, chain)\r\n Object.assign(chain, filterMethods, {\r\n async single<T = Row>(cols?: string | string[], opts?: AthenaGatewayCallOptions) {\r\n const r = await runSelect<T[]>(cols ?? columns, opts ?? options)\r\n return toSingleResult(r)\r\n },\r\n maybeSingle<T = Row>(cols?: string | string[], opts?: AthenaGatewayCallOptions) {\r\n return chain.single<T>(cols, opts)\r\n },\r\n then<T1 = SupabaseResult<Row[]>, T2 = never>(\r\n onfulfilled?: (v: SupabaseResult<Row[]>) => T1 | PromiseLike<T1>,\r\n onrejected?: (reason: unknown) => T2 | PromiseLike<T2>,\r\n ) {\r\n return runSelect<Row[]>(columns, options).then(onfulfilled, onrejected)\r\n },\r\n catch<T = never>(onrejected?: (reason: unknown) => T | PromiseLike<T>) {\r\n return runSelect<Row[]>(columns, options).catch(onrejected)\r\n },\r\n finally(onfinally?: () => void) {\r\n return runSelect<Row[]>(columns, options).finally(onfinally)\r\n },\r\n })\r\n return chain\r\n }\r\n\r\n Object.assign(builder, filterMethods, {\r\n reset() {\r\n state.conditions = []\r\n state.limit = undefined\r\n state.offset = undefined\r\n return builder\r\n },\r\n select<T = Row>(columns: string | string[] = DEFAULT_COLUMNS, options?: AthenaGatewayCallOptions) {\r\n return createSelectChain(columns, options) as unknown as SelectChain<T>\r\n },\r\n insert(values: Row | Row[], options?: AthenaGatewayCallOptions) {\r\n const executeInsert = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaInsertPayload = {\r\n table_name: tableName,\r\n insert_body: values as Record<string, unknown> | Record<string, unknown>[],\r\n }\r\n if (columns) payload.columns = columns\r\n if (mergedOptions?.count) payload.count = mergedOptions.count\r\n if (mergedOptions?.head) payload.head = mergedOptions.head\r\n if (mergedOptions?.defaultToNull !== undefined) {\r\n payload.default_to_null = mergedOptions.defaultToNull\r\n }\r\n const response = await client.insertGateway<Row | Row[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row | Row[]>(executeInsert)\r\n },\r\n upsert(\r\n values: Row | Row[],\r\n options?: AthenaGatewayCallOptions & { updateBody?: Partial<Row>; onConflict?: string | string[] },\r\n ) {\r\n const executeUpsert = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaInsertPayload = {\r\n table_name: tableName,\r\n insert_body: values as Record<string, unknown> | Record<string, unknown>[],\r\n update_body: options?.updateBody ? (options.updateBody as Record<string, unknown>) : undefined,\r\n }\r\n if (columns) payload.columns = columns\r\n if (options?.onConflict) payload.on_conflict = options.onConflict\r\n if (mergedOptions?.count) payload.count = mergedOptions.count\r\n if (mergedOptions?.head) payload.head = mergedOptions.head\r\n if (mergedOptions?.defaultToNull !== undefined) {\r\n payload.default_to_null = mergedOptions.defaultToNull\r\n }\r\n const response = await client.insertGateway<Row | Row[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row | Row[]>(executeUpsert)\r\n },\r\n update(values: Partial<Row>, options?: AthenaGatewayCallOptions) {\r\n const executeUpdate = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const filters = state.conditions.length ? [...state.conditions] : undefined\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaUpdatePayload = {\r\n table_name: tableName,\r\n update_body: values,\r\n conditions: filters,\r\n columns,\r\n strip_nulls: mergedOptions?.stripNulls ?? true,\r\n }\r\n const response = await client.updateGateway<Row[]>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n const mutation = createMutationQuery<Row[]>(executeUpdate)\r\n const updateChain = {} as UpdateChain<Row>\r\n const filterMethods = createFilterMethods(state, addCondition, updateChain)\r\n Object.assign(updateChain, filterMethods, mutation)\r\n return updateChain\r\n },\r\n delete(options?: AthenaGatewayCallOptions & { resourceId?: string }) {\r\n const filters = state.conditions.length ? [...state.conditions] : undefined\r\n const resourceId = options?.resourceId ?? getResourceId(state)\r\n if (!resourceId && !filters?.length) {\r\n throw new Error('delete requires a resource_id either via eq(\"resource_id\", ...) or options.resourceId')\r\n }\r\n const executeDelete = async (\r\n columns?: string | string[],\r\n selectOptions?: AthenaGatewayCallOptions,\r\n ) => {\r\n const mergedOptions = mergeOptions(options, selectOptions)\r\n const payload: AthenaDeletePayload = {\r\n table_name: tableName,\r\n resource_id: resourceId,\r\n conditions: filters,\r\n columns,\r\n }\r\n const response = await client.deleteGateway<Row | null>(payload, mergedOptions)\r\n return formatResult(response)\r\n }\r\n return createMutationQuery<Row | null>(executeDelete)\r\n },\r\n async single<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions) {\r\n const response = await builder.select<T[]>(columns, options)\r\n return toSingleResult(response)\r\n },\r\n async maybeSingle<T = Row>(columns?: string | string[], options?: AthenaGatewayCallOptions) {\r\n return builder.single<T>(columns, options)\r\n },\r\n })\r\n\r\n return builder\r\n}\r\n\r\nexport interface SupabaseClient {\r\n from<Row = unknown>(table: string): TableQueryBuilder<Row>\r\n}\r\n\r\n/** Client config for builder */\r\nexport interface AthenaClientConfig {\r\n baseUrl: string\r\n apiKey: string\r\n client?: string\r\n backend?: BackendConfig\r\n headers?: Record<string, string>\r\n healthTracking?: boolean\r\n}\r\n\r\nfunction createClientFromConfig(config: AthenaClientConfig): SupabaseClient {\r\n const gateway = createAthenaGatewayClient({\r\n baseUrl: config.baseUrl,\r\n apiKey: config.apiKey,\r\n client: config.client,\r\n backend: config.backend,\r\n headers: config.headers,\r\n })\r\n return {\r\n from<Row = unknown>(table: string) {\r\n return createTableBuilder<Row>(table, gateway)\r\n },\r\n }\r\n}\r\n\r\nexport interface AthenaClientBuilder {\r\n url(url: string): AthenaClientBuilder\r\n key(apiKey: string): AthenaClientBuilder\r\n backend(backend: BackendConfig | BackendType): AthenaClientBuilder\r\n client(clientName: string): AthenaClientBuilder\r\n headers(headers: Record<string, string>): AthenaClientBuilder\r\n healthTracking(enabled: boolean): AthenaClientBuilder\r\n build(): SupabaseClient\r\n}\r\n\r\nconst DEFAULT_BACKEND: BackendConfig = { type: 'athena' }\r\n\r\nfunction toBackendConfig(b: BackendConfig | BackendType | undefined): BackendConfig {\r\n if (!b) return DEFAULT_BACKEND\r\n return typeof b === 'string' ? { type: b } : b\r\n}\r\n\r\nexport const AthenaClient = {\r\n builder(): AthenaClientBuilder {\r\n let url: string | undefined\r\n let key: string | undefined\r\n let backend: BackendConfig = DEFAULT_BACKEND\r\n let clientName: string | undefined\r\n let headers: Record<string, string> | undefined\r\n let healthTracking = false\r\n const builder = {\r\n url(u: string) {\r\n url = u\r\n return builder\r\n },\r\n key(k: string) {\r\n key = k\r\n return builder\r\n },\r\n backend(b: BackendConfig | BackendType) {\r\n backend = toBackendConfig(b)\r\n return builder\r\n },\r\n client(c: string) {\r\n clientName = c\r\n return builder\r\n },\r\n headers(h: Record<string, string>) {\r\n headers = h\r\n return builder\r\n },\r\n healthTracking(enabled: boolean) {\r\n healthTracking = enabled\r\n return builder\r\n },\r\n build(): SupabaseClient {\r\n if (!url || !key) {\r\n throw new Error('AthenaClient requires url and key; call .url() and .key() before .build()')\r\n }\r\n return createClientFromConfig({\r\n baseUrl: url,\r\n apiKey: key,\r\n client: clientName,\r\n backend,\r\n headers,\r\n healthTracking,\r\n })\r\n },\r\n }\r\n return builder\r\n },\r\n\r\n /** Build client from env: ATHENA_SUPABASE_URL, ATHENA_SUPABASE_KEY (or SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY) */\r\n fromSupabaseEnv(): SupabaseClient {\r\n const url =\r\n process.env.ATHENA_SUPABASE_URL ??\r\n process.env.SUPABASE_URL\r\n const key =\r\n process.env.ATHENA_SUPABASE_KEY ??\r\n process.env.SUPABASE_SERVICE_ROLE_KEY\r\n if (!url || !key) {\r\n throw new Error(\r\n 'ATHENA_SUPABASE_URL and ATHENA_SUPABASE_KEY (or SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY) are required',\r\n )\r\n }\r\n return AthenaClient.builder()\r\n .backend({ type: 'supabase' })\r\n .url(url)\r\n .key(key)\r\n .build()\r\n },\r\n}\r\n\r\n/** Create client (convenience wrapper; use AthenaClient.builder() for full control) */\r\nexport function createClient(\r\n url: string,\r\n apiKey: string,\r\n options?: Pick<AthenaGatewayCallOptions, 'client' | 'headers' | 'backend'>,\r\n): SupabaseClient {\r\n const b = AthenaClient.builder().url(url).key(apiKey).backend(toBackendConfig(options?.backend))\r\n if (options?.client) b.client(options.client)\r\n if (options?.headers && Object.keys(options.headers).length > 0) b.headers(options.headers)\r\n return b.build()\r\n}\r\n","/**\r\n * athena gateway types\r\n *\r\n * type definitions for the athena gateway api client and react hook\r\n */\r\n\r\nexport type AthenaGatewayMethod = 'POST' | 'PUT' | 'DELETE'\r\nexport type AthenaGatewayEndpointPath =\r\n | '/gateway/fetch'\r\n | '/gateway/insert'\r\n | '/gateway/update'\r\n | '/gateway/delete'\r\n\r\nexport type AthenaCountOption = 'exact' | 'planned' | 'estimated'\r\n\r\nexport type AthenaConditionValue = string | number | boolean | null\r\nexport type AthenaConditionArrayValue = Array<AthenaConditionValue>\r\n\r\nexport type AthenaConditionOperator =\r\n | 'eq'\r\n | 'neq'\r\n | 'gt'\r\n | 'gte'\r\n | 'lt'\r\n | 'lte'\r\n | 'like'\r\n | 'ilike'\r\n | 'is'\r\n | 'in'\r\n | 'contains'\r\n | 'containedBy'\r\n | 'not'\r\n | 'or'\r\n\r\nexport interface AthenaGatewayCondition {\r\n column?: string\r\n operator: AthenaConditionOperator\r\n value?: AthenaConditionValue | AthenaConditionArrayValue | string\r\n}\r\n\r\nexport interface AthenaFetchPayload {\r\n view_name?: string\r\n table_name?: string\r\n columns?: string[] | string\r\n conditions?: AthenaGatewayCondition[]\r\n limit?: number\r\n offset?: number\r\n current_page?: number\r\n page_size?: number\r\n total_pages?: number\r\n strip_nulls?: boolean\r\n group_by?: string\r\n time_granularity?: 'day' | 'hour' | 'minute'\r\n aggregation_column?: string\r\n aggregation_strategy?: 'cumulative_sum'\r\n aggregation_dedup?: boolean\r\n}\r\n\r\nexport interface AthenaInsertPayload {\r\n table_name: string\r\n insert_body: Record<string, unknown> | Record<string, unknown>[]\r\n update_body?: Record<string, unknown>\r\n columns?: string[] | string\r\n count?: AthenaCountOption\r\n head?: boolean\r\n default_to_null?: boolean\r\n on_conflict?: string | string[]\r\n}\r\n\r\nexport interface AthenaDeletePayload {\r\n table_name: string\r\n resource_id?: string\r\n columns?: string[] | string\r\n conditions?: AthenaGatewayCondition[]\r\n}\r\n\r\nexport interface AthenaUpdatePayload extends AthenaFetchPayload {\r\n update_body?: Record<string, unknown>\r\n}\r\n\r\n/** Backend type for Athena client (aligns with athena-rs) */\r\nexport type BackendType = 'athena' | 'postgrest' | 'supabase' | 'postgresql' | 'scylladb'\r\n\r\n/** Backend config: type from SDK + backend-scoped options */\r\nexport interface BackendConfig {\r\n type: BackendType\r\n options?: Record<string, unknown>\r\n}\r\n\r\n/** Pre-defined backends for lean usage: backend: Backend.Athena */\r\nexport const Backend = {\r\n Athena: { type: 'athena' } as const,\r\n Supabase: { type: 'supabase' } as const,\r\n Postgrest: { type: 'postgrest' } as const,\r\n PostgreSQL: { type: 'postgresql' } as const,\r\n ScyllaDB: { type: 'scylladb' } as const,\r\n} as const satisfies Record<string, BackendConfig>\r\n\r\nexport type BackendOption = BackendConfig | BackendType\r\n\r\nexport interface AthenaGatewayBaseOptions {\r\n baseUrl?: string\r\n apiKey?: string\r\n client?: string\r\n backend?: BackendOption\r\n publishEvent?: string\r\n headers?: Record<string, string>\r\n userId?: string | null\r\n organizationId?: string | null\r\n}\r\n\r\nexport interface AthenaGatewayHookConfig extends AthenaGatewayBaseOptions {}\r\nexport interface AthenaGatewayCallOptions extends AthenaGatewayBaseOptions {\r\n count?: AthenaCountOption\r\n head?: boolean\r\n defaultToNull?: boolean\r\n stripNulls?: boolean\r\n onConflict?: string | string[]\r\n updateBody?: Record<string, unknown>\r\n}\r\n\r\nexport interface AthenaGatewayResponse<T = unknown> {\r\n ok: boolean\r\n status: number\r\n data: T | null\r\n error?: string\r\n raw: unknown\r\n}\r\n\r\nexport interface AthenaGatewayResponseLog extends AthenaGatewayResponse {\r\n timestamp: string\r\n}\r\n\r\nexport interface AthenaGatewayCallLog {\r\n endpoint: AthenaGatewayEndpointPath\r\n method: AthenaGatewayMethod\r\n payload: unknown\r\n headers: Record<string, string>\r\n timestamp: string\r\n}\r\n\r\nexport interface AthenaGatewayHookResult {\r\n fetchGateway: <T = unknown>(\r\n payload: AthenaFetchPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => Promise<AthenaGatewayResponse<T>>\r\n insertGateway: <T = unknown>(\r\n payload: AthenaInsertPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => Promise<AthenaGatewayResponse<T>>\r\n updateGateway: <T = unknown>(\r\n payload: AthenaUpdatePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => Promise<AthenaGatewayResponse<T>>\r\n deleteGateway: <T = unknown>(\r\n payload: AthenaDeletePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => Promise<AthenaGatewayResponse<T>>\r\n isLoading: boolean\r\n error: string | null\r\n lastRequest: AthenaGatewayCallLog | null\r\n lastResponse: AthenaGatewayResponseLog | null\r\n baseUrl: string\r\n}\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/gateway/client.ts","../src/gateway/use-athena-gateway.ts"],"names":[],"mappings":"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","file":"react.mjs","sourcesContent":["import type {\r\n AthenaGatewayBaseOptions,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayEndpointPath,\r\n AthenaGatewayMethod,\r\n AthenaGatewayResponse,\r\n} from \"./types.js\";\r\nimport type {\r\n AthenaDeletePayload,\r\n AthenaFetchPayload,\r\n AthenaInsertPayload,\r\n AthenaUpdatePayload,\r\n} from \"./types.js\";\r\n\r\nconst DEFAULT_BASE_URL = \"https://athena-db.com\";\r\nconst DEFAULT_CLIENT = \"railway_direct\";\r\n\r\nfunction parseResponseText(text: string) {\r\n if (!text) return null;\r\n try {\r\n return JSON.parse(text);\r\n } catch {\r\n return text;\r\n }\r\n}\r\n\r\nfunction normalizeHeaderValue(value?: string | null) {\r\n return value ? value : undefined;\r\n}\r\n\r\nfunction buildHeaders(\r\n config: AthenaGatewayBaseOptions,\r\n options?: AthenaGatewayCallOptions,\r\n): Record<string, string> {\r\n const mergedStripNulls = options?.stripNulls ?? 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 { useCallback, useMemo, useState } from \"react\";\r\nimport type {\r\n AthenaDeletePayload,\r\n AthenaFetchPayload,\r\n AthenaGatewayCallLog,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayEndpointPath,\r\n AthenaGatewayHookConfig,\r\n AthenaGatewayHookResult,\r\n AthenaGatewayMethod,\r\n AthenaGatewayResponse,\r\n AthenaGatewayResponseLog,\r\n AthenaInsertPayload,\r\n AthenaUpdatePayload,\r\n} from \"./types.js\";\r\nimport { createAthenaGatewayClient } from \"./client.js\";\r\n\r\nexport function useAthenaGateway(\r\n config?: AthenaGatewayHookConfig,\r\n): AthenaGatewayHookResult {\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [lastRequest, setLastRequest] = useState<AthenaGatewayCallLog | null>(\r\n null,\r\n );\r\n const [lastResponse, setLastResponse] =\r\n useState<AthenaGatewayResponseLog | null>(null);\r\n\r\n const client = useMemo(\r\n () =>\r\n createAthenaGatewayClient({\r\n client: config?.client,\r\n baseUrl: config?.baseUrl,\r\n apiKey: config?.apiKey,\r\n backend: config?.backend,\r\n publishEvent: config?.publishEvent,\r\n headers: config?.headers,\r\n userId: config?.userId,\r\n organizationId: config?.organizationId,\r\n }),\r\n [\r\n config?.baseUrl,\r\n config?.client,\r\n config?.apiKey,\r\n config?.backend,\r\n config?.publishEvent,\r\n config?.headers,\r\n config?.userId,\r\n config?.organizationId,\r\n ],\r\n );\r\n\r\n const callWithLifecycle = useCallback(\r\n async <T>(\r\n fn: () => Promise<AthenaGatewayResponse<T>>,\r\n metadata: {\r\n endpoint: string;\r\n method: string;\r\n payload: unknown;\r\n options?: AthenaGatewayCallOptions;\r\n },\r\n ): Promise<AthenaGatewayResponse<T>> => {\r\n const requestLog: AthenaGatewayCallLog = {\r\n endpoint: metadata.endpoint as AthenaGatewayEndpointPath,\r\n method: metadata.method as AthenaGatewayMethod,\r\n payload: metadata.payload,\r\n headers: client.buildHeaders(metadata.options),\r\n timestamp: new Date().toISOString(),\r\n };\r\n\r\n setLastRequest(requestLog);\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n let response: AthenaGatewayResponse<T> | undefined;\r\n try {\r\n response = await fn();\r\n setLastResponse({ ...response, timestamp: new Date().toISOString() });\r\n\r\n if (!response.ok) {\r\n const message =\r\n response.error ||\r\n `Athena gateway ${metadata.method} ${metadata.endpoint} failed`;\r\n setError(message);\r\n throw new Error(message);\r\n }\r\n\r\n return response;\r\n } catch (callError) {\r\n const message =\r\n callError instanceof Error ? callError.message : String(callError);\r\n setError(message);\r\n setLastResponse({\r\n timestamp: new Date().toISOString(),\r\n status: response?.status ?? 0,\r\n ok: false,\r\n data: null,\r\n raw: null,\r\n error: message,\r\n });\r\n throw callError;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [client],\r\n );\r\n\r\n const defaultStripNulls = true;\r\n\r\n const fetchGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaFetchPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n const normalizedPayload: AthenaFetchPayload = {\r\n ...payload,\r\n conditions: payload.conditions ?? [],\r\n strip_nulls:\r\n payload.strip_nulls ??\r\n options?.stripNulls ??\r\n defaultStripNulls,\r\n };\r\n return callWithLifecycle<T>(\r\n () => client.fetchGateway<T>(normalizedPayload, options),\r\n {\r\n endpoint: \"/gateway/fetch\",\r\n method: \"POST\",\r\n payload: normalizedPayload,\r\n options,\r\n },\r\n );\r\n },\r\n [callWithLifecycle, client],\r\n );\r\n\r\n const insertGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaInsertPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) =>\r\n callWithLifecycle<T>(() => client.insertGateway<T>(payload, options), {\r\n endpoint: \"/gateway/insert\",\r\n method: \"PUT\",\r\n payload,\r\n options,\r\n }),\r\n [callWithLifecycle, client],\r\n );\r\n\r\n const updateGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaUpdatePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n const normalizedPayload: AthenaUpdatePayload = {\r\n ...payload,\r\n conditions: payload.conditions ?? [],\r\n strip_nulls:\r\n payload.strip_nulls ??\r\n options?.stripNulls ??\r\n defaultStripNulls,\r\n };\r\n return callWithLifecycle<T>(\r\n () => client.updateGateway<T>(normalizedPayload, options),\r\n {\r\n endpoint: \"/gateway/update\",\r\n method: \"POST\",\r\n payload: normalizedPayload,\r\n options,\r\n },\r\n );\r\n },\r\n [callWithLifecycle, client],\r\n );\r\n\r\n const deleteGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaDeletePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n if (!payload.resource_id) {\r\n throw new Error(\r\n \"deleteGateway requires resource_id (the unique identifier of the record to delete)\",\r\n );\r\n }\r\n return callWithLifecycle<T>(\r\n () => client.deleteGateway<T>(payload, options),\r\n { endpoint: \"/gateway/delete\", method: \"DELETE\", payload, options },\r\n );\r\n },\r\n [callWithLifecycle, client],\r\n );\r\n\r\n return {\r\n fetchGateway,\r\n insertGateway,\r\n updateGateway,\r\n deleteGateway,\r\n isLoading,\r\n error,\r\n lastRequest,\r\n lastResponse,\r\n baseUrl: client.baseUrl,\r\n };\r\n}\r\n"]}