UNPKG

@grnsft/if

Version:

Impact Framework

98 lines 13 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CSVLookup = void 0; /* eslint-disable eqeqeq */ const zod_1 = require("zod"); const interfaces_1 = require("@grnsft/if-core/interfaces"); const utils_1 = require("@grnsft/if-core/utils"); const config_1 = require("../../config"); const csv_helpers_1 = require("../util/csv-helpers"); const { MISSING_CONFIG, NO_QUERY_DATA } = config_1.STRINGS; const { QueryDataNotFoundError, ConfigError } = utils_1.ERRORS; exports.CSVLookup = (0, interfaces_1.PluginFactory)({ configValidation: (config) => { if (!config || !Object.keys(config)?.length) { throw new ConfigError(MISSING_CONFIG); } const configSchema = zod_1.z.object({ filepath: zod_1.z.string(), query: zod_1.z.record(zod_1.z.string(), zod_1.z.string()), output: zod_1.z .string() .or(zod_1.z.array(zod_1.z.string())) .or(zod_1.z.array(zod_1.z.array(zod_1.z.string()))), }); return (0, utils_1.validate)(configSchema, config); }, implementation: async (inputs, config) => { /** * 1. Tries to retrieve given file (with url or local path). * 2. Parses given CSV. * 3. Filters requested information from CSV. */ const { filepath, query, output } = config; const file = await (0, csv_helpers_1.retrieveFile)(filepath); const parsedCSV = (0, csv_helpers_1.parseCSVFile)(file); return inputs.map(input => { /** Collects query values from input. */ const queryData = {}; const queryKeys = Object.keys(query); queryKeys.forEach(queryKey => { const queryValue = query[queryKey]; queryData[queryKey] = input[queryValue]; }); /** Gets related data from CSV. */ const relatedData = parsedCSV.find(withCriteria(queryData)); if (!relatedData) { throw new QueryDataNotFoundError(NO_QUERY_DATA); } return { ...input, ...filterOutput(relatedData, { output, query }), }; }); }, }); /** * 1. If output is anything, then removes query data from csv record to escape duplicates. * 2. Otherwise checks if it's a miltidimensional array, then grabs multiple fields (). * 3. If not, then returns single field. * 4. In case if it's string, then */ const filterOutput = (dataFromCSV, params) => { const { output, query } = params; if (output === '*') { const keys = Object.keys(query); keys.forEach(key => { delete dataFromCSV[key]; }); return (0, csv_helpers_1.nanifyEmptyValues)(dataFromCSV); } if (Array.isArray(output)) { /** Check if it's a multidimensional array. */ if (Array.isArray(output[0])) { const result = {}; output.forEach(outputField => { /** Check if there is no renaming request, then export as is */ const outputTitle = outputField[1] || outputField[0]; result[outputTitle] = (0, csv_helpers_1.fieldAccessor)(outputField[0], dataFromCSV); }); return result; } const outputTitle = output[1] || output[0]; return { [outputTitle]: (0, csv_helpers_1.fieldAccessor)(output[0], dataFromCSV), }; } return { [output]: (0, csv_helpers_1.fieldAccessor)(output, dataFromCSV), }; }; /** * Asserts CSV record with query data. */ const withCriteria = (queryData) => (csvRecord) => { const ifMatchesCriteria = Object.keys(queryData).map((key) => csvRecord[key] == queryData[key]); return ifMatchesCriteria.every(value => value === true); }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaWYtcnVuL2J1aWx0aW5zL2Nzdi1sb29rdXAvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkJBQTJCO0FBQzNCLDZCQUFzQjtBQUd0QiwyREFBeUQ7QUFDekQsaURBQXVEO0FBRXZELHlDQUFxQztBQUNyQyxxREFLNkI7QUFFN0IsTUFBTSxFQUFDLGNBQWMsRUFBRSxhQUFhLEVBQUMsR0FBRyxnQkFBTyxDQUFDO0FBRWhELE1BQU0sRUFBQyxzQkFBc0IsRUFBRSxXQUFXLEVBQUMsR0FBRyxjQUFNLENBQUM7QUFFeEMsUUFBQSxTQUFTLEdBQUcsSUFBQSwwQkFBYSxFQUFDO0lBQ3JDLGdCQUFnQixFQUFFLENBQUMsTUFBb0IsRUFBRSxFQUFFO1FBQ3pDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFBRTtZQUMzQyxNQUFNLElBQUksV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ3ZDO1FBRUQsTUFBTSxZQUFZLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztZQUM1QixRQUFRLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtZQUNwQixLQUFLLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sRUFBRSxPQUFDO2lCQUNOLE1BQU0sRUFBRTtpQkFDUixFQUFFLENBQUMsT0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztpQkFDdkIsRUFBRSxDQUFDLE9BQUMsQ0FBQyxLQUFLLENBQUMsT0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3BDLENBQUMsQ0FBQztRQUVILE9B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QUFDLENBQUMsRUFBRSxXQUFXLENBQUM7U0FDL0QsQ0FBQztLQUNIO0lBRUQsT0FBTztRQUNMLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBQSwyQkFBYSxFQUFDLE1BQU0sRUFBRSxXQUFXLENBQUM7S0FDN0MsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxZQUFZLEdBQUcsQ0FBQyxTQUE4QixFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO0lBQzFFLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQ2xELENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUNsRCxDQUFDO0lBRUYsT0FBTyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUM7QUFDMUQsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgZXFlcWVxICovXG5pbXBvcnQge3p9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7Q29uZmlnUGFyYW1zLCBQbHVnaW5QYXJhbXN9IGZyb20gJ0Bncm5zZnQvaWYtY29yZS90eXBlcyc7XG5pbXBvcnQge1BsdWdpbkZhY3Rvcnl9IGZyb20gJ0Bncm5zZnQvaWYtY29yZS9pbnRlcmZhY2VzJztcbmltcG9ydCB7RVJST1JTLCB2YWxpZGF0ZX0gZnJvbSAnQGdybnNmdC9pZi1jb3JlL3V0aWxzJztcblxuaW1wb3J0IHtTVFJJTkdTfSBmcm9tICcuLi8uLi9jb25maWcnO1xuaW1wb3J0IHtcbiAgZmllbGRBY2Nlc3NvcixcbiAgbmFuaWZ5RW1wdHlWYWx1ZXMsXG4gIHBhcnNlQ1NWRmlsZSxcbiAgcmV0cmlldmVGaWxlLFxufSBmcm9tICcuLi91dGlsL2Nzdi1oZWxwZXJzJztcblxuY29uc3Qge01JU1NJTkdfQ09ORklHLCBOT19RVUVSWV9EQVRBfSA9IFNUUklOR1M7XG5cbmNvbnN0IHtRdWVyeURhdGFOb3RGb3VuZEVycm9yLCBDb25maWdFcnJvcn0gPSBFUlJPUlM7XG5cbmV4cG9ydCBjb25zdCBDU1ZMb29rdXAgPSBQbHVnaW5GYWN0b3J5KHtcbiAgY29uZmlnVmFsaWRhdGlvbjogKGNvbmZpZzogQ29uZmlnUGFyYW1zKSA9PiB7XG4gICAgaWYgKCFjb25maWcgfHwgIU9iamVjdC5rZXlzKGNvbmZpZyk/Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IENvbmZpZ0Vycm9yKE1JU1NJTkdfQ09ORklHKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWdTY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgICBmaWxlcGF0aDogei5zdHJpbmcoKSxcbiAgICAgIHF1ZXJ5OiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKSxcbiAgICAgIG91dHB1dDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9yKHouYXJyYXkoei5zdHJpbmcoKSkpXG4gICAgICAgIC5vcih6LmFycmF5KHouYXJyYXkoei5zdHJpbmcoKSkpKSxcbiAgICB9KTtcblxuICAgIHJldHVybiB2YWxpZGF0ZTx6LmluZmVyPHR5cGVvZiBjb25maWdTY2hlbWE+Pihjb25maWdTY2hlbWEsIGNvbmZpZyk7XG4gIH0sXG4gIGltcGxlbWVudGF0aW9uOiBhc3luYyAoaW5wdXRzOiBQbHVnaW5QYXJhbXNbXSwgY29uZmlnOiBDb25maWdQYXJhbXMpID0+IHtcbiAgICAvKipcbiAgICAgKiAxLiBUcmllcyB0byByZXRyaWV2ZSBnaXZlbiBmaWxlICh3aXRoIHVybCBvciBsb2NhbCBwYXRoKS5cbiAgICAgKiAyLiBQYXJzZXMgZ2l2ZW4gQ1NWLlxuICAgICAqIDMuIEZpbHRlcnMgcmVxdWVzdGVkIGluZm9ybWF0aW9uIGZyb20gQ1NWLlxuICAgICAqL1xuICAgIGNvbnN0IHtmaWxlcGF0aCwgcXVlcnksIG91dHB1dH0gPSBjb25maWc7XG4gICAgY29uc3QgZmlsZSA9IGF3YWl0IHJldHJpZXZlRmlsZShmaWxlcGF0aCk7XG4gICAgY29uc3QgcGFyc2VkQ1NWID0gcGFyc2VDU1ZGaWxlKGZpbGUpO1xuXG4gICAgcmV0dXJuIGlucHV0cy5tYXAoaW5wdXQgPT4ge1xuICAgICAgLyoqIENvbGxlY3RzIHF1ZXJ5IHZhbHVlcyBmcm9tIGlucHV0LiAqL1xuICAgICAgY29uc3QgcXVlcnlEYXRhOiBhbnkgPSB7fTtcbiAgICAgIGNvbnN0IHF1ZXJ5S2V5cyA9IE9iamVjdC5rZXlzKHF1ZXJ5KTtcbiAgICAgIHF1ZXJ5S2V5cy5mb3JFYWNoKHF1ZXJ5S2V5ID0+IHtcbiAgICAgICAgY29uc3QgcXVlcnlWYWx1ZSA9IHF1ZXJ5W3F1ZXJ5S2V5XTtcbiAgICAgICAgcXVlcnlEYXRhW3F1ZXJ5S2V5XSA9IGlucHV0W3F1ZXJ5VmFsdWVdO1xuICAgICAgfSk7XG5cbiAgICAgIC8qKiBHZXRzIHJlbGF0ZWQgZGF0YSBmcm9tIENTVi4gKi9cbiAgICAgIGNvbnN0IHJlbGF0ZWREYXRhID0gcGFyc2VkQ1NWLmZpbmQod2l0aENyaXRlcmlhKHF1ZXJ5RGF0YSkpO1xuXG4gICAgICBpZiAoIXJlbGF0ZWREYXRhKSB7XG4gICAgICAgIHRocm93IG5ldyBRdWVyeURhdGFOb3RGb3VuZEVycm9yKE5PX1FVRVJZX0RBVEEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5pbnB1dCxcbiAgICAgICAgLi4uZmlsdGVyT3V0cHV0KHJlbGF0ZWREYXRhLCB7b3V0cHV0LCBxdWVyeX0pLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfSxcbn0pO1xuXG4vKipcbiAqIDEuIElmIG91dHB1dCBpcyBhbnl0aGluZywgdGhlbiByZW1vdmVzIHF1ZXJ5IGRhdGEgZnJvbSBjc3YgcmVjb3JkIHRvIGVzY2FwZSBkdXBsaWNhdGVzLlxuICogMi4gT3RoZXJ3aXNlIGNoZWNrcyBpZiBpdCdzIGEgbWlsdGlkaW1lbnNpb25hbCBhcnJheSwgdGhlbiBncmFicyBtdWx0aXBsZSBmaWVsZHMgKCkuXG4gKiAzLiBJZiBub3QsIHRoZW4gcmV0dXJucyBzaW5nbGUgZmllbGQuXG4gKiA0LiBJbiBjYXNlIGlmIGl0J3Mgc3RyaW5nLCB0aGVuXG4gKi9cbmNvbnN0IGZpbHRlck91dHB1dCA9IChcbiAgZGF0YUZyb21DU1Y6IGFueSxcbiAgcGFyYW1zOiB7XG4gICAgb3V0cHV0OiBzdHJpbmcgfCBzdHJpbmdbXSB8IHN0cmluZ1tdW107XG4gICAgcXVlcnk6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIH1cbikgPT4ge1xuICBjb25zdCB7b3V0cHV0LCBxdWVyeX0gPSBwYXJhbXM7XG5cbiAgaWYgKG91dHB1dCA9PT0gJyonKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHF1ZXJ5KTtcblxuICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgZGVsZXRlIGRhdGFGcm9tQ1NWW2tleV07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmFuaWZ5RW1wdHlWYWx1ZXMoZGF0YUZyb21DU1YpO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkob3V0cHV0KSkge1xuICAgIC8qKiBDaGVjayBpZiBpdCdzIGEgbXVsdGlkaW1lbnNpb25hbCBhcnJheS4gKi9cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvdXRwdXRbMF0pKSB7XG4gICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuXG4gICAgICBvdXRwdXQuZm9yRWFjaChvdXRwdXRGaWVsZCA9PiB7XG4gICAgICAgIC8qKiBDaGVjayBpZiB0aGVyZSBpcyBubyByZW5hbWluZyByZXF1ZXN0LCB0aGVuIGV4cG9ydCBhcyBpcyAqL1xuICAgICAgICBjb25zdCBvdXRwdXRUaXRsZSA9IG91dHB1dEZpZWxkWzFdIHx8IG91dHB1dEZpZWxkWzBdO1xuICAgICAgICByZXN1bHRbb3V0cHV0VGl0bGVdID0gZmllbGRBY2Nlc3NvcihvdXRwdXRGaWVsZFswXSwgZGF0YUZyb21DU1YpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0VGl0bGUgPSBvdXRwdXRbMV0gfHwgb3V0cHV0WzBdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIFtvdXRwdXRUaXRsZSBhcyBzdHJpbmddOiBmaWVsZEFjY2Vzc29yKG91dHB1dFswXSwgZGF0YUZyb21DU1YpLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIFtvdXRwdXRdOiBmaWVsZEFjY2Vzc29yKG91dHB1dCwgZGF0YUZyb21DU1YpLFxuICB9O1xufTtcblxuLyoqXG4gKiBBc3NlcnRzIENTViByZWNvcmQgd2l0aCBxdWVyeSBkYXRhLlxuICovXG5jb25zdCB3aXRoQ3JpdGVyaWEgPSAocXVlcnlEYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiAoY3N2UmVjb3JkOiBhbnkpID0+IHtcbiAgY29uc3QgaWZNYXRjaGVzQ3JpdGVyaWEgPSBPYmplY3Qua2V5cyhxdWVyeURhdGEpLm1hcChcbiAgICAoa2V5OiBzdHJpbmcpID0+IGNzdlJlY29yZFtrZXldID09IHF1ZXJ5RGF0YVtrZXldXG4gICk7XG5cbiAgcmV0dXJuIGlmTWF0Y2hlc0NyaXRlcmlhLmV2ZXJ5KHZhbHVlID0+IHZhbHVlID09PSB0cnVlKTtcbn07XG4iXX0=