@cran/gql.reflect
Version:
Cranberry Introspection Utilities for GraphQL
88 lines (87 loc) • 2.93 kB
JavaScript
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;
}
}