@coko/server
Version:
Reusable server for use by Coko's projects
60 lines • 2.93 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const dataloader_1 = __importDefault(require("dataloader"));
const config_1 = __importDefault(require("../configManager/config"));
const loadComponent_1 = __importDefault(require("../utils/loadComponent"));
const defaultLoader = (model) => new dataloader_1.default(async (ids) => {
const results = await model.query().whereIn('id', ids);
// We map over ids so that the DataLoader API is always matched,
// i.e. array of keys in, array of results out (even if some records are not found)
return ids.map(id => results.find(result => result.id === id));
});
exports.default = async () => {
const componentNames = config_1.default.has('components') && Array.isArray(config_1.default.get('components'))
? config_1.default.get('components')
: [];
const components = [];
for (const name of componentNames) {
/* eslint-disable-next-line no-await-in-loop */
components.push(await (0, loadComponent_1.default)(name));
}
const loaders = {};
components.forEach(component => {
if (component.model && component.modelName) {
// Sets up the default loader, that gets model instances by id
// You can use it with e.g. context.loaders.User.load(id)
loaders[component.modelName] = defaultLoader(component.model);
// Allows for custom model loaders, that can be used e.g.
// context.loaders.User.customLoader.load(id)
if (component.modelLoaders) {
Object.keys(component.modelLoaders).forEach(loaderName => {
loaders[component.modelName][loaderName] = new dataloader_1.default(component.modelLoaders[loaderName]);
});
}
}
else if (component.models) {
// If there are multiple models specified in a single component
// each can specify its own loaders
component.models.forEach(model => {
loaders[model.modelName] = defaultLoader(model.model);
if (model.modelLoaders) {
Object.keys(model.modelLoaders).forEach(loaderName => {
loaders[model.modelName][loaderName] = new dataloader_1.default(model.modelLoaders[loaderName]);
});
}
});
}
// Allows for top-level loaders, which you can use like so:
// context.loaders.yourCustomLoader.load()
if (component.loaders) {
Object.keys(component.loaders).forEach(loaderName => {
loaders[loaderName] = new dataloader_1.default(component.loaders[loaderName]);
});
}
});
return loaders;
};
//# sourceMappingURL=loaders.js.map