@vladimirdev635/gql-client 0.0.24 → 0.0.26

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,9 @@
1
1
  import { z } from 'zod/v4';
2
- import { ClientConfig, Operation } from './types.js';
2
+ import { ClientConfig, Operation, RequestContext } from './types/index.js';
3
3
  export interface ExecuteResult<T extends Operation> {
4
4
  result: z.infer<T['resultSchema']>;
5
5
  response: Response;
6
6
  }
7
- export declare function execute<TContext, T extends Operation>(config: ClientConfig<TContext>, operation: T, variables: z.infer<T['variablesSchema']>): Promise<ExecuteResult<T>>;
8
- export type Executor = <T extends Operation>(operation: T, variables: z.infer<T['variablesSchema']>) => Promise<ExecuteResult<T>>;
9
- export declare function bindConfigToExecute<TContext>(config: ClientConfig<TContext>): Executor;
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<T>>;
8
+ export type Executor<TRequestContext extends RequestContext> = <T extends Operation>(operation: T, variables: z.infer<T['variablesSchema']>, context: TRequestContext) => Promise<ExecuteResult<T>>;
9
+ export declare function bindConfigToExecute<TClientContext, TRequestContext extends RequestContext>(config: ClientConfig<TClientContext, TRequestContext>): Executor<TRequestContext>;
package/execute.js CHANGED
@@ -1,21 +1,57 @@
1
- export async function execute(config, operation, variables) {
1
+ export async function execute(config, operation, variables, requestContext) {
2
2
  for (const middleware of config.middlewares.beforeSerialization) {
3
- [operation, variables] = await middleware(config.context, operation, variables);
3
+ [operation, variables] = await middleware({
4
+ clientContext: config.context,
5
+ requestContext,
6
+ operation,
7
+ variables
8
+ });
4
9
  }
5
- let init = await config.serializer.serializeRequest(config.context, operation, variables);
10
+ let init = await config.serializer.serializeRequest({
11
+ clientContext: config.context,
12
+ requestContext,
13
+ operation,
14
+ variables
15
+ });
6
16
  for (const middleware of config.middlewares.afterSerialization) {
7
- init = await middleware(config.context, operation, variables, init);
17
+ init = await middleware({
18
+ clientContext: config.context,
19
+ requestContext,
20
+ operation,
21
+ variables,
22
+ init
23
+ });
8
24
  }
9
25
  let response = await config.fetcher(init);
10
26
  for (const middleware of config.middlewares.beforeParsing) {
11
- response = await middleware(config.context, operation, variables, init, response);
27
+ response = await middleware({
28
+ clientContext: config.context,
29
+ requestContext,
30
+ operation,
31
+ variables,
32
+ init,
33
+ response
34
+ });
12
35
  }
13
- let result = await config.parser.parseBody(config.context, operation, response);
36
+ let result = await config.parser.parseBody({
37
+ clientContext: config.context,
38
+ requestContext,
39
+ operation,
40
+ response
41
+ });
14
42
  for (const middleware of config.middlewares.afterParsing) {
15
- result = await middleware(config.context, operation, variables, init, response, result);
43
+ result = await middleware({
44
+ clientContext: config.context,
45
+ requestContext,
46
+ operation,
47
+ variables,
48
+ init,
49
+ response,
50
+ result
51
+ });
16
52
  }
17
53
  return { result, response };
18
54
  }
19
55
  export function bindConfigToExecute(config) {
20
- return (operation, variables) => execute(config, operation, variables);
56
+ return (operation, variables, requestContext) => execute(config, operation, variables, requestContext);
21
57
  }
package/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export { createParser } from './parser.js';
2
+ export { createSerializer, createJSONSerializer, createMultipartSerializer, hasBlobValue } from './serializers/index.js';
2
3
  export { execute, bindConfigToExecute, type Executor, type ExecuteResult } from './execute.js';
3
- export type { Operation, ClientParser, ClientSerializer, ClientConfig } from './types.js';
4
+ export type { Operation, RequestContext, ClientParser, ClientSerializer, ClientConfig, ClientMiddlewaresConfig, BeforeSerializationMiddleware, AfterSerializationMiddleware, BeforeParsingMiddleware, AfterParsingMiddleware, } from './types/index.js';
package/index.js CHANGED
@@ -1,2 +1,3 @@
1
1
  export { createParser } from './parser.js';
2
+ export { createSerializer, createJSONSerializer, createMultipartSerializer, hasBlobValue } from './serializers/index.js';
2
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.24",
3
+ "version": "0.0.26",
4
4
  "type": "module",
5
5
  "main": "./index.js",
6
6
  "types": "./index.d.ts",
package/parser.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- import { ClientParser, Operation } from './types.js';
2
- interface CreateParserOptions<TContext> {
3
- onErrors: <T extends Operation>(context: TContext, operation: T, response: Response, errors: any[]) => Promise<void> | void;
1
+ import { ClientParser, Operation, RequestContext } from './types/index.js';
2
+ import { ClientParserParseBodyOptions } from './types/parser.js';
3
+ interface CreateParserOptions<TClientContext, TRequestContext extends RequestContext> {
4
+ onErrors: <T extends Operation>(options: ClientParserParseBodyOptions<TClientContext, TRequestContext, T>, errors: any[]) => Promise<void> | void;
4
5
  }
5
- export declare function createParser<TContext>(options?: CreateParserOptions<TContext>): ClientParser<TContext>;
6
+ export declare function createParser<TClientContext, TRequestContext extends RequestContext>(parserOptions?: CreateParserOptions<TClientContext, TRequestContext>): ClientParser<TClientContext, TRequestContext>;
6
7
  export {};
package/parser.js CHANGED
@@ -1,16 +1,16 @@
1
1
  const defaultParserOptions = {
2
- onErrors(_, __, ___, errors) {
2
+ onErrors(_, errors) {
3
3
  throw new Error(JSON.stringify(errors));
4
4
  },
5
5
  };
6
- export function createParser(options = defaultParserOptions) {
6
+ export function createParser(parserOptions = defaultParserOptions) {
7
7
  return {
8
- parseBody: async (context, operation, response) => {
9
- const json = await response.json();
8
+ parseBody: async (options) => {
9
+ const json = await options.response.json();
10
10
  if (json.errors) {
11
- await options.onErrors(context, operation, response, json.errors);
11
+ await parserOptions.onErrors(options, json.errors);
12
12
  }
13
- return operation.resultSchema.parse(json.data);
13
+ return options.operation.resultSchema.parse(json.data);
14
14
  },
15
15
  };
16
16
  }
@@ -1,2 +1,2 @@
1
- import { ClientSerializer } from '@/types.js';
2
- export declare function createJSONSerializer<TContext>(): ClientSerializer<TContext>;
1
+ import { ClientSerializer, RequestContext } from '@/types/index.js';
2
+ export declare function createJSONSerializer<TClientContext, TRequestContext extends RequestContext>(): ClientSerializer<TClientContext, TRequestContext>;
@@ -1,11 +1,12 @@
1
1
  import assert from 'assert';
2
2
  export function createJSONSerializer() {
3
3
  return {
4
- serializeRequest: (_, operation, variables) => {
4
+ serializeRequest: ({ operation, variables }) => {
5
5
  return {
6
6
  headers: {
7
7
  'Content-Type': 'application/json'
8
8
  },
9
+ method: 'POST',
9
10
  body: JSON.stringify({
10
11
  query: operation.document,
11
12
  variables
@@ -1,2 +1,2 @@
1
- import { ClientSerializer } from '@/types.js';
2
- export declare function createMultipartSerializer<TContext>(): ClientSerializer<TContext>;
1
+ import { ClientSerializer, RequestContext } from '@/types/index.js';
2
+ export declare function createMultipartSerializer<TClientContext, TRequestContext extends RequestContext>(): ClientSerializer<TClientContext, TRequestContext>;
@@ -55,11 +55,12 @@ function buildFormData(operation, variables, shouldTreatAsObject) {
55
55
  }
56
56
  export function createMultipartSerializer() {
57
57
  return {
58
- serializeRequest: (_, operation, variables) => {
58
+ serializeRequest: ({ operation, variables }) => {
59
59
  return {
60
60
  headers: {
61
61
  'Content-Type': 'multipart/form-data'
62
62
  },
63
+ method: 'POST',
63
64
  body: buildFormData(operation, variables)
64
65
  };
65
66
  },
@@ -1,3 +1,4 @@
1
- import { ClientSerializer } from '../types.js';
1
+ import { RequestContext } from '@/types/base.js';
2
+ import { ClientSerializer } from '@/types/serializer.js';
2
3
  export declare function hasBlobValue(data: any): boolean;
3
- export declare function createSerializer<TContext>(jsonSerializer: ClientSerializer<TContext>, multipartSerializer: ClientSerializer<TContext>, shouldUseMultipartSerializer?: (variables: any) => boolean): ClientSerializer<TContext>;
4
+ export declare function createSerializer<TClientContext, TRequestContext extends RequestContext>(jsonSerializer: ClientSerializer<TClientContext, TRequestContext>, multipartSerializer: ClientSerializer<TClientContext, TRequestContext>, shouldUseMultipartSerializer?: (variables: any) => boolean): ClientSerializer<TClientContext, TRequestContext>;
@@ -17,11 +17,11 @@ export function createSerializer(jsonSerializer, multipartSerializer,
17
17
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
18
18
  shouldUseMultipartSerializer = hasBlobValue) {
19
19
  return {
20
- serializeRequest: (context, operation, variables) => {
21
- if (!shouldUseMultipartSerializer(variables)) {
22
- return jsonSerializer.serializeRequest(context, operation, variables);
20
+ serializeRequest: (options) => {
21
+ if (!shouldUseMultipartSerializer(options.variables)) {
22
+ return jsonSerializer.serializeRequest(options);
23
23
  }
24
- return multipartSerializer.serializeRequest(context, operation, variables);
24
+ return multipartSerializer.serializeRequest(options);
25
25
  },
26
26
  };
27
27
  }
@@ -6,6 +6,8 @@ describe('Json serializer', () => {
6
6
  it('Should crush if files are present', async () => {
7
7
  const operation = {
8
8
  document: 'test-document',
9
+ name: '',
10
+ type: 'QUERY',
9
11
  variablesSchema: z.object({
10
12
  name: z.string(),
11
13
  file: z.file(),
@@ -16,11 +18,18 @@ describe('Json serializer', () => {
16
18
  name: 'test-name',
17
19
  file: new File([], '')
18
20
  };
19
- expect(() => jsonSerializer.serializeRequest({}, operation, variables)).toThrowError('jsonSerializer cannot encode File objects, key: "file"');
21
+ expect(() => jsonSerializer.serializeRequest({
22
+ operation,
23
+ variables,
24
+ clientContext: {},
25
+ requestContext: {}
26
+ })).toThrowError('jsonSerializer cannot encode File objects, key: "file"');
20
27
  });
21
28
  it('Should json stringify variables', async () => {
22
29
  const operation = {
23
30
  document: 'test-document',
31
+ name: '',
32
+ type: 'QUERY',
24
33
  variablesSchema: z.object({
25
34
  name: z.string(),
26
35
  }),
@@ -29,7 +38,12 @@ describe('Json serializer', () => {
29
38
  const variables = {
30
39
  name: 'test-name',
31
40
  };
32
- const init = await jsonSerializer.serializeRequest({}, operation, variables);
41
+ const init = await jsonSerializer.serializeRequest({
42
+ clientContext: {},
43
+ requestContext: {},
44
+ operation,
45
+ variables
46
+ });
33
47
  const headers = new Headers(init.headers);
34
48
  expect(headers.get('Content-Type')).toBe('application/json');
35
49
  expect(init.body).toBe(JSON.stringify({
@@ -7,6 +7,8 @@ describe('Multipart serializer', () => {
7
7
  it('Should crush if no files present', () => {
8
8
  const operation = {
9
9
  document: 'test-document',
10
+ name: '',
11
+ type: 'QUERY',
10
12
  variablesSchema: z.object({
11
13
  name: z.string()
12
14
  }),
@@ -15,11 +17,18 @@ describe('Multipart serializer', () => {
15
17
  const variables = {
16
18
  name: 'test-name'
17
19
  };
18
- expect(() => multipartSerializer.serializeRequest({}, operation, variables)).toThrowError('Dont use multipartSerializer for regular bodies');
20
+ expect(() => multipartSerializer.serializeRequest({
21
+ clientContext: {},
22
+ requestContext: {},
23
+ operation,
24
+ variables
25
+ })).toThrowError('Dont use multipartSerializer for regular bodies');
19
26
  });
20
27
  it('Should build proper form data', async () => {
21
28
  const operation = {
22
29
  document: 'test-document',
30
+ name: '',
31
+ type: 'QUERY',
23
32
  variablesSchema: z.object({
24
33
  name: z.string(),
25
34
  file: z.file()
@@ -30,7 +39,12 @@ describe('Multipart serializer', () => {
30
39
  name: 'test-name',
31
40
  file: new File([], 'check.txt')
32
41
  };
33
- const init = await multipartSerializer.serializeRequest({}, operation, variables);
42
+ const init = await multipartSerializer.serializeRequest({
43
+ clientContext: {},
44
+ requestContext: {},
45
+ operation,
46
+ variables
47
+ });
34
48
  const headers = new Headers(init.headers);
35
49
  expect(headers.get('Content-Type')).toBe('multipart/form-data');
36
50
  assert(init.body != null);
@@ -0,0 +1,11 @@
1
+ import { z } from 'zod/v4';
2
+ export interface Operation {
3
+ type: 'QUERY' | 'MUTATION' | 'SUBSCRIPTION';
4
+ name: string;
5
+ document: string;
6
+ variablesSchema: z.ZodType;
7
+ resultSchema: z.ZodType;
8
+ }
9
+ export interface RequestContext {
10
+ fetchOptions?: RequestInit;
11
+ }
@@ -0,0 +1,11 @@
1
+ import { RequestContext } from './base.js';
2
+ import { ClientMiddlewaresConfig } from './middlewares.js';
3
+ import { ClientParser } from './parser.js';
4
+ import { ClientSerializer } from './serializer.js';
5
+ export interface ClientConfig<TClientContext, TRequestContext extends RequestContext> {
6
+ context: TClientContext;
7
+ parser: ClientParser<TClientContext, TRequestContext>;
8
+ serializer: ClientSerializer<TClientContext, TRequestContext>;
9
+ middlewares: ClientMiddlewaresConfig<TClientContext, TRequestContext>;
10
+ fetcher: (init: RequestInit) => Promise<Response>;
11
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,5 @@
1
+ export type { Operation, RequestContext } from './base.js';
2
+ export type { BeforeSerializationMiddleware, AfterSerializationMiddleware, BeforeParsingMiddleware, AfterParsingMiddleware, ClientMiddlewaresConfig } from './middlewares.js';
3
+ export type { ClientParser } from './parser.js';
4
+ export type { ClientSerializer } from './serializer.js';
5
+ export type { ClientConfig } from './config.js';
package/types/index.js ADDED
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,41 @@
1
+ import { z } from 'zod/v4';
2
+ import { Operation, RequestContext } from './base.js';
3
+ export type BeforeSerializationMiddleware<TClientContext, TRequestContext extends RequestContext> = <T extends Operation>(options: {
4
+ clientContext: TClientContext;
5
+ requestContext: TRequestContext;
6
+ operation: T;
7
+ variables: z.infer<T['variablesSchema']>;
8
+ }) => Promise<[T, z.infer<T['variablesSchema']>]> | [
9
+ T,
10
+ z.infer<T['variablesSchema']>
11
+ ];
12
+ export type AfterSerializationMiddleware<TClientContext, TRequestContext extends RequestContext> = <T extends Operation>(options: {
13
+ clientContext: TClientContext;
14
+ requestContext: TRequestContext;
15
+ operation: T;
16
+ variables: z.infer<T['variablesSchema']>;
17
+ init: RequestInit;
18
+ }) => Promise<RequestInit> | RequestInit;
19
+ export type BeforeParsingMiddleware<TClientContext, TRequestContext extends RequestContext> = <T extends Operation>(options: {
20
+ clientContext: TClientContext;
21
+ requestContext: TRequestContext;
22
+ operation: T;
23
+ variables: z.infer<T['variablesSchema']>;
24
+ init: RequestInit;
25
+ response: Response;
26
+ }) => Promise<Response> | Response;
27
+ export type AfterParsingMiddleware<TClientContext, TRequestContext extends RequestContext> = <T extends Operation>(options: {
28
+ clientContext: TClientContext;
29
+ requestContext: TRequestContext;
30
+ operation: T;
31
+ variables: z.infer<T['variablesSchema']>;
32
+ init: RequestInit;
33
+ response: Response;
34
+ result: z.infer<T['resultSchema']>;
35
+ }) => Promise<z.infer<T['resultSchema']>> | z.infer<T['resultSchema']>;
36
+ export interface ClientMiddlewaresConfig<TClientContext, TRequestContext extends RequestContext> {
37
+ beforeSerialization: BeforeSerializationMiddleware<TClientContext, TRequestContext>[];
38
+ afterSerialization: AfterSerializationMiddleware<TClientContext, TRequestContext>[];
39
+ beforeParsing: BeforeParsingMiddleware<TClientContext, TRequestContext>[];
40
+ afterParsing: AfterParsingMiddleware<TClientContext, TRequestContext>[];
41
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ import { z } from 'zod/v4';
2
+ import { Operation, RequestContext } from './base.js';
3
+ export interface ClientParserParseBodyOptions<TClientContext, TRequestContext extends RequestContext, T extends Operation> {
4
+ clientContext: TClientContext;
5
+ requestContext: TRequestContext;
6
+ operation: T;
7
+ response: Response;
8
+ }
9
+ 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']>;
11
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ import { z } from 'zod/v4';
2
+ import { Operation, RequestContext } from './base.js';
3
+ export interface ClientSerializer<TClientContext, TRequestContext extends RequestContext> {
4
+ serializeRequest: <T extends Operation>(options: {
5
+ clientContext: TClientContext;
6
+ requestContext: TRequestContext;
7
+ operation: T;
8
+ variables: z.infer<T['variablesSchema']>;
9
+ }) => Promise<RequestInit> | RequestInit;
10
+ }
@@ -0,0 +1 @@
1
+ export {};
package/types.d.ts DELETED
@@ -1,32 +0,0 @@
1
- import { z } from 'zod/v4';
2
- export interface Operation {
3
- document: string;
4
- variablesSchema: z.ZodType;
5
- resultSchema: z.ZodType;
6
- }
7
- export interface ClientParser<TContext> {
8
- parseBody: <T extends Operation>(context: TContext, operation: T, response: Response) => Promise<z.infer<T['resultSchema']>> | z.infer<T['resultSchema']>;
9
- }
10
- export interface ClientSerializer<TContext> {
11
- serializeRequest: <T extends Operation>(context: TContext, operation: T, variables: z.infer<T['variablesSchema']>) => Promise<RequestInit> | RequestInit;
12
- }
13
- export type BeforeSerializationMiddleware<TContext> = <T extends Operation>(context: TContext, operation: T, variables: z.infer<T['variablesSchema']>) => Promise<[T, z.infer<T['variablesSchema']>]> | [
14
- T,
15
- z.infer<T['variablesSchema']>
16
- ];
17
- export type AfterSerializationMiddleware<TContext> = <T extends Operation>(context: TContext, operation: T, variables: z.infer<T['variablesSchema']>, init: RequestInit) => Promise<RequestInit> | RequestInit;
18
- export type BeforeParsingMiddleware<TContext> = <T extends Operation>(context: TContext, operation: T, variables: z.infer<T['variablesSchema']>, init: RequestInit, response: Response) => Promise<Response> | Response;
19
- export type AfterParsingMiddleware<TContext> = <T extends Operation>(context: TContext, operation: T, variables: z.infer<T['variablesSchema']>, init: RequestInit, response: Response, result: z.infer<T['resultSchema']>) => Promise<z.infer<T['resultSchema']>> | z.infer<T['resultSchema']>;
20
- export interface ClientMiddlewaresConfig<TContext> {
21
- beforeSerialization: BeforeSerializationMiddleware<TContext>[];
22
- afterSerialization: AfterSerializationMiddleware<TContext>[];
23
- beforeParsing: BeforeParsingMiddleware<TContext>[];
24
- afterParsing: AfterParsingMiddleware<TContext>[];
25
- }
26
- export interface ClientConfig<TContext> {
27
- parser: ClientParser<TContext>;
28
- serializer: ClientSerializer<TContext>;
29
- middlewares: ClientMiddlewaresConfig<TContext>;
30
- context: TContext;
31
- fetcher: (init: RequestInit) => Promise<Response>;
32
- }
File without changes