feat: introduce gql schema sdl generation to the backend (#35)
* feat: introduce gql schema sdl generation to the backend * chore: update gql-codegen consumers to get schema from generated sdl * chore: hoppscotch-backend generates gql sdl on postinstall * fix: add back missed part of generate-gql-sdl script * chore: updated generate sdl script to hardcode whitelisted domains * chore: add prisma generate on postinstall script --------- Co-authored-by: ankitsridhar16 <ankit.sridhar16@gmail.com>
This commit is contained in:
95
packages/hoppscotch-backend/src/gql-schema.ts
Normal file
95
packages/hoppscotch-backend/src/gql-schema.ts
Normal file
@@ -0,0 +1,95 @@
|
||||
import { NestFactory } from '@nestjs/core';
|
||||
import {
|
||||
GraphQLSchemaBuilderModule,
|
||||
GraphQLSchemaFactory,
|
||||
} from '@nestjs/graphql';
|
||||
import { printSchema } from 'graphql/utilities';
|
||||
import * as path from 'path';
|
||||
import * as fs from 'fs';
|
||||
import { ShortcodeResolver } from './shortcode/shortcode.resolver';
|
||||
import { TeamCollectionResolver } from './team-collection/team-collection.resolver';
|
||||
import { TeamEnvironmentsResolver } from './team-environments/team-environments.resolver';
|
||||
import { TeamInvitationResolver } from './team-invitation/team-invitation.resolver';
|
||||
import { TeamRequestResolver } from './team-request/team-request.resolver';
|
||||
import { TeamMemberResolver } from './team/team-member.resolver';
|
||||
import { TeamResolver } from './team/team.resolver';
|
||||
import { UserCollectionResolver } from './user-collection/user-collection.resolver';
|
||||
import { UserEnvironmentsResolver } from './user-environment/user-environments.resolver';
|
||||
import { UserHistoryResolver } from './user-history/user-history.resolver';
|
||||
import { UserRequestResolver } from './user-request/resolvers/user-request.resolver';
|
||||
import { UserSettingsResolver } from './user-settings/user-settings.resolver';
|
||||
import { UserResolver } from './user/user.resolver';
|
||||
import { Logger } from '@nestjs/common';
|
||||
|
||||
/**
|
||||
* All the resolvers present in the application.
|
||||
*
|
||||
* NOTE: This needs to be KEPT UP-TO-DATE to keep the schema accurate
|
||||
*/
|
||||
const RESOLVERS = [
|
||||
ShortcodeResolver,
|
||||
TeamResolver,
|
||||
TeamMemberResolver,
|
||||
TeamCollectionResolver,
|
||||
TeamEnvironmentsResolver,
|
||||
TeamInvitationResolver,
|
||||
TeamRequestResolver,
|
||||
UserResolver,
|
||||
UserCollectionResolver,
|
||||
UserEnvironmentsResolver,
|
||||
UserHistoryResolver,
|
||||
UserCollectionResolver,
|
||||
UserRequestResolver,
|
||||
UserSettingsResolver,
|
||||
];
|
||||
|
||||
/**
|
||||
* All the custom scalars present in the application.
|
||||
*
|
||||
* NOTE: This needs to be KEPT UP-TO-DATE to keep the schema accurate
|
||||
*/
|
||||
const SCALARS = [];
|
||||
|
||||
/**
|
||||
* Generates the GraphQL Schema SDL definition and writes it into the location
|
||||
* specified by the `GQL_SCHEMA_EMIT_LOCATION` environment variable.
|
||||
*/
|
||||
export async function emitGQLSchemaFile() {
|
||||
const logger = new Logger('emitGQLSchemaFile');
|
||||
|
||||
try {
|
||||
const destination = path.resolve(
|
||||
__dirname,
|
||||
process.env.GQL_SCHEMA_EMIT_LOCATION ?? '../gen/schema.gql',
|
||||
);
|
||||
|
||||
logger.log(`GQL_SCHEMA_EMIT_LOCATION: ${destination}`);
|
||||
|
||||
const app = await NestFactory.create(GraphQLSchemaBuilderModule);
|
||||
await app.init();
|
||||
|
||||
const gqlSchemaFactory = app.get(GraphQLSchemaFactory);
|
||||
|
||||
logger.log(
|
||||
`Generating Schema against ${RESOLVERS.length} resolvers and ${SCALARS.length} custom scalars`,
|
||||
);
|
||||
|
||||
const schema = await gqlSchemaFactory.create(RESOLVERS, SCALARS);
|
||||
|
||||
const schemaString = printSchema(schema, {
|
||||
commentDescriptions: true,
|
||||
});
|
||||
|
||||
logger.log(`Writing schema to GQL_SCHEMA_EMIT_LOCATION (${destination})`);
|
||||
|
||||
// Generating folders if required to emit to the given output
|
||||
fs.mkdirSync(path.dirname(destination), { recursive: true });
|
||||
fs.writeFileSync(destination, schemaString);
|
||||
|
||||
logger.log(`Wrote schema to GQL_SCHEMA_EMIT_LOCATION (${destination})`);
|
||||
} catch (e) {
|
||||
logger.error(
|
||||
`Failed writing schema to GQL_SCHEMA_EMIT_LOCATION. Reason: ${e}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@ import { json } from 'express';
|
||||
import { AppModule } from './app.module';
|
||||
import * as cookieParser from 'cookie-parser';
|
||||
import { VersioningType } from '@nestjs/common';
|
||||
import { emitGQLSchemaFile } from './gql-schema';
|
||||
|
||||
async function bootstrap() {
|
||||
console.log(`Running in production: ${process.env.PRODUCTION}`);
|
||||
@@ -38,4 +39,9 @@ async function bootstrap() {
|
||||
app.use(cookieParser());
|
||||
await app.listen(process.env.PORT || 3170);
|
||||
}
|
||||
bootstrap();
|
||||
|
||||
if (!process.env.GENERATE_GQL_SCHEMA) {
|
||||
bootstrap();
|
||||
} else {
|
||||
emitGQLSchemaFile();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user