UNPKG

@coko/server

Version:

Reusable server for use by Coko's projects

76 lines 3.53 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const isEmpty_1 = __importDefault(require("lodash/isEmpty")); const merge_1 = __importDefault(require("lodash/merge")); const GraphQLUpload_mjs_1 = __importDefault(require("graphql-upload/GraphQLUpload.mjs")); const graphql_middleware_1 = require("graphql-middleware"); const graphql_shield_1 = require("@coko/graphql-shield"); const schema_1 = require("@graphql-tools/schema"); const config_1 = __importDefault(require("../configManager/config")); const internals_1 = __importDefault(require("../logger/internals")); const loadComponent_1 = __importDefault(require("../utils/loadComponent")); const filesystem_1 = require("../utils/filesystem"); const logger_1 = __importDefault(require("../logger")); const resolverPerformanceMiddleware = async (resolve, root, args, context, info) => { // Only top level resolver if (!info.path.prev) { const startTime = performance.now(); const result = await resolve(root, args, context, info); const endTime = performance.now(); const durationInSeconds = (endTime - startTime) / 1000; // Convert to seconds internals_1.default.report('Resolver performance:', `${info.operation.operation} ${info.operation.name?.value || 'anonymous'} took ${durationInSeconds.toPrecision(3)} seconds`); return result; } return resolve(root, args, context, info); }; const generateSchema = async () => { const typeDefs = [ `type Query, type Mutation, type Subscription, scalar Upload`, ]; const resolvers = (0, merge_1.default)({}, { Upload: GraphQLUpload_mjs_1.default, }); if (config_1.default.has('components')) { await Promise.all(config_1.default.get('components').map(async (componentName) => { const component = await (0, loadComponent_1.default)(componentName); if (component.typeDefs) { typeDefs.push(component.typeDefs); } if (component.resolvers) { (0, merge_1.default)(resolvers, component.resolvers); } })); } const schema = (0, schema_1.makeExecutableSchema)({ typeDefs, resolvers }); const middleware = []; if (process.env.NODE_ENV === 'development') { middleware.push(resolverPerformanceMiddleware); } internals_1.default.section('Register graphql middleware'); /** * Authorization middleware */ const permissionsFile = await (0, filesystem_1.readConfigurationFile)('permissions'); if (!permissionsFile) logger_1.default.warn('No permissions file found...'); const permissions = permissionsFile?.default; const isProduction = process.env.NODE_ENV === 'production'; if (!(0, isEmpty_1.default)(permissions)) { const authorizationMiddleware = (0, graphql_shield_1.shield)(permissions, { allowExternalErrors: true, debug: !isProduction, }); middleware.push(authorizationMiddleware); internals_1.default.success('Registered permissions middleware'); } else { internals_1.default.warn('No permissions middleware'); } const schemaWithMiddleWare = (0, graphql_middleware_1.applyMiddleware)(schema, ...middleware); return schemaWithMiddleWare; }; exports.default = generateSchema; //# sourceMappingURL=generateSchema.js.map