UNPKG

@notadd/graphql

Version:

notadd core none dependence

110 lines 5.07 kB
import { APP_ANALYSIS, createMiddlewarInjector, Injector, MAIN_PATH, Middleware, Module, ModuleWithProviders, OTHER_INITIALIZER, Router } from '@notadd/core'; import { HttpContext } from '@notadd/http'; import { readFileSync } from 'fs'; import { extname, join } from 'path'; import { GraphqlController } from './controller/graphql.controller'; import { Graphql } from './graphql'; import { graphqlProviders } from './handlers'; import { AnyScalar, BigIntScalar, DateScalar, EmailScalar, EmptyScalar, FloatScalar, Ipv4Scalar, Ipv6Scalar, MobileScalar, ObjectLiteralScalar, ObjectScalar, UndefinedScalar, URLScalar, VoidScalar } from "./scalars"; import { SchemaBuilder, SCHEMA_SOURCE } from './schema/schema'; import { DefaultSchemaBuilder } from './schemaBuilder'; import { GRAPHQL_PATH, GRAPHQL_SCHEMA } from './token'; @Module({ controllers: [ AnyScalar, BigIntScalar, DateScalar, EmailScalar, Ipv4Scalar, Ipv6Scalar, MobileScalar, ObjectScalar, URLScalar, ObjectLiteralScalar, EmptyScalar, FloatScalar, UndefinedScalar, VoidScalar, GraphqlController ] }) export class GraphqlModule { static forRoot(path: string): ModuleWithProviders { return { ngModule: GraphqlModule, providers: [ ...graphqlProviders, DefaultSchemaBuilder, { provide: SchemaBuilder, useFactory: (injector: Injector) => { return new SchemaBuilder(injector) }, deps: [Injector] }, { provide: SCHEMA_SOURCE, useFactory: (injector: Injector) => { const mainPath = injector.get<string>(MAIN_PATH) const ext = extname(mainPath) const graphqlPath = mainPath.replace(ext, '.graphql') return readFileSync(graphqlPath).toString('utf-8') }, deps: [Injector] }, { provide: GRAPHQL_SCHEMA, useFactory: (injector: Injector) => { const builder = injector.get(DefaultSchemaBuilder) return builder.buildSchema() }, deps: [Injector] }, { provide: Graphql, useFactory: (injector: Injector) => new Graphql(injector), deps: [Injector], noCache: true }, { provide: GRAPHQL_PATH, useValue: path }, { provide: APP_ANALYSIS, useFactory: () => { return async (injector: Injector) => { const router = injector.get(Router) const path = injector.get(GRAPHQL_PATH, '/graphql') const builder = injector.get(DefaultSchemaBuilder) await builder.buildSchema() await builder.buildIntrospection() router.add("OPTIONS", path, async (middlewars: Middleware[]) => { const root = await createMiddlewarInjector(middlewars, injector) const context = root.get(HttpContext) context.end(`ok`) context.res.end(); }); } }, multi: true },{ provide: OTHER_INITIALIZER, useFactory: () => { return async (injector: Injector) => { const router = injector.get(Router); router.add('GET',`graphql-playground-react@1.0.0/build/static/css/index.css`, async (middlewars: Middleware[]) => { const root = await createMiddlewarInjector(middlewars, injector); const context = root.get(HttpContext); await context.file(join(__dirname,'playground/css/index.css')); }); router.add('GET',`graphql-playground-react@1.0.0/build/static/js/middleware.js`, async (middlewars: Middleware[]) => { const root = await createMiddlewarInjector(middlewars, injector); const context = root.get(HttpContext); await context.file(join(__dirname,'playground/js/middleware.js')); }); } }, multi: true } ] } } }