UNPKG

typeorm-plus-fixtures-cli

Version:

This is a fork of [typeorm-fixtures](https://github.com/RobinCK/typeorm-fixtures)

131 lines 5.64 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const lodash_1 = require("lodash"); class Resolver { constructor() { this.stack = []; } /** * @param fixtureConfigs * @return {IFixture[]} */ resolve(fixtureConfigs) { for (const { entity, items, parameters, processor } of fixtureConfigs) { for (const [mainReferenceName, propertyList] of Object.entries(items)) { const rangeRegExp = /^([\w-_]+)\{(\d+)\.\.(\d+)\}$/gm; let referenceNames = []; if (rangeRegExp.test(mainReferenceName)) { const result = mainReferenceName.split(rangeRegExp); /* istanbul ignore else */ if (result) { referenceNames = lodash_1.range(+result[2], +(+result[3]) + 1).map(rangeNumber => `${result[1]}${rangeNumber}`); } } else { referenceNames = [mainReferenceName]; } for (const name of referenceNames) { const data = Object.assign({}, propertyList); this.stack.push({ parameters: parameters || {}, processor, entity: entity, name: name, data, dependencies: this.resolveDependencies(name, data), }); } } } return this.stack .map(s => (Object.assign({}, s, { dependencies: this.resolveDeepDependencies(s) }))) .sort((a, b) => a.dependencies.length - b.dependencies.length); } /** * @param {string} parentReferenceName * @param {any[] | object} propertyList * @return {any[]} */ resolveDependencies(parentReferenceName, propertyList) { const dependencies = []; const currentRegExp = /\(\$current((\+|\-|\/|\*)\d+)?\)/g; for (const [key, value] of Object.entries(propertyList)) { if (typeof value === 'string' && value.indexOf('@') === 0) { const reference = this.resolveReference(parentReferenceName, value.substr(1)); propertyList[key] = `@${reference}`; dependencies.push(reference); } else if (typeof value === 'string' && currentRegExp.test(value)) { propertyList[key] = value.replace(currentRegExp, this.resolveCurrent(parentReferenceName, value)); } else if (typeof value === 'object' && value !== null) { dependencies.push(...this.resolveDependencies(parentReferenceName, value)); } } return dependencies; } /** * @param {string} fixtureIdentify * @param {string} reference * @return {any} */ resolveReference(fixtureIdentify, reference) { const currentRegExp = /^([\w-_]+)\(\$current((\+|\-|\/|\*)\d+)?\)$/gm; const rangeRegExp = /^([\w-_]+)\{(\d+)\.\.(\d+)\}$/gm; if (currentRegExp.test(reference)) { const index = this.resolveCurrent(fixtureIdentify, reference); /* istanbul ignore else */ if (!index) { throw new Error(`Error parsed index in reference: "${reference}" and fixture identify: ${fixtureIdentify}`); } return reference.replace(/\(\$current((\+|\-|\/|\*)\d+)?\)/g, index); } else if (rangeRegExp.test(reference)) { const splitting = reference.split(rangeRegExp); lodash_1.sample(lodash_1.range(+splitting[2], +(+splitting[3]) + 1)); return `${splitting[1]}${lodash_1.sample(lodash_1.range(+splitting[2], +(+splitting[3]) + 1))}`; } return reference; } /** * @param {string} fixtureIdentify * @param {string} value */ resolveCurrent(fixtureIdentify, value) { const currentIndexRegExp = /^[a-z\_\-]+(\d+)$/gi; const currentRegExp = /\(\$current((\+|\-|\/|\*)\d+)\)/gi; const splitting = fixtureIdentify.split(currentIndexRegExp); if (currentRegExp.test(value)) { const calc = String(value.match(/(\+|\-|\/|\*)\d+/gi)); return eval(splitting[1].concat(calc)); } return splitting[1]; } /** * @param item * @return {any[]} */ resolveDeepDependencies(item) { const dependencies = []; for (const dependencyName of item.dependencies) { const dependencyElement = this.stack.find(s => s.name === dependencyName); if (!dependencyElement) { /* istanbul ignore else */ if (dependencyName.substr(dependencyName.length - 1) !== '*') { throw new Error(`Reference "${dependencyName}" not found`); } const prefix = dependencyName.substr(0, dependencyName.length - 1); const regex = new RegExp(`^${prefix}([0-9]+)$`); for (const dependencyMaskElement of this.stack.filter(s => regex.test(s.name))) { dependencies.push(dependencyMaskElement.name, ...this.resolveDeepDependencies(dependencyMaskElement)); } } else { dependencies.push(dependencyName, ...this.resolveDeepDependencies(dependencyElement)); } } return dependencies.filter((value, index, self) => self.indexOf(value) === index); } } exports.Resolver = Resolver; //# sourceMappingURL=Resolver.js.map