UNPKG

@cran/gql.reflect

Version:

Cranberry Introspection Utilities for GraphQL

88 lines (87 loc) 2.93 kB
import { ReflectField } from "./ReflectField"; import { ReflectInputField } from "./ReflectInputField"; import { ReflectEnum } from "./ReflectEnum"; import { ReflectInput } from "./ReflectInput"; import { ReflectObject } from "./ReflectObject"; import { ReflectScalar } from "./ReflectScalar"; import { _TypeKind } from "../input/_TypeKind"; export class ReflectSchema { $; _; elements = {}; types = {}; scalars = {}; enums = {}; inputs = {}; objects = {}; properties = {}; inputFields = {}; fields = {}; enumValues = {}; constructor(_, options = {}) { this.$ = this; this._ = _; for (const type of _.types) { if (!options.filter || options.filter(type)) { this.create(type); } } } create(type) { switch (type.kind) { case _TypeKind.SCALAR: return void this.addType(new ReflectScalar(this, type)); case _TypeKind.ENUM: return void this.addType(new ReflectEnum(this, type)); case _TypeKind.OBJECT: return void this.addType(new ReflectObject(this, type)); case _TypeKind.INPUT_OBJECT: return void this.addType(new ReflectInput(this, type)); default: throw new Error("invariant"); } } addType(element) { this.elements[element.name] = element; this.types[element.name] = element; if (element instanceof ReflectScalar) { this.scalars[element.name] = element; } else if (element instanceof ReflectEnum) { this.enums[element.name] = element; for (const value of element.values) { this.addEnumValue(value); } } else if (element instanceof ReflectInput) { this.inputs[element.name] = element; for (const name in element.fields) { this.addProperty(element.fields[name]); } } else if (element instanceof ReflectObject) { this.objects[element.name] = element; for (const name in element.fields) { this.addProperty(element.fields[name]); } } } addProperty(element) { this.elements[element.fqdn] = element; this.properties[element.fqdn] = element; if (element instanceof ReflectInputField) { this.inputFields[element.fqdn] = element; } else if (element instanceof ReflectField) { this.fields[element.fqdn] = element; for (const name in element.args) { const arg = element.args[name]; this.inputFields[arg.fqdn] = arg; } } } addEnumValue(element) { this.elements[element.fqdn] = element; this.enumValues[element.fqdn] = element; } }