| 144 | } |
| 145 | |
| 146 | class GQLQuery { |
| 147 | private readonly _schema: GQLSchema; |
| 148 | private readonly _fragments: { [name: string]: FragmentDefinitionNode }; |
| 149 | |
| 150 | readonly queries: List<OperationDefinitionNode>; |
| 151 | |
| 152 | constructor(schema: GQLSchema, queryString: string) { |
| 153 | this._schema = schema; |
| 154 | this._fragments = {}; |
| 155 | |
| 156 | const queryDocument = graphql.parse(queryString) as DocumentNode; |
| 157 | const queries: OperationDefinitionNode[] = []; |
| 158 | for (const def of queryDocument.definitions) { |
| 159 | if (def.kind === "OperationDefinition") { |
| 160 | if (def.operation !== "query") continue; |
| 161 | queries.push(def); |
| 162 | } else if (def.kind === "FragmentDefinition") { |
| 163 | this._fragments[def.name.value] = def; |
| 164 | } |
| 165 | } |
| 166 | assert(queries.length >= 1, "GraphQL file doesn't have any queries defined."); |
| 167 | this.queries = List(queries); |
| 168 | } |
| 169 | |
| 170 | private makeIRTypeFromFieldNode = ( |
| 171 | builder: TypeBuilder, |
| 172 | fieldNode: FieldNode, |
| 173 | fieldType: GQLType, |
| 174 | containingTypeName: string |
| 175 | ): TypeRef => { |
| 176 | const optional = hasOptionalDirectives(fieldNode.directives); |
| 177 | let result: TypeRef; |
| 178 | switch (fieldType.kind) { |
| 179 | case TypeKind.SCALAR: |
| 180 | result = makeScalar(builder, fieldType); |
| 181 | break; |
| 182 | case TypeKind.OBJECT: |
| 183 | case TypeKind.INTERFACE: |
| 184 | case TypeKind.UNION: |
| 185 | if (!fieldNode.selectionSet) { |
| 186 | return panic("No selection set on object or interface"); |
| 187 | } |
| 188 | return makeNullable( |
| 189 | builder, |
| 190 | this.makeIRTypeFromSelectionSet( |
| 191 | builder, |
| 192 | fieldNode.selectionSet, |
| 193 | fieldType, |
| 194 | fieldNode.name.value, |
| 195 | containingTypeName |
| 196 | ), |
| 197 | fieldNode.name.value, |
| 198 | null, |
| 199 | containingTypeName |
| 200 | ); |
| 201 | case TypeKind.ENUM: |
| 202 | if (!fieldType.enumValues) { |
| 203 | return panic("Enum type doesn't have values"); |
nothing calls this directly
no test coverage detected
searching dependent graphs…