UNPKG

@backland/schema

Version:

TypeScript schema declaration and validation library with static type inference

124 lines (123 loc) 8.84 kB
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