@luvio/graphql-parser 0.126.0 → 0.126.2
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/argument-node.d.ts +4 -0
- package/dist/ast.d.ts +95 -0
- package/dist/constants.d.ts +12 -0
- package/dist/directive-node.d.ts +5 -0
- package/dist/document.d.ts +3 -0
- package/dist/field-node.d.ts +4 -0
- package/dist/fragment-spread-node.d.ts +4 -0
- package/dist/fragment.d.ts +3 -0
- package/dist/gql.d.ts +51 -0
- package/dist/inline-fragment-node.d.ts +4 -0
- package/dist/luvioGraphqlParser.js +12945 -0
- package/dist/luvioGraphqlParser.mjs +12923 -0
- package/dist/main.d.ts +18 -0
- package/dist/metaschema.d.ts +10 -0
- package/dist/operation/index.d.ts +3 -0
- package/dist/operation/query/index.d.ts +6 -0
- package/dist/type-node.d.ts +3 -0
- package/dist/util/language.d.ts +9 -0
- package/dist/value-node.d.ts +4 -0
- package/dist/variable-definition.d.ts +4 -0
- package/dist/visitor.d.ts +4 -0
- package/package.json +4 -1
- package/babel.config.js +0 -1
- package/jest.config.js +0 -8
- package/project.json +0 -7
- package/rollup.config.js +0 -24
- package/scripts/cli.mjs +0 -18
- package/src/__tests__/ast.json +0 -403
- package/src/__tests__/ast.spec.ts +0 -109
- package/src/__tests__/astNoLoc.json +0 -147
- package/src/__tests__/gql.spec.ts +0 -665
- package/src/__tests__/main.spec.ts +0 -651
- package/src/__tests__/metaschema.spec.ts +0 -230
- package/src/__tests__/type-node.spec.ts +0 -82
- package/src/argument-node.ts +0 -18
- package/src/ast.ts +0 -200
- package/src/constants.ts +0 -14
- package/src/directive-node.ts +0 -36
- package/src/document.ts +0 -29
- package/src/field-node.ts +0 -72
- package/src/fragment-spread-node.ts +0 -28
- package/src/fragment.ts +0 -46
- package/src/gql.ts +0 -222
- package/src/inline-fragment-node.ts +0 -31
- package/src/main.ts +0 -134
- package/src/metaschema.ts +0 -162
- package/src/operation/index.ts +0 -12
- package/src/operation/query/index.ts +0 -78
- package/src/type-node.ts +0 -40
- package/src/util/language.ts +0 -10
- package/src/value-node.ts +0 -71
- package/src/variable-definition.ts +0 -37
- package/src/visitor.ts +0 -63
- package/tsconfig.json +0 -9
|
@@ -1,230 +0,0 @@
|
|
|
1
|
-
import { gql, referenceMap } from '../gql';
|
|
2
|
-
import { metaschemaMapper } from '../metaschema';
|
|
3
|
-
|
|
4
|
-
describe('metaschema mapper', () => {
|
|
5
|
-
it('should produce a equivalent metaschema AST when called with the legacy AST', () => {
|
|
6
|
-
const ref1 = gql`
|
|
7
|
-
query {
|
|
8
|
-
uiapi {
|
|
9
|
-
query {
|
|
10
|
-
Account(where: { Name: { like: "Account1" } }) @connection {
|
|
11
|
-
edges {
|
|
12
|
-
node @resource(type: "Record") {
|
|
13
|
-
Name {
|
|
14
|
-
value
|
|
15
|
-
displayValue
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
...conFragment
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
fragment conFragment on AccountConnection {
|
|
26
|
-
edges {
|
|
27
|
-
node @resource(type: "Record") {
|
|
28
|
-
CreatedBy @resource(type: "Record") {
|
|
29
|
-
Id
|
|
30
|
-
Name {
|
|
31
|
-
value
|
|
32
|
-
displayValue
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
`;
|
|
39
|
-
|
|
40
|
-
const doc1 = referenceMap.get(ref1);
|
|
41
|
-
|
|
42
|
-
const ref2 = gql`
|
|
43
|
-
query {
|
|
44
|
-
uiapi {
|
|
45
|
-
query {
|
|
46
|
-
Account(where: { Name: { like: "Account1" } })
|
|
47
|
-
@category(name: "recordQuery") {
|
|
48
|
-
edges {
|
|
49
|
-
node {
|
|
50
|
-
Name {
|
|
51
|
-
value
|
|
52
|
-
displayValue
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
...conFragment
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
fragment conFragment on AccountConnection {
|
|
63
|
-
edges {
|
|
64
|
-
node {
|
|
65
|
-
CreatedBy @category(name: "parentRelationship") {
|
|
66
|
-
Id
|
|
67
|
-
Name {
|
|
68
|
-
value
|
|
69
|
-
displayValue
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
`;
|
|
76
|
-
const doc2 = referenceMap.get(ref2);
|
|
77
|
-
|
|
78
|
-
metaschemaMapper(doc1);
|
|
79
|
-
|
|
80
|
-
expect(doc1).toStrictEqual(doc2);
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
it('should produce a equivalent metaschema AST when query has multiple entities', () => {
|
|
84
|
-
const ref1 = gql`
|
|
85
|
-
query {
|
|
86
|
-
uiapi {
|
|
87
|
-
query {
|
|
88
|
-
TimeSheet @connection {
|
|
89
|
-
edges {
|
|
90
|
-
node @resource(type: "Record") {
|
|
91
|
-
CreatedBy @resource(type: "Record") {
|
|
92
|
-
Email {
|
|
93
|
-
value
|
|
94
|
-
displayValue
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
User @connection {
|
|
101
|
-
edges {
|
|
102
|
-
node @resource(type: "Record") {
|
|
103
|
-
CreatedBy @resource(type: "Record") {
|
|
104
|
-
Email {
|
|
105
|
-
value
|
|
106
|
-
displayValue
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
`;
|
|
116
|
-
const doc1 = referenceMap.get(ref1);
|
|
117
|
-
|
|
118
|
-
const ref2 = gql`
|
|
119
|
-
query {
|
|
120
|
-
uiapi {
|
|
121
|
-
query {
|
|
122
|
-
TimeSheet @category(name: "recordQuery") {
|
|
123
|
-
edges {
|
|
124
|
-
node {
|
|
125
|
-
CreatedBy @category(name: "parentRelationship") {
|
|
126
|
-
Email {
|
|
127
|
-
value
|
|
128
|
-
displayValue
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
User @category(name: "recordQuery") {
|
|
135
|
-
edges {
|
|
136
|
-
node {
|
|
137
|
-
CreatedBy @category(name: "parentRelationship") {
|
|
138
|
-
Email {
|
|
139
|
-
value
|
|
140
|
-
displayValue
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
`;
|
|
150
|
-
const doc2 = referenceMap.get(ref2);
|
|
151
|
-
|
|
152
|
-
metaschemaMapper(doc1);
|
|
153
|
-
|
|
154
|
-
expect(doc1).toStrictEqual(doc2);
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
it('should leave any non - legacy directives intact', () => {
|
|
158
|
-
const ref1 = gql`
|
|
159
|
-
query myQuery($var1: Boolean!, $var2: Boolean!) {
|
|
160
|
-
uiapi {
|
|
161
|
-
query {
|
|
162
|
-
TimeSheet @include(if: $var1) @connection {
|
|
163
|
-
edges {
|
|
164
|
-
node @resource(type: "Record") {
|
|
165
|
-
CreatedBy @resource(type: "Record") {
|
|
166
|
-
Email {
|
|
167
|
-
value
|
|
168
|
-
displayValue
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
User @connection @skip(if: $var2) {
|
|
175
|
-
edges {
|
|
176
|
-
node @resource(type: "Record") {
|
|
177
|
-
CreatedBy @resource(type: "Record") {
|
|
178
|
-
Email {
|
|
179
|
-
value
|
|
180
|
-
displayValue
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
`;
|
|
190
|
-
const doc1 = referenceMap.get(ref1);
|
|
191
|
-
|
|
192
|
-
const ref2 = gql`
|
|
193
|
-
query myQuery($var1: Boolean!, $var2: Boolean!) {
|
|
194
|
-
uiapi {
|
|
195
|
-
query {
|
|
196
|
-
TimeSheet @include(if: $var1) @category(name: "recordQuery") {
|
|
197
|
-
edges {
|
|
198
|
-
node {
|
|
199
|
-
CreatedBy @category(name: "parentRelationship") {
|
|
200
|
-
Email {
|
|
201
|
-
value
|
|
202
|
-
displayValue
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
User @category(name: "recordQuery") @skip(if: $var2) {
|
|
209
|
-
edges {
|
|
210
|
-
node {
|
|
211
|
-
CreatedBy @category(name: "parentRelationship") {
|
|
212
|
-
Email {
|
|
213
|
-
value
|
|
214
|
-
displayValue
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
`;
|
|
224
|
-
const doc2 = referenceMap.get(ref2);
|
|
225
|
-
|
|
226
|
-
metaschemaMapper(doc1);
|
|
227
|
-
|
|
228
|
-
expect(doc1).toStrictEqual(doc2);
|
|
229
|
-
});
|
|
230
|
-
});
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { NamedTypeNode, TypeNode } from 'graphql/language';
|
|
2
|
-
import { transform } from '../type-node';
|
|
3
|
-
|
|
4
|
-
describe('Luvio GraphQL TypeNode transform', () => {
|
|
5
|
-
it('returns LuvioTypeNode when input is GraphQL NamedTypeNode', () => {
|
|
6
|
-
expect(
|
|
7
|
-
transform({
|
|
8
|
-
kind: 'NamedType',
|
|
9
|
-
name: {
|
|
10
|
-
kind: 'Name',
|
|
11
|
-
value: 'test',
|
|
12
|
-
},
|
|
13
|
-
})
|
|
14
|
-
).toStrictEqual({
|
|
15
|
-
kind: 'NamedType',
|
|
16
|
-
name: 'test',
|
|
17
|
-
});
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
it('returns LuvioTypeNode when input is GraphQL ListTypeNode', () => {
|
|
21
|
-
expect(
|
|
22
|
-
transform({
|
|
23
|
-
kind: 'ListType',
|
|
24
|
-
type: {
|
|
25
|
-
kind: 'NamedType',
|
|
26
|
-
name: {
|
|
27
|
-
kind: 'Name',
|
|
28
|
-
value: 'test',
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
})
|
|
32
|
-
).toStrictEqual({
|
|
33
|
-
kind: 'ListType',
|
|
34
|
-
type: {
|
|
35
|
-
kind: 'NamedType',
|
|
36
|
-
name: 'test',
|
|
37
|
-
},
|
|
38
|
-
});
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
it('returns LuvioTypeNode when input is GraphQL NonNullTypeNode', () => {
|
|
42
|
-
expect(
|
|
43
|
-
transform({
|
|
44
|
-
kind: 'NonNullType',
|
|
45
|
-
type: {
|
|
46
|
-
kind: 'NamedType',
|
|
47
|
-
name: {
|
|
48
|
-
kind: 'Name',
|
|
49
|
-
value: 'test',
|
|
50
|
-
},
|
|
51
|
-
},
|
|
52
|
-
})
|
|
53
|
-
).toStrictEqual({
|
|
54
|
-
kind: 'NonNullType',
|
|
55
|
-
type: {
|
|
56
|
-
kind: 'NamedType',
|
|
57
|
-
name: 'test',
|
|
58
|
-
},
|
|
59
|
-
});
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
it('throws when input is unsupported TypeNode', () => {
|
|
63
|
-
expect(() =>
|
|
64
|
-
transform({
|
|
65
|
-
kind: 'Unknown',
|
|
66
|
-
name: 'test',
|
|
67
|
-
} as unknown as TypeNode)
|
|
68
|
-
).toThrowError('Unsupported TypeNode');
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
it('throws when input is unsupported NonNullTypeNode', () => {
|
|
72
|
-
expect(() =>
|
|
73
|
-
transform({
|
|
74
|
-
kind: 'NonNullType',
|
|
75
|
-
type: {
|
|
76
|
-
kind: 'Unknown',
|
|
77
|
-
name: 'test',
|
|
78
|
-
} as unknown as NamedTypeNode,
|
|
79
|
-
})
|
|
80
|
-
).toThrowError('Unsupported NonNullTypeNode');
|
|
81
|
-
});
|
|
82
|
-
});
|
package/src/argument-node.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { ArgumentNode } from 'graphql/language';
|
|
2
|
-
import type { LuvioArgumentNode } from './ast';
|
|
3
|
-
import type { TransformState } from './operation/query';
|
|
4
|
-
import { transform as transformValueNode } from './value-node';
|
|
5
|
-
|
|
6
|
-
export function transform(node: ArgumentNode, transformState: TransformState): LuvioArgumentNode {
|
|
7
|
-
const {
|
|
8
|
-
kind,
|
|
9
|
-
name: { value: nodeName },
|
|
10
|
-
value: nodeValue,
|
|
11
|
-
} = node;
|
|
12
|
-
const valueNode = transformValueNode(nodeValue, transformState);
|
|
13
|
-
return {
|
|
14
|
-
kind,
|
|
15
|
-
name: nodeName,
|
|
16
|
-
value: valueNode,
|
|
17
|
-
};
|
|
18
|
-
}
|
package/src/ast.ts
DELETED
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
DocumentNode,
|
|
3
|
-
OperationDefinitionNode,
|
|
4
|
-
FieldNode,
|
|
5
|
-
ArgumentNode,
|
|
6
|
-
IntValueNode,
|
|
7
|
-
ListValueNode,
|
|
8
|
-
ObjectValueNode,
|
|
9
|
-
FloatValueNode,
|
|
10
|
-
StringValueNode,
|
|
11
|
-
BooleanValueNode,
|
|
12
|
-
NullValueNode,
|
|
13
|
-
EnumValueNode,
|
|
14
|
-
VariableNode,
|
|
15
|
-
DirectiveNode,
|
|
16
|
-
VariableDefinitionNode,
|
|
17
|
-
NonNullTypeNode,
|
|
18
|
-
ListTypeNode,
|
|
19
|
-
NamedTypeNode,
|
|
20
|
-
FragmentSpreadNode,
|
|
21
|
-
InlineFragmentNode,
|
|
22
|
-
FragmentDefinitionNode,
|
|
23
|
-
DefinitionNode,
|
|
24
|
-
TypeNode,
|
|
25
|
-
} from 'graphql/language';
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Luvio specific custom GraphQL AST
|
|
29
|
-
*
|
|
30
|
-
* - Omit Location
|
|
31
|
-
* - flatten NameNode for easier value access
|
|
32
|
-
* - Add luvioSelections for custom selections
|
|
33
|
-
* - LuvioSelectionCustomFieldNode for fields with custom client side directives
|
|
34
|
-
*/
|
|
35
|
-
|
|
36
|
-
/* Document */
|
|
37
|
-
export interface LuvioDocumentNode extends Omit<DocumentNode, 'loc' | 'definitions'> {
|
|
38
|
-
definitions: LuvioDefinitionNode[];
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export type LuvioDefinitionNode = LuvioOperationDefinitionNode | LuvioFragmentDefinitionNode;
|
|
42
|
-
|
|
43
|
-
export interface LuvioOperationDefinitionNode
|
|
44
|
-
extends Omit<
|
|
45
|
-
OperationDefinitionNode,
|
|
46
|
-
'loc' | 'name' | 'variableDefinitions' | 'directives' | 'selectionSet'
|
|
47
|
-
> {
|
|
48
|
-
name?: string;
|
|
49
|
-
variableDefinitions?: LuvioVariableDefinitionNode[];
|
|
50
|
-
directives?: LuvioDirectiveNode[];
|
|
51
|
-
luvioSelections: LuvioSelectionNode[];
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export interface LuvioVariableDefinitionNode
|
|
55
|
-
extends Omit<
|
|
56
|
-
VariableDefinitionNode,
|
|
57
|
-
'loc' | 'variable' | 'type' | 'defaultValue' | 'directives'
|
|
58
|
-
> {
|
|
59
|
-
variable: LuvioVariableNode;
|
|
60
|
-
type: LuvioTypeNode;
|
|
61
|
-
defaultValue?: LuvioValueNode;
|
|
62
|
-
directives?: LuvioDirectiveNode[];
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export interface LuvioVariableNode extends Omit<VariableNode, 'loc' | 'name'> {
|
|
66
|
-
name: string;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
export type LuvioSelectionNode = LuvioFieldNode | LuvioFragmentSpreadNode | LuvioInlineFragmentNode;
|
|
70
|
-
|
|
71
|
-
export type LuvioFieldNode =
|
|
72
|
-
| LuvioSelectionScalarFieldNode
|
|
73
|
-
| LuvioSelectionObjectFieldNode
|
|
74
|
-
| LuvioSelectionCustomFieldNode;
|
|
75
|
-
|
|
76
|
-
export interface LuvioArgumentNode extends Omit<ArgumentNode, 'loc' | 'name' | 'value'> {
|
|
77
|
-
name: string;
|
|
78
|
-
value: LuvioValueNode;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/* Fragments */
|
|
82
|
-
export interface LuvioFragmentSpreadNode
|
|
83
|
-
extends Omit<FragmentSpreadNode, 'loc' | 'name' | 'directives'> {
|
|
84
|
-
name: string;
|
|
85
|
-
directives?: LuvioDirectiveNode[];
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
export interface LuvioInlineFragmentNode
|
|
89
|
-
extends Omit<InlineFragmentNode, 'loc' | 'typeCondition' | 'directives' | 'selectionSet'> {
|
|
90
|
-
typeCondition?: LuvioNamedTypeNode;
|
|
91
|
-
directives?: LuvioDirectiveNode[];
|
|
92
|
-
luvioSelections: LuvioSelectionNode[];
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
export interface LuvioFragmentDefinitionNode
|
|
96
|
-
extends Omit<
|
|
97
|
-
FragmentDefinitionNode,
|
|
98
|
-
'loc' | 'name' | 'variableDefinitions' | 'typeCondition' | 'directives' | 'selectionSet'
|
|
99
|
-
> {
|
|
100
|
-
name: string;
|
|
101
|
-
// Note: fragment variable definitions are experimental and may be changed
|
|
102
|
-
// or removed in the future.
|
|
103
|
-
variableDefinitions?: LuvioVariableDefinitionNode[];
|
|
104
|
-
typeCondition: LuvioNamedTypeNode;
|
|
105
|
-
directives?: LuvioDirectiveNode[];
|
|
106
|
-
luvioSelections: LuvioSelectionNode[];
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/* Values */
|
|
110
|
-
export type LuvioValueNode =
|
|
111
|
-
| LuvioVariableNode
|
|
112
|
-
| IntValueNode
|
|
113
|
-
| FloatValueNode
|
|
114
|
-
| StringValueNode
|
|
115
|
-
| BooleanValueNode
|
|
116
|
-
| NullValueNode
|
|
117
|
-
| EnumValueNode
|
|
118
|
-
| LuvioListValueNode
|
|
119
|
-
| LuvioObjectValueNode;
|
|
120
|
-
|
|
121
|
-
export interface LuvioListValueNode extends Omit<ListValueNode, 'loc' | 'values'> {
|
|
122
|
-
values: LuvioValueNode[];
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
export interface LuvioObjectValueNode extends Omit<ObjectValueNode, 'loc' | 'fields'> {
|
|
126
|
-
fields: {
|
|
127
|
-
[name: string]: LuvioValueNode;
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/* Directives */
|
|
132
|
-
export interface LuvioDirectiveNode extends Omit<DirectiveNode, 'loc' | 'name' | 'arguments'> {
|
|
133
|
-
name: string;
|
|
134
|
-
arguments?: LuvioArgumentNode[];
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/* Type Reference */
|
|
138
|
-
export type LuvioTypeNode = LuvioNamedTypeNode | LuvioListTypeNode | LuvioNonNullTypeNode;
|
|
139
|
-
|
|
140
|
-
export interface LuvioNamedTypeNode extends Omit<NamedTypeNode, 'loc' | 'name'> {
|
|
141
|
-
name: string;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
export interface LuvioListTypeNode extends Omit<ListTypeNode, 'loc' | 'type'> {
|
|
145
|
-
type: LuvioTypeNode;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
export interface LuvioNonNullTypeNode extends Omit<NonNullTypeNode, 'loc' | 'type'> {
|
|
149
|
-
type: LuvioNamedTypeNode | LuvioListTypeNode;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/* Custom Selection Fields */
|
|
153
|
-
export interface LuvioSelectionScalarFieldNode
|
|
154
|
-
extends Omit<
|
|
155
|
-
FieldNode,
|
|
156
|
-
'kind' | 'loc' | 'alias' | 'name' | 'arguments' | 'directives' | 'selectionSet'
|
|
157
|
-
> {
|
|
158
|
-
kind: 'ScalarFieldSelection';
|
|
159
|
-
alias?: string;
|
|
160
|
-
name: string;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
export interface LuvioSelectionObjectFieldNode
|
|
164
|
-
extends Omit<
|
|
165
|
-
FieldNode,
|
|
166
|
-
'kind' | 'loc' | 'alias' | 'name' | 'arguments' | 'directives' | 'selectionSet'
|
|
167
|
-
> {
|
|
168
|
-
kind: 'ObjectFieldSelection';
|
|
169
|
-
alias?: string;
|
|
170
|
-
name: string;
|
|
171
|
-
arguments?: LuvioArgumentNode[];
|
|
172
|
-
directives?: LuvioDirectiveNode[];
|
|
173
|
-
luvioSelections?: LuvioSelectionNode[];
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
export interface LuvioSelectionCustomFieldNode extends Omit<LuvioSelectionObjectFieldNode, 'kind'> {
|
|
177
|
-
kind: 'CustomFieldSelection';
|
|
178
|
-
type: string;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
/* Util Functions */
|
|
182
|
-
export function isOperationDefinitionNode(input: DefinitionNode): input is OperationDefinitionNode {
|
|
183
|
-
return input.kind === 'OperationDefinition';
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
export function isFragmentDefinitionNode(input: DefinitionNode): input is FragmentDefinitionNode {
|
|
187
|
-
return input.kind === 'FragmentDefinition';
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
export function isNamedTypeNode(input: TypeNode): input is NamedTypeNode {
|
|
191
|
-
return input.kind === 'NamedType';
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
export function isListTypeNode(input: TypeNode): input is ListTypeNode {
|
|
195
|
-
return input.kind === 'ListType';
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
export function isNonNullTypeNode(input: TypeNode): input is NonNullTypeNode {
|
|
199
|
-
return input.kind === 'NonNullType';
|
|
200
|
-
}
|
package/src/constants.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export const CUSTOM_DIRECTIVE_CONNECTION = 'connection';
|
|
2
|
-
export const CUSTOM_DIRECTIVE_RESOURCE = 'resource';
|
|
3
|
-
|
|
4
|
-
export const NODE_KIND_CUSTOM_FIELD_SELECTION = 'CustomFieldSelection';
|
|
5
|
-
export const NODE_KIND_FIELD = 'Field';
|
|
6
|
-
export const NODE_KIND_FRAGMENT_SPREAD = 'FragmentSpread';
|
|
7
|
-
export const NODE_KIND_INLINE_FRAGMENT = 'InlineFragment';
|
|
8
|
-
export const NODE_KIND_LIST_TYPE = 'ListType';
|
|
9
|
-
export const NODE_KIND_NAMED_TYPE = 'NamedType';
|
|
10
|
-
export const NODE_KIND_NON_NULL_TYPE = 'NonNullType';
|
|
11
|
-
export const NODE_KIND_OBJECT_FIELD_SELECTION = 'ObjectFieldSelection';
|
|
12
|
-
export const NODE_KIND_SCALAR_FIELD_SELECTION = 'ScalarFieldSelection';
|
|
13
|
-
|
|
14
|
-
export const NODE_TYPE_CONNECTION = 'Connection';
|
package/src/directive-node.ts
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import type { DirectiveNode } from 'graphql/language';
|
|
2
|
-
import type { LuvioArgumentNode, LuvioDirectiveNode } from './ast';
|
|
3
|
-
import { transform as transformArgumentNode } from './argument-node';
|
|
4
|
-
import { CUSTOM_DIRECTIVE_CONNECTION, CUSTOM_DIRECTIVE_RESOURCE } from './constants';
|
|
5
|
-
import type { TransformState } from './operation/query';
|
|
6
|
-
|
|
7
|
-
export function transform(node: DirectiveNode, transformState: TransformState): LuvioDirectiveNode {
|
|
8
|
-
const {
|
|
9
|
-
kind,
|
|
10
|
-
name: { value: nodeName },
|
|
11
|
-
arguments: nodeArguments,
|
|
12
|
-
} = node;
|
|
13
|
-
const ret: LuvioDirectiveNode = {
|
|
14
|
-
kind,
|
|
15
|
-
name: nodeName,
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
if (nodeArguments !== undefined && nodeArguments.length > 0) {
|
|
19
|
-
let returnArguments: LuvioArgumentNode[] = [];
|
|
20
|
-
for (var index = 0; index < nodeArguments.length; index++) {
|
|
21
|
-
const argumentNode = nodeArguments[index];
|
|
22
|
-
const value = transformArgumentNode(argumentNode, transformState);
|
|
23
|
-
returnArguments.push(value);
|
|
24
|
-
}
|
|
25
|
-
ret.arguments = returnArguments;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
return ret;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export function isCustomDirective(node: DirectiveNode): boolean {
|
|
32
|
-
return (
|
|
33
|
-
node.name.value === CUSTOM_DIRECTIVE_CONNECTION ||
|
|
34
|
-
node.name.value === CUSTOM_DIRECTIVE_RESOURCE
|
|
35
|
-
);
|
|
36
|
-
}
|
package/src/document.ts
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import type { DocumentNode } from 'graphql/language';
|
|
2
|
-
import type { LuvioDocumentNode, LuvioDefinitionNode } from './ast';
|
|
3
|
-
import { isOperationDefinitionNode, isFragmentDefinitionNode } from './ast';
|
|
4
|
-
import { transform as operationDefinitionTransform } from './operation';
|
|
5
|
-
import { transform as fragmentDefinitionTransform } from './fragment';
|
|
6
|
-
|
|
7
|
-
export function transform(root: DocumentNode): LuvioDocumentNode {
|
|
8
|
-
const { kind, definitions } = root;
|
|
9
|
-
const luvioDefinitions: LuvioDefinitionNode[] = [];
|
|
10
|
-
for (let i = 0; i < definitions.length; i++) {
|
|
11
|
-
const definition = definitions[i];
|
|
12
|
-
if (isOperationDefinitionNode(definition)) {
|
|
13
|
-
luvioDefinitions.push(operationDefinitionTransform(definition));
|
|
14
|
-
} else if (isFragmentDefinitionNode(definition)) {
|
|
15
|
-
luvioDefinitions.push(fragmentDefinitionTransform(definition));
|
|
16
|
-
} else {
|
|
17
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
18
|
-
throw new Error(
|
|
19
|
-
`Unsupported ${definition.kind} definition. Only OperationDefinition and FragmentDefinition are supported in a GraphQL Document`
|
|
20
|
-
);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
return {
|
|
26
|
-
kind,
|
|
27
|
-
definitions: luvioDefinitions,
|
|
28
|
-
};
|
|
29
|
-
}
|
package/src/field-node.ts
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import type { FieldNode, StringValueNode } from 'graphql/language';
|
|
2
|
-
import { transform as transformArgumentNode } from './argument-node';
|
|
3
|
-
import type { LuvioArgumentNode, LuvioFieldNode } from './ast';
|
|
4
|
-
import {
|
|
5
|
-
CUSTOM_DIRECTIVE_CONNECTION,
|
|
6
|
-
CUSTOM_DIRECTIVE_RESOURCE,
|
|
7
|
-
NODE_KIND_CUSTOM_FIELD_SELECTION,
|
|
8
|
-
NODE_KIND_OBJECT_FIELD_SELECTION,
|
|
9
|
-
NODE_KIND_SCALAR_FIELD_SELECTION,
|
|
10
|
-
NODE_TYPE_CONNECTION,
|
|
11
|
-
} from './constants';
|
|
12
|
-
import { isCustomDirective, transform as transformDirectiveNode } from './directive-node';
|
|
13
|
-
import type { TransformState } from './operation/query';
|
|
14
|
-
|
|
15
|
-
export function transform(node: FieldNode, transformState: TransformState): LuvioFieldNode {
|
|
16
|
-
const { name, alias, arguments: fieldArgs, selectionSet, directives } = node;
|
|
17
|
-
|
|
18
|
-
let luvioNode: LuvioFieldNode = {
|
|
19
|
-
kind: NODE_KIND_OBJECT_FIELD_SELECTION,
|
|
20
|
-
name: name.value,
|
|
21
|
-
luvioSelections: [],
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
if (selectionSet === undefined || selectionSet.selections.length === 0) {
|
|
25
|
-
luvioNode = {
|
|
26
|
-
kind: NODE_KIND_SCALAR_FIELD_SELECTION,
|
|
27
|
-
name: name.value,
|
|
28
|
-
};
|
|
29
|
-
} else {
|
|
30
|
-
// object or custom field node
|
|
31
|
-
if (directives !== undefined && directives.length > 0) {
|
|
32
|
-
const customDirectiveNode = directives.find(isCustomDirective);
|
|
33
|
-
if (customDirectiveNode === undefined) {
|
|
34
|
-
// transform non client-side directives
|
|
35
|
-
luvioNode.directives = directives.map((directive) =>
|
|
36
|
-
transformDirectiveNode(directive, transformState)
|
|
37
|
-
);
|
|
38
|
-
} else {
|
|
39
|
-
if (customDirectiveNode.name.value === CUSTOM_DIRECTIVE_CONNECTION) {
|
|
40
|
-
luvioNode = {
|
|
41
|
-
kind: NODE_KIND_CUSTOM_FIELD_SELECTION,
|
|
42
|
-
name: name.value,
|
|
43
|
-
type: NODE_TYPE_CONNECTION,
|
|
44
|
-
luvioSelections: [],
|
|
45
|
-
};
|
|
46
|
-
} else if (customDirectiveNode.name.value === CUSTOM_DIRECTIVE_RESOURCE) {
|
|
47
|
-
luvioNode = {
|
|
48
|
-
kind: NODE_KIND_CUSTOM_FIELD_SELECTION,
|
|
49
|
-
name: name.value,
|
|
50
|
-
type: (customDirectiveNode!.arguments![0].value as StringValueNode).value,
|
|
51
|
-
luvioSelections: [],
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
if (fieldArgs !== undefined && fieldArgs.length > 0) {
|
|
58
|
-
const returnArguments: LuvioArgumentNode[] = [];
|
|
59
|
-
for (var index = 0; index < fieldArgs.length; index++) {
|
|
60
|
-
const value = transformArgumentNode(fieldArgs[index], transformState);
|
|
61
|
-
returnArguments.push(value);
|
|
62
|
-
}
|
|
63
|
-
luvioNode.arguments = returnArguments;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
if (alias !== undefined) {
|
|
68
|
-
luvioNode.alias = alias.value;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
return luvioNode;
|
|
72
|
-
}
|