@vladimirdev635/gql-client 0.0.41 → 0.0.43

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/execute.d.ts CHANGED
@@ -1,9 +1,12 @@
1
- import { z } from 'zod/v4';
2
- import { ClientConfig, Operation, RequestContext } from './types/index.js';
1
+ import { ClientConfig, Operation, OperationVariables, RequestContext, SubOpAsyncIterable, SubscriptionOperation, SyncOperation } from './types/index.js';
2
+ import { OperationResult, OpResultBasedOnOp } from './types/utils.js';
3
3
  export interface ExecuteResult<TResult> {
4
4
  result: TResult;
5
5
  response: Response;
6
6
  }
7
- export declare function execute<TClientContext, TRequestContext extends RequestContext, T extends Operation>(config: ClientConfig<TClientContext, TRequestContext>, operation: T, variables: z.infer<T['variablesSchema']>, requestContext: TRequestContext): Promise<ExecuteResult<z.infer<T['resultSchema']>>>;
8
- export type Executor<TRequestContext extends RequestContext> = <T extends Operation>(operation: T, variables: z.infer<T['variablesSchema']>, context: TRequestContext) => Promise<ExecuteResult<z.infer<T['resultSchema']>>>;
7
+ export declare function execute<TClientContext, TRequestContext extends RequestContext, T extends Operation>(config: ClientConfig<TClientContext, TRequestContext>, operation: T, variables: OperationVariables<T>, requestContext: TRequestContext): Promise<ExecuteResult<OpResultBasedOnOp<T>>>;
8
+ export type Executor<TRequestContext extends RequestContext> = {
9
+ <TSyncOp extends SyncOperation>(operation: TSyncOp, variables: OperationVariables<TSyncOp>, context: TRequestContext): Promise<ExecuteResult<OperationResult<TSyncOp>>>;
10
+ <TOperation extends SubscriptionOperation>(operation: TOperation, variables: OperationVariables<TOperation>, context: TRequestContext): Promise<ExecuteResult<SubOpAsyncIterable<TOperation>>>;
11
+ };
9
12
  export declare function bindConfigToExecute<TClientContext, TRequestContext extends RequestContext>(config: ClientConfig<TClientContext, TRequestContext>): Executor<TRequestContext>;
package/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { createParser } from './parser.js';
1
+ export { createParser, type CreateParserOptions, } from './parser.js';
2
2
  export { createSerializer, createJSONSerializer, createMultipartSerializer, hasBlobValue } from './serializers/index.js';
3
3
  export { execute, bindConfigToExecute, type Executor, type ExecuteResult } from './execute.js';
4
- export type { Operation, RequestContext, ClientParser, ClientSerializer, ClientConfig, ClientMiddlewaresConfig, BeforeSerializationMiddleware, AfterSerializationMiddleware, BeforeParsingMiddleware, AfterParsingMiddleware, } from './types/index.js';
4
+ export type { Operation, SyncOperation, SubscriptionOperation, RequestContext, ClientParser, ClientSerializer, ClientConfig, ClientMiddlewaresConfig, BeforeSerializationMiddleware, AfterSerializationMiddleware, BeforeParsingMiddleware, AfterParsingMiddleware, OpResultBasedOnOp, OperationVariables, OperationResult } from './types/index.js';
package/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export { createParser } from './parser.js';
1
+ export { createParser, } from './parser.js';
2
2
  export { createSerializer, createJSONSerializer, createMultipartSerializer, hasBlobValue } from './serializers/index.js';
3
3
  export { execute, bindConfigToExecute } from './execute.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vladimirdev635/gql-client",
3
- "version": "0.0.41",
3
+ "version": "0.0.43",
4
4
  "type": "module",
5
5
  "main": "./index.js",
6
6
  "types": "./index.d.ts",
package/parser.d.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  import { ClientParser, Operation, RequestContext } from './types/index.js';
2
2
  import { ClientParserParseBodyOptions } from './types/parser.js';
