@vertikalx/vtx-backend-client 1.0.0-dev.0
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/LICENSE.md +12 -0
- package/index.d.ts +25 -0
- package/index.js +44 -0
- package/index.js.map +1 -0
- package/index.ts +65 -0
- package/package.json +15 -0
- package/runtime/batcher.d.ts +36 -0
- package/runtime/batcher.js +123 -0
- package/runtime/batcher.js.map +1 -0
- package/runtime/batcher.ts +275 -0
- package/runtime/createClient.d.ts +23 -0
- package/runtime/createClient.js +28 -0
- package/runtime/createClient.js.map +1 -0
- package/runtime/createClient.ts +68 -0
- package/runtime/error.d.ts +15 -0
- package/runtime/error.js +19 -0
- package/runtime/error.js.map +1 -0
- package/runtime/error.ts +29 -0
- package/runtime/fetcher.d.ts +10 -0
- package/runtime/fetcher.js +68 -0
- package/runtime/fetcher.js.map +1 -0
- package/runtime/fetcher.ts +97 -0
- package/runtime/generateGraphqlOperation.d.ts +30 -0
- package/runtime/generateGraphqlOperation.js +134 -0
- package/runtime/generateGraphqlOperation.js.map +1 -0
- package/runtime/generateGraphqlOperation.ts +225 -0
- package/runtime/index.d.ts +11 -0
- package/runtime/index.js +17 -0
- package/runtime/index.js.map +1 -0
- package/runtime/index.ts +13 -0
- package/runtime/linkTypeMap.d.ts +9 -0
- package/runtime/linkTypeMap.js +95 -0
- package/runtime/linkTypeMap.js.map +1 -0
- package/runtime/linkTypeMap.ts +156 -0
- package/runtime/typeSelection.d.ts +28 -0
- package/runtime/typeSelection.js +3 -0
- package/runtime/typeSelection.js.map +1 -0
- package/runtime/typeSelection.ts +95 -0
- package/runtime/types.d.ts +55 -0
- package/runtime/types.js +3 -0
- package/runtime/types.js.map +1 -0
- package/runtime/types.ts +69 -0
- package/schema.d.ts +406 -0
- package/schema.graphql +162 -0
- package/schema.js +109 -0
- package/schema.js.map +1 -0
- package/schema.ts +420 -0
- package/tsconfig.lib.tsbuildinfo +1 -0
- package/types.d.ts +207 -0
- package/types.js +518 -0
- package/types.js.map +1 -0
- package/types.ts +515 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
|
|
3
|
+
import { type BatchOptions, createFetcher } from './fetcher'
|
|
4
|
+
import type { ExecutionResult, LinkedType } from './types'
|
|
5
|
+
import {
|
|
6
|
+
generateGraphqlOperation,
|
|
7
|
+
type GraphqlOperation,
|
|
8
|
+
} from './generateGraphqlOperation'
|
|
9
|
+
|
|
10
|
+
export type Headers =
|
|
11
|
+
| HeadersInit
|
|
12
|
+
| (() => HeadersInit)
|
|
13
|
+
| (() => Promise<HeadersInit>)
|
|
14
|
+
|
|
15
|
+
export type BaseFetcher = (
|
|
16
|
+
operation: GraphqlOperation | GraphqlOperation[],
|
|
17
|
+
) => Promise<ExecutionResult | ExecutionResult[]>
|
|
18
|
+
|
|
19
|
+
export type ClientOptions = Omit<RequestInit, 'body' | 'headers'> & {
|
|
20
|
+
url?: string
|
|
21
|
+
batch?: BatchOptions | boolean
|
|
22
|
+
fetcher?: BaseFetcher
|
|
23
|
+
fetch?: Function
|
|
24
|
+
headers?: Headers
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const createClient = ({
|
|
28
|
+
queryRoot,
|
|
29
|
+
mutationRoot,
|
|
30
|
+
subscriptionRoot,
|
|
31
|
+
...options
|
|
32
|
+
}: ClientOptions & {
|
|
33
|
+
queryRoot?: LinkedType
|
|
34
|
+
mutationRoot?: LinkedType
|
|
35
|
+
subscriptionRoot?: LinkedType
|
|
36
|
+
}) => {
|
|
37
|
+
const fetcher = createFetcher(options)
|
|
38
|
+
const client: {
|
|
39
|
+
query?: Function
|
|
40
|
+
mutation?: Function
|
|
41
|
+
} = {}
|
|
42
|
+
|
|
43
|
+
if (queryRoot) {
|
|
44
|
+
client.query = (request: any) => {
|
|
45
|
+
if (!queryRoot) throw new Error('queryRoot argument is missing')
|
|
46
|
+
|
|
47
|
+
const resultPromise = fetcher(
|
|
48
|
+
generateGraphqlOperation('query', queryRoot, request),
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
return resultPromise
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (mutationRoot) {
|
|
55
|
+
client.mutation = (request: any) => {
|
|
56
|
+
if (!mutationRoot)
|
|
57
|
+
throw new Error('mutationRoot argument is missing')
|
|
58
|
+
|
|
59
|
+
const resultPromise = fetcher(
|
|
60
|
+
generateGraphqlOperation('mutation', mutationRoot, request),
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
return resultPromise
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return client as any
|
|
68
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare class GenqlError extends Error {
|
|
2
|
+
errors: Array<GraphqlError>;
|
|
3
|
+
data?: any;
|
|
4
|
+
constructor(errors: any[], data: any);
|
|
5
|
+
}
|
|
6
|
+
interface GraphqlError {
|
|
7
|
+
message: string;
|
|
8
|
+
locations?: Array<{
|
|
9
|
+
line: number;
|
|
10
|
+
column: number;
|
|
11
|
+
}>;
|
|
12
|
+
path?: string[];
|
|
13
|
+
extensions?: Record<string, any>;
|
|
14
|
+
}
|
|
15
|
+
export {};
|
package/runtime/error.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GenqlError = void 0;
|
|
4
|
+
class GenqlError extends Error {
|
|
5
|
+
constructor(errors, data) {
|
|
6
|
+
let message = Array.isArray(errors)
|
|
7
|
+
? errors.map((x) => x?.message || '').join('\n')
|
|
8
|
+
: '';
|
|
9
|
+
if (!message) {
|
|
10
|
+
message = 'GraphQL error';
|
|
11
|
+
}
|
|
12
|
+
super(message);
|
|
13
|
+
this.errors = [];
|
|
14
|
+
this.errors = errors;
|
|
15
|
+
this.data = data;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.GenqlError = GenqlError;
|
|
19
|
+
//# sourceMappingURL=error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../../../libs/vtx-backend-client/runtime/error.ts"],"names":[],"mappings":";;;AACA,MAAa,UAAW,SAAQ,KAAK;IAMjC,YAAY,MAAa,EAAE,IAAS;QAChC,IAAI,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAC/B,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAChD,CAAC,CAAC,EAAE,CAAA;QACR,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,GAAG,eAAe,CAAA;QAC7B,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,CAAA;QAZlB,WAAM,GAAwB,EAAE,CAAA;QAa5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IACpB,CAAC;CACJ;AAjBD,gCAiBC"}
|
package/runtime/error.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
export class GenqlError extends Error {
|
|
3
|
+
errors: Array<GraphqlError> = []
|
|
4
|
+
/**
|
|
5
|
+
* Partial data returned by the server
|
|
6
|
+
*/
|
|
7
|
+
data?: any
|
|
8
|
+
constructor(errors: any[], data: any) {
|
|
9
|
+
let message = Array.isArray(errors)
|
|
10
|
+
? errors.map((x) => x?.message || '').join('\n')
|
|
11
|
+
: ''
|
|
12
|
+
if (!message) {
|
|
13
|
+
message = 'GraphQL error'
|
|
14
|
+
}
|
|
15
|
+
super(message)
|
|
16
|
+
this.errors = errors
|
|
17
|
+
this.data = data
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
interface GraphqlError {
|
|
22
|
+
message: string
|
|
23
|
+
locations?: Array<{
|
|
24
|
+
line: number
|
|
25
|
+
column: number
|
|
26
|
+
}>
|
|
27
|
+
path?: string[]
|
|
28
|
+
extensions?: Record<string, any>
|
|
29
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ClientOptions } from './createClient';
|
|
2
|
+
import type { GraphqlOperation } from './generateGraphqlOperation';
|
|
3
|
+
export interface Fetcher {
|
|
4
|
+
(gql: GraphqlOperation): Promise<any>;
|
|
5
|
+
}
|
|
6
|
+
export type BatchOptions = {
|
|
7
|
+
batchInterval?: number;
|
|
8
|
+
maxBatchSize?: number;
|
|
9
|
+
};
|
|
10
|
+
export declare const createFetcher: ({ url, headers, fetcher, fetch: _fetch, batch, ...rest }: ClientOptions) => Fetcher;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createFetcher = void 0;
|
|
4
|
+
const batcher_1 = require("./batcher");
|
|
5
|
+
const error_1 = require("./error");
|
|
6
|
+
const DEFAULT_BATCH_OPTIONS = {
|
|
7
|
+
maxBatchSize: 10,
|
|
8
|
+
batchInterval: 40,
|
|
9
|
+
};
|
|
10
|
+
const createFetcher = ({ url, headers = {}, fetcher, fetch: _fetch, batch = false, ...rest }) => {
|
|
11
|
+
if (!url && !fetcher) {
|
|
12
|
+
throw new Error('url or fetcher is required');
|
|
13
|
+
}
|
|
14
|
+
fetcher = fetcher || (async (body) => {
|
|
15
|
+
let headersObject = typeof headers == 'function' ? await headers() : headers;
|
|
16
|
+
headersObject = headersObject || {};
|
|
17
|
+
if (typeof fetch === 'undefined' && !_fetch) {
|
|
18
|
+
throw new Error('Global `fetch` function is not available, pass a fetch polyfill to Genql `createClient`');
|
|
19
|
+
}
|
|
20
|
+
let fetchImpl = _fetch || fetch;
|
|
21
|
+
const res = await fetchImpl(url, {
|
|
22
|
+
headers: {
|
|
23
|
+
'Content-Type': 'application/json',
|
|
24
|
+
...headersObject,
|
|
25
|
+
},
|
|
26
|
+
method: 'POST',
|
|
27
|
+
body: JSON.stringify(body),
|
|
28
|
+
...rest,
|
|
29
|
+
});
|
|
30
|
+
if (!res.ok) {
|
|
31
|
+
throw new Error(`${res.statusText}: ${await res.text()}`);
|
|
32
|
+
}
|
|
33
|
+
const json = await res.json();
|
|
34
|
+
return json;
|
|
35
|
+
});
|
|
36
|
+
if (!batch) {
|
|
37
|
+
return async (body) => {
|
|
38
|
+
const json = await fetcher(body);
|
|
39
|
+
if (Array.isArray(json)) {
|
|
40
|
+
return json.map((json) => {
|
|
41
|
+
if (json?.errors?.length) {
|
|
42
|
+
throw new error_1.GenqlError(json.errors || [], json.data);
|
|
43
|
+
}
|
|
44
|
+
return json.data;
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
if (json?.errors?.length) {
|
|
49
|
+
throw new error_1.GenqlError(json.errors || [], json.data);
|
|
50
|
+
}
|
|
51
|
+
return json.data;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
const batcher = new batcher_1.QueryBatcher(async (batchedQuery) => {
|
|
56
|
+
const json = await fetcher(batchedQuery);
|
|
57
|
+
return json;
|
|
58
|
+
}, batch === true ? DEFAULT_BATCH_OPTIONS : batch);
|
|
59
|
+
return async ({ query, variables }) => {
|
|
60
|
+
const json = await batcher.fetch(query, variables);
|
|
61
|
+
if (json?.data) {
|
|
62
|
+
return json.data;
|
|
63
|
+
}
|
|
64
|
+
throw new Error('Genql batch fetcher returned unexpected result ' + JSON.stringify(json));
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
exports.createFetcher = createFetcher;
|
|
68
|
+
//# sourceMappingURL=fetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetcher.js","sourceRoot":"","sources":["../../../../libs/vtx-backend-client/runtime/fetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
import { QueryBatcher } from './batcher'
|
|
3
|
+
|
|
4
|
+
import type { ClientOptions } from './createClient'
|
|
5
|
+
import type { GraphqlOperation } from './generateGraphqlOperation'
|
|
6
|
+
import { GenqlError } from './error'
|
|
7
|
+
|
|
8
|
+
export interface Fetcher {
|
|
9
|
+
(gql: GraphqlOperation): Promise<any>
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export type BatchOptions = {
|
|
13
|
+
batchInterval?: number // ms
|
|
14
|
+
maxBatchSize?: number
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const DEFAULT_BATCH_OPTIONS = {
|
|
18
|
+
maxBatchSize: 10,
|
|
19
|
+
batchInterval: 40,
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export const createFetcher = ({
|
|
23
|
+
url,
|
|
24
|
+
headers = {},
|
|
25
|
+
fetcher,
|
|
26
|
+
fetch: _fetch,
|
|
27
|
+
batch = false,
|
|
28
|
+
...rest
|
|
29
|
+
}: ClientOptions): Fetcher => {
|
|
30
|
+
if (!url && !fetcher) {
|
|
31
|
+
throw new Error('url or fetcher is required')
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
fetcher = fetcher || (async (body) => {
|
|
35
|
+
let headersObject =
|
|
36
|
+
typeof headers == 'function' ? await headers() : headers
|
|
37
|
+
headersObject = headersObject || {}
|
|
38
|
+
if (typeof fetch === 'undefined' && !_fetch) {
|
|
39
|
+
throw new Error(
|
|
40
|
+
'Global `fetch` function is not available, pass a fetch polyfill to Genql `createClient`',
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
let fetchImpl = _fetch || fetch
|
|
44
|
+
const res = await fetchImpl(url!, {
|
|
45
|
+
headers: {
|
|
46
|
+
'Content-Type': 'application/json',
|
|
47
|
+
...headersObject,
|
|
48
|
+
},
|
|
49
|
+
method: 'POST',
|
|
50
|
+
body: JSON.stringify(body),
|
|
51
|
+
...rest,
|
|
52
|
+
})
|
|
53
|
+
if (!res.ok) {
|
|
54
|
+
throw new Error(`${res.statusText}: ${await res.text()}`)
|
|
55
|
+
}
|
|
56
|
+
const json = await res.json()
|
|
57
|
+
return json
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
if (!batch) {
|
|
61
|
+
return async (body) => {
|
|
62
|
+
const json = await fetcher!(body)
|
|
63
|
+
if (Array.isArray(json)) {
|
|
64
|
+
return json.map((json) => {
|
|
65
|
+
if (json?.errors?.length) {
|
|
66
|
+
throw new GenqlError(json.errors || [], json.data)
|
|
67
|
+
}
|
|
68
|
+
return json.data
|
|
69
|
+
})
|
|
70
|
+
} else {
|
|
71
|
+
if (json?.errors?.length) {
|
|
72
|
+
throw new GenqlError(json.errors || [], json.data)
|
|
73
|
+
}
|
|
74
|
+
return json.data
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const batcher = new QueryBatcher(
|
|
80
|
+
async (batchedQuery) => {
|
|
81
|
+
// console.log(batchedQuery) // [{ query: 'query{user{age}}', variables: {} }, ...]
|
|
82
|
+
const json = await fetcher!(batchedQuery)
|
|
83
|
+
return json as any
|
|
84
|
+
},
|
|
85
|
+
batch === true ? DEFAULT_BATCH_OPTIONS : batch,
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
return async ({ query, variables }) => {
|
|
89
|
+
const json = await batcher.fetch(query, variables)
|
|
90
|
+
if (json?.data) {
|
|
91
|
+
return json.data
|
|
92
|
+
}
|
|
93
|
+
throw new Error(
|
|
94
|
+
'Genql batch fetcher returned unexpected result ' + JSON.stringify(json),
|
|
95
|
+
)
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { LinkedField, LinkedType } from './types';
|
|
2
|
+
export interface Args {
|
|
3
|
+
[arg: string]: any | undefined;
|
|
4
|
+
}
|
|
5
|
+
export interface Fields {
|
|
6
|
+
[field: string]: Request;
|
|
7
|
+
}
|
|
8
|
+
export type Request = boolean | number | Fields;
|
|
9
|
+
export interface Variables {
|
|
10
|
+
[name: string]: {
|
|
11
|
+
value: any;
|
|
12
|
+
typing: [LinkedType, string];
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export interface Context {
|
|
16
|
+
root: LinkedType;
|
|
17
|
+
varCounter: number;
|
|
18
|
+
variables: Variables;
|
|
19
|
+
fragmentCounter: number;
|
|
20
|
+
fragments: string[];
|
|
21
|
+
}
|
|
22
|
+
export interface GraphqlOperation {
|
|
23
|
+
query: string;
|
|
24
|
+
variables?: {
|
|
25
|
+
[name: string]: any;
|
|
26
|
+
};
|
|
27
|
+
operationName?: string;
|
|
28
|
+
}
|
|
29
|
+
export declare const generateGraphqlOperation: (operation: 'query' | 'mutation' | 'subscription', root: LinkedType, fields?: Fields) => GraphqlOperation;
|
|
30
|
+
export declare const getFieldFromPath: (root: LinkedType | undefined, path: string[]) => LinkedField;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getFieldFromPath = exports.generateGraphqlOperation = void 0;
|
|
4
|
+
const parseRequest = (request, ctx, path) => {
|
|
5
|
+
if (typeof request === 'object' && '__args' in request) {
|
|
6
|
+
const args = request.__args;
|
|
7
|
+
let fields = { ...request };
|
|
8
|
+
delete fields.__args;
|
|
9
|
+
const argNames = Object.keys(args);
|
|
10
|
+
if (argNames.length === 0) {
|
|
11
|
+
return parseRequest(fields, ctx, path);
|
|
12
|
+
}
|
|
13
|
+
const field = (0, exports.getFieldFromPath)(ctx.root, path);
|
|
14
|
+
const argStrings = argNames.map((argName) => {
|
|
15
|
+
ctx.varCounter++;
|
|
16
|
+
const varName = `v${ctx.varCounter}`;
|
|
17
|
+
const typing = field.args && field.args[argName];
|
|
18
|
+
if (!typing) {
|
|
19
|
+
throw new Error(`no typing defined for argument \`${argName}\` in path \`${path.join('.')}\``);
|
|
20
|
+
}
|
|
21
|
+
ctx.variables[varName] = {
|
|
22
|
+
value: args[argName],
|
|
23
|
+
typing,
|
|
24
|
+
};
|
|
25
|
+
return `${argName}:$${varName}`;
|
|
26
|
+
});
|
|
27
|
+
return `(${argStrings})${parseRequest(fields, ctx, path)}`;
|
|
28
|
+
}
|
|
29
|
+
else if (typeof request === 'object' && Object.keys(request).length > 0) {
|
|
30
|
+
const fields = request;
|
|
31
|
+
const fieldNames = Object.keys(fields).filter((k) => Boolean(fields[k]));
|
|
32
|
+
if (fieldNames.length === 0) {
|
|
33
|
+
throw new Error(`field selection should not be empty: ${path.join('.')}`);
|
|
34
|
+
}
|
|
35
|
+
const type = path.length > 0 ? (0, exports.getFieldFromPath)(ctx.root, path).type : ctx.root;
|
|
36
|
+
const scalarFields = type.scalar;
|
|
37
|
+
let scalarFieldsFragment;
|
|
38
|
+
if (fieldNames.includes('__scalar')) {
|
|
39
|
+
const falsyFieldNames = new Set(Object.keys(fields).filter((k) => !Boolean(fields[k])));
|
|
40
|
+
if (scalarFields?.length) {
|
|
41
|
+
ctx.fragmentCounter++;
|
|
42
|
+
scalarFieldsFragment = `f${ctx.fragmentCounter}`;
|
|
43
|
+
ctx.fragments.push(`fragment ${scalarFieldsFragment} on ${type.name}{${scalarFields
|
|
44
|
+
.filter((f) => !falsyFieldNames.has(f))
|
|
45
|
+
.join(',')}}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const fieldsSelection = fieldNames
|
|
49
|
+
.filter((f) => !['__scalar', '__name'].includes(f))
|
|
50
|
+
.map((f) => {
|
|
51
|
+
const parsed = parseRequest(fields[f], ctx, [...path, f]);
|
|
52
|
+
if (f.startsWith('on_')) {
|
|
53
|
+
ctx.fragmentCounter++;
|
|
54
|
+
const implementationFragment = `f${ctx.fragmentCounter}`;
|
|
55
|
+
const typeMatch = f.match(/^on_(.+)/);
|
|
56
|
+
if (!typeMatch || !typeMatch[1])
|
|
57
|
+
throw new Error('match failed');
|
|
58
|
+
ctx.fragments.push(`fragment ${implementationFragment} on ${typeMatch[1]}${parsed}`);
|
|
59
|
+
return `...${implementationFragment}`;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
return `${f}${parsed}`;
|
|
63
|
+
}
|
|
64
|
+
})
|
|
65
|
+
.concat(scalarFieldsFragment ? [`...${scalarFieldsFragment}`] : [])
|
|
66
|
+
.join(',');
|
|
67
|
+
return `{${fieldsSelection}}`;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
return '';
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
const generateGraphqlOperation = (operation, root, fields) => {
|
|
74
|
+
const ctx = {
|
|
75
|
+
root: root,
|
|
76
|
+
varCounter: 0,
|
|
77
|
+
variables: {},
|
|
78
|
+
fragmentCounter: 0,
|
|
79
|
+
fragments: [],
|
|
80
|
+
};
|
|
81
|
+
const result = parseRequest(fields, ctx, []);
|
|
82
|
+
const varNames = Object.keys(ctx.variables);
|
|
83
|
+
const varsString = varNames.length > 0
|
|
84
|
+
? `(${varNames.map((v) => {
|
|
85
|
+
const variableType = ctx.variables[v].typing[1];
|
|
86
|
+
return `$${v}:${variableType}`;
|
|
87
|
+
})})`
|
|
88
|
+
: '';
|
|
89
|
+
const operationName = fields?.__name || '';
|
|
90
|
+
return {
|
|
91
|
+
query: [
|
|
92
|
+
`${operation} ${operationName}${varsString}${result}`,
|
|
93
|
+
...ctx.fragments,
|
|
94
|
+
].join(','),
|
|
95
|
+
variables: Object.keys(ctx.variables).reduce((r, v) => {
|
|
96
|
+
r[v] = ctx.variables[v].value;
|
|
97
|
+
return r;
|
|
98
|
+
}, {}),
|
|
99
|
+
...(operationName ? { operationName: operationName.toString() } : {}),
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
exports.generateGraphqlOperation = generateGraphqlOperation;
|
|
103
|
+
const getFieldFromPath = (root, path) => {
|
|
104
|
+
let current;
|
|
105
|
+
if (!root)
|
|
106
|
+
throw new Error('root type is not provided');
|
|
107
|
+
if (path.length === 0)
|
|
108
|
+
throw new Error(`path is empty`);
|
|
109
|
+
path.forEach((f) => {
|
|
110
|
+
const type = current ? current.type : root;
|
|
111
|
+
if (!type.fields)
|
|
112
|
+
throw new Error(`type \`${type.name}\` does not have fields`);
|
|
113
|
+
const possibleTypes = Object.keys(type.fields)
|
|
114
|
+
.filter((i) => i.startsWith('on_'))
|
|
115
|
+
.reduce((types, fieldName) => {
|
|
116
|
+
const field = type.fields && type.fields[fieldName];
|
|
117
|
+
if (field)
|
|
118
|
+
types.push(field.type);
|
|
119
|
+
return types;
|
|
120
|
+
}, [type]);
|
|
121
|
+
let field = null;
|
|
122
|
+
possibleTypes.forEach((type) => {
|
|
123
|
+
const found = type.fields && type.fields[f];
|
|
124
|
+
if (found)
|
|
125
|
+
field = found;
|
|
126
|
+
});
|
|
127
|
+
if (!field)
|
|
128
|
+
throw new Error(`type \`${type.name}\` does not have a field \`${f}\``);
|
|
129
|
+
current = field;
|
|
130
|
+
});
|
|
131
|
+
return current;
|
|
132
|
+
};
|
|
133
|
+
exports.getFieldFromPath = getFieldFromPath;
|
|
134
|
+
//# sourceMappingURL=generateGraphqlOperation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateGraphqlOperation.js","sourceRoot":"","sources":["../../../../libs/vtx-backend-client/runtime/generateGraphqlOperation.ts"],"names":[],"mappings":"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"}
|