UNPKG

sql-fixtures

Version:

Populate a SQL database with fixture data

62 lines (51 loc) 1.82 kB
/* * resolve-dependencies * ==================== * Given an array of fixture specs and the already resolved fixtures * from previous runs, resolves the current specs if it can. * * So if a current spec has "userId: 'Users:0'", and the available prereqs * contains a User, then userId will get resolved to the actual id */ var _ = require('lodash'); function resolve(value, availablePreReqs) { if (!_.isString(value) || !_.includes(value, ':') || _.includes(value, '::')) { return value; } if (value.indexOf('{') > -1 && value.indexOf('}') > -1) { return value.replace(/{([^}]+)}/g, function(match, value) { return resolve(value, availablePreReqs); }); } var split = value.split(':'); var tableName = split[0]; var specId = split[1]; var property = split[2] || 'id'; var records = availablePreReqs[tableName] || []; var resolvedDep = _.find(_.compact(records), { specId: specId }); return resolvedDep && resolvedDep[property] || value; } module.exports = function resolveDependencies(availablePreReqs, toBeResolved) { toBeResolved = _.clone(toBeResolved); _.forIn(toBeResolved, function(entries, table) { toBeResolved[table] = entries.map(function(entry) { if(_.isString(entry)) { return resolve(entry, availablePreReqs); } else if(_.isObject(entry)) { _.forIn(entry, function(value, property, entry) { // entry[property] = resolve(value, availablePreReqs); if (_.isArray(value)) { entry[property] = _.map(value, function(arrayValue) { return resolve(arrayValue, availablePreReqs); }); } else { entry[property] = resolve(value, availablePreReqs); } }); return entry; } }); }); return toBeResolved; };