graphql-static-binding
Version:
Generate static binding files for a GraphQL schema
189 lines • 8.77 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var graphql_1 = require("graphql");
exports.generator = {
GraphQLUnionType: renderUnionType,
GraphQLObjectType: renderObjectType,
GraphQLInputObjectType: renderInputObjectType,
GraphQLScalarType: renderScalarType,
GraphQLEnumType: renderEnumType,
GraphQLInterfaceType: renderObjectType,
RootType: renderRootType,
SubscriptionType: renderSubscriptionType,
SchemaType: renderSchemaInterface,
Main: renderMainMethod,
Header: renderHeader
};
var scalarMapping = {
Int: 'number',
String: 'string',
ID: 'string | number',
Float: 'number',
Boolean: 'boolean'
};
function renderHeader(schema) {
return "import { Graphcool as BaseGraphcool, BaseGraphcoolOptions } from 'graphcool-binding'\nimport { GraphQLResolveInfo } from 'graphql'\n\nconst typeDefs = `\n" + schema + "`";
}
function renderMainMethod(queryType, mutationType, subscriptionType) {
return "export class Graphcool extends BaseGraphcool {\n \n constructor({ endpoint, secret, fragmentReplacements, debug }: BaseGraphcoolOptions) {\n super({ typeDefs, endpoint, secret, fragmentReplacements, debug });\n }\n\n exists = {\n" + renderExistsFields(queryType.getFields()) + "\n }\n\n query: Query = {\n" + renderMainMethodFields('query', queryType.getFields()) + "\n }" + (mutationType
? "\n\n mutation: Mutation = {\n" + renderMainMethodFields('mutation', mutationType.getFields()) + "\n }"
: '') + (subscriptionType
? "\n\n subscription: Subscription = {\n" + renderMainSubscriptionMethodFields(subscriptionType.getFields()) + "\n }"
: '') + "\n}";
}
function renderExistsFields(fields) {
return Object.keys(fields)
.map(function (f) {
var field = fields[f];
var type = field.type;
var foundList = false;
// Traverse the wrapping types (if any)
while (graphql_1.isWrappingType(type)) {
type = type.ofType;
// One of those wrappings need to be a GraphQLList for this field to qualify
foundList = foundList || graphql_1.isListType(type);
}
if (foundList) {
var whereType = field.args.find(function (a) { return a.name === 'where'; }).type.name;
return " " + type.name + ": (where: " + whereType + "): Promise<boolean> => super.existsDelegate('query', '" + field.name + "', { where }, {}, '{ id }')";
}
})
.filter(function (f) { return f; })
.join(',\n');
}
exports.renderExistsFields = renderExistsFields;
function renderMainMethodFields(operation, fields) {
return Object.keys(fields)
.map(function (f) {
var field = fields[f];
return " " + field.name + ": (args, info): Promise<" + renderFieldType(field.type) + (!graphql_1.isNonNullType(field.type) ? ' | null' : '') + "> => super.delegate('" + operation + "', '" + field.name + "', args, {}, info)";
})
.join(',\n');
}
exports.renderMainMethodFields = renderMainMethodFields;
function renderMainSubscriptionMethodFields(fields) {
return Object.keys(fields)
.map(function (f) {
var field = fields[f];
return " " + field.name + ": (args, infoOrQuery): Promise<AsyncIterator<" + renderFieldType(field.type) + ">> => super.delegateSubscription('" + field.name + "', args, {}, infoOrQuery)";
})
.join(',\n');
}
exports.renderMainSubscriptionMethodFields = renderMainSubscriptionMethodFields;
function renderScalarType(type) {
if (type.name === 'ID') {
return renderIDType(type);
}
return (type.description
? "/*\n" + type.description + "\n*/\n"
: '') + "export type " + type.name + " = " + (scalarMapping[type.name] || 'string');
}
function renderIDType(type) {
return (type.description
? "/*\n" + type.description + "\n*/\n"
: '') + "export type " + type.name + "_Input = " + (scalarMapping[type.name] || 'string') + "\nexport type " + type.name + "_Output = string";
}
function renderEnumType(type) {
return renderDescription(type.description) + "export type " + type.name + " = \n" + type
.getValues()
.map(function (e) { return " '" + e.name + "'"; })
.join(' |\n');
}
function renderRootType(type) {
var fieldDefinition = Object.keys(type.getFields())
.map(function (f) {
var field = type.getFields()[f];
return " " + field.name + ": (args: {" + (field.args.length > 0 ? ' ' : '') + field.args
.map(function (f) { return renderFieldName(f) + ": " + renderFieldType(f.type); })
.join(', ') + (field.args.length > 0 ? ' ' : '') + "}, info?: GraphQLResolveInfo | string) => Promise<" + renderFieldType(field.type) + (!graphql_1.isNonNullType(field.type) ? ' | null' : '') + ">";
})
.join('\n');
return renderTypeWrapper(type.name, type.description, fieldDefinition);
}
function renderSubscriptionType(type) {
var fieldDefinition = Object.keys(type.getFields())
.map(function (f) {
var field = type.getFields()[f];
return " " + field.name + ": (args: {" + (field.args.length > 0 ? ' ' : '') + field.args
.map(function (f) { return renderFieldName(f) + ": " + renderFieldType(f.type); })
.join(', ') + (field.args.length > 0 ? ' ' : '') + "}, infoOrQuery?: GraphQLResolveInfo | string) => Promise<AsyncIterator<" + renderFieldType(field.type) + ">>";
})
.join('\n');
return renderTypeWrapper(type.name, type.description, fieldDefinition);
}
function renderUnionType(type) {
return renderDescription(type.description) + "export type " + type.name + " = " + type
.getTypes()
.map(function (t) { return t.name; })
.join(' | ');
}
function renderObjectType(type) {
var fieldDefinition = Object.keys(type.getFields())
.map(function (f) {
var field = type.getFields()[f];
return " " + renderFieldName(field) + ": " + renderFieldType(field.type);
})
.join('\n');
var interfaces = [];
if (type instanceof graphql_1.GraphQLObjectType) {
interfaces = type.getInterfaces();
}
return renderInterfaceWrapper(type.name, type.description, interfaces, fieldDefinition);
}
function renderInputObjectType(type) {
var fieldDefinition = Object.keys(type.getFields())
.map(function (f) {
var field = type.getFields()[f];
return " " + renderFieldName(field) + ": " + renderInputFieldType(field.type);
})
.join('\n');
var interfaces = [];
if (type instanceof graphql_1.GraphQLObjectType) {
interfaces = type.getInterfaces();
}
return renderInterfaceWrapper(type.name, type.description, interfaces, fieldDefinition);
}
function renderFieldName(field) {
return "" + field.name + (graphql_1.isNonNullType(field.type) ? '' : '?');
}
exports.renderFieldName = renderFieldName;
function renderFieldType(type) {
if (graphql_1.isNonNullType(type)) {
return renderFieldType(type.ofType);
}
if (graphql_1.isListType(type)) {
return renderFieldType(type.ofType) + "[]";
}
return "" + type.name + (type.name === 'ID' ? '_Output' : '');
}
exports.renderFieldType = renderFieldType;
function renderInputFieldType(type) {
if (graphql_1.isNonNullType(type)) {
return renderInputFieldType(type.ofType);
}
if (graphql_1.isListType(type)) {
var inputType = renderInputFieldType(type.ofType);
return inputType + "[] | " + inputType;
}
return "" + type.name + (type.name === 'ID' ? '_Input' : '');
}
function renderSchemaInterface(queryType, mutationType, subscriptionType) {
return "export interface Schema {\n query: " + queryType.name + "\n" + (mutationType
? " mutation: " + mutationType.name + "\n"
: '') + (subscriptionType
? " subscription: " + subscriptionType.name + "\n"
: '') + "}";
}
function renderInterfaceWrapper(typeName, typeDescription, interfaces, fieldDefinition) {
return renderDescription(typeDescription) + "export interface " + typeName + (interfaces.length > 0 ? " extends " + interfaces.map(function (i) { return i.name; }).join(', ') : '') + " {\n" + fieldDefinition + "\n}";
}
function renderTypeWrapper(typeName, typeDescription, fieldDefinition) {
return renderDescription(typeDescription) + "export type " + typeName + " = {\n" + fieldDefinition + "\n}";
}
exports.renderTypeWrapper = renderTypeWrapper;
function renderDescription(description) {
return "" + (description
? "/*\n" + description.split('\n').map(function (l) { return " * " + l + "\n"; }) + "\n */\n"
: '');
}
//# sourceMappingURL=graphcool-ts.js.map