@cran/gql.reflect
Version:
Cranberry Introspection Utilities for GraphQL
92 lines (91 loc) • 3.29 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ReflectSchema = void 0;
const ReflectField_1 = require("./ReflectField");
const ReflectInputField_1 = require("./ReflectInputField");
const ReflectEnum_1 = require("./ReflectEnum");
const ReflectInput_1 = require("./ReflectInput");
const ReflectObject_1 = require("./ReflectObject");
const ReflectScalar_1 = require("./ReflectScalar");
const _TypeKind_1 = require("../input/_TypeKind");
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_1._TypeKind.SCALAR:
return void this.addType(new ReflectScalar_1.ReflectScalar(this, type));
case _TypeKind_1._TypeKind.ENUM:
return void this.addType(new ReflectEnum_1.ReflectEnum(this, type));
case _TypeKind_1._TypeKind.OBJECT:
return void this.addType(new ReflectObject_1.ReflectObject(this, type));
case _TypeKind_1._TypeKind.INPUT_OBJECT:
return void this.addType(new ReflectInput_1.ReflectInput(this, type));
default:
throw new Error("invariant");
}
}
addType(element) {
this.elements[element.name] = element;
this.types[element.name] = element;
if (element instanceof ReflectScalar_1.ReflectScalar) {
this.scalars[element.name] = element;
}
else if (element instanceof ReflectEnum_1.ReflectEnum) {
this.enums[element.name] = element;
for (const value of element.values) {
this.addEnumValue(value);
}
}
else if (element instanceof ReflectInput_1.ReflectInput) {
this.inputs[element.name] = element;
for (const name in element.fields) {
this.addProperty(element.fields[name]);
}
}
else if (element instanceof ReflectObject_1.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_1.ReflectInputField) {
this.inputFields[element.fqdn] = element;
}
else if (element instanceof ReflectField_1.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;
}
}
exports.ReflectSchema = ReflectSchema;