@coko/server
Version:
Reusable server for use by Coko's projects
76 lines • 3.53 kB
JavaScript
"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