@corejam/base
Version:
A scaffolding for building progressive GraphQL powered jamstack applications
138 lines • 5.75 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CorejamServer = exports.getServerContext = exports.getServerModels = exports.eventEmitter = void 0;
const apollo_server_micro_1 = require("apollo-server-micro");
const events_1 = require("events");
const fs = __importStar(require("fs"));
const Bootstrap_1 = require("./Bootstrap");
const nativeRequire_1 = __importDefault(require("./nativeRequire"));
const resolvers_1 = require("./resolvers");
const faker_1 = require("./resolvers/db/faker");
const fauna_1 = require("./resolvers/db/fauna");
exports.eventEmitter = new events_1.EventEmitter();
const eventFiles = [];
const registerdPluginEvents = [];
process.on("unhandledRejection", (error, p) => {
console.log("Unhandled Rejection at: Promise", p, "error:", error);
console.log(error);
});
/**
* Return the appropriate resolvers based on environment setup.
*/
const getServerModels = () => {
let models;
if (process.env.DB_DRIVER === "DB_FAUNA") {
models = fauna_1.models;
}
else {
models = faker_1.models;
}
return models;
};
exports.getServerModels = getServerModels;
/**
* We only have this extracted to allow us to bootstrap
* the context within our integration tests.
*/
function getServerContext({ req, res }) {
let context = { req, res, models: exports.getServerModels(), eventEmitter: exports.eventEmitter };
if (fs.existsSync(process.cwd() + "/resolvers.js")) {
const pluginsFile = require(process.cwd() + "/resolvers.js");
const serverKeys = Object.keys(pluginsFile.server);
for (const p of serverKeys) {
const res = pluginsFile.server[p].getPluginContext({ req, models: context.models, eventEmitter: exports.eventEmitter });
context = Object.assign(Object.assign({}, context), res);
}
return context;
}
else {
//We need to merge all plugin context for any additional context items they add
//TODO needs to get generated from cli for all the requires on plugins
for (const plugin of Bootstrap_1.loadManifest().plugins) {
const currentPlugin = Bootstrap_1.importPlugin(plugin);
const res = currentPlugin.getPluginContext({ req, models: context.models, eventEmitter: exports.eventEmitter });
context = Object.assign(Object.assign({}, context), res);
if (currentPlugin.default.listens) {
//Trigger listeners
currentPlugin.default.listens.forEach((event) => {
if (!registerdPluginEvents.includes(event.event)) {
registerdPluginEvents.push(event.event);
exports.eventEmitter.on(event.event, event.callback);
}
});
}
}
return context;
}
}
exports.getServerContext = getServerContext;
/**
* Bootstrap the ApolloServer with our relevant schemas / context & models.
* Merge all the plugins.
*
* @param context
*/
function CorejamServer(context = ({ req, res }) => getServerContext({ req, res })) {
let resolvers = Object.values(resolvers_1.Resolvers);
if (fs.existsSync(process.cwd() + "/resolvers.js")) {
const pluginsFile = require(process.cwd() + "/resolvers.js");
Object.keys(pluginsFile.server).map((p) => {
if (pluginsFile.server[p].default.resolvers) {
resolvers = Object.values(Object.assign(Object.assign({}, resolvers), pluginsFile.server[p].default.resolvers));
}
});
}
else {
//We need to merge all plugin resolvers into our core
for (const plugin of Bootstrap_1.loadManifest().plugins) {
const currentPlugin = Bootstrap_1.importPlugin(plugin);
if (currentPlugin.default.resolvers) {
resolvers = Object.values(Object.assign(Object.assign({}, resolvers), currentPlugin.default.resolvers));
}
}
}
//Do we have any events inside the /events dir?
if (fs.existsSync(process.cwd() + "/events")) {
try {
fs.readdirSync(process.cwd() + "/events").forEach((file) => {
if (!eventFiles.includes(file)) {
eventFiles.push(file);
const s = nativeRequire_1.default(process.cwd() + "/events/" + file);
exports.eventEmitter.on(file.replace(".js", ""), s);
}
});
}
catch (e) {
console.log(e);
}
}
return {
typeDefs: apollo_server_micro_1.gql(Bootstrap_1.bootstrapSchema()),
resolvers,
context,
};
}
exports.CorejamServer = CorejamServer;
//# sourceMappingURL=Server.js.map