3
- interface CreateParserOptions<TClientContext, TRequestContext extends RequestContext> {
3
+ export interface CreateParserOptions<TClientContext, TRequestContext extends RequestContext> {
4
4
  onErrors: <T extends Operation>(options: ClientParserParseBodyOptions<TClientContext, TRequestContext, T>, errors: any[]) => Promise<void> | void;
5
5
  }
6
6
  export declare function createParser<TClientContext, TRequestContext extends RequestContext>(parserOptions?: CreateParserOptions<TClientContext, TRequestContext>): ClientParser<TClientContext, TRequestContext>;
7
- export {};
package/parser.js CHANGED
@@ -1,3 +1,4 @@
1
+ import assert from 'assert';
1
2
  const defaultParserOptions = {
2
3
  onErrors(_, errors) {
3
4
  throw new Error(JSON.stringify(errors));
@@ -6,6 +7,37 @@ const defaultParserOptions = {
6
7
  export function createParser(parserOptions = defaultParserOptions) {
7
8
  return {
8
9
  parseBody: async (options) => {
10
+ if (options.operation.type === 'SUBSCRIPTION') {
11
+ if (options.response.status !== 200) {
12
+ throw new Error(await options.response.text());
13
+ }
14
+ assert(options.response.headers.get('content-type') ===
15
+ 'text/event-stream');
16
+ const stream = options.response.body;
17
+ assert(stream !== null);
18
+ const reader = stream.getReader();
19
+ const decoder = new TextDecoder();
20
+ let shouldClose = false;
21
+ const cancel = () => shouldClose = true;
22
+ const streamGen = async function* () {
23
+ while (!shouldClose) {
24
+ const readResult = await reader.read();
25
+ if (readResult.done || shouldClose)
26
+ break;
27
+ const lines = decoder.decode(readResult.value)
28
+ .split('\n');
29
+ for (const line of lines.filter(c => c !== '')) {
30
+ if (shouldClose)
31
+ return;
32
+ const [name, value] = line.split(/:(.*)/s, 2);
33
+ if (name !== 'data')
34
+ continue;
35
+ yield options.operation.resultSchema.parse(JSON.parse(value).data);
36
+ }
37
+ }
38
+ }();
39
+ return { stream: streamGen, cancel };
40
+ }
9
41
  const json = await options.response.json();
10
42
  if (json.errors) {
11
43
  await parserOptions.onErrors(options, json.errors);
@@ -1,11 +1,15 @@
1
1
  import assert from 'assert';
2
2
  export function createJSONSerializer() {
3
3
  return {
4
- serializeRequest: ({ operation, variables }) => {
4
+ serializeRequest: ({ operation, requestContext, variables }) => {
5
+ const headers = {
6
+ 'Content-Type': 'application/json'
7
+ };
8
+ if (operation.type === 'SUBSCRIPTION') {
9
+ headers.Accept = 'text/event-stream';
10
+ }
5
11
  return {
6
- headers: {
7
- 'Content-Type': 'application/json'
8
- },
12
+ headers,
9
13
  method: 'POST',
10
14
  body: JSON.stringify({
11
15
  query: operation.document,
@@ -14,7 +18,8 @@ export function createJSONSerializer() {
14
18
  assert(!(value instanceof File), 'jsonSerializer cannot encode File objects, ' +
15
19
  `key: "${key}"`);
16
20
  return value;
17
- })
21
+ }),
22
+ ...requestContext.fetchOptions
18
23
  };
19
24
  },
20
25
  };
@@ -55,13 +55,14 @@ function buildFormData(operation, variables, shouldTreatAsObject) {
55
55
  }
56
56
  export function createMultipartSerializer() {
57
57
  return {
58
- serializeRequest: ({ operation, variables }) => {
58
+ serializeRequest: ({ operation, requestContext, variables }) => {
59
59
  return {
60
60
  headers: {
61
61
  'Content-Type': 'multipart/form-data'
62
62
  },
63
63
  method: 'POST',
64
- body: buildFormData(operation, variables)
64
+ body: buildFormData(operation, variables),
65
+ ...requestContext.fetchOptions
65
66
  };
66
67
  },
67
68
  };
package/types/base.d.ts CHANGED
@@ -1,11 +1,19 @@
1
1
  import { z } from 'zod/v4';
2
- export interface Operation {
3
- type: 'QUERY' | 'MUTATION' | 'SUBSCRIPTION';
2
+ export interface SyncOperation {
3
+ type: 'QUERY' | 'MUTATION';
4
4
  name: string;
5
5
  document: string;
6
6
  variablesSchema: z.ZodType;
7
7
  resultSchema: z.ZodType;
8
8
  }
9
+ export interface SubscriptionOperation {
10
+ type: 'SUBSCRIPTION';
11
+ name: string;
12
+ document: string;
13
+ variablesSchema: z.ZodType;
14
+ resultSchema: z.ZodType;
15
+ }
16
+ export type Operation = SyncOperation | SubscriptionOperation;
9
17
  export interface RequestContext {
10
18
  fetchOptions?: RequestInit;
11
19
  }
package/types/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
- export type { Operation, RequestContext } from './base.js';
1
+ export type { Operation, SyncOperation, SubscriptionOperation, RequestContext, } from './base.js';
2
2
  export type { BeforeSerializationMiddleware, AfterSerializationMiddleware, BeforeParsingMiddleware, AfterParsingMiddleware, ClientMiddlewaresConfig } from './middlewares.js';
3
- export type { ClientParser } from './parser.js';
3
+ export type { ClientParser, SubOpAsyncIterable } from './parser.js';
4
4
  export type { ClientSerializer } from './serializer.js';
5
5
  export type { ClientConfig } from './config.js';
6
+ export type { OperationResult, OperationVariables, OpResultBasedOnOp } from './utils.js';
@@ -1,38 +1,41 @@
1
- import { z } from 'zod/v4';
2
- import { Operation, RequestContext } from './base.js';
1
+ import { Operation, SubscriptionOperation, SyncOperation, RequestContext } from './base.js';
2
+ import { SubOpAsyncIterable } from './parser.js';
3
+ import { OperationResult, OperationVariables, OpResultBasedOnOp, PromiseOrValue } from './utils.js';
3
4
  export type BeforeSerializationMiddleware<TClientContext, TRequestContext extends RequestContext> = <T extends Operation>(options: {
4
5
  clientContext: TClientContext;
5
6
  requestContext: TRequestContext;
6
7
  operation: T;
7
- variables: z.infer<T['variablesSchema']>;
8
- }) => Promise<[T, z.infer<T['variablesSchema']>]> | [
9
- T,
10
- z.infer<T['variablesSchema']>
11
- ];
8
+ variables: OperationVariables<T>;
9
+ }) => PromiseOrValue<[T, OperationVariables<T>]>;
12
10
  export type AfterSerializationMiddleware<TClientContext, TRequestContext extends RequestContext> = <T extends Operation>(options: {
13
11
  clientContext: TClientContext;
14
12
  requestContext: TRequestContext;
15
13
  operation: T;
16
- variables: z.infer<T['variablesSchema']>;
14
+ variables: OperationVariables<T>;
17
15
  init: RequestInit;
18
- }) => Promise<RequestInit> | RequestInit;
16
+ }) => PromiseOrValue<RequestInit>;
19
17
  export type BeforeParsingMiddleware<TClientContext, TRequestContext extends RequestContext> = <T extends Operation>(options: {
20
18
  clientContext: TClientContext;
21
19
  requestContext: TRequestContext;
22
20
  operation: T;
23
- variables: z.infer<T['variablesSchema']>;
21
+ variables: OperationVariables<T>;
24
22
  init: RequestInit;
25
23
  response: Response;
26
- }) => Promise<Response> | Response;
27
- export type AfterParsingMiddleware<TClientContext, TRequestContext extends RequestContext> = <T extends Operation>(options: {
24
+ }) => PromiseOrValue<Response>;
25
+ export interface AfterParsingMiddlewareOptions<TClientContext, TRequestContext extends RequestContext, T extends Operation> {
28
26
  clientContext: TClientContext;
29
27
  requestContext: TRequestContext;
30
28
  operation: T;
31
- variables: z.infer<T['variablesSchema']>;
29
+ variables: OperationVariables<T>;
32
30
  init: RequestInit;
33
31
  response: Response;
34
- result: z.infer<T['resultSchema']>;
35
- }) => Promise<z.infer<T['resultSchema']>> | z.infer<T['resultSchema']>;
32
+ result: OpResultBasedOnOp<T>;
33
+ }
34
+ export type AfterParsingMiddleware<TClientContext, TRequestContext extends RequestContext> = {
35
+ <TSyncOp extends SyncOperation>(options: AfterParsingMiddlewareOptions<TClientContext, TRequestContext, TSyncOp>): PromiseOrValue<OperationResult<TSyncOp>>;
36
+ <TSubOp extends SubscriptionOperation>(options: AfterParsingMiddlewareOptions<TClientContext, TRequestContext, TSubOp>): PromiseOrValue<SubOpAsyncIterable<OperationResult<TSubOp>>>;
37
+ <TOp extends Operation>(options: AfterParsingMiddlewareOptions<TClientContext, TRequestContext, TOp>): PromiseOrValue<OperationResult<TOp>> | PromiseOrValue<SubOpAsyncIterable<OperationResult<TOp>>>;
38
+ };
36
39
  export interface ClientMiddlewaresConfig<TClientContext, TRequestContext extends RequestContext> {
37
40
  beforeSerialization: BeforeSerializationMiddleware<TClientContext, TRequestContext>[];
38
41
  afterSerialization: AfterSerializationMiddleware<TClientContext, TRequestContext>[];
package/types/parser.d.ts CHANGED
@@ -1,11 +1,20 @@
1
- import { z } from 'zod/v4';
2
- import { Operation, RequestContext } from './base.js';
3
- export interface ClientParserParseBodyOptions<TClientContext, TRequestContext extends RequestContext, T extends Operation> {
1
+ import type { SubscriptionOperation, SyncOperation, RequestContext, Operation } from './base.js';
2
+ import { OperationResult, PromiseOrValue } from './utils.js';
3
+ export interface ClientParserParseBodyOptions<TClientContext, TRequestContext extends RequestContext, TOperation> {
4
4
  clientContext: TClientContext;
5
5
  requestContext: TRequestContext;
6
- operation: T;
6
+ operation: TOperation;
7
7
  response: Response;
8
8
  }
9
+ export type SubOpAsyncIterable<TResult> = {
10
+ stream: AsyncIterable<TResult, void, unknown>;
11
+ close: () => void;
12
+ };
13
+ export type ParseBodyFuncType<TClientContext, TRequestContext extends RequestContext> = {
14
+ <TSyncOp extends SyncOperation>(options: ClientParserParseBodyOptions<TClientContext, TRequestContext, TSyncOp>): PromiseOrValue<OperationResult<TSyncOp>>;
15
+ <TSubOp extends SubscriptionOperation>(options: ClientParserParseBodyOptions<TClientContext, TRequestContext, TSubOp>): PromiseOrValue<SubOpAsyncIterable<OperationResult<TSubOp>>>;
16
+ <TOp extends Operation>(options: ClientParserParseBodyOptions<TClientContext, TRequestContext, TOp>): PromiseOrValue<OperationResult<TOp>> | PromiseOrValue<SubOpAsyncIterable<OperationResult<TOp>>>;
17
+ };
9
18
  export interface ClientParser<TClientContext, TRequestContext extends RequestContext> {
10
- parseBody: <T extends Operation>(options: ClientParserParseBodyOptions<TClientContext, TRequestContext, T>) => Promise<z.infer<T['resultSchema']>> | z.infer<T['resultSchema']>;
19
+ parseBody: ParseBodyFuncType<TClientContext, TRequestContext>;
11
20
  }
@@ -1,10 +1,10 @@
1
- import { z } from 'zod/v4';
2
1
  import { Operation, RequestContext } from './base.js';
2
+ import { OperationVariables, PromiseOrValue } from './utils.js';
3
3
  export interface ClientSerializer<TClientContext, TRequestContext extends RequestContext> {
4
4
  serializeRequest: <T extends Operation>(options: {
5
5
  clientContext: TClientContext;
6
6
  requestContext: TRequestContext;
7
7
  operation: T;
8
- variables: z.infer<T['variablesSchema']>;
9
- }) => Promise<RequestInit> | RequestInit;
8
+ variables: OperationVariables<T>;
9
+ }) => PromiseOrValue<RequestInit>;
10
10
  }
@@ -0,0 +1,6 @@
1
+ import { z } from 'zod/v4';
2
+ import { Operation, SubscriptionOperation, SyncOperation } from './base.js';
3
+ export type PromiseOrValue<T> = Promise<T> | T;
4
+ export type OperationResult<T extends Operation> = z.infer<T['resultSchema']>;
5
+ export type OperationVariables<T extends Operation> = z.infer<T['variablesSchema']>;
6
+ export type OpResultBasedOnOp<T extends Operation> = T extends SyncOperation ? OperationResult<T> : T extends SubscriptionOperation ? AsyncIterable<OperationResult<T>> : never;
package/types/utils.js ADDED
@@ -0,0 +1 @@
1
+ export {};