@backland/schema
Version:
TypeScript schema declaration and validation library with static type inference
124 lines (123 loc) • 8.84 kB
JavaScript
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
import path from 'path';
import { Process } from '@backland/utils';
import { mitt } from '@backland/utils';
import { ensureFileSync, writeFileSync } from 'fs-extra';
import { CircularDeps } from '../CircularDeps';
import { LiteralField } from '../fields/LiteralField';
var {
serialize
} = LiteralField.utils;
export var BacklandWatchTypesPubSub = mitt();
var typesRecord = {};
var resolversRecord = {};
var customTypeRecord = {};
// APLICAR AOS RESOLVERS DA ENTITY, etc
BacklandWatchTypesPubSub.on('created', /*#__PURE__*/function () {
var _ref = _asyncToGenerator(function* (event) {
var _event$graphType;
if ((_event$graphType = event.graphType) !== null && _event$graphType !== void 0 && _event$graphType.optionalId) {
typesRecord["".concat(event.graphType.id)] = event.graphType;
}
if (event.resolver) {
resolversRecord["".concat(event.resolver.name)] = event.resolver;
}
if (event.custom) {
customTypeRecord[event.custom.name] = event.custom;
}
save();
});
return function (_x) {
return _ref.apply(this, arguments);
};
}());
export var defaultTypesDest = path.resolve(Process.cwd(), 'src/generated/backland.d.ts');
export function writeTypes(_x2) {
return _writeTypes.apply(this, arguments);
}
function _writeTypes() {
_writeTypes = _asyncToGenerator(function* (options) {
var {
dest = defaultTypesDest
} = options || {};
ensureFileSync(dest);
var creators = Object.keys(typesRecord).map(name => {
var txt = '';
var fn = ["function createType<Definition extends ObjectFieldInput>(name: \"".concat(name, "\","), "definition: Definition):", "GraphTypeRuntime<Definition,", "RuntimeTypes[\"".concat(name, "\"], \"").concat(name, "\">"), '\n'].join(' ');
var getTypeFn = ["function getType(name: \"".concat(name, "\"): GraphTypeRuntime<RuntimeDefinitions[\"").concat(name, "\"], RuntimeTypes[\"").concat(name, "\"], \"").concat(name, "\">")].join(' ');
txt += "\n export ".concat(fn, ";\n");
txt += "\n export ".concat(getTypeFn, ";\n");
txt += "\n export const Backland = { createType, getType };\n";
return txt;
});
var resolvers = Object.keys(resolversRecord).map(name => {
var txt = '';
var fn = ["function createResolver<Context, Source>(", "options: ResolverRuntimeConfig<Context, Source, RuntimeTypes[\"".concat(name, "Payload\"], RuntimeTypes[\"").concat(name, "Input\"], \"").concat(name, "\">"), "): ResolverRuntime<Context, Source, RuntimeTypes[\"".concat(name, "Payload\"], RuntimeTypes[\"").concat(name, "Input\"], \"").concat(name, "\">")].join(' ');
var getTypeFn = ["function getResolver(name: \"".concat(name, "\"): ResolverRuntime<Context, Source, RuntimeTypes[\"").concat(name, "Payload\"], RuntimeTypes[\"").concat(name, "Input\"], \"").concat(name, "\">")].join(' ');
txt += "\n export ".concat(fn, ";\n");
txt += "\n export ".concat(getTypeFn, ";\n");
txt += "\n export const Backland = { createResolver, getResolver };\n";
return txt;
});
var head = [];
var body = [];
var footer = [];
Object.values(customTypeRecord).forEach(item => {
item.head && head.push(...item.head);
item.body && head.push(...item.body);
item.footer && head.push(...item.footer);
});
var typesInterface = yield CircularDeps.objectToTypescript('RuntimeTypes', typesRecord);
var definitions = Object.entries(typesRecord).reduce((acc, _ref3) => {
var [id, next] = _ref3;
acc += "\n\"".concat(id, "\": ").concat(serialize(next.definition), "\n;");
return acc;
}, '');
definitions = "export interface RuntimeDefinitions {\n".concat(definitions, "\n}");
var content = template({
creators,
definitions,
extraCustomBody: body,
extraCustomFooter: footer,
extraCustomHead: head,
resolvers,
typesInterface
});
content = yield CircularDeps.prettier.format(content, {
parser: 'typescript',
singleQuote: true
});
writeFileSync(dest, content);
});
return _writeTypes.apply(this, arguments);
}
function template(_ref2) {
var {
typesInterface,
creators,
resolvers,
definitions,
extraCustomHead,
extraCustomBody,
extraCustomFooter
} = _ref2;
return "\n/* tslint-disable */\n/* tslint:disable */\n/* eslint-disable */\ndeclare global {\n module '@backland/schema' {\n export * from '@backland/schema';\n import { ObjectFieldInput, ValidationCustomMessage, FieldDefinitionConfig } from '@backland/schema';\n import { Merge } from '@backland/utils';\n \n import {\n GraphQLField,\n GraphQLFieldConfig,\n GraphQLResolveInfo,\n } from 'graphql';\n \n ".concat(extraCustomHead.join('\n'), "\n\n export class GraphTypeRuntime<Definition extends FieldDefinitionConfig, Type, Name> {\n static __isGraphType: true;\n readonly __isGraphType: true;\n \n static reset(): Promise<void>;\n readonly definition: Definition;\n \n readonly id: Name;\n \n clone<Ext, NewName>(\n name: NewName,\n extend?: Ext\n ): GraphTypeRuntime<Definition & Ext, Type, NewName>;\n \n constructor(definition: Definition);\n \n constructor(name: Name, definition: Definition);\n \n parse(input: any, customMessage?: ValidationCustomMessage): Type;\n \n graphQLType(...args: unknown[]): typeof import('graphql').GraphQLNamedType;\n \n graphQLInputType(\n ...args: unknown[]\n ): typeof import('graphql').GraphQLNamedInputType;\n \n graphQLInterface(\n ...args: unknown[]\n ): typeof import('graphql').GraphQLInterfaceType;\n \n addRelation<FieldTypeDef, Name, Context = unknown, ArgsDef>(\n options: Merge<\n { type: FieldTypeDef; name: Name },\n ResolverConfigRuntime<Context, unknown, FieldTypeDef, ArgsDef>\n >\n ): this;\n \n print(): string[];\n \n typescriptPrint(options?: unknown): Promise<string>;\n }\n \n export type ResolverKind = 'query' | 'mutation' | 'subscription';\n \n export interface ResolverConfigRuntime<Context, Source, Type, Args, Name>\n extends Omit<GraphQLFieldConfig<any, any>, 'resolve' | 'args' | 'type'> {\n name: Name;\n kind?: ResolverKind;\n args?: unknown;\n type: unknown;\n \n resolve(\n root: Source,\n args: Args,\n context: Context,\n info: GraphQLResolveInfo\n ): Type | Promise<Type>;\n }\n \n export interface ResolverRuntime<Context, Source, Type, Args, Name>\n extends Omit<GraphQLFieldConfig<any, any>, 'resolve' | 'args' | 'type'> {\n __isResolver: true;\n __isRelation: boolean;\n __graphTypeId: string;\n __relatedToGraphTypeId: string;\n \n resolve(\n root: Source,\n args: Args,\n context: Context,\n info: GraphQLResolveInfo\n ): Type | Promise<Type>;\n \n name: Name;\n kind: 'query' | 'subscription' | 'mutation';\n \n typeDef: any;\n argsDef: any;\n payloadType: GraphTypeRuntime<any, Type, any>;\n argsType: GraphTypeRuntime<any, Args, any>;\n type: any;\n args: any;\n \n asObjectField(name?: string): GraphQLField<any, any>;\n }\n \n ").concat(creators.join('\n'), "\n \n ").concat(resolvers.join('\n'), "\n \n ").concat(extraCustomBody.join('\n'), "\n \n ").concat(definitions, "\n \n ").concat(typesInterface, "\n \n ").concat(extraCustomFooter.join('\n'), "\n }\n}\n");
}
var timeoutRef;
var timeoutMS = 2000;
function save() {
clearTimeout(timeoutRef);
if (process.env.backland_emit_interval) {
timeoutMS = +process.env.backland_emit_interval > 0 ? +process.env.backland_emit_interval : timeoutMS;
timeoutRef = setTimeout(() => {
writeTypes().catch(err => {
console.error('writeTypes:', err.message);
});
}, timeoutMS);
}
}
process.on('unhandledRejection', () => {
clearTimeout(timeoutRef);
});
//# sourceMappingURL=writeTypes.js.map