UNPKG

@coko/server

Version:

Reusable server for use by Coko's projects

60 lines 2.93 kB
"use strict"; 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