@0xobelisk/graphql-client 1.2.0-pre.44 → 1.2.0-pre.46
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/dist/client.d.ts +4 -0
- package/dist/index.js +28 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +28 -7
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/src/client.ts +39 -13
package/dist/client.d.ts
CHANGED
|
@@ -189,6 +189,10 @@ export declare class DubheGraphqlClient {
|
|
|
189
189
|
* Process data for a single table
|
|
190
190
|
*/
|
|
191
191
|
private processTableData;
|
|
192
|
+
/**
|
|
193
|
+
* Find table info with multiple lookup strategies
|
|
194
|
+
*/
|
|
195
|
+
private findTableInfo;
|
|
192
196
|
/**
|
|
193
197
|
* Get table field information
|
|
194
198
|
*/
|
package/dist/index.js
CHANGED
|
@@ -1440,7 +1440,7 @@ var DubheGraphqlClient = class {
|
|
|
1440
1440
|
* Process data for a single table
|
|
1441
1441
|
*/
|
|
1442
1442
|
processTableData(tableName, tableData, enums) {
|
|
1443
|
-
const
|
|
1443
|
+
const normalizedTableName = tableName.includes("_") ? this.toCamelCase(tableName) : tableName;
|
|
1444
1444
|
const fields = [];
|
|
1445
1445
|
const enumFields = {};
|
|
1446
1446
|
if (tableData.fields && Array.isArray(tableData.fields)) {
|
|
@@ -1458,14 +1458,35 @@ var DubheGraphqlClient = class {
|
|
|
1458
1458
|
(key) => this.toCamelCase(key)
|
|
1459
1459
|
);
|
|
1460
1460
|
const tableInfo = {
|
|
1461
|
-
tableName:
|
|
1461
|
+
tableName: normalizedTableName,
|
|
1462
1462
|
fields: [...new Set(fields)],
|
|
1463
1463
|
// Remove duplicates
|
|
1464
1464
|
primaryKeys,
|
|
1465
1465
|
enumFields
|
|
1466
1466
|
};
|
|
1467
|
-
this.parsedTables.set(
|
|
1468
|
-
this.parsedTables.set(
|
|
1467
|
+
this.parsedTables.set(tableName, tableInfo);
|
|
1468
|
+
this.parsedTables.set(normalizedTableName, tableInfo);
|
|
1469
|
+
if (tableName !== normalizedTableName) {
|
|
1470
|
+
this.parsedTables.set(this.toSnakeCase(normalizedTableName), tableInfo);
|
|
1471
|
+
}
|
|
1472
|
+
}
|
|
1473
|
+
/**
|
|
1474
|
+
* Find table info with multiple lookup strategies
|
|
1475
|
+
*/
|
|
1476
|
+
findTableInfo(tableName) {
|
|
1477
|
+
let tableInfo = this.parsedTables.get(tableName);
|
|
1478
|
+
if (tableInfo)
|
|
1479
|
+
return tableInfo;
|
|
1480
|
+
const camelCaseTableName = this.toCamelCase(tableName);
|
|
1481
|
+
tableInfo = this.parsedTables.get(camelCaseTableName);
|
|
1482
|
+
if (tableInfo)
|
|
1483
|
+
return tableInfo;
|
|
1484
|
+
if (tableName.includes("_")) {
|
|
1485
|
+
tableInfo = this.parsedTables.get(tableName.toLowerCase());
|
|
1486
|
+
if (tableInfo)
|
|
1487
|
+
return tableInfo;
|
|
1488
|
+
}
|
|
1489
|
+
return void 0;
|
|
1469
1490
|
}
|
|
1470
1491
|
/**
|
|
1471
1492
|
* Get table field information
|
|
@@ -1477,14 +1498,14 @@ var DubheGraphqlClient = class {
|
|
|
1477
1498
|
* Get table primary key information
|
|
1478
1499
|
*/
|
|
1479
1500
|
getTablePrimaryKeys(tableName) {
|
|
1480
|
-
const tableInfo = this.
|
|
1501
|
+
const tableInfo = this.findTableInfo(tableName);
|
|
1481
1502
|
return tableInfo?.primaryKeys || [];
|
|
1482
1503
|
}
|
|
1483
1504
|
/**
|
|
1484
1505
|
* Get table enum field information
|
|
1485
1506
|
*/
|
|
1486
1507
|
getTableEnumFields(tableName) {
|
|
1487
|
-
const tableInfo = this.
|
|
1508
|
+
const tableInfo = this.findTableInfo(tableName);
|
|
1488
1509
|
return tableInfo?.enumFields || {};
|
|
1489
1510
|
}
|
|
1490
1511
|
/**
|
|
@@ -1497,7 +1518,7 @@ var DubheGraphqlClient = class {
|
|
|
1497
1518
|
* Get table's minimal field set (for fallback)
|
|
1498
1519
|
*/
|
|
1499
1520
|
getMinimalFields(tableName) {
|
|
1500
|
-
const tableInfo = this.
|
|
1521
|
+
const tableInfo = this.findTableInfo(tableName);
|
|
1501
1522
|
if (tableInfo) {
|
|
1502
1523
|
return tableInfo.fields;
|
|
1503
1524
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/client.ts","../../../node_modules/.pnpm/graphql-ws@6.0.5_graphql@15.10.1_ws@8.18.2/node_modules/graphql-ws/dist/common-CGW11Fyb.js","../../../node_modules/.pnpm/graphql-ws@6.0.5_graphql@15.10.1_ws@8.18.2/node_modules/graphql-ws/dist/client.js","../../../node_modules/.pnpm/graphql-ws@6.0.5_graphql@15.10.1_ws@8.18.2/node_modules/graphql-ws/dist/index.js"],"sourcesContent":["export {\n DubheGraphqlClient,\n createDubheGraphqlClient,\n QueryBuilders,\n} from './client';\nexport * from './types';\nexport type * from './types';\n","import {\n ApolloClient,\n InMemoryCache,\n gql,\n createHttpLink,\n split,\n NormalizedCacheObject,\n WatchQueryOptions,\n QueryOptions as ApolloQueryOptions,\n SubscriptionOptions as ApolloSubscriptionOptions,\n Observable,\n from,\n ApolloLink,\n FetchPolicy,\n OperationVariables,\n} from '@apollo/client';\nimport { RetryLink } from '@apollo/client/link/retry';\nimport { GraphQLWsLink } from '@apollo/client/link/subscriptions';\nimport { getMainDefinition } from '@apollo/client/utilities';\nimport { createClient } from 'graphql-ws';\nimport pluralize from 'pluralize';\n\nimport {\n DubheClientConfig,\n Connection,\n BaseQueryParams,\n OrderBy,\n JsonPathOrder,\n QueryOptions,\n QueryResult,\n SubscriptionResult,\n SubscriptionOptions,\n StringFilter,\n NumberFilter,\n DateFilter,\n StoreTableRow,\n TypedDocumentNode,\n CachePolicy,\n MultiTableSubscriptionConfig,\n MultiTableSubscriptionResult,\n MultiTableSubscriptionData,\n ParsedTableInfo,\n DubheMetadata,\n} from './types';\n\n// Convert cache policy type\nfunction mapCachePolicyToFetchPolicy(cachePolicy: CachePolicy): FetchPolicy {\n switch (cachePolicy) {\n case 'cache-first':\n return 'cache-first';\n case 'network-only':\n return 'network-only';\n case 'cache-only':\n return 'cache-only';\n case 'no-cache':\n return 'no-cache';\n case 'standby':\n return 'standby';\n default:\n return 'cache-first';\n }\n}\n\nexport class DubheGraphqlClient {\n private apolloClient: ApolloClient<NormalizedCacheObject>;\n private subscriptionClient?: any;\n private dubheMetadata?: DubheMetadata;\n private parsedTables: Map<string, ParsedTableInfo> = new Map();\n\n constructor(config: DubheClientConfig) {\n // Save dubhe metadata\n this.dubheMetadata = config.dubheMetadata;\n\n // If dubhe metadata is provided, parse table information\n if (this.dubheMetadata) {\n this.parseTableInfoFromConfig();\n }\n\n // Create HTTP Link\n const httpLink = createHttpLink({\n uri: config.endpoint,\n headers: config.headers,\n fetch: (input, init) => fetch(input, { ...config.fetchOptions, ...init }),\n });\n\n // Create retry link\n const retryLink = new RetryLink({\n delay: {\n // Initial retry delay time (milliseconds)\n initial: config.retryOptions?.delay?.initial || 300,\n // Maximum retry delay time (milliseconds)\n max: config.retryOptions?.delay?.max || 5000,\n // Whether to add random jitter to avoid thundering herd, enabled by default\n jitter: config.retryOptions?.delay?.jitter !== false,\n },\n attempts: {\n // Maximum number of attempts (including initial request)\n max: config.retryOptions?.attempts?.max || 5,\n // Custom retry condition function\n retryIf:\n config.retryOptions?.attempts?.retryIf ||\n ((error, _operation) => {\n // Default retry strategy:\n // 1. Network connection errors\n // 2. Server errors but no GraphQL errors (indicates service temporarily unavailable)\n return Boolean(\n error &&\n (error.networkError ||\n (error.graphQLErrors && error.graphQLErrors.length === 0))\n );\n }),\n },\n });\n\n // Combine HTTP link and retry link\n const httpWithRetryLink = from([retryLink, httpLink]);\n\n let link: ApolloLink = httpWithRetryLink;\n\n // If subscription endpoint is provided, create WebSocket Link\n if (config.subscriptionEndpoint) {\n // Automatically import ws module in Node.js environment\n let webSocketImpl;\n try {\n // Check if in Node.js environment\n if (typeof window === 'undefined' && typeof global !== 'undefined') {\n // Node.js environment, need to import ws\n const wsModule = require('ws');\n webSocketImpl = wsModule.default || wsModule;\n\n // Set global WebSocket in Node.js environment to avoid apollo client internal errors\n if (typeof (global as any).WebSocket === 'undefined') {\n (global as any).WebSocket = webSocketImpl;\n }\n } else {\n // Browser environment, use native WebSocket\n webSocketImpl = WebSocket;\n }\n } catch (error) {\n // Ignore ws import errors\n }\n\n const clientOptions: any = {\n url: config.subscriptionEndpoint,\n connectionParams: {\n headers: config.headers,\n },\n };\n\n // Only add webSocketImpl if in Node.js environment and ws was successfully imported\n if (webSocketImpl && typeof window === 'undefined') {\n clientOptions.webSocketImpl = webSocketImpl;\n }\n\n this.subscriptionClient = createClient(clientOptions);\n\n const wsLink = new GraphQLWsLink(this.subscriptionClient);\n\n // Use split to decide which link to use\n link = split(\n ({ query }) => {\n const definition = getMainDefinition(query);\n return (\n definition.kind === 'OperationDefinition' &&\n definition.operation === 'subscription'\n );\n },\n wsLink,\n httpWithRetryLink\n );\n }\n\n // Create Apollo Client instance\n this.apolloClient = new ApolloClient({\n link,\n cache:\n config.cacheConfig?.paginatedTables &&\n config.cacheConfig.paginatedTables.length > 0\n ? new InMemoryCache({\n typePolicies: {\n // Configure cache strategy for Connection type\n Query: {\n fields: this.buildCacheFields(config.cacheConfig),\n },\n },\n })\n : new InMemoryCache(), // Use simple cache by default\n defaultOptions: {\n watchQuery: {\n errorPolicy: 'all',\n notifyOnNetworkStatusChange: true,\n },\n query: {\n errorPolicy: 'all',\n },\n },\n });\n }\n\n /**\n * Execute GraphQL query\n */\n async query<\n TData,\n TVariables extends OperationVariables = OperationVariables,\n >(\n query: TypedDocumentNode<TData, TVariables>,\n variables?: TVariables,\n options?: QueryOptions\n ): Promise<QueryResult<TData>> {\n try {\n const result = await this.apolloClient.query({\n query,\n variables,\n fetchPolicy: options?.cachePolicy\n ? mapCachePolicyToFetchPolicy(options.cachePolicy)\n : 'no-cache',\n // : 'cache-first',\n notifyOnNetworkStatusChange: options?.notifyOnNetworkStatusChange,\n pollInterval: options?.pollInterval,\n });\n\n return {\n data: result.data,\n loading: result.loading,\n error: result.error,\n networkStatus: result.networkStatus,\n refetch: () => this.query(query, variables, options),\n };\n } catch (error) {\n return {\n data: undefined,\n loading: false,\n error: error as Error,\n networkStatus: 8, // NetworkStatus.error\n refetch: () => this.query(query, variables, options),\n };\n }\n }\n\n /**\n * Execute GraphQL subscription\n */\n subscribe<TData, TVariables extends OperationVariables = OperationVariables>(\n subscription: TypedDocumentNode<TData, TVariables>,\n variables?: TVariables,\n options?: SubscriptionOptions\n ): Observable<SubscriptionResult<TData>> {\n return new Observable((observer: any) => {\n const sub = this.apolloClient\n .subscribe({\n query: subscription,\n variables,\n })\n .subscribe({\n next: (result: any) => {\n const subscriptionResult: SubscriptionResult<TData> = {\n data: result.data,\n loading: false,\n error: result.errors?.[0] as Error,\n };\n observer.next(subscriptionResult);\n options?.onData?.(result.data);\n },\n error: (error: any) => {\n const subscriptionResult: SubscriptionResult<TData> = {\n data: undefined,\n loading: false,\n error,\n };\n observer.next(subscriptionResult);\n options?.onError?.(error);\n },\n complete: () => {\n observer.complete();\n options?.onComplete?.();\n },\n });\n\n return () => sub.unsubscribe();\n });\n }\n\n /**\n * Query all table data - Adapted to API without store prefix\n *\n * OrderBy field name support:\n * - camelCase: { field: 'updatedAt', direction: 'DESC' } → UPDATED_AT_DESC\n * - snake_case: { field: 'updated_at', direction: 'DESC' } → UPDATED_AT_DESC\n *\n * Usage examples:\n * ```ts\n * // Using camelCase field names\n * const result = await client.getAllTables('account', {\n * orderBy: [{ field: 'updatedAt', direction: 'DESC' }]\n * });\n *\n * // Using snake_case field names\n * const result = await client.getAllTables('account', {\n * orderBy: [{ field: 'updated_at', direction: 'DESC' }]\n * });\n *\n * // Mixed usage\n * const result = await client.getAllTables('account', {\n * orderBy: [\n * { field: 'updatedAt', direction: 'DESC' },\n * { field: 'created_at', direction: 'ASC' }\n * ]\n * });\n * ```\n */\n async getAllTables<T extends StoreTableRow>(\n tableName: string,\n params?: BaseQueryParams & {\n filter?: Record<string, any>;\n orderBy?: OrderBy[];\n fields?: string[]; // Allow users to specify fields to query, auto-parse from dubhe config if not specified\n }\n ): Promise<Connection<T>> {\n // Ensure using plural form of table name\n const pluralTableName = this.getPluralTableName(tableName);\n\n // Convert OrderBy to enum values\n const orderByEnums = convertOrderByToEnum(params?.orderBy);\n\n // Dynamically build query\n const query = gql`\n query GetAllTables(\n $first: Int\n $last: Int\n $after: Cursor\n $before: Cursor\n $filter: ${this.getFilterTypeName(tableName)}\n $orderBy: [${this.getOrderByTypeName(tableName)}!]\n ) {\n ${pluralTableName}(\n first: $first\n last: $last\n after: $after\n before: $before\n filter: $filter\n orderBy: $orderBy\n ) {\n totalCount\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n edges {\n cursor\n node {\n ${this.convertTableFields(tableName, params?.fields)}\n }\n }\n }\n }\n `;\n\n // Build query parameters using enum values\n const queryParams = {\n first: params?.first,\n last: params?.last,\n after: params?.after,\n before: params?.before,\n filter: params?.filter,\n orderBy: orderByEnums,\n };\n\n // const result = await this.query(query, queryParams, {\n // cachePolicy: 'no-cache',\n // });\n\n const result = await this.query(query, queryParams);\n\n if (result.error) {\n throw result.error;\n }\n\n return (\n (result.data as any)?.[pluralTableName] || {\n edges: [],\n pageInfo: { hasNextPage: false, hasPreviousPage: false },\n }\n );\n }\n\n /**\n * Get single table record by condition - Adapted to API without store prefix\n */\n async getTableByCondition<T extends StoreTableRow>(\n tableName: string,\n condition: Record<string, any>,\n fields?: string[] // Allow users to specify fields to query\n ): Promise<T | null> {\n // Build query field name, e.g.: accountByAssetIdAndAccount\n const conditionKeys = Object.keys(condition);\n\n // Use singular form of table name for single record query\n const singularTableName = this.getSingularTableName(tableName);\n\n const query = gql`\n query GetTableByCondition(${conditionKeys.map((key, index) => `$${key}: String!`).join(', ')}) {\n ${singularTableName}(${conditionKeys.map((key) => `${key}: $${key}`).join(', ')}) {\n ${this.convertTableFields(tableName, fields)}\n }\n }\n `;\n\n const result = await this.query(query, condition);\n\n if (result.error) {\n throw result.error;\n }\n\n return (result.data as any)?.[singularTableName] || null;\n }\n\n /**\n * Subscribe to table data changes - Using PostGraphile's listen subscription feature\n */\n subscribeToTableChanges<T extends StoreTableRow>(\n tableName: string,\n options?: SubscriptionOptions & {\n fields?: string[]; // Allow users to specify fields to subscribe to\n initialEvent?: boolean; // Whether to trigger initial event immediately\n first?: number; // Limit the number of returned records\n topicPrefix?: string; // Custom topic prefix, defaults to table name\n }\n ): Observable<SubscriptionResult<{ listen: { query: any } }>> {\n // PostGraphile automatically adds 'postgraphile:' prefix to all topics\n // So here we use more concise topic naming\n const topic = options?.topicPrefix\n ? `${options.topicPrefix}${tableName}`\n : `store_${this.getSingularTableName(tableName)}`;\n\n const pluralTableName = this.getPluralTableName(tableName); // Ensure using plural form\n const fields = this.convertTableFields(tableName, options?.fields);\n\n const subscription = gql`\n subscription ListenToTableChanges($topic: String!, $initialEvent: Boolean) {\n listen(topic: $topic, initialEvent: $initialEvent) {\n query {\n ${pluralTableName}(first: ${options?.first || 10}, orderBy: UPDATED_AT_DESC) {\n totalCount\n nodes {\n ${fields}\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n }\n }\n `;\n\n return this.subscribe(\n subscription,\n {\n topic,\n initialEvent: options?.initialEvent || false,\n },\n options\n );\n }\n\n /**\n * Advanced listen subscription - Support custom queries\n */\n subscribeWithListen<T = any>(\n topic: string,\n query: string,\n options?: SubscriptionOptions & {\n initialEvent?: boolean;\n variables?: Record<string, any>;\n }\n ): Observable<SubscriptionResult<{ listen: { query: T } }>> {\n const subscription = gql`\n subscription CustomListenSubscription($topic: String!, $initialEvent: Boolean) {\n listen(topic: $topic, initialEvent: $initialEvent) {\n query {\n ${query}\n }\n }\n }\n `;\n\n return this.subscribe(\n subscription,\n {\n topic,\n initialEvent: options?.initialEvent || false,\n ...options?.variables,\n },\n options\n );\n }\n\n /**\n * Subscribe to data changes with specific conditions\n */\n subscribeToFilteredTableChanges<T extends StoreTableRow>(\n tableName: string,\n filter?: Record<string, any>,\n options?: SubscriptionOptions & {\n fields?: string[];\n initialEvent?: boolean;\n orderBy?: OrderBy[];\n first?: number;\n topicPrefix?: string; // Custom topic prefix\n }\n ): Observable<SubscriptionResult<{ listen: { query: any } }>> {\n // Improved topic naming, support custom prefix\n const topic = options?.topicPrefix\n ? `${options.topicPrefix}${tableName}`\n : `store_${this.getSingularTableName(tableName)}`;\n\n const pluralTableName = this.getPluralTableName(tableName); // Ensure using plural form\n const fields = this.convertTableFields(tableName, options?.fields);\n const orderByEnum = convertOrderByToEnum(options?.orderBy);\n const first = options?.first || 10;\n\n const subscription = gql`\n subscription FilteredListenSubscription(\n $topic: String!, \n $initialEvent: Boolean,\n $filter: ${this.getFilterTypeName(tableName)},\n $orderBy: [${this.getOrderByTypeName(tableName)}!],\n $first: Int\n ) {\n listen(topic: $topic, initialEvent: $initialEvent) {\n query {\n ${pluralTableName}(\n first: $first, \n filter: $filter, \n orderBy: $orderBy\n ) {\n totalCount\n nodes {\n ${fields}\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n }\n }\n `;\n\n return this.subscribe(\n subscription,\n {\n topic,\n initialEvent: options?.initialEvent || false,\n filter,\n orderBy: orderByEnum,\n first,\n },\n options\n );\n }\n\n /**\n * Subscribe to multiple table data changes - Support batch subscription of table name list\n */\n subscribeToMultipleTables<T extends StoreTableRow>(\n tableConfigs: MultiTableSubscriptionConfig[],\n globalOptions?: SubscriptionOptions\n ): Observable<MultiTableSubscriptionData> {\n return new Observable((observer: any) => {\n const subscriptions: Array<{ tableName: string; subscription: any }> = [];\n const latestData: MultiTableSubscriptionData = {};\n\n // Create independent subscription for each table\n tableConfigs.forEach(({ tableName, options }) => {\n const subscription = this.subscribeToFilteredTableChanges<T>(\n tableName,\n options?.filter,\n {\n ...options,\n onData: (data) => {\n // Update latest data for this table\n latestData[tableName] = data;\n\n // Call table-level callback\n if (options?.onData) {\n options.onData(data);\n }\n\n // Call global callback\n if (globalOptions?.onData) {\n globalOptions.onData(latestData);\n }\n\n // Send complete multi-table data\n observer.next({ ...latestData });\n },\n onError: (error) => {\n // Call table-level error callback\n if (options?.onError) {\n options.onError(error);\n }\n\n // Call global error callback\n if (globalOptions?.onError) {\n globalOptions.onError(error);\n }\n\n // Send error\n observer.error(error);\n },\n }\n );\n\n subscriptions.push({ tableName, subscription });\n });\n\n // Start all subscriptions\n const activeSubscriptions = subscriptions.map(({ subscription }) =>\n subscription.subscribe()\n );\n\n // Return cleanup function\n return () => {\n activeSubscriptions.forEach((sub) => sub.unsubscribe());\n\n // Call completion callback\n if (globalOptions?.onComplete) {\n globalOptions.onComplete();\n }\n };\n });\n }\n\n /**\n * Simplified multi-table subscription - Support table name array and unified configuration\n */\n subscribeToTableList<T extends StoreTableRow>(\n tableNames: string[],\n options?: SubscriptionOptions & {\n fields?: string[];\n filter?: Record<string, any>;\n initialEvent?: boolean;\n first?: number;\n topicPrefix?: string;\n }\n ): Observable<MultiTableSubscriptionData> {\n const tableConfigs: MultiTableSubscriptionConfig[] = tableNames.map(\n (tableName) => ({\n tableName,\n options: {\n ...options,\n // Use same configuration for each table\n fields: options?.fields,\n filter: options?.filter,\n initialEvent: options?.initialEvent,\n first: options?.first,\n topicPrefix: options?.topicPrefix,\n },\n })\n );\n\n return this.subscribeToMultipleTables<T>(tableConfigs, options);\n }\n\n /**\n * Build dynamic query - Adapted to API without store prefix\n */\n buildQuery(\n tableName: string,\n fields: string[],\n params?: {\n filter?: Record<string, any>;\n orderBy?: OrderBy[];\n first?: number;\n after?: string;\n }\n ): TypedDocumentNode {\n const pluralTableName = this.getPluralTableName(tableName); // Ensure using plural form\n const fieldSelection = fields.join('\\n ');\n\n return gql`\n query DynamicQuery(\n $first: Int\n $after: Cursor\n $filter: ${this.getFilterTypeName(tableName)}\n $orderBy: [${this.getOrderByTypeName(tableName)}!]\n ) {\n ${pluralTableName}(\n first: $first\n after: $after\n filter: $filter\n orderBy: $orderBy\n ) {\n totalCount\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n ${fieldSelection}\n }\n }\n }\n }\n `;\n }\n\n /**\n * Batch query multiple tables - Adapted to API without store prefix\n */\n async batchQuery<T extends Record<string, any>>(\n queries: Array<{\n key: string;\n tableName: string;\n params?: BaseQueryParams & {\n filter?: Record<string, any>;\n orderBy?: OrderBy[];\n fields?: string[]; // Allow users to specify fields to query\n };\n }>\n ): Promise<Record<string, Connection<StoreTableRow>>> {\n const batchPromises = queries.map(async ({ key, tableName, params }) => {\n const result = await this.getAllTables(tableName, params);\n return { key, result };\n });\n\n const results = await Promise.all(batchPromises);\n\n return results.reduce(\n (acc, { key, result }) => {\n acc[key] = result;\n return acc;\n },\n {} as Record<string, Connection<StoreTableRow>>\n );\n }\n\n /**\n * Real-time data stream listener - Adapted to API without store prefix\n */\n createRealTimeDataStream<T extends StoreTableRow>(\n tableName: string,\n initialQuery?: BaseQueryParams & { filter?: Record<string, any> }\n ): Observable<Connection<T>> {\n return new Observable((observer: any) => {\n // First execute initial query\n this.getAllTables<T>(tableName, initialQuery)\n .then((initialData) => {\n observer.next(initialData);\n })\n .catch((error) => observer.error(error));\n\n // Then subscribe to real-time updates\n const subscription = this.subscribeToTableChanges<T>(tableName, {\n onData: () => {\n // When data changes, re-execute query\n this.getAllTables<T>(tableName, initialQuery)\n .then((updatedData) => {\n observer.next(updatedData);\n })\n .catch((error) => observer.error(error));\n },\n onError: (error) => observer.error(error),\n });\n\n return () => subscription.subscribe().unsubscribe();\n });\n }\n\n // Improved table name handling methods\n private getFilterTypeName(tableName: string): string {\n // Convert to singular form and apply PascalCase conversion\n const singularName = this.getSingularTableName(tableName);\n const pascalCaseName = this.toPascalCase(singularName);\n\n // If already starts with Store, don't add Store prefix again\n if (pascalCaseName.startsWith('Store')) {\n return `${pascalCaseName}Filter`;\n }\n\n return `Store${pascalCaseName}Filter`;\n }\n\n private getOrderByTypeName(tableName: string): string {\n // Convert to plural form and apply PascalCase conversion\n const pluralName = this.getPluralTableName(tableName);\n const pascalCaseName = this.toPascalCase(pluralName);\n\n // If already starts with Store, don't add Store prefix again\n if (pascalCaseName.startsWith('Store')) {\n return `${pascalCaseName}OrderBy`;\n }\n\n return `Store${pascalCaseName}OrderBy`;\n }\n\n /**\n * Convert singular table name to plural form (using pluralize library for correctness)\n */\n private getPluralTableName(tableName: string): string {\n // First convert to camelCase\n const camelCaseName = this.toCamelCase(tableName);\n\n // Use pluralize library for pluralization\n return pluralize.plural(camelCaseName);\n }\n\n /**\n * Convert plural table name to singular form (using pluralize library for correctness)\n */\n private getSingularTableName(tableName: string): string {\n // First convert to camelCase\n const camelCaseName = this.toCamelCase(tableName);\n\n // Use pluralize library for singularization\n return pluralize.singular(camelCaseName);\n }\n\n /**\n * Convert snake_case to camelCase\n */\n private toCamelCase(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n }\n\n /**\n * Convert snake_case to PascalCase\n */\n private toPascalCase(str: string): string {\n const camelCase = this.toCamelCase(str);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n }\n\n /**\n * Convert camelCase or snake_case to SNAKE_CASE (for GraphQL enum values)\n * Example: updatedAt -> UPDATED_AT, updated_at -> UPDATED_AT\n */\n private toSnakeCase(str: string): string {\n // If already snake_case, convert to uppercase directly\n if (str.includes('_')) {\n return str.toUpperCase();\n }\n\n // If camelCase, first convert to snake_case then uppercase\n return str\n .replace(/([A-Z])/g, '_$1') // Add underscore before uppercase letters\n .toLowerCase() // Convert to lowercase\n .replace(/^_/, '') // Remove leading underscore\n .toUpperCase(); // Convert to uppercase\n }\n\n // private buildSingleQueryName(\n // tableName: string,\n // conditionKeys: string[]\n // ): string {\n // // Use camelCase conversion\n // const camelCaseTableName = this.toCamelCase(tableName);\n // const capitalizedKeys = conditionKeys.map(\n // (key) => key.charAt(0).toUpperCase() + key.slice(1)\n // );\n // return `${camelCaseTableName}By${capitalizedKeys.join('And')}`;\n // }\n\n /**\n * Clear Apollo Client cache\n */\n async clearCache(): Promise<void> {\n await this.apolloClient.clearStore();\n }\n\n /**\n * Reset Apollo Client cache\n */\n async resetCache(): Promise<void> {\n await this.apolloClient.resetStore();\n }\n\n /**\n * Get Apollo Client instance (for advanced usage)\n */\n getApolloClient(): ApolloClient<NormalizedCacheObject> {\n return this.apolloClient;\n }\n\n /**\n * Close client connection\n */\n close(): void {\n if (this.subscriptionClient) {\n this.subscriptionClient.dispose();\n }\n }\n\n /**\n * Get Dubhe metadata\n */\n getDubheMetadata(): DubheMetadata | undefined {\n return this.dubheMetadata;\n }\n\n /**\n * Build dynamic cache field configuration\n */\n private buildCacheFields(\n cacheConfig?: DubheClientConfig['cacheConfig']\n ): Record<string, any> {\n const fields: Record<string, any> = {};\n\n // If no configuration, return empty field configuration\n if (!cacheConfig) {\n return fields;\n }\n\n // Create pagination cache strategy for each configured table\n if (cacheConfig.paginatedTables) {\n cacheConfig.paginatedTables.forEach((tableName) => {\n // Ensure using plural form of table name\n const pluralTableName = this.getPluralTableName(tableName);\n\n // Check if there's a custom merge strategy\n const customStrategy =\n cacheConfig.customMergeStrategies?.[pluralTableName];\n\n fields[pluralTableName] = {\n keyArgs: customStrategy?.keyArgs || ['filter', 'orderBy'],\n merge: customStrategy?.merge || this.defaultMergeStrategy,\n };\n });\n }\n\n // Apply custom merge strategies (if any)\n if (cacheConfig.customMergeStrategies) {\n Object.entries(cacheConfig.customMergeStrategies).forEach(\n ([tableName, strategy]) => {\n // If table name hasn't been configured yet, add it\n if (!fields[tableName]) {\n fields[tableName] = {\n keyArgs: strategy.keyArgs || ['filter', 'orderBy'],\n merge: strategy.merge || this.defaultMergeStrategy,\n };\n }\n }\n );\n }\n\n return fields;\n }\n\n /**\n * Default pagination merge strategy\n */\n private defaultMergeStrategy(existing = { edges: [] }, incoming: any) {\n // Safety check, ensure incoming has edges property\n if (!incoming || !Array.isArray(incoming.edges)) {\n return existing;\n }\n return {\n ...incoming,\n edges: [...(existing.edges || []), ...incoming.edges],\n };\n }\n\n /**\n * Parse table information from dubhe metadata\n */\n private parseTableInfoFromConfig(): void {\n if (!this.dubheMetadata) {\n return;\n }\n\n const { components = [], resources = [], enums = [] } = this.dubheMetadata;\n\n // Process components array\n components.forEach((componentObj: any) => {\n Object.entries(componentObj).forEach(\n ([componentName, componentData]: [string, any]) => {\n this.processTableData(componentName, componentData, enums);\n }\n );\n });\n\n // Process resources array\n resources.forEach((resourceObj: any) => {\n Object.entries(resourceObj).forEach(\n ([resourceName, resourceData]: [string, any]) => {\n this.processTableData(resourceName, resourceData, enums);\n }\n );\n });\n }\n\n /**\n * Process data for a single table\n */\n private processTableData(\n tableName: string,\n tableData: any,\n enums: any[]\n ): void {\n const snakeTableName = this.toSnakeCase(tableName);\n const fields: string[] = [];\n const enumFields: Record<string, string[]> = {};\n\n // Process fields array\n if (tableData.fields && Array.isArray(tableData.fields)) {\n tableData.fields.forEach((fieldObj: any) => {\n Object.entries(fieldObj).forEach(\n ([fieldName, fieldType]: [string, any]) => {\n const fieldNameCamelCase = this.toCamelCase(fieldName);\n fields.push(fieldNameCamelCase);\n // Check if it's an enum type\n // const typeStr = String(fieldType);\n // if (enums.length > 0) {\n // // Process enum types as needed here\n // // enumFields[fieldNameCamelCase] = [...];\n // }\n }\n );\n });\n }\n\n // Add system fields\n fields.push('createdAt', 'updatedAt');\n\n // Process primary keys\n const primaryKeys: string[] = tableData.keys.map((key: string) =>\n this.toCamelCase(key)\n );\n\n const tableInfo: ParsedTableInfo = {\n tableName: snakeTableName,\n fields: [...new Set(fields)], // Remove duplicates\n primaryKeys,\n enumFields,\n };\n\n this.parsedTables.set(snakeTableName, tableInfo);\n this.parsedTables.set(this.toCamelCase(snakeTableName), tableInfo);\n }\n\n /**\n * Get table field information\n */\n getTableFields(tableName: string): string[] {\n // Use getMinimalFields directly for clearer logic\n return this.getMinimalFields(tableName);\n }\n\n /**\n * Get table primary key information\n */\n getTablePrimaryKeys(tableName: string): string[] {\n const tableInfo =\n this.parsedTables.get(tableName) ||\n this.parsedTables.get(this.toSnakeCase(tableName));\n return tableInfo?.primaryKeys || [];\n }\n\n /**\n * Get table enum field information\n */\n getTableEnumFields(tableName: string): Record<string, string[]> {\n const tableInfo =\n this.parsedTables.get(tableName) ||\n this.parsedTables.get(this.toSnakeCase(tableName));\n return tableInfo?.enumFields || {};\n }\n\n /**\n * Get all parsed table information\n */\n getAllTableInfo(): Map<string, ParsedTableInfo> {\n return new Map(this.parsedTables);\n }\n\n /**\n * Get table's minimal field set (for fallback)\n */\n getMinimalFields(tableName: string): string[] {\n // If there's configuration, use fields from configuration\n const tableInfo =\n this.parsedTables.get(tableName) ||\n this.parsedTables.get(this.toSnakeCase(tableName));\n\n if (tableInfo) {\n return tableInfo.fields;\n }\n\n return ['createdAt', 'updatedAt'];\n }\n\n /**\n * Convert table fields to GraphQL query string\n */\n private convertTableFields(\n tableName: string,\n customFields?: string[]\n ): string {\n let fields: string[];\n\n if (customFields && customFields.length > 0) {\n fields = customFields;\n } else {\n // Try to get fields from dubhe configuration\n const autoFields = this.getTableFields(tableName);\n if (autoFields.length > 0) {\n fields = autoFields;\n } else {\n fields = ['createdAt', 'updatedAt'];\n }\n }\n\n // Field resolution debug logging disabled for cleaner output\n\n return fields.join('\\n ');\n }\n}\n\n// Export convenience function\nexport function createDubheGraphqlClient(\n config: DubheClientConfig\n): DubheGraphqlClient {\n return new DubheGraphqlClient(config);\n}\n\n// Export common GraphQL query builders\nexport const QueryBuilders = {\n // Build basic query - Adapted to API without store prefix\n basic: (\n tableName: string,\n fields: string[] = ['createdAt', 'updatedAt']\n ) => gql`\n query Basic${tableName.charAt(0).toUpperCase() + tableName.slice(1)}Query(\n $first: Int\n $after: String\n $filter: ${tableName.charAt(0).toUpperCase() + tableName.slice(1)}Filter\n ) {\n ${tableName}(first: $first, after: $after, filter: $filter) {\n totalCount\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n ${fields.join('\\n ')}\n }\n }\n }\n }\n `,\n\n // Build subscription query - Adapted to API without store prefix\n subscription: (tableName: string) => gql`\n subscription ${tableName.charAt(0).toUpperCase() + tableName.slice(1)}Subscription {\n ${tableName.charAt(0).toLowerCase() + tableName.slice(1)}Changed {\n createdAt\n updatedAt\n }\n }\n `,\n};\n\n/**\n * Helper function: Convert OrderBy format\n * Support camelCase and snake_case field names conversion to GraphQL enum values\n * Example: updatedAt -> UPDATED_AT_ASC, updated_at -> UPDATED_AT_ASC\n */\nfunction convertOrderByToEnum(orderBy?: OrderBy[]): string[] {\n if (!orderBy || orderBy.length === 0) {\n return ['NATURAL'];\n }\n\n return orderBy.map((order) => {\n // Use unified conversion function to handle field names\n const field = toSnakeCaseForEnum(order.field);\n const direction = order.direction === 'DESC' ? 'DESC' : 'ASC';\n\n // Combine field name and direction into enum value\n return `${field}_${direction}`;\n });\n}\n\n/**\n * Convert camelCase or snake_case to SNAKE_CASE (for GraphQL enum values)\n * Example: updatedAt -> UPDATED_AT, updated_at -> UPDATED_AT\n */\nfunction toSnakeCaseForEnum(str: string): string {\n // If already snake_case, convert to uppercase directly\n if (str.includes('_')) {\n return str.toUpperCase();\n }\n\n // If camelCase, first convert to snake_case then uppercase\n return str\n .replace(/([A-Z])/g, '_$1') // Add underscore before uppercase letters\n .toLowerCase() // Convert to lowercase\n .replace(/^_/, '') // Remove leading underscore\n .toUpperCase(); // Convert to uppercase\n}\n","function extendedTypeof(val) {\n if (val === null) {\n return \"null\";\n }\n if (Array.isArray(val)) {\n return \"array\";\n }\n return typeof val;\n}\nfunction isObject(val) {\n return extendedTypeof(val) === \"object\";\n}\nfunction isAsyncIterable(val) {\n return typeof Object(val)[Symbol.asyncIterator] === \"function\";\n}\nfunction isAsyncGenerator(val) {\n return isObject(val) && typeof Object(val)[Symbol.asyncIterator] === \"function\" && typeof val.return === \"function\";\n}\nfunction areGraphQLFormattedErrors(obj) {\n return Array.isArray(obj) && // must be at least one error\n obj.length > 0 && // error has at least a message\n obj.every((ob) => \"message\" in ob);\n}\nfunction limitCloseReason(reason, whenTooLong) {\n return reason.length < 124 ? reason : whenTooLong;\n}\n\nconst GRAPHQL_TRANSPORT_WS_PROTOCOL = \"graphql-transport-ws\";\nconst DEPRECATED_GRAPHQL_WS_PROTOCOL = \"graphql-ws\";\nvar CloseCode = /* @__PURE__ */ ((CloseCode2) => {\n CloseCode2[CloseCode2[\"InternalServerError\"] = 4500] = \"InternalServerError\";\n CloseCode2[CloseCode2[\"InternalClientError\"] = 4005] = \"InternalClientError\";\n CloseCode2[CloseCode2[\"BadRequest\"] = 4400] = \"BadRequest\";\n CloseCode2[CloseCode2[\"BadResponse\"] = 4004] = \"BadResponse\";\n CloseCode2[CloseCode2[\"Unauthorized\"] = 4401] = \"Unauthorized\";\n CloseCode2[CloseCode2[\"Forbidden\"] = 4403] = \"Forbidden\";\n CloseCode2[CloseCode2[\"SubprotocolNotAcceptable\"] = 4406] = \"SubprotocolNotAcceptable\";\n CloseCode2[CloseCode2[\"ConnectionInitialisationTimeout\"] = 4408] = \"ConnectionInitialisationTimeout\";\n CloseCode2[CloseCode2[\"ConnectionAcknowledgementTimeout\"] = 4504] = \"ConnectionAcknowledgementTimeout\";\n CloseCode2[CloseCode2[\"SubscriberAlreadyExists\"] = 4409] = \"SubscriberAlreadyExists\";\n CloseCode2[CloseCode2[\"TooManyInitialisationRequests\"] = 4429] = \"TooManyInitialisationRequests\";\n return CloseCode2;\n})(CloseCode || {});\nvar MessageType = /* @__PURE__ */ ((MessageType2) => {\n MessageType2[\"ConnectionInit\"] = \"connection_init\";\n MessageType2[\"ConnectionAck\"] = \"connection_ack\";\n MessageType2[\"Ping\"] = \"ping\";\n MessageType2[\"Pong\"] = \"pong\";\n MessageType2[\"Subscribe\"] = \"subscribe\";\n MessageType2[\"Next\"] = \"next\";\n MessageType2[\"Error\"] = \"error\";\n MessageType2[\"Complete\"] = \"complete\";\n return MessageType2;\n})(MessageType || {});\nfunction validateMessage(val) {\n if (!isObject(val)) {\n throw new Error(\n `Message is expected to be an object, but got ${extendedTypeof(val)}`\n );\n }\n if (!val.type) {\n throw new Error(`Message is missing the 'type' property`);\n }\n if (typeof val.type !== \"string\") {\n throw new Error(\n `Message is expects the 'type' property to be a string, but got ${extendedTypeof(\n val.type\n )}`\n );\n }\n switch (val.type) {\n case \"connection_init\" /* ConnectionInit */:\n case \"connection_ack\" /* ConnectionAck */:\n case \"ping\" /* Ping */:\n case \"pong\" /* Pong */: {\n if (val.payload != null && !isObject(val.payload)) {\n throw new Error(\n `\"${val.type}\" message expects the 'payload' property to be an object or nullish or missing, but got \"${val.payload}\"`\n );\n }\n break;\n }\n case \"subscribe\" /* Subscribe */: {\n if (typeof val.id !== \"string\") {\n throw new Error(\n `\"${val.type}\" message expects the 'id' property to be a string, but got ${extendedTypeof(\n val.id\n )}`\n );\n }\n if (!val.id) {\n throw new Error(\n `\"${val.type}\" message requires a non-empty 'id' property`\n );\n }\n if (!isObject(val.payload)) {\n throw new Error(\n `\"${val.type}\" message expects the 'payload' property to be an object, but got ${extendedTypeof(\n val.payload\n )}`\n );\n }\n if (typeof val.payload.query !== \"string\") {\n throw new Error(\n `\"${val.type}\" message payload expects the 'query' property to be a string, but got ${extendedTypeof(\n val.payload.query\n )}`\n );\n }\n if (val.payload.variables != null && !isObject(val.payload.variables)) {\n throw new Error(\n `\"${val.type}\" message payload expects the 'variables' property to be a an object or nullish or missing, but got ${extendedTypeof(\n val.payload.variables\n )}`\n );\n }\n if (val.payload.operationName != null && extendedTypeof(val.payload.operationName) !== \"string\") {\n throw new Error(\n `\"${val.type}\" message payload expects the 'operationName' property to be a string or nullish or missing, but got ${extendedTypeof(\n val.payload.operationName\n )}`\n );\n }\n if (val.payload.extensions != null && !isObject(val.payload.extensions)) {\n throw new Error(\n `\"${val.type}\" message payload expects the 'extensions' property to be a an object or nullish or missing, but got ${extendedTypeof(\n val.payload.extensions\n )}`\n );\n }\n break;\n }\n case \"next\" /* Next */: {\n if (typeof val.id !== \"string\") {\n throw new Error(\n `\"${val.type}\" message expects the 'id' property to be a string, but got ${extendedTypeof(\n val.id\n )}`\n );\n }\n if (!val.id) {\n throw new Error(\n `\"${val.type}\" message requires a non-empty 'id' property`\n );\n }\n if (!isObject(val.payload)) {\n throw new Error(\n `\"${val.type}\" message expects the 'payload' property to be an object, but got ${extendedTypeof(\n val.payload\n )}`\n );\n }\n break;\n }\n case \"error\" /* Error */: {\n if (typeof val.id !== \"string\") {\n throw new Error(\n `\"${val.type}\" message expects the 'id' property to be a string, but got ${extendedTypeof(\n val.id\n )}`\n );\n }\n if (!val.id) {\n throw new Error(\n `\"${val.type}\" message requires a non-empty 'id' property`\n );\n }\n if (!areGraphQLFormattedErrors(val.payload)) {\n throw new Error(\n `\"${val.type}\" message expects the 'payload' property to be an array of GraphQL errors, but got ${JSON.stringify(\n val.payload\n )}`\n );\n }\n break;\n }\n case \"complete\" /* Complete */: {\n if (typeof val.id !== \"string\") {\n throw new Error(\n `\"${val.type}\" message expects the 'id' property to be a string, but got ${extendedTypeof(\n val.id\n )}`\n );\n }\n if (!val.id) {\n throw new Error(\n `\"${val.type}\" message requires a non-empty 'id' property`\n );\n }\n break;\n }\n default:\n throw new Error(`Invalid message 'type' property \"${val.type}\"`);\n }\n return val;\n}\nfunction parseMessage(data, reviver) {\n return validateMessage(\n typeof data === \"string\" ? JSON.parse(data, reviver) : data\n );\n}\nfunction stringifyMessage(msg, replacer) {\n validateMessage(msg);\n return JSON.stringify(msg, replacer);\n}\n\nexport { CloseCode as C, DEPRECATED_GRAPHQL_WS_PROTOCOL as D, GRAPHQL_TRANSPORT_WS_PROTOCOL as G, MessageType as M, isAsyncGenerator as a, isAsyncIterable as b, isObject as i, limitCloseReason as l, parseMessage as p, stringifyMessage as s, validateMessage as v };\n","import { G as GRAPHQL_TRANSPORT_WS_PROTOCOL, s as stringifyMessage, M as MessageType, C as CloseCode, l as limitCloseReason, p as parseMessage, i as isObject } from './common-CGW11Fyb.js';\nexport { D as DEPRECATED_GRAPHQL_WS_PROTOCOL, v as validateMessage } from './common-CGW11Fyb.js';\n\nfunction createClient(options) {\n const {\n url,\n connectionParams,\n lazy = true,\n onNonLazyError = console.error,\n lazyCloseTimeout: lazyCloseTimeoutMs = 0,\n keepAlive = 0,\n disablePong,\n connectionAckWaitTimeout = 0,\n retryAttempts = 5,\n retryWait = async function randomisedExponentialBackoff(retries2) {\n const retryDelaySeconds = Math.pow(2, retries2);\n await new Promise(\n (resolve) => setTimeout(\n resolve,\n retryDelaySeconds * 1e3 + // add random timeout from 300ms to 3s\n Math.floor(Math.random() * (3e3 - 300) + 300)\n )\n );\n },\n shouldRetry = isLikeCloseEvent,\n on,\n webSocketImpl,\n /**\n * Generates a v4 UUID to be used as the ID using `Math`\n * as the random number generator. Supply your own generator\n * in case you need more uniqueness.\n *\n * Reference: https://gist.github.com/jed/982883\n */\n generateID = function generateUUID() {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0, v = c == \"x\" ? r : r & 3 | 8;\n return v.toString(16);\n });\n },\n jsonMessageReplacer: replacer,\n jsonMessageReviver: reviver\n } = options;\n let ws;\n if (webSocketImpl) {\n if (!isWebSocket(webSocketImpl)) {\n throw new Error(\"Invalid WebSocket implementation provided\");\n }\n ws = webSocketImpl;\n } else if (typeof WebSocket !== \"undefined\") {\n ws = WebSocket;\n } else if (typeof global !== \"undefined\") {\n ws = global.WebSocket || // @ts-expect-error: Support more browsers\n global.MozWebSocket;\n } else if (typeof window !== \"undefined\") {\n ws = window.WebSocket || // @ts-expect-error: Support more browsers\n window.MozWebSocket;\n }\n if (!ws)\n throw new Error(\n \"WebSocket implementation missing; on Node you can `import WebSocket from 'ws';` and pass `webSocketImpl: WebSocket` to `createClient`\"\n );\n const WebSocketImpl = ws;\n const emitter = (() => {\n const message = /* @__PURE__ */ (() => {\n const listeners2 = {};\n return {\n on(id, listener) {\n listeners2[id] = listener;\n return () => {\n delete listeners2[id];\n };\n },\n emit(message2) {\n if (\"id\" in message2) listeners2[message2.id]?.(message2);\n }\n };\n })();\n const listeners = {\n connecting: on?.connecting ? [on.connecting] : [],\n opened: on?.opened ? [on.opened] : [],\n connected: on?.connected ? [on.connected] : [],\n ping: on?.ping ? [on.ping] : [],\n pong: on?.pong ? [on.pong] : [],\n message: on?.message ? [message.emit, on.message] : [message.emit],\n closed: on?.closed ? [on.closed] : [],\n error: on?.error ? [on.error] : []\n };\n return {\n onMessage: message.on,\n on(event, listener) {\n const l = listeners[event];\n l.push(listener);\n return () => {\n l.splice(l.indexOf(listener), 1);\n };\n },\n emit(event, ...args) {\n for (const listener of [...listeners[event]]) {\n listener(...args);\n }\n }\n };\n })();\n function errorOrClosed(cb) {\n const listening = [\n // errors are fatal and more critical than close events, throw them first\n emitter.on(\"error\", (err) => {\n listening.forEach((unlisten) => unlisten());\n cb(err);\n }),\n // closes can be graceful and not fatal, throw them second (if error didnt throw)\n emitter.on(\"closed\", (event) => {\n listening.forEach((unlisten) => unlisten());\n cb(event);\n })\n ];\n }\n let connecting, locks = 0, lazyCloseTimeout, retrying = false, retries = 0, disposed = false;\n async function connect() {\n clearTimeout(lazyCloseTimeout);\n const [socket, throwOnClose] = await (connecting ?? (connecting = new Promise(\n (connected, denied) => (async () => {\n if (retrying) {\n await retryWait(retries);\n if (!locks) {\n connecting = undefined;\n return denied({ code: 1e3, reason: \"All Subscriptions Gone\" });\n }\n retries++;\n }\n emitter.emit(\"connecting\", retrying);\n const socket2 = new WebSocketImpl(\n typeof url === \"function\" ? await url() : url,\n GRAPHQL_TRANSPORT_WS_PROTOCOL\n );\n let connectionAckTimeout, queuedPing;\n function enqueuePing() {\n if (isFinite(keepAlive) && keepAlive > 0) {\n clearTimeout(queuedPing);\n queuedPing = setTimeout(() => {\n if (socket2.readyState === WebSocketImpl.OPEN) {\n socket2.send(stringifyMessage({ type: MessageType.Ping }));\n emitter.emit(\"ping\", false, undefined);\n }\n }, keepAlive);\n }\n }\n errorOrClosed((errOrEvent) => {\n connecting = undefined;\n clearTimeout(connectionAckTimeout);\n clearTimeout(queuedPing);\n denied(errOrEvent);\n if (errOrEvent instanceof TerminatedCloseEvent) {\n socket2.close(4499, \"Terminated\");\n socket2.onerror = null;\n socket2.onclose = null;\n }\n });\n socket2.onerror = (err) => emitter.emit(\"error\", err);\n socket2.onclose = (event) => emitter.emit(\"closed\", event);\n socket2.onopen = async () => {\n try {\n emitter.emit(\"opened\", socket2);\n const payload = typeof connectionParams === \"function\" ? await connectionParams() : connectionParams;\n if (socket2.readyState !== WebSocketImpl.OPEN) return;\n socket2.send(\n stringifyMessage(\n payload ? {\n type: MessageType.ConnectionInit,\n payload\n } : {\n type: MessageType.ConnectionInit\n // payload is completely absent if not provided\n },\n replacer\n )\n );\n if (isFinite(connectionAckWaitTimeout) && connectionAckWaitTimeout > 0) {\n connectionAckTimeout = setTimeout(() => {\n socket2.close(\n CloseCode.ConnectionAcknowledgementTimeout,\n \"Connection acknowledgement timeout\"\n );\n }, connectionAckWaitTimeout);\n }\n enqueuePing();\n } catch (err) {\n emitter.emit(\"error\", err);\n socket2.close(\n CloseCode.InternalClientError,\n limitCloseReason(\n err instanceof Error ? err.message : String(err),\n \"Internal client error\"\n )\n );\n }\n };\n let acknowledged = false;\n socket2.onmessage = ({ data }) => {\n try {\n const message = parseMessage(data, reviver);\n emitter.emit(\"message\", message);\n if (message.type === \"ping\" || message.type === \"pong\") {\n emitter.emit(message.type, true, message.payload);\n if (message.type === \"pong\") {\n enqueuePing();\n } else if (!disablePong) {\n socket2.send(\n stringifyMessage(\n message.payload ? {\n type: MessageType.Pong,\n payload: message.payload\n } : {\n type: MessageType.Pong\n // payload is completely absent if not provided\n }\n )\n );\n emitter.emit(\"pong\", false, message.payload);\n }\n return;\n }\n if (acknowledged) return;\n if (message.type !== MessageType.ConnectionAck)\n throw new Error(\n `First message cannot be of type ${message.type}`\n );\n clearTimeout(connectionAckTimeout);\n acknowledged = true;\n emitter.emit(\"connected\", socket2, message.payload, retrying);\n retrying = false;\n retries = 0;\n connected([\n socket2,\n new Promise((_, reject) => errorOrClosed(reject))\n ]);\n } catch (err) {\n socket2.onmessage = null;\n emitter.emit(\"error\", err);\n socket2.close(\n CloseCode.BadResponse,\n limitCloseReason(\n err instanceof Error ? err.message : String(err),\n \"Bad response\"\n )\n );\n }\n };\n })()\n )));\n if (socket.readyState === WebSocketImpl.CLOSING) await throwOnClose;\n let release = () => {\n };\n const released = new Promise((resolve) => release = resolve);\n return [\n socket,\n release,\n Promise.race([\n // wait for\n released.then(() => {\n if (!locks) {\n const complete = () => socket.close(1e3, \"Normal Closure\");\n if (isFinite(lazyCloseTimeoutMs) && lazyCloseTimeoutMs > 0) {\n lazyCloseTimeout = setTimeout(() => {\n if (socket.readyState === WebSocketImpl.OPEN) complete();\n }, lazyCloseTimeoutMs);\n } else {\n complete();\n }\n }\n }),\n // or\n throwOnClose\n ])\n ];\n }\n function shouldRetryConnectOrThrow(errOrCloseEvent) {\n if (isLikeCloseEvent(errOrCloseEvent) && (isFatalInternalCloseCode(errOrCloseEvent.code) || [\n CloseCode.InternalServerError,\n CloseCode.InternalClientError,\n CloseCode.BadRequest,\n CloseCode.BadResponse,\n CloseCode.Unauthorized,\n // CloseCode.Forbidden, might grant access out after retry\n CloseCode.SubprotocolNotAcceptable,\n // CloseCode.ConnectionInitialisationTimeout, might not time out after retry\n // CloseCode.ConnectionAcknowledgementTimeout, might not time out after retry\n CloseCode.SubscriberAlreadyExists,\n CloseCode.TooManyInitialisationRequests\n // 4499, // Terminated, probably because the socket froze, we want to retry\n ].includes(errOrCloseEvent.code)))\n throw errOrCloseEvent;\n if (disposed) return false;\n if (isLikeCloseEvent(errOrCloseEvent) && errOrCloseEvent.code === 1e3)\n return locks > 0;\n if (!retryAttempts || retries >= retryAttempts) throw errOrCloseEvent;\n if (!shouldRetry(errOrCloseEvent)) throw errOrCloseEvent;\n return retrying = true;\n }\n if (!lazy) {\n (async () => {\n locks++;\n for (; ; ) {\n try {\n const [, , throwOnClose] = await connect();\n await throwOnClose;\n } catch (errOrCloseEvent) {\n try {\n if (!shouldRetryConnectOrThrow(errOrCloseEvent)) return;\n } catch (errOrCloseEvent2) {\n return onNonLazyError?.(errOrCloseEvent2);\n }\n }\n }\n })();\n }\n function subscribe(payload, sink) {\n const id = generateID(payload);\n let done = false, errored = false, releaser = () => {\n locks--;\n done = true;\n };\n (async () => {\n locks++;\n for (; ; ) {\n try {\n const [socket, release, waitForReleaseOrThrowOnClose] = await connect();\n if (done) return release();\n const unlisten = emitter.onMessage(id, (message) => {\n switch (message.type) {\n case MessageType.Next: {\n sink.next(message.payload);\n return;\n }\n case MessageType.Error: {\n errored = true, done = true;\n sink.error(message.payload);\n releaser();\n return;\n }\n case MessageType.Complete: {\n done = true;\n releaser();\n return;\n }\n }\n });\n socket.send(\n stringifyMessage(\n {\n id,\n type: MessageType.Subscribe,\n payload\n },\n replacer\n )\n );\n releaser = () => {\n if (!done && socket.readyState === WebSocketImpl.OPEN)\n socket.send(\n stringifyMessage(\n {\n id,\n type: MessageType.Complete\n },\n replacer\n )\n );\n locks--;\n done = true;\n release();\n };\n await waitForReleaseOrThrowOnClose.finally(unlisten);\n return;\n } catch (errOrCloseEvent) {\n if (!shouldRetryConnectOrThrow(errOrCloseEvent)) return;\n }\n }\n })().then(() => {\n if (!errored) sink.complete();\n }).catch((err) => {\n sink.error(err);\n });\n return () => {\n if (!done) releaser();\n };\n }\n return {\n on: emitter.on,\n subscribe,\n iterate(request) {\n const pending = [];\n const deferred = {\n done: false,\n error: null,\n resolve: () => {\n }\n };\n const dispose = subscribe(request, {\n next(val) {\n pending.push(val);\n deferred.resolve();\n },\n error(err) {\n deferred.done = true;\n deferred.error = err;\n deferred.resolve();\n },\n complete() {\n deferred.done = true;\n deferred.resolve();\n }\n });\n const iterator = async function* iterator2() {\n for (; ; ) {\n if (!pending.length) {\n await new Promise((resolve) => deferred.resolve = resolve);\n }\n while (pending.length) {\n yield pending.shift();\n }\n if (deferred.error) {\n throw deferred.error;\n }\n if (deferred.done) {\n return;\n }\n }\n }();\n iterator.throw = async (err) => {\n if (!deferred.done) {\n deferred.done = true;\n deferred.error = err;\n deferred.resolve();\n }\n return { done: true, value: undefined };\n };\n iterator.return = async () => {\n dispose();\n return { done: true, value: undefined };\n };\n return iterator;\n },\n async dispose() {\n disposed = true;\n if (connecting) {\n const [socket] = await connecting;\n socket.close(1e3, \"Normal Closure\");\n }\n },\n terminate() {\n if (connecting) {\n emitter.emit(\"closed\", new TerminatedCloseEvent());\n }\n }\n };\n}\nclass TerminatedCloseEvent extends Error {\n name = \"TerminatedCloseEvent\";\n message = \"4499: Terminated\";\n code = 4499;\n reason = \"Terminated\";\n wasClean = false;\n}\nfunction isLikeCloseEvent(val) {\n return isObject(val) && \"code\" in val && \"reason\" in val;\n}\nfunction isFatalInternalCloseCode(code) {\n if ([\n 1e3,\n // Normal Closure is not an erroneous close code\n 1001,\n // Going Away\n 1006,\n // Abnormal Closure\n 1005,\n // No Status Received\n 1012,\n // Service Restart\n 1013,\n // Try Again Later\n 1014\n // Bad Gateway\n ].includes(code))\n return false;\n return code >= 1e3 && code <= 1999;\n}\nfunction isWebSocket(val) {\n return typeof val === \"function\" && \"constructor\" in val && \"CLOSED\" in val && \"CLOSING\" in val && \"CONNECTING\" in val && \"OPEN\" in val;\n}\n\nexport { CloseCode, GRAPHQL_TRANSPORT_WS_PROTOCOL, MessageType, TerminatedCloseEvent, createClient, parseMessage, stringifyMessage };\n","export { TerminatedCloseEvent, createClient } from './client.js';\nexport { a as areGraphQLErrors, h as handleProtocols, m as makeServer } from './server-BN3ZJY-a.js';\nexport { C as CloseCode, D as DEPRECATED_GRAPHQL_WS_PROTOCOL, G as GRAPHQL_TRANSPORT_WS_PROTOCOL, M as MessageType, p as parseMessage, s as stringifyMessage, v as validateMessage } from './common-CGW11Fyb.js';\nimport 'graphql';\n"],"mappings":"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","names":["import_client","pluralize"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/client.ts","../../../node_modules/.pnpm/graphql-ws@6.0.5_graphql@15.10.1_ws@8.18.2/node_modules/graphql-ws/dist/common-CGW11Fyb.js","../../../node_modules/.pnpm/graphql-ws@6.0.5_graphql@15.10.1_ws@8.18.2/node_modules/graphql-ws/dist/client.js","../../../node_modules/.pnpm/graphql-ws@6.0.5_graphql@15.10.1_ws@8.18.2/node_modules/graphql-ws/dist/index.js"],"sourcesContent":["export {\n DubheGraphqlClient,\n createDubheGraphqlClient,\n QueryBuilders,\n} from './client';\nexport * from './types';\nexport type * from './types';\n","import {\n ApolloClient,\n InMemoryCache,\n gql,\n createHttpLink,\n split,\n NormalizedCacheObject,\n WatchQueryOptions,\n QueryOptions as ApolloQueryOptions,\n SubscriptionOptions as ApolloSubscriptionOptions,\n Observable,\n from,\n ApolloLink,\n FetchPolicy,\n OperationVariables,\n} from '@apollo/client';\nimport { RetryLink } from '@apollo/client/link/retry';\nimport { GraphQLWsLink } from '@apollo/client/link/subscriptions';\nimport { getMainDefinition } from '@apollo/client/utilities';\nimport { createClient } from 'graphql-ws';\nimport pluralize from 'pluralize';\n\nimport {\n DubheClientConfig,\n Connection,\n BaseQueryParams,\n OrderBy,\n JsonPathOrder,\n QueryOptions,\n QueryResult,\n SubscriptionResult,\n SubscriptionOptions,\n StringFilter,\n NumberFilter,\n DateFilter,\n StoreTableRow,\n TypedDocumentNode,\n CachePolicy,\n MultiTableSubscriptionConfig,\n MultiTableSubscriptionResult,\n MultiTableSubscriptionData,\n ParsedTableInfo,\n DubheMetadata,\n} from './types';\n\n// Convert cache policy type\nfunction mapCachePolicyToFetchPolicy(cachePolicy: CachePolicy): FetchPolicy {\n switch (cachePolicy) {\n case 'cache-first':\n return 'cache-first';\n case 'network-only':\n return 'network-only';\n case 'cache-only':\n return 'cache-only';\n case 'no-cache':\n return 'no-cache';\n case 'standby':\n return 'standby';\n default:\n return 'cache-first';\n }\n}\n\nexport class DubheGraphqlClient {\n private apolloClient: ApolloClient<NormalizedCacheObject>;\n private subscriptionClient?: any;\n private dubheMetadata?: DubheMetadata;\n private parsedTables: Map<string, ParsedTableInfo> = new Map();\n\n constructor(config: DubheClientConfig) {\n // Save dubhe metadata\n this.dubheMetadata = config.dubheMetadata;\n\n // If dubhe metadata is provided, parse table information\n if (this.dubheMetadata) {\n this.parseTableInfoFromConfig();\n }\n\n // Create HTTP Link\n const httpLink = createHttpLink({\n uri: config.endpoint,\n headers: config.headers,\n fetch: (input, init) => fetch(input, { ...config.fetchOptions, ...init }),\n });\n\n // Create retry link\n const retryLink = new RetryLink({\n delay: {\n // Initial retry delay time (milliseconds)\n initial: config.retryOptions?.delay?.initial || 300,\n // Maximum retry delay time (milliseconds)\n max: config.retryOptions?.delay?.max || 5000,\n // Whether to add random jitter to avoid thundering herd, enabled by default\n jitter: config.retryOptions?.delay?.jitter !== false,\n },\n attempts: {\n // Maximum number of attempts (including initial request)\n max: config.retryOptions?.attempts?.max || 5,\n // Custom retry condition function\n retryIf:\n config.retryOptions?.attempts?.retryIf ||\n ((error, _operation) => {\n // Default retry strategy:\n // 1. Network connection errors\n // 2. Server errors but no GraphQL errors (indicates service temporarily unavailable)\n return Boolean(\n error &&\n (error.networkError ||\n (error.graphQLErrors && error.graphQLErrors.length === 0))\n );\n }),\n },\n });\n\n // Combine HTTP link and retry link\n const httpWithRetryLink = from([retryLink, httpLink]);\n\n let link: ApolloLink = httpWithRetryLink;\n\n // If subscription endpoint is provided, create WebSocket Link\n if (config.subscriptionEndpoint) {\n // Automatically import ws module in Node.js environment\n let webSocketImpl;\n try {\n // Check if in Node.js environment\n if (typeof window === 'undefined' && typeof global !== 'undefined') {\n // Node.js environment, need to import ws\n const wsModule = require('ws');\n webSocketImpl = wsModule.default || wsModule;\n\n // Set global WebSocket in Node.js environment to avoid apollo client internal errors\n if (typeof (global as any).WebSocket === 'undefined') {\n (global as any).WebSocket = webSocketImpl;\n }\n } else {\n // Browser environment, use native WebSocket\n webSocketImpl = WebSocket;\n }\n } catch (error) {\n // Ignore ws import errors\n }\n\n const clientOptions: any = {\n url: config.subscriptionEndpoint,\n connectionParams: {\n headers: config.headers,\n },\n };\n\n // Only add webSocketImpl if in Node.js environment and ws was successfully imported\n if (webSocketImpl && typeof window === 'undefined') {\n clientOptions.webSocketImpl = webSocketImpl;\n }\n\n this.subscriptionClient = createClient(clientOptions);\n\n const wsLink = new GraphQLWsLink(this.subscriptionClient);\n\n // Use split to decide which link to use\n link = split(\n ({ query }) => {\n const definition = getMainDefinition(query);\n return (\n definition.kind === 'OperationDefinition' &&\n definition.operation === 'subscription'\n );\n },\n wsLink,\n httpWithRetryLink\n );\n }\n\n // Create Apollo Client instance\n this.apolloClient = new ApolloClient({\n link,\n cache:\n config.cacheConfig?.paginatedTables &&\n config.cacheConfig.paginatedTables.length > 0\n ? new InMemoryCache({\n typePolicies: {\n // Configure cache strategy for Connection type\n Query: {\n fields: this.buildCacheFields(config.cacheConfig),\n },\n },\n })\n : new InMemoryCache(), // Use simple cache by default\n defaultOptions: {\n watchQuery: {\n errorPolicy: 'all',\n notifyOnNetworkStatusChange: true,\n },\n query: {\n errorPolicy: 'all',\n },\n },\n });\n }\n\n /**\n * Execute GraphQL query\n */\n async query<\n TData,\n TVariables extends OperationVariables = OperationVariables,\n >(\n query: TypedDocumentNode<TData, TVariables>,\n variables?: TVariables,\n options?: QueryOptions\n ): Promise<QueryResult<TData>> {\n try {\n const result = await this.apolloClient.query({\n query,\n variables,\n fetchPolicy: options?.cachePolicy\n ? mapCachePolicyToFetchPolicy(options.cachePolicy)\n : 'no-cache',\n // : 'cache-first',\n notifyOnNetworkStatusChange: options?.notifyOnNetworkStatusChange,\n pollInterval: options?.pollInterval,\n });\n\n return {\n data: result.data,\n loading: result.loading,\n error: result.error,\n networkStatus: result.networkStatus,\n refetch: () => this.query(query, variables, options),\n };\n } catch (error) {\n return {\n data: undefined,\n loading: false,\n error: error as Error,\n networkStatus: 8, // NetworkStatus.error\n refetch: () => this.query(query, variables, options),\n };\n }\n }\n\n /**\n * Execute GraphQL subscription\n */\n subscribe<TData, TVariables extends OperationVariables = OperationVariables>(\n subscription: TypedDocumentNode<TData, TVariables>,\n variables?: TVariables,\n options?: SubscriptionOptions\n ): Observable<SubscriptionResult<TData>> {\n return new Observable((observer: any) => {\n const sub = this.apolloClient\n .subscribe({\n query: subscription,\n variables,\n })\n .subscribe({\n next: (result: any) => {\n const subscriptionResult: SubscriptionResult<TData> = {\n data: result.data,\n loading: false,\n error: result.errors?.[0] as Error,\n };\n observer.next(subscriptionResult);\n options?.onData?.(result.data);\n },\n error: (error: any) => {\n const subscriptionResult: SubscriptionResult<TData> = {\n data: undefined,\n loading: false,\n error,\n };\n observer.next(subscriptionResult);\n options?.onError?.(error);\n },\n complete: () => {\n observer.complete();\n options?.onComplete?.();\n },\n });\n\n return () => sub.unsubscribe();\n });\n }\n\n /**\n * Query all table data - Adapted to API without store prefix\n *\n * OrderBy field name support:\n * - camelCase: { field: 'updatedAt', direction: 'DESC' } → UPDATED_AT_DESC\n * - snake_case: { field: 'updated_at', direction: 'DESC' } → UPDATED_AT_DESC\n *\n * Usage examples:\n * ```ts\n * // Using camelCase field names\n * const result = await client.getAllTables('account', {\n * orderBy: [{ field: 'updatedAt', direction: 'DESC' }]\n * });\n *\n * // Using snake_case field names\n * const result = await client.getAllTables('account', {\n * orderBy: [{ field: 'updated_at', direction: 'DESC' }]\n * });\n *\n * // Mixed usage\n * const result = await client.getAllTables('account', {\n * orderBy: [\n * { field: 'updatedAt', direction: 'DESC' },\n * { field: 'created_at', direction: 'ASC' }\n * ]\n * });\n * ```\n */\n async getAllTables<T extends StoreTableRow>(\n tableName: string,\n params?: BaseQueryParams & {\n filter?: Record<string, any>;\n orderBy?: OrderBy[];\n fields?: string[]; // Allow users to specify fields to query, auto-parse from dubhe config if not specified\n }\n ): Promise<Connection<T>> {\n // Ensure using plural form of table name\n const pluralTableName = this.getPluralTableName(tableName);\n\n // Convert OrderBy to enum values\n const orderByEnums = convertOrderByToEnum(params?.orderBy);\n\n // Dynamically build query\n const query = gql`\n query GetAllTables(\n $first: Int\n $last: Int\n $after: Cursor\n $before: Cursor\n $filter: ${this.getFilterTypeName(tableName)}\n $orderBy: [${this.getOrderByTypeName(tableName)}!]\n ) {\n ${pluralTableName}(\n first: $first\n last: $last\n after: $after\n before: $before\n filter: $filter\n orderBy: $orderBy\n ) {\n totalCount\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n edges {\n cursor\n node {\n ${this.convertTableFields(tableName, params?.fields)}\n }\n }\n }\n }\n `;\n\n // Build query parameters using enum values\n const queryParams = {\n first: params?.first,\n last: params?.last,\n after: params?.after,\n before: params?.before,\n filter: params?.filter,\n orderBy: orderByEnums,\n };\n\n // const result = await this.query(query, queryParams, {\n // cachePolicy: 'no-cache',\n // });\n\n const result = await this.query(query, queryParams);\n\n if (result.error) {\n throw result.error;\n }\n\n return (\n (result.data as any)?.[pluralTableName] || {\n edges: [],\n pageInfo: { hasNextPage: false, hasPreviousPage: false },\n }\n );\n }\n\n /**\n * Get single table record by condition - Adapted to API without store prefix\n */\n async getTableByCondition<T extends StoreTableRow>(\n tableName: string,\n condition: Record<string, any>,\n fields?: string[] // Allow users to specify fields to query\n ): Promise<T | null> {\n // Build query field name, e.g.: accountByAssetIdAndAccount\n const conditionKeys = Object.keys(condition);\n\n // Use singular form of table name for single record query\n const singularTableName = this.getSingularTableName(tableName);\n\n const query = gql`\n query GetTableByCondition(${conditionKeys.map((key, index) => `$${key}: String!`).join(', ')}) {\n ${singularTableName}(${conditionKeys.map((key) => `${key}: $${key}`).join(', ')}) {\n ${this.convertTableFields(tableName, fields)}\n }\n }\n `;\n\n const result = await this.query(query, condition);\n\n if (result.error) {\n throw result.error;\n }\n\n return (result.data as any)?.[singularTableName] || null;\n }\n\n /**\n * Subscribe to table data changes - Using PostGraphile's listen subscription feature\n */\n subscribeToTableChanges<T extends StoreTableRow>(\n tableName: string,\n options?: SubscriptionOptions & {\n fields?: string[]; // Allow users to specify fields to subscribe to\n initialEvent?: boolean; // Whether to trigger initial event immediately\n first?: number; // Limit the number of returned records\n topicPrefix?: string; // Custom topic prefix, defaults to table name\n }\n ): Observable<SubscriptionResult<{ listen: { query: any } }>> {\n // PostGraphile automatically adds 'postgraphile:' prefix to all topics\n // So here we use more concise topic naming\n const topic = options?.topicPrefix\n ? `${options.topicPrefix}${tableName}`\n : `store_${this.getSingularTableName(tableName)}`;\n\n const pluralTableName = this.getPluralTableName(tableName); // Ensure using plural form\n const fields = this.convertTableFields(tableName, options?.fields);\n\n const subscription = gql`\n subscription ListenToTableChanges($topic: String!, $initialEvent: Boolean) {\n listen(topic: $topic, initialEvent: $initialEvent) {\n query {\n ${pluralTableName}(first: ${options?.first || 10}, orderBy: UPDATED_AT_DESC) {\n totalCount\n nodes {\n ${fields}\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n }\n }\n `;\n\n return this.subscribe(\n subscription,\n {\n topic,\n initialEvent: options?.initialEvent || false,\n },\n options\n );\n }\n\n /**\n * Advanced listen subscription - Support custom queries\n */\n subscribeWithListen<T = any>(\n topic: string,\n query: string,\n options?: SubscriptionOptions & {\n initialEvent?: boolean;\n variables?: Record<string, any>;\n }\n ): Observable<SubscriptionResult<{ listen: { query: T } }>> {\n const subscription = gql`\n subscription CustomListenSubscription($topic: String!, $initialEvent: Boolean) {\n listen(topic: $topic, initialEvent: $initialEvent) {\n query {\n ${query}\n }\n }\n }\n `;\n\n return this.subscribe(\n subscription,\n {\n topic,\n initialEvent: options?.initialEvent || false,\n ...options?.variables,\n },\n options\n );\n }\n\n /**\n * Subscribe to data changes with specific conditions\n */\n subscribeToFilteredTableChanges<T extends StoreTableRow>(\n tableName: string,\n filter?: Record<string, any>,\n options?: SubscriptionOptions & {\n fields?: string[];\n initialEvent?: boolean;\n orderBy?: OrderBy[];\n first?: number;\n topicPrefix?: string; // Custom topic prefix\n }\n ): Observable<SubscriptionResult<{ listen: { query: any } }>> {\n // Improved topic naming, support custom prefix\n const topic = options?.topicPrefix\n ? `${options.topicPrefix}${tableName}`\n : `store_${this.getSingularTableName(tableName)}`;\n\n const pluralTableName = this.getPluralTableName(tableName); // Ensure using plural form\n const fields = this.convertTableFields(tableName, options?.fields);\n const orderByEnum = convertOrderByToEnum(options?.orderBy);\n const first = options?.first || 10;\n\n const subscription = gql`\n subscription FilteredListenSubscription(\n $topic: String!, \n $initialEvent: Boolean,\n $filter: ${this.getFilterTypeName(tableName)},\n $orderBy: [${this.getOrderByTypeName(tableName)}!],\n $first: Int\n ) {\n listen(topic: $topic, initialEvent: $initialEvent) {\n query {\n ${pluralTableName}(\n first: $first, \n filter: $filter, \n orderBy: $orderBy\n ) {\n totalCount\n nodes {\n ${fields}\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n }\n }\n `;\n\n return this.subscribe(\n subscription,\n {\n topic,\n initialEvent: options?.initialEvent || false,\n filter,\n orderBy: orderByEnum,\n first,\n },\n options\n );\n }\n\n /**\n * Subscribe to multiple table data changes - Support batch subscription of table name list\n */\n subscribeToMultipleTables<T extends StoreTableRow>(\n tableConfigs: MultiTableSubscriptionConfig[],\n globalOptions?: SubscriptionOptions\n ): Observable<MultiTableSubscriptionData> {\n return new Observable((observer: any) => {\n const subscriptions: Array<{ tableName: string; subscription: any }> = [];\n const latestData: MultiTableSubscriptionData = {};\n\n // Create independent subscription for each table\n tableConfigs.forEach(({ tableName, options }) => {\n const subscription = this.subscribeToFilteredTableChanges<T>(\n tableName,\n options?.filter,\n {\n ...options,\n onData: (data) => {\n // Update latest data for this table\n latestData[tableName] = data;\n\n // Call table-level callback\n if (options?.onData) {\n options.onData(data);\n }\n\n // Call global callback\n if (globalOptions?.onData) {\n globalOptions.onData(latestData);\n }\n\n // Send complete multi-table data\n observer.next({ ...latestData });\n },\n onError: (error) => {\n // Call table-level error callback\n if (options?.onError) {\n options.onError(error);\n }\n\n // Call global error callback\n if (globalOptions?.onError) {\n globalOptions.onError(error);\n }\n\n // Send error\n observer.error(error);\n },\n }\n );\n\n subscriptions.push({ tableName, subscription });\n });\n\n // Start all subscriptions\n const activeSubscriptions = subscriptions.map(({ subscription }) =>\n subscription.subscribe()\n );\n\n // Return cleanup function\n return () => {\n activeSubscriptions.forEach((sub) => sub.unsubscribe());\n\n // Call completion callback\n if (globalOptions?.onComplete) {\n globalOptions.onComplete();\n }\n };\n });\n }\n\n /**\n * Simplified multi-table subscription - Support table name array and unified configuration\n */\n subscribeToTableList<T extends StoreTableRow>(\n tableNames: string[],\n options?: SubscriptionOptions & {\n fields?: string[];\n filter?: Record<string, any>;\n initialEvent?: boolean;\n first?: number;\n topicPrefix?: string;\n }\n ): Observable<MultiTableSubscriptionData> {\n const tableConfigs: MultiTableSubscriptionConfig[] = tableNames.map(\n (tableName) => ({\n tableName,\n options: {\n ...options,\n // Use same configuration for each table\n fields: options?.fields,\n filter: options?.filter,\n initialEvent: options?.initialEvent,\n first: options?.first,\n topicPrefix: options?.topicPrefix,\n },\n })\n );\n\n return this.subscribeToMultipleTables<T>(tableConfigs, options);\n }\n\n /**\n * Build dynamic query - Adapted to API without store prefix\n */\n buildQuery(\n tableName: string,\n fields: string[],\n params?: {\n filter?: Record<string, any>;\n orderBy?: OrderBy[];\n first?: number;\n after?: string;\n }\n ): TypedDocumentNode {\n const pluralTableName = this.getPluralTableName(tableName); // Ensure using plural form\n const fieldSelection = fields.join('\\n ');\n\n return gql`\n query DynamicQuery(\n $first: Int\n $after: Cursor\n $filter: ${this.getFilterTypeName(tableName)}\n $orderBy: [${this.getOrderByTypeName(tableName)}!]\n ) {\n ${pluralTableName}(\n first: $first\n after: $after\n filter: $filter\n orderBy: $orderBy\n ) {\n totalCount\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n ${fieldSelection}\n }\n }\n }\n }\n `;\n }\n\n /**\n * Batch query multiple tables - Adapted to API without store prefix\n */\n async batchQuery<T extends Record<string, any>>(\n queries: Array<{\n key: string;\n tableName: string;\n params?: BaseQueryParams & {\n filter?: Record<string, any>;\n orderBy?: OrderBy[];\n fields?: string[]; // Allow users to specify fields to query\n };\n }>\n ): Promise<Record<string, Connection<StoreTableRow>>> {\n const batchPromises = queries.map(async ({ key, tableName, params }) => {\n const result = await this.getAllTables(tableName, params);\n return { key, result };\n });\n\n const results = await Promise.all(batchPromises);\n\n return results.reduce(\n (acc, { key, result }) => {\n acc[key] = result;\n return acc;\n },\n {} as Record<string, Connection<StoreTableRow>>\n );\n }\n\n /**\n * Real-time data stream listener - Adapted to API without store prefix\n */\n createRealTimeDataStream<T extends StoreTableRow>(\n tableName: string,\n initialQuery?: BaseQueryParams & { filter?: Record<string, any> }\n ): Observable<Connection<T>> {\n return new Observable((observer: any) => {\n // First execute initial query\n this.getAllTables<T>(tableName, initialQuery)\n .then((initialData) => {\n observer.next(initialData);\n })\n .catch((error) => observer.error(error));\n\n // Then subscribe to real-time updates\n const subscription = this.subscribeToTableChanges<T>(tableName, {\n onData: () => {\n // When data changes, re-execute query\n this.getAllTables<T>(tableName, initialQuery)\n .then((updatedData) => {\n observer.next(updatedData);\n })\n .catch((error) => observer.error(error));\n },\n onError: (error) => observer.error(error),\n });\n\n return () => subscription.subscribe().unsubscribe();\n });\n }\n\n // Improved table name handling methods\n private getFilterTypeName(tableName: string): string {\n // Convert to singular form and apply PascalCase conversion\n const singularName = this.getSingularTableName(tableName);\n const pascalCaseName = this.toPascalCase(singularName);\n\n // If already starts with Store, don't add Store prefix again\n if (pascalCaseName.startsWith('Store')) {\n return `${pascalCaseName}Filter`;\n }\n\n return `Store${pascalCaseName}Filter`;\n }\n\n private getOrderByTypeName(tableName: string): string {\n // Convert to plural form and apply PascalCase conversion\n const pluralName = this.getPluralTableName(tableName);\n const pascalCaseName = this.toPascalCase(pluralName);\n\n // If already starts with Store, don't add Store prefix again\n if (pascalCaseName.startsWith('Store')) {\n return `${pascalCaseName}OrderBy`;\n }\n\n return `Store${pascalCaseName}OrderBy`;\n }\n\n /**\n * Convert singular table name to plural form (using pluralize library for correctness)\n */\n private getPluralTableName(tableName: string): string {\n // First convert to camelCase\n const camelCaseName = this.toCamelCase(tableName);\n\n // Use pluralize library for pluralization\n return pluralize.plural(camelCaseName);\n }\n\n /**\n * Convert plural table name to singular form (using pluralize library for correctness)\n */\n private getSingularTableName(tableName: string): string {\n // First convert to camelCase\n const camelCaseName = this.toCamelCase(tableName);\n\n // Use pluralize library for singularization\n return pluralize.singular(camelCaseName);\n }\n\n /**\n * Convert snake_case to camelCase\n */\n private toCamelCase(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n }\n\n /**\n * Convert snake_case to PascalCase\n */\n private toPascalCase(str: string): string {\n const camelCase = this.toCamelCase(str);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n }\n\n /**\n * Convert camelCase or snake_case to SNAKE_CASE (for GraphQL enum values)\n * Example: updatedAt -> UPDATED_AT, updated_at -> UPDATED_AT\n */\n private toSnakeCase(str: string): string {\n // If already snake_case, convert to uppercase directly\n if (str.includes('_')) {\n return str.toUpperCase();\n }\n\n // If camelCase, first convert to snake_case then uppercase\n return str\n .replace(/([A-Z])/g, '_$1') // Add underscore before uppercase letters\n .toLowerCase() // Convert to lowercase\n .replace(/^_/, '') // Remove leading underscore\n .toUpperCase(); // Convert to uppercase\n }\n\n // private buildSingleQueryName(\n // tableName: string,\n // conditionKeys: string[]\n // ): string {\n // // Use camelCase conversion\n // const camelCaseTableName = this.toCamelCase(tableName);\n // const capitalizedKeys = conditionKeys.map(\n // (key) => key.charAt(0).toUpperCase() + key.slice(1)\n // );\n // return `${camelCaseTableName}By${capitalizedKeys.join('And')}`;\n // }\n\n /**\n * Clear Apollo Client cache\n */\n async clearCache(): Promise<void> {\n await this.apolloClient.clearStore();\n }\n\n /**\n * Reset Apollo Client cache\n */\n async resetCache(): Promise<void> {\n await this.apolloClient.resetStore();\n }\n\n /**\n * Get Apollo Client instance (for advanced usage)\n */\n getApolloClient(): ApolloClient<NormalizedCacheObject> {\n return this.apolloClient;\n }\n\n /**\n * Close client connection\n */\n close(): void {\n if (this.subscriptionClient) {\n this.subscriptionClient.dispose();\n }\n }\n\n /**\n * Get Dubhe metadata\n */\n getDubheMetadata(): DubheMetadata | undefined {\n return this.dubheMetadata;\n }\n\n /**\n * Build dynamic cache field configuration\n */\n private buildCacheFields(\n cacheConfig?: DubheClientConfig['cacheConfig']\n ): Record<string, any> {\n const fields: Record<string, any> = {};\n\n // If no configuration, return empty field configuration\n if (!cacheConfig) {\n return fields;\n }\n\n // Create pagination cache strategy for each configured table\n if (cacheConfig.paginatedTables) {\n cacheConfig.paginatedTables.forEach((tableName) => {\n // Ensure using plural form of table name\n const pluralTableName = this.getPluralTableName(tableName);\n\n // Check if there's a custom merge strategy\n const customStrategy =\n cacheConfig.customMergeStrategies?.[pluralTableName];\n\n fields[pluralTableName] = {\n keyArgs: customStrategy?.keyArgs || ['filter', 'orderBy'],\n merge: customStrategy?.merge || this.defaultMergeStrategy,\n };\n });\n }\n\n // Apply custom merge strategies (if any)\n if (cacheConfig.customMergeStrategies) {\n Object.entries(cacheConfig.customMergeStrategies).forEach(\n ([tableName, strategy]) => {\n // If table name hasn't been configured yet, add it\n if (!fields[tableName]) {\n fields[tableName] = {\n keyArgs: strategy.keyArgs || ['filter', 'orderBy'],\n merge: strategy.merge || this.defaultMergeStrategy,\n };\n }\n }\n );\n }\n\n return fields;\n }\n\n /**\n * Default pagination merge strategy\n */\n private defaultMergeStrategy(existing = { edges: [] }, incoming: any) {\n // Safety check, ensure incoming has edges property\n if (!incoming || !Array.isArray(incoming.edges)) {\n return existing;\n }\n return {\n ...incoming,\n edges: [...(existing.edges || []), ...incoming.edges],\n };\n }\n\n /**\n * Parse table information from dubhe metadata\n */\n private parseTableInfoFromConfig(): void {\n if (!this.dubheMetadata) {\n return;\n }\n\n const { components = [], resources = [], enums = [] } = this.dubheMetadata;\n\n // Process components array\n components.forEach((componentObj: any) => {\n Object.entries(componentObj).forEach(\n ([componentName, componentData]: [string, any]) => {\n this.processTableData(componentName, componentData, enums);\n }\n );\n });\n\n // Process resources array\n resources.forEach((resourceObj: any) => {\n Object.entries(resourceObj).forEach(\n ([resourceName, resourceData]: [string, any]) => {\n this.processTableData(resourceName, resourceData, enums);\n }\n );\n });\n }\n\n /**\n * Process data for a single table\n */\n private processTableData(\n tableName: string,\n tableData: any,\n enums: any[]\n ): void {\n // Handle table name: convert to camelCase if it contains underscores, otherwise keep as is\n const normalizedTableName = tableName.includes('_')\n ? this.toCamelCase(tableName)\n : tableName;\n\n const fields: string[] = [];\n const enumFields: Record<string, string[]> = {};\n\n // Process fields array\n if (tableData.fields && Array.isArray(tableData.fields)) {\n tableData.fields.forEach((fieldObj: any) => {\n Object.entries(fieldObj).forEach(\n ([fieldName, fieldType]: [string, any]) => {\n const fieldNameCamelCase = this.toCamelCase(fieldName);\n fields.push(fieldNameCamelCase);\n // Check if it's an enum type\n // const typeStr = String(fieldType);\n // if (enums.length > 0) {\n // // Process enum types as needed here\n // // enumFields[fieldNameCamelCase] = [...];\n // }\n }\n );\n });\n }\n\n // Add system fields\n fields.push('createdAt', 'updatedAt');\n\n // Process primary keys\n const primaryKeys: string[] = tableData.keys.map((key: string) =>\n this.toCamelCase(key)\n );\n\n const tableInfo: ParsedTableInfo = {\n tableName: normalizedTableName,\n fields: [...new Set(fields)], // Remove duplicates\n primaryKeys,\n enumFields,\n };\n\n // Store both original and normalized table names as keys for lookup\n this.parsedTables.set(tableName, tableInfo);\n this.parsedTables.set(normalizedTableName, tableInfo);\n\n // If original and normalized table names are different, also store the snake_case version\n if (tableName !== normalizedTableName) {\n this.parsedTables.set(this.toSnakeCase(normalizedTableName), tableInfo);\n }\n }\n\n /**\n * Find table info with multiple lookup strategies\n */\n private findTableInfo(tableName: string): ParsedTableInfo | undefined {\n // Try direct lookup first\n let tableInfo = this.parsedTables.get(tableName);\n if (tableInfo) return tableInfo;\n\n // Try camelCase version\n const camelCaseTableName = this.toCamelCase(tableName);\n tableInfo = this.parsedTables.get(camelCaseTableName);\n if (tableInfo) return tableInfo;\n\n // Try snake_case version (only if it's different from original)\n if (tableName.includes('_')) {\n tableInfo = this.parsedTables.get(tableName.toLowerCase());\n if (tableInfo) return tableInfo;\n }\n\n return undefined;\n }\n\n /**\n * Get table field information\n */\n getTableFields(tableName: string): string[] {\n // Use getMinimalFields directly for clearer logic\n return this.getMinimalFields(tableName);\n }\n\n /**\n * Get table primary key information\n */\n getTablePrimaryKeys(tableName: string): string[] {\n const tableInfo = this.findTableInfo(tableName);\n return tableInfo?.primaryKeys || [];\n }\n\n /**\n * Get table enum field information\n */\n getTableEnumFields(tableName: string): Record<string, string[]> {\n const tableInfo = this.findTableInfo(tableName);\n return tableInfo?.enumFields || {};\n }\n\n /**\n * Get all parsed table information\n */\n getAllTableInfo(): Map<string, ParsedTableInfo> {\n return new Map(this.parsedTables);\n }\n\n /**\n * Get table's minimal field set (for fallback)\n */\n getMinimalFields(tableName: string): string[] {\n // If there's configuration, use fields from configuration\n const tableInfo = this.findTableInfo(tableName);\n\n if (tableInfo) {\n return tableInfo.fields;\n }\n\n return ['createdAt', 'updatedAt'];\n }\n\n /**\n * Convert table fields to GraphQL query string\n */\n private convertTableFields(\n tableName: string,\n customFields?: string[]\n ): string {\n let fields: string[];\n\n if (customFields && customFields.length > 0) {\n fields = customFields;\n } else {\n // Try to get fields from dubhe configuration\n const autoFields = this.getTableFields(tableName);\n if (autoFields.length > 0) {\n fields = autoFields;\n } else {\n fields = ['createdAt', 'updatedAt'];\n }\n }\n\n // Field resolution debug logging disabled for cleaner output\n\n return fields.join('\\n ');\n }\n}\n\n// Export convenience function\nexport function createDubheGraphqlClient(\n config: DubheClientConfig\n): DubheGraphqlClient {\n return new DubheGraphqlClient(config);\n}\n\n// Export common GraphQL query builders\nexport const QueryBuilders = {\n // Build basic query - Adapted to API without store prefix\n basic: (\n tableName: string,\n fields: string[] = ['createdAt', 'updatedAt']\n ) => gql`\n query Basic${tableName.charAt(0).toUpperCase() + tableName.slice(1)}Query(\n $first: Int\n $after: String\n $filter: ${tableName.charAt(0).toUpperCase() + tableName.slice(1)}Filter\n ) {\n ${tableName}(first: $first, after: $after, filter: $filter) {\n totalCount\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n ${fields.join('\\n ')}\n }\n }\n }\n }\n `,\n\n // Build subscription query - Adapted to API without store prefix\n subscription: (tableName: string) => gql`\n subscription ${tableName.charAt(0).toUpperCase() + tableName.slice(1)}Subscription {\n ${tableName.charAt(0).toLowerCase() + tableName.slice(1)}Changed {\n createdAt\n updatedAt\n }\n }\n `,\n};\n\n/**\n * Helper function: Convert OrderBy format\n * Support camelCase and snake_case field names conversion to GraphQL enum values\n * Example: updatedAt -> UPDATED_AT_ASC, updated_at -> UPDATED_AT_ASC\n */\nfunction convertOrderByToEnum(orderBy?: OrderBy[]): string[] {\n if (!orderBy || orderBy.length === 0) {\n return ['NATURAL'];\n }\n\n return orderBy.map((order) => {\n // Use unified conversion function to handle field names\n const field = toSnakeCaseForEnum(order.field);\n const direction = order.direction === 'DESC' ? 'DESC' : 'ASC';\n\n // Combine field name and direction into enum value\n return `${field}_${direction}`;\n });\n}\n\n/**\n * Convert camelCase or snake_case to SNAKE_CASE (for GraphQL enum values)\n * Example: updatedAt -> UPDATED_AT, updated_at -> UPDATED_AT\n */\nfunction toSnakeCaseForEnum(str: string): string {\n // If already snake_case, convert to uppercase directly\n if (str.includes('_')) {\n return str.toUpperCase();\n }\n\n // If camelCase, first convert to snake_case then uppercase\n return str\n .replace(/([A-Z])/g, '_$1') // Add underscore before uppercase letters\n .toLowerCase() // Convert to lowercase\n .replace(/^_/, '') // Remove leading underscore\n .toUpperCase(); // Convert to uppercase\n}\n","function extendedTypeof(val) {\n if (val === null) {\n return \"null\";\n }\n if (Array.isArray(val)) {\n return \"array\";\n }\n return typeof val;\n}\nfunction isObject(val) {\n return extendedTypeof(val) === \"object\";\n}\nfunction isAsyncIterable(val) {\n return typeof Object(val)[Symbol.asyncIterator] === \"function\";\n}\nfunction isAsyncGenerator(val) {\n return isObject(val) && typeof Object(val)[Symbol.asyncIterator] === \"function\" && typeof val.return === \"function\";\n}\nfunction areGraphQLFormattedErrors(obj) {\n return Array.isArray(obj) && // must be at least one error\n obj.length > 0 && // error has at least a message\n obj.every((ob) => \"message\" in ob);\n}\nfunction limitCloseReason(reason, whenTooLong) {\n return reason.length < 124 ? reason : whenTooLong;\n}\n\nconst GRAPHQL_TRANSPORT_WS_PROTOCOL = \"graphql-transport-ws\";\nconst DEPRECATED_GRAPHQL_WS_PROTOCOL = \"graphql-ws\";\nvar CloseCode = /* @__PURE__ */ ((CloseCode2) => {\n CloseCode2[CloseCode2[\"InternalServerError\"] = 4500] = \"InternalServerError\";\n CloseCode2[CloseCode2[\"InternalClientError\"] = 4005] = \"InternalClientError\";\n CloseCode2[CloseCode2[\"BadRequest\"] = 4400] = \"BadRequest\";\n CloseCode2[CloseCode2[\"BadResponse\"] = 4004] = \"BadResponse\";\n CloseCode2[CloseCode2[\"Unauthorized\"] = 4401] = \"Unauthorized\";\n CloseCode2[CloseCode2[\"Forbidden\"] = 4403] = \"Forbidden\";\n CloseCode2[CloseCode2[\"SubprotocolNotAcceptable\"] = 4406] = \"SubprotocolNotAcceptable\";\n CloseCode2[CloseCode2[\"ConnectionInitialisationTimeout\"] = 4408] = \"ConnectionInitialisationTimeout\";\n CloseCode2[CloseCode2[\"ConnectionAcknowledgementTimeout\"] = 4504] = \"ConnectionAcknowledgementTimeout\";\n CloseCode2[CloseCode2[\"SubscriberAlreadyExists\"] = 4409] = \"SubscriberAlreadyExists\";\n CloseCode2[CloseCode2[\"TooManyInitialisationRequests\"] = 4429] = \"TooManyInitialisationRequests\";\n return CloseCode2;\n})(CloseCode || {});\nvar MessageType = /* @__PURE__ */ ((MessageType2) => {\n MessageType2[\"ConnectionInit\"] = \"connection_init\";\n MessageType2[\"ConnectionAck\"] = \"connection_ack\";\n MessageType2[\"Ping\"] = \"ping\";\n MessageType2[\"Pong\"] = \"pong\";\n MessageType2[\"Subscribe\"] = \"subscribe\";\n MessageType2[\"Next\"] = \"next\";\n MessageType2[\"Error\"] = \"error\";\n MessageType2[\"Complete\"] = \"complete\";\n return MessageType2;\n})(MessageType || {});\nfunction validateMessage(val) {\n if (!isObject(val)) {\n throw new Error(\n `Message is expected to be an object, but got ${extendedTypeof(val)}`\n );\n }\n if (!val.type) {\n throw new Error(`Message is missing the 'type' property`);\n }\n if (typeof val.type !== \"string\") {\n throw new Error(\n `Message is expects the 'type' property to be a string, but got ${extendedTypeof(\n val.type\n )}`\n );\n }\n switch (val.type) {\n case \"connection_init\" /* ConnectionInit */:\n case \"connection_ack\" /* ConnectionAck */:\n case \"ping\" /* Ping */:\n case \"pong\" /* Pong */: {\n if (val.payload != null && !isObject(val.payload)) {\n throw new Error(\n `\"${val.type}\" message expects the 'payload' property to be an object or nullish or missing, but got \"${val.payload}\"`\n );\n }\n break;\n }\n case \"subscribe\" /* Subscribe */: {\n if (typeof val.id !== \"string\") {\n throw new Error(\n `\"${val.type}\" message expects the 'id' property to be a string, but got ${extendedTypeof(\n val.id\n )}`\n );\n }\n if (!val.id) {\n throw new Error(\n `\"${val.type}\" message requires a non-empty 'id' property`\n );\n }\n if (!isObject(val.payload)) {\n throw new Error(\n `\"${val.type}\" message expects the 'payload' property to be an object, but got ${extendedTypeof(\n val.payload\n )}`\n );\n }\n if (typeof val.payload.query !== \"string\") {\n throw new Error(\n `\"${val.type}\" message payload expects the 'query' property to be a string, but got ${extendedTypeof(\n val.payload.query\n )}`\n );\n }\n if (val.payload.variables != null && !isObject(val.payload.variables)) {\n throw new Error(\n `\"${val.type}\" message payload expects the 'variables' property to be a an object or nullish or missing, but got ${extendedTypeof(\n val.payload.variables\n )}`\n );\n }\n if (val.payload.operationName != null && extendedTypeof(val.payload.operationName) !== \"string\") {\n throw new Error(\n `\"${val.type}\" message payload expects the 'operationName' property to be a string or nullish or missing, but got ${extendedTypeof(\n val.payload.operationName\n )}`\n );\n }\n if (val.payload.extensions != null && !isObject(val.payload.extensions)) {\n throw new Error(\n `\"${val.type}\" message payload expects the 'extensions' property to be a an object or nullish or missing, but got ${extendedTypeof(\n val.payload.extensions\n )}`\n );\n }\n break;\n }\n case \"next\" /* Next */: {\n if (typeof val.id !== \"string\") {\n throw new Error(\n `\"${val.type}\" message expects the 'id' property to be a string, but got ${extendedTypeof(\n val.id\n )}`\n );\n }\n if (!val.id) {\n throw new Error(\n `\"${val.type}\" message requires a non-empty 'id' property`\n );\n }\n if (!isObject(val.payload)) {\n throw new Error(\n `\"${val.type}\" message expects the 'payload' property to be an object, but got ${extendedTypeof(\n val.payload\n )}`\n );\n }\n break;\n }\n case \"error\" /* Error */: {\n if (typeof val.id !== \"string\") {\n throw new Error(\n `\"${val.type}\" message expects the 'id' property to be a string, but got ${extendedTypeof(\n val.id\n )}`\n );\n }\n if (!val.id) {\n throw new Error(\n `\"${val.type}\" message requires a non-empty 'id' property`\n );\n }\n if (!areGraphQLFormattedErrors(val.payload)) {\n throw new Error(\n `\"${val.type}\" message expects the 'payload' property to be an array of GraphQL errors, but got ${JSON.stringify(\n val.payload\n )}`\n );\n }\n break;\n }\n case \"complete\" /* Complete */: {\n if (typeof val.id !== \"string\") {\n throw new Error(\n `\"${val.type}\" message expects the 'id' property to be a string, but got ${extendedTypeof(\n val.id\n )}`\n );\n }\n if (!val.id) {\n throw new Error(\n `\"${val.type}\" message requires a non-empty 'id' property`\n );\n }\n break;\n }\n default:\n throw new Error(`Invalid message 'type' property \"${val.type}\"`);\n }\n return val;\n}\nfunction parseMessage(data, reviver) {\n return validateMessage(\n typeof data === \"string\" ? JSON.parse(data, reviver) : data\n );\n}\nfunction stringifyMessage(msg, replacer) {\n validateMessage(msg);\n return JSON.stringify(msg, replacer);\n}\n\nexport { CloseCode as C, DEPRECATED_GRAPHQL_WS_PROTOCOL as D, GRAPHQL_TRANSPORT_WS_PROTOCOL as G, MessageType as M, isAsyncGenerator as a, isAsyncIterable as b, isObject as i, limitCloseReason as l, parseMessage as p, stringifyMessage as s, validateMessage as v };\n","import { G as GRAPHQL_TRANSPORT_WS_PROTOCOL, s as stringifyMessage, M as MessageType, C as CloseCode, l as limitCloseReason, p as parseMessage, i as isObject } from './common-CGW11Fyb.js';\nexport { D as DEPRECATED_GRAPHQL_WS_PROTOCOL, v as validateMessage } from './common-CGW11Fyb.js';\n\nfunction createClient(options) {\n const {\n url,\n connectionParams,\n lazy = true,\n onNonLazyError = console.error,\n lazyCloseTimeout: lazyCloseTimeoutMs = 0,\n keepAlive = 0,\n disablePong,\n connectionAckWaitTimeout = 0,\n retryAttempts = 5,\n retryWait = async function randomisedExponentialBackoff(retries2) {\n const retryDelaySeconds = Math.pow(2, retries2);\n await new Promise(\n (resolve) => setTimeout(\n resolve,\n retryDelaySeconds * 1e3 + // add random timeout from 300ms to 3s\n Math.floor(Math.random() * (3e3 - 300) + 300)\n )\n );\n },\n shouldRetry = isLikeCloseEvent,\n on,\n webSocketImpl,\n /**\n * Generates a v4 UUID to be used as the ID using `Math`\n * as the random number generator. Supply your own generator\n * in case you need more uniqueness.\n *\n * Reference: https://gist.github.com/jed/982883\n */\n generateID = function generateUUID() {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0, v = c == \"x\" ? r : r & 3 | 8;\n return v.toString(16);\n });\n },\n jsonMessageReplacer: replacer,\n jsonMessageReviver: reviver\n } = options;\n let ws;\n if (webSocketImpl) {\n if (!isWebSocket(webSocketImpl)) {\n throw new Error(\"Invalid WebSocket implementation provided\");\n }\n ws = webSocketImpl;\n } else if (typeof WebSocket !== \"undefined\") {\n ws = WebSocket;\n } else if (typeof global !== \"undefined\") {\n ws = global.WebSocket || // @ts-expect-error: Support more browsers\n global.MozWebSocket;\n } else if (typeof window !== \"undefined\") {\n ws = window.WebSocket || // @ts-expect-error: Support more browsers\n window.MozWebSocket;\n }\n if (!ws)\n throw new Error(\n \"WebSocket implementation missing; on Node you can `import WebSocket from 'ws';` and pass `webSocketImpl: WebSocket` to `createClient`\"\n );\n const WebSocketImpl = ws;\n const emitter = (() => {\n const message = /* @__PURE__ */ (() => {\n const listeners2 = {};\n return {\n on(id, listener) {\n listeners2[id] = listener;\n return () => {\n delete listeners2[id];\n };\n },\n emit(message2) {\n if (\"id\" in message2) listeners2[message2.id]?.(message2);\n }\n };\n })();\n const listeners = {\n connecting: on?.connecting ? [on.connecting] : [],\n opened: on?.opened ? [on.opened] : [],\n connected: on?.connected ? [on.connected] : [],\n ping: on?.ping ? [on.ping] : [],\n pong: on?.pong ? [on.pong] : [],\n message: on?.message ? [message.emit, on.message] : [message.emit],\n closed: on?.closed ? [on.closed] : [],\n error: on?.error ? [on.error] : []\n };\n return {\n onMessage: message.on,\n on(event, listener) {\n const l = listeners[event];\n l.push(listener);\n return () => {\n l.splice(l.indexOf(listener), 1);\n };\n },\n emit(event, ...args) {\n for (const listener of [...listeners[event]]) {\n listener(...args);\n }\n }\n };\n })();\n function errorOrClosed(cb) {\n const listening = [\n // errors are fatal and more critical than close events, throw them first\n emitter.on(\"error\", (err) => {\n listening.forEach((unlisten) => unlisten());\n cb(err);\n }),\n // closes can be graceful and not fatal, throw them second (if error didnt throw)\n emitter.on(\"closed\", (event) => {\n listening.forEach((unlisten) => unlisten());\n cb(event);\n })\n ];\n }\n let connecting, locks = 0, lazyCloseTimeout, retrying = false, retries = 0, disposed = false;\n async function connect() {\n clearTimeout(lazyCloseTimeout);\n const [socket, throwOnClose] = await (connecting ?? (connecting = new Promise(\n (connected, denied) => (async () => {\n if (retrying) {\n await retryWait(retries);\n if (!locks) {\n connecting = undefined;\n return denied({ code: 1e3, reason: \"All Subscriptions Gone\" });\n }\n retries++;\n }\n emitter.emit(\"connecting\", retrying);\n const socket2 = new WebSocketImpl(\n typeof url === \"function\" ? await url() : url,\n GRAPHQL_TRANSPORT_WS_PROTOCOL\n );\n let connectionAckTimeout, queuedPing;\n function enqueuePing() {\n if (isFinite(keepAlive) && keepAlive > 0) {\n clearTimeout(queuedPing);\n queuedPing = setTimeout(() => {\n if (socket2.readyState === WebSocketImpl.OPEN) {\n socket2.send(stringifyMessage({ type: MessageType.Ping }));\n emitter.emit(\"ping\", false, undefined);\n }\n }, keepAlive);\n }\n }\n errorOrClosed((errOrEvent) => {\n connecting = undefined;\n clearTimeout(connectionAckTimeout);\n clearTimeout(queuedPing);\n denied(errOrEvent);\n if (errOrEvent instanceof TerminatedCloseEvent) {\n socket2.close(4499, \"Terminated\");\n socket2.onerror = null;\n socket2.onclose = null;\n }\n });\n socket2.onerror = (err) => emitter.emit(\"error\", err);\n socket2.onclose = (event) => emitter.emit(\"closed\", event);\n socket2.onopen = async () => {\n try {\n emitter.emit(\"opened\", socket2);\n const payload = typeof connectionParams === \"function\" ? await connectionParams() : connectionParams;\n if (socket2.readyState !== WebSocketImpl.OPEN) return;\n socket2.send(\n stringifyMessage(\n payload ? {\n type: MessageType.ConnectionInit,\n payload\n } : {\n type: MessageType.ConnectionInit\n // payload is completely absent if not provided\n },\n replacer\n )\n );\n if (isFinite(connectionAckWaitTimeout) && connectionAckWaitTimeout > 0) {\n connectionAckTimeout = setTimeout(() => {\n socket2.close(\n CloseCode.ConnectionAcknowledgementTimeout,\n \"Connection acknowledgement timeout\"\n );\n }, connectionAckWaitTimeout);\n }\n enqueuePing();\n } catch (err) {\n emitter.emit(\"error\", err);\n socket2.close(\n CloseCode.InternalClientError,\n limitCloseReason(\n err instanceof Error ? err.message : String(err),\n \"Internal client error\"\n )\n );\n }\n };\n let acknowledged = false;\n socket2.onmessage = ({ data }) => {\n try {\n const message = parseMessage(data, reviver);\n emitter.emit(\"message\", message);\n if (message.type === \"ping\" || message.type === \"pong\") {\n emitter.emit(message.type, true, message.payload);\n if (message.type === \"pong\") {\n enqueuePing();\n } else if (!disablePong) {\n socket2.send(\n stringifyMessage(\n message.payload ? {\n type: MessageType.Pong,\n payload: message.payload\n } : {\n type: MessageType.Pong\n // payload is completely absent if not provided\n }\n )\n );\n emitter.emit(\"pong\", false, message.payload);\n }\n return;\n }\n if (acknowledged) return;\n if (message.type !== MessageType.ConnectionAck)\n throw new Error(\n `First message cannot be of type ${message.type}`\n );\n clearTimeout(connectionAckTimeout);\n acknowledged = true;\n emitter.emit(\"connected\", socket2, message.payload, retrying);\n retrying = false;\n retries = 0;\n connected([\n socket2,\n new Promise((_, reject) => errorOrClosed(reject))\n ]);\n } catch (err) {\n socket2.onmessage = null;\n emitter.emit(\"error\", err);\n socket2.close(\n CloseCode.BadResponse,\n limitCloseReason(\n err instanceof Error ? err.message : String(err),\n \"Bad response\"\n )\n );\n }\n };\n })()\n )));\n if (socket.readyState === WebSocketImpl.CLOSING) await throwOnClose;\n let release = () => {\n };\n const released = new Promise((resolve) => release = resolve);\n return [\n socket,\n release,\n Promise.race([\n // wait for\n released.then(() => {\n if (!locks) {\n const complete = () => socket.close(1e3, \"Normal Closure\");\n if (isFinite(lazyCloseTimeoutMs) && lazyCloseTimeoutMs > 0) {\n lazyCloseTimeout = setTimeout(() => {\n if (socket.readyState === WebSocketImpl.OPEN) complete();\n }, lazyCloseTimeoutMs);\n } else {\n complete();\n }\n }\n }),\n // or\n throwOnClose\n ])\n ];\n }\n function shouldRetryConnectOrThrow(errOrCloseEvent) {\n if (isLikeCloseEvent(errOrCloseEvent) && (isFatalInternalCloseCode(errOrCloseEvent.code) || [\n CloseCode.InternalServerError,\n CloseCode.InternalClientError,\n CloseCode.BadRequest,\n CloseCode.BadResponse,\n CloseCode.Unauthorized,\n // CloseCode.Forbidden, might grant access out after retry\n CloseCode.SubprotocolNotAcceptable,\n // CloseCode.ConnectionInitialisationTimeout, might not time out after retry\n // CloseCode.ConnectionAcknowledgementTimeout, might not time out after retry\n CloseCode.SubscriberAlreadyExists,\n CloseCode.TooManyInitialisationRequests\n // 4499, // Terminated, probably because the socket froze, we want to retry\n ].includes(errOrCloseEvent.code)))\n throw errOrCloseEvent;\n if (disposed) return false;\n if (isLikeCloseEvent(errOrCloseEvent) && errOrCloseEvent.code === 1e3)\n return locks > 0;\n if (!retryAttempts || retries >= retryAttempts) throw errOrCloseEvent;\n if (!shouldRetry(errOrCloseEvent)) throw errOrCloseEvent;\n return retrying = true;\n }\n if (!lazy) {\n (async () => {\n locks++;\n for (; ; ) {\n try {\n const [, , throwOnClose] = await connect();\n await throwOnClose;\n } catch (errOrCloseEvent) {\n try {\n if (!shouldRetryConnectOrThrow(errOrCloseEvent)) return;\n } catch (errOrCloseEvent2) {\n return onNonLazyError?.(errOrCloseEvent2);\n }\n }\n }\n })();\n }\n function subscribe(payload, sink) {\n const id = generateID(payload);\n let done = false, errored = false, releaser = () => {\n locks--;\n done = true;\n };\n (async () => {\n locks++;\n for (; ; ) {\n try {\n const [socket, release, waitForReleaseOrThrowOnClose] = await connect();\n if (done) return release();\n const unlisten = emitter.onMessage(id, (message) => {\n switch (message.type) {\n case MessageType.Next: {\n sink.next(message.payload);\n return;\n }\n case MessageType.Error: {\n errored = true, done = true;\n sink.error(message.payload);\n releaser();\n return;\n }\n case MessageType.Complete: {\n done = true;\n releaser();\n return;\n }\n }\n });\n socket.send(\n stringifyMessage(\n {\n id,\n type: MessageType.Subscribe,\n payload\n },\n replacer\n )\n );\n releaser = () => {\n if (!done && socket.readyState === WebSocketImpl.OPEN)\n socket.send(\n stringifyMessage(\n {\n id,\n type: MessageType.Complete\n },\n replacer\n )\n );\n locks--;\n done = true;\n release();\n };\n await waitForReleaseOrThrowOnClose.finally(unlisten);\n return;\n } catch (errOrCloseEvent) {\n if (!shouldRetryConnectOrThrow(errOrCloseEvent)) return;\n }\n }\n })().then(() => {\n if (!errored) sink.complete();\n }).catch((err) => {\n sink.error(err);\n });\n return () => {\n if (!done) releaser();\n };\n }\n return {\n on: emitter.on,\n subscribe,\n iterate(request) {\n const pending = [];\n const deferred = {\n done: false,\n error: null,\n resolve: () => {\n }\n };\n const dispose = subscribe(request, {\n next(val) {\n pending.push(val);\n deferred.resolve();\n },\n error(err) {\n deferred.done = true;\n deferred.error = err;\n deferred.resolve();\n },\n complete() {\n deferred.done = true;\n deferred.resolve();\n }\n });\n const iterator = async function* iterator2() {\n for (; ; ) {\n if (!pending.length) {\n await new Promise((resolve) => deferred.resolve = resolve);\n }\n while (pending.length) {\n yield pending.shift();\n }\n if (deferred.error) {\n throw deferred.error;\n }\n if (deferred.done) {\n return;\n }\n }\n }();\n iterator.throw = async (err) => {\n if (!deferred.done) {\n deferred.done = true;\n deferred.error = err;\n deferred.resolve();\n }\n return { done: true, value: undefined };\n };\n iterator.return = async () => {\n dispose();\n return { done: true, value: undefined };\n };\n return iterator;\n },\n async dispose() {\n disposed = true;\n if (connecting) {\n const [socket] = await connecting;\n socket.close(1e3, \"Normal Closure\");\n }\n },\n terminate() {\n if (connecting) {\n emitter.emit(\"closed\", new TerminatedCloseEvent());\n }\n }\n };\n}\nclass TerminatedCloseEvent extends Error {\n name = \"TerminatedCloseEvent\";\n message = \"4499: Terminated\";\n code = 4499;\n reason = \"Terminated\";\n wasClean = false;\n}\nfunction isLikeCloseEvent(val) {\n return isObject(val) && \"code\" in val && \"reason\" in val;\n}\nfunction isFatalInternalCloseCode(code) {\n if ([\n 1e3,\n // Normal Closure is not an erroneous close code\n 1001,\n // Going Away\n 1006,\n // Abnormal Closure\n 1005,\n // No Status Received\n 1012,\n // Service Restart\n 1013,\n // Try Again Later\n 1014\n // Bad Gateway\n ].includes(code))\n return false;\n return code >= 1e3 && code <= 1999;\n}\nfunction isWebSocket(val) {\n return typeof val === \"function\" && \"constructor\" in val && \"CLOSED\" in val && \"CLOSING\" in val && \"CONNECTING\" in val && \"OPEN\" in val;\n}\n\nexport { CloseCode, GRAPHQL_TRANSPORT_WS_PROTOCOL, MessageType, TerminatedCloseEvent, createClient, parseMessage, stringifyMessage };\n","export { TerminatedCloseEvent, createClient } from './client.js';\nexport { a as areGraphQLErrors, h as handleProtocols, m as makeServer } from './server-BN3ZJY-a.js';\nexport { C as CloseCode, D as DEPRECATED_GRAPHQL_WS_PROTOCOL, G as GRAPHQL_TRANSPORT_WS_PROTOCOL, M as MessageType, p as parseMessage, s as stringifyMessage, v as validateMessage } from './common-CGW11Fyb.js';\nimport 'graphql';\n"],"mappings":"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","names":["import_client","pluralize"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1419,7 +1419,7 @@ var DubheGraphqlClient = class {
|
|
|
1419
1419
|
* Process data for a single table
|
|
1420
1420
|
*/
|
|
1421
1421
|
processTableData(tableName, tableData, enums) {
|
|
1422
|
-
const
|
|
1422
|
+
const normalizedTableName = tableName.includes("_") ? this.toCamelCase(tableName) : tableName;
|
|
1423
1423
|
const fields = [];
|
|
1424
1424
|
const enumFields = {};
|
|
1425
1425
|
if (tableData.fields && Array.isArray(tableData.fields)) {
|
|
@@ -1437,14 +1437,35 @@ var DubheGraphqlClient = class {
|
|
|
1437
1437
|
(key) => this.toCamelCase(key)
|
|
1438
1438
|
);
|
|
1439
1439
|
const tableInfo = {
|
|
1440
|
-
tableName:
|
|
1440
|
+
tableName: normalizedTableName,
|
|
1441
1441
|
fields: [...new Set(fields)],
|
|
1442
1442
|
// Remove duplicates
|
|
1443
1443
|
primaryKeys,
|
|
1444
1444
|
enumFields
|
|
1445
1445
|
};
|
|
1446
|
-
this.parsedTables.set(
|
|
1447
|
-
this.parsedTables.set(
|
|
1446
|
+
this.parsedTables.set(tableName, tableInfo);
|
|
1447
|
+
this.parsedTables.set(normalizedTableName, tableInfo);
|
|
1448
|
+
if (tableName !== normalizedTableName) {
|
|
1449
|
+
this.parsedTables.set(this.toSnakeCase(normalizedTableName), tableInfo);
|
|
1450
|
+
}
|
|
1451
|
+
}
|
|
1452
|
+
/**
|
|
1453
|
+
* Find table info with multiple lookup strategies
|
|
1454
|
+
*/
|
|
1455
|
+
findTableInfo(tableName) {
|
|
1456
|
+
let tableInfo = this.parsedTables.get(tableName);
|
|
1457
|
+
if (tableInfo)
|
|
1458
|
+
return tableInfo;
|
|
1459
|
+
const camelCaseTableName = this.toCamelCase(tableName);
|
|
1460
|
+
tableInfo = this.parsedTables.get(camelCaseTableName);
|
|
1461
|
+
if (tableInfo)
|
|
1462
|
+
return tableInfo;
|
|
1463
|
+
if (tableName.includes("_")) {
|
|
1464
|
+
tableInfo = this.parsedTables.get(tableName.toLowerCase());
|
|
1465
|
+
if (tableInfo)
|
|
1466
|
+
return tableInfo;
|
|
1467
|
+
}
|
|
1468
|
+
return void 0;
|
|
1448
1469
|
}
|
|
1449
1470
|
/**
|
|
1450
1471
|
* Get table field information
|
|
@@ -1456,14 +1477,14 @@ var DubheGraphqlClient = class {
|
|
|
1456
1477
|
* Get table primary key information
|
|
1457
1478
|
*/
|
|
1458
1479
|
getTablePrimaryKeys(tableName) {
|
|
1459
|
-
const tableInfo = this.
|
|
1480
|
+
const tableInfo = this.findTableInfo(tableName);
|
|
1460
1481
|
return tableInfo?.primaryKeys || [];
|
|
1461
1482
|
}
|
|
1462
1483
|
/**
|
|
1463
1484
|
* Get table enum field information
|
|
1464
1485
|
*/
|
|
1465
1486
|
getTableEnumFields(tableName) {
|
|
1466
|
-
const tableInfo = this.
|
|
1487
|
+
const tableInfo = this.findTableInfo(tableName);
|
|
1467
1488
|
return tableInfo?.enumFields || {};
|
|
1468
1489
|
}
|
|
1469
1490
|
/**
|
|
@@ -1476,7 +1497,7 @@ var DubheGraphqlClient = class {
|
|
|
1476
1497
|
* Get table's minimal field set (for fallback)
|
|
1477
1498
|
*/
|
|
1478
1499
|
getMinimalFields(tableName) {
|
|
1479
|
-
const tableInfo = this.
|
|
1500
|
+
const tableInfo = this.findTableInfo(tableName);
|
|
1480
1501
|
if (tableInfo) {
|
|
1481
1502
|
return tableInfo.fields;
|
|
1482
1503
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts","../../../node_modules/.pnpm/graphql-ws@6.0.5_graphql@15.10.1_ws@8.18.2/node_modules/graphql-ws/dist/common-CGW11Fyb.js","../../../node_modules/.pnpm/graphql-ws@6.0.5_graphql@15.10.1_ws@8.18.2/node_modules/graphql-ws/dist/client.js","../../../node_modules/.pnpm/graphql-ws@6.0.5_graphql@15.10.1_ws@8.18.2/node_modules/graphql-ws/dist/index.js"],"sourcesContent":["import {\n ApolloClient,\n InMemoryCache,\n gql,\n createHttpLink,\n split,\n NormalizedCacheObject,\n WatchQueryOptions,\n QueryOptions as ApolloQueryOptions,\n SubscriptionOptions as ApolloSubscriptionOptions,\n Observable,\n from,\n ApolloLink,\n FetchPolicy,\n OperationVariables,\n} from '@apollo/client';\nimport { RetryLink } from '@apollo/client/link/retry';\nimport { GraphQLWsLink } from '@apollo/client/link/subscriptions';\nimport { getMainDefinition } from '@apollo/client/utilities';\nimport { createClient } from 'graphql-ws';\nimport pluralize from 'pluralize';\n\nimport {\n DubheClientConfig,\n Connection,\n BaseQueryParams,\n OrderBy,\n JsonPathOrder,\n QueryOptions,\n QueryResult,\n SubscriptionResult,\n SubscriptionOptions,\n StringFilter,\n NumberFilter,\n DateFilter,\n StoreTableRow,\n TypedDocumentNode,\n CachePolicy,\n MultiTableSubscriptionConfig,\n MultiTableSubscriptionResult,\n MultiTableSubscriptionData,\n ParsedTableInfo,\n DubheMetadata,\n} from './types';\n\n// Convert cache policy type\nfunction mapCachePolicyToFetchPolicy(cachePolicy: CachePolicy): FetchPolicy {\n switch (cachePolicy) {\n case 'cache-first':\n return 'cache-first';\n case 'network-only':\n return 'network-only';\n case 'cache-only':\n return 'cache-only';\n case 'no-cache':\n return 'no-cache';\n case 'standby':\n return 'standby';\n default:\n return 'cache-first';\n }\n}\n\nexport class DubheGraphqlClient {\n private apolloClient: ApolloClient<NormalizedCacheObject>;\n private subscriptionClient?: any;\n private dubheMetadata?: DubheMetadata;\n private parsedTables: Map<string, ParsedTableInfo> = new Map();\n\n constructor(config: DubheClientConfig) {\n // Save dubhe metadata\n this.dubheMetadata = config.dubheMetadata;\n\n // If dubhe metadata is provided, parse table information\n if (this.dubheMetadata) {\n this.parseTableInfoFromConfig();\n }\n\n // Create HTTP Link\n const httpLink = createHttpLink({\n uri: config.endpoint,\n headers: config.headers,\n fetch: (input, init) => fetch(input, { ...config.fetchOptions, ...init }),\n });\n\n // Create retry link\n const retryLink = new RetryLink({\n delay: {\n // Initial retry delay time (milliseconds)\n initial: config.retryOptions?.delay?.initial || 300,\n // Maximum retry delay time (milliseconds)\n max: config.retryOptions?.delay?.max || 5000,\n // Whether to add random jitter to avoid thundering herd, enabled by default\n jitter: config.retryOptions?.delay?.jitter !== false,\n },\n attempts: {\n // Maximum number of attempts (including initial request)\n max: config.retryOptions?.attempts?.max || 5,\n // Custom retry condition function\n retryIf:\n config.retryOptions?.attempts?.retryIf ||\n ((error, _operation) => {\n // Default retry strategy:\n // 1. Network connection errors\n // 2. Server errors but no GraphQL errors (indicates service temporarily unavailable)\n return Boolean(\n error &&\n (error.networkError ||\n (error.graphQLErrors && error.graphQLErrors.length === 0))\n );\n }),\n },\n });\n\n // Combine HTTP link and retry link\n const httpWithRetryLink = from([retryLink, httpLink]);\n\n let link: ApolloLink = httpWithRetryLink;\n\n // If subscription endpoint is provided, create WebSocket Link\n if (config.subscriptionEndpoint) {\n // Automatically import ws module in Node.js environment\n let webSocketImpl;\n try {\n // Check if in Node.js environment\n if (typeof window === 'undefined' && typeof global !== 'undefined') {\n // Node.js environment, need to import ws\n const wsModule = require('ws');\n webSocketImpl = wsModule.default || wsModule;\n\n // Set global WebSocket in Node.js environment to avoid apollo client internal errors\n if (typeof (global as any).WebSocket === 'undefined') {\n (global as any).WebSocket = webSocketImpl;\n }\n } else {\n // Browser environment, use native WebSocket\n webSocketImpl = WebSocket;\n }\n } catch (error) {\n // Ignore ws import errors\n }\n\n const clientOptions: any = {\n url: config.subscriptionEndpoint,\n connectionParams: {\n headers: config.headers,\n },\n };\n\n // Only add webSocketImpl if in Node.js environment and ws was successfully imported\n if (webSocketImpl && typeof window === 'undefined') {\n clientOptions.webSocketImpl = webSocketImpl;\n }\n\n this.subscriptionClient = createClient(clientOptions);\n\n const wsLink = new GraphQLWsLink(this.subscriptionClient);\n\n // Use split to decide which link to use\n link = split(\n ({ query }) => {\n const definition = getMainDefinition(query);\n return (\n definition.kind === 'OperationDefinition' &&\n definition.operation === 'subscription'\n );\n },\n wsLink,\n httpWithRetryLink\n );\n }\n\n // Create Apollo Client instance\n this.apolloClient = new ApolloClient({\n link,\n cache:\n config.cacheConfig?.paginatedTables &&\n config.cacheConfig.paginatedTables.length > 0\n ? new InMemoryCache({\n typePolicies: {\n // Configure cache strategy for Connection type\n Query: {\n fields: this.buildCacheFields(config.cacheConfig),\n },\n },\n })\n : new InMemoryCache(), // Use simple cache by default\n defaultOptions: {\n watchQuery: {\n errorPolicy: 'all',\n notifyOnNetworkStatusChange: true,\n },\n query: {\n errorPolicy: 'all',\n },\n },\n });\n }\n\n /**\n * Execute GraphQL query\n */\n async query<\n TData,\n TVariables extends OperationVariables = OperationVariables,\n >(\n query: TypedDocumentNode<TData, TVariables>,\n variables?: TVariables,\n options?: QueryOptions\n ): Promise<QueryResult<TData>> {\n try {\n const result = await this.apolloClient.query({\n query,\n variables,\n fetchPolicy: options?.cachePolicy\n ? mapCachePolicyToFetchPolicy(options.cachePolicy)\n : 'no-cache',\n // : 'cache-first',\n notifyOnNetworkStatusChange: options?.notifyOnNetworkStatusChange,\n pollInterval: options?.pollInterval,\n });\n\n return {\n data: result.data,\n loading: result.loading,\n error: result.error,\n networkStatus: result.networkStatus,\n refetch: () => this.query(query, variables, options),\n };\n } catch (error) {\n return {\n data: undefined,\n loading: false,\n error: error as Error,\n networkStatus: 8, // NetworkStatus.error\n refetch: () => this.query(query, variables, options),\n };\n }\n }\n\n /**\n * Execute GraphQL subscription\n */\n subscribe<TData, TVariables extends OperationVariables = OperationVariables>(\n subscription: TypedDocumentNode<TData, TVariables>,\n variables?: TVariables,\n options?: SubscriptionOptions\n ): Observable<SubscriptionResult<TData>> {\n return new Observable((observer: any) => {\n const sub = this.apolloClient\n .subscribe({\n query: subscription,\n variables,\n })\n .subscribe({\n next: (result: any) => {\n const subscriptionResult: SubscriptionResult<TData> = {\n data: result.data,\n loading: false,\n error: result.errors?.[0] as Error,\n };\n observer.next(subscriptionResult);\n options?.onData?.(result.data);\n },\n error: (error: any) => {\n const subscriptionResult: SubscriptionResult<TData> = {\n data: undefined,\n loading: false,\n error,\n };\n observer.next(subscriptionResult);\n options?.onError?.(error);\n },\n complete: () => {\n observer.complete();\n options?.onComplete?.();\n },\n });\n\n return () => sub.unsubscribe();\n });\n }\n\n /**\n * Query all table data - Adapted to API without store prefix\n *\n * OrderBy field name support:\n * - camelCase: { field: 'updatedAt', direction: 'DESC' } → UPDATED_AT_DESC\n * - snake_case: { field: 'updated_at', direction: 'DESC' } → UPDATED_AT_DESC\n *\n * Usage examples:\n * ```ts\n * // Using camelCase field names\n * const result = await client.getAllTables('account', {\n * orderBy: [{ field: 'updatedAt', direction: 'DESC' }]\n * });\n *\n * // Using snake_case field names\n * const result = await client.getAllTables('account', {\n * orderBy: [{ field: 'updated_at', direction: 'DESC' }]\n * });\n *\n * // Mixed usage\n * const result = await client.getAllTables('account', {\n * orderBy: [\n * { field: 'updatedAt', direction: 'DESC' },\n * { field: 'created_at', direction: 'ASC' }\n * ]\n * });\n * ```\n */\n async getAllTables<T extends StoreTableRow>(\n tableName: string,\n params?: BaseQueryParams & {\n filter?: Record<string, any>;\n orderBy?: OrderBy[];\n fields?: string[]; // Allow users to specify fields to query, auto-parse from dubhe config if not specified\n }\n ): Promise<Connection<T>> {\n // Ensure using plural form of table name\n const pluralTableName = this.getPluralTableName(tableName);\n\n // Convert OrderBy to enum values\n const orderByEnums = convertOrderByToEnum(params?.orderBy);\n\n // Dynamically build query\n const query = gql`\n query GetAllTables(\n $first: Int\n $last: Int\n $after: Cursor\n $before: Cursor\n $filter: ${this.getFilterTypeName(tableName)}\n $orderBy: [${this.getOrderByTypeName(tableName)}!]\n ) {\n ${pluralTableName}(\n first: $first\n last: $last\n after: $after\n before: $before\n filter: $filter\n orderBy: $orderBy\n ) {\n totalCount\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n edges {\n cursor\n node {\n ${this.convertTableFields(tableName, params?.fields)}\n }\n }\n }\n }\n `;\n\n // Build query parameters using enum values\n const queryParams = {\n first: params?.first,\n last: params?.last,\n after: params?.after,\n before: params?.before,\n filter: params?.filter,\n orderBy: orderByEnums,\n };\n\n // const result = await this.query(query, queryParams, {\n // cachePolicy: 'no-cache',\n // });\n\n const result = await this.query(query, queryParams);\n\n if (result.error) {\n throw result.error;\n }\n\n return (\n (result.data as any)?.[pluralTableName] || {\n edges: [],\n pageInfo: { hasNextPage: false, hasPreviousPage: false },\n }\n );\n }\n\n /**\n * Get single table record by condition - Adapted to API without store prefix\n */\n async getTableByCondition<T extends StoreTableRow>(\n tableName: string,\n condition: Record<string, any>,\n fields?: string[] // Allow users to specify fields to query\n ): Promise<T | null> {\n // Build query field name, e.g.: accountByAssetIdAndAccount\n const conditionKeys = Object.keys(condition);\n\n // Use singular form of table name for single record query\n const singularTableName = this.getSingularTableName(tableName);\n\n const query = gql`\n query GetTableByCondition(${conditionKeys.map((key, index) => `$${key}: String!`).join(', ')}) {\n ${singularTableName}(${conditionKeys.map((key) => `${key}: $${key}`).join(', ')}) {\n ${this.convertTableFields(tableName, fields)}\n }\n }\n `;\n\n const result = await this.query(query, condition);\n\n if (result.error) {\n throw result.error;\n }\n\n return (result.data as any)?.[singularTableName] || null;\n }\n\n /**\n * Subscribe to table data changes - Using PostGraphile's listen subscription feature\n */\n subscribeToTableChanges<T extends StoreTableRow>(\n tableName: string,\n options?: SubscriptionOptions & {\n fields?: string[]; // Allow users to specify fields to subscribe to\n initialEvent?: boolean; // Whether to trigger initial event immediately\n first?: number; // Limit the number of returned records\n topicPrefix?: string; // Custom topic prefix, defaults to table name\n }\n ): Observable<SubscriptionResult<{ listen: { query: any } }>> {\n // PostGraphile automatically adds 'postgraphile:' prefix to all topics\n // So here we use more concise topic naming\n const topic = options?.topicPrefix\n ? `${options.topicPrefix}${tableName}`\n : `store_${this.getSingularTableName(tableName)}`;\n\n const pluralTableName = this.getPluralTableName(tableName); // Ensure using plural form\n const fields = this.convertTableFields(tableName, options?.fields);\n\n const subscription = gql`\n subscription ListenToTableChanges($topic: String!, $initialEvent: Boolean) {\n listen(topic: $topic, initialEvent: $initialEvent) {\n query {\n ${pluralTableName}(first: ${options?.first || 10}, orderBy: UPDATED_AT_DESC) {\n totalCount\n nodes {\n ${fields}\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n }\n }\n `;\n\n return this.subscribe(\n subscription,\n {\n topic,\n initialEvent: options?.initialEvent || false,\n },\n options\n );\n }\n\n /**\n * Advanced listen subscription - Support custom queries\n */\n subscribeWithListen<T = any>(\n topic: string,\n query: string,\n options?: SubscriptionOptions & {\n initialEvent?: boolean;\n variables?: Record<string, any>;\n }\n ): Observable<SubscriptionResult<{ listen: { query: T } }>> {\n const subscription = gql`\n subscription CustomListenSubscription($topic: String!, $initialEvent: Boolean) {\n listen(topic: $topic, initialEvent: $initialEvent) {\n query {\n ${query}\n }\n }\n }\n `;\n\n return this.subscribe(\n subscription,\n {\n topic,\n initialEvent: options?.initialEvent || false,\n ...options?.variables,\n },\n options\n );\n }\n\n /**\n * Subscribe to data changes with specific conditions\n */\n subscribeToFilteredTableChanges<T extends StoreTableRow>(\n tableName: string,\n filter?: Record<string, any>,\n options?: SubscriptionOptions & {\n fields?: string[];\n initialEvent?: boolean;\n orderBy?: OrderBy[];\n first?: number;\n topicPrefix?: string; // Custom topic prefix\n }\n ): Observable<SubscriptionResult<{ listen: { query: any } }>> {\n // Improved topic naming, support custom prefix\n const topic = options?.topicPrefix\n ? `${options.topicPrefix}${tableName}`\n : `store_${this.getSingularTableName(tableName)}`;\n\n const pluralTableName = this.getPluralTableName(tableName); // Ensure using plural form\n const fields = this.convertTableFields(tableName, options?.fields);\n const orderByEnum = convertOrderByToEnum(options?.orderBy);\n const first = options?.first || 10;\n\n const subscription = gql`\n subscription FilteredListenSubscription(\n $topic: String!, \n $initialEvent: Boolean,\n $filter: ${this.getFilterTypeName(tableName)},\n $orderBy: [${this.getOrderByTypeName(tableName)}!],\n $first: Int\n ) {\n listen(topic: $topic, initialEvent: $initialEvent) {\n query {\n ${pluralTableName}(\n first: $first, \n filter: $filter, \n orderBy: $orderBy\n ) {\n totalCount\n nodes {\n ${fields}\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n }\n }\n `;\n\n return this.subscribe(\n subscription,\n {\n topic,\n initialEvent: options?.initialEvent || false,\n filter,\n orderBy: orderByEnum,\n first,\n },\n options\n );\n }\n\n /**\n * Subscribe to multiple table data changes - Support batch subscription of table name list\n */\n subscribeToMultipleTables<T extends StoreTableRow>(\n tableConfigs: MultiTableSubscriptionConfig[],\n globalOptions?: SubscriptionOptions\n ): Observable<MultiTableSubscriptionData> {\n return new Observable((observer: any) => {\n const subscriptions: Array<{ tableName: string; subscription: any }> = [];\n const latestData: MultiTableSubscriptionData = {};\n\n // Create independent subscription for each table\n tableConfigs.forEach(({ tableName, options }) => {\n const subscription = this.subscribeToFilteredTableChanges<T>(\n tableName,\n options?.filter,\n {\n ...options,\n onData: (data) => {\n // Update latest data for this table\n latestData[tableName] = data;\n\n // Call table-level callback\n if (options?.onData) {\n options.onData(data);\n }\n\n // Call global callback\n if (globalOptions?.onData) {\n globalOptions.onData(latestData);\n }\n\n // Send complete multi-table data\n observer.next({ ...latestData });\n },\n onError: (error) => {\n // Call table-level error callback\n if (options?.onError) {\n options.onError(error);\n }\n\n // Call global error callback\n if (globalOptions?.onError) {\n globalOptions.onError(error);\n }\n\n // Send error\n observer.error(error);\n },\n }\n );\n\n subscriptions.push({ tableName, subscription });\n });\n\n // Start all subscriptions\n const activeSubscriptions = subscriptions.map(({ subscription }) =>\n subscription.subscribe()\n );\n\n // Return cleanup function\n return () => {\n activeSubscriptions.forEach((sub) => sub.unsubscribe());\n\n // Call completion callback\n if (globalOptions?.onComplete) {\n globalOptions.onComplete();\n }\n };\n });\n }\n\n /**\n * Simplified multi-table subscription - Support table name array and unified configuration\n */\n subscribeToTableList<T extends StoreTableRow>(\n tableNames: string[],\n options?: SubscriptionOptions & {\n fields?: string[];\n filter?: Record<string, any>;\n initialEvent?: boolean;\n first?: number;\n topicPrefix?: string;\n }\n ): Observable<MultiTableSubscriptionData> {\n const tableConfigs: MultiTableSubscriptionConfig[] = tableNames.map(\n (tableName) => ({\n tableName,\n options: {\n ...options,\n // Use same configuration for each table\n fields: options?.fields,\n filter: options?.filter,\n initialEvent: options?.initialEvent,\n first: options?.first,\n topicPrefix: options?.topicPrefix,\n },\n })\n );\n\n return this.subscribeToMultipleTables<T>(tableConfigs, options);\n }\n\n /**\n * Build dynamic query - Adapted to API without store prefix\n */\n buildQuery(\n tableName: string,\n fields: string[],\n params?: {\n filter?: Record<string, any>;\n orderBy?: OrderBy[];\n first?: number;\n after?: string;\n }\n ): TypedDocumentNode {\n const pluralTableName = this.getPluralTableName(tableName); // Ensure using plural form\n const fieldSelection = fields.join('\\n ');\n\n return gql`\n query DynamicQuery(\n $first: Int\n $after: Cursor\n $filter: ${this.getFilterTypeName(tableName)}\n $orderBy: [${this.getOrderByTypeName(tableName)}!]\n ) {\n ${pluralTableName}(\n first: $first\n after: $after\n filter: $filter\n orderBy: $orderBy\n ) {\n totalCount\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n ${fieldSelection}\n }\n }\n }\n }\n `;\n }\n\n /**\n * Batch query multiple tables - Adapted to API without store prefix\n */\n async batchQuery<T extends Record<string, any>>(\n queries: Array<{\n key: string;\n tableName: string;\n params?: BaseQueryParams & {\n filter?: Record<string, any>;\n orderBy?: OrderBy[];\n fields?: string[]; // Allow users to specify fields to query\n };\n }>\n ): Promise<Record<string, Connection<StoreTableRow>>> {\n const batchPromises = queries.map(async ({ key, tableName, params }) => {\n const result = await this.getAllTables(tableName, params);\n return { key, result };\n });\n\n const results = await Promise.all(batchPromises);\n\n return results.reduce(\n (acc, { key, result }) => {\n acc[key] = result;\n return acc;\n },\n {} as Record<string, Connection<StoreTableRow>>\n );\n }\n\n /**\n * Real-time data stream listener - Adapted to API without store prefix\n */\n createRealTimeDataStream<T extends StoreTableRow>(\n tableName: string,\n initialQuery?: BaseQueryParams & { filter?: Record<string, any> }\n ): Observable<Connection<T>> {\n return new Observable((observer: any) => {\n // First execute initial query\n this.getAllTables<T>(tableName, initialQuery)\n .then((initialData) => {\n observer.next(initialData);\n })\n .catch((error) => observer.error(error));\n\n // Then subscribe to real-time updates\n const subscription = this.subscribeToTableChanges<T>(tableName, {\n onData: () => {\n // When data changes, re-execute query\n this.getAllTables<T>(tableName, initialQuery)\n .then((updatedData) => {\n observer.next(updatedData);\n })\n .catch((error) => observer.error(error));\n },\n onError: (error) => observer.error(error),\n });\n\n return () => subscription.subscribe().unsubscribe();\n });\n }\n\n // Improved table name handling methods\n private getFilterTypeName(tableName: string): string {\n // Convert to singular form and apply PascalCase conversion\n const singularName = this.getSingularTableName(tableName);\n const pascalCaseName = this.toPascalCase(singularName);\n\n // If already starts with Store, don't add Store prefix again\n if (pascalCaseName.startsWith('Store')) {\n return `${pascalCaseName}Filter`;\n }\n\n return `Store${pascalCaseName}Filter`;\n }\n\n private getOrderByTypeName(tableName: string): string {\n // Convert to plural form and apply PascalCase conversion\n const pluralName = this.getPluralTableName(tableName);\n const pascalCaseName = this.toPascalCase(pluralName);\n\n // If already starts with Store, don't add Store prefix again\n if (pascalCaseName.startsWith('Store')) {\n return `${pascalCaseName}OrderBy`;\n }\n\n return `Store${pascalCaseName}OrderBy`;\n }\n\n /**\n * Convert singular table name to plural form (using pluralize library for correctness)\n */\n private getPluralTableName(tableName: string): string {\n // First convert to camelCase\n const camelCaseName = this.toCamelCase(tableName);\n\n // Use pluralize library for pluralization\n return pluralize.plural(camelCaseName);\n }\n\n /**\n * Convert plural table name to singular form (using pluralize library for correctness)\n */\n private getSingularTableName(tableName: string): string {\n // First convert to camelCase\n const camelCaseName = this.toCamelCase(tableName);\n\n // Use pluralize library for singularization\n return pluralize.singular(camelCaseName);\n }\n\n /**\n * Convert snake_case to camelCase\n */\n private toCamelCase(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n }\n\n /**\n * Convert snake_case to PascalCase\n */\n private toPascalCase(str: string): string {\n const camelCase = this.toCamelCase(str);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n }\n\n /**\n * Convert camelCase or snake_case to SNAKE_CASE (for GraphQL enum values)\n * Example: updatedAt -> UPDATED_AT, updated_at -> UPDATED_AT\n */\n private toSnakeCase(str: string): string {\n // If already snake_case, convert to uppercase directly\n if (str.includes('_')) {\n return str.toUpperCase();\n }\n\n // If camelCase, first convert to snake_case then uppercase\n return str\n .replace(/([A-Z])/g, '_$1') // Add underscore before uppercase letters\n .toLowerCase() // Convert to lowercase\n .replace(/^_/, '') // Remove leading underscore\n .toUpperCase(); // Convert to uppercase\n }\n\n // private buildSingleQueryName(\n // tableName: string,\n // conditionKeys: string[]\n // ): string {\n // // Use camelCase conversion\n // const camelCaseTableName = this.toCamelCase(tableName);\n // const capitalizedKeys = conditionKeys.map(\n // (key) => key.charAt(0).toUpperCase() + key.slice(1)\n // );\n // return `${camelCaseTableName}By${capitalizedKeys.join('And')}`;\n // }\n\n /**\n * Clear Apollo Client cache\n */\n async clearCache(): Promise<void> {\n await this.apolloClient.clearStore();\n }\n\n /**\n * Reset Apollo Client cache\n */\n async resetCache(): Promise<void> {\n await this.apolloClient.resetStore();\n }\n\n /**\n * Get Apollo Client instance (for advanced usage)\n */\n getApolloClient(): ApolloClient<NormalizedCacheObject> {\n return this.apolloClient;\n }\n\n /**\n * Close client connection\n */\n close(): void {\n if (this.subscriptionClient) {\n this.subscriptionClient.dispose();\n }\n }\n\n /**\n * Get Dubhe metadata\n */\n getDubheMetadata(): DubheMetadata | undefined {\n return this.dubheMetadata;\n }\n\n /**\n * Build dynamic cache field configuration\n */\n private buildCacheFields(\n cacheConfig?: DubheClientConfig['cacheConfig']\n ): Record<string, any> {\n const fields: Record<string, any> = {};\n\n // If no configuration, return empty field configuration\n if (!cacheConfig) {\n return fields;\n }\n\n // Create pagination cache strategy for each configured table\n if (cacheConfig.paginatedTables) {\n cacheConfig.paginatedTables.forEach((tableName) => {\n // Ensure using plural form of table name\n const pluralTableName = this.getPluralTableName(tableName);\n\n // Check if there's a custom merge strategy\n const customStrategy =\n cacheConfig.customMergeStrategies?.[pluralTableName];\n\n fields[pluralTableName] = {\n keyArgs: customStrategy?.keyArgs || ['filter', 'orderBy'],\n merge: customStrategy?.merge || this.defaultMergeStrategy,\n };\n });\n }\n\n // Apply custom merge strategies (if any)\n if (cacheConfig.customMergeStrategies) {\n Object.entries(cacheConfig.customMergeStrategies).forEach(\n ([tableName, strategy]) => {\n // If table name hasn't been configured yet, add it\n if (!fields[tableName]) {\n fields[tableName] = {\n keyArgs: strategy.keyArgs || ['filter', 'orderBy'],\n merge: strategy.merge || this.defaultMergeStrategy,\n };\n }\n }\n );\n }\n\n return fields;\n }\n\n /**\n * Default pagination merge strategy\n */\n private defaultMergeStrategy(existing = { edges: [] }, incoming: any) {\n // Safety check, ensure incoming has edges property\n if (!incoming || !Array.isArray(incoming.edges)) {\n return existing;\n }\n return {\n ...incoming,\n edges: [...(existing.edges || []), ...incoming.edges],\n };\n }\n\n /**\n * Parse table information from dubhe metadata\n */\n private parseTableInfoFromConfig(): void {\n if (!this.dubheMetadata) {\n return;\n }\n\n const { components = [], resources = [], enums = [] } = this.dubheMetadata;\n\n // Process components array\n components.forEach((componentObj: any) => {\n Object.entries(componentObj).forEach(\n ([componentName, componentData]: [string, any]) => {\n this.processTableData(componentName, componentData, enums);\n }\n );\n });\n\n // Process resources array\n resources.forEach((resourceObj: any) => {\n Object.entries(resourceObj).forEach(\n ([resourceName, resourceData]: [string, any]) => {\n this.processTableData(resourceName, resourceData, enums);\n }\n );\n });\n }\n\n /**\n * Process data for a single table\n */\n private processTableData(\n tableName: string,\n tableData: any,\n enums: any[]\n ): void {\n const snakeTableName = this.toSnakeCase(tableName);\n const fields: string[] = [];\n const enumFields: Record<string, string[]> = {};\n\n // Process fields array\n if (tableData.fields && Array.isArray(tableData.fields)) {\n tableData.fields.forEach((fieldObj: any) => {\n Object.entries(fieldObj).forEach(\n ([fieldName, fieldType]: [string, any]) => {\n const fieldNameCamelCase = this.toCamelCase(fieldName);\n fields.push(fieldNameCamelCase);\n // Check if it's an enum type\n // const typeStr = String(fieldType);\n // if (enums.length > 0) {\n // // Process enum types as needed here\n // // enumFields[fieldNameCamelCase] = [...];\n // }\n }\n );\n });\n }\n\n // Add system fields\n fields.push('createdAt', 'updatedAt');\n\n // Process primary keys\n const primaryKeys: string[] = tableData.keys.map((key: string) =>\n this.toCamelCase(key)\n );\n\n const tableInfo: ParsedTableInfo = {\n tableName: snakeTableName,\n fields: [...new Set(fields)], // Remove duplicates\n primaryKeys,\n enumFields,\n };\n\n this.parsedTables.set(snakeTableName, tableInfo);\n this.parsedTables.set(this.toCamelCase(snakeTableName), tableInfo);\n }\n\n /**\n * Get table field information\n */\n getTableFields(tableName: string): string[] {\n // Use getMinimalFields directly for clearer logic\n return this.getMinimalFields(tableName);\n }\n\n /**\n * Get table primary key information\n */\n getTablePrimaryKeys(tableName: string): string[] {\n const tableInfo =\n this.parsedTables.get(tableName) ||\n this.parsedTables.get(this.toSnakeCase(tableName));\n return tableInfo?.primaryKeys || [];\n }\n\n /**\n * Get table enum field information\n */\n getTableEnumFields(tableName: string): Record<string, string[]> {\n const tableInfo =\n this.parsedTables.get(tableName) ||\n this.parsedTables.get(this.toSnakeCase(tableName));\n return tableInfo?.enumFields || {};\n }\n\n /**\n * Get all parsed table information\n */\n getAllTableInfo(): Map<string, ParsedTableInfo> {\n return new Map(this.parsedTables);\n }\n\n /**\n * Get table's minimal field set (for fallback)\n */\n getMinimalFields(tableName: string): string[] {\n // If there's configuration, use fields from configuration\n const tableInfo =\n this.parsedTables.get(tableName) ||\n this.parsedTables.get(this.toSnakeCase(tableName));\n\n if (tableInfo) {\n return tableInfo.fields;\n }\n\n return ['createdAt', 'updatedAt'];\n }\n\n /**\n * Convert table fields to GraphQL query string\n */\n private convertTableFields(\n tableName: string,\n customFields?: string[]\n ): string {\n let fields: string[];\n\n if (customFields && customFields.length > 0) {\n fields = customFields;\n } else {\n // Try to get fields from dubhe configuration\n const autoFields = this.getTableFields(tableName);\n if (autoFields.length > 0) {\n fields = autoFields;\n } else {\n fields = ['createdAt', 'updatedAt'];\n }\n }\n\n // Field resolution debug logging disabled for cleaner output\n\n return fields.join('\\n ');\n }\n}\n\n// Export convenience function\nexport function createDubheGraphqlClient(\n config: DubheClientConfig\n): DubheGraphqlClient {\n return new DubheGraphqlClient(config);\n}\n\n// Export common GraphQL query builders\nexport const QueryBuilders = {\n // Build basic query - Adapted to API without store prefix\n basic: (\n tableName: string,\n fields: string[] = ['createdAt', 'updatedAt']\n ) => gql`\n query Basic${tableName.charAt(0).toUpperCase() + tableName.slice(1)}Query(\n $first: Int\n $after: String\n $filter: ${tableName.charAt(0).toUpperCase() + tableName.slice(1)}Filter\n ) {\n ${tableName}(first: $first, after: $after, filter: $filter) {\n totalCount\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n ${fields.join('\\n ')}\n }\n }\n }\n }\n `,\n\n // Build subscription query - Adapted to API without store prefix\n subscription: (tableName: string) => gql`\n subscription ${tableName.charAt(0).toUpperCase() + tableName.slice(1)}Subscription {\n ${tableName.charAt(0).toLowerCase() + tableName.slice(1)}Changed {\n createdAt\n updatedAt\n }\n }\n `,\n};\n\n/**\n * Helper function: Convert OrderBy format\n * Support camelCase and snake_case field names conversion to GraphQL enum values\n * Example: updatedAt -> UPDATED_AT_ASC, updated_at -> UPDATED_AT_ASC\n */\nfunction convertOrderByToEnum(orderBy?: OrderBy[]): string[] {\n if (!orderBy || orderBy.length === 0) {\n return ['NATURAL'];\n }\n\n return orderBy.map((order) => {\n // Use unified conversion function to handle field names\n const field = toSnakeCaseForEnum(order.field);\n const direction = order.direction === 'DESC' ? 'DESC' : 'ASC';\n\n // Combine field name and direction into enum value\n return `${field}_${direction}`;\n });\n}\n\n/**\n * Convert camelCase or snake_case to SNAKE_CASE (for GraphQL enum values)\n * Example: updatedAt -> UPDATED_AT, updated_at -> UPDATED_AT\n */\nfunction toSnakeCaseForEnum(str: string): string {\n // If already snake_case, convert to uppercase directly\n if (str.includes('_')) {\n return str.toUpperCase();\n }\n\n // If camelCase, first convert to snake_case then uppercase\n return str\n .replace(/([A-Z])/g, '_$1') // Add underscore before uppercase letters\n .toLowerCase() // Convert to lowercase\n .replace(/^_/, '') // Remove leading underscore\n .toUpperCase(); // Convert to uppercase\n}\n","function extendedTypeof(val) {\n if (val === null) {\n return \"null\";\n }\n if (Array.isArray(val)) {\n return \"array\";\n }\n return typeof val;\n}\nfunction isObject(val) {\n return extendedTypeof(val) === \"object\";\n}\nfunction isAsyncIterable(val) {\n return typeof Object(val)[Symbol.asyncIterator] === \"function\";\n}\nfunction isAsyncGenerator(val) {\n return isObject(val) && typeof Object(val)[Symbol.asyncIterator] === \"function\" && typeof val.return === \"function\";\n}\nfunction areGraphQLFormattedErrors(obj) {\n return Array.isArray(obj) && // must be at least one error\n obj.length > 0 && // error has at least a message\n obj.every((ob) => \"message\" in ob);\n}\nfunction limitCloseReason(reason, whenTooLong) {\n return reason.length < 124 ? reason : whenTooLong;\n}\n\nconst GRAPHQL_TRANSPORT_WS_PROTOCOL = \"graphql-transport-ws\";\nconst DEPRECATED_GRAPHQL_WS_PROTOCOL = \"graphql-ws\";\nvar CloseCode = /* @__PURE__ */ ((CloseCode2) => {\n CloseCode2[CloseCode2[\"InternalServerError\"] = 4500] = \"InternalServerError\";\n CloseCode2[CloseCode2[\"InternalClientError\"] = 4005] = \"InternalClientError\";\n CloseCode2[CloseCode2[\"BadRequest\"] = 4400] = \"BadRequest\";\n CloseCode2[CloseCode2[\"BadResponse\"] = 4004] = \"BadResponse\";\n CloseCode2[CloseCode2[\"Unauthorized\"] = 4401] = \"Unauthorized\";\n CloseCode2[CloseCode2[\"Forbidden\"] = 4403] = \"Forbidden\";\n CloseCode2[CloseCode2[\"SubprotocolNotAcceptable\"] = 4406] = \"SubprotocolNotAcceptable\";\n CloseCode2[CloseCode2[\"ConnectionInitialisationTimeout\"] = 4408] = \"ConnectionInitialisationTimeout\";\n CloseCode2[CloseCode2[\"ConnectionAcknowledgementTimeout\"] = 4504] = \"ConnectionAcknowledgementTimeout\";\n CloseCode2[CloseCode2[\"SubscriberAlreadyExists\"] = 4409] = \"SubscriberAlreadyExists\";\n CloseCode2[CloseCode2[\"TooManyInitialisationRequests\"] = 4429] = \"TooManyInitialisationRequests\";\n return CloseCode2;\n})(CloseCode || {});\nvar MessageType = /* @__PURE__ */ ((MessageType2) => {\n MessageType2[\"ConnectionInit\"] = \"connection_init\";\n MessageType2[\"ConnectionAck\"] = \"connection_ack\";\n MessageType2[\"Ping\"] = \"ping\";\n MessageType2[\"Pong\"] = \"pong\";\n MessageType2[\"Subscribe\"] = \"subscribe\";\n MessageType2[\"Next\"] = \"next\";\n MessageType2[\"Error\"] = \"error\";\n MessageType2[\"Complete\"] = \"complete\";\n return MessageType2;\n})(MessageType || {});\nfunction validateMessage(val) {\n if (!isObject(val)) {\n throw new Error(\n `Message is expected to be an object, but got ${extendedTypeof(val)}`\n );\n }\n if (!val.type) {\n throw new Error(`Message is missing the 'type' property`);\n }\n if (typeof val.type !== \"string\") {\n throw new Error(\n `Message is expects the 'type' property to be a string, but got ${extendedTypeof(\n val.type\n )}`\n );\n }\n switch (val.type) {\n case \"connection_init\" /* ConnectionInit */:\n case \"connection_ack\" /* ConnectionAck */:\n case \"ping\" /* Ping */:\n case \"pong\" /* Pong */: {\n if (val.payload != null && !isObject(val.payload)) {\n throw new Error(\n `\"${val.type}\" message expects the 'payload' property to be an object or nullish or missing, but got \"${val.payload}\"`\n );\n }\n break;\n }\n case \"subscribe\" /* Subscribe */: {\n if (typeof val.id !== \"string\") {\n throw new Error(\n `\"${val.type}\" message expects the 'id' property to be a string, but got ${extendedTypeof(\n val.id\n )}`\n );\n }\n if (!val.id) {\n throw new Error(\n `\"${val.type}\" message requires a non-empty 'id' property`\n );\n }\n if (!isObject(val.payload)) {\n throw new Error(\n `\"${val.type}\" message expects the 'payload' property to be an object, but got ${extendedTypeof(\n val.payload\n )}`\n );\n }\n if (typeof val.payload.query !== \"string\") {\n throw new Error(\n `\"${val.type}\" message payload expects the 'query' property to be a string, but got ${extendedTypeof(\n val.payload.query\n )}`\n );\n }\n if (val.payload.variables != null && !isObject(val.payload.variables)) {\n throw new Error(\n `\"${val.type}\" message payload expects the 'variables' property to be a an object or nullish or missing, but got ${extendedTypeof(\n val.payload.variables\n )}`\n );\n }\n if (val.payload.operationName != null && extendedTypeof(val.payload.operationName) !== \"string\") {\n throw new Error(\n `\"${val.type}\" message payload expects the 'operationName' property to be a string or nullish or missing, but got ${extendedTypeof(\n val.payload.operationName\n )}`\n );\n }\n if (val.payload.extensions != null && !isObject(val.payload.extensions)) {\n throw new Error(\n `\"${val.type}\" message payload expects the 'extensions' property to be a an object or nullish or missing, but got ${extendedTypeof(\n val.payload.extensions\n )}`\n );\n }\n break;\n }\n case \"next\" /* Next */: {\n if (typeof val.id !== \"string\") {\n throw new Error(\n `\"${val.type}\" message expects the 'id' property to be a string, but got ${extendedTypeof(\n val.id\n )}`\n );\n }\n if (!val.id) {\n throw new Error(\n `\"${val.type}\" message requires a non-empty 'id' property`\n );\n }\n if (!isObject(val.payload)) {\n throw new Error(\n `\"${val.type}\" message expects the 'payload' property to be an object, but got ${extendedTypeof(\n val.payload\n )}`\n );\n }\n break;\n }\n case \"error\" /* Error */: {\n if (typeof val.id !== \"string\") {\n throw new Error(\n `\"${val.type}\" message expects the 'id' property to be a string, but got ${extendedTypeof(\n val.id\n )}`\n );\n }\n if (!val.id) {\n throw new Error(\n `\"${val.type}\" message requires a non-empty 'id' property`\n );\n }\n if (!areGraphQLFormattedErrors(val.payload)) {\n throw new Error(\n `\"${val.type}\" message expects the 'payload' property to be an array of GraphQL errors, but got ${JSON.stringify(\n val.payload\n )}`\n );\n }\n break;\n }\n case \"complete\" /* Complete */: {\n if (typeof val.id !== \"string\") {\n throw new Error(\n `\"${val.type}\" message expects the 'id' property to be a string, but got ${extendedTypeof(\n val.id\n )}`\n );\n }\n if (!val.id) {\n throw new Error(\n `\"${val.type}\" message requires a non-empty 'id' property`\n );\n }\n break;\n }\n default:\n throw new Error(`Invalid message 'type' property \"${val.type}\"`);\n }\n return val;\n}\nfunction parseMessage(data, reviver) {\n return validateMessage(\n typeof data === \"string\" ? JSON.parse(data, reviver) : data\n );\n}\nfunction stringifyMessage(msg, replacer) {\n validateMessage(msg);\n return JSON.stringify(msg, replacer);\n}\n\nexport { CloseCode as C, DEPRECATED_GRAPHQL_WS_PROTOCOL as D, GRAPHQL_TRANSPORT_WS_PROTOCOL as G, MessageType as M, isAsyncGenerator as a, isAsyncIterable as b, isObject as i, limitCloseReason as l, parseMessage as p, stringifyMessage as s, validateMessage as v };\n","import { G as GRAPHQL_TRANSPORT_WS_PROTOCOL, s as stringifyMessage, M as MessageType, C as CloseCode, l as limitCloseReason, p as parseMessage, i as isObject } from './common-CGW11Fyb.js';\nexport { D as DEPRECATED_GRAPHQL_WS_PROTOCOL, v as validateMessage } from './common-CGW11Fyb.js';\n\nfunction createClient(options) {\n const {\n url,\n connectionParams,\n lazy = true,\n onNonLazyError = console.error,\n lazyCloseTimeout: lazyCloseTimeoutMs = 0,\n keepAlive = 0,\n disablePong,\n connectionAckWaitTimeout = 0,\n retryAttempts = 5,\n retryWait = async function randomisedExponentialBackoff(retries2) {\n const retryDelaySeconds = Math.pow(2, retries2);\n await new Promise(\n (resolve) => setTimeout(\n resolve,\n retryDelaySeconds * 1e3 + // add random timeout from 300ms to 3s\n Math.floor(Math.random() * (3e3 - 300) + 300)\n )\n );\n },\n shouldRetry = isLikeCloseEvent,\n on,\n webSocketImpl,\n /**\n * Generates a v4 UUID to be used as the ID using `Math`\n * as the random number generator. Supply your own generator\n * in case you need more uniqueness.\n *\n * Reference: https://gist.github.com/jed/982883\n */\n generateID = function generateUUID() {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0, v = c == \"x\" ? r : r & 3 | 8;\n return v.toString(16);\n });\n },\n jsonMessageReplacer: replacer,\n jsonMessageReviver: reviver\n } = options;\n let ws;\n if (webSocketImpl) {\n if (!isWebSocket(webSocketImpl)) {\n throw new Error(\"Invalid WebSocket implementation provided\");\n }\n ws = webSocketImpl;\n } else if (typeof WebSocket !== \"undefined\") {\n ws = WebSocket;\n } else if (typeof global !== \"undefined\") {\n ws = global.WebSocket || // @ts-expect-error: Support more browsers\n global.MozWebSocket;\n } else if (typeof window !== \"undefined\") {\n ws = window.WebSocket || // @ts-expect-error: Support more browsers\n window.MozWebSocket;\n }\n if (!ws)\n throw new Error(\n \"WebSocket implementation missing; on Node you can `import WebSocket from 'ws';` and pass `webSocketImpl: WebSocket` to `createClient`\"\n );\n const WebSocketImpl = ws;\n const emitter = (() => {\n const message = /* @__PURE__ */ (() => {\n const listeners2 = {};\n return {\n on(id, listener) {\n listeners2[id] = listener;\n return () => {\n delete listeners2[id];\n };\n },\n emit(message2) {\n if (\"id\" in message2) listeners2[message2.id]?.(message2);\n }\n };\n })();\n const listeners = {\n connecting: on?.connecting ? [on.connecting] : [],\n opened: on?.opened ? [on.opened] : [],\n connected: on?.connected ? [on.connected] : [],\n ping: on?.ping ? [on.ping] : [],\n pong: on?.pong ? [on.pong] : [],\n message: on?.message ? [message.emit, on.message] : [message.emit],\n closed: on?.closed ? [on.closed] : [],\n error: on?.error ? [on.error] : []\n };\n return {\n onMessage: message.on,\n on(event, listener) {\n const l = listeners[event];\n l.push(listener);\n return () => {\n l.splice(l.indexOf(listener), 1);\n };\n },\n emit(event, ...args) {\n for (const listener of [...listeners[event]]) {\n listener(...args);\n }\n }\n };\n })();\n function errorOrClosed(cb) {\n const listening = [\n // errors are fatal and more critical than close events, throw them first\n emitter.on(\"error\", (err) => {\n listening.forEach((unlisten) => unlisten());\n cb(err);\n }),\n // closes can be graceful and not fatal, throw them second (if error didnt throw)\n emitter.on(\"closed\", (event) => {\n listening.forEach((unlisten) => unlisten());\n cb(event);\n })\n ];\n }\n let connecting, locks = 0, lazyCloseTimeout, retrying = false, retries = 0, disposed = false;\n async function connect() {\n clearTimeout(lazyCloseTimeout);\n const [socket, throwOnClose] = await (connecting ?? (connecting = new Promise(\n (connected, denied) => (async () => {\n if (retrying) {\n await retryWait(retries);\n if (!locks) {\n connecting = undefined;\n return denied({ code: 1e3, reason: \"All Subscriptions Gone\" });\n }\n retries++;\n }\n emitter.emit(\"connecting\", retrying);\n const socket2 = new WebSocketImpl(\n typeof url === \"function\" ? await url() : url,\n GRAPHQL_TRANSPORT_WS_PROTOCOL\n );\n let connectionAckTimeout, queuedPing;\n function enqueuePing() {\n if (isFinite(keepAlive) && keepAlive > 0) {\n clearTimeout(queuedPing);\n queuedPing = setTimeout(() => {\n if (socket2.readyState === WebSocketImpl.OPEN) {\n socket2.send(stringifyMessage({ type: MessageType.Ping }));\n emitter.emit(\"ping\", false, undefined);\n }\n }, keepAlive);\n }\n }\n errorOrClosed((errOrEvent) => {\n connecting = undefined;\n clearTimeout(connectionAckTimeout);\n clearTimeout(queuedPing);\n denied(errOrEvent);\n if (errOrEvent instanceof TerminatedCloseEvent) {\n socket2.close(4499, \"Terminated\");\n socket2.onerror = null;\n socket2.onclose = null;\n }\n });\n socket2.onerror = (err) => emitter.emit(\"error\", err);\n socket2.onclose = (event) => emitter.emit(\"closed\", event);\n socket2.onopen = async () => {\n try {\n emitter.emit(\"opened\", socket2);\n const payload = typeof connectionParams === \"function\" ? await connectionParams() : connectionParams;\n if (socket2.readyState !== WebSocketImpl.OPEN) return;\n socket2.send(\n stringifyMessage(\n payload ? {\n type: MessageType.ConnectionInit,\n payload\n } : {\n type: MessageType.ConnectionInit\n // payload is completely absent if not provided\n },\n replacer\n )\n );\n if (isFinite(connectionAckWaitTimeout) && connectionAckWaitTimeout > 0) {\n connectionAckTimeout = setTimeout(() => {\n socket2.close(\n CloseCode.ConnectionAcknowledgementTimeout,\n \"Connection acknowledgement timeout\"\n );\n }, connectionAckWaitTimeout);\n }\n enqueuePing();\n } catch (err) {\n emitter.emit(\"error\", err);\n socket2.close(\n CloseCode.InternalClientError,\n limitCloseReason(\n err instanceof Error ? err.message : String(err),\n \"Internal client error\"\n )\n );\n }\n };\n let acknowledged = false;\n socket2.onmessage = ({ data }) => {\n try {\n const message = parseMessage(data, reviver);\n emitter.emit(\"message\", message);\n if (message.type === \"ping\" || message.type === \"pong\") {\n emitter.emit(message.type, true, message.payload);\n if (message.type === \"pong\") {\n enqueuePing();\n } else if (!disablePong) {\n socket2.send(\n stringifyMessage(\n message.payload ? {\n type: MessageType.Pong,\n payload: message.payload\n } : {\n type: MessageType.Pong\n // payload is completely absent if not provided\n }\n )\n );\n emitter.emit(\"pong\", false, message.payload);\n }\n return;\n }\n if (acknowledged) return;\n if (message.type !== MessageType.ConnectionAck)\n throw new Error(\n `First message cannot be of type ${message.type}`\n );\n clearTimeout(connectionAckTimeout);\n acknowledged = true;\n emitter.emit(\"connected\", socket2, message.payload, retrying);\n retrying = false;\n retries = 0;\n connected([\n socket2,\n new Promise((_, reject) => errorOrClosed(reject))\n ]);\n } catch (err) {\n socket2.onmessage = null;\n emitter.emit(\"error\", err);\n socket2.close(\n CloseCode.BadResponse,\n limitCloseReason(\n err instanceof Error ? err.message : String(err),\n \"Bad response\"\n )\n );\n }\n };\n })()\n )));\n if (socket.readyState === WebSocketImpl.CLOSING) await throwOnClose;\n let release = () => {\n };\n const released = new Promise((resolve) => release = resolve);\n return [\n socket,\n release,\n Promise.race([\n // wait for\n released.then(() => {\n if (!locks) {\n const complete = () => socket.close(1e3, \"Normal Closure\");\n if (isFinite(lazyCloseTimeoutMs) && lazyCloseTimeoutMs > 0) {\n lazyCloseTimeout = setTimeout(() => {\n if (socket.readyState === WebSocketImpl.OPEN) complete();\n }, lazyCloseTimeoutMs);\n } else {\n complete();\n }\n }\n }),\n // or\n throwOnClose\n ])\n ];\n }\n function shouldRetryConnectOrThrow(errOrCloseEvent) {\n if (isLikeCloseEvent(errOrCloseEvent) && (isFatalInternalCloseCode(errOrCloseEvent.code) || [\n CloseCode.InternalServerError,\n CloseCode.InternalClientError,\n CloseCode.BadRequest,\n CloseCode.BadResponse,\n CloseCode.Unauthorized,\n // CloseCode.Forbidden, might grant access out after retry\n CloseCode.SubprotocolNotAcceptable,\n // CloseCode.ConnectionInitialisationTimeout, might not time out after retry\n // CloseCode.ConnectionAcknowledgementTimeout, might not time out after retry\n CloseCode.SubscriberAlreadyExists,\n CloseCode.TooManyInitialisationRequests\n // 4499, // Terminated, probably because the socket froze, we want to retry\n ].includes(errOrCloseEvent.code)))\n throw errOrCloseEvent;\n if (disposed) return false;\n if (isLikeCloseEvent(errOrCloseEvent) && errOrCloseEvent.code === 1e3)\n return locks > 0;\n if (!retryAttempts || retries >= retryAttempts) throw errOrCloseEvent;\n if (!shouldRetry(errOrCloseEvent)) throw errOrCloseEvent;\n return retrying = true;\n }\n if (!lazy) {\n (async () => {\n locks++;\n for (; ; ) {\n try {\n const [, , throwOnClose] = await connect();\n await throwOnClose;\n } catch (errOrCloseEvent) {\n try {\n if (!shouldRetryConnectOrThrow(errOrCloseEvent)) return;\n } catch (errOrCloseEvent2) {\n return onNonLazyError?.(errOrCloseEvent2);\n }\n }\n }\n })();\n }\n function subscribe(payload, sink) {\n const id = generateID(payload);\n let done = false, errored = false, releaser = () => {\n locks--;\n done = true;\n };\n (async () => {\n locks++;\n for (; ; ) {\n try {\n const [socket, release, waitForReleaseOrThrowOnClose] = await connect();\n if (done) return release();\n const unlisten = emitter.onMessage(id, (message) => {\n switch (message.type) {\n case MessageType.Next: {\n sink.next(message.payload);\n return;\n }\n case MessageType.Error: {\n errored = true, done = true;\n sink.error(message.payload);\n releaser();\n return;\n }\n case MessageType.Complete: {\n done = true;\n releaser();\n return;\n }\n }\n });\n socket.send(\n stringifyMessage(\n {\n id,\n type: MessageType.Subscribe,\n payload\n },\n replacer\n )\n );\n releaser = () => {\n if (!done && socket.readyState === WebSocketImpl.OPEN)\n socket.send(\n stringifyMessage(\n {\n id,\n type: MessageType.Complete\n },\n replacer\n )\n );\n locks--;\n done = true;\n release();\n };\n await waitForReleaseOrThrowOnClose.finally(unlisten);\n return;\n } catch (errOrCloseEvent) {\n if (!shouldRetryConnectOrThrow(errOrCloseEvent)) return;\n }\n }\n })().then(() => {\n if (!errored) sink.complete();\n }).catch((err) => {\n sink.error(err);\n });\n return () => {\n if (!done) releaser();\n };\n }\n return {\n on: emitter.on,\n subscribe,\n iterate(request) {\n const pending = [];\n const deferred = {\n done: false,\n error: null,\n resolve: () => {\n }\n };\n const dispose = subscribe(request, {\n next(val) {\n pending.push(val);\n deferred.resolve();\n },\n error(err) {\n deferred.done = true;\n deferred.error = err;\n deferred.resolve();\n },\n complete() {\n deferred.done = true;\n deferred.resolve();\n }\n });\n const iterator = async function* iterator2() {\n for (; ; ) {\n if (!pending.length) {\n await new Promise((resolve) => deferred.resolve = resolve);\n }\n while (pending.length) {\n yield pending.shift();\n }\n if (deferred.error) {\n throw deferred.error;\n }\n if (deferred.done) {\n return;\n }\n }\n }();\n iterator.throw = async (err) => {\n if (!deferred.done) {\n deferred.done = true;\n deferred.error = err;\n deferred.resolve();\n }\n return { done: true, value: undefined };\n };\n iterator.return = async () => {\n dispose();\n return { done: true, value: undefined };\n };\n return iterator;\n },\n async dispose() {\n disposed = true;\n if (connecting) {\n const [socket] = await connecting;\n socket.close(1e3, \"Normal Closure\");\n }\n },\n terminate() {\n if (connecting) {\n emitter.emit(\"closed\", new TerminatedCloseEvent());\n }\n }\n };\n}\nclass TerminatedCloseEvent extends Error {\n name = \"TerminatedCloseEvent\";\n message = \"4499: Terminated\";\n code = 4499;\n reason = \"Terminated\";\n wasClean = false;\n}\nfunction isLikeCloseEvent(val) {\n return isObject(val) && \"code\" in val && \"reason\" in val;\n}\nfunction isFatalInternalCloseCode(code) {\n if ([\n 1e3,\n // Normal Closure is not an erroneous close code\n 1001,\n // Going Away\n 1006,\n // Abnormal Closure\n 1005,\n // No Status Received\n 1012,\n // Service Restart\n 1013,\n // Try Again Later\n 1014\n // Bad Gateway\n ].includes(code))\n return false;\n return code >= 1e3 && code <= 1999;\n}\nfunction isWebSocket(val) {\n return typeof val === \"function\" && \"constructor\" in val && \"CLOSED\" in val && \"CLOSING\" in val && \"CONNECTING\" in val && \"OPEN\" in val;\n}\n\nexport { CloseCode, GRAPHQL_TRANSPORT_WS_PROTOCOL, MessageType, TerminatedCloseEvent, createClient, parseMessage, stringifyMessage };\n","export { TerminatedCloseEvent, createClient } from './client.js';\nexport { a as areGraphQLErrors, h as handleProtocols, m as makeServer } from './server-BN3ZJY-a.js';\nexport { C as CloseCode, D as DEPRECATED_GRAPHQL_WS_PROTOCOL, G as GRAPHQL_TRANSPORT_WS_PROTOCOL, M as MessageType, p as parseMessage, s as stringifyMessage, v as validateMessage } from './common-CGW11Fyb.js';\nimport 'graphql';\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../../../node_modules/.pnpm/graphql-ws@6.0.5_graphql@15.10.1_ws@8.18.2/node_modules/graphql-ws/dist/common-CGW11Fyb.js","../../../node_modules/.pnpm/graphql-ws@6.0.5_graphql@15.10.1_ws@8.18.2/node_modules/graphql-ws/dist/client.js","../../../node_modules/.pnpm/graphql-ws@6.0.5_graphql@15.10.1_ws@8.18.2/node_modules/graphql-ws/dist/index.js"],"sourcesContent":["import {\n ApolloClient,\n InMemoryCache,\n gql,\n createHttpLink,\n split,\n NormalizedCacheObject,\n WatchQueryOptions,\n QueryOptions as ApolloQueryOptions,\n SubscriptionOptions as ApolloSubscriptionOptions,\n Observable,\n from,\n ApolloLink,\n FetchPolicy,\n OperationVariables,\n} from '@apollo/client';\nimport { RetryLink } from '@apollo/client/link/retry';\nimport { GraphQLWsLink } from '@apollo/client/link/subscriptions';\nimport { getMainDefinition } from '@apollo/client/utilities';\nimport { createClient } from 'graphql-ws';\nimport pluralize from 'pluralize';\n\nimport {\n DubheClientConfig,\n Connection,\n BaseQueryParams,\n OrderBy,\n JsonPathOrder,\n QueryOptions,\n QueryResult,\n SubscriptionResult,\n SubscriptionOptions,\n StringFilter,\n NumberFilter,\n DateFilter,\n StoreTableRow,\n TypedDocumentNode,\n CachePolicy,\n MultiTableSubscriptionConfig,\n MultiTableSubscriptionResult,\n MultiTableSubscriptionData,\n ParsedTableInfo,\n DubheMetadata,\n} from './types';\n\n// Convert cache policy type\nfunction mapCachePolicyToFetchPolicy(cachePolicy: CachePolicy): FetchPolicy {\n switch (cachePolicy) {\n case 'cache-first':\n return 'cache-first';\n case 'network-only':\n return 'network-only';\n case 'cache-only':\n return 'cache-only';\n case 'no-cache':\n return 'no-cache';\n case 'standby':\n return 'standby';\n default:\n return 'cache-first';\n }\n}\n\nexport class DubheGraphqlClient {\n private apolloClient: ApolloClient<NormalizedCacheObject>;\n private subscriptionClient?: any;\n private dubheMetadata?: DubheMetadata;\n private parsedTables: Map<string, ParsedTableInfo> = new Map();\n\n constructor(config: DubheClientConfig) {\n // Save dubhe metadata\n this.dubheMetadata = config.dubheMetadata;\n\n // If dubhe metadata is provided, parse table information\n if (this.dubheMetadata) {\n this.parseTableInfoFromConfig();\n }\n\n // Create HTTP Link\n const httpLink = createHttpLink({\n uri: config.endpoint,\n headers: config.headers,\n fetch: (input, init) => fetch(input, { ...config.fetchOptions, ...init }),\n });\n\n // Create retry link\n const retryLink = new RetryLink({\n delay: {\n // Initial retry delay time (milliseconds)\n initial: config.retryOptions?.delay?.initial || 300,\n // Maximum retry delay time (milliseconds)\n max: config.retryOptions?.delay?.max || 5000,\n // Whether to add random jitter to avoid thundering herd, enabled by default\n jitter: config.retryOptions?.delay?.jitter !== false,\n },\n attempts: {\n // Maximum number of attempts (including initial request)\n max: config.retryOptions?.attempts?.max || 5,\n // Custom retry condition function\n retryIf:\n config.retryOptions?.attempts?.retryIf ||\n ((error, _operation) => {\n // Default retry strategy:\n // 1. Network connection errors\n // 2. Server errors but no GraphQL errors (indicates service temporarily unavailable)\n return Boolean(\n error &&\n (error.networkError ||\n (error.graphQLErrors && error.graphQLErrors.length === 0))\n );\n }),\n },\n });\n\n // Combine HTTP link and retry link\n const httpWithRetryLink = from([retryLink, httpLink]);\n\n let link: ApolloLink = httpWithRetryLink;\n\n // If subscription endpoint is provided, create WebSocket Link\n if (config.subscriptionEndpoint) {\n // Automatically import ws module in Node.js environment\n let webSocketImpl;\n try {\n // Check if in Node.js environment\n if (typeof window === 'undefined' && typeof global !== 'undefined') {\n // Node.js environment, need to import ws\n const wsModule = require('ws');\n webSocketImpl = wsModule.default || wsModule;\n\n // Set global WebSocket in Node.js environment to avoid apollo client internal errors\n if (typeof (global as any).WebSocket === 'undefined') {\n (global as any).WebSocket = webSocketImpl;\n }\n } else {\n // Browser environment, use native WebSocket\n webSocketImpl = WebSocket;\n }\n } catch (error) {\n // Ignore ws import errors\n }\n\n const clientOptions: any = {\n url: config.subscriptionEndpoint,\n connectionParams: {\n headers: config.headers,\n },\n };\n\n // Only add webSocketImpl if in Node.js environment and ws was successfully imported\n if (webSocketImpl && typeof window === 'undefined') {\n clientOptions.webSocketImpl = webSocketImpl;\n }\n\n this.subscriptionClient = createClient(clientOptions);\n\n const wsLink = new GraphQLWsLink(this.subscriptionClient);\n\n // Use split to decide which link to use\n link = split(\n ({ query }) => {\n const definition = getMainDefinition(query);\n return (\n definition.kind === 'OperationDefinition' &&\n definition.operation === 'subscription'\n );\n },\n wsLink,\n httpWithRetryLink\n );\n }\n\n // Create Apollo Client instance\n this.apolloClient = new ApolloClient({\n link,\n cache:\n config.cacheConfig?.paginatedTables &&\n config.cacheConfig.paginatedTables.length > 0\n ? new InMemoryCache({\n typePolicies: {\n // Configure cache strategy for Connection type\n Query: {\n fields: this.buildCacheFields(config.cacheConfig),\n },\n },\n })\n : new InMemoryCache(), // Use simple cache by default\n defaultOptions: {\n watchQuery: {\n errorPolicy: 'all',\n notifyOnNetworkStatusChange: true,\n },\n query: {\n errorPolicy: 'all',\n },\n },\n });\n }\n\n /**\n * Execute GraphQL query\n */\n async query<\n TData,\n TVariables extends OperationVariables = OperationVariables,\n >(\n query: TypedDocumentNode<TData, TVariables>,\n variables?: TVariables,\n options?: QueryOptions\n ): Promise<QueryResult<TData>> {\n try {\n const result = await this.apolloClient.query({\n query,\n variables,\n fetchPolicy: options?.cachePolicy\n ? mapCachePolicyToFetchPolicy(options.cachePolicy)\n : 'no-cache',\n // : 'cache-first',\n notifyOnNetworkStatusChange: options?.notifyOnNetworkStatusChange,\n pollInterval: options?.pollInterval,\n });\n\n return {\n data: result.data,\n loading: result.loading,\n error: result.error,\n networkStatus: result.networkStatus,\n refetch: () => this.query(query, variables, options),\n };\n } catch (error) {\n return {\n data: undefined,\n loading: false,\n error: error as Error,\n networkStatus: 8, // NetworkStatus.error\n refetch: () => this.query(query, variables, options),\n };\n }\n }\n\n /**\n * Execute GraphQL subscription\n */\n subscribe<TData, TVariables extends OperationVariables = OperationVariables>(\n subscription: TypedDocumentNode<TData, TVariables>,\n variables?: TVariables,\n options?: SubscriptionOptions\n ): Observable<SubscriptionResult<TData>> {\n return new Observable((observer: any) => {\n const sub = this.apolloClient\n .subscribe({\n query: subscription,\n variables,\n })\n .subscribe({\n next: (result: any) => {\n const subscriptionResult: SubscriptionResult<TData> = {\n data: result.data,\n loading: false,\n error: result.errors?.[0] as Error,\n };\n observer.next(subscriptionResult);\n options?.onData?.(result.data);\n },\n error: (error: any) => {\n const subscriptionResult: SubscriptionResult<TData> = {\n data: undefined,\n loading: false,\n error,\n };\n observer.next(subscriptionResult);\n options?.onError?.(error);\n },\n complete: () => {\n observer.complete();\n options?.onComplete?.();\n },\n });\n\n return () => sub.unsubscribe();\n });\n }\n\n /**\n * Query all table data - Adapted to API without store prefix\n *\n * OrderBy field name support:\n * - camelCase: { field: 'updatedAt', direction: 'DESC' } → UPDATED_AT_DESC\n * - snake_case: { field: 'updated_at', direction: 'DESC' } → UPDATED_AT_DESC\n *\n * Usage examples:\n * ```ts\n * // Using camelCase field names\n * const result = await client.getAllTables('account', {\n * orderBy: [{ field: 'updatedAt', direction: 'DESC' }]\n * });\n *\n * // Using snake_case field names\n * const result = await client.getAllTables('account', {\n * orderBy: [{ field: 'updated_at', direction: 'DESC' }]\n * });\n *\n * // Mixed usage\n * const result = await client.getAllTables('account', {\n * orderBy: [\n * { field: 'updatedAt', direction: 'DESC' },\n * { field: 'created_at', direction: 'ASC' }\n * ]\n * });\n * ```\n */\n async getAllTables<T extends StoreTableRow>(\n tableName: string,\n params?: BaseQueryParams & {\n filter?: Record<string, any>;\n orderBy?: OrderBy[];\n fields?: string[]; // Allow users to specify fields to query, auto-parse from dubhe config if not specified\n }\n ): Promise<Connection<T>> {\n // Ensure using plural form of table name\n const pluralTableName = this.getPluralTableName(tableName);\n\n // Convert OrderBy to enum values\n const orderByEnums = convertOrderByToEnum(params?.orderBy);\n\n // Dynamically build query\n const query = gql`\n query GetAllTables(\n $first: Int\n $last: Int\n $after: Cursor\n $before: Cursor\n $filter: ${this.getFilterTypeName(tableName)}\n $orderBy: [${this.getOrderByTypeName(tableName)}!]\n ) {\n ${pluralTableName}(\n first: $first\n last: $last\n after: $after\n before: $before\n filter: $filter\n orderBy: $orderBy\n ) {\n totalCount\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n edges {\n cursor\n node {\n ${this.convertTableFields(tableName, params?.fields)}\n }\n }\n }\n }\n `;\n\n // Build query parameters using enum values\n const queryParams = {\n first: params?.first,\n last: params?.last,\n after: params?.after,\n before: params?.before,\n filter: params?.filter,\n orderBy: orderByEnums,\n };\n\n // const result = await this.query(query, queryParams, {\n // cachePolicy: 'no-cache',\n // });\n\n const result = await this.query(query, queryParams);\n\n if (result.error) {\n throw result.error;\n }\n\n return (\n (result.data as any)?.[pluralTableName] || {\n edges: [],\n pageInfo: { hasNextPage: false, hasPreviousPage: false },\n }\n );\n }\n\n /**\n * Get single table record by condition - Adapted to API without store prefix\n */\n async getTableByCondition<T extends StoreTableRow>(\n tableName: string,\n condition: Record<string, any>,\n fields?: string[] // Allow users to specify fields to query\n ): Promise<T | null> {\n // Build query field name, e.g.: accountByAssetIdAndAccount\n const conditionKeys = Object.keys(condition);\n\n // Use singular form of table name for single record query\n const singularTableName = this.getSingularTableName(tableName);\n\n const query = gql`\n query GetTableByCondition(${conditionKeys.map((key, index) => `$${key}: String!`).join(', ')}) {\n ${singularTableName}(${conditionKeys.map((key) => `${key}: $${key}`).join(', ')}) {\n ${this.convertTableFields(tableName, fields)}\n }\n }\n `;\n\n const result = await this.query(query, condition);\n\n if (result.error) {\n throw result.error;\n }\n\n return (result.data as any)?.[singularTableName] || null;\n }\n\n /**\n * Subscribe to table data changes - Using PostGraphile's listen subscription feature\n */\n subscribeToTableChanges<T extends StoreTableRow>(\n tableName: string,\n options?: SubscriptionOptions & {\n fields?: string[]; // Allow users to specify fields to subscribe to\n initialEvent?: boolean; // Whether to trigger initial event immediately\n first?: number; // Limit the number of returned records\n topicPrefix?: string; // Custom topic prefix, defaults to table name\n }\n ): Observable<SubscriptionResult<{ listen: { query: any } }>> {\n // PostGraphile automatically adds 'postgraphile:' prefix to all topics\n // So here we use more concise topic naming\n const topic = options?.topicPrefix\n ? `${options.topicPrefix}${tableName}`\n : `store_${this.getSingularTableName(tableName)}`;\n\n const pluralTableName = this.getPluralTableName(tableName); // Ensure using plural form\n const fields = this.convertTableFields(tableName, options?.fields);\n\n const subscription = gql`\n subscription ListenToTableChanges($topic: String!, $initialEvent: Boolean) {\n listen(topic: $topic, initialEvent: $initialEvent) {\n query {\n ${pluralTableName}(first: ${options?.first || 10}, orderBy: UPDATED_AT_DESC) {\n totalCount\n nodes {\n ${fields}\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n }\n }\n `;\n\n return this.subscribe(\n subscription,\n {\n topic,\n initialEvent: options?.initialEvent || false,\n },\n options\n );\n }\n\n /**\n * Advanced listen subscription - Support custom queries\n */\n subscribeWithListen<T = any>(\n topic: string,\n query: string,\n options?: SubscriptionOptions & {\n initialEvent?: boolean;\n variables?: Record<string, any>;\n }\n ): Observable<SubscriptionResult<{ listen: { query: T } }>> {\n const subscription = gql`\n subscription CustomListenSubscription($topic: String!, $initialEvent: Boolean) {\n listen(topic: $topic, initialEvent: $initialEvent) {\n query {\n ${query}\n }\n }\n }\n `;\n\n return this.subscribe(\n subscription,\n {\n topic,\n initialEvent: options?.initialEvent || false,\n ...options?.variables,\n },\n options\n );\n }\n\n /**\n * Subscribe to data changes with specific conditions\n */\n subscribeToFilteredTableChanges<T extends StoreTableRow>(\n tableName: string,\n filter?: Record<string, any>,\n options?: SubscriptionOptions & {\n fields?: string[];\n initialEvent?: boolean;\n orderBy?: OrderBy[];\n first?: number;\n topicPrefix?: string; // Custom topic prefix\n }\n ): Observable<SubscriptionResult<{ listen: { query: any } }>> {\n // Improved topic naming, support custom prefix\n const topic = options?.topicPrefix\n ? `${options.topicPrefix}${tableName}`\n : `store_${this.getSingularTableName(tableName)}`;\n\n const pluralTableName = this.getPluralTableName(tableName); // Ensure using plural form\n const fields = this.convertTableFields(tableName, options?.fields);\n const orderByEnum = convertOrderByToEnum(options?.orderBy);\n const first = options?.first || 10;\n\n const subscription = gql`\n subscription FilteredListenSubscription(\n $topic: String!, \n $initialEvent: Boolean,\n $filter: ${this.getFilterTypeName(tableName)},\n $orderBy: [${this.getOrderByTypeName(tableName)}!],\n $first: Int\n ) {\n listen(topic: $topic, initialEvent: $initialEvent) {\n query {\n ${pluralTableName}(\n first: $first, \n filter: $filter, \n orderBy: $orderBy\n ) {\n totalCount\n nodes {\n ${fields}\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n }\n }\n `;\n\n return this.subscribe(\n subscription,\n {\n topic,\n initialEvent: options?.initialEvent || false,\n filter,\n orderBy: orderByEnum,\n first,\n },\n options\n );\n }\n\n /**\n * Subscribe to multiple table data changes - Support batch subscription of table name list\n */\n subscribeToMultipleTables<T extends StoreTableRow>(\n tableConfigs: MultiTableSubscriptionConfig[],\n globalOptions?: SubscriptionOptions\n ): Observable<MultiTableSubscriptionData> {\n return new Observable((observer: any) => {\n const subscriptions: Array<{ tableName: string; subscription: any }> = [];\n const latestData: MultiTableSubscriptionData = {};\n\n // Create independent subscription for each table\n tableConfigs.forEach(({ tableName, options }) => {\n const subscription = this.subscribeToFilteredTableChanges<T>(\n tableName,\n options?.filter,\n {\n ...options,\n onData: (data) => {\n // Update latest data for this table\n latestData[tableName] = data;\n\n // Call table-level callback\n if (options?.onData) {\n options.onData(data);\n }\n\n // Call global callback\n if (globalOptions?.onData) {\n globalOptions.onData(latestData);\n }\n\n // Send complete multi-table data\n observer.next({ ...latestData });\n },\n onError: (error) => {\n // Call table-level error callback\n if (options?.onError) {\n options.onError(error);\n }\n\n // Call global error callback\n if (globalOptions?.onError) {\n globalOptions.onError(error);\n }\n\n // Send error\n observer.error(error);\n },\n }\n );\n\n subscriptions.push({ tableName, subscription });\n });\n\n // Start all subscriptions\n const activeSubscriptions = subscriptions.map(({ subscription }) =>\n subscription.subscribe()\n );\n\n // Return cleanup function\n return () => {\n activeSubscriptions.forEach((sub) => sub.unsubscribe());\n\n // Call completion callback\n if (globalOptions?.onComplete) {\n globalOptions.onComplete();\n }\n };\n });\n }\n\n /**\n * Simplified multi-table subscription - Support table name array and unified configuration\n */\n subscribeToTableList<T extends StoreTableRow>(\n tableNames: string[],\n options?: SubscriptionOptions & {\n fields?: string[];\n filter?: Record<string, any>;\n initialEvent?: boolean;\n first?: number;\n topicPrefix?: string;\n }\n ): Observable<MultiTableSubscriptionData> {\n const tableConfigs: MultiTableSubscriptionConfig[] = tableNames.map(\n (tableName) => ({\n tableName,\n options: {\n ...options,\n // Use same configuration for each table\n fields: options?.fields,\n filter: options?.filter,\n initialEvent: options?.initialEvent,\n first: options?.first,\n topicPrefix: options?.topicPrefix,\n },\n })\n );\n\n return this.subscribeToMultipleTables<T>(tableConfigs, options);\n }\n\n /**\n * Build dynamic query - Adapted to API without store prefix\n */\n buildQuery(\n tableName: string,\n fields: string[],\n params?: {\n filter?: Record<string, any>;\n orderBy?: OrderBy[];\n first?: number;\n after?: string;\n }\n ): TypedDocumentNode {\n const pluralTableName = this.getPluralTableName(tableName); // Ensure using plural form\n const fieldSelection = fields.join('\\n ');\n\n return gql`\n query DynamicQuery(\n $first: Int\n $after: Cursor\n $filter: ${this.getFilterTypeName(tableName)}\n $orderBy: [${this.getOrderByTypeName(tableName)}!]\n ) {\n ${pluralTableName}(\n first: $first\n after: $after\n filter: $filter\n orderBy: $orderBy\n ) {\n totalCount\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n ${fieldSelection}\n }\n }\n }\n }\n `;\n }\n\n /**\n * Batch query multiple tables - Adapted to API without store prefix\n */\n async batchQuery<T extends Record<string, any>>(\n queries: Array<{\n key: string;\n tableName: string;\n params?: BaseQueryParams & {\n filter?: Record<string, any>;\n orderBy?: OrderBy[];\n fields?: string[]; // Allow users to specify fields to query\n };\n }>\n ): Promise<Record<string, Connection<StoreTableRow>>> {\n const batchPromises = queries.map(async ({ key, tableName, params }) => {\n const result = await this.getAllTables(tableName, params);\n return { key, result };\n });\n\n const results = await Promise.all(batchPromises);\n\n return results.reduce(\n (acc, { key, result }) => {\n acc[key] = result;\n return acc;\n },\n {} as Record<string, Connection<StoreTableRow>>\n );\n }\n\n /**\n * Real-time data stream listener - Adapted to API without store prefix\n */\n createRealTimeDataStream<T extends StoreTableRow>(\n tableName: string,\n initialQuery?: BaseQueryParams & { filter?: Record<string, any> }\n ): Observable<Connection<T>> {\n return new Observable((observer: any) => {\n // First execute initial query\n this.getAllTables<T>(tableName, initialQuery)\n .then((initialData) => {\n observer.next(initialData);\n })\n .catch((error) => observer.error(error));\n\n // Then subscribe to real-time updates\n const subscription = this.subscribeToTableChanges<T>(tableName, {\n onData: () => {\n // When data changes, re-execute query\n this.getAllTables<T>(tableName, initialQuery)\n .then((updatedData) => {\n observer.next(updatedData);\n })\n .catch((error) => observer.error(error));\n },\n onError: (error) => observer.error(error),\n });\n\n return () => subscription.subscribe().unsubscribe();\n });\n }\n\n // Improved table name handling methods\n private getFilterTypeName(tableName: string): string {\n // Convert to singular form and apply PascalCase conversion\n const singularName = this.getSingularTableName(tableName);\n const pascalCaseName = this.toPascalCase(singularName);\n\n // If already starts with Store, don't add Store prefix again\n if (pascalCaseName.startsWith('Store')) {\n return `${pascalCaseName}Filter`;\n }\n\n return `Store${pascalCaseName}Filter`;\n }\n\n private getOrderByTypeName(tableName: string): string {\n // Convert to plural form and apply PascalCase conversion\n const pluralName = this.getPluralTableName(tableName);\n const pascalCaseName = this.toPascalCase(pluralName);\n\n // If already starts with Store, don't add Store prefix again\n if (pascalCaseName.startsWith('Store')) {\n return `${pascalCaseName}OrderBy`;\n }\n\n return `Store${pascalCaseName}OrderBy`;\n }\n\n /**\n * Convert singular table name to plural form (using pluralize library for correctness)\n */\n private getPluralTableName(tableName: string): string {\n // First convert to camelCase\n const camelCaseName = this.toCamelCase(tableName);\n\n // Use pluralize library for pluralization\n return pluralize.plural(camelCaseName);\n }\n\n /**\n * Convert plural table name to singular form (using pluralize library for correctness)\n */\n private getSingularTableName(tableName: string): string {\n // First convert to camelCase\n const camelCaseName = this.toCamelCase(tableName);\n\n // Use pluralize library for singularization\n return pluralize.singular(camelCaseName);\n }\n\n /**\n * Convert snake_case to camelCase\n */\n private toCamelCase(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n }\n\n /**\n * Convert snake_case to PascalCase\n */\n private toPascalCase(str: string): string {\n const camelCase = this.toCamelCase(str);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n }\n\n /**\n * Convert camelCase or snake_case to SNAKE_CASE (for GraphQL enum values)\n * Example: updatedAt -> UPDATED_AT, updated_at -> UPDATED_AT\n */\n private toSnakeCase(str: string): string {\n // If already snake_case, convert to uppercase directly\n if (str.includes('_')) {\n return str.toUpperCase();\n }\n\n // If camelCase, first convert to snake_case then uppercase\n return str\n .replace(/([A-Z])/g, '_$1') // Add underscore before uppercase letters\n .toLowerCase() // Convert to lowercase\n .replace(/^_/, '') // Remove leading underscore\n .toUpperCase(); // Convert to uppercase\n }\n\n // private buildSingleQueryName(\n // tableName: string,\n // conditionKeys: string[]\n // ): string {\n // // Use camelCase conversion\n // const camelCaseTableName = this.toCamelCase(tableName);\n // const capitalizedKeys = conditionKeys.map(\n // (key) => key.charAt(0).toUpperCase() + key.slice(1)\n // );\n // return `${camelCaseTableName}By${capitalizedKeys.join('And')}`;\n // }\n\n /**\n * Clear Apollo Client cache\n */\n async clearCache(): Promise<void> {\n await this.apolloClient.clearStore();\n }\n\n /**\n * Reset Apollo Client cache\n */\n async resetCache(): Promise<void> {\n await this.apolloClient.resetStore();\n }\n\n /**\n * Get Apollo Client instance (for advanced usage)\n */\n getApolloClient(): ApolloClient<NormalizedCacheObject> {\n return this.apolloClient;\n }\n\n /**\n * Close client connection\n */\n close(): void {\n if (this.subscriptionClient) {\n this.subscriptionClient.dispose();\n }\n }\n\n /**\n * Get Dubhe metadata\n */\n getDubheMetadata(): DubheMetadata | undefined {\n return this.dubheMetadata;\n }\n\n /**\n * Build dynamic cache field configuration\n */\n private buildCacheFields(\n cacheConfig?: DubheClientConfig['cacheConfig']\n ): Record<string, any> {\n const fields: Record<string, any> = {};\n\n // If no configuration, return empty field configuration\n if (!cacheConfig) {\n return fields;\n }\n\n // Create pagination cache strategy for each configured table\n if (cacheConfig.paginatedTables) {\n cacheConfig.paginatedTables.forEach((tableName) => {\n // Ensure using plural form of table name\n const pluralTableName = this.getPluralTableName(tableName);\n\n // Check if there's a custom merge strategy\n const customStrategy =\n cacheConfig.customMergeStrategies?.[pluralTableName];\n\n fields[pluralTableName] = {\n keyArgs: customStrategy?.keyArgs || ['filter', 'orderBy'],\n merge: customStrategy?.merge || this.defaultMergeStrategy,\n };\n });\n }\n\n // Apply custom merge strategies (if any)\n if (cacheConfig.customMergeStrategies) {\n Object.entries(cacheConfig.customMergeStrategies).forEach(\n ([tableName, strategy]) => {\n // If table name hasn't been configured yet, add it\n if (!fields[tableName]) {\n fields[tableName] = {\n keyArgs: strategy.keyArgs || ['filter', 'orderBy'],\n merge: strategy.merge || this.defaultMergeStrategy,\n };\n }\n }\n );\n }\n\n return fields;\n }\n\n /**\n * Default pagination merge strategy\n */\n private defaultMergeStrategy(existing = { edges: [] }, incoming: any) {\n // Safety check, ensure incoming has edges property\n if (!incoming || !Array.isArray(incoming.edges)) {\n return existing;\n }\n return {\n ...incoming,\n edges: [...(existing.edges || []), ...incoming.edges],\n };\n }\n\n /**\n * Parse table information from dubhe metadata\n */\n private parseTableInfoFromConfig(): void {\n if (!this.dubheMetadata) {\n return;\n }\n\n const { components = [], resources = [], enums = [] } = this.dubheMetadata;\n\n // Process components array\n components.forEach((componentObj: any) => {\n Object.entries(componentObj).forEach(\n ([componentName, componentData]: [string, any]) => {\n this.processTableData(componentName, componentData, enums);\n }\n );\n });\n\n // Process resources array\n resources.forEach((resourceObj: any) => {\n Object.entries(resourceObj).forEach(\n ([resourceName, resourceData]: [string, any]) => {\n this.processTableData(resourceName, resourceData, enums);\n }\n );\n });\n }\n\n /**\n * Process data for a single table\n */\n private processTableData(\n tableName: string,\n tableData: any,\n enums: any[]\n ): void {\n // Handle table name: convert to camelCase if it contains underscores, otherwise keep as is\n const normalizedTableName = tableName.includes('_')\n ? this.toCamelCase(tableName)\n : tableName;\n\n const fields: string[] = [];\n const enumFields: Record<string, string[]> = {};\n\n // Process fields array\n if (tableData.fields && Array.isArray(tableData.fields)) {\n tableData.fields.forEach((fieldObj: any) => {\n Object.entries(fieldObj).forEach(\n ([fieldName, fieldType]: [string, any]) => {\n const fieldNameCamelCase = this.toCamelCase(fieldName);\n fields.push(fieldNameCamelCase);\n // Check if it's an enum type\n // const typeStr = String(fieldType);\n // if (enums.length > 0) {\n // // Process enum types as needed here\n // // enumFields[fieldNameCamelCase] = [...];\n // }\n }\n );\n });\n }\n\n // Add system fields\n fields.push('createdAt', 'updatedAt');\n\n // Process primary keys\n const primaryKeys: string[] = tableData.keys.map((key: string) =>\n this.toCamelCase(key)\n );\n\n const tableInfo: ParsedTableInfo = {\n tableName: normalizedTableName,\n fields: [...new Set(fields)], // Remove duplicates\n primaryKeys,\n enumFields,\n };\n\n // Store both original and normalized table names as keys for lookup\n this.parsedTables.set(tableName, tableInfo);\n this.parsedTables.set(normalizedTableName, tableInfo);\n\n // If original and normalized table names are different, also store the snake_case version\n if (tableName !== normalizedTableName) {\n this.parsedTables.set(this.toSnakeCase(normalizedTableName), tableInfo);\n }\n }\n\n /**\n * Find table info with multiple lookup strategies\n */\n private findTableInfo(tableName: string): ParsedTableInfo | undefined {\n // Try direct lookup first\n let tableInfo = this.parsedTables.get(tableName);\n if (tableInfo) return tableInfo;\n\n // Try camelCase version\n const camelCaseTableName = this.toCamelCase(tableName);\n tableInfo = this.parsedTables.get(camelCaseTableName);\n if (tableInfo) return tableInfo;\n\n // Try snake_case version (only if it's different from original)\n if (tableName.includes('_')) {\n tableInfo = this.parsedTables.get(tableName.toLowerCase());\n if (tableInfo) return tableInfo;\n }\n\n return undefined;\n }\n\n /**\n * Get table field information\n */\n getTableFields(tableName: string): string[] {\n // Use getMinimalFields directly for clearer logic\n return this.getMinimalFields(tableName);\n }\n\n /**\n * Get table primary key information\n */\n getTablePrimaryKeys(tableName: string): string[] {\n const tableInfo = this.findTableInfo(tableName);\n return tableInfo?.primaryKeys || [];\n }\n\n /**\n * Get table enum field information\n */\n getTableEnumFields(tableName: string): Record<string, string[]> {\n const tableInfo = this.findTableInfo(tableName);\n return tableInfo?.enumFields || {};\n }\n\n /**\n * Get all parsed table information\n */\n getAllTableInfo(): Map<string, ParsedTableInfo> {\n return new Map(this.parsedTables);\n }\n\n /**\n * Get table's minimal field set (for fallback)\n */\n getMinimalFields(tableName: string): string[] {\n // If there's configuration, use fields from configuration\n const tableInfo = this.findTableInfo(tableName);\n\n if (tableInfo) {\n return tableInfo.fields;\n }\n\n return ['createdAt', 'updatedAt'];\n }\n\n /**\n * Convert table fields to GraphQL query string\n */\n private convertTableFields(\n tableName: string,\n customFields?: string[]\n ): string {\n let fields: string[];\n\n if (customFields && customFields.length > 0) {\n fields = customFields;\n } else {\n // Try to get fields from dubhe configuration\n const autoFields = this.getTableFields(tableName);\n if (autoFields.length > 0) {\n fields = autoFields;\n } else {\n fields = ['createdAt', 'updatedAt'];\n }\n }\n\n // Field resolution debug logging disabled for cleaner output\n\n return fields.join('\\n ');\n }\n}\n\n// Export convenience function\nexport function createDubheGraphqlClient(\n config: DubheClientConfig\n): DubheGraphqlClient {\n return new DubheGraphqlClient(config);\n}\n\n// Export common GraphQL query builders\nexport const QueryBuilders = {\n // Build basic query - Adapted to API without store prefix\n basic: (\n tableName: string,\n fields: string[] = ['createdAt', 'updatedAt']\n ) => gql`\n query Basic${tableName.charAt(0).toUpperCase() + tableName.slice(1)}Query(\n $first: Int\n $after: String\n $filter: ${tableName.charAt(0).toUpperCase() + tableName.slice(1)}Filter\n ) {\n ${tableName}(first: $first, after: $after, filter: $filter) {\n totalCount\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n ${fields.join('\\n ')}\n }\n }\n }\n }\n `,\n\n // Build subscription query - Adapted to API without store prefix\n subscription: (tableName: string) => gql`\n subscription ${tableName.charAt(0).toUpperCase() + tableName.slice(1)}Subscription {\n ${tableName.charAt(0).toLowerCase() + tableName.slice(1)}Changed {\n createdAt\n updatedAt\n }\n }\n `,\n};\n\n/**\n * Helper function: Convert OrderBy format\n * Support camelCase and snake_case field names conversion to GraphQL enum values\n * Example: updatedAt -> UPDATED_AT_ASC, updated_at -> UPDATED_AT_ASC\n */\nfunction convertOrderByToEnum(orderBy?: OrderBy[]): string[] {\n if (!orderBy || orderBy.length === 0) {\n return ['NATURAL'];\n }\n\n return orderBy.map((order) => {\n // Use unified conversion function to handle field names\n const field = toSnakeCaseForEnum(order.field);\n const direction = order.direction === 'DESC' ? 'DESC' : 'ASC';\n\n // Combine field name and direction into enum value\n return `${field}_${direction}`;\n });\n}\n\n/**\n * Convert camelCase or snake_case to SNAKE_CASE (for GraphQL enum values)\n * Example: updatedAt -> UPDATED_AT, updated_at -> UPDATED_AT\n */\nfunction toSnakeCaseForEnum(str: string): string {\n // If already snake_case, convert to uppercase directly\n if (str.includes('_')) {\n return str.toUpperCase();\n }\n\n // If camelCase, first convert to snake_case then uppercase\n return str\n .replace(/([A-Z])/g, '_$1') // Add underscore before uppercase letters\n .toLowerCase() // Convert to lowercase\n .replace(/^_/, '') // Remove leading underscore\n .toUpperCase(); // Convert to uppercase\n}\n","function extendedTypeof(val) {\n if (val === null) {\n return \"null\";\n }\n if (Array.isArray(val)) {\n return \"array\";\n }\n return typeof val;\n}\nfunction isObject(val) {\n return extendedTypeof(val) === \"object\";\n}\nfunction isAsyncIterable(val) {\n return typeof Object(val)[Symbol.asyncIterator] === \"function\";\n}\nfunction isAsyncGenerator(val) {\n return isObject(val) && typeof Object(val)[Symbol.asyncIterator] === \"function\" && typeof val.return === \"function\";\n}\nfunction areGraphQLFormattedErrors(obj) {\n return Array.isArray(obj) && // must be at least one error\n obj.length > 0 && // error has at least a message\n obj.every((ob) => \"message\" in ob);\n}\nfunction limitCloseReason(reason, whenTooLong) {\n return reason.length < 124 ? reason : whenTooLong;\n}\n\nconst GRAPHQL_TRANSPORT_WS_PROTOCOL = \"graphql-transport-ws\";\nconst DEPRECATED_GRAPHQL_WS_PROTOCOL = \"graphql-ws\";\nvar CloseCode = /* @__PURE__ */ ((CloseCode2) => {\n CloseCode2[CloseCode2[\"InternalServerError\"] = 4500] = \"InternalServerError\";\n CloseCode2[CloseCode2[\"InternalClientError\"] = 4005] = \"InternalClientError\";\n CloseCode2[CloseCode2[\"BadRequest\"] = 4400] = \"BadRequest\";\n CloseCode2[CloseCode2[\"BadResponse\"] = 4004] = \"BadResponse\";\n CloseCode2[CloseCode2[\"Unauthorized\"] = 4401] = \"Unauthorized\";\n CloseCode2[CloseCode2[\"Forbidden\"] = 4403] = \"Forbidden\";\n CloseCode2[CloseCode2[\"SubprotocolNotAcceptable\"] = 4406] = \"SubprotocolNotAcceptable\";\n CloseCode2[CloseCode2[\"ConnectionInitialisationTimeout\"] = 4408] = \"ConnectionInitialisationTimeout\";\n CloseCode2[CloseCode2[\"ConnectionAcknowledgementTimeout\"] = 4504] = \"ConnectionAcknowledgementTimeout\";\n CloseCode2[CloseCode2[\"SubscriberAlreadyExists\"] = 4409] = \"SubscriberAlreadyExists\";\n CloseCode2[CloseCode2[\"TooManyInitialisationRequests\"] = 4429] = \"TooManyInitialisationRequests\";\n return CloseCode2;\n})(CloseCode || {});\nvar MessageType = /* @__PURE__ */ ((MessageType2) => {\n MessageType2[\"ConnectionInit\"] = \"connection_init\";\n MessageType2[\"ConnectionAck\"] = \"connection_ack\";\n MessageType2[\"Ping\"] = \"ping\";\n MessageType2[\"Pong\"] = \"pong\";\n MessageType2[\"Subscribe\"] = \"subscribe\";\n MessageType2[\"Next\"] = \"next\";\n MessageType2[\"Error\"] = \"error\";\n MessageType2[\"Complete\"] = \"complete\";\n return MessageType2;\n})(MessageType || {});\nfunction validateMessage(val) {\n if (!isObject(val)) {\n throw new Error(\n `Message is expected to be an object, but got ${extendedTypeof(val)}`\n );\n }\n if (!val.type) {\n throw new Error(`Message is missing the 'type' property`);\n }\n if (typeof val.type !== \"string\") {\n throw new Error(\n `Message is expects the 'type' property to be a string, but got ${extendedTypeof(\n val.type\n )}`\n );\n }\n switch (val.type) {\n case \"connection_init\" /* ConnectionInit */:\n case \"connection_ack\" /* ConnectionAck */:\n case \"ping\" /* Ping */:\n case \"pong\" /* Pong */: {\n if (val.payload != null && !isObject(val.payload)) {\n throw new Error(\n `\"${val.type}\" message expects the 'payload' property to be an object or nullish or missing, but got \"${val.payload}\"`\n );\n }\n break;\n }\n case \"subscribe\" /* Subscribe */: {\n if (typeof val.id !== \"string\") {\n throw new Error(\n `\"${val.type}\" message expects the 'id' property to be a string, but got ${extendedTypeof(\n val.id\n )}`\n );\n }\n if (!val.id) {\n throw new Error(\n `\"${val.type}\" message requires a non-empty 'id' property`\n );\n }\n if (!isObject(val.payload)) {\n throw new Error(\n `\"${val.type}\" message expects the 'payload' property to be an object, but got ${extendedTypeof(\n val.payload\n )}`\n );\n }\n if (typeof val.payload.query !== \"string\") {\n throw new Error(\n `\"${val.type}\" message payload expects the 'query' property to be a string, but got ${extendedTypeof(\n val.payload.query\n )}`\n );\n }\n if (val.payload.variables != null && !isObject(val.payload.variables)) {\n throw new Error(\n `\"${val.type}\" message payload expects the 'variables' property to be a an object or nullish or missing, but got ${extendedTypeof(\n val.payload.variables\n )}`\n );\n }\n if (val.payload.operationName != null && extendedTypeof(val.payload.operationName) !== \"string\") {\n throw new Error(\n `\"${val.type}\" message payload expects the 'operationName' property to be a string or nullish or missing, but got ${extendedTypeof(\n val.payload.operationName\n )}`\n );\n }\n if (val.payload.extensions != null && !isObject(val.payload.extensions)) {\n throw new Error(\n `\"${val.type}\" message payload expects the 'extensions' property to be a an object or nullish or missing, but got ${extendedTypeof(\n val.payload.extensions\n )}`\n );\n }\n break;\n }\n case \"next\" /* Next */: {\n if (typeof val.id !== \"string\") {\n throw new Error(\n `\"${val.type}\" message expects the 'id' property to be a string, but got ${extendedTypeof(\n val.id\n )}`\n );\n }\n if (!val.id) {\n throw new Error(\n `\"${val.type}\" message requires a non-empty 'id' property`\n );\n }\n if (!isObject(val.payload)) {\n throw new Error(\n `\"${val.type}\" message expects the 'payload' property to be an object, but got ${extendedTypeof(\n val.payload\n )}`\n );\n }\n break;\n }\n case \"error\" /* Error */: {\n if (typeof val.id !== \"string\") {\n throw new Error(\n `\"${val.type}\" message expects the 'id' property to be a string, but got ${extendedTypeof(\n val.id\n )}`\n );\n }\n if (!val.id) {\n throw new Error(\n `\"${val.type}\" message requires a non-empty 'id' property`\n );\n }\n if (!areGraphQLFormattedErrors(val.payload)) {\n throw new Error(\n `\"${val.type}\" message expects the 'payload' property to be an array of GraphQL errors, but got ${JSON.stringify(\n val.payload\n )}`\n );\n }\n break;\n }\n case \"complete\" /* Complete */: {\n if (typeof val.id !== \"string\") {\n throw new Error(\n `\"${val.type}\" message expects the 'id' property to be a string, but got ${extendedTypeof(\n val.id\n )}`\n );\n }\n if (!val.id) {\n throw new Error(\n `\"${val.type}\" message requires a non-empty 'id' property`\n );\n }\n break;\n }\n default:\n throw new Error(`Invalid message 'type' property \"${val.type}\"`);\n }\n return val;\n}\nfunction parseMessage(data, reviver) {\n return validateMessage(\n typeof data === \"string\" ? JSON.parse(data, reviver) : data\n );\n}\nfunction stringifyMessage(msg, replacer) {\n validateMessage(msg);\n return JSON.stringify(msg, replacer);\n}\n\nexport { CloseCode as C, DEPRECATED_GRAPHQL_WS_PROTOCOL as D, GRAPHQL_TRANSPORT_WS_PROTOCOL as G, MessageType as M, isAsyncGenerator as a, isAsyncIterable as b, isObject as i, limitCloseReason as l, parseMessage as p, stringifyMessage as s, validateMessage as v };\n","import { G as GRAPHQL_TRANSPORT_WS_PROTOCOL, s as stringifyMessage, M as MessageType, C as CloseCode, l as limitCloseReason, p as parseMessage, i as isObject } from './common-CGW11Fyb.js';\nexport { D as DEPRECATED_GRAPHQL_WS_PROTOCOL, v as validateMessage } from './common-CGW11Fyb.js';\n\nfunction createClient(options) {\n const {\n url,\n connectionParams,\n lazy = true,\n onNonLazyError = console.error,\n lazyCloseTimeout: lazyCloseTimeoutMs = 0,\n keepAlive = 0,\n disablePong,\n connectionAckWaitTimeout = 0,\n retryAttempts = 5,\n retryWait = async function randomisedExponentialBackoff(retries2) {\n const retryDelaySeconds = Math.pow(2, retries2);\n await new Promise(\n (resolve) => setTimeout(\n resolve,\n retryDelaySeconds * 1e3 + // add random timeout from 300ms to 3s\n Math.floor(Math.random() * (3e3 - 300) + 300)\n )\n );\n },\n shouldRetry = isLikeCloseEvent,\n on,\n webSocketImpl,\n /**\n * Generates a v4 UUID to be used as the ID using `Math`\n * as the random number generator. Supply your own generator\n * in case you need more uniqueness.\n *\n * Reference: https://gist.github.com/jed/982883\n */\n generateID = function generateUUID() {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0, v = c == \"x\" ? r : r & 3 | 8;\n return v.toString(16);\n });\n },\n jsonMessageReplacer: replacer,\n jsonMessageReviver: reviver\n } = options;\n let ws;\n if (webSocketImpl) {\n if (!isWebSocket(webSocketImpl)) {\n throw new Error(\"Invalid WebSocket implementation provided\");\n }\n ws = webSocketImpl;\n } else if (typeof WebSocket !== \"undefined\") {\n ws = WebSocket;\n } else if (typeof global !== \"undefined\") {\n ws = global.WebSocket || // @ts-expect-error: Support more browsers\n global.MozWebSocket;\n } else if (typeof window !== \"undefined\") {\n ws = window.WebSocket || // @ts-expect-error: Support more browsers\n window.MozWebSocket;\n }\n if (!ws)\n throw new Error(\n \"WebSocket implementation missing; on Node you can `import WebSocket from 'ws';` and pass `webSocketImpl: WebSocket` to `createClient`\"\n );\n const WebSocketImpl = ws;\n const emitter = (() => {\n const message = /* @__PURE__ */ (() => {\n const listeners2 = {};\n return {\n on(id, listener) {\n listeners2[id] = listener;\n return () => {\n delete listeners2[id];\n };\n },\n emit(message2) {\n if (\"id\" in message2) listeners2[message2.id]?.(message2);\n }\n };\n })();\n const listeners = {\n connecting: on?.connecting ? [on.connecting] : [],\n opened: on?.opened ? [on.opened] : [],\n connected: on?.connected ? [on.connected] : [],\n ping: on?.ping ? [on.ping] : [],\n pong: on?.pong ? [on.pong] : [],\n message: on?.message ? [message.emit, on.message] : [message.emit],\n closed: on?.closed ? [on.closed] : [],\n error: on?.error ? [on.error] : []\n };\n return {\n onMessage: message.on,\n on(event, listener) {\n const l = listeners[event];\n l.push(listener);\n return () => {\n l.splice(l.indexOf(listener), 1);\n };\n },\n emit(event, ...args) {\n for (const listener of [...listeners[event]]) {\n listener(...args);\n }\n }\n };\n })();\n function errorOrClosed(cb) {\n const listening = [\n // errors are fatal and more critical than close events, throw them first\n emitter.on(\"error\", (err) => {\n listening.forEach((unlisten) => unlisten());\n cb(err);\n }),\n // closes can be graceful and not fatal, throw them second (if error didnt throw)\n emitter.on(\"closed\", (event) => {\n listening.forEach((unlisten) => unlisten());\n cb(event);\n })\n ];\n }\n let connecting, locks = 0, lazyCloseTimeout, retrying = false, retries = 0, disposed = false;\n async function connect() {\n clearTimeout(lazyCloseTimeout);\n const [socket, throwOnClose] = await (connecting ?? (connecting = new Promise(\n (connected, denied) => (async () => {\n if (retrying) {\n await retryWait(retries);\n if (!locks) {\n connecting = undefined;\n return denied({ code: 1e3, reason: \"All Subscriptions Gone\" });\n }\n retries++;\n }\n emitter.emit(\"connecting\", retrying);\n const socket2 = new WebSocketImpl(\n typeof url === \"function\" ? await url() : url,\n GRAPHQL_TRANSPORT_WS_PROTOCOL\n );\n let connectionAckTimeout, queuedPing;\n function enqueuePing() {\n if (isFinite(keepAlive) && keepAlive > 0) {\n clearTimeout(queuedPing);\n queuedPing = setTimeout(() => {\n if (socket2.readyState === WebSocketImpl.OPEN) {\n socket2.send(stringifyMessage({ type: MessageType.Ping }));\n emitter.emit(\"ping\", false, undefined);\n }\n }, keepAlive);\n }\n }\n errorOrClosed((errOrEvent) => {\n connecting = undefined;\n clearTimeout(connectionAckTimeout);\n clearTimeout(queuedPing);\n denied(errOrEvent);\n if (errOrEvent instanceof TerminatedCloseEvent) {\n socket2.close(4499, \"Terminated\");\n socket2.onerror = null;\n socket2.onclose = null;\n }\n });\n socket2.onerror = (err) => emitter.emit(\"error\", err);\n socket2.onclose = (event) => emitter.emit(\"closed\", event);\n socket2.onopen = async () => {\n try {\n emitter.emit(\"opened\", socket2);\n const payload = typeof connectionParams === \"function\" ? await connectionParams() : connectionParams;\n if (socket2.readyState !== WebSocketImpl.OPEN) return;\n socket2.send(\n stringifyMessage(\n payload ? {\n type: MessageType.ConnectionInit,\n payload\n } : {\n type: MessageType.ConnectionInit\n // payload is completely absent if not provided\n },\n replacer\n )\n );\n if (isFinite(connectionAckWaitTimeout) && connectionAckWaitTimeout > 0) {\n connectionAckTimeout = setTimeout(() => {\n socket2.close(\n CloseCode.ConnectionAcknowledgementTimeout,\n \"Connection acknowledgement timeout\"\n );\n }, connectionAckWaitTimeout);\n }\n enqueuePing();\n } catch (err) {\n emitter.emit(\"error\", err);\n socket2.close(\n CloseCode.InternalClientError,\n limitCloseReason(\n err instanceof Error ? err.message : String(err),\n \"Internal client error\"\n )\n );\n }\n };\n let acknowledged = false;\n socket2.onmessage = ({ data }) => {\n try {\n const message = parseMessage(data, reviver);\n emitter.emit(\"message\", message);\n if (message.type === \"ping\" || message.type === \"pong\") {\n emitter.emit(message.type, true, message.payload);\n if (message.type === \"pong\") {\n enqueuePing();\n } else if (!disablePong) {\n socket2.send(\n stringifyMessage(\n message.payload ? {\n type: MessageType.Pong,\n payload: message.payload\n } : {\n type: MessageType.Pong\n // payload is completely absent if not provided\n }\n )\n );\n emitter.emit(\"pong\", false, message.payload);\n }\n return;\n }\n if (acknowledged) return;\n if (message.type !== MessageType.ConnectionAck)\n throw new Error(\n `First message cannot be of type ${message.type}`\n );\n clearTimeout(connectionAckTimeout);\n acknowledged = true;\n emitter.emit(\"connected\", socket2, message.payload, retrying);\n retrying = false;\n retries = 0;\n connected([\n socket2,\n new Promise((_, reject) => errorOrClosed(reject))\n ]);\n } catch (err) {\n socket2.onmessage = null;\n emitter.emit(\"error\", err);\n socket2.close(\n CloseCode.BadResponse,\n limitCloseReason(\n err instanceof Error ? err.message : String(err),\n \"Bad response\"\n )\n );\n }\n };\n })()\n )));\n if (socket.readyState === WebSocketImpl.CLOSING) await throwOnClose;\n let release = () => {\n };\n const released = new Promise((resolve) => release = resolve);\n return [\n socket,\n release,\n Promise.race([\n // wait for\n released.then(() => {\n if (!locks) {\n const complete = () => socket.close(1e3, \"Normal Closure\");\n if (isFinite(lazyCloseTimeoutMs) && lazyCloseTimeoutMs > 0) {\n lazyCloseTimeout = setTimeout(() => {\n if (socket.readyState === WebSocketImpl.OPEN) complete();\n }, lazyCloseTimeoutMs);\n } else {\n complete();\n }\n }\n }),\n // or\n throwOnClose\n ])\n ];\n }\n function shouldRetryConnectOrThrow(errOrCloseEvent) {\n if (isLikeCloseEvent(errOrCloseEvent) && (isFatalInternalCloseCode(errOrCloseEvent.code) || [\n CloseCode.InternalServerError,\n CloseCode.InternalClientError,\n CloseCode.BadRequest,\n CloseCode.BadResponse,\n CloseCode.Unauthorized,\n // CloseCode.Forbidden, might grant access out after retry\n CloseCode.SubprotocolNotAcceptable,\n // CloseCode.ConnectionInitialisationTimeout, might not time out after retry\n // CloseCode.ConnectionAcknowledgementTimeout, might not time out after retry\n CloseCode.SubscriberAlreadyExists,\n CloseCode.TooManyInitialisationRequests\n // 4499, // Terminated, probably because the socket froze, we want to retry\n ].includes(errOrCloseEvent.code)))\n throw errOrCloseEvent;\n if (disposed) return false;\n if (isLikeCloseEvent(errOrCloseEvent) && errOrCloseEvent.code === 1e3)\n return locks > 0;\n if (!retryAttempts || retries >= retryAttempts) throw errOrCloseEvent;\n if (!shouldRetry(errOrCloseEvent)) throw errOrCloseEvent;\n return retrying = true;\n }\n if (!lazy) {\n (async () => {\n locks++;\n for (; ; ) {\n try {\n const [, , throwOnClose] = await connect();\n await throwOnClose;\n } catch (errOrCloseEvent) {\n try {\n if (!shouldRetryConnectOrThrow(errOrCloseEvent)) return;\n } catch (errOrCloseEvent2) {\n return onNonLazyError?.(errOrCloseEvent2);\n }\n }\n }\n })();\n }\n function subscribe(payload, sink) {\n const id = generateID(payload);\n let done = false, errored = false, releaser = () => {\n locks--;\n done = true;\n };\n (async () => {\n locks++;\n for (; ; ) {\n try {\n const [socket, release, waitForReleaseOrThrowOnClose] = await connect();\n if (done) return release();\n const unlisten = emitter.onMessage(id, (message) => {\n switch (message.type) {\n case MessageType.Next: {\n sink.next(message.payload);\n return;\n }\n case MessageType.Error: {\n errored = true, done = true;\n sink.error(message.payload);\n releaser();\n return;\n }\n case MessageType.Complete: {\n done = true;\n releaser();\n return;\n }\n }\n });\n socket.send(\n stringifyMessage(\n {\n id,\n type: MessageType.Subscribe,\n payload\n },\n replacer\n )\n );\n releaser = () => {\n if (!done && socket.readyState === WebSocketImpl.OPEN)\n socket.send(\n stringifyMessage(\n {\n id,\n type: MessageType.Complete\n },\n replacer\n )\n );\n locks--;\n done = true;\n release();\n };\n await waitForReleaseOrThrowOnClose.finally(unlisten);\n return;\n } catch (errOrCloseEvent) {\n if (!shouldRetryConnectOrThrow(errOrCloseEvent)) return;\n }\n }\n })().then(() => {\n if (!errored) sink.complete();\n }).catch((err) => {\n sink.error(err);\n });\n return () => {\n if (!done) releaser();\n };\n }\n return {\n on: emitter.on,\n subscribe,\n iterate(request) {\n const pending = [];\n const deferred = {\n done: false,\n error: null,\n resolve: () => {\n }\n };\n const dispose = subscribe(request, {\n next(val) {\n pending.push(val);\n deferred.resolve();\n },\n error(err) {\n deferred.done = true;\n deferred.error = err;\n deferred.resolve();\n },\n complete() {\n deferred.done = true;\n deferred.resolve();\n }\n });\n const iterator = async function* iterator2() {\n for (; ; ) {\n if (!pending.length) {\n await new Promise((resolve) => deferred.resolve = resolve);\n }\n while (pending.length) {\n yield pending.shift();\n }\n if (deferred.error) {\n throw deferred.error;\n }\n if (deferred.done) {\n return;\n }\n }\n }();\n iterator.throw = async (err) => {\n if (!deferred.done) {\n deferred.done = true;\n deferred.error = err;\n deferred.resolve();\n }\n return { done: true, value: undefined };\n };\n iterator.return = async () => {\n dispose();\n return { done: true, value: undefined };\n };\n return iterator;\n },\n async dispose() {\n disposed = true;\n if (connecting) {\n const [socket] = await connecting;\n socket.close(1e3, \"Normal Closure\");\n }\n },\n terminate() {\n if (connecting) {\n emitter.emit(\"closed\", new TerminatedCloseEvent());\n }\n }\n };\n}\nclass TerminatedCloseEvent extends Error {\n name = \"TerminatedCloseEvent\";\n message = \"4499: Terminated\";\n code = 4499;\n reason = \"Terminated\";\n wasClean = false;\n}\nfunction isLikeCloseEvent(val) {\n return isObject(val) && \"code\" in val && \"reason\" in val;\n}\nfunction isFatalInternalCloseCode(code) {\n if ([\n 1e3,\n // Normal Closure is not an erroneous close code\n 1001,\n // Going Away\n 1006,\n // Abnormal Closure\n 1005,\n // No Status Received\n 1012,\n // Service Restart\n 1013,\n // Try Again Later\n 1014\n // Bad Gateway\n ].includes(code))\n return false;\n return code >= 1e3 && code <= 1999;\n}\nfunction isWebSocket(val) {\n return typeof val === \"function\" && \"constructor\" in val && \"CLOSED\" in val && \"CLOSING\" in val && \"CONNECTING\" in val && \"OPEN\" in val;\n}\n\nexport { CloseCode, GRAPHQL_TRANSPORT_WS_PROTOCOL, MessageType, TerminatedCloseEvent, createClient, parseMessage, stringifyMessage };\n","export { TerminatedCloseEvent, createClient } from './client.js';\nexport { a as areGraphQLErrors, h as handleProtocols, m as makeServer } from './server-BN3ZJY-a.js';\nexport { C as CloseCode, D as DEPRECATED_GRAPHQL_WS_PROTOCOL, G as GRAPHQL_TRANSPORT_WS_PROTOCOL, M as MessageType, p as parseMessage, s as stringifyMessage, v as validateMessage } from './common-CGW11Fyb.js';\nimport 'graphql';\n"],"mappings":";;;;;;;;;;;;;;;AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAKA;AAAA,EACA;AAAA,OAIK;AACP,SAAS,iBAAiB;AAC1B,SAAS,qBAAqB;AAC9B,SAAS,yBAAyB;;;AClBlC,SAAS,eAAe,KAAK;AAC3B,MAAI,QAAQ,MAAM;AAChB,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,WAAO;AAAA,EACT;AACA,SAAO,OAAO;AAChB;AACA,SAAS,SAAS,KAAK;AACrB,SAAO,eAAe,GAAG,MAAM;AACjC;AAOA,SAAS,0BAA0B,KAAK;AACtC,SAAO,MAAM,QAAQ,GAAG;AAAA,EACxB,IAAI,SAAS;AAAA,EACb,IAAI,MAAM,CAAC,OAAO,aAAa,EAAE;AACnC;AACA,SAAS,iBAAiB,QAAQ,aAAa;AAC7C,SAAO,OAAO,SAAS,MAAM,SAAS;AACxC;AAEA,IAAM,gCAAgC;AAEtC,IAAI,YAA6B,kBAAC,eAAe;AAC/C,aAAW,WAAW,qBAAqB,IAAI,IAAI,IAAI;AACvD,aAAW,WAAW,qBAAqB,IAAI,IAAI,IAAI;AACvD,aAAW,WAAW,YAAY,IAAI,IAAI,IAAI;AAC9C,aAAW,WAAW,aAAa,IAAI,IAAI,IAAI;AAC/C,aAAW,WAAW,cAAc,IAAI,IAAI,IAAI;AAChD,aAAW,WAAW,WAAW,IAAI,IAAI,IAAI;AAC7C,aAAW,WAAW,0BAA0B,IAAI,IAAI,IAAI;AAC5D,aAAW,WAAW,iCAAiC,IAAI,IAAI,IAAI;AACnE,aAAW,WAAW,kCAAkC,IAAI,IAAI,IAAI;AACpE,aAAW,WAAW,yBAAyB,IAAI,IAAI,IAAI;AAC3D,aAAW,WAAW,+BAA+B,IAAI,IAAI,IAAI;AACjE,SAAO;AACT,GAAG,aAAa,CAAC,CAAC;AAClB,IAAI,cAA+B,kBAAC,iBAAiB;AACnD,eAAa,gBAAgB,IAAI;AACjC,eAAa,eAAe,IAAI;AAChC,eAAa,MAAM,IAAI;AACvB,eAAa,MAAM,IAAI;AACvB,eAAa,WAAW,IAAI;AAC5B,eAAa,MAAM,IAAI;AACvB,eAAa,OAAO,IAAI;AACxB,eAAa,UAAU,IAAI;AAC3B,SAAO;AACT,GAAG,eAAe,CAAC,CAAC;AACpB,SAAS,gBAAgB,KAAK;AAC5B,MAAI,CAAC,SAAS,GAAG,GAAG;AAClB,UAAM,IAAI;AAAA,MACR,gDAAgD,eAAe,GAAG,CAAC;AAAA,IACrE;AAAA,EACF;AACA,MAAI,CAAC,IAAI,MAAM;AACb,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC1D;AACA,MAAI,OAAO,IAAI,SAAS,UAAU;AAChC,UAAM,IAAI;AAAA,MACR,kEAAkE;AAAA,QAChE,IAAI;AAAA,MACN,CAAC;AAAA,IACH;AAAA,EACF;AACA,UAAQ,IAAI,MAAM;AAAA,IAChB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,QAAmB;AACtB,UAAI,IAAI,WAAW,QAAQ,CAAC,SAAS,IAAI,OAAO,GAAG;AACjD,cAAM,IAAI;AAAA,UACR,IAAI,IAAI,IAAI,4FAA4F,IAAI,OAAO;AAAA,QACrH;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA,KAAK,aAA6B;AAChC,UAAI,OAAO,IAAI,OAAO,UAAU;AAC9B,cAAM,IAAI;AAAA,UACR,IAAI,IAAI,IAAI,+DAA+D;AAAA,YACzE,IAAI;AAAA,UACN,CAAC;AAAA,QACH;AAAA,MACF;AACA,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,IAAI;AAAA,UACR,IAAI,IAAI,IAAI;AAAA,QACd;AAAA,MACF;AACA,UAAI,CAAC,SAAS,IAAI,OAAO,GAAG;AAC1B,cAAM,IAAI;AAAA,UACR,IAAI,IAAI,IAAI,qEAAqE;AAAA,YAC/E,IAAI;AAAA,UACN,CAAC;AAAA,QACH;AAAA,MACF;AACA,UAAI,OAAO,IAAI,QAAQ,UAAU,UAAU;AACzC,cAAM,IAAI;AAAA,UACR,IAAI,IAAI,IAAI,0EAA0E;AAAA,YACpF,IAAI,QAAQ;AAAA,UACd,CAAC;AAAA,QACH;AAAA,MACF;AACA,UAAI,IAAI,QAAQ,aAAa,QAAQ,CAAC,SAAS,IAAI,QAAQ,SAAS,GAAG;AACrE,cAAM,IAAI;AAAA,UACR,IAAI,IAAI,IAAI,uGAAuG;AAAA,YACjH,IAAI,QAAQ;AAAA,UACd,CAAC;AAAA,QACH;AAAA,MACF;AACA,UAAI,IAAI,QAAQ,iBAAiB,QAAQ,eAAe,IAAI,QAAQ,aAAa,MAAM,UAAU;AAC/F,cAAM,IAAI;AAAA,UACR,IAAI,IAAI,IAAI,wGAAwG;AAAA,YAClH,IAAI,QAAQ;AAAA,UACd,CAAC;AAAA,QACH;AAAA,MACF;AACA,UAAI,IAAI,QAAQ,cAAc,QAAQ,CAAC,SAAS,IAAI,QAAQ,UAAU,GAAG;AACvE,cAAM,IAAI;AAAA,UACR,IAAI,IAAI,IAAI,wGAAwG;AAAA,YAClH,IAAI,QAAQ;AAAA,UACd,CAAC;AAAA,QACH;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA,KAAK,QAAmB;AACtB,UAAI,OAAO,IAAI,OAAO,UAAU;AAC9B,cAAM,IAAI;AAAA,UACR,IAAI,IAAI,IAAI,+DAA+D;AAAA,YACzE,IAAI;AAAA,UACN,CAAC;AAAA,QACH;AAAA,MACF;AACA,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,IAAI;AAAA,UACR,IAAI,IAAI,IAAI;AAAA,QACd;AAAA,MACF;AACA,UAAI,CAAC,SAAS,IAAI,OAAO,GAAG;AAC1B,cAAM,IAAI;AAAA,UACR,IAAI,IAAI,IAAI,qEAAqE;AAAA,YAC/E,IAAI;AAAA,UACN,CAAC;AAAA,QACH;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA,KAAK,SAAqB;AACxB,UAAI,OAAO,IAAI,OAAO,UAAU;AAC9B,cAAM,IAAI;AAAA,UACR,IAAI,IAAI,IAAI,+DAA+D;AAAA,YACzE,IAAI;AAAA,UACN,CAAC;AAAA,QACH;AAAA,MACF;AACA,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,IAAI;AAAA,UACR,IAAI,IAAI,IAAI;AAAA,QACd;AAAA,MACF;AACA,UAAI,CAAC,0BAA0B,IAAI,OAAO,GAAG;AAC3C,cAAM,IAAI;AAAA,UACR,IAAI,IAAI,IAAI,sFAAsF,KAAK;AAAA,YACrG,IAAI;AAAA,UACN,CAAC;AAAA,QACH;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA,KAAK,YAA2B;AAC9B,UAAI,OAAO,IAAI,OAAO,UAAU;AAC9B,cAAM,IAAI;AAAA,UACR,IAAI,IAAI,IAAI,+DAA+D;AAAA,YACzE,IAAI;AAAA,UACN,CAAC;AAAA,QACH;AAAA,MACF;AACA,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,IAAI;AAAA,UACR,IAAI,IAAI,IAAI;AAAA,QACd;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA;AACE,YAAM,IAAI,MAAM,oCAAoC,IAAI,IAAI,GAAG;AAAA,EACnE;AACA,SAAO;AACT;AACA,SAAS,aAAa,MAAM,SAAS;AACnC,SAAO;AAAA,IACL,OAAO,SAAS,WAAW,KAAK,MAAM,MAAM,OAAO,IAAI;AAAA,EACzD;AACF;AACA,SAAS,iBAAiB,KAAK,UAAU;AACvC,kBAAgB,GAAG;AACnB,SAAO,KAAK,UAAU,KAAK,QAAQ;AACrC;;;ACzMA,SAAS,aAAa,SAAS;AAC7B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,iBAAiB,QAAQ;AAAA,IACzB,kBAAkB,qBAAqB;AAAA,IACvC,YAAY;AAAA,IACZ;AAAA,IACA,2BAA2B;AAAA,IAC3B,gBAAgB;AAAA,IAChB,YAAY,eAAe,6BAA6B,UAAU;AAChE,YAAM,oBAAoB,KAAK,IAAI,GAAG,QAAQ;AAC9C,YAAM,IAAI;AAAA,QACR,CAAC,YAAY;AAAA,UACX;AAAA,UACA,oBAAoB;AAAA,UACpB,KAAK,MAAM,KAAK,OAAO,KAAK,MAAM,OAAO,GAAG;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA,aAAa,SAAS,eAAe;AACnC,aAAO,uCAAuC,QAAQ,SAAS,CAAC,MAAM;AACpE,cAAM,IAAI,KAAK,OAAO,IAAI,KAAK,GAAG,IAAI,KAAK,MAAM,IAAI,IAAI,IAAI;AAC7D,eAAO,EAAE,SAAS,EAAE;AAAA,MACtB,CAAC;AAAA,IACH;AAAA,IACA,qBAAqB;AAAA,IACrB,oBAAoB;AAAA,EACtB,IAAI;AACJ,MAAI;AACJ,MAAI,eAAe;AACjB,QAAI,CAAC,YAAY,aAAa,GAAG;AAC/B,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AACA,SAAK;AAAA,EACP,WAAW,OAAO,cAAc,aAAa;AAC3C,SAAK;AAAA,EACP,WAAW,OAAO,WAAW,aAAa;AACxC,SAAK,OAAO;AAAA,IACZ,OAAO;AAAA,EACT,WAAW,OAAO,WAAW,aAAa;AACxC,SAAK,OAAO;AAAA,IACZ,OAAO;AAAA,EACT;AACA,MAAI,CAAC;AACH,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,QAAM,gBAAgB;AACtB,QAAM,WAAW,MAAM;AACrB,UAAM,UAA2B,uBAAM;AACrC,YAAM,aAAa,CAAC;AACpB,aAAO;AAAA,QACL,GAAG,IAAI,UAAU;AACf,qBAAW,EAAE,IAAI;AACjB,iBAAO,MAAM;AACX,mBAAO,WAAW,EAAE;AAAA,UACtB;AAAA,QACF;AAAA,QACA,KAAK,UAAU;AACb,cAAI,QAAQ;AAAU,uBAAW,SAAS,EAAE,IAAI,QAAQ;AAAA,QAC1D;AAAA,MACF;AAAA,IACF,GAAG;AACH,UAAM,YAAY;AAAA,MAChB,YAAY,IAAI,aAAa,CAAC,GAAG,UAAU,IAAI,CAAC;AAAA,MAChD,QAAQ,IAAI,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,MACpC,WAAW,IAAI,YAAY,CAAC,GAAG,SAAS,IAAI,CAAC;AAAA,MAC7C,MAAM,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC;AAAA,MAC9B,MAAM,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC;AAAA,MAC9B,SAAS,IAAI,UAAU,CAAC,QAAQ,MAAM,GAAG,OAAO,IAAI,CAAC,QAAQ,IAAI;AAAA,MACjE,QAAQ,IAAI,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,MACpC,OAAO,IAAI,QAAQ,CAAC,GAAG,KAAK,IAAI,CAAC;AAAA,IACnC;AACA,WAAO;AAAA,MACL,WAAW,QAAQ;AAAA,MACnB,GAAG,OAAO,UAAU;AAClB,cAAM,IAAI,UAAU,KAAK;AACzB,UAAE,KAAK,QAAQ;AACf,eAAO,MAAM;AACX,YAAE,OAAO,EAAE,QAAQ,QAAQ,GAAG,CAAC;AAAA,QACjC;AAAA,MACF;AAAA,MACA,KAAK,UAAU,MAAM;AACnB,mBAAW,YAAY,CAAC,GAAG,UAAU,KAAK,CAAC,GAAG;AAC5C,mBAAS,GAAG,IAAI;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG;AACH,WAAS,cAAc,IAAI;AACzB,UAAM,YAAY;AAAA;AAAA,MAEhB,QAAQ,GAAG,SAAS,CAAC,QAAQ;AAC3B,kBAAU,QAAQ,CAAC,aAAa,SAAS,CAAC;AAC1C,WAAG,GAAG;AAAA,MACR,CAAC;AAAA;AAAA,MAED,QAAQ,GAAG,UAAU,CAAC,UAAU;AAC9B,kBAAU,QAAQ,CAAC,aAAa,SAAS,CAAC;AAC1C,WAAG,KAAK;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AACA,MAAI,YAAY,QAAQ,GAAG,kBAAkB,WAAW,OAAO,UAAU,GAAG,WAAW;AACvF,iBAAe,UAAU;AACvB,iBAAa,gBAAgB;AAC7B,UAAM,CAAC,QAAQ,YAAY,IAAI,OAAO,eAAe,aAAa,IAAI;AAAA,MACpE,CAAC,WAAW,YAAY,YAAY;AAClC,YAAI,UAAU;AACZ,gBAAM,UAAU,OAAO;AACvB,cAAI,CAAC,OAAO;AACV,yBAAa;AACb,mBAAO,OAAO,EAAE,MAAM,KAAK,QAAQ,yBAAyB,CAAC;AAAA,UAC/D;AACA;AAAA,QACF;AACA,gBAAQ,KAAK,cAAc,QAAQ;AACnC,cAAM,UAAU,IAAI;AAAA,UAClB,OAAO,QAAQ,aAAa,MAAM,IAAI,IAAI;AAAA,UAC1C;AAAA,QACF;AACA,YAAI,sBAAsB;AAC1B,iBAAS,cAAc;AACrB,cAAI,SAAS,SAAS,KAAK,YAAY,GAAG;AACxC,yBAAa,UAAU;AACvB,yBAAa,WAAW,MAAM;AAC5B,kBAAI,QAAQ,eAAe,cAAc,MAAM;AAC7C,wBAAQ,KAAK,iBAAiB,EAAE,MAAM,YAAY,KAAK,CAAC,CAAC;AACzD,wBAAQ,KAAK,QAAQ,OAAO,MAAS;AAAA,cACvC;AAAA,YACF,GAAG,SAAS;AAAA,UACd;AAAA,QACF;AACA,sBAAc,CAAC,eAAe;AAC5B,uBAAa;AACb,uBAAa,oBAAoB;AACjC,uBAAa,UAAU;AACvB,iBAAO,UAAU;AACjB,cAAI,sBAAsB,sBAAsB;AAC9C,oBAAQ,MAAM,MAAM,YAAY;AAChC,oBAAQ,UAAU;AAClB,oBAAQ,UAAU;AAAA,UACpB;AAAA,QACF,CAAC;AACD,gBAAQ,UAAU,CAAC,QAAQ,QAAQ,KAAK,SAAS,GAAG;AACpD,gBAAQ,UAAU,CAAC,UAAU,QAAQ,KAAK,UAAU,KAAK;AACzD,gBAAQ,SAAS,YAAY;AAC3B,cAAI;AACF,oBAAQ,KAAK,UAAU,OAAO;AAC9B,kBAAM,UAAU,OAAO,qBAAqB,aAAa,MAAM,iBAAiB,IAAI;AACpF,gBAAI,QAAQ,eAAe,cAAc;AAAM;AAC/C,oBAAQ;AAAA,cACN;AAAA,gBACE,UAAU;AAAA,kBACR,MAAM,YAAY;AAAA,kBAClB;AAAA,gBACF,IAAI;AAAA,kBACF,MAAM,YAAY;AAAA;AAAA,gBAEpB;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AACA,gBAAI,SAAS,wBAAwB,KAAK,2BAA2B,GAAG;AACtE,qCAAuB,WAAW,MAAM;AACtC,wBAAQ;AAAA,kBACN,UAAU;AAAA,kBACV;AAAA,gBACF;AAAA,cACF,GAAG,wBAAwB;AAAA,YAC7B;AACA,wBAAY;AAAA,UACd,SAAS,KAAK;AACZ,oBAAQ,KAAK,SAAS,GAAG;AACzB,oBAAQ;AAAA,cACN,UAAU;AAAA,cACV;AAAA,gBACE,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,gBAC/C;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA,YAAI,eAAe;AACnB,gBAAQ,YAAY,CAAC,EAAE,KAAK,MAAM;AAChC,cAAI;AACF,kBAAM,UAAU,aAAa,MAAM,OAAO;AAC1C,oBAAQ,KAAK,WAAW,OAAO;AAC/B,gBAAI,QAAQ,SAAS,UAAU,QAAQ,SAAS,QAAQ;AACtD,sBAAQ,KAAK,QAAQ,MAAM,MAAM,QAAQ,OAAO;AAChD,kBAAI,QAAQ,SAAS,QAAQ;AAC3B,4BAAY;AAAA,cACd,WAAW,CAAC,aAAa;AACvB,wBAAQ;AAAA,kBACN;AAAA,oBACE,QAAQ,UAAU;AAAA,sBAChB,MAAM,YAAY;AAAA,sBAClB,SAAS,QAAQ;AAAA,oBACnB,IAAI;AAAA,sBACF,MAAM,YAAY;AAAA;AAAA,oBAEpB;AAAA,kBACF;AAAA,gBACF;AACA,wBAAQ,KAAK,QAAQ,OAAO,QAAQ,OAAO;AAAA,cAC7C;AACA;AAAA,YACF;AACA,gBAAI;AAAc;AAClB,gBAAI,QAAQ,SAAS,YAAY;AAC/B,oBAAM,IAAI;AAAA,gBACR,mCAAmC,QAAQ,IAAI;AAAA,cACjD;AACF,yBAAa,oBAAoB;AACjC,2BAAe;AACf,oBAAQ,KAAK,aAAa,SAAS,QAAQ,SAAS,QAAQ;AAC5D,uBAAW;AACX,sBAAU;AACV,sBAAU;AAAA,cACR;AAAA,cACA,IAAI,QAAQ,CAAC,GAAG,WAAW,cAAc,MAAM,CAAC;AAAA,YAClD,CAAC;AAAA,UACH,SAAS,KAAK;AACZ,oBAAQ,YAAY;AACpB,oBAAQ,KAAK,SAAS,GAAG;AACzB,oBAAQ;AAAA,cACN,UAAU;AAAA,cACV;AAAA,gBACE,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,gBAC/C;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,GAAG;AAAA,IACL;AACA,QAAI,OAAO,eAAe,cAAc;AAAS,YAAM;AACvD,QAAI,UAAU,MAAM;AAAA,IACpB;AACA,UAAM,WAAW,IAAI,QAAQ,CAAC,YAAY,UAAU,OAAO;AAC3D,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,QAAQ,KAAK;AAAA;AAAA,QAEX,SAAS,KAAK,MAAM;AAClB,cAAI,CAAC,OAAO;AACV,kBAAM,WAAW,MAAM,OAAO,MAAM,KAAK,gBAAgB;AACzD,gBAAI,SAAS,kBAAkB,KAAK,qBAAqB,GAAG;AAC1D,iCAAmB,WAAW,MAAM;AAClC,oBAAI,OAAO,eAAe,cAAc;AAAM,2BAAS;AAAA,cACzD,GAAG,kBAAkB;AAAA,YACvB,OAAO;AACL,uBAAS;AAAA,YACX;AAAA,UACF;AAAA,QACF,CAAC;AAAA;AAAA,QAED;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,WAAS,0BAA0B,iBAAiB;AAClD,QAAI,iBAAiB,eAAe,MAAM,yBAAyB,gBAAgB,IAAI,KAAK;AAAA,MAC1F,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA;AAAA,MAEV,UAAU;AAAA;AAAA;AAAA,MAGV,UAAU;AAAA,MACV,UAAU;AAAA;AAAA,IAEZ,EAAE,SAAS,gBAAgB,IAAI;AAC7B,YAAM;AACR,QAAI;AAAU,aAAO;AACrB,QAAI,iBAAiB,eAAe,KAAK,gBAAgB,SAAS;AAChE,aAAO,QAAQ;AACjB,QAAI,CAAC,iBAAiB,WAAW;AAAe,YAAM;AACtD,QAAI,CAAC,YAAY,eAAe;AAAG,YAAM;AACzC,WAAO,WAAW;AAAA,EACpB;AACA,MAAI,CAAC,MAAM;AACT,KAAC,YAAY;AACX;AACA,iBAAW;AACT,YAAI;AACF,gBAAM,CAAC,EAAE,EAAE,YAAY,IAAI,MAAM,QAAQ;AACzC,gBAAM;AAAA,QACR,SAAS,iBAAiB;AACxB,cAAI;AACF,gBAAI,CAAC,0BAA0B,eAAe;AAAG;AAAA,UACnD,SAAS,kBAAkB;AACzB,mBAAO,iBAAiB,gBAAgB;AAAA,UAC1C;AAAA,QACF;AAAA,MACF;AAAA,IACF,GAAG;AAAA,EACL;AACA,WAAS,UAAU,SAAS,MAAM;AAChC,UAAM,KAAK,WAAW,OAAO;AAC7B,QAAI,OAAO,OAAO,UAAU,OAAO,WAAW,MAAM;AAClD;AACA,aAAO;AAAA,IACT;AACA,KAAC,YAAY;AACX;AACA,iBAAW;AACT,YAAI;AACF,gBAAM,CAAC,QAAQ,SAAS,4BAA4B,IAAI,MAAM,QAAQ;AACtE,cAAI;AAAM,mBAAO,QAAQ;AACzB,gBAAM,WAAW,QAAQ,UAAU,IAAI,CAAC,YAAY;AAClD,oBAAQ,QAAQ,MAAM;AAAA,cACpB,KAAK,YAAY,MAAM;AACrB,qBAAK,KAAK,QAAQ,OAAO;AACzB;AAAA,cACF;AAAA,cACA,KAAK,YAAY,OAAO;AACtB,0BAAU,MAAM,OAAO;AACvB,qBAAK,MAAM,QAAQ,OAAO;AAC1B,yBAAS;AACT;AAAA,cACF;AAAA,cACA,KAAK,YAAY,UAAU;AACzB,uBAAO;AACP,yBAAS;AACT;AAAA,cACF;AAAA,YACF;AAAA,UACF,CAAC;AACD,iBAAO;AAAA,YACL;AAAA,cACE;AAAA,gBACE;AAAA,gBACA,MAAM,YAAY;AAAA,gBAClB;AAAA,cACF;AAAA,cACA;AAAA,YACF;AAAA,UACF;AACA,qBAAW,MAAM;AACf,gBAAI,CAAC,QAAQ,OAAO,eAAe,cAAc;AAC/C,qBAAO;AAAA,gBACL;AAAA,kBACE;AAAA,oBACE;AAAA,oBACA,MAAM,YAAY;AAAA,kBACpB;AAAA,kBACA;AAAA,gBACF;AAAA,cACF;AACF;AACA,mBAAO;AACP,oBAAQ;AAAA,UACV;AACA,gBAAM,6BAA6B,QAAQ,QAAQ;AACnD;AAAA,QACF,SAAS,iBAAiB;AACxB,cAAI,CAAC,0BAA0B,eAAe;AAAG;AAAA,QACnD;AAAA,MACF;AAAA,IACF,GAAG,EAAE,KAAK,MAAM;AACd,UAAI,CAAC;AAAS,aAAK,SAAS;AAAA,IAC9B,CAAC,EAAE,MAAM,CAAC,QAAQ;AAChB,WAAK,MAAM,GAAG;AAAA,IAChB,CAAC;AACD,WAAO,MAAM;AACX,UAAI,CAAC;AAAM,iBAAS;AAAA,IACtB;AAAA,EACF;AACA,SAAO;AAAA,IACL,IAAI,QAAQ;AAAA,IACZ;AAAA,IACA,QAAQ,SAAS;AACf,YAAM,UAAU,CAAC;AACjB,YAAM,WAAW;AAAA,QACf,MAAM;AAAA,QACN,OAAO;AAAA,QACP,SAAS,MAAM;AAAA,QACf;AAAA,MACF;AACA,YAAM,UAAU,UAAU,SAAS;AAAA,QACjC,KAAK,KAAK;AACR,kBAAQ,KAAK,GAAG;AAChB,mBAAS,QAAQ;AAAA,QACnB;AAAA,QACA,MAAM,KAAK;AACT,mBAAS,OAAO;AAChB,mBAAS,QAAQ;AACjB,mBAAS,QAAQ;AAAA,QACnB;AAAA,QACA,WAAW;AACT,mBAAS,OAAO;AAChB,mBAAS,QAAQ;AAAA,QACnB;AAAA,MACF,CAAC;AACD,YAAM,WAAW,gBAAgB,YAAY;AAC3C,mBAAW;AACT,cAAI,CAAC,QAAQ,QAAQ;AACnB,kBAAM,IAAI,QAAQ,CAAC,YAAY,SAAS,UAAU,OAAO;AAAA,UAC3D;AACA,iBAAO,QAAQ,QAAQ;AACrB,kBAAM,QAAQ,MAAM;AAAA,UACtB;AACA,cAAI,SAAS,OAAO;AAClB,kBAAM,SAAS;AAAA,UACjB;AACA,cAAI,SAAS,MAAM;AACjB;AAAA,UACF;AAAA,QACF;AAAA,MACF,EAAE;AACF,eAAS,QAAQ,OAAO,QAAQ;AAC9B,YAAI,CAAC,SAAS,MAAM;AAClB,mBAAS,OAAO;AAChB,mBAAS,QAAQ;AACjB,mBAAS,QAAQ;AAAA,QACnB;AACA,eAAO,EAAE,MAAM,MAAM,OAAO,OAAU;AAAA,MACxC;AACA,eAAS,SAAS,YAAY;AAC5B,gBAAQ;AACR,eAAO,EAAE,MAAM,MAAM,OAAO,OAAU;AAAA,MACxC;AACA,aAAO;AAAA,IACT;AAAA,IACA,MAAM,UAAU;AACd,iBAAW;AACX,UAAI,YAAY;AACd,cAAM,CAAC,MAAM,IAAI,MAAM;AACvB,eAAO,MAAM,KAAK,gBAAgB;AAAA,MACpC;AAAA,IACF;AAAA,IACA,YAAY;AACV,UAAI,YAAY;AACd,gBAAQ,KAAK,UAAU,IAAI,qBAAqB,CAAC;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AACF;AACA,IAAM,uBAAN,cAAmC,MAAM;AAAA,EAAzC;AAAA;AACE,gCAAO;AACP,mCAAU;AACV,gCAAO;AACP,kCAAS;AACT,oCAAW;AAAA;AACb;AACA,SAAS,iBAAiB,KAAK;AAC7B,SAAO,SAAS,GAAG,KAAK,UAAU,OAAO,YAAY;AACvD;AACA,SAAS,yBAAyB,MAAM;AACtC,MAAI;AAAA,IACF;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA,EAEF,EAAE,SAAS,IAAI;AACb,WAAO;AACT,SAAO,QAAQ,OAAO,QAAQ;AAChC;AACA,SAAS,YAAY,KAAK;AACxB,SAAO,OAAO,QAAQ,cAAc,iBAAiB,OAAO,YAAY,OAAO,aAAa,OAAO,gBAAgB,OAAO,UAAU;AACtI;;;ACveA,OAAO;;;AHiBP,OAAO,eAAe;AA0BtB,SAAS,4BAA4B,aAAuC;AAC1E,UAAQ,aAAa;AAAA,IACnB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,IAAM,qBAAN,MAAyB;AAAA,EAM9B,YAAY,QAA2B;AAFvC,SAAQ,eAA6C,oBAAI,IAAI;AAI3D,SAAK,gBAAgB,OAAO;AAG5B,QAAI,KAAK,eAAe;AACtB,WAAK,yBAAyB;AAAA,IAChC;AAGA,UAAM,WAAW,eAAe;AAAA,MAC9B,KAAK,OAAO;AAAA,MACZ,SAAS,OAAO;AAAA,MAChB,OAAO,CAAC,OAAO,SAAS,MAAM,OAAO,EAAE,GAAG,OAAO,cAAc,GAAG,KAAK,CAAC;AAAA,IAC1E,CAAC;AAGD,UAAM,YAAY,IAAI,UAAU;AAAA,MAC9B,OAAO;AAAA;AAAA,QAEL,SAAS,OAAO,cAAc,OAAO,WAAW;AAAA;AAAA,QAEhD,KAAK,OAAO,cAAc,OAAO,OAAO;AAAA;AAAA,QAExC,QAAQ,OAAO,cAAc,OAAO,WAAW;AAAA,MACjD;AAAA,MACA,UAAU;AAAA;AAAA,QAER,KAAK,OAAO,cAAc,UAAU,OAAO;AAAA;AAAA,QAE3C,SACE,OAAO,cAAc,UAAU,YAC9B,CAAC,OAAO,eAAe;AAItB,iBAAO;AAAA,YACL,UACG,MAAM,gBACJ,MAAM,iBAAiB,MAAM,cAAc,WAAW;AAAA,UAC7D;AAAA,QACF;AAAA,MACJ;AAAA,IACF,CAAC;AAGD,UAAM,oBAAoB,KAAK,CAAC,WAAW,QAAQ,CAAC;AAEpD,QAAI,OAAmB;AAGvB,QAAI,OAAO,sBAAsB;AAE/B,UAAI;AACJ,UAAI;AAEF,YAAI,OAAO,WAAW,eAAe,OAAO,WAAW,aAAa;AAElE,gBAAM,WAAW,UAAQ,IAAI;AAC7B,0BAAgB,SAAS,WAAW;AAGpC,cAAI,OAAQ,OAAe,cAAc,aAAa;AACpD,YAAC,OAAe,YAAY;AAAA,UAC9B;AAAA,QACF,OAAO;AAEL,0BAAgB;AAAA,QAClB;AAAA,MACF,SAAS,OAAO;AAAA,MAEhB;AAEA,YAAM,gBAAqB;AAAA,QACzB,KAAK,OAAO;AAAA,QACZ,kBAAkB;AAAA,UAChB,SAAS,OAAO;AAAA,QAClB;AAAA,MACF;AAGA,UAAI,iBAAiB,OAAO,WAAW,aAAa;AAClD,sBAAc,gBAAgB;AAAA,MAChC;AAEA,WAAK,qBAAqB,aAAa,aAAa;AAEpD,YAAM,SAAS,IAAI,cAAc,KAAK,kBAAkB;AAGxD,aAAO;AAAA,QACL,CAAC,EAAE,MAAM,MAAM;AACb,gBAAM,aAAa,kBAAkB,KAAK;AAC1C,iBACE,WAAW,SAAS,yBACpB,WAAW,cAAc;AAAA,QAE7B;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,SAAK,eAAe,IAAI,aAAa;AAAA,MACnC;AAAA,MACA,OACE,OAAO,aAAa,mBACpB,OAAO,YAAY,gBAAgB,SAAS,IACxC,IAAI,cAAc;AAAA,QAChB,cAAc;AAAA;AAAA,UAEZ,OAAO;AAAA,YACL,QAAQ,KAAK,iBAAiB,OAAO,WAAW;AAAA,UAClD;AAAA,QACF;AAAA,MACF,CAAC,IACD,IAAI,cAAc;AAAA;AAAA,MACxB,gBAAgB;AAAA,QACd,YAAY;AAAA,UACV,aAAa;AAAA,UACb,6BAA6B;AAAA,QAC/B;AAAA,QACA,OAAO;AAAA,UACL,aAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAIJ,OACA,WACA,SAC6B;AAC7B,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,aAAa,MAAM;AAAA,QAC3C;AAAA,QACA;AAAA,QACA,aAAa,SAAS,cAClB,4BAA4B,QAAQ,WAAW,IAC/C;AAAA;AAAA,QAEJ,6BAA6B,SAAS;AAAA,QACtC,cAAc,SAAS;AAAA,MACzB,CAAC;AAED,aAAO;AAAA,QACL,MAAM,OAAO;AAAA,QACb,SAAS,OAAO;AAAA,QAChB,OAAO,OAAO;AAAA,QACd,eAAe,OAAO;AAAA,QACtB,SAAS,MAAM,KAAK,MAAM,OAAO,WAAW,OAAO;AAAA,MACrD;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT;AAAA,QACA,eAAe;AAAA;AAAA,QACf,SAAS,MAAM,KAAK,MAAM,OAAO,WAAW,OAAO;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UACE,cACA,WACA,SACuC;AACvC,WAAO,IAAI,WAAW,CAAC,aAAkB;AACvC,YAAM,MAAM,KAAK,aACd,UAAU;AAAA,QACT,OAAO;AAAA,QACP;AAAA,MACF,CAAC,EACA,UAAU;AAAA,QACT,MAAM,CAAC,WAAgB;AACrB,gBAAM,qBAAgD;AAAA,YACpD,MAAM,OAAO;AAAA,YACb,SAAS;AAAA,YACT,OAAO,OAAO,SAAS,CAAC;AAAA,UAC1B;AACA,mBAAS,KAAK,kBAAkB;AAChC,mBAAS,SAAS,OAAO,IAAI;AAAA,QAC/B;AAAA,QACA,OAAO,CAAC,UAAe;AACrB,gBAAM,qBAAgD;AAAA,YACpD,MAAM;AAAA,YACN,SAAS;AAAA,YACT;AAAA,UACF;AACA,mBAAS,KAAK,kBAAkB;AAChC,mBAAS,UAAU,KAAK;AAAA,QAC1B;AAAA,QACA,UAAU,MAAM;AACd,mBAAS,SAAS;AAClB,mBAAS,aAAa;AAAA,QACxB;AAAA,MACF,CAAC;AAEH,aAAO,MAAM,IAAI,YAAY;AAAA,IAC/B,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BA,MAAM,aACJ,WACA,QAKwB;AAExB,UAAM,kBAAkB,KAAK,mBAAmB,SAAS;AAGzD,UAAM,eAAe,qBAAqB,QAAQ,OAAO;AAGzD,UAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAMC,KAAK,kBAAkB,SAAS,CAAC;AAAA,qBAC/B,KAAK,mBAAmB,SAAS,CAAC;AAAA;AAAA,UAE7C,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAkBT,KAAK,mBAAmB,WAAW,QAAQ,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAQ9D,UAAM,cAAc;AAAA,MAClB,OAAO,QAAQ;AAAA,MACf,MAAM,QAAQ;AAAA,MACd,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,MAChB,QAAQ,QAAQ;AAAA,MAChB,SAAS;AAAA,IACX;AAMA,UAAM,SAAS,MAAM,KAAK,MAAM,OAAO,WAAW;AAElD,QAAI,OAAO,OAAO;AAChB,YAAM,OAAO;AAAA,IACf;AAEA,WACG,OAAO,OAAe,eAAe,KAAK;AAAA,MACzC,OAAO,CAAC;AAAA,MACR,UAAU,EAAE,aAAa,OAAO,iBAAiB,MAAM;AAAA,IACzD;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBACJ,WACA,WACA,QACmB;AAEnB,UAAM,gBAAgB,OAAO,KAAK,SAAS;AAG3C,UAAM,oBAAoB,KAAK,qBAAqB,SAAS;AAE7D,UAAM,QAAQ;AAAA,kCACgB,cAAc,IAAI,CAAC,KAAK,UAAU,IAAI,GAAG,WAAW,EAAE,KAAK,IAAI,CAAC;AAAA,UACxF,iBAAiB,IAAI,cAAc,IAAI,CAAC,QAAQ,GAAG,GAAG,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,YAC3E,KAAK,mBAAmB,WAAW,MAAM,CAAC;AAAA;AAAA;AAAA;AAKlD,UAAM,SAAS,MAAM,KAAK,MAAM,OAAO,SAAS;AAEhD,QAAI,OAAO,OAAO;AAChB,YAAM,OAAO;AAAA,IACf;AAEA,WAAQ,OAAO,OAAe,iBAAiB,KAAK;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,wBACE,WACA,SAM4D;AAG5D,UAAM,QAAQ,SAAS,cACnB,GAAG,QAAQ,WAAW,GAAG,SAAS,KAClC,SAAS,KAAK,qBAAqB,SAAS,CAAC;AAEjD,UAAM,kBAAkB,KAAK,mBAAmB,SAAS;AACzD,UAAM,SAAS,KAAK,mBAAmB,WAAW,SAAS,MAAM;AAEjE,UAAM,eAAe;AAAA;AAAA;AAAA;AAAA,cAIX,eAAe,WAAW,SAAS,SAAS,EAAE;AAAA;AAAA;AAAA,kBAG1C,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYpB,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,QACE;AAAA,QACA,cAAc,SAAS,gBAAgB;AAAA,MACzC;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,oBACE,OACA,OACA,SAI0D;AAC1D,UAAM,eAAe;AAAA;AAAA;AAAA;AAAA,cAIX,KAAK;AAAA;AAAA;AAAA;AAAA;AAMf,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,QACE;AAAA,QACA,cAAc,SAAS,gBAAgB;AAAA,QACvC,GAAG,SAAS;AAAA,MACd;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gCACE,WACA,QACA,SAO4D;AAE5D,UAAM,QAAQ,SAAS,cACnB,GAAG,QAAQ,WAAW,GAAG,SAAS,KAClC,SAAS,KAAK,qBAAqB,SAAS,CAAC;AAEjD,UAAM,kBAAkB,KAAK,mBAAmB,SAAS;AACzD,UAAM,SAAS,KAAK,mBAAmB,WAAW,SAAS,MAAM;AACjE,UAAM,cAAc,qBAAqB,SAAS,OAAO;AACzD,UAAM,QAAQ,SAAS,SAAS;AAEhC,UAAM,eAAe;AAAA;AAAA;AAAA;AAAA,mBAIN,KAAK,kBAAkB,SAAS,CAAC;AAAA,qBAC/B,KAAK,mBAAmB,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,cAKzC,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAOX,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYpB,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,QACE;AAAA,QACA,cAAc,SAAS,gBAAgB;AAAA,QACvC;AAAA,QACA,SAAS;AAAA,QACT;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,0BACE,cACA,eACwC;AACxC,WAAO,IAAI,WAAW,CAAC,aAAkB;AACvC,YAAM,gBAAiE,CAAC;AACxE,YAAM,aAAyC,CAAC;AAGhD,mBAAa,QAAQ,CAAC,EAAE,WAAW,QAAQ,MAAM;AAC/C,cAAM,eAAe,KAAK;AAAA,UACxB;AAAA,UACA,SAAS;AAAA,UACT;AAAA,YACE,GAAG;AAAA,YACH,QAAQ,CAAC,SAAS;AAEhB,yBAAW,SAAS,IAAI;AAGxB,kBAAI,SAAS,QAAQ;AACnB,wBAAQ,OAAO,IAAI;AAAA,cACrB;AAGA,kBAAI,eAAe,QAAQ;AACzB,8BAAc,OAAO,UAAU;AAAA,cACjC;AAGA,uBAAS,KAAK,EAAE,GAAG,WAAW,CAAC;AAAA,YACjC;AAAA,YACA,SAAS,CAAC,UAAU;AAElB,kBAAI,SAAS,SAAS;AACpB,wBAAQ,QAAQ,KAAK;AAAA,cACvB;AAGA,kBAAI,eAAe,SAAS;AAC1B,8BAAc,QAAQ,KAAK;AAAA,cAC7B;AAGA,uBAAS,MAAM,KAAK;AAAA,YACtB;AAAA,UACF;AAAA,QACF;AAEA,sBAAc,KAAK,EAAE,WAAW,aAAa,CAAC;AAAA,MAChD,CAAC;AAGD,YAAM,sBAAsB,cAAc;AAAA,QAAI,CAAC,EAAE,aAAa,MAC5D,aAAa,UAAU;AAAA,MACzB;AAGA,aAAO,MAAM;AACX,4BAAoB,QAAQ,CAAC,QAAQ,IAAI,YAAY,CAAC;AAGtD,YAAI,eAAe,YAAY;AAC7B,wBAAc,WAAW;AAAA,QAC3B;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,qBACE,YACA,SAOwC;AACxC,UAAM,eAA+C,WAAW;AAAA,MAC9D,CAAC,eAAe;AAAA,QACd;AAAA,QACA,SAAS;AAAA,UACP,GAAG;AAAA;AAAA,UAEH,QAAQ,SAAS;AAAA,UACjB,QAAQ,SAAS;AAAA,UACjB,cAAc,SAAS;AAAA,UACvB,OAAO,SAAS;AAAA,UAChB,aAAa,SAAS;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAEA,WAAO,KAAK,0BAA6B,cAAc,OAAO;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,WACE,WACA,QACA,QAMmB;AACnB,UAAM,kBAAkB,KAAK,mBAAmB,SAAS;AACzD,UAAM,iBAAiB,OAAO,KAAK,YAAY;AAE/C,WAAO;AAAA;AAAA;AAAA;AAAA,mBAIQ,KAAK,kBAAkB,SAAS,CAAC;AAAA,qBAC/B,KAAK,mBAAmB,SAAS,CAAC;AAAA;AAAA,UAE7C,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAcT,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM5B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WACJ,SASoD;AACpD,UAAM,gBAAgB,QAAQ,IAAI,OAAO,EAAE,KAAK,WAAW,OAAO,MAAM;AACtE,YAAM,SAAS,MAAM,KAAK,aAAa,WAAW,MAAM;AACxD,aAAO,EAAE,KAAK,OAAO;AAAA,IACvB,CAAC;AAED,UAAM,UAAU,MAAM,QAAQ,IAAI,aAAa;AAE/C,WAAO,QAAQ;AAAA,MACb,CAAC,KAAK,EAAE,KAAK,OAAO,MAAM;AACxB,YAAI,GAAG,IAAI;AACX,eAAO;AAAA,MACT;AAAA,MACA,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,yBACE,WACA,cAC2B;AAC3B,WAAO,IAAI,WAAW,CAAC,aAAkB;AAEvC,WAAK,aAAgB,WAAW,YAAY,EACzC,KAAK,CAAC,gBAAgB;AACrB,iBAAS,KAAK,WAAW;AAAA,MAC3B,CAAC,EACA,MAAM,CAAC,UAAU,SAAS,MAAM,KAAK,CAAC;AAGzC,YAAM,eAAe,KAAK,wBAA2B,WAAW;AAAA,QAC9D,QAAQ,MAAM;AAEZ,eAAK,aAAgB,WAAW,YAAY,EACzC,KAAK,CAAC,gBAAgB;AACrB,qBAAS,KAAK,WAAW;AAAA,UAC3B,CAAC,EACA,MAAM,CAAC,UAAU,SAAS,MAAM,KAAK,CAAC;AAAA,QAC3C;AAAA,QACA,SAAS,CAAC,UAAU,SAAS,MAAM,KAAK;AAAA,MAC1C,CAAC;AAED,aAAO,MAAM,aAAa,UAAU,EAAE,YAAY;AAAA,IACpD,CAAC;AAAA,EACH;AAAA;AAAA,EAGQ,kBAAkB,WAA2B;AAEnD,UAAM,eAAe,KAAK,qBAAqB,SAAS;AACxD,UAAM,iBAAiB,KAAK,aAAa,YAAY;AAGrD,QAAI,eAAe,WAAW,OAAO,GAAG;AACtC,aAAO,GAAG,cAAc;AAAA,IAC1B;AAEA,WAAO,QAAQ,cAAc;AAAA,EAC/B;AAAA,EAEQ,mBAAmB,WAA2B;AAEpD,UAAM,aAAa,KAAK,mBAAmB,SAAS;AACpD,UAAM,iBAAiB,KAAK,aAAa,UAAU;AAGnD,QAAI,eAAe,WAAW,OAAO,GAAG;AACtC,aAAO,GAAG,cAAc;AAAA,IAC1B;AAEA,WAAO,QAAQ,cAAc;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,WAA2B;AAEpD,UAAM,gBAAgB,KAAK,YAAY,SAAS;AAGhD,WAAO,UAAU,OAAO,aAAa;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,WAA2B;AAEtD,UAAM,gBAAgB,KAAK,YAAY,SAAS;AAGhD,WAAO,UAAU,SAAS,aAAa;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,KAAqB;AACvC,WAAO,IAAI,QAAQ,aAAa,CAAC,GAAG,WAAW,OAAO,YAAY,CAAC;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,KAAqB;AACxC,UAAM,YAAY,KAAK,YAAY,GAAG;AACtC,WAAO,UAAU,OAAO,CAAC,EAAE,YAAY,IAAI,UAAU,MAAM,CAAC;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,YAAY,KAAqB;AAEvC,QAAI,IAAI,SAAS,GAAG,GAAG;AACrB,aAAO,IAAI,YAAY;AAAA,IACzB;AAGA,WAAO,IACJ,QAAQ,YAAY,KAAK,EACzB,YAAY,EACZ,QAAQ,MAAM,EAAE,EAChB,YAAY;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,aAA4B;AAChC,UAAM,KAAK,aAAa,WAAW;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA4B;AAChC,UAAM,KAAK,aAAa,WAAW;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAuD;AACrD,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,QAAI,KAAK,oBAAoB;AAC3B,WAAK,mBAAmB,QAAQ;AAAA,IAClC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,mBAA8C;AAC5C,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,iBACN,aACqB;AACrB,UAAM,SAA8B,CAAC;AAGrC,QAAI,CAAC,aAAa;AAChB,aAAO;AAAA,IACT;AAGA,QAAI,YAAY,iBAAiB;AAC/B,kBAAY,gBAAgB,QAAQ,CAAC,cAAc;AAEjD,cAAM,kBAAkB,KAAK,mBAAmB,SAAS;AAGzD,cAAM,iBACJ,YAAY,wBAAwB,eAAe;AAErD,eAAO,eAAe,IAAI;AAAA,UACxB,SAAS,gBAAgB,WAAW,CAAC,UAAU,SAAS;AAAA,UACxD,OAAO,gBAAgB,SAAS,KAAK;AAAA,QACvC;AAAA,MACF,CAAC;AAAA,IACH;AAGA,QAAI,YAAY,uBAAuB;AACrC,aAAO,QAAQ,YAAY,qBAAqB,EAAE;AAAA,QAChD,CAAC,CAAC,WAAW,QAAQ,MAAM;AAEzB,cAAI,CAAC,OAAO,SAAS,GAAG;AACtB,mBAAO,SAAS,IAAI;AAAA,cAClB,SAAS,SAAS,WAAW,CAAC,UAAU,SAAS;AAAA,cACjD,OAAO,SAAS,SAAS,KAAK;AAAA,YAChC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,WAAW,EAAE,OAAO,CAAC,EAAE,GAAG,UAAe;AAEpE,QAAI,CAAC,YAAY,CAAC,MAAM,QAAQ,SAAS,KAAK,GAAG;AAC/C,aAAO;AAAA,IACT;AACA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO,CAAC,GAAI,SAAS,SAAS,CAAC,GAAI,GAAG,SAAS,KAAK;AAAA,IACtD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,2BAAiC;AACvC,QAAI,CAAC,KAAK,eAAe;AACvB;AAAA,IACF;AAEA,UAAM,EAAE,aAAa,CAAC,GAAG,YAAY,CAAC,GAAG,QAAQ,CAAC,EAAE,IAAI,KAAK;AAG7D,eAAW,QAAQ,CAAC,iBAAsB;AACxC,aAAO,QAAQ,YAAY,EAAE;AAAA,QAC3B,CAAC,CAAC,eAAe,aAAa,MAAqB;AACjD,eAAK,iBAAiB,eAAe,eAAe,KAAK;AAAA,QAC3D;AAAA,MACF;AAAA,IACF,CAAC;AAGD,cAAU,QAAQ,CAAC,gBAAqB;AACtC,aAAO,QAAQ,WAAW,EAAE;AAAA,QAC1B,CAAC,CAAC,cAAc,YAAY,MAAqB;AAC/C,eAAK,iBAAiB,cAAc,cAAc,KAAK;AAAA,QACzD;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,iBACN,WACA,WACA,OACM;AAEN,UAAM,sBAAsB,UAAU,SAAS,GAAG,IAC9C,KAAK,YAAY,SAAS,IAC1B;AAEJ,UAAM,SAAmB,CAAC;AAC1B,UAAM,aAAuC,CAAC;AAG9C,QAAI,UAAU,UAAU,MAAM,QAAQ,UAAU,MAAM,GAAG;AACvD,gBAAU,OAAO,QAAQ,CAAC,aAAkB;AAC1C,eAAO,QAAQ,QAAQ,EAAE;AAAA,UACvB,CAAC,CAAC,WAAW,SAAS,MAAqB;AACzC,kBAAM,qBAAqB,KAAK,YAAY,SAAS;AACrD,mBAAO,KAAK,kBAAkB;AAAA,UAOhC;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAGA,WAAO,KAAK,aAAa,WAAW;AAGpC,UAAM,cAAwB,UAAU,KAAK;AAAA,MAAI,CAAC,QAChD,KAAK,YAAY,GAAG;AAAA,IACtB;AAEA,UAAM,YAA6B;AAAA,MACjC,WAAW;AAAA,MACX,QAAQ,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC;AAAA;AAAA,MAC3B;AAAA,MACA;AAAA,IACF;AAGA,SAAK,aAAa,IAAI,WAAW,SAAS;AAC1C,SAAK,aAAa,IAAI,qBAAqB,SAAS;AAGpD,QAAI,cAAc,qBAAqB;AACrC,WAAK,aAAa,IAAI,KAAK,YAAY,mBAAmB,GAAG,SAAS;AAAA,IACxE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,WAAgD;AAEpE,QAAI,YAAY,KAAK,aAAa,IAAI,SAAS;AAC/C,QAAI;AAAW,aAAO;AAGtB,UAAM,qBAAqB,KAAK,YAAY,SAAS;AACrD,gBAAY,KAAK,aAAa,IAAI,kBAAkB;AACpD,QAAI;AAAW,aAAO;AAGtB,QAAI,UAAU,SAAS,GAAG,GAAG;AAC3B,kBAAY,KAAK,aAAa,IAAI,UAAU,YAAY,CAAC;AACzD,UAAI;AAAW,eAAO;AAAA,IACxB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,WAA6B;AAE1C,WAAO,KAAK,iBAAiB,SAAS;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,WAA6B;AAC/C,UAAM,YAAY,KAAK,cAAc,SAAS;AAC9C,WAAO,WAAW,eAAe,CAAC;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,WAA6C;AAC9D,UAAM,YAAY,KAAK,cAAc,SAAS;AAC9C,WAAO,WAAW,cAAc,CAAC;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAgD;AAC9C,WAAO,IAAI,IAAI,KAAK,YAAY;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,WAA6B;AAE5C,UAAM,YAAY,KAAK,cAAc,SAAS;AAE9C,QAAI,WAAW;AACb,aAAO,UAAU;AAAA,IACnB;AAEA,WAAO,CAAC,aAAa,WAAW;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKQ,mBACN,WACA,cACQ;AACR,QAAI;AAEJ,QAAI,gBAAgB,aAAa,SAAS,GAAG;AAC3C,eAAS;AAAA,IACX,OAAO;AAEL,YAAM,aAAa,KAAK,eAAe,SAAS;AAChD,UAAI,WAAW,SAAS,GAAG;AACzB,iBAAS;AAAA,MACX,OAAO;AACL,iBAAS,CAAC,aAAa,WAAW;AAAA,MACpC;AAAA,IACF;AAIA,WAAO,OAAO,KAAK,UAAU;AAAA,EAC/B;AACF;AAGO,SAAS,yBACd,QACoB;AACpB,SAAO,IAAI,mBAAmB,MAAM;AACtC;AAGO,IAAM,gBAAgB;AAAA;AAAA,EAE3B,OAAO,CACL,WACA,SAAmB,CAAC,aAAa,WAAW,MACzC;AAAA,iBACU,UAAU,OAAO,CAAC,EAAE,YAAY,IAAI,UAAU,MAAM,CAAC,CAAC;AAAA;AAAA;AAAA,iBAGtD,UAAU,OAAO,CAAC,EAAE,YAAY,IAAI,UAAU,MAAM,CAAC,CAAC;AAAA;AAAA,QAE/D,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cASH,OAAO,KAAK,gBAAgB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQzC,cAAc,CAAC,cAAsB;AAAA,mBACpB,UAAU,OAAO,CAAC,EAAE,YAAY,IAAI,UAAU,MAAM,CAAC,CAAC;AAAA,QACjE,UAAU,OAAO,CAAC,EAAE,YAAY,IAAI,UAAU,MAAM,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAM9D;AAOA,SAAS,qBAAqB,SAA+B;AAC3D,MAAI,CAAC,WAAW,QAAQ,WAAW,GAAG;AACpC,WAAO,CAAC,SAAS;AAAA,EACnB;AAEA,SAAO,QAAQ,IAAI,CAAC,UAAU;AAE5B,UAAM,QAAQ,mBAAmB,MAAM,KAAK;AAC5C,UAAM,YAAY,MAAM,cAAc,SAAS,SAAS;AAGxD,WAAO,GAAG,KAAK,IAAI,SAAS;AAAA,EAC9B,CAAC;AACH;AAMA,SAAS,mBAAmB,KAAqB;AAE/C,MAAI,IAAI,SAAS,GAAG,GAAG;AACrB,WAAO,IAAI,YAAY;AAAA,EACzB;AAGA,SAAO,IACJ,QAAQ,YAAY,KAAK,EACzB,YAAY,EACZ,QAAQ,MAAM,EAAE,EAChB,YAAY;AACjB;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@0xobelisk/graphql-client",
|
|
3
|
-
"version": "1.2.0-pre.
|
|
4
|
-
"description": "Tookit for interacting with
|
|
3
|
+
"version": "1.2.0-pre.46",
|
|
4
|
+
"description": "Tookit for interacting with dubhe graphql client",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"sui",
|
|
7
7
|
"obelisk labs",
|
package/src/client.ts
CHANGED
|
@@ -1005,7 +1005,11 @@ export class DubheGraphqlClient {
|
|
|
1005
1005
|
tableData: any,
|
|
1006
1006
|
enums: any[]
|
|
1007
1007
|
): void {
|
|
1008
|
-
|
|
1008
|
+
// Handle table name: convert to camelCase if it contains underscores, otherwise keep as is
|
|
1009
|
+
const normalizedTableName = tableName.includes('_')
|
|
1010
|
+
? this.toCamelCase(tableName)
|
|
1011
|
+
: tableName;
|
|
1012
|
+
|
|
1009
1013
|
const fields: string[] = [];
|
|
1010
1014
|
const enumFields: Record<string, string[]> = {};
|
|
1011
1015
|
|
|
@@ -1036,14 +1040,42 @@ export class DubheGraphqlClient {
|
|
|
1036
1040
|
);
|
|
1037
1041
|
|
|
1038
1042
|
const tableInfo: ParsedTableInfo = {
|
|
1039
|
-
tableName:
|
|
1043
|
+
tableName: normalizedTableName,
|
|
1040
1044
|
fields: [...new Set(fields)], // Remove duplicates
|
|
1041
1045
|
primaryKeys,
|
|
1042
1046
|
enumFields,
|
|
1043
1047
|
};
|
|
1044
1048
|
|
|
1045
|
-
|
|
1046
|
-
this.parsedTables.set(
|
|
1049
|
+
// Store both original and normalized table names as keys for lookup
|
|
1050
|
+
this.parsedTables.set(tableName, tableInfo);
|
|
1051
|
+
this.parsedTables.set(normalizedTableName, tableInfo);
|
|
1052
|
+
|
|
1053
|
+
// If original and normalized table names are different, also store the snake_case version
|
|
1054
|
+
if (tableName !== normalizedTableName) {
|
|
1055
|
+
this.parsedTables.set(this.toSnakeCase(normalizedTableName), tableInfo);
|
|
1056
|
+
}
|
|
1057
|
+
}
|
|
1058
|
+
|
|
1059
|
+
/**
|
|
1060
|
+
* Find table info with multiple lookup strategies
|
|
1061
|
+
*/
|
|
1062
|
+
private findTableInfo(tableName: string): ParsedTableInfo | undefined {
|
|
1063
|
+
// Try direct lookup first
|
|
1064
|
+
let tableInfo = this.parsedTables.get(tableName);
|
|
1065
|
+
if (tableInfo) return tableInfo;
|
|
1066
|
+
|
|
1067
|
+
// Try camelCase version
|
|
1068
|
+
const camelCaseTableName = this.toCamelCase(tableName);
|
|
1069
|
+
tableInfo = this.parsedTables.get(camelCaseTableName);
|
|
1070
|
+
if (tableInfo) return tableInfo;
|
|
1071
|
+
|
|
1072
|
+
// Try snake_case version (only if it's different from original)
|
|
1073
|
+
if (tableName.includes('_')) {
|
|
1074
|
+
tableInfo = this.parsedTables.get(tableName.toLowerCase());
|
|
1075
|
+
if (tableInfo) return tableInfo;
|
|
1076
|
+
}
|
|
1077
|
+
|
|
1078
|
+
return undefined;
|
|
1047
1079
|
}
|
|
1048
1080
|
|
|
1049
1081
|
/**
|
|
@@ -1058,9 +1090,7 @@ export class DubheGraphqlClient {
|
|
|
1058
1090
|
* Get table primary key information
|
|
1059
1091
|
*/
|
|
1060
1092
|
getTablePrimaryKeys(tableName: string): string[] {
|
|
1061
|
-
const tableInfo =
|
|
1062
|
-
this.parsedTables.get(tableName) ||
|
|
1063
|
-
this.parsedTables.get(this.toSnakeCase(tableName));
|
|
1093
|
+
const tableInfo = this.findTableInfo(tableName);
|
|
1064
1094
|
return tableInfo?.primaryKeys || [];
|
|
1065
1095
|
}
|
|
1066
1096
|
|
|
@@ -1068,9 +1098,7 @@ export class DubheGraphqlClient {
|
|
|
1068
1098
|
* Get table enum field information
|
|
1069
1099
|
*/
|
|
1070
1100
|
getTableEnumFields(tableName: string): Record<string, string[]> {
|
|
1071
|
-
const tableInfo =
|
|
1072
|
-
this.parsedTables.get(tableName) ||
|
|
1073
|
-
this.parsedTables.get(this.toSnakeCase(tableName));
|
|
1101
|
+
const tableInfo = this.findTableInfo(tableName);
|
|
1074
1102
|
return tableInfo?.enumFields || {};
|
|
1075
1103
|
}
|
|
1076
1104
|
|
|
@@ -1086,9 +1114,7 @@ export class DubheGraphqlClient {
|
|
|
1086
1114
|
*/
|
|
1087
1115
|
getMinimalFields(tableName: string): string[] {
|
|
1088
1116
|
// If there's configuration, use fields from configuration
|
|
1089
|
-
const tableInfo =
|
|
1090
|
-
this.parsedTables.get(tableName) ||
|
|
1091
|
-
this.parsedTables.get(this.toSnakeCase(tableName));
|
|
1117
|
+
const tableInfo = this.findTableInfo(tableName);
|
|
1092
1118
|
|
|
1093
1119
|
if (tableInfo) {
|
|
1094
1120
|
return tableInfo.fields;
|