@settlemint/sdk-hasura 2.4.1-prb370c72b → 2.4.1-prb593b885

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
@@ -30,7 +30,9 @@
30
30
  - [API Reference](#api-reference)
31
31
  - [Functions](#functions)
32
32
  - [createHasuraClient()](#createhasuraclient)
33
+ - [createHasuraMetadataClient()](#createhasurametadataclient)
33
34
  - [createPostgresPool()](#createpostgrespool)
35
+ - [trackAllTables()](#trackalltables)
34
36
  - [Type Aliases](#type-aliases)
35
37
  - [ClientOptions](#clientoptions)
36
38
  - [RequestConfig](#requestconfig)
@@ -51,7 +53,7 @@ The SettleMint Hasura SDK provides a seamless way to interact with Hasura GraphQ
51
53
 
52
54
  > **createHasuraClient**\<`Setup`\>(`options`, `clientOptions?`, `logger?`): `object`
53
55
 
54
- Defined in: [sdk/hasura/src/hasura.ts:82](https://github.com/settlemint/sdk/blob/v2.4.1/sdk/hasura/src/hasura.ts#L82)
56
+ Defined in: [sdk/hasura/src/hasura.ts:83](https://github.com/settlemint/sdk/blob/v2.4.1/sdk/hasura/src/hasura.ts#L83)
55
57
 
56
58
  Creates a Hasura GraphQL client with proper type safety using gql.tada
57
59
 
@@ -83,8 +85,8 @@ An object containing:
83
85
 
84
86
  | Name | Type | Defined in |
85
87
  | ------ | ------ | ------ |
86
- | `client` | `GraphQLClient` | [sdk/hasura/src/hasura.ts:87](https://github.com/settlemint/sdk/blob/v2.4.1/sdk/hasura/src/hasura.ts#L87) |
87
- | `graphql` | `initGraphQLTada`\<`Setup`\> | [sdk/hasura/src/hasura.ts:88](https://github.com/settlemint/sdk/blob/v2.4.1/sdk/hasura/src/hasura.ts#L88) |
88
+ | `client` | `GraphQLClient` | [sdk/hasura/src/hasura.ts:88](https://github.com/settlemint/sdk/blob/v2.4.1/sdk/hasura/src/hasura.ts#L88) |
89
+ | `graphql` | `initGraphQLTada`\<`Setup`\> | [sdk/hasura/src/hasura.ts:89](https://github.com/settlemint/sdk/blob/v2.4.1/sdk/hasura/src/hasura.ts#L89) |
88
90
 
89
91
  ##### Throws
90
92
 
@@ -138,6 +140,72 @@ const result = await client.request(query);
138
140
 
139
141
  ***
140
142
 
143
+ #### createHasuraMetadataClient()
144
+
145
+ > **createHasuraMetadataClient**(`options`, `logger?`): \<`T`\>(`query`) => `Promise`\<\{ `data`: `T`; `ok`: `boolean`; \}\>
146
+
147
+ Defined in: [sdk/hasura/src/hasura.ts:132](https://github.com/settlemint/sdk/blob/v2.4.1/sdk/hasura/src/hasura.ts#L132)
148
+
149
+ Creates a Hasura Metadata client
150
+
151
+ ##### Parameters
152
+
153
+ | Parameter | Type | Description |
154
+ | ------ | ------ | ------ |
155
+ | `options` | \{ `accessToken?`: `string`; `adminSecret`: `string`; `cache?`: `"default"` \| `"force-cache"` \| `"no-cache"` \| `"no-store"` \| `"only-if-cached"` \| `"reload"`; `instance`: `string`; \} | Configuration options for the client |
156
+ | `options.accessToken?` | `string` | - |
157
+ | `options.adminSecret?` | `string` | - |
158
+ | `options.cache?` | `"default"` \| `"force-cache"` \| `"no-cache"` \| `"no-store"` \| `"only-if-cached"` \| `"reload"` | - |
159
+ | `options.instance?` | `string` | - |
160
+ | `logger?` | `Logger` | Optional logger to use for logging the requests |
161
+
162
+ ##### Returns
163
+
164
+ A function that can be used to make requests to the Hasura Metadata API
165
+
166
+ > \<`T`\>(`query`): `Promise`\<\{ `data`: `T`; `ok`: `boolean`; \}\>
167
+
168
+ ###### Type Parameters
169
+
170
+ | Type Parameter |
171
+ | ------ |
172
+ | `T` |
173
+
174
+ ###### Parameters
175
+
176
+ | Parameter | Type |
177
+ | ------ | ------ |
178
+ | `query` | `object` |
179
+
180
+ ###### Returns
181
+
182
+ `Promise`\<\{ `data`: `T`; `ok`: `boolean`; \}\>
183
+
184
+ ##### Throws
185
+
186
+ Will throw an error if the options fail validation against ClientOptionsSchema
187
+
188
+ ##### Example
189
+
190
+ ```ts
191
+ import { createHasuraMetadataClient } from '@settlemint/sdk-hasura';
192
+
193
+ const client = createHasuraMetadataClient({
194
+ instance: process.env.SETTLEMINT_HASURA_ENDPOINT,
195
+ accessToken: process.env.SETTLEMINT_ACCESS_TOKEN,
196
+ adminSecret: process.env.SETTLEMINT_HASURA_ADMIN_SECRET,
197
+ });
198
+
199
+ const result = await client({
200
+ type: "pg_get_source_tables",
201
+ args: {
202
+ source: "default",
203
+ },
204
+ });
205
+ ```
206
+
207
+ ***
208
+
141
209
  #### createPostgresPool()
142
210
 
143
211
  > **createPostgresPool**(`databaseUrl`): `Pool`
@@ -179,13 +247,55 @@ try {
179
247
  }
180
248
  ```
181
249
 
250
+ ***
251
+
252
+ #### trackAllTables()
253
+
254
+ > **trackAllTables**(`databaseName`, `client`): `Promise`\<\{ `messages`: `string`[]; `result`: `"success"` \| `"no-tables"`; \}\>
255
+
256
+ Defined in: [sdk/hasura/src/utils/track-all-tables.ts:25](https://github.com/settlemint/sdk/blob/v2.4.1/sdk/hasura/src/utils/track-all-tables.ts#L25)
257
+
258
+ Track all tables in a database
259
+
260
+ ##### Parameters
261
+
262
+ | Parameter | Type | Description |
263
+ | ------ | ------ | ------ |
264
+ | `databaseName` | `string` | The name of the database to track tables for |
265
+ | `client` | \<`T`\>(`query`) => `Promise`\<\{ `data`: `T`; `ok`: `boolean`; \}\> | - |
266
+
267
+ ##### Returns
268
+
269
+ `Promise`\<\{ `messages`: `string`[]; `result`: `"success"` \| `"no-tables"`; \}\>
270
+
271
+ A promise that resolves to an object with a result property indicating success or failure
272
+
273
+ ##### Example
274
+
275
+ ```ts
276
+ import { trackAllTables } from "@settlemint/sdk-hasura/utils/track-all-tables";
277
+
278
+ const client = createHasuraMetadataClient({
279
+ instance: "http://localhost:8080",
280
+ accessToken: "test",
281
+ adminSecret: "test",
282
+ });
283
+
284
+ const result = await trackAllTables("default", client);
285
+ if (result.result === "success") {
286
+ console.log("Tables tracked successfully");
287
+ } else {
288
+ console.error("Failed to track tables");
289
+ }
290
+ ```
291
+
182
292
  ### Type Aliases
183
293
 
184
294
  #### ClientOptions
185
295
 
186
296
  > **ClientOptions** = `object`
187
297
 
188
- Defined in: [sdk/hasura/src/hasura.ts:27](https://github.com/settlemint/sdk/blob/v2.4.1/sdk/hasura/src/hasura.ts#L27)
298
+ Defined in: [sdk/hasura/src/hasura.ts:28](https://github.com/settlemint/sdk/blob/v2.4.1/sdk/hasura/src/hasura.ts#L28)
189
299
 
190
300
  Type definition for client options derived from the ClientOptionsSchema.
191
301
 
@@ -193,10 +303,10 @@ Type definition for client options derived from the ClientOptionsSchema.
193
303
 
194
304
  | Name | Type | Default value | Defined in |
195
305
  | ------ | ------ | ------ | ------ |
196
- | <a id="accesstoken"></a> `accessToken?` | `string` | - | [sdk/hasura/src/hasura.ts:19](https://github.com/settlemint/sdk/blob/v2.4.1/sdk/hasura/src/hasura.ts#L19) |
197
- | <a id="adminsecret"></a> `adminSecret` | `string` | - | [sdk/hasura/src/hasura.ts:20](https://github.com/settlemint/sdk/blob/v2.4.1/sdk/hasura/src/hasura.ts#L20) |
198
- | <a id="cache"></a> `cache?` | `"default"` \| `"force-cache"` \| `"no-cache"` \| `"no-store"` \| `"only-if-cached"` \| `"reload"` | - | [sdk/hasura/src/hasura.ts:21](https://github.com/settlemint/sdk/blob/v2.4.1/sdk/hasura/src/hasura.ts#L21) |
199
- | <a id="instance"></a> `instance` | `string` | `UrlOrPathSchema` | [sdk/hasura/src/hasura.ts:18](https://github.com/settlemint/sdk/blob/v2.4.1/sdk/hasura/src/hasura.ts#L18) |
306
+ | <a id="accesstoken"></a> `accessToken?` | `string` | - | [sdk/hasura/src/hasura.ts:20](https://github.com/settlemint/sdk/blob/v2.4.1/sdk/hasura/src/hasura.ts#L20) |
307
+ | <a id="adminsecret"></a> `adminSecret` | `string` | - | [sdk/hasura/src/hasura.ts:21](https://github.com/settlemint/sdk/blob/v2.4.1/sdk/hasura/src/hasura.ts#L21) |
308
+ | <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.4.1/sdk/hasura/src/hasura.ts#L22) |
309
+ | <a id="instance"></a> `instance` | `string` | `UrlOrPathSchema` | [sdk/hasura/src/hasura.ts:19](https://github.com/settlemint/sdk/blob/v2.4.1/sdk/hasura/src/hasura.ts#L19) |
200
310
 
201
311
  ***
202
312
 
@@ -204,7 +314,7 @@ Type definition for client options derived from the ClientOptionsSchema.
204
314
 
205
315
  > **RequestConfig** = `ConstructorParameters`\<*typeof* `GraphQLClient`\>\[`1`\]
206
316
 
207
- Defined in: [sdk/hasura/src/hasura.ts:12](https://github.com/settlemint/sdk/blob/v2.4.1/sdk/hasura/src/hasura.ts#L12)
317
+ Defined in: [sdk/hasura/src/hasura.ts:13](https://github.com/settlemint/sdk/blob/v2.4.1/sdk/hasura/src/hasura.ts#L13)
208
318
 
209
319
  Type definition for GraphQL client configuration options
210
320
 
@@ -214,7 +324,7 @@ Type definition for GraphQL client configuration options
214
324
 
215
325
  > `const` **ClientOptionsSchema**: `ZodObject`\<[`ClientOptions`](#clientoptions)\>
216
326
 
217
- Defined in: [sdk/hasura/src/hasura.ts:17](https://github.com/settlemint/sdk/blob/v2.4.1/sdk/hasura/src/hasura.ts#L17)
327
+ Defined in: [sdk/hasura/src/hasura.ts:18](https://github.com/settlemint/sdk/blob/v2.4.1/sdk/hasura/src/hasura.ts#L18)
218
328
 
219
329
  Schema for validating client options for the Hasura client.
220
330
 
package/dist/hasura.cjs CHANGED
@@ -22,6 +22,7 @@ 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"));
25
26
  const __settlemint_sdk_utils_http = __toESM(require("@settlemint/sdk-utils/http"));
26
27
  const __settlemint_sdk_utils_logging = __toESM(require("@settlemint/sdk-utils/logging"));
27
28
  const __settlemint_sdk_utils_runtime = __toESM(require("@settlemint/sdk-utils/runtime"));
@@ -30,6 +31,71 @@ const gql_tada = __toESM(require("gql.tada"));
30
31
  const graphql_request = __toESM(require("graphql-request"));
31
32
  const zod_v4 = __toESM(require("zod/v4"));
32
33
 
34
+ //#region src/utils/track-all-tables.ts
35
+ /**
36
+ * Track all tables in a database
37
+ *
38
+ * @param databaseName - The name of the database to track tables for
39
+ * @param options - The client options to use for the Hasura client
40
+ * @returns A promise that resolves to an object with a result property indicating success or failure
41
+ * @example
42
+ * import { trackAllTables } from "@settlemint/sdk-hasura/utils/track-all-tables";
43
+ *
44
+ * const client = createHasuraMetadataClient({
45
+ * instance: "http://localhost:8080",
46
+ * accessToken: "test",
47
+ * adminSecret: "test",
48
+ * });
49
+ *
50
+ * const result = await trackAllTables("default", client);
51
+ * if (result.result === "success") {
52
+ * console.log("Tables tracked successfully");
53
+ * } else {
54
+ * console.error("Failed to track tables");
55
+ * }
56
+ */
57
+ async function trackAllTables(databaseName, client) {
58
+ const messages = [];
59
+ const getTablesResult = await client({
60
+ type: "pg_get_source_tables",
61
+ args: { source: databaseName }
62
+ });
63
+ if (!getTablesResult.ok) {
64
+ throw new Error(`Failed to get tables: ${JSON.stringify(getTablesResult.data)}`);
65
+ }
66
+ const tables = getTablesResult.data;
67
+ if (tables.length === 0) {
68
+ return {
69
+ result: "no-tables",
70
+ messages
71
+ };
72
+ }
73
+ messages.push(`Found ${tables.length} tables in database "${databaseName}"`);
74
+ await client({
75
+ type: "pg_untrack_tables",
76
+ args: {
77
+ tables: tables.map((table) => ({ table: table.name })),
78
+ allow_warnings: true
79
+ }
80
+ });
81
+ const trackResult = await client({
82
+ type: "pg_track_tables",
83
+ args: {
84
+ tables: tables.map((table) => ({ table: table.name })),
85
+ allow_warnings: true
86
+ }
87
+ });
88
+ if (!trackResult.ok) {
89
+ throw new Error(`Failed to track tables: ${JSON.stringify(trackResult.data)}`);
90
+ }
91
+ messages.push(`Successfully tracked ${tables.length} tables`);
92
+ return {
93
+ result: "success",
94
+ messages
95
+ };
96
+ }
97
+
98
+ //#endregion
33
99
  //#region src/hasura.ts
34
100
  /**
35
101
  * Schema for validating client options for the Hasura client.
@@ -117,14 +183,66 @@ function createHasuraClient(options, clientOptions, logger) {
117
183
  graphql
118
184
  };
119
185
  }
186
+ /**
187
+ * Creates a Hasura Metadata client
188
+ *
189
+ * @param options - Configuration options for the client
190
+ * @param logger - Optional logger to use for logging the requests
191
+ * @returns A function that can be used to make requests to the Hasura Metadata API
192
+ * @throws Will throw an error if the options fail validation against ClientOptionsSchema
193
+ * @example
194
+ * import { createHasuraMetadataClient } from '@settlemint/sdk-hasura';
195
+ *
196
+ * const client = createHasuraMetadataClient({
197
+ * instance: process.env.SETTLEMINT_HASURA_ENDPOINT,
198
+ * accessToken: process.env.SETTLEMINT_ACCESS_TOKEN,
199
+ * adminSecret: process.env.SETTLEMINT_HASURA_ADMIN_SECRET,
200
+ * });
201
+ *
202
+ * const result = await client({
203
+ * type: "pg_get_source_tables",
204
+ * args: {
205
+ * source: "default",
206
+ * },
207
+ * });
208
+ */
209
+ function createHasuraMetadataClient(options, logger) {
210
+ (0, __settlemint_sdk_utils_runtime.ensureServer)();
211
+ const validatedOptions = (0, __settlemint_sdk_utils_validation.validate)(ClientOptionsSchema, options);
212
+ const baseUrl = (0, __settlemint_sdk_utils.extractBaseUrlBeforeSegment)(options.instance, "/v1/graphql");
213
+ const queryEndpoint = new URL(`${baseUrl}/v1/metadata`).toString();
214
+ const fetchInstance = logger ? (0, __settlemint_sdk_utils_logging.requestLogger)(logger, "hasura", fetch) : fetch;
215
+ return async (query) => {
216
+ const response = await fetchInstance(queryEndpoint, {
217
+ method: "POST",
218
+ headers: (0, __settlemint_sdk_utils_http.appendHeaders)({ "Content-Type": "application/json" }, {
219
+ "x-auth-token": validatedOptions.accessToken,
220
+ "x-hasura-admin-secret": validatedOptions.adminSecret
221
+ }),
222
+ body: JSON.stringify(query)
223
+ });
224
+ if (!response.ok) {
225
+ return {
226
+ ok: false,
227
+ data: await response.json()
228
+ };
229
+ }
230
+ return {
231
+ ok: true,
232
+ data: await response.json()
233
+ };
234
+ };
235
+ }
120
236
 
121
237
  //#endregion
122
238
  exports.ClientOptionsSchema = ClientOptionsSchema;
123
239
  exports.createHasuraClient = createHasuraClient;
240
+ exports.createHasuraMetadataClient = createHasuraMetadataClient;
124
241
  Object.defineProperty(exports, 'readFragment', {
125
242
  enumerable: true,
126
243
  get: function () {
127
244
  return gql_tada.readFragment;
128
245
  }
129
246
  });
247
+ exports.trackAllTables = trackAllTables;
130
248
  //# sourceMappingURL=hasura.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"hasura.cjs","names":["UrlOrPathSchema","options: ClientOptions","clientOptions?: RequestConfig","logger?: Logger","GraphQLClient"],"sources":["../src/hasura.ts"],"sourcesContent":["import { 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/v4\";\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\nexport { readFragment } from \"gql.tada\";\nexport type { FragmentOf, ResultOf, VariablesOf } from \"gql.tada\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,MAAa,sBAAsB,SAAE,OAAO;CAC1C,UAAUA;CACV,aAAa,+DAA6B,UAAU;CACpD,aAAa,SAAE,QAAQ;CACvB,OAAO,SAAE,KAAK;EAAC;EAAW;EAAe;EAAY;EAAY;EAAkB;CAAS,EAAC,CAAC,UAAU;AACzG,EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4DF,SAAgB,mBACdC,SACAC,eACAC,QAIA;AACA,mDAAc;CACd,MAAM,mBAAmB,gDAAS,qBAAqB,QAAQ;CAC/D,MAAM,UAAU,+BAAwB;CACxC,MAAM,UAAU,IAAI,IAAI,iBAAiB,UAAU,UAAU;AAE7D,QAAO;EACL,QAAQ,IAAIC,8BAAc,SAAS;GACjC,GAAG;GACH,SAAS,+CAAc,eAAe,SAAS;IAC7C,gBAAgB,iBAAiB;IACjC,yBAAyB,iBAAiB;GAC3C,EAAC;GACF,OAAQ,SAAS,kDAAc,QAAQ,UAAU,MAAM,GAAG;EAC3D;EACD;CACD;AACF"}
1
+ {"version":3,"file":"hasura.cjs","names":["databaseName: string","client: ReturnType<typeof createHasuraMetadataClient>","messages: string[]","UrlOrPathSchema","options: ClientOptions","clientOptions?: RequestConfig","logger?: Logger","GraphQLClient","query: object"],"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 options - The client options to use for the Hasura client\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 * 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): Promise<{ result: \"success\" | \"no-tables\"; messages: string[] }> {\n const messages: string[] = [];\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.name,\n })),\n allow_warnings: true,\n },\n });\n\n // Track all tables\n const trackResult = await client<{ code?: string }>({\n type: \"pg_track_tables\",\n args: {\n tables: tables.map((table) => ({\n table: table.name,\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 ${tables.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/v4\";\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,eAAsB,eACpBA,cACAC,QACkE;CAClE,MAAMC,WAAqB,CAAE;CAG7B,MAAM,kBAAkB,MAAM,OAK5B;EACA,MAAM;EACN,MAAM,EACJ,QAAQ,aACT;CACF,EAAC;AAEF,MAAK,gBAAgB,IAAI;AACvB,QAAM,IAAI,OAAO,wBAAwB,KAAK,UAAU,gBAAgB,KAAK,CAAC;CAC/E;CAED,MAAM,SAAS,gBAAgB;AAE/B,KAAI,OAAO,WAAW,GAAG;AACvB,SAAO;GAAE,QAAQ;GAAsB;EAAU;CAClD;AAED,UAAS,MAAM,QAAQ,OAAO,OAAO,uBAAuB,aAAa,GAAG;AAG5E,OAAM,OAA0B;EAC9B,MAAM;EACN,MAAM;GACJ,QAAQ,OAAO,IAAI,CAAC,WAAW,EAC7B,OAAO,MAAM,KACd,GAAE;GACH,gBAAgB;EACjB;CACF,EAAC;CAGF,MAAM,cAAc,MAAM,OAA0B;EAClD,MAAM;EACN,MAAM;GACJ,QAAQ,OAAO,IAAI,CAAC,WAAW,EAC7B,OAAO,MAAM,KACd,GAAE;GACH,gBAAgB;EACjB;CACF,EAAC;AAEF,MAAK,YAAY,IAAI;AACnB,QAAM,IAAI,OAAO,0BAA0B,KAAK,UAAU,YAAY,KAAK,CAAC;CAC7E;AAED,UAAS,MAAM,uBAAuB,OAAO,OAAO,SAAS;AAE7D,QAAO;EAAE,QAAQ;EAAoB;CAAU;AAChD;;;;;;;ACnED,MAAa,sBAAsB,SAAE,OAAO;CAC1C,UAAUC;CACV,aAAa,+DAA6B,UAAU;CACpD,aAAa,SAAE,QAAQ;CACvB,OAAO,SAAE,KAAK;EAAC;EAAW;EAAe;EAAY;EAAY;EAAkB;CAAS,EAAC,CAAC,UAAU;AACzG,EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4DF,SAAgB,mBACdC,SACAC,eACAC,QAIA;AACA,mDAAc;CACd,MAAM,mBAAmB,gDAAS,qBAAqB,QAAQ;CAC/D,MAAM,UAAU,+BAAwB;CACxC,MAAM,UAAU,IAAI,IAAI,iBAAiB,UAAU,UAAU;AAE7D,QAAO;EACL,QAAQ,IAAIC,8BAAc,SAAS;GACjC,GAAG;GACH,SAAS,+CAAc,eAAe,SAAS;IAC7C,gBAAgB,iBAAiB;IACjC,yBAAyB,iBAAiB;GAC3C,EAAC;GACF,OAAQ,SAAS,kDAAc,QAAQ,UAAU,MAAM,GAAG;EAC3D;EACD;CACD;AACF;;;;;;;;;;;;;;;;;;;;;;;;AAyBD,SAAgB,2BAA2BH,SAAwBE,QAAiB;AAClF,mDAAc;CACd,MAAM,mBAAmB,gDAAS,qBAAqB,QAAQ;CAC/D,MAAM,UAAU,wDAA4B,QAAQ,UAAU,cAAc;CAC5E,MAAM,gBAAgB,IAAI,KAAK,EAAE,QAAQ,eAAe,UAAU;CAClE,MAAM,gBAAgB,SAAS,kDAAc,QAAQ,UAAU,MAAM,GAAG;AAExE,QAAO,OAAUE,UAAqD;EACpE,MAAM,WAAW,MAAM,cAAc,eAAe;GAClD,QAAQ;GACR,SAAS,+CACP,EAAE,gBAAgB,mBAAoB,GACtC;IACE,gBAAgB,iBAAiB;IACjC,yBAAyB,iBAAiB;GAC3C,EACF;GACD,MAAM,KAAK,UAAU,MAAM;EAC5B,EAAC;AAEF,OAAK,SAAS,IAAI;AAChB,UAAO;IAAE,IAAI;IAAO,MAAO,MAAM,SAAS,MAAM;GAAQ;EACzD;AAED,SAAO;GAAE,IAAI;GAAM,MAAO,MAAM,SAAS,MAAM;EAAQ;CACxD;AACF"}
package/dist/hasura.d.cts CHANGED
@@ -4,6 +4,35 @@ import { AbstractSetupSchema, FragmentOf, ResultOf, VariablesOf, initGraphQLTada
4
4
  import { GraphQLClient } from "graphql-request";
5
5
  import { z } from "zod/v4";
6
6
 
7
+ //#region src/utils/track-all-tables.d.ts
8
+
9
+ /**
10
+ * Track all tables in a database
11
+ *
12
+ * @param databaseName - The name of the database to track tables for
13
+ * @param options - The client options to use for the Hasura client
14
+ * @returns A promise that resolves to an object with a result property indicating success or failure
15
+ * @example
16
+ * import { trackAllTables } from "@settlemint/sdk-hasura/utils/track-all-tables";
17
+ *
18
+ * const client = createHasuraMetadataClient({
19
+ * instance: "http://localhost:8080",
20
+ * accessToken: "test",
21
+ * adminSecret: "test",
22
+ * });
23
+ *
24
+ * const result = await trackAllTables("default", client);
25
+ * if (result.result === "success") {
26
+ * console.log("Tables tracked successfully");
27
+ * } else {
28
+ * console.error("Failed to track tables");
29
+ * }
30
+ */
31
+ declare function trackAllTables(databaseName: string, client: ReturnType<typeof createHasuraMetadataClient>): Promise<{
32
+ result: "success" | "no-tables";
33
+ messages: string[];
34
+ }>;
35
+ //#endregion
7
36
  //#region src/hasura.d.ts
8
37
  /**
9
38
  * Type definition for GraphQL client configuration options
@@ -86,6 +115,33 @@ declare function createHasuraClient<const Setup extends AbstractSetupSchema>(opt
86
115
  client: GraphQLClient;
87
116
  graphql: initGraphQLTada<Setup>;
88
117
  };
118
+ /**
119
+ * Creates a Hasura Metadata client
120
+ *
121
+ * @param options - Configuration options for the client
122
+ * @param logger - Optional logger to use for logging the requests
123
+ * @returns A function that can be used to make requests to the Hasura Metadata API
124
+ * @throws Will throw an error if the options fail validation against ClientOptionsSchema
125
+ * @example
126
+ * import { createHasuraMetadataClient } from '@settlemint/sdk-hasura';
127
+ *
128
+ * const client = createHasuraMetadataClient({
129
+ * instance: process.env.SETTLEMINT_HASURA_ENDPOINT,
130
+ * accessToken: process.env.SETTLEMINT_ACCESS_TOKEN,
131
+ * adminSecret: process.env.SETTLEMINT_HASURA_ADMIN_SECRET,
132
+ * });
133
+ *
134
+ * const result = await client({
135
+ * type: "pg_get_source_tables",
136
+ * args: {
137
+ * source: "default",
138
+ * },
139
+ * });
140
+ */
141
+ declare function createHasuraMetadataClient(options: ClientOptions, logger?: Logger): <T>(query: object) => Promise<{
142
+ ok: boolean;
143
+ data: T;
144
+ }>;
89
145
  //#endregion
90
- export { ClientOptions, ClientOptionsSchema, FragmentOf, RequestConfig, ResultOf, VariablesOf, createHasuraClient, readFragment };
146
+ export { ClientOptions, ClientOptionsSchema, FragmentOf, RequestConfig, ResultOf, VariablesOf, createHasuraClient, createHasuraMetadataClient, readFragment, trackAllTables };
91
147
  //# sourceMappingURL=hasura.d.cts.map
package/dist/hasura.d.ts CHANGED
@@ -4,6 +4,35 @@ import { AbstractSetupSchema, FragmentOf, ResultOf, VariablesOf, initGraphQLTada
4
4
  import { GraphQLClient } from "graphql-request";
5
5
  import { z } from "zod/v4";
6
6
 
7
+ //#region src/utils/track-all-tables.d.ts
8
+
9
+ /**
10
+ * Track all tables in a database
11
+ *
12
+ * @param databaseName - The name of the database to track tables for
13
+ * @param options - The client options to use for the Hasura client
14
+ * @returns A promise that resolves to an object with a result property indicating success or failure
15
+ * @example
16
+ * import { trackAllTables } from "@settlemint/sdk-hasura/utils/track-all-tables";
17
+ *
18
+ * const client = createHasuraMetadataClient({
19
+ * instance: "http://localhost:8080",
20
+ * accessToken: "test",
21
+ * adminSecret: "test",
22
+ * });
23
+ *
24
+ * const result = await trackAllTables("default", client);
25
+ * if (result.result === "success") {
26
+ * console.log("Tables tracked successfully");
27
+ * } else {
28
+ * console.error("Failed to track tables");
29
+ * }
30
+ */
31
+ declare function trackAllTables(databaseName: string, client: ReturnType<typeof createHasuraMetadataClient>): Promise<{
32
+ result: "success" | "no-tables";
33
+ messages: string[];
34
+ }>;
35
+ //#endregion
7
36
  //#region src/hasura.d.ts
8
37
  /**
9
38
  * Type definition for GraphQL client configuration options
@@ -86,6 +115,33 @@ declare function createHasuraClient<const Setup extends AbstractSetupSchema>(opt
86
115
  client: GraphQLClient;
87
116
  graphql: initGraphQLTada<Setup>;
88
117
  };
118
+ /**
119
+ * Creates a Hasura Metadata client
120
+ *
121
+ * @param options - Configuration options for the client
122
+ * @param logger - Optional logger to use for logging the requests
123
+ * @returns A function that can be used to make requests to the Hasura Metadata API
124
+ * @throws Will throw an error if the options fail validation against ClientOptionsSchema
125
+ * @example
126
+ * import { createHasuraMetadataClient } from '@settlemint/sdk-hasura';
127
+ *
128
+ * const client = createHasuraMetadataClient({
129
+ * instance: process.env.SETTLEMINT_HASURA_ENDPOINT,
130
+ * accessToken: process.env.SETTLEMINT_ACCESS_TOKEN,
131
+ * adminSecret: process.env.SETTLEMINT_HASURA_ADMIN_SECRET,
132
+ * });
133
+ *
134
+ * const result = await client({
135
+ * type: "pg_get_source_tables",
136
+ * args: {
137
+ * source: "default",
138
+ * },
139
+ * });
140
+ */
141
+ declare function createHasuraMetadataClient(options: ClientOptions, logger?: Logger): <T>(query: object) => Promise<{
142
+ ok: boolean;
143
+ data: T;
144
+ }>;
89
145
  //#endregion
90
- export { ClientOptions, ClientOptionsSchema, FragmentOf, RequestConfig, ResultOf, VariablesOf, createHasuraClient, readFragment };
146
+ export { ClientOptions, ClientOptionsSchema, FragmentOf, RequestConfig, ResultOf, VariablesOf, createHasuraClient, createHasuraMetadataClient, readFragment, trackAllTables };
91
147
  //# sourceMappingURL=hasura.d.ts.map
package/dist/hasura.js CHANGED
@@ -1,4 +1,5 @@
1
1
  /* SettleMint Hasura SDK - GraphQL API */
2
+ import { extractBaseUrlBeforeSegment } from "@settlemint/sdk-utils";
2
3
  import { appendHeaders } from "@settlemint/sdk-utils/http";
3
4
  import { requestLogger } from "@settlemint/sdk-utils/logging";
4
5
  import { ensureServer } from "@settlemint/sdk-utils/runtime";
@@ -7,6 +8,71 @@ import { initGraphQLTada, readFragment } from "gql.tada";
7
8
  import { GraphQLClient } from "graphql-request";
8
9
  import { z } from "zod/v4";
9
10
 
11
+ //#region src/utils/track-all-tables.ts
12
+ /**
13
+ * Track all tables in a database
14
+ *
15
+ * @param databaseName - The name of the database to track tables for
16
+ * @param options - The client options to use for the Hasura client
17
+ * @returns A promise that resolves to an object with a result property indicating success or failure
18
+ * @example
19
+ * import { trackAllTables } from "@settlemint/sdk-hasura/utils/track-all-tables";
20
+ *
21
+ * const client = createHasuraMetadataClient({
22
+ * instance: "http://localhost:8080",
23
+ * accessToken: "test",
24
+ * adminSecret: "test",
25
+ * });
26
+ *
27
+ * const result = await trackAllTables("default", client);
28
+ * if (result.result === "success") {
29
+ * console.log("Tables tracked successfully");
30
+ * } else {
31
+ * console.error("Failed to track tables");
32
+ * }
33
+ */
34
+ async function trackAllTables(databaseName, client) {
35
+ const messages = [];
36
+ const getTablesResult = await client({
37
+ type: "pg_get_source_tables",
38
+ args: { source: databaseName }
39
+ });
40
+ if (!getTablesResult.ok) {
41
+ throw new Error(`Failed to get tables: ${JSON.stringify(getTablesResult.data)}`);
42
+ }
43
+ const tables = getTablesResult.data;
44
+ if (tables.length === 0) {
45
+ return {
46
+ result: "no-tables",
47
+ messages
48
+ };
49
+ }
50
+ messages.push(`Found ${tables.length} tables in database "${databaseName}"`);
51
+ await client({
52
+ type: "pg_untrack_tables",
53
+ args: {
54
+ tables: tables.map((table) => ({ table: table.name })),
55
+ allow_warnings: true
56
+ }
57
+ });
58
+ const trackResult = await client({
59
+ type: "pg_track_tables",
60
+ args: {
61
+ tables: tables.map((table) => ({ table: table.name })),
62
+ allow_warnings: true
63
+ }
64
+ });
65
+ if (!trackResult.ok) {
66
+ throw new Error(`Failed to track tables: ${JSON.stringify(trackResult.data)}`);
67
+ }
68
+ messages.push(`Successfully tracked ${tables.length} tables`);
69
+ return {
70
+ result: "success",
71
+ messages
72
+ };
73
+ }
74
+
75
+ //#endregion
10
76
  //#region src/hasura.ts
11
77
  /**
12
78
  * Schema for validating client options for the Hasura client.
@@ -94,7 +160,57 @@ function createHasuraClient(options, clientOptions, logger) {
94
160
  graphql
95
161
  };
96
162
  }
163
+ /**
164
+ * Creates a Hasura Metadata client
165
+ *
166
+ * @param options - Configuration options for the client
167
+ * @param logger - Optional logger to use for logging the requests
168
+ * @returns A function that can be used to make requests to the Hasura Metadata API
169
+ * @throws Will throw an error if the options fail validation against ClientOptionsSchema
170
+ * @example
171
+ * import { createHasuraMetadataClient } from '@settlemint/sdk-hasura';
172
+ *
173
+ * const client = createHasuraMetadataClient({
174
+ * instance: process.env.SETTLEMINT_HASURA_ENDPOINT,
175
+ * accessToken: process.env.SETTLEMINT_ACCESS_TOKEN,
176
+ * adminSecret: process.env.SETTLEMINT_HASURA_ADMIN_SECRET,
177
+ * });
178
+ *
179
+ * const result = await client({
180
+ * type: "pg_get_source_tables",
181
+ * args: {
182
+ * source: "default",
183
+ * },
184
+ * });
185
+ */
186
+ function createHasuraMetadataClient(options, logger) {
187
+ ensureServer();
188
+ const validatedOptions = validate(ClientOptionsSchema, options);
189
+ const baseUrl = extractBaseUrlBeforeSegment(options.instance, "/v1/graphql");
190
+ const queryEndpoint = new URL(`${baseUrl}/v1/metadata`).toString();
191
+ const fetchInstance = logger ? requestLogger(logger, "hasura", fetch) : fetch;
192
+ return async (query) => {
193
+ const response = await fetchInstance(queryEndpoint, {
194
+ method: "POST",
195
+ headers: appendHeaders({ "Content-Type": "application/json" }, {
196
+ "x-auth-token": validatedOptions.accessToken,
197
+ "x-hasura-admin-secret": validatedOptions.adminSecret
198
+ }),
199
+ body: JSON.stringify(query)
200
+ });
201
+ if (!response.ok) {
202
+ return {
203
+ ok: false,
204
+ data: await response.json()
205
+ };
206
+ }
207
+ return {
208
+ ok: true,
209
+ data: await response.json()
210
+ };
211
+ };
212
+ }
97
213
 
98
214
  //#endregion
99
- export { ClientOptionsSchema, createHasuraClient, readFragment };
215
+ export { ClientOptionsSchema, createHasuraClient, createHasuraMetadataClient, readFragment, trackAllTables };
100
216
  //# sourceMappingURL=hasura.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hasura.js","names":["options: ClientOptions","clientOptions?: RequestConfig","logger?: Logger"],"sources":["../src/hasura.ts"],"sourcesContent":["import { 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/v4\";\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\nexport { readFragment } from \"gql.tada\";\nexport type { FragmentOf, ResultOf, VariablesOf } from \"gql.tada\";\n"],"mappings":";;;;;;;;;;;;;AAgBA,MAAa,sBAAsB,EAAE,OAAO;CAC1C,UAAU;CACV,aAAa,6BAA6B,UAAU;CACpD,aAAa,EAAE,QAAQ;CACvB,OAAO,EAAE,KAAK;EAAC;EAAW;EAAe;EAAY;EAAY;EAAkB;CAAS,EAAC,CAAC,UAAU;AACzG,EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4DF,SAAgB,mBACdA,SACAC,eACAC,QAIA;AACA,eAAc;CACd,MAAM,mBAAmB,SAAS,qBAAqB,QAAQ;CAC/D,MAAM,UAAU,iBAAwB;CACxC,MAAM,UAAU,IAAI,IAAI,iBAAiB,UAAU,UAAU;AAE7D,QAAO;EACL,QAAQ,IAAI,cAAc,SAAS;GACjC,GAAG;GACH,SAAS,cAAc,eAAe,SAAS;IAC7C,gBAAgB,iBAAiB;IACjC,yBAAyB,iBAAiB;GAC3C,EAAC;GACF,OAAQ,SAAS,cAAc,QAAQ,UAAU,MAAM,GAAG;EAC3D;EACD;CACD;AACF"}
1
+ {"version":3,"file":"hasura.js","names":["databaseName: string","client: ReturnType<typeof createHasuraMetadataClient>","messages: string[]","options: ClientOptions","clientOptions?: RequestConfig","logger?: Logger","query: object"],"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 options - The client options to use for the Hasura client\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 * 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): Promise<{ result: \"success\" | \"no-tables\"; messages: string[] }> {\n const messages: string[] = [];\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.name,\n })),\n allow_warnings: true,\n },\n });\n\n // Track all tables\n const trackResult = await client<{ code?: string }>({\n type: \"pg_track_tables\",\n args: {\n tables: tables.map((table) => ({\n table: table.name,\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 ${tables.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/v4\";\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,eAAsB,eACpBA,cACAC,QACkE;CAClE,MAAMC,WAAqB,CAAE;CAG7B,MAAM,kBAAkB,MAAM,OAK5B;EACA,MAAM;EACN,MAAM,EACJ,QAAQ,aACT;CACF,EAAC;AAEF,MAAK,gBAAgB,IAAI;AACvB,QAAM,IAAI,OAAO,wBAAwB,KAAK,UAAU,gBAAgB,KAAK,CAAC;CAC/E;CAED,MAAM,SAAS,gBAAgB;AAE/B,KAAI,OAAO,WAAW,GAAG;AACvB,SAAO;GAAE,QAAQ;GAAsB;EAAU;CAClD;AAED,UAAS,MAAM,QAAQ,OAAO,OAAO,uBAAuB,aAAa,GAAG;AAG5E,OAAM,OAA0B;EAC9B,MAAM;EACN,MAAM;GACJ,QAAQ,OAAO,IAAI,CAAC,WAAW,EAC7B,OAAO,MAAM,KACd,GAAE;GACH,gBAAgB;EACjB;CACF,EAAC;CAGF,MAAM,cAAc,MAAM,OAA0B;EAClD,MAAM;EACN,MAAM;GACJ,QAAQ,OAAO,IAAI,CAAC,WAAW,EAC7B,OAAO,MAAM,KACd,GAAE;GACH,gBAAgB;EACjB;CACF,EAAC;AAEF,MAAK,YAAY,IAAI;AACnB,QAAM,IAAI,OAAO,0BAA0B,KAAK,UAAU,YAAY,KAAK,CAAC;CAC7E;AAED,UAAS,MAAM,uBAAuB,OAAO,OAAO,SAAS;AAE7D,QAAO;EAAE,QAAQ;EAAoB;CAAU;AAChD;;;;;;;ACnED,MAAa,sBAAsB,EAAE,OAAO;CAC1C,UAAU;CACV,aAAa,6BAA6B,UAAU;CACpD,aAAa,EAAE,QAAQ;CACvB,OAAO,EAAE,KAAK;EAAC;EAAW;EAAe;EAAY;EAAY;EAAkB;CAAS,EAAC,CAAC,UAAU;AACzG,EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4DF,SAAgB,mBACdC,SACAC,eACAC,QAIA;AACA,eAAc;CACd,MAAM,mBAAmB,SAAS,qBAAqB,QAAQ;CAC/D,MAAM,UAAU,iBAAwB;CACxC,MAAM,UAAU,IAAI,IAAI,iBAAiB,UAAU,UAAU;AAE7D,QAAO;EACL,QAAQ,IAAI,cAAc,SAAS;GACjC,GAAG;GACH,SAAS,cAAc,eAAe,SAAS;IAC7C,gBAAgB,iBAAiB;IACjC,yBAAyB,iBAAiB;GAC3C,EAAC;GACF,OAAQ,SAAS,cAAc,QAAQ,UAAU,MAAM,GAAG;EAC3D;EACD;CACD;AACF;;;;;;;;;;;;;;;;;;;;;;;;AAyBD,SAAgB,2BAA2BF,SAAwBE,QAAiB;AAClF,eAAc;CACd,MAAM,mBAAmB,SAAS,qBAAqB,QAAQ;CAC/D,MAAM,UAAU,4BAA4B,QAAQ,UAAU,cAAc;CAC5E,MAAM,gBAAgB,IAAI,KAAK,EAAE,QAAQ,eAAe,UAAU;CAClE,MAAM,gBAAgB,SAAS,cAAc,QAAQ,UAAU,MAAM,GAAG;AAExE,QAAO,OAAUC,UAAqD;EACpE,MAAM,WAAW,MAAM,cAAc,eAAe;GAClD,QAAQ;GACR,SAAS,cACP,EAAE,gBAAgB,mBAAoB,GACtC;IACE,gBAAgB,iBAAiB;IACjC,yBAAyB,iBAAiB;GAC3C,EACF;GACD,MAAM,KAAK,UAAU,MAAM;EAC5B,EAAC;AAEF,OAAK,SAAS,IAAI;AAChB,UAAO;IAAE,IAAI;IAAO,MAAO,MAAM,SAAS,MAAM;GAAQ;EACzD;AAED,SAAO;GAAE,IAAI;GAAM,MAAO,MAAM,SAAS,MAAM;EAAQ;CACxD;AACF"}
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.4.1-prb370c72b",
4
+ "version": "2.4.1-prb593b885",
5
5
  "type": "module",
6
6
  "private": false,
7
7
  "license": "FSL-1.1-MIT",
@@ -66,9 +66,9 @@
66
66
  },
67
67
  "dependencies": {
68
68
  "gql.tada": "^1",
69
- "@settlemint/sdk-utils": "2.4.1-prb370c72b",
69
+ "@settlemint/sdk-utils": "2.4.1-prb593b885",
70
70
  "graphql-request": "^7",
71
- "zod": "^3.25.0",
71
+ "zod": "^4.0.0",
72
72
  "drizzle-orm": "^0.44.0",
73
73
  "pg": "^8",
74
74
  "drizzle-kit": "^0.31.0"