@settlemint/sdk-hasura 2.6.2 → 2.6.3

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
@@ -53,7 +53,7 @@ The SettleMint Hasura SDK provides a seamless way to interact with Hasura GraphQ
53
53
 
54
54
  > **createHasuraClient**\<`Setup`\>(`options`, `clientOptions?`, `logger?`): `object`
55
55
 
56
- Defined in: [sdk/hasura/src/hasura.ts:83](https://github.com/settlemint/sdk/blob/v2.6.2/sdk/hasura/src/hasura.ts#L83)
56
+ Defined in: [sdk/hasura/src/hasura.ts:83](https://github.com/settlemint/sdk/blob/v2.6.3/sdk/hasura/src/hasura.ts#L83)
57
57
 
58
58
  Creates a Hasura GraphQL client with proper type safety using gql.tada
59
59
 
@@ -85,8 +85,8 @@ An object containing:
85
85
 
86
86
  | Name | Type | Defined in |
87
87
  | ------ | ------ | ------ |
88
- | `client` | `GraphQLClient` | [sdk/hasura/src/hasura.ts:88](https://github.com/settlemint/sdk/blob/v2.6.2/sdk/hasura/src/hasura.ts#L88) |
89
- | `graphql` | `initGraphQLTada`\<`Setup`\> | [sdk/hasura/src/hasura.ts:89](https://github.com/settlemint/sdk/blob/v2.6.2/sdk/hasura/src/hasura.ts#L89) |
88
+ | `client` | `GraphQLClient` | [sdk/hasura/src/hasura.ts:88](https://github.com/settlemint/sdk/blob/v2.6.3/sdk/hasura/src/hasura.ts#L88) |
89
+ | `graphql` | `initGraphQLTada`\<`Setup`\> | [sdk/hasura/src/hasura.ts:89](https://github.com/settlemint/sdk/blob/v2.6.3/sdk/hasura/src/hasura.ts#L89) |
90
90
 
91
91
  ##### Throws
92
92
 
@@ -144,7 +144,7 @@ const result = await client.request(query);
144
144
 
145
145
  > **createHasuraMetadataClient**(`options`, `logger?`): \<`T`\>(`query`) => `Promise`\<\{ `data`: `T`; `ok`: `boolean`; \}\>
146
146
 
147
- Defined in: [sdk/hasura/src/hasura.ts:132](https://github.com/settlemint/sdk/blob/v2.6.2/sdk/hasura/src/hasura.ts#L132)
147
+ Defined in: [sdk/hasura/src/hasura.ts:132](https://github.com/settlemint/sdk/blob/v2.6.3/sdk/hasura/src/hasura.ts#L132)
148
148
 
149
149
  Creates a Hasura Metadata client
150
150
 
@@ -210,7 +210,7 @@ const result = await client({
210
210
 
211
211
  > **createPostgresPool**(`databaseUrl`): `Pool`
212
212
 
213
- Defined in: [sdk/hasura/src/postgres.ts:107](https://github.com/settlemint/sdk/blob/v2.6.2/sdk/hasura/src/postgres.ts#L107)
213
+ Defined in: [sdk/hasura/src/postgres.ts:107](https://github.com/settlemint/sdk/blob/v2.6.3/sdk/hasura/src/postgres.ts#L107)
214
214
 
215
215
  Creates a PostgreSQL connection pool with error handling and retry mechanisms
216
216
 
@@ -253,7 +253,7 @@ try {
253
253
 
254
254
  > **trackAllTables**(`databaseName`, `client`, `tableOptions`): `Promise`\<\{ `messages`: `string`[]; `result`: `"success"` \| `"no-tables"`; \}\>
255
255
 
256
- Defined in: [sdk/hasura/src/utils/track-all-tables.ts:30](https://github.com/settlemint/sdk/blob/v2.6.2/sdk/hasura/src/utils/track-all-tables.ts#L30)
256
+ Defined in: [sdk/hasura/src/utils/track-all-tables.ts:30](https://github.com/settlemint/sdk/blob/v2.6.3/sdk/hasura/src/utils/track-all-tables.ts#L30)
257
257
 
258
258
  Track all tables in a database
259
259
 
@@ -300,7 +300,7 @@ if (result.result === "success") {
300
300
 
301
301
  > **ClientOptions** = `object`
302
302
 
303
- Defined in: [sdk/hasura/src/hasura.ts:28](https://github.com/settlemint/sdk/blob/v2.6.2/sdk/hasura/src/hasura.ts#L28)
303
+ Defined in: [sdk/hasura/src/hasura.ts:28](https://github.com/settlemint/sdk/blob/v2.6.3/sdk/hasura/src/hasura.ts#L28)
304
304
 
305
305
  Type definition for client options derived from the ClientOptionsSchema.
306
306
 
@@ -308,10 +308,10 @@ Type definition for client options derived from the ClientOptionsSchema.
308
308
 
309
309
  | Name | Type | Default value | Defined in |
310
310
  | ------ | ------ | ------ | ------ |
311
- | <a id="accesstoken"></a> `accessToken?` | `string` | - | [sdk/hasura/src/hasura.ts:20](https://github.com/settlemint/sdk/blob/v2.6.2/sdk/hasura/src/hasura.ts#L20) |
312
- | <a id="adminsecret"></a> `adminSecret` | `string` | - | [sdk/hasura/src/hasura.ts:21](https://github.com/settlemint/sdk/blob/v2.6.2/sdk/hasura/src/hasura.ts#L21) |
313
- | <a id="cache"></a> `cache?` | `"default"` \| `"force-cache"` \| `"no-cache"` \| `"no-store"` \| `"only-if-cached"` \| `"reload"` | - | [sdk/hasura/src/hasura.ts:22](https://github.com/settlemint/sdk/blob/v2.6.2/sdk/hasura/src/hasura.ts#L22) |
314
- | <a id="instance"></a> `instance` | `string` | `UrlOrPathSchema` | [sdk/hasura/src/hasura.ts:19](https://github.com/settlemint/sdk/blob/v2.6.2/sdk/hasura/src/hasura.ts#L19) |
311
+ | <a id="accesstoken"></a> `accessToken?` | `string` | - | [sdk/hasura/src/hasura.ts:20](https://github.com/settlemint/sdk/blob/v2.6.3/sdk/hasura/src/hasura.ts#L20) |
312
+ | <a id="adminsecret"></a> `adminSecret` | `string` | - | [sdk/hasura/src/hasura.ts:21](https://github.com/settlemint/sdk/blob/v2.6.3/sdk/hasura/src/hasura.ts#L21) |
313
+ | <a id="cache"></a> `cache?` | `"default"` \| `"force-cache"` \| `"no-cache"` \| `"no-store"` \| `"only-if-cached"` \| `"reload"` | - | [sdk/hasura/src/hasura.ts:22](https://github.com/settlemint/sdk/blob/v2.6.3/sdk/hasura/src/hasura.ts#L22) |
314
+ | <a id="instance"></a> `instance` | `string` | `UrlOrPathSchema` | [sdk/hasura/src/hasura.ts:19](https://github.com/settlemint/sdk/blob/v2.6.3/sdk/hasura/src/hasura.ts#L19) |
315
315
 
316
316
  ***
317
317
 
@@ -319,7 +319,7 @@ Type definition for client options derived from the ClientOptionsSchema.
319
319
 
320
320
  > **RequestConfig** = `ConstructorParameters`\<*typeof* `GraphQLClient`\>\[`1`\]
321
321
 
322
- Defined in: [sdk/hasura/src/hasura.ts:13](https://github.com/settlemint/sdk/blob/v2.6.2/sdk/hasura/src/hasura.ts#L13)
322
+ Defined in: [sdk/hasura/src/hasura.ts:13](https://github.com/settlemint/sdk/blob/v2.6.3/sdk/hasura/src/hasura.ts#L13)
323
323
 
324
324
  Type definition for GraphQL client configuration options
325
325
 
@@ -329,7 +329,7 @@ Type definition for GraphQL client configuration options
329
329
 
330
330
  > `const` **ClientOptionsSchema**: `ZodObject`\<[`ClientOptions`](#clientoptions)\>
331
331
 
332
- Defined in: [sdk/hasura/src/hasura.ts:18](https://github.com/settlemint/sdk/blob/v2.6.2/sdk/hasura/src/hasura.ts#L18)
332
+ Defined in: [sdk/hasura/src/hasura.ts:18](https://github.com/settlemint/sdk/blob/v2.6.3/sdk/hasura/src/hasura.ts#L18)
333
333
 
334
334
  Schema for validating client options for the Hasura client.
335
335
 
package/dist/hasura.cjs CHANGED
@@ -22,14 +22,22 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
22
22
  }) : target, mod));
23
23
 
24
24
  //#endregion
25
- const __settlemint_sdk_utils = __toESM(require("@settlemint/sdk-utils"));
26
- const __settlemint_sdk_utils_http = __toESM(require("@settlemint/sdk-utils/http"));
27
- const __settlemint_sdk_utils_logging = __toESM(require("@settlemint/sdk-utils/logging"));
28
- const __settlemint_sdk_utils_runtime = __toESM(require("@settlemint/sdk-utils/runtime"));
29
- const __settlemint_sdk_utils_validation = __toESM(require("@settlemint/sdk-utils/validation"));
30
- const gql_tada = __toESM(require("gql.tada"));
31
- const graphql_request = __toESM(require("graphql-request"));
32
- const zod = __toESM(require("zod"));
25
+ let __settlemint_sdk_utils = require("@settlemint/sdk-utils");
26
+ __settlemint_sdk_utils = __toESM(__settlemint_sdk_utils);
27
+ let __settlemint_sdk_utils_http = require("@settlemint/sdk-utils/http");
28
+ __settlemint_sdk_utils_http = __toESM(__settlemint_sdk_utils_http);
29
+ let __settlemint_sdk_utils_logging = require("@settlemint/sdk-utils/logging");
30
+ __settlemint_sdk_utils_logging = __toESM(__settlemint_sdk_utils_logging);
31
+ let __settlemint_sdk_utils_runtime = require("@settlemint/sdk-utils/runtime");
32
+ __settlemint_sdk_utils_runtime = __toESM(__settlemint_sdk_utils_runtime);
33
+ let __settlemint_sdk_utils_validation = require("@settlemint/sdk-utils/validation");
34
+ __settlemint_sdk_utils_validation = __toESM(__settlemint_sdk_utils_validation);
35
+ let gql_tada = require("gql.tada");
36
+ gql_tada = __toESM(gql_tada);
37
+ let graphql_request = require("graphql-request");
38
+ graphql_request = __toESM(graphql_request);
39
+ let zod = require("zod");
40
+ zod = __toESM(zod);
33
41
 
34
42
  //#region src/utils/track-all-tables.ts
35
43
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"hasura.cjs","names":["messages: string[]","z","UrlOrPathSchema","ApplicationAccessTokenSchema","GraphQLClient"],"sources":["../src/utils/track-all-tables.ts","../src/hasura.ts"],"sourcesContent":["import type { createHasuraMetadataClient } from \"../hasura.js\";\n\n/**\n * Track all tables in a database\n *\n * @param databaseName - The name of the database to track tables for\n * @param client - The client options to use for the Hasura client\n * @param tableOptions - The options to use for the table tracking\n * @param tableOptions.includeSchemas - The schemas to include in the tracking\n * @param tableOptions.excludeSchemas - The schemas to exclude from the tracking\n * @returns A promise that resolves to an object with a result property indicating success or failure\n * @example\n * import { trackAllTables } from \"@settlemint/sdk-hasura/utils/track-all-tables\";\n *\n * const client = createHasuraMetadataClient({\n * instance: \"http://localhost:8080\",\n * accessToken: \"test\",\n * adminSecret: \"test\",\n * });\n *\n * const result = await trackAllTables(\"default\", client, {\n * excludeSchemas: [\"drizzle\"],\n * });\n * if (result.result === \"success\") {\n * console.log(\"Tables tracked successfully\");\n * } else {\n * console.error(\"Failed to track tables\");\n * }\n */\nexport async function trackAllTables(\n databaseName: string,\n client: ReturnType<typeof createHasuraMetadataClient>,\n tableOptions: {\n includeSchemas?: string[];\n excludeSchemas?: string[];\n } = {\n includeSchemas: undefined,\n excludeSchemas: undefined,\n },\n): Promise<{ result: \"success\" | \"no-tables\"; messages: string[] }> {\n const messages: string[] = [];\n\n const { includeSchemas, excludeSchemas } = tableOptions;\n\n // Get all tables using pg_get_source_tables\n const getTablesResult = await client<\n Array<{\n name: string;\n schema: string;\n }>\n >({\n type: \"pg_get_source_tables\",\n args: {\n source: databaseName,\n },\n });\n\n if (!getTablesResult.ok) {\n throw new Error(`Failed to get tables: ${JSON.stringify(getTablesResult.data)}`);\n }\n\n const tables = getTablesResult.data;\n\n if (tables.length === 0) {\n return { result: \"no-tables\" as const, messages };\n }\n\n messages.push(`Found ${tables.length} tables in database \"${databaseName}\"`);\n\n // Incase a table is already tracked, untrack it first\n await client<{ code?: string }>({\n type: \"pg_untrack_tables\",\n args: {\n tables: tables.map((table) => ({\n table: table,\n })),\n allow_warnings: true,\n },\n });\n\n const tablesToTrack = tables.filter((table) => {\n if (Array.isArray(includeSchemas)) {\n return includeSchemas.includes(table.schema);\n }\n if (Array.isArray(excludeSchemas)) {\n return !excludeSchemas.includes(table.schema);\n }\n return true;\n });\n\n // Track all tables\n const trackResult = await client<{ code?: string }>({\n type: \"pg_track_tables\",\n args: {\n tables: tablesToTrack.map((table) => ({\n table: table,\n })),\n allow_warnings: true,\n },\n });\n\n if (!trackResult.ok) {\n throw new Error(`Failed to track tables: ${JSON.stringify(trackResult.data)}`);\n }\n\n messages.push(`Successfully tracked ${tablesToTrack.length} tables`);\n\n return { result: \"success\" as const, messages };\n}\n","import { extractBaseUrlBeforeSegment } from \"@settlemint/sdk-utils\";\nimport { appendHeaders } from \"@settlemint/sdk-utils/http\";\nimport { type Logger, requestLogger } from \"@settlemint/sdk-utils/logging\";\nimport { ensureServer } from \"@settlemint/sdk-utils/runtime\";\nimport { ApplicationAccessTokenSchema, UrlOrPathSchema, validate } from \"@settlemint/sdk-utils/validation\";\nimport { type AbstractSetupSchema, initGraphQLTada } from \"gql.tada\";\nimport { GraphQLClient } from \"graphql-request\";\nimport { z } from \"zod\";\n\n/**\n * Type definition for GraphQL client configuration options\n */\nexport type RequestConfig = ConstructorParameters<typeof GraphQLClient>[1];\n\n/**\n * Schema for validating client options for the Hasura client.\n */\nexport const ClientOptionsSchema = z.object({\n instance: UrlOrPathSchema,\n accessToken: ApplicationAccessTokenSchema.optional(),\n adminSecret: z.string(),\n cache: z.enum([\"default\", \"force-cache\", \"no-cache\", \"no-store\", \"only-if-cached\", \"reload\"]).optional(),\n});\n\n/**\n * Type definition for client options derived from the ClientOptionsSchema.\n */\nexport type ClientOptions = z.infer<typeof ClientOptionsSchema>;\n\n/**\n * Creates a Hasura GraphQL client with proper type safety using gql.tada\n *\n * @param options - Configuration options for the client\n * @param clientOptions - Optional GraphQL client configuration options\n * @param logger - Optional logger to use for logging the requests\n * @returns An object containing:\n * - client: The configured GraphQL client instance\n * - graphql: The initialized gql.tada function for type-safe queries\n * @throws Will throw an error if the options fail validation against ClientOptionsSchema\n * @example\n * import { createHasuraClient } from '@settlemint/sdk-hasura';\n * import type { introspection } from \"@schemas/hasura-env\";\n * import { createLogger, requestLogger } from \"@settlemint/sdk-utils/logging\";\n *\n * const logger = createLogger();\n *\n * const { client, graphql } = createHasuraClient<{\n * introspection: introspection;\n * disableMasking: true;\n * scalars: {\n * timestamp: string;\n * timestampz: string;\n * uuid: string;\n * date: string;\n * time: string;\n * jsonb: string;\n * numeric: string;\n * interval: string;\n * geometry: string;\n * geography: string;\n * };\n * }>({\n * instance: process.env.SETTLEMINT_HASURA_ENDPOINT,\n * accessToken: process.env.SETTLEMINT_ACCESS_TOKEN,\n * adminSecret: process.env.SETTLEMINT_HASURA_ADMIN_SECRET,\n * }, {\n * fetch: requestLogger(logger, \"hasura\", fetch) as typeof fetch,\n * });\n *\n * // Making GraphQL queries\n * const query = graphql(`\n * query GetUsers {\n * users {\n * id\n * name\n * email\n * }\n * }\n * `);\n *\n * const result = await client.request(query);\n */\nexport function createHasuraClient<const Setup extends AbstractSetupSchema>(\n options: ClientOptions,\n clientOptions?: RequestConfig,\n logger?: Logger,\n): {\n client: GraphQLClient;\n graphql: initGraphQLTada<Setup>;\n} {\n ensureServer();\n const validatedOptions = validate(ClientOptionsSchema, options);\n const graphql = initGraphQLTada<Setup>();\n const fullUrl = new URL(validatedOptions.instance).toString();\n\n return {\n client: new GraphQLClient(fullUrl, {\n ...clientOptions,\n headers: appendHeaders(clientOptions?.headers, {\n \"x-auth-token\": validatedOptions.accessToken,\n \"x-hasura-admin-secret\": validatedOptions.adminSecret,\n }),\n fetch: (logger ? requestLogger(logger, \"hasura\", fetch) : fetch) as typeof fetch,\n }),\n graphql,\n };\n}\n\n/**\n * Creates a Hasura Metadata client\n *\n * @param options - Configuration options for the client\n * @param logger - Optional logger to use for logging the requests\n * @returns A function that can be used to make requests to the Hasura Metadata API\n * @throws Will throw an error if the options fail validation against ClientOptionsSchema\n * @example\n * import { createHasuraMetadataClient } from '@settlemint/sdk-hasura';\n *\n * const client = createHasuraMetadataClient({\n * instance: process.env.SETTLEMINT_HASURA_ENDPOINT,\n * accessToken: process.env.SETTLEMINT_ACCESS_TOKEN,\n * adminSecret: process.env.SETTLEMINT_HASURA_ADMIN_SECRET,\n * });\n *\n * const result = await client({\n * type: \"pg_get_source_tables\",\n * args: {\n * source: \"default\",\n * },\n * });\n */\nexport function createHasuraMetadataClient(options: ClientOptions, logger?: Logger) {\n ensureServer();\n const validatedOptions = validate(ClientOptionsSchema, options);\n const baseUrl = extractBaseUrlBeforeSegment(options.instance, \"/v1/graphql\");\n const queryEndpoint = new URL(`${baseUrl}/v1/metadata`).toString();\n const fetchInstance = logger ? requestLogger(logger, \"hasura\", fetch) : fetch;\n\n return async <T>(query: object): Promise<{ ok: boolean; data: T }> => {\n const response = await fetchInstance(queryEndpoint, {\n method: \"POST\",\n headers: appendHeaders(\n { \"Content-Type\": \"application/json\" },\n {\n \"x-auth-token\": validatedOptions.accessToken,\n \"x-hasura-admin-secret\": validatedOptions.adminSecret,\n },\n ),\n body: JSON.stringify(query),\n });\n\n if (!response.ok) {\n return { ok: false, data: (await response.json()) as T };\n }\n\n return { ok: true, data: (await response.json()) as T };\n };\n}\n\nexport type { FragmentOf, ResultOf, VariablesOf } from \"gql.tada\";\nexport { readFragment } from \"gql.tada\";\nexport { trackAllTables } from \"./utils/track-all-tables.js\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,eAAsB,eACpB,cACA,QACA,eAGI;CACF,gBAAgB;CAChB,gBAAgB;GAEgD;CAClE,MAAMA,WAAqB;CAE3B,MAAM,EAAE,gBAAgB,mBAAmB;CAG3C,MAAM,kBAAkB,MAAM,OAK5B;EACA,MAAM;EACN,MAAM,EACJ,QAAQ;;AAIZ,KAAI,CAAC,gBAAgB,IAAI;AACvB,QAAM,IAAI,MAAM,yBAAyB,KAAK,UAAU,gBAAgB;;CAG1E,MAAM,SAAS,gBAAgB;AAE/B,KAAI,OAAO,WAAW,GAAG;AACvB,SAAO;GAAE,QAAQ;GAAsB;;;AAGzC,UAAS,KAAK,SAAS,OAAO,OAAO,uBAAuB,aAAa;AAGzE,OAAM,OAA0B;EAC9B,MAAM;EACN,MAAM;GACJ,QAAQ,OAAO,KAAK,WAAW,EACtB;GAET,gBAAgB;;;CAIpB,MAAM,gBAAgB,OAAO,QAAQ,UAAU;AAC7C,MAAI,MAAM,QAAQ,iBAAiB;AACjC,UAAO,eAAe,SAAS,MAAM;;AAEvC,MAAI,MAAM,QAAQ,iBAAiB;AACjC,UAAO,CAAC,eAAe,SAAS,MAAM;;AAExC,SAAO;;CAIT,MAAM,cAAc,MAAM,OAA0B;EAClD,MAAM;EACN,MAAM;GACJ,QAAQ,cAAc,KAAK,WAAW,EAC7B;GAET,gBAAgB;;;AAIpB,KAAI,CAAC,YAAY,IAAI;AACnB,QAAM,IAAI,MAAM,2BAA2B,KAAK,UAAU,YAAY;;AAGxE,UAAS,KAAK,wBAAwB,cAAc,OAAO;AAE3D,QAAO;EAAE,QAAQ;EAAoB;;;;;;;;;AC1FvC,MAAa,sBAAsBC,MAAE,OAAO;CAC1C,UAAUC;CACV,aAAaC,+DAA6B;CAC1C,aAAaF,MAAE;CACf,OAAOA,MAAE,KAAK;EAAC;EAAW;EAAe;EAAY;EAAY;EAAkB;IAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6DhG,SAAgB,mBACd,SACA,eACA,QAIA;AACA;CACA,MAAM,mEAA4B,qBAAqB;CACvD,MAAM;CACN,MAAM,UAAU,IAAI,IAAI,iBAAiB,UAAU;AAEnD,QAAO;EACL,QAAQ,IAAIG,8BAAc,SAAS;GACjC,GAAG;GACH,wDAAuB,eAAe,SAAS;IAC7C,gBAAgB,iBAAiB;IACjC,yBAAyB,iBAAiB;;GAE5C,OAAQ,2DAAuB,QAAQ,UAAU,SAAS;;EAE5D;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BJ,SAAgB,2BAA2B,SAAwB,QAAiB;AAClF;CACA,MAAM,mEAA4B,qBAAqB;CACvD,MAAM,kEAAsC,QAAQ,UAAU;CAC9D,MAAM,gBAAgB,IAAI,IAAI,GAAG,QAAQ,eAAe;CACxD,MAAM,gBAAgB,2DAAuB,QAAQ,UAAU,SAAS;AAExE,QAAO,OAAU,UAAqD;EACpE,MAAM,WAAW,MAAM,cAAc,eAAe;GAClD,QAAQ;GACR,wDACE,EAAE,gBAAgB,sBAClB;IACE,gBAAgB,iBAAiB;IACjC,yBAAyB,iBAAiB;;GAG9C,MAAM,KAAK,UAAU;;AAGvB,MAAI,CAAC,SAAS,IAAI;AAChB,UAAO;IAAE,IAAI;IAAO,MAAO,MAAM,SAAS;;;AAG5C,SAAO;GAAE,IAAI;GAAM,MAAO,MAAM,SAAS"}
1
+ {"version":3,"file":"hasura.cjs","names":["messages: string[]","z","UrlOrPathSchema","ApplicationAccessTokenSchema","GraphQLClient"],"sources":["../src/utils/track-all-tables.ts","../src/hasura.ts"],"sourcesContent":["import type { createHasuraMetadataClient } from \"../hasura.js\";\n\n/**\n * Track all tables in a database\n *\n * @param databaseName - The name of the database to track tables for\n * @param client - The client options to use for the Hasura client\n * @param tableOptions - The options to use for the table tracking\n * @param tableOptions.includeSchemas - The schemas to include in the tracking\n * @param tableOptions.excludeSchemas - The schemas to exclude from the tracking\n * @returns A promise that resolves to an object with a result property indicating success or failure\n * @example\n * import { trackAllTables } from \"@settlemint/sdk-hasura/utils/track-all-tables\";\n *\n * const client = createHasuraMetadataClient({\n * instance: \"http://localhost:8080\",\n * accessToken: \"test\",\n * adminSecret: \"test\",\n * });\n *\n * const result = await trackAllTables(\"default\", client, {\n * excludeSchemas: [\"drizzle\"],\n * });\n * if (result.result === \"success\") {\n * console.log(\"Tables tracked successfully\");\n * } else {\n * console.error(\"Failed to track tables\");\n * }\n */\nexport async function trackAllTables(\n databaseName: string,\n client: ReturnType<typeof createHasuraMetadataClient>,\n tableOptions: {\n includeSchemas?: string[];\n excludeSchemas?: string[];\n } = {\n includeSchemas: undefined,\n excludeSchemas: undefined,\n },\n): Promise<{ result: \"success\" | \"no-tables\"; messages: string[] }> {\n const messages: string[] = [];\n\n const { includeSchemas, excludeSchemas } = tableOptions;\n\n // Get all tables using pg_get_source_tables\n const getTablesResult = await client<\n Array<{\n name: string;\n schema: string;\n }>\n >({\n type: \"pg_get_source_tables\",\n args: {\n source: databaseName,\n },\n });\n\n if (!getTablesResult.ok) {\n throw new Error(`Failed to get tables: ${JSON.stringify(getTablesResult.data)}`);\n }\n\n const tables = getTablesResult.data;\n\n if (tables.length === 0) {\n return { result: \"no-tables\" as const, messages };\n }\n\n messages.push(`Found ${tables.length} tables in database \"${databaseName}\"`);\n\n // Incase a table is already tracked, untrack it first\n await client<{ code?: string }>({\n type: \"pg_untrack_tables\",\n args: {\n tables: tables.map((table) => ({\n table: table,\n })),\n allow_warnings: true,\n },\n });\n\n const tablesToTrack = tables.filter((table) => {\n if (Array.isArray(includeSchemas)) {\n return includeSchemas.includes(table.schema);\n }\n if (Array.isArray(excludeSchemas)) {\n return !excludeSchemas.includes(table.schema);\n }\n return true;\n });\n\n // Track all tables\n const trackResult = await client<{ code?: string }>({\n type: \"pg_track_tables\",\n args: {\n tables: tablesToTrack.map((table) => ({\n table: table,\n })),\n allow_warnings: true,\n },\n });\n\n if (!trackResult.ok) {\n throw new Error(`Failed to track tables: ${JSON.stringify(trackResult.data)}`);\n }\n\n messages.push(`Successfully tracked ${tablesToTrack.length} tables`);\n\n return { result: \"success\" as const, messages };\n}\n","import { extractBaseUrlBeforeSegment } from \"@settlemint/sdk-utils\";\nimport { appendHeaders } from \"@settlemint/sdk-utils/http\";\nimport { type Logger, requestLogger } from \"@settlemint/sdk-utils/logging\";\nimport { ensureServer } from \"@settlemint/sdk-utils/runtime\";\nimport { ApplicationAccessTokenSchema, UrlOrPathSchema, validate } from \"@settlemint/sdk-utils/validation\";\nimport { type AbstractSetupSchema, initGraphQLTada } from \"gql.tada\";\nimport { GraphQLClient } from \"graphql-request\";\nimport { z } from \"zod\";\n\n/**\n * Type definition for GraphQL client configuration options\n */\nexport type RequestConfig = ConstructorParameters<typeof GraphQLClient>[1];\n\n/**\n * Schema for validating client options for the Hasura client.\n */\nexport const ClientOptionsSchema = z.object({\n instance: UrlOrPathSchema,\n accessToken: ApplicationAccessTokenSchema.optional(),\n adminSecret: z.string(),\n cache: z.enum([\"default\", \"force-cache\", \"no-cache\", \"no-store\", \"only-if-cached\", \"reload\"]).optional(),\n});\n\n/**\n * Type definition for client options derived from the ClientOptionsSchema.\n */\nexport type ClientOptions = z.infer<typeof ClientOptionsSchema>;\n\n/**\n * Creates a Hasura GraphQL client with proper type safety using gql.tada\n *\n * @param options - Configuration options for the client\n * @param clientOptions - Optional GraphQL client configuration options\n * @param logger - Optional logger to use for logging the requests\n * @returns An object containing:\n * - client: The configured GraphQL client instance\n * - graphql: The initialized gql.tada function for type-safe queries\n * @throws Will throw an error if the options fail validation against ClientOptionsSchema\n * @example\n * import { createHasuraClient } from '@settlemint/sdk-hasura';\n * import type { introspection } from \"@schemas/hasura-env\";\n * import { createLogger, requestLogger } from \"@settlemint/sdk-utils/logging\";\n *\n * const logger = createLogger();\n *\n * const { client, graphql } = createHasuraClient<{\n * introspection: introspection;\n * disableMasking: true;\n * scalars: {\n * timestamp: string;\n * timestampz: string;\n * uuid: string;\n * date: string;\n * time: string;\n * jsonb: string;\n * numeric: string;\n * interval: string;\n * geometry: string;\n * geography: string;\n * };\n * }>({\n * instance: process.env.SETTLEMINT_HASURA_ENDPOINT,\n * accessToken: process.env.SETTLEMINT_ACCESS_TOKEN,\n * adminSecret: process.env.SETTLEMINT_HASURA_ADMIN_SECRET,\n * }, {\n * fetch: requestLogger(logger, \"hasura\", fetch) as typeof fetch,\n * });\n *\n * // Making GraphQL queries\n * const query = graphql(`\n * query GetUsers {\n * users {\n * id\n * name\n * email\n * }\n * }\n * `);\n *\n * const result = await client.request(query);\n */\nexport function createHasuraClient<const Setup extends AbstractSetupSchema>(\n options: ClientOptions,\n clientOptions?: RequestConfig,\n logger?: Logger,\n): {\n client: GraphQLClient;\n graphql: initGraphQLTada<Setup>;\n} {\n ensureServer();\n const validatedOptions = validate(ClientOptionsSchema, options);\n const graphql = initGraphQLTada<Setup>();\n const fullUrl = new URL(validatedOptions.instance).toString();\n\n return {\n client: new GraphQLClient(fullUrl, {\n ...clientOptions,\n headers: appendHeaders(clientOptions?.headers, {\n \"x-auth-token\": validatedOptions.accessToken,\n \"x-hasura-admin-secret\": validatedOptions.adminSecret,\n }),\n fetch: (logger ? requestLogger(logger, \"hasura\", fetch) : fetch) as typeof fetch,\n }),\n graphql,\n };\n}\n\n/**\n * Creates a Hasura Metadata client\n *\n * @param options - Configuration options for the client\n * @param logger - Optional logger to use for logging the requests\n * @returns A function that can be used to make requests to the Hasura Metadata API\n * @throws Will throw an error if the options fail validation against ClientOptionsSchema\n * @example\n * import { createHasuraMetadataClient } from '@settlemint/sdk-hasura';\n *\n * const client = createHasuraMetadataClient({\n * instance: process.env.SETTLEMINT_HASURA_ENDPOINT,\n * accessToken: process.env.SETTLEMINT_ACCESS_TOKEN,\n * adminSecret: process.env.SETTLEMINT_HASURA_ADMIN_SECRET,\n * });\n *\n * const result = await client({\n * type: \"pg_get_source_tables\",\n * args: {\n * source: \"default\",\n * },\n * });\n */\nexport function createHasuraMetadataClient(options: ClientOptions, logger?: Logger) {\n ensureServer();\n const validatedOptions = validate(ClientOptionsSchema, options);\n const baseUrl = extractBaseUrlBeforeSegment(options.instance, \"/v1/graphql\");\n const queryEndpoint = new URL(`${baseUrl}/v1/metadata`).toString();\n const fetchInstance = logger ? requestLogger(logger, \"hasura\", fetch) : fetch;\n\n return async <T>(query: object): Promise<{ ok: boolean; data: T }> => {\n const response = await fetchInstance(queryEndpoint, {\n method: \"POST\",\n headers: appendHeaders(\n { \"Content-Type\": \"application/json\" },\n {\n \"x-auth-token\": validatedOptions.accessToken,\n \"x-hasura-admin-secret\": validatedOptions.adminSecret,\n },\n ),\n body: JSON.stringify(query),\n });\n\n if (!response.ok) {\n return { ok: false, data: (await response.json()) as T };\n }\n\n return { ok: true, data: (await response.json()) as T };\n };\n}\n\nexport type { FragmentOf, ResultOf, VariablesOf } from \"gql.tada\";\nexport { readFragment } from \"gql.tada\";\nexport { trackAllTables } from \"./utils/track-all-tables.js\";\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"hasura.js","names":["messages: string[]"],"sources":["../src/utils/track-all-tables.ts","../src/hasura.ts"],"sourcesContent":["import type { createHasuraMetadataClient } from \"../hasura.js\";\n\n/**\n * Track all tables in a database\n *\n * @param databaseName - The name of the database to track tables for\n * @param client - The client options to use for the Hasura client\n * @param tableOptions - The options to use for the table tracking\n * @param tableOptions.includeSchemas - The schemas to include in the tracking\n * @param tableOptions.excludeSchemas - The schemas to exclude from the tracking\n * @returns A promise that resolves to an object with a result property indicating success or failure\n * @example\n * import { trackAllTables } from \"@settlemint/sdk-hasura/utils/track-all-tables\";\n *\n * const client = createHasuraMetadataClient({\n * instance: \"http://localhost:8080\",\n * accessToken: \"test\",\n * adminSecret: \"test\",\n * });\n *\n * const result = await trackAllTables(\"default\", client, {\n * excludeSchemas: [\"drizzle\"],\n * });\n * if (result.result === \"success\") {\n * console.log(\"Tables tracked successfully\");\n * } else {\n * console.error(\"Failed to track tables\");\n * }\n */\nexport async function trackAllTables(\n databaseName: string,\n client: ReturnType<typeof createHasuraMetadataClient>,\n tableOptions: {\n includeSchemas?: string[];\n excludeSchemas?: string[];\n } = {\n includeSchemas: undefined,\n excludeSchemas: undefined,\n },\n): Promise<{ result: \"success\" | \"no-tables\"; messages: string[] }> {\n const messages: string[] = [];\n\n const { includeSchemas, excludeSchemas } = tableOptions;\n\n // Get all tables using pg_get_source_tables\n const getTablesResult = await client<\n Array<{\n name: string;\n schema: string;\n }>\n >({\n type: \"pg_get_source_tables\",\n args: {\n source: databaseName,\n },\n });\n\n if (!getTablesResult.ok) {\n throw new Error(`Failed to get tables: ${JSON.stringify(getTablesResult.data)}`);\n }\n\n const tables = getTablesResult.data;\n\n if (tables.length === 0) {\n return { result: \"no-tables\" as const, messages };\n }\n\n messages.push(`Found ${tables.length} tables in database \"${databaseName}\"`);\n\n // Incase a table is already tracked, untrack it first\n await client<{ code?: string }>({\n type: \"pg_untrack_tables\",\n args: {\n tables: tables.map((table) => ({\n table: table,\n })),\n allow_warnings: true,\n },\n });\n\n const tablesToTrack = tables.filter((table) => {\n if (Array.isArray(includeSchemas)) {\n return includeSchemas.includes(table.schema);\n }\n if (Array.isArray(excludeSchemas)) {\n return !excludeSchemas.includes(table.schema);\n }\n return true;\n });\n\n // Track all tables\n const trackResult = await client<{ code?: string }>({\n type: \"pg_track_tables\",\n args: {\n tables: tablesToTrack.map((table) => ({\n table: table,\n })),\n allow_warnings: true,\n },\n });\n\n if (!trackResult.ok) {\n throw new Error(`Failed to track tables: ${JSON.stringify(trackResult.data)}`);\n }\n\n messages.push(`Successfully tracked ${tablesToTrack.length} tables`);\n\n return { result: \"success\" as const, messages };\n}\n","import { extractBaseUrlBeforeSegment } from \"@settlemint/sdk-utils\";\nimport { appendHeaders } from \"@settlemint/sdk-utils/http\";\nimport { type Logger, requestLogger } from \"@settlemint/sdk-utils/logging\";\nimport { ensureServer } from \"@settlemint/sdk-utils/runtime\";\nimport { ApplicationAccessTokenSchema, UrlOrPathSchema, validate } from \"@settlemint/sdk-utils/validation\";\nimport { type AbstractSetupSchema, initGraphQLTada } from \"gql.tada\";\nimport { GraphQLClient } from \"graphql-request\";\nimport { z } from \"zod\";\n\n/**\n * Type definition for GraphQL client configuration options\n */\nexport type RequestConfig = ConstructorParameters<typeof GraphQLClient>[1];\n\n/**\n * Schema for validating client options for the Hasura client.\n */\nexport const ClientOptionsSchema = z.object({\n instance: UrlOrPathSchema,\n accessToken: ApplicationAccessTokenSchema.optional(),\n adminSecret: z.string(),\n cache: z.enum([\"default\", \"force-cache\", \"no-cache\", \"no-store\", \"only-if-cached\", \"reload\"]).optional(),\n});\n\n/**\n * Type definition for client options derived from the ClientOptionsSchema.\n */\nexport type ClientOptions = z.infer<typeof ClientOptionsSchema>;\n\n/**\n * Creates a Hasura GraphQL client with proper type safety using gql.tada\n *\n * @param options - Configuration options for the client\n * @param clientOptions - Optional GraphQL client configuration options\n * @param logger - Optional logger to use for logging the requests\n * @returns An object containing:\n * - client: The configured GraphQL client instance\n * - graphql: The initialized gql.tada function for type-safe queries\n * @throws Will throw an error if the options fail validation against ClientOptionsSchema\n * @example\n * import { createHasuraClient } from '@settlemint/sdk-hasura';\n * import type { introspection } from \"@schemas/hasura-env\";\n * import { createLogger, requestLogger } from \"@settlemint/sdk-utils/logging\";\n *\n * const logger = createLogger();\n *\n * const { client, graphql } = createHasuraClient<{\n * introspection: introspection;\n * disableMasking: true;\n * scalars: {\n * timestamp: string;\n * timestampz: string;\n * uuid: string;\n * date: string;\n * time: string;\n * jsonb: string;\n * numeric: string;\n * interval: string;\n * geometry: string;\n * geography: string;\n * };\n * }>({\n * instance: process.env.SETTLEMINT_HASURA_ENDPOINT,\n * accessToken: process.env.SETTLEMINT_ACCESS_TOKEN,\n * adminSecret: process.env.SETTLEMINT_HASURA_ADMIN_SECRET,\n * }, {\n * fetch: requestLogger(logger, \"hasura\", fetch) as typeof fetch,\n * });\n *\n * // Making GraphQL queries\n * const query = graphql(`\n * query GetUsers {\n * users {\n * id\n * name\n * email\n * }\n * }\n * `);\n *\n * const result = await client.request(query);\n */\nexport function createHasuraClient<const Setup extends AbstractSetupSchema>(\n options: ClientOptions,\n clientOptions?: RequestConfig,\n logger?: Logger,\n): {\n client: GraphQLClient;\n graphql: initGraphQLTada<Setup>;\n} {\n ensureServer();\n const validatedOptions = validate(ClientOptionsSchema, options);\n const graphql = initGraphQLTada<Setup>();\n const fullUrl = new URL(validatedOptions.instance).toString();\n\n return {\n client: new GraphQLClient(fullUrl, {\n ...clientOptions,\n headers: appendHeaders(clientOptions?.headers, {\n \"x-auth-token\": validatedOptions.accessToken,\n \"x-hasura-admin-secret\": validatedOptions.adminSecret,\n }),\n fetch: (logger ? requestLogger(logger, \"hasura\", fetch) : fetch) as typeof fetch,\n }),\n graphql,\n };\n}\n\n/**\n * Creates a Hasura Metadata client\n *\n * @param options - Configuration options for the client\n * @param logger - Optional logger to use for logging the requests\n * @returns A function that can be used to make requests to the Hasura Metadata API\n * @throws Will throw an error if the options fail validation against ClientOptionsSchema\n * @example\n * import { createHasuraMetadataClient } from '@settlemint/sdk-hasura';\n *\n * const client = createHasuraMetadataClient({\n * instance: process.env.SETTLEMINT_HASURA_ENDPOINT,\n * accessToken: process.env.SETTLEMINT_ACCESS_TOKEN,\n * adminSecret: process.env.SETTLEMINT_HASURA_ADMIN_SECRET,\n * });\n *\n * const result = await client({\n * type: \"pg_get_source_tables\",\n * args: {\n * source: \"default\",\n * },\n * });\n */\nexport function createHasuraMetadataClient(options: ClientOptions, logger?: Logger) {\n ensureServer();\n const validatedOptions = validate(ClientOptionsSchema, options);\n const baseUrl = extractBaseUrlBeforeSegment(options.instance, \"/v1/graphql\");\n const queryEndpoint = new URL(`${baseUrl}/v1/metadata`).toString();\n const fetchInstance = logger ? requestLogger(logger, \"hasura\", fetch) : fetch;\n\n return async <T>(query: object): Promise<{ ok: boolean; data: T }> => {\n const response = await fetchInstance(queryEndpoint, {\n method: \"POST\",\n headers: appendHeaders(\n { \"Content-Type\": \"application/json\" },\n {\n \"x-auth-token\": validatedOptions.accessToken,\n \"x-hasura-admin-secret\": validatedOptions.adminSecret,\n },\n ),\n body: JSON.stringify(query),\n });\n\n if (!response.ok) {\n return { ok: false, data: (await response.json()) as T };\n }\n\n return { ok: true, data: (await response.json()) as T };\n };\n}\n\nexport type { FragmentOf, ResultOf, VariablesOf } from \"gql.tada\";\nexport { readFragment } from \"gql.tada\";\nexport { trackAllTables } from \"./utils/track-all-tables.js\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,eAAsB,eACpB,cACA,QACA,eAGI;CACF,gBAAgB;CAChB,gBAAgB;GAEgD;CAClE,MAAMA,WAAqB;CAE3B,MAAM,EAAE,gBAAgB,mBAAmB;CAG3C,MAAM,kBAAkB,MAAM,OAK5B;EACA,MAAM;EACN,MAAM,EACJ,QAAQ;;AAIZ,KAAI,CAAC,gBAAgB,IAAI;AACvB,QAAM,IAAI,MAAM,yBAAyB,KAAK,UAAU,gBAAgB;;CAG1E,MAAM,SAAS,gBAAgB;AAE/B,KAAI,OAAO,WAAW,GAAG;AACvB,SAAO;GAAE,QAAQ;GAAsB;;;AAGzC,UAAS,KAAK,SAAS,OAAO,OAAO,uBAAuB,aAAa;AAGzE,OAAM,OAA0B;EAC9B,MAAM;EACN,MAAM;GACJ,QAAQ,OAAO,KAAK,WAAW,EACtB;GAET,gBAAgB;;;CAIpB,MAAM,gBAAgB,OAAO,QAAQ,UAAU;AAC7C,MAAI,MAAM,QAAQ,iBAAiB;AACjC,UAAO,eAAe,SAAS,MAAM;;AAEvC,MAAI,MAAM,QAAQ,iBAAiB;AACjC,UAAO,CAAC,eAAe,SAAS,MAAM;;AAExC,SAAO;;CAIT,MAAM,cAAc,MAAM,OAA0B;EAClD,MAAM;EACN,MAAM;GACJ,QAAQ,cAAc,KAAK,WAAW,EAC7B;GAET,gBAAgB;;;AAIpB,KAAI,CAAC,YAAY,IAAI;AACnB,QAAM,IAAI,MAAM,2BAA2B,KAAK,UAAU,YAAY;;AAGxE,UAAS,KAAK,wBAAwB,cAAc,OAAO;AAE3D,QAAO;EAAE,QAAQ;EAAoB;;;;;;;;;AC1FvC,MAAa,sBAAsB,EAAE,OAAO;CAC1C,UAAU;CACV,aAAa,6BAA6B;CAC1C,aAAa,EAAE;CACf,OAAO,EAAE,KAAK;EAAC;EAAW;EAAe;EAAY;EAAY;EAAkB;IAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6DhG,SAAgB,mBACd,SACA,eACA,QAIA;AACA;CACA,MAAM,mBAAmB,SAAS,qBAAqB;CACvD,MAAM,UAAU;CAChB,MAAM,UAAU,IAAI,IAAI,iBAAiB,UAAU;AAEnD,QAAO;EACL,QAAQ,IAAI,cAAc,SAAS;GACjC,GAAG;GACH,SAAS,cAAc,eAAe,SAAS;IAC7C,gBAAgB,iBAAiB;IACjC,yBAAyB,iBAAiB;;GAE5C,OAAQ,SAAS,cAAc,QAAQ,UAAU,SAAS;;EAE5D;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BJ,SAAgB,2BAA2B,SAAwB,QAAiB;AAClF;CACA,MAAM,mBAAmB,SAAS,qBAAqB;CACvD,MAAM,UAAU,4BAA4B,QAAQ,UAAU;CAC9D,MAAM,gBAAgB,IAAI,IAAI,GAAG,QAAQ,eAAe;CACxD,MAAM,gBAAgB,SAAS,cAAc,QAAQ,UAAU,SAAS;AAExE,QAAO,OAAU,UAAqD;EACpE,MAAM,WAAW,MAAM,cAAc,eAAe;GAClD,QAAQ;GACR,SAAS,cACP,EAAE,gBAAgB,sBAClB;IACE,gBAAgB,iBAAiB;IACjC,yBAAyB,iBAAiB;;GAG9C,MAAM,KAAK,UAAU;;AAGvB,MAAI,CAAC,SAAS,IAAI;AAChB,UAAO;IAAE,IAAI;IAAO,MAAO,MAAM,SAAS;;;AAG5C,SAAO;GAAE,IAAI;GAAM,MAAO,MAAM,SAAS"}
1
+ {"version":3,"file":"hasura.js","names":["messages: string[]"],"sources":["../src/utils/track-all-tables.ts","../src/hasura.ts"],"sourcesContent":["import type { createHasuraMetadataClient } from \"../hasura.js\";\n\n/**\n * Track all tables in a database\n *\n * @param databaseName - The name of the database to track tables for\n * @param client - The client options to use for the Hasura client\n * @param tableOptions - The options to use for the table tracking\n * @param tableOptions.includeSchemas - The schemas to include in the tracking\n * @param tableOptions.excludeSchemas - The schemas to exclude from the tracking\n * @returns A promise that resolves to an object with a result property indicating success or failure\n * @example\n * import { trackAllTables } from \"@settlemint/sdk-hasura/utils/track-all-tables\";\n *\n * const client = createHasuraMetadataClient({\n * instance: \"http://localhost:8080\",\n * accessToken: \"test\",\n * adminSecret: \"test\",\n * });\n *\n * const result = await trackAllTables(\"default\", client, {\n * excludeSchemas: [\"drizzle\"],\n * });\n * if (result.result === \"success\") {\n * console.log(\"Tables tracked successfully\");\n * } else {\n * console.error(\"Failed to track tables\");\n * }\n */\nexport async function trackAllTables(\n databaseName: string,\n client: ReturnType<typeof createHasuraMetadataClient>,\n tableOptions: {\n includeSchemas?: string[];\n excludeSchemas?: string[];\n } = {\n includeSchemas: undefined,\n excludeSchemas: undefined,\n },\n): Promise<{ result: \"success\" | \"no-tables\"; messages: string[] }> {\n const messages: string[] = [];\n\n const { includeSchemas, excludeSchemas } = tableOptions;\n\n // Get all tables using pg_get_source_tables\n const getTablesResult = await client<\n Array<{\n name: string;\n schema: string;\n }>\n >({\n type: \"pg_get_source_tables\",\n args: {\n source: databaseName,\n },\n });\n\n if (!getTablesResult.ok) {\n throw new Error(`Failed to get tables: ${JSON.stringify(getTablesResult.data)}`);\n }\n\n const tables = getTablesResult.data;\n\n if (tables.length === 0) {\n return { result: \"no-tables\" as const, messages };\n }\n\n messages.push(`Found ${tables.length} tables in database \"${databaseName}\"`);\n\n // Incase a table is already tracked, untrack it first\n await client<{ code?: string }>({\n type: \"pg_untrack_tables\",\n args: {\n tables: tables.map((table) => ({\n table: table,\n })),\n allow_warnings: true,\n },\n });\n\n const tablesToTrack = tables.filter((table) => {\n if (Array.isArray(includeSchemas)) {\n return includeSchemas.includes(table.schema);\n }\n if (Array.isArray(excludeSchemas)) {\n return !excludeSchemas.includes(table.schema);\n }\n return true;\n });\n\n // Track all tables\n const trackResult = await client<{ code?: string }>({\n type: \"pg_track_tables\",\n args: {\n tables: tablesToTrack.map((table) => ({\n table: table,\n })),\n allow_warnings: true,\n },\n });\n\n if (!trackResult.ok) {\n throw new Error(`Failed to track tables: ${JSON.stringify(trackResult.data)}`);\n }\n\n messages.push(`Successfully tracked ${tablesToTrack.length} tables`);\n\n return { result: \"success\" as const, messages };\n}\n","import { extractBaseUrlBeforeSegment } from \"@settlemint/sdk-utils\";\nimport { appendHeaders } from \"@settlemint/sdk-utils/http\";\nimport { type Logger, requestLogger } from \"@settlemint/sdk-utils/logging\";\nimport { ensureServer } from \"@settlemint/sdk-utils/runtime\";\nimport { ApplicationAccessTokenSchema, UrlOrPathSchema, validate } from \"@settlemint/sdk-utils/validation\";\nimport { type AbstractSetupSchema, initGraphQLTada } from \"gql.tada\";\nimport { GraphQLClient } from \"graphql-request\";\nimport { z } from \"zod\";\n\n/**\n * Type definition for GraphQL client configuration options\n */\nexport type RequestConfig = ConstructorParameters<typeof GraphQLClient>[1];\n\n/**\n * Schema for validating client options for the Hasura client.\n */\nexport const ClientOptionsSchema = z.object({\n instance: UrlOrPathSchema,\n accessToken: ApplicationAccessTokenSchema.optional(),\n adminSecret: z.string(),\n cache: z.enum([\"default\", \"force-cache\", \"no-cache\", \"no-store\", \"only-if-cached\", \"reload\"]).optional(),\n});\n\n/**\n * Type definition for client options derived from the ClientOptionsSchema.\n */\nexport type ClientOptions = z.infer<typeof ClientOptionsSchema>;\n\n/**\n * Creates a Hasura GraphQL client with proper type safety using gql.tada\n *\n * @param options - Configuration options for the client\n * @param clientOptions - Optional GraphQL client configuration options\n * @param logger - Optional logger to use for logging the requests\n * @returns An object containing:\n * - client: The configured GraphQL client instance\n * - graphql: The initialized gql.tada function for type-safe queries\n * @throws Will throw an error if the options fail validation against ClientOptionsSchema\n * @example\n * import { createHasuraClient } from '@settlemint/sdk-hasura';\n * import type { introspection } from \"@schemas/hasura-env\";\n * import { createLogger, requestLogger } from \"@settlemint/sdk-utils/logging\";\n *\n * const logger = createLogger();\n *\n * const { client, graphql } = createHasuraClient<{\n * introspection: introspection;\n * disableMasking: true;\n * scalars: {\n * timestamp: string;\n * timestampz: string;\n * uuid: string;\n * date: string;\n * time: string;\n * jsonb: string;\n * numeric: string;\n * interval: string;\n * geometry: string;\n * geography: string;\n * };\n * }>({\n * instance: process.env.SETTLEMINT_HASURA_ENDPOINT,\n * accessToken: process.env.SETTLEMINT_ACCESS_TOKEN,\n * adminSecret: process.env.SETTLEMINT_HASURA_ADMIN_SECRET,\n * }, {\n * fetch: requestLogger(logger, \"hasura\", fetch) as typeof fetch,\n * });\n *\n * // Making GraphQL queries\n * const query = graphql(`\n * query GetUsers {\n * users {\n * id\n * name\n * email\n * }\n * }\n * `);\n *\n * const result = await client.request(query);\n */\nexport function createHasuraClient<const Setup extends AbstractSetupSchema>(\n options: ClientOptions,\n clientOptions?: RequestConfig,\n logger?: Logger,\n): {\n client: GraphQLClient;\n graphql: initGraphQLTada<Setup>;\n} {\n ensureServer();\n const validatedOptions = validate(ClientOptionsSchema, options);\n const graphql = initGraphQLTada<Setup>();\n const fullUrl = new URL(validatedOptions.instance).toString();\n\n return {\n client: new GraphQLClient(fullUrl, {\n ...clientOptions,\n headers: appendHeaders(clientOptions?.headers, {\n \"x-auth-token\": validatedOptions.accessToken,\n \"x-hasura-admin-secret\": validatedOptions.adminSecret,\n }),\n fetch: (logger ? requestLogger(logger, \"hasura\", fetch) : fetch) as typeof fetch,\n }),\n graphql,\n };\n}\n\n/**\n * Creates a Hasura Metadata client\n *\n * @param options - Configuration options for the client\n * @param logger - Optional logger to use for logging the requests\n * @returns A function that can be used to make requests to the Hasura Metadata API\n * @throws Will throw an error if the options fail validation against ClientOptionsSchema\n * @example\n * import { createHasuraMetadataClient } from '@settlemint/sdk-hasura';\n *\n * const client = createHasuraMetadataClient({\n * instance: process.env.SETTLEMINT_HASURA_ENDPOINT,\n * accessToken: process.env.SETTLEMINT_ACCESS_TOKEN,\n * adminSecret: process.env.SETTLEMINT_HASURA_ADMIN_SECRET,\n * });\n *\n * const result = await client({\n * type: \"pg_get_source_tables\",\n * args: {\n * source: \"default\",\n * },\n * });\n */\nexport function createHasuraMetadataClient(options: ClientOptions, logger?: Logger) {\n ensureServer();\n const validatedOptions = validate(ClientOptionsSchema, options);\n const baseUrl = extractBaseUrlBeforeSegment(options.instance, \"/v1/graphql\");\n const queryEndpoint = new URL(`${baseUrl}/v1/metadata`).toString();\n const fetchInstance = logger ? requestLogger(logger, \"hasura\", fetch) : fetch;\n\n return async <T>(query: object): Promise<{ ok: boolean; data: T }> => {\n const response = await fetchInstance(queryEndpoint, {\n method: \"POST\",\n headers: appendHeaders(\n { \"Content-Type\": \"application/json\" },\n {\n \"x-auth-token\": validatedOptions.accessToken,\n \"x-hasura-admin-secret\": validatedOptions.adminSecret,\n },\n ),\n body: JSON.stringify(query),\n });\n\n if (!response.ok) {\n return { ok: false, data: (await response.json()) as T };\n }\n\n return { ok: true, data: (await response.json()) as T };\n };\n}\n\nexport type { FragmentOf, ResultOf, VariablesOf } from \"gql.tada\";\nexport { readFragment } from \"gql.tada\";\nexport { trackAllTables } from \"./utils/track-all-tables.js\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,eAAsB,eACpB,cACA,QACA,eAGI;CACF,gBAAgB;CAChB,gBAAgB;CACjB,EACiE;CAClE,MAAMA,WAAqB,EAAE;CAE7B,MAAM,EAAE,gBAAgB,mBAAmB;CAG3C,MAAM,kBAAkB,MAAM,OAK5B;EACA,MAAM;EACN,MAAM,EACJ,QAAQ,cACT;EACF,CAAC;AAEF,KAAI,CAAC,gBAAgB,IAAI;AACvB,QAAM,IAAI,MAAM,yBAAyB,KAAK,UAAU,gBAAgB,KAAK,GAAG;;CAGlF,MAAM,SAAS,gBAAgB;AAE/B,KAAI,OAAO,WAAW,GAAG;AACvB,SAAO;GAAE,QAAQ;GAAsB;GAAU;;AAGnD,UAAS,KAAK,SAAS,OAAO,OAAO,uBAAuB,aAAa,GAAG;AAG5E,OAAM,OAA0B;EAC9B,MAAM;EACN,MAAM;GACJ,QAAQ,OAAO,KAAK,WAAW,EACtB,OACR,EAAE;GACH,gBAAgB;GACjB;EACF,CAAC;CAEF,MAAM,gBAAgB,OAAO,QAAQ,UAAU;AAC7C,MAAI,MAAM,QAAQ,eAAe,EAAE;AACjC,UAAO,eAAe,SAAS,MAAM,OAAO;;AAE9C,MAAI,MAAM,QAAQ,eAAe,EAAE;AACjC,UAAO,CAAC,eAAe,SAAS,MAAM,OAAO;;AAE/C,SAAO;GACP;CAGF,MAAM,cAAc,MAAM,OAA0B;EAClD,MAAM;EACN,MAAM;GACJ,QAAQ,cAAc,KAAK,WAAW,EAC7B,OACR,EAAE;GACH,gBAAgB;GACjB;EACF,CAAC;AAEF,KAAI,CAAC,YAAY,IAAI;AACnB,QAAM,IAAI,MAAM,2BAA2B,KAAK,UAAU,YAAY,KAAK,GAAG;;AAGhF,UAAS,KAAK,wBAAwB,cAAc,OAAO,SAAS;AAEpE,QAAO;EAAE,QAAQ;EAAoB;EAAU;;;;;;;;AC1FjD,MAAa,sBAAsB,EAAE,OAAO;CAC1C,UAAU;CACV,aAAa,6BAA6B,UAAU;CACpD,aAAa,EAAE,QAAQ;CACvB,OAAO,EAAE,KAAK;EAAC;EAAW;EAAe;EAAY;EAAY;EAAkB;EAAS,CAAC,CAAC,UAAU;CACzG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4DF,SAAgB,mBACd,SACA,eACA,QAIA;AACA,eAAc;CACd,MAAM,mBAAmB,SAAS,qBAAqB,QAAQ;CAC/D,MAAM,UAAU,iBAAwB;CACxC,MAAM,UAAU,IAAI,IAAI,iBAAiB,SAAS,CAAC,UAAU;AAE7D,QAAO;EACL,QAAQ,IAAI,cAAc,SAAS;GACjC,GAAG;GACH,SAAS,cAAc,eAAe,SAAS;IAC7C,gBAAgB,iBAAiB;IACjC,yBAAyB,iBAAiB;IAC3C,CAAC;GACF,OAAQ,SAAS,cAAc,QAAQ,UAAU,MAAM,GAAG;GAC3D,CAAC;EACF;EACD;;;;;;;;;;;;;;;;;;;;;;;;;AA0BH,SAAgB,2BAA2B,SAAwB,QAAiB;AAClF,eAAc;CACd,MAAM,mBAAmB,SAAS,qBAAqB,QAAQ;CAC/D,MAAM,UAAU,4BAA4B,QAAQ,UAAU,cAAc;CAC5E,MAAM,gBAAgB,IAAI,IAAI,GAAG,QAAQ,cAAc,CAAC,UAAU;CAClE,MAAM,gBAAgB,SAAS,cAAc,QAAQ,UAAU,MAAM,GAAG;AAExE,QAAO,OAAU,UAAqD;EACpE,MAAM,WAAW,MAAM,cAAc,eAAe;GAClD,QAAQ;GACR,SAAS,cACP,EAAE,gBAAgB,oBAAoB,EACtC;IACE,gBAAgB,iBAAiB;IACjC,yBAAyB,iBAAiB;IAC3C,CACF;GACD,MAAM,KAAK,UAAU,MAAM;GAC5B,CAAC;AAEF,MAAI,CAAC,SAAS,IAAI;AAChB,UAAO;IAAE,IAAI;IAAO,MAAO,MAAM,SAAS,MAAM;IAAQ;;AAG1D,SAAO;GAAE,IAAI;GAAM,MAAO,MAAM,SAAS,MAAM;GAAQ"}
package/dist/postgres.cjs CHANGED
@@ -22,8 +22,10 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
22
22
  }) : target, mod));
23
23
 
24
24
  //#endregion
25
- const __settlemint_sdk_utils_runtime = __toESM(require("@settlemint/sdk-utils/runtime"));
26
- const pg = __toESM(require("pg"));
25
+ let __settlemint_sdk_utils_runtime = require("@settlemint/sdk-utils/runtime");
26
+ __settlemint_sdk_utils_runtime = __toESM(__settlemint_sdk_utils_runtime);
27
+ let pg = require("pg");
28
+ pg = __toESM(pg);
27
29
 
28
30
  //#region src/postgres.ts
29
31
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"postgres.cjs","names":["runsOnServer"],"sources":["../src/postgres.ts"],"sourcesContent":["import { runsOnServer } from \"@settlemint/sdk-utils/runtime\";\nimport pg from \"pg\";\n\n/**\n * Type definition extending the pg.Pool interface to include custom permanent-failure event\n */\ndeclare module \"pg\" {\n interface Pool {\n on(event: \"permanent-failure\", listener: (err: Error) => void): this;\n emit(event: \"permanent-failure\", err: Error): boolean;\n }\n}\n\n/**\n * Utility function to pause execution for a specified duration\n *\n * @param ms - The number of milliseconds to sleep\n * @returns A promise that resolves after the specified duration\n */\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\n/**\n * Configures error handling and recovery mechanisms for a PostgreSQL connection pool\n *\n * @param pool - The PostgreSQL connection pool to configure\n */\nfunction setupErrorHandling(pool: pg.Pool) {\n let retryCount = 0;\n let isRetrying = false;\n const clientErrorHandlers = new WeakSet<pg.PoolClient>();\n\n const handlePoolError = async (err: Error) => {\n console.error(\"[Drizzle] Pool error occurred:\", err);\n\n // Prevent concurrent retry attempts\n if (isRetrying) {\n console.log(\"[Drizzle] Recovery already in progress, skipping\");\n return;\n }\n\n if (retryCount < 3) {\n isRetrying = true;\n retryCount++;\n console.log(`[Drizzle] Attempting to recover - retry ${retryCount}/3`);\n\n try {\n const client = await pool.connect();\n try {\n // Test the connection with timeout\n await Promise.race([\n client.query(\"SELECT 1\"),\n new Promise((_, reject) => setTimeout(() => reject(new Error(\"Query timeout\")), 5000)),\n ]);\n console.log(\"[Drizzle] Successfully recovered connection\");\n retryCount = 0;\n } finally {\n client.release();\n }\n } catch (retryError) {\n console.error(`[Drizzle] Recovery attempt ${retryCount} failed:`, retryError);\n await sleep(5000 * 2 ** (retryCount - 1));\n } finally {\n isRetrying = false;\n }\n } else {\n console.error(\"[Drizzle] Max retries exceeded - pool is in an error state\");\n pool.emit(\"permanent-failure\", err);\n }\n };\n\n const handleConnect = (client: pg.PoolClient) => {\n // Only add error handler if not already added (prevent memory leaks)\n if (!clientErrorHandlers.has(client)) {\n clientErrorHandlers.add(client);\n client.on(\"error\", (err: Error) => {\n console.error(\"[Drizzle] Database client error:\", err);\n });\n }\n retryCount = 0;\n isRetrying = false;\n };\n\n pool.on(\"error\", handlePoolError);\n pool.on(\"connect\", handleConnect);\n}\n\n/**\n * Creates a PostgreSQL connection pool with error handling and retry mechanisms\n *\n * @param databaseUrl - The PostgreSQL connection URL\n * @returns A configured PostgreSQL connection pool\n * @throws Will throw an error if called from browser runtime\n * @example\n * import { createPostgresPool } from '@settlemint/sdk-hasura';\n *\n * const pool = createPostgresPool(process.env.SETTLEMINT_HASURA_DATABASE_URL);\n *\n * // The pool will automatically handle connection errors and retries\n * const client = await pool.connect();\n * try {\n * const result = await client.query('SELECT NOW()');\n * console.log(result.rows[0]);\n * } finally {\n * client.release();\n * }\n */\nexport function createPostgresPool(databaseUrl: string) {\n if (!databaseUrl?.trim()) {\n throw new Error(\"Database URL is required\");\n }\n\n if (!runsOnServer) {\n throw new Error(\"Drizzle client can only be created on the server side\");\n }\n\n const pool = new pg.Pool({\n connectionString: databaseUrl,\n max: 10,\n idleTimeoutMillis: 30000,\n connectionTimeoutMillis: 5000,\n maxLifetimeSeconds: 0,\n });\n\n setupErrorHandling(pool);\n\n return pool;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,MAAM,SAAS,OAAe,IAAI,SAAS,YAAY,WAAW,SAAS;;;;;;AAO3E,SAAS,mBAAmB,MAAe;CACzC,IAAI,aAAa;CACjB,IAAI,aAAa;CACjB,MAAM,sBAAsB,IAAI;CAEhC,MAAM,kBAAkB,OAAO,QAAe;AAC5C,UAAQ,MAAM,kCAAkC;AAGhD,MAAI,YAAY;AACd,WAAQ,IAAI;AACZ;;AAGF,MAAI,aAAa,GAAG;AAClB,gBAAa;AACb;AACA,WAAQ,IAAI,2CAA2C,WAAW;AAElE,OAAI;IACF,MAAM,SAAS,MAAM,KAAK;AAC1B,QAAI;AAEF,WAAM,QAAQ,KAAK,CACjB,OAAO,MAAM,aACb,IAAI,SAAS,GAAG,WAAW,iBAAiB,OAAO,IAAI,MAAM,mBAAmB;AAElF,aAAQ,IAAI;AACZ,kBAAa;cACL;AACR,YAAO;;YAEF,YAAY;AACnB,YAAQ,MAAM,8BAA8B,WAAW,WAAW;AAClE,UAAM,MAAM,MAAO,MAAM,aAAa;aAC9B;AACR,iBAAa;;SAEV;AACL,WAAQ,MAAM;AACd,QAAK,KAAK,qBAAqB;;;CAInC,MAAM,iBAAiB,WAA0B;AAE/C,MAAI,CAAC,oBAAoB,IAAI,SAAS;AACpC,uBAAoB,IAAI;AACxB,UAAO,GAAG,UAAU,QAAe;AACjC,YAAQ,MAAM,oCAAoC;;;AAGtD,eAAa;AACb,eAAa;;AAGf,MAAK,GAAG,SAAS;AACjB,MAAK,GAAG,WAAW;;;;;;;;;;;;;;;;;;;;;;AAuBrB,SAAgB,mBAAmB,aAAqB;AACtD,KAAI,CAAC,aAAa,QAAQ;AACxB,QAAM,IAAI,MAAM;;AAGlB,KAAI,CAACA,6CAAc;AACjB,QAAM,IAAI,MAAM;;CAGlB,MAAM,OAAO,IAAI,WAAG,KAAK;EACvB,kBAAkB;EAClB,KAAK;EACL,mBAAmB;EACnB,yBAAyB;EACzB,oBAAoB;;AAGtB,oBAAmB;AAEnB,QAAO"}
1
+ {"version":3,"file":"postgres.cjs","names":["runsOnServer"],"sources":["../src/postgres.ts"],"sourcesContent":["import { runsOnServer } from \"@settlemint/sdk-utils/runtime\";\nimport pg from \"pg\";\n\n/**\n * Type definition extending the pg.Pool interface to include custom permanent-failure event\n */\ndeclare module \"pg\" {\n interface Pool {\n on(event: \"permanent-failure\", listener: (err: Error) => void): this;\n emit(event: \"permanent-failure\", err: Error): boolean;\n }\n}\n\n/**\n * Utility function to pause execution for a specified duration\n *\n * @param ms - The number of milliseconds to sleep\n * @returns A promise that resolves after the specified duration\n */\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\n/**\n * Configures error handling and recovery mechanisms for a PostgreSQL connection pool\n *\n * @param pool - The PostgreSQL connection pool to configure\n */\nfunction setupErrorHandling(pool: pg.Pool) {\n let retryCount = 0;\n let isRetrying = false;\n const clientErrorHandlers = new WeakSet<pg.PoolClient>();\n\n const handlePoolError = async (err: Error) => {\n console.error(\"[Drizzle] Pool error occurred:\", err);\n\n // Prevent concurrent retry attempts\n if (isRetrying) {\n console.log(\"[Drizzle] Recovery already in progress, skipping\");\n return;\n }\n\n if (retryCount < 3) {\n isRetrying = true;\n retryCount++;\n console.log(`[Drizzle] Attempting to recover - retry ${retryCount}/3`);\n\n try {\n const client = await pool.connect();\n try {\n // Test the connection with timeout\n await Promise.race([\n client.query(\"SELECT 1\"),\n new Promise((_, reject) => setTimeout(() => reject(new Error(\"Query timeout\")), 5000)),\n ]);\n console.log(\"[Drizzle] Successfully recovered connection\");\n retryCount = 0;\n } finally {\n client.release();\n }\n } catch (retryError) {\n console.error(`[Drizzle] Recovery attempt ${retryCount} failed:`, retryError);\n await sleep(5000 * 2 ** (retryCount - 1));\n } finally {\n isRetrying = false;\n }\n } else {\n console.error(\"[Drizzle] Max retries exceeded - pool is in an error state\");\n pool.emit(\"permanent-failure\", err);\n }\n };\n\n const handleConnect = (client: pg.PoolClient) => {\n // Only add error handler if not already added (prevent memory leaks)\n if (!clientErrorHandlers.has(client)) {\n clientErrorHandlers.add(client);\n client.on(\"error\", (err: Error) => {\n console.error(\"[Drizzle] Database client error:\", err);\n });\n }\n retryCount = 0;\n isRetrying = false;\n };\n\n pool.on(\"error\", handlePoolError);\n pool.on(\"connect\", handleConnect);\n}\n\n/**\n * Creates a PostgreSQL connection pool with error handling and retry mechanisms\n *\n * @param databaseUrl - The PostgreSQL connection URL\n * @returns A configured PostgreSQL connection pool\n * @throws Will throw an error if called from browser runtime\n * @example\n * import { createPostgresPool } from '@settlemint/sdk-hasura';\n *\n * const pool = createPostgresPool(process.env.SETTLEMINT_HASURA_DATABASE_URL);\n *\n * // The pool will automatically handle connection errors and retries\n * const client = await pool.connect();\n * try {\n * const result = await client.query('SELECT NOW()');\n * console.log(result.rows[0]);\n * } finally {\n * client.release();\n * }\n */\nexport function createPostgresPool(databaseUrl: string) {\n if (!databaseUrl?.trim()) {\n throw new Error(\"Database URL is required\");\n }\n\n if (!runsOnServer) {\n throw new Error(\"Drizzle client can only be created on the server side\");\n }\n\n const pool = new pg.Pool({\n connectionString: databaseUrl,\n max: 10,\n idleTimeoutMillis: 30000,\n connectionTimeoutMillis: 5000,\n maxLifetimeSeconds: 0,\n });\n\n setupErrorHandling(pool);\n\n return pool;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,MAAM,SAAS,OAAe,IAAI,SAAS,YAAY,WAAW,SAAS,GAAG,CAAC;;;;;;AAO/E,SAAS,mBAAmB,MAAe;CACzC,IAAI,aAAa;CACjB,IAAI,aAAa;CACjB,MAAM,sBAAsB,IAAI,SAAwB;CAExD,MAAM,kBAAkB,OAAO,QAAe;AAC5C,UAAQ,MAAM,kCAAkC,IAAI;AAGpD,MAAI,YAAY;AACd,WAAQ,IAAI,mDAAmD;AAC/D;;AAGF,MAAI,aAAa,GAAG;AAClB,gBAAa;AACb;AACA,WAAQ,IAAI,2CAA2C,WAAW,IAAI;AAEtE,OAAI;IACF,MAAM,SAAS,MAAM,KAAK,SAAS;AACnC,QAAI;AAEF,WAAM,QAAQ,KAAK,CACjB,OAAO,MAAM,WAAW,EACxB,IAAI,SAAS,GAAG,WAAW,iBAAiB,OAAO,IAAI,MAAM,gBAAgB,CAAC,EAAE,IAAK,CAAC,CACvF,CAAC;AACF,aAAQ,IAAI,8CAA8C;AAC1D,kBAAa;cACL;AACR,YAAO,SAAS;;YAEX,YAAY;AACnB,YAAQ,MAAM,8BAA8B,WAAW,WAAW,WAAW;AAC7E,UAAM,MAAM,MAAO,MAAM,aAAa,GAAG;aACjC;AACR,iBAAa;;SAEV;AACL,WAAQ,MAAM,6DAA6D;AAC3E,QAAK,KAAK,qBAAqB,IAAI;;;CAIvC,MAAM,iBAAiB,WAA0B;AAE/C,MAAI,CAAC,oBAAoB,IAAI,OAAO,EAAE;AACpC,uBAAoB,IAAI,OAAO;AAC/B,UAAO,GAAG,UAAU,QAAe;AACjC,YAAQ,MAAM,oCAAoC,IAAI;KACtD;;AAEJ,eAAa;AACb,eAAa;;AAGf,MAAK,GAAG,SAAS,gBAAgB;AACjC,MAAK,GAAG,WAAW,cAAc;;;;;;;;;;;;;;;;;;;;;;AAuBnC,SAAgB,mBAAmB,aAAqB;AACtD,KAAI,CAAC,aAAa,MAAM,EAAE;AACxB,QAAM,IAAI,MAAM,2BAA2B;;AAG7C,KAAI,CAACA,6CAAc;AACjB,QAAM,IAAI,MAAM,wDAAwD;;CAG1E,MAAM,OAAO,IAAI,WAAG,KAAK;EACvB,kBAAkB;EAClB,KAAK;EACL,mBAAmB;EACnB,yBAAyB;EACzB,oBAAoB;EACrB,CAAC;AAEF,oBAAmB,KAAK;AAExB,QAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"postgres.js","names":[],"sources":["../src/postgres.ts"],"sourcesContent":["import { runsOnServer } from \"@settlemint/sdk-utils/runtime\";\nimport pg from \"pg\";\n\n/**\n * Type definition extending the pg.Pool interface to include custom permanent-failure event\n */\ndeclare module \"pg\" {\n interface Pool {\n on(event: \"permanent-failure\", listener: (err: Error) => void): this;\n emit(event: \"permanent-failure\", err: Error): boolean;\n }\n}\n\n/**\n * Utility function to pause execution for a specified duration\n *\n * @param ms - The number of milliseconds to sleep\n * @returns A promise that resolves after the specified duration\n */\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\n/**\n * Configures error handling and recovery mechanisms for a PostgreSQL connection pool\n *\n * @param pool - The PostgreSQL connection pool to configure\n */\nfunction setupErrorHandling(pool: pg.Pool) {\n let retryCount = 0;\n let isRetrying = false;\n const clientErrorHandlers = new WeakSet<pg.PoolClient>();\n\n const handlePoolError = async (err: Error) => {\n console.error(\"[Drizzle] Pool error occurred:\", err);\n\n // Prevent concurrent retry attempts\n if (isRetrying) {\n console.log(\"[Drizzle] Recovery already in progress, skipping\");\n return;\n }\n\n if (retryCount < 3) {\n isRetrying = true;\n retryCount++;\n console.log(`[Drizzle] Attempting to recover - retry ${retryCount}/3`);\n\n try {\n const client = await pool.connect();\n try {\n // Test the connection with timeout\n await Promise.race([\n client.query(\"SELECT 1\"),\n new Promise((_, reject) => setTimeout(() => reject(new Error(\"Query timeout\")), 5000)),\n ]);\n console.log(\"[Drizzle] Successfully recovered connection\");\n retryCount = 0;\n } finally {\n client.release();\n }\n } catch (retryError) {\n console.error(`[Drizzle] Recovery attempt ${retryCount} failed:`, retryError);\n await sleep(5000 * 2 ** (retryCount - 1));\n } finally {\n isRetrying = false;\n }\n } else {\n console.error(\"[Drizzle] Max retries exceeded - pool is in an error state\");\n pool.emit(\"permanent-failure\", err);\n }\n };\n\n const handleConnect = (client: pg.PoolClient) => {\n // Only add error handler if not already added (prevent memory leaks)\n if (!clientErrorHandlers.has(client)) {\n clientErrorHandlers.add(client);\n client.on(\"error\", (err: Error) => {\n console.error(\"[Drizzle] Database client error:\", err);\n });\n }\n retryCount = 0;\n isRetrying = false;\n };\n\n pool.on(\"error\", handlePoolError);\n pool.on(\"connect\", handleConnect);\n}\n\n/**\n * Creates a PostgreSQL connection pool with error handling and retry mechanisms\n *\n * @param databaseUrl - The PostgreSQL connection URL\n * @returns A configured PostgreSQL connection pool\n * @throws Will throw an error if called from browser runtime\n * @example\n * import { createPostgresPool } from '@settlemint/sdk-hasura';\n *\n * const pool = createPostgresPool(process.env.SETTLEMINT_HASURA_DATABASE_URL);\n *\n * // The pool will automatically handle connection errors and retries\n * const client = await pool.connect();\n * try {\n * const result = await client.query('SELECT NOW()');\n * console.log(result.rows[0]);\n * } finally {\n * client.release();\n * }\n */\nexport function createPostgresPool(databaseUrl: string) {\n if (!databaseUrl?.trim()) {\n throw new Error(\"Database URL is required\");\n }\n\n if (!runsOnServer) {\n throw new Error(\"Drizzle client can only be created on the server side\");\n }\n\n const pool = new pg.Pool({\n connectionString: databaseUrl,\n max: 10,\n idleTimeoutMillis: 30000,\n connectionTimeoutMillis: 5000,\n maxLifetimeSeconds: 0,\n });\n\n setupErrorHandling(pool);\n\n return pool;\n}\n"],"mappings":";;;;;;;;;;;AAmBA,MAAM,SAAS,OAAe,IAAI,SAAS,YAAY,WAAW,SAAS;;;;;;AAO3E,SAAS,mBAAmB,MAAe;CACzC,IAAI,aAAa;CACjB,IAAI,aAAa;CACjB,MAAM,sBAAsB,IAAI;CAEhC,MAAM,kBAAkB,OAAO,QAAe;AAC5C,UAAQ,MAAM,kCAAkC;AAGhD,MAAI,YAAY;AACd,WAAQ,IAAI;AACZ;;AAGF,MAAI,aAAa,GAAG;AAClB,gBAAa;AACb;AACA,WAAQ,IAAI,2CAA2C,WAAW;AAElE,OAAI;IACF,MAAM,SAAS,MAAM,KAAK;AAC1B,QAAI;AAEF,WAAM,QAAQ,KAAK,CACjB,OAAO,MAAM,aACb,IAAI,SAAS,GAAG,WAAW,iBAAiB,OAAO,IAAI,MAAM,mBAAmB;AAElF,aAAQ,IAAI;AACZ,kBAAa;cACL;AACR,YAAO;;YAEF,YAAY;AACnB,YAAQ,MAAM,8BAA8B,WAAW,WAAW;AAClE,UAAM,MAAM,MAAO,MAAM,aAAa;aAC9B;AACR,iBAAa;;SAEV;AACL,WAAQ,MAAM;AACd,QAAK,KAAK,qBAAqB;;;CAInC,MAAM,iBAAiB,WAA0B;AAE/C,MAAI,CAAC,oBAAoB,IAAI,SAAS;AACpC,uBAAoB,IAAI;AACxB,UAAO,GAAG,UAAU,QAAe;AACjC,YAAQ,MAAM,oCAAoC;;;AAGtD,eAAa;AACb,eAAa;;AAGf,MAAK,GAAG,SAAS;AACjB,MAAK,GAAG,WAAW;;;;;;;;;;;;;;;;;;;;;;AAuBrB,SAAgB,mBAAmB,aAAqB;AACtD,KAAI,CAAC,aAAa,QAAQ;AACxB,QAAM,IAAI,MAAM;;AAGlB,KAAI,CAAC,cAAc;AACjB,QAAM,IAAI,MAAM;;CAGlB,MAAM,OAAO,IAAI,GAAG,KAAK;EACvB,kBAAkB;EAClB,KAAK;EACL,mBAAmB;EACnB,yBAAyB;EACzB,oBAAoB;;AAGtB,oBAAmB;AAEnB,QAAO"}
1
+ {"version":3,"file":"postgres.js","names":[],"sources":["../src/postgres.ts"],"sourcesContent":["import { runsOnServer } from \"@settlemint/sdk-utils/runtime\";\nimport pg from \"pg\";\n\n/**\n * Type definition extending the pg.Pool interface to include custom permanent-failure event\n */\ndeclare module \"pg\" {\n interface Pool {\n on(event: \"permanent-failure\", listener: (err: Error) => void): this;\n emit(event: \"permanent-failure\", err: Error): boolean;\n }\n}\n\n/**\n * Utility function to pause execution for a specified duration\n *\n * @param ms - The number of milliseconds to sleep\n * @returns A promise that resolves after the specified duration\n */\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\n/**\n * Configures error handling and recovery mechanisms for a PostgreSQL connection pool\n *\n * @param pool - The PostgreSQL connection pool to configure\n */\nfunction setupErrorHandling(pool: pg.Pool) {\n let retryCount = 0;\n let isRetrying = false;\n const clientErrorHandlers = new WeakSet<pg.PoolClient>();\n\n const handlePoolError = async (err: Error) => {\n console.error(\"[Drizzle] Pool error occurred:\", err);\n\n // Prevent concurrent retry attempts\n if (isRetrying) {\n console.log(\"[Drizzle] Recovery already in progress, skipping\");\n return;\n }\n\n if (retryCount < 3) {\n isRetrying = true;\n retryCount++;\n console.log(`[Drizzle] Attempting to recover - retry ${retryCount}/3`);\n\n try {\n const client = await pool.connect();\n try {\n // Test the connection with timeout\n await Promise.race([\n client.query(\"SELECT 1\"),\n new Promise((_, reject) => setTimeout(() => reject(new Error(\"Query timeout\")), 5000)),\n ]);\n console.log(\"[Drizzle] Successfully recovered connection\");\n retryCount = 0;\n } finally {\n client.release();\n }\n } catch (retryError) {\n console.error(`[Drizzle] Recovery attempt ${retryCount} failed:`, retryError);\n await sleep(5000 * 2 ** (retryCount - 1));\n } finally {\n isRetrying = false;\n }\n } else {\n console.error(\"[Drizzle] Max retries exceeded - pool is in an error state\");\n pool.emit(\"permanent-failure\", err);\n }\n };\n\n const handleConnect = (client: pg.PoolClient) => {\n // Only add error handler if not already added (prevent memory leaks)\n if (!clientErrorHandlers.has(client)) {\n clientErrorHandlers.add(client);\n client.on(\"error\", (err: Error) => {\n console.error(\"[Drizzle] Database client error:\", err);\n });\n }\n retryCount = 0;\n isRetrying = false;\n };\n\n pool.on(\"error\", handlePoolError);\n pool.on(\"connect\", handleConnect);\n}\n\n/**\n * Creates a PostgreSQL connection pool with error handling and retry mechanisms\n *\n * @param databaseUrl - The PostgreSQL connection URL\n * @returns A configured PostgreSQL connection pool\n * @throws Will throw an error if called from browser runtime\n * @example\n * import { createPostgresPool } from '@settlemint/sdk-hasura';\n *\n * const pool = createPostgresPool(process.env.SETTLEMINT_HASURA_DATABASE_URL);\n *\n * // The pool will automatically handle connection errors and retries\n * const client = await pool.connect();\n * try {\n * const result = await client.query('SELECT NOW()');\n * console.log(result.rows[0]);\n * } finally {\n * client.release();\n * }\n */\nexport function createPostgresPool(databaseUrl: string) {\n if (!databaseUrl?.trim()) {\n throw new Error(\"Database URL is required\");\n }\n\n if (!runsOnServer) {\n throw new Error(\"Drizzle client can only be created on the server side\");\n }\n\n const pool = new pg.Pool({\n connectionString: databaseUrl,\n max: 10,\n idleTimeoutMillis: 30000,\n connectionTimeoutMillis: 5000,\n maxLifetimeSeconds: 0,\n });\n\n setupErrorHandling(pool);\n\n return pool;\n}\n"],"mappings":";;;;;;;;;;;AAmBA,MAAM,SAAS,OAAe,IAAI,SAAS,YAAY,WAAW,SAAS,GAAG,CAAC;;;;;;AAO/E,SAAS,mBAAmB,MAAe;CACzC,IAAI,aAAa;CACjB,IAAI,aAAa;CACjB,MAAM,sBAAsB,IAAI,SAAwB;CAExD,MAAM,kBAAkB,OAAO,QAAe;AAC5C,UAAQ,MAAM,kCAAkC,IAAI;AAGpD,MAAI,YAAY;AACd,WAAQ,IAAI,mDAAmD;AAC/D;;AAGF,MAAI,aAAa,GAAG;AAClB,gBAAa;AACb;AACA,WAAQ,IAAI,2CAA2C,WAAW,IAAI;AAEtE,OAAI;IACF,MAAM,SAAS,MAAM,KAAK,SAAS;AACnC,QAAI;AAEF,WAAM,QAAQ,KAAK,CACjB,OAAO,MAAM,WAAW,EACxB,IAAI,SAAS,GAAG,WAAW,iBAAiB,OAAO,IAAI,MAAM,gBAAgB,CAAC,EAAE,IAAK,CAAC,CACvF,CAAC;AACF,aAAQ,IAAI,8CAA8C;AAC1D,kBAAa;cACL;AACR,YAAO,SAAS;;YAEX,YAAY;AACnB,YAAQ,MAAM,8BAA8B,WAAW,WAAW,WAAW;AAC7E,UAAM,MAAM,MAAO,MAAM,aAAa,GAAG;aACjC;AACR,iBAAa;;SAEV;AACL,WAAQ,MAAM,6DAA6D;AAC3E,QAAK,KAAK,qBAAqB,IAAI;;;CAIvC,MAAM,iBAAiB,WAA0B;AAE/C,MAAI,CAAC,oBAAoB,IAAI,OAAO,EAAE;AACpC,uBAAoB,IAAI,OAAO;AAC/B,UAAO,GAAG,UAAU,QAAe;AACjC,YAAQ,MAAM,oCAAoC,IAAI;KACtD;;AAEJ,eAAa;AACb,eAAa;;AAGf,MAAK,GAAG,SAAS,gBAAgB;AACjC,MAAK,GAAG,WAAW,cAAc;;;;;;;;;;;;;;;;;;;;;;AAuBnC,SAAgB,mBAAmB,aAAqB;AACtD,KAAI,CAAC,aAAa,MAAM,EAAE;AACxB,QAAM,IAAI,MAAM,2BAA2B;;AAG7C,KAAI,CAAC,cAAc;AACjB,QAAM,IAAI,MAAM,wDAAwD;;CAG1E,MAAM,OAAO,IAAI,GAAG,KAAK;EACvB,kBAAkB;EAClB,KAAK;EACL,mBAAmB;EACnB,yBAAyB;EACzB,oBAAoB;EACrB,CAAC;AAEF,oBAAmB,KAAK;AAExB,QAAO"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@settlemint/sdk-hasura",
3
3
  "description": "Hasura and PostgreSQL integration module for SettleMint SDK, enabling database operations and GraphQL queries",
4
- "version": "2.6.2",
4
+ "version": "2.6.3",
5
5
  "type": "module",
6
6
  "private": false,
7
7
  "license": "FSL-1.1-MIT",
@@ -51,7 +51,7 @@
51
51
  },
52
52
  "scripts": {
53
53
  "build": "tsdown",
54
- "dev": "tsdown --watch",
54
+ "dev": "tsdown --watch ./src",
55
55
  "publint": "publint run --strict",
56
56
  "attw": "attw --pack . || exit 0",
57
57
  "test": "bun test",
@@ -66,7 +66,7 @@
66
66
  },
67
67
  "dependencies": {
68
68
  "gql.tada": "^1",
69
- "@settlemint/sdk-utils": "2.6.2",
69
+ "@settlemint/sdk-utils": "2.6.3",
70
70
  "graphql-request": "^7",
71
71
  "zod": "^4",
72
72
  "drizzle-orm": "^0.44.0",