@notadd/graphql
Version:
notadd core none dependence
110 lines • 5.07 kB
text/typescript
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
}
]
}
}
}