New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

mocker-data-generator

Package Overview
Dependencies
Maintainers
1
Versions
68
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

mocker-data-generator - npm Package Compare versions

Comparing version

to
0.1.1

.travis.yml

246

build/mocker.js

@@ -1,2 +0,1 @@

require("source-map-support").install();
(function webpackUniversalModuleDefinition(root, factory) {

@@ -15,10 +14,10 @@ if(typeof exports === 'object' && typeof module === 'object')

/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/
/******/ // Create a new module (and put it into the cache)

@@ -30,23 +29,23 @@ /******/ var module = installedModules[moduleId] = {

/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.loaded = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports

@@ -61,17 +60,17 @@ /******/ return __webpack_require__(0);

'use strict';
Object.defineProperty(exports, '__esModule', {
value: true
});
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _srcIndexTs = __webpack_require__(1);
var _srcIndexTs2 = _interopRequireDefault(_srcIndexTs);
var mocker = function mocker(config) {
return new _srcIndexTs2['default'](config);
};
exports['default'] = mocker;

@@ -90,11 +89,21 @@ module.exports = exports['default'];

this.data = {};
this.entity = {};
this.initialData = null;
this.path = [];
}
Mocker.prototype.generate = function (entity, options) {
var _this = this;
var Phase1 = new Promise(function (resolve, reject) {
var d = [];
var d = [];
this.data[entity + 's'] = [];
return new Promise(function (resolve, reject) {
if (Number.isInteger(options)) {
for (var i = 0; i < options; i++) {
d.push(_this.generateEntity(_this.config[entity]));
}
utils.repeatFN(options, function (nxt) {
_this.generateEntity(_this.config[entity], function (data) {
d.push(data);
nxt();
});
}, function () {
_this.data[entity + 's'] = d;
resolve(_this.data);
});
}

@@ -106,75 +115,76 @@ else {

var length_1 = possibleValues.length;
for (var i = 0; i < length_1; i++) {
var initialData = {};
initialData[f] = possibleValues[i];
d.push(_this.generateEntity(_this.config[entity], initialData));
}
_this.initialData = {};
utils.eachSeries(possibleValues, function (k, nxt) {
_this.initialData[f] = { static: k };
_this.generateEntity(_this.config[entity], function (data) {
d.push(data);
nxt();
});
}, function () {
_this.data[entity + 's'] = d;
resolve(_this.data);
});
}
_this.data[entity + 's'] = d;
resolve(_this.data);
});
return Phase1;
};
Mocker.prototype.generateEachData = function () {
var _this = this;
return new Promise(function (resolve, reject) {
var cfg = _this.config;
var keys = Object.keys(cfg);
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
_this.data[key + 's'] = [_this.generateEntity(cfg[key])];
}
resolve(_this.data);
Mocker.prototype.generateEntity = function (entityConfig, cb) {
this.entity = Object.assign({}, entityConfig);
if (this.initialData) {
this.entity = Object.assign({}, entityConfig, this.initialData);
}
this.iterator(this.entity, function (object) {
cb(object);
});
};
Mocker.prototype.generateEntity = function (entityConfig, initialObject) {
Mocker.prototype.iterator = function (object, cb) {
var _this = this;
if (initialObject === void 0) { initialObject = {}; }
var keys = Object.keys(entityConfig);
var data = initialObject;
var initialKeys = Object.keys(data);
if (utils.iamLastParent(entityConfig)) {
keys.map(function (k) {
if (initialKeys.indexOf(k) === -1) {
var field = entityConfig[k];
utils.overObject(object, function (k, obj, nxt) {
var fieldCalculated;
var lvl = obj[k];
if (utils.iamLastChild(lvl)) {
_this.generateField(lvl, function (fieldCalculated) {
if (!utils.isConditional(k)) {
if (!utils.isArray(field)) {
if (field.values || field.faker || field.function) {
data[k] = _this.generateField(field, data);
}
}
else {
if (field[0].values || field[0].faker || field[0].function) {
data[k] = _this.generateArrayField(field[0], field[1], data);
}
}
obj[k] = fieldCalculated;
}
else {
if (!utils.isArray(field)) {
var key = k.split(',');
if (utils.evalWithContextData(key[0], data)) {
data[key[1]] = _this.generateField(field, data);
}
var key = k.split(',');
if (utils.evalWithContextData(key[0], _this.entity)) {
obj[key[1]] = fieldCalculated;
delete _this.entity[key];
}
else {
var key = k.split(',');
if (utils.evalWithContextData(key[0], data)) {
data[key[1]] = _this.generateArrayField(field[0], field[1], data);
}
delete _this.entity[key];
}
}
}
});
nxt();
});
}
else {
_this.iterator(lvl, function () {
nxt();
});
}
}, function () {
cb(object);
});
};
Mocker.prototype.generateField = function (field, cb) {
if (utils.isArray(field)) {
cb(this.generateArrayField(field[0], field[1]));
}
return data;
else {
cb(this.generateNormalField(field));
}
};
Mocker.prototype.generateArrayField = function (fieldConfig, arrayConfig, data) {
Mocker.prototype.generateArrayField = function (fieldConfig, arrayConfig) {
var array = [];
var length = utils.fieldArrayCalcLength(arrayConfig);
for (var i = 0; i < length; i++) {
array.push(this.generateField(fieldConfig, data));
array.push(this.generateNormalField(fieldConfig));
}
return array;
};
Mocker.prototype.generateField = function (config, object) {
Mocker.prototype.generateNormalField = function (config) {
var object = this.entity;
var db = this.data;
if (config.faker) {

@@ -188,3 +198,2 @@ var split = config.faker.split('.');

else if (config.function) {
var db = this.data;
return config.function.call({ object: object, faker: faker, db: db });

@@ -221,10 +230,10 @@ }

exports.iamLastChild = function (obj) {
if (!this.isArray(obj)) {
var _this = this;
if (this.isObject(obj)) {
var ks = Object.keys(obj);
var last = null;
for (var i = 0; i < ks.length; i++) {
var key = ks[i];
if (this.isObject(obj[key])) {
ks.map(function (k) {
if (_this.isObject(obj[k])) {
last = false;
break;
return;
}

@@ -234,3 +243,3 @@ else {

}
}
});
return last;

@@ -247,4 +256,5 @@ }

var key = ks[i];
if (this.iamLastChild(obj[key])) {
if (obj[key] && this.iamLastChild(obj[key])) {
last = true;
break;
}

@@ -290,2 +300,69 @@ else {

};
exports.repeatFN = function (times, fn, callback) {
var completed = 0;
var iterate = function () {
fn(function () {
completed += 1;
if (completed >= times) {
callback();
}
else {
iterate();
}
});
};
iterate();
};
exports.eachSeries = function (arr, iterator, callback) {
callback = callback || function () { };
if (!arr.length) {
return callback();
}
var completed = 0;
var iterate = function () {
iterator(arr[completed], function (err) {
if (err) {
callback(err);
callback = function () { };
}
else {
completed += 1;
if (completed >= arr.length) {
callback();
}
else {
iterate();
}
}
});
};
iterate();
};
exports.overObject = function (obj, iterator, callback) {
callback = callback || function () { };
var arr = Object.keys(obj);
if (!arr.length) {
return callback();
}
var completed = 0;
var iterate = function () {
var k = arr[completed];
iterator(k, obj, function (err) {
if (err) {
callback(err);
callback = function () { };
}
else {
completed += 1;
if (completed >= arr.length) {
callback();
}
else {
iterate();
}
}
});
};
iterate();
};

@@ -296,3 +373,2 @@

});
;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCBjN2EzY2I0Yzc4OTQ5OGFmZjZiNyIsIndlYnBhY2s6Ly8vLi9saWIvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiZmFrZXJcIiIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOlsiTW9ja2VyIiwiTW9ja2VyLmNvbnN0cnVjdG9yIiwiTW9ja2VyLmdlbmVyYXRlIiwiTW9ja2VyLmdlbmVyYXRlRWFjaERhdGEiLCJNb2NrZXIuZ2VuZXJhdGVFbnRpdHkiLCJNb2NrZXIuZ2VuZXJhdGVBcnJheUZpZWxkIiwiTW9ja2VyLmdlbmVyYXRlRmllbGQiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztBQ1ZBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVCQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozt1Q0N0Q21CLENBQWlCOzs7O0FBQ3BDLEtBQU0sTUFBTSxHQUFHLFNBQVQsTUFBTSxDQUFZLE1BQU0sRUFBRTtBQUM1QixZQUFPLDRCQUFXLE1BQU0sQ0FBQztFQUM1Qjs7c0JBRWMsTUFBTTs7Ozs7OztBQ0xyQixLQUFPLEtBQUssdUJBQVcsQ0FBTyxDQUFDO0FBQy9CLEtBQVksS0FBSyx1QkFBTSxDQUV2QixDQUFDLENBRmtDO0FBRW5DO0tBRUlBLGdCQUFvQkEsTUFBV0E7U0FBWEMsV0FBTUEsR0FBTkEsTUFBTUEsQ0FBS0E7U0FEeEJBLFNBQUlBLEdB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O1NBQ3hELE1BQU0sQ0FBQyxJQUFJO0tBQ2YsQ0FBQztLQUNELE1BQU0sQ0FBQyxLQUFLO0FBQ2hCLEVBQUM7QUFFWSxpQkFBUSxHQUFHLFVBQVUsQ0FBQztLQUMvQixFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssaUJBQWlCLENBQUMsRUFBQztTQUN6RCxNQUFNLENBQUMsSUFBSTtLQUNmLENBQUM7S0FDRCxNQUFNLENBQUMsS0FBSztBQUNoQixFQUFDIiwiZmlsZSI6Im1vY2tlci5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcImZha2VyXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtcImZha2VyXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIk1vY2tlckRhdGFcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJmYWtlclwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiTW9ja2VyRGF0YVwiXSA9IGZhY3Rvcnkocm9vdFtcImZha2VyXCJdKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMl9fKSB7XG5yZXR1cm4gXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uXG4gKiovIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGV4cG9ydHM6IHt9LFxuIFx0XHRcdGlkOiBtb2R1bGVJZCxcbiBcdFx0XHRsb2FkZWQ6IGZhbHNlXG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiB3ZWJwYWNrL2Jvb3RzdHJhcCBjN2EzY2I0Yzc4OTQ5OGFmZjZiN1xuICoqLyIsImltcG9ydCBNb2NrZXIgZnJvbSAnLi4vc3JjL2luZGV4LnRzJ1xuY29uc3QgbW9ja2VyID0gZnVuY3Rpb24oY29uZmlnKSB7XG4gICAgcmV0dXJuIG5ldyBNb2NrZXIoY29uZmlnKVxufVxuXG5leHBvcnQgZGVmYXVsdCBtb2NrZXJcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vfi9qc2NzLWxvYWRlciEuL2xpYi9tYWluLmpzXG4gKiovIiwiaW1wb3J0IGZha2VyID0gcmVxdWlyZSgnZmFrZXInKVxuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi91dGlscy50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9ja2VyIHtcbiAgICBwdWJsaWMgZGF0YSA9IHt9XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjb25maWc6IGFueSkge31cblxuICAgIGdlbmVyYXRlKGVudGl0eTogc3RyaW5nLCBvcHRpb25zOiBhbnkpIHtcbiAgICAgICAgbGV0IFBoYXNlMSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHZhciBkID0gW11cbiAgICAgICAgICAgIGlmICgoTnVtYmVyIGFzIGFueSkuaXNJbnRlZ2VyKG9wdGlvbnMpKXtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wdGlvbnM7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBkLnB1c2goIHRoaXMuZ2VuZXJhdGVFbnRpdHkodGhpcy5jb25maWdbZW50aXR5XSkgKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGNmZyA9IHRoaXMuY29uZmlnW2VudGl0eV1cbiAgICAgICAgICAgICAgICBsZXQgZiA9IG9wdGlvbnMudW5pcXVlRmllbGRcbiAgICAgICAgICAgICAgICBsZXQgcG9zc2libGVWYWx1ZXMgPSBjZmdbZl0udmFsdWVzXG4gICAgICAgICAgICAgICAgbGV0IGxlbmd0aCA9IHBvc3NpYmxlVmFsdWVzLmxlbmd0aFxuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5pdGlhbERhdGEgPSB7fVxuICAgICAgICAgICAgICAgICAgICBpbml0aWFsRGF0YVtmXSA9IHBvc3NpYmxlVmFsdWVzW2ldXG4gICAgICAgICAgICAgICAgICAgIGQucHVzaCggdGhpcy5nZW5lcmF0ZUVudGl0eSh0aGlzLmNvbmZpZ1tlbnRpdHldLCBpbml0aWFsRGF0YSkgKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5kYXRhW2VudGl0eSArICdzJ10gPSBkXG4gICAgICAgICAgICByZXNvbHZlKHRoaXMuZGF0YSlcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIFBoYXNlMVxuICAgIH1cblxuICAgIGdlbmVyYXRlRWFjaERhdGEoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgY2ZnID0gdGhpcy5jb25maWdcbiAgICAgICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMoY2ZnKVxuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0ga2V5c1tpXVxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVtrZXkgKyAncyddID0gW3RoaXMuZ2VuZXJhdGVFbnRpdHkoY2ZnW2tleV0pXVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlKHRoaXMuZGF0YSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBnZW5lcmF0ZUVudGl0eShlbnRpdHlDb25maWc6IE9iamVjdCwgaW5pdGlhbE9iamVjdDogT2JqZWN0ID0ge30gKXtcbiAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhlbnRpdHlDb25maWcpXG4gICAgICAgIGxldCBkYXRhID0gaW5pdGlhbE9iamVjdFxuICAgICAgICBsZXQgaW5pdGlhbEtleXMgPSBPYmplY3Qua2V5cyhkYXRhKVxuXG4gICAgICAgIGlmICh1dGlscy5pYW1MYXN0UGFyZW50KGVudGl0eUNvbmZpZykpe1xuICAgICAgICAgICAga2V5cy5tYXAoKGspID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbEtleXMuaW5kZXhPZihrKSA9PT0gLTEpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgZmllbGQgPSBlbnRpdHlDb25maWdba11cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXV0aWxzLmlzQ29uZGl0aW9uYWwoaykpe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhdXRpbHMuaXNBcnJheShmaWVsZCkgKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQudmFsdWVzIHx8IGZpZWxkLmZha2VyIHx8IGZpZWxkLmZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFba10gPSB0aGlzLmdlbmVyYXRlRmllbGQoZmllbGQsIGRhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRbMF0udmFsdWVzIHx8IGZpZWxkWzBdLmZha2VyIHx8IGZpZWxkWzBdLmZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFba10gPSB0aGlzLmdlbmVyYXRlQXJyYXlGaWVsZChmaWVsZFswXSwgZmllbGRbMV0sIGRhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhdXRpbHMuaXNBcnJheShmaWVsZCkgKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gay5zcGxpdCgnLCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWxzLmV2YWxXaXRoQ29udGV4dERhdGEoa2V5WzBdLCBkYXRhKSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFba2V5WzFdXSA9IHRoaXMuZ2VuZXJhdGVGaWVsZChmaWVsZCwgZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSBrLnNwbGl0KCcsJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXRpbHMuZXZhbFdpdGhDb250ZXh0RGF0YShrZXlbMF0sIGRhdGEpKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtrZXlbMV1dID0gdGhpcy5nZW5lcmF0ZUFycmF5RmllbGQoZmllbGRbMF0sIGZpZWxkWzFdLCBkYXRhKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0YVxuICAgIH1cblxuICAgIGdlbmVyYXRlQXJyYXlGaWVsZChmaWVsZENvbmZpZywgYXJyYXlDb25maWcsIGRhdGE/KSB7XG4gICAgICAgIGxldCBhcnJheSA9IFtdXG4gICAgICAgIGxldCBsZW5ndGggPSB1dGlscy5maWVsZEFycmF5Q2FsY0xlbmd0aChhcnJheUNvbmZpZylcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJyYXkucHVzaCh0aGlzLmdlbmVyYXRlRmllbGQoZmllbGRDb25maWcsIGRhdGEpKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheVxuICAgIH1cblxuICAgIGdlbmVyYXRlRmllbGQoY29uZmlnLCBvYmplY3Q/KSB7XG4gICAgICAgIGlmIChjb25maWcuZmFrZXIpe1xuICAgICAgICAgICAgbGV0IHNwbGl0ID0gY29uZmlnLmZha2VyLnNwbGl0KCcuJylcbiAgICAgICAgICAgIHJldHVybiAoZmFrZXIgYXMgYW55KVtzcGxpdFswXV1bc3BsaXRbMV1dLmNhbGwoKVxuICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy52YWx1ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiAoZmFrZXIgYXMgYW55KS5yYW5kb20uYXJyYXlFbGVtZW50KGNvbmZpZy52YWx1ZXMpXG4gICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLmZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBsZXQgZGIgPSB0aGlzLmRhdGFcbiAgICAgICAgICAgIHJldHVybiBjb25maWcuZnVuY3Rpb24uY2FsbCh7b2JqZWN0LCBmYWtlciwgZGJ9KVxuICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5zdGF0aWMpIHtcbiAgICAgICAgICAgIHJldHVybiBjb25maWcuc3RhdGljXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgfVxuXG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9pbmRleC50c1xuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImZha2VyXCIpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogZXh0ZXJuYWwgXCJmYWtlclwiXG4gKiogbW9kdWxlIGlkID0gMlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiZXhwb3J0IGNvbnN0IGVhY2ggPSBmdW5jdGlvbihhcnIsIGZuKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgKytpKSB7XG4gICAgZm4oYXJyW2ldKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaWFtTGFzdENoaWxkID0gZnVuY3Rpb24gKG9iail7XG4gICAgaWYgKCF0aGlzLmlzQXJyYXkob2JqKSkge1xuICAgICAgICBsZXQga3MgPSBPYmplY3Qua2V5cyhvYmopXG4gICAgICAgIGxldCBsYXN0ID0gbnVsbFxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBrZXkgPSBrc1tpXVxuICAgICAgICAgICAgaWYgKHRoaXMuaXNPYmplY3Qob2JqW2tleV0pKXtcbiAgICAgICAgICAgICAgICBsYXN0ID0gZmFsc2VcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsYXN0ID0gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYXN0XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBpYW1MYXN0UGFyZW50ID0gZnVuY3Rpb24gKG9iail7XG4gICAgbGV0IGtzID0gT2JqZWN0LmtleXMob2JqKVxuICAgIGxldCBsYXN0ID0gbnVsbFxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQga2V5ID0ga3NbaV1cbiAgICAgICAgaWYgKHRoaXMuaWFtTGFzdENoaWxkKG9ialtrZXldKSl7XG4gICAgICAgICAgICBsYXN0ID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGFzdCA9IGZhbHNlXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsYXN0XG59XG5cbmV4cG9ydCBjb25zdCBpc0NvbmRpdGlvbmFsID0gZnVuY3Rpb24gKHN0cjogU3RyaW5nKXtcbiAgICB2YXIgYXJyID0gc3RyLnNwbGl0KCcsJylcbiAgICBpZiAoYXJyLmxlbmd0aCA+IDEpe1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGV2YWxXaXRoQ29udGV4dERhdGEgPSAgZnVuY3Rpb24gKGtleSwgb2JqZWN0KXtcbiAgICAvLyBJbiB0aGlzIHdheSwgd2UgY2FuIHBhc3Mgb2JqZWN0IGFuZCB1c2UgaW5zaWRlIHRoZSBldmFsIHN0cmluZ1xuICAgIHJldHVybiBldmFsKGtleSlcbn1cblxuZXhwb3J0IGNvbnN0IGZpZWxkQXJyYXlDYWxjTGVuZ3RoID0gZnVuY3Rpb24gKGNvbmZpZyl7XG4gICAgaWYgKGNvbmZpZy5maXhlZExlbmd0aCl7XG4gICAgICAgIHJldHVybiBjb25maWcubGVuZ3RoXG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKE1hdGgucmFuZG9tKCkgKiBjb25maWcubGVuZ3RoKSArIDEpXG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgaXNBcnJheSA9IGZ1bmN0aW9uICh4KXtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBBcnJheV0nKXtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBjb25zdCBpc09iamVjdCA9IGZ1bmN0aW9uICh4KXtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBPYmplY3RdJyl7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvdXRpbHMudHNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9
;

@@ -1,1 +0,1 @@

require("source-map-support").install(),function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("faker")):"function"==typeof define&&define.amd?define(["faker"],t):"object"==typeof exports?exports.MockerData=t(require("faker")):e.MockerData=t(e.faker)}(this,function(__WEBPACK_EXTERNAL_MODULE_2__){return function(e){function t(n){if(r[n])return r[n].exports;var a=r[n]={exports:{},id:n,loaded:!1};return e[n].call(a.exports,a,a.exports,t),a.loaded=!0,a.exports}var r={};return t.m=e,t.c=r,t.p="",t(0)}([function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var a=r(1),i=n(a),o=function(e){return new i["default"](e)};t["default"]=o,e.exports=t["default"]},function(e,t,r){var n=r(2),a=r(3),i=function(){function e(e){this.config=e,this.data={}}return e.prototype.generate=function(e,t){var r=this,n=new Promise(function(n,a){var i=[];if(Number.isInteger(t))for(var o=0;t>o;o++)i.push(r.generateEntity(r.config[e]));else for(var u=r.config[e],f=t.uniqueField,s=u[f].values,l=s.length,o=0;l>o;o++){var c={};c[f]=s[o],i.push(r.generateEntity(r.config[e],c))}r.data[e+"s"]=i,n(r.data)});return n},e.prototype.generateEachData=function(){var e=this;return new Promise(function(t,r){for(var n=e.config,a=Object.keys(n),i=0;i<a.length;i++){var o=a[i];e.data[o+"s"]=[e.generateEntity(n[o])]}t(e.data)})},e.prototype.generateEntity=function(e,t){var r=this;void 0===t&&(t={});var n=Object.keys(e),i=t,o=Object.keys(i);return a.iamLastParent(e)&&n.map(function(t){if(-1===o.indexOf(t)){var n=e[t];if(a.isConditional(t))if(a.isArray(n)){var u=t.split(",");a.evalWithContextData(u[0],i)&&(i[u[1]]=r.generateArrayField(n[0],n[1],i))}else{var u=t.split(",");a.evalWithContextData(u[0],i)&&(i[u[1]]=r.generateField(n,i))}else a.isArray(n)?(n[0].values||n[0].faker||n[0]["function"])&&(i[t]=r.generateArrayField(n[0],n[1],i)):(n.values||n.faker||n["function"])&&(i[t]=r.generateField(n,i))}}),i},e.prototype.generateArrayField=function(e,t,r){for(var n=[],i=a.fieldArrayCalcLength(t),o=0;i>o;o++)n.push(this.generateField(e,r));return n},e.prototype.generateField=function(e,t){if(e.faker){var r=e.faker.split(".");return n[r[0]][r[1]].call()}if(e.values)return n.random.arrayElement(e.values);if(e["function"]){var a=this.data;return e["function"].call({object:t,faker:n,db:a})}return e["static"]?e["static"]:null},e}();Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=i},function(e,t){e.exports=require("faker")},function(module,exports){exports.each=function(e,t){for(var r=0;r<e.length;++r)t(e[r])},exports.iamLastChild=function(e){if(this.isArray(e))return!0;for(var t=Object.keys(e),r=null,n=0;n<t.length;n++){var a=t[n];if(this.isObject(e[a])){r=!1;break}r=!0}return r},exports.iamLastParent=function(e){for(var t=Object.keys(e),r=null,n=0;n<t.length;n++){var a=t[n];if(!this.iamLastChild(e[a])){r=!1;break}r=!0}return r},exports.isConditional=function(e){var t=e.split(",");return t.length>1?!0:!1},exports.evalWithContextData=function(key,object){return eval(key)},exports.fieldArrayCalcLength=function(e){return e.fixedLength?e.length:Math.floor(Math.random()*e.length+1)},exports.isArray=function(e){return"[object Array]"===Object.prototype.toString.call(e)?!0:!1},exports.isObject=function(e){return"[object Object]"===Object.prototype.toString.call(e)?!0:!1}}])});
!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("faker")):"function"==typeof define&&define.amd?define(["faker"],e):"object"==typeof exports?exports.MockerData=e(require("faker")):t.MockerData=e(t.faker)}(this,function(__WEBPACK_EXTERNAL_MODULE_2__){return function(t){function e(i){if(n[i])return n[i].exports;var r=n[i]={exports:{},id:i,loaded:!1};return t[i].call(r.exports,r,r.exports,e),r.loaded=!0,r.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)}([function(t,e,n){"use strict";function i(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var r=n(1),o=i(r),a=function(t){return new o["default"](t)};e["default"]=a,t.exports=e["default"]},function(t,e,n){var i=n(2),r=n(3),o=function(){function t(t){this.config=t,this.data={},this.entity={},this.initialData=null,this.path=[]}return t.prototype.generate=function(t,e){var n=this,i=[];return this.data[t+"s"]=[],new Promise(function(o,a){if(Number.isInteger(e))r.repeatFN(e,function(e){n.generateEntity(n.config[t],function(t){i.push(t),e()})},function(){n.data[t+"s"]=i,o(n.data)});else{var u=n.config[t],c=e.uniqueField,f=u[c].values;f.length;n.initialData={},r.eachSeries(f,function(e,r){n.initialData[c]={"static":e},n.generateEntity(n.config[t],function(t){i.push(t),r()})},function(){n.data[t+"s"]=i,o(n.data)})}})},t.prototype.generateEntity=function(t,e){this.entity=Object.assign({},t),this.initialData&&(this.entity=Object.assign({},t,this.initialData)),this.iterator(this.entity,function(t){e(t)})},t.prototype.iterator=function(t,e){var n=this;r.overObject(t,function(t,e,i){var o=e[t];r.iamLastChild(o)?n.generateField(o,function(o){if(r.isConditional(t)){var a=t.split(",");r.evalWithContextData(a[0],n.entity)?(e[a[1]]=o,delete n.entity[a]):delete n.entity[a]}else e[t]=o;i()}):n.iterator(o,function(){i()})},function(){e(t)})},t.prototype.generateField=function(t,e){e(r.isArray(t)?this.generateArrayField(t[0],t[1]):this.generateNormalField(t))},t.prototype.generateArrayField=function(t,e){for(var n=[],i=r.fieldArrayCalcLength(e),o=0;i>o;o++)n.push(this.generateNormalField(t));return n},t.prototype.generateNormalField=function(t){var e=this.entity,n=this.data;if(t.faker){var r=t.faker.split(".");return i[r[0]][r[1]].call()}return t.values?i.random.arrayElement(t.values):t["function"]?t["function"].call({object:e,faker:i,db:n}):t["static"]?t["static"]:null},t}();Object.defineProperty(e,"__esModule",{value:!0}),e["default"]=o},function(t,e){t.exports=require("faker")},function(module,exports){exports.each=function(t,e){for(var n=0;n<t.length;++n)e(t[n])},exports.iamLastChild=function(t){var e=this;if(this.isObject(t)){var n=Object.keys(t),i=null;return n.map(function(n){return e.isObject(t[n])?void(i=!1):void(i=!0)}),i}return!0},exports.iamLastParent=function(t){for(var e=Object.keys(t),n=null,i=0;i<e.length;i++){var r=e[i];if(t[r]&&this.iamLastChild(t[r])){n=!0;break}n=!1;break}return n},exports.isConditional=function(t){var e=t.split(",");return e.length>1?!0:!1},exports.evalWithContextData=function(key,object){return eval(key)},exports.fieldArrayCalcLength=function(t){return t.fixedLength?t.length:Math.floor(Math.random()*t.length+1)},exports.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)?!0:!1},exports.isObject=function(t){return"[object Object]"===Object.prototype.toString.call(t)?!0:!1},exports.repeatFN=function(t,e,n){var i=0,r=function(){e(function(){i+=1,i>=t?n():r()})};r()},exports.eachSeries=function(t,e,n){if(n=n||function(){},!t.length)return n();var i=0,r=function(){e(t[i],function(e){e?(n(e),n=function(){}):(i+=1,i>=t.length?n():r())})};r()},exports.overObject=function(t,e,n){n=n||function(){};var i=Object.keys(t);if(!i.length)return n();var r=0,o=function(){var a=i[r];e(a,t,function(t){t?(n(t),n=function(){}):(r+=1,r>=i.length?n():o())})};o()}}])});

@@ -1,50 +0,52 @@

{
"name": "mocker-data-generator",
"version": "0.0.4",
"description": "A simplified way to generate mock data, build over Faker",
"main": "./build/mocker.min.js",
"repository": {
{
"name": "mocker-data-generator",
"version": "0.1.1",
"description": "A simplified way to generate mock data, build over Faker",
"main": "./build/mocker.min.js",
"repository": {
"type": "git",
"url": "https://github.com/danibram/mocker-data-generator"
},
"keywords": [
"mock",
"generator"
],
"author": {
"name": "Daniel Biedma Ramos",
"email": "info@danibram.es",
"url": "dbram.co"
},
"license": "MIT",
"bugs": {
"url": "https://github.com/danibram/mocker-data-generator/issues"
},
"scripts": {
"build": "rm -rf build && npm run build:development && npm run build:production",
"build:production": "NODE_ENV=production COMPRESS=1 webpack --config webpack.config.base.js lib/main.js --target node --output-library-target umd --output-library MockerData build/mocker.min.js && echo \"gzipped, the global build is `gzip -c build/mocker.min.js | wc -c` bytes\"",
"build:development": "NODE_ENV=development webpack --config webpack.config.base.js lib/main.js --target node --output-library-target umd --output-library MockerData build/mocker.js && echo \"gzipped, the global build is `gzip -c build/mocker.js | wc -c` bytes\"",
"dev": "rm -rf build && npm run dev:watch",
"dev:watch": "webpack --watch --config webpack.config.base.js lib/main.js --target node --output-library-target umd --output-library MockerData build/mocker.js"
},
"devDependencies": {
"autoprefixer-core": "^5.2.0",
"babel-core": "^5.5.8",
"babel-loader": "^5.1.4",
"file-loader": "^0.8.4",
"jscs": "^2.1.1",
"jscs-loader": "^0.2.0",
"json-loader": "^0.5.2",
"node-libs-browser": "^0.5.2",
"script-loader": "^0.6.1",
"style-loader": "^0.12.3",
"ts-loader": "^0.5.3",
"typescript": "^1.6.2",
"webpack": "^1.12.0",
"webpack-dev-server": "^1.10.1"
},
"dependencies": {
"faker": "^3.0.1",
"source-map-support": "^0.3.2"
}
},
"keywords": [
"mock",
"generator"
],
"author": {
"name": "Daniel Biedma Ramos",
"email": "info@dbr.io",
"url": "dbr.io"
},
"license": "MIT",
"bugs": {
"url": "https://github.com/danibram/mocker-data-generator/issues"
},
"scripts": {
"build": "rm -rf build && npm run build:development && npm run build:production",
"build:production": "NODE_ENV=production COMPRESS=1 webpack --config webpack.config.base.js lib/main.js --target node --output-library-target umd --output-library MockerData build/mocker.min.js && echo \"gzipped, the global build is `gzip -c build/mocker.min.js | wc -c` bytes\"",
"build:development": "NODE_ENV=development webpack --config webpack.config.base.js lib/main.js --target node --output-library-target umd --output-library MockerData build/mocker.js && echo \"gzipped, the global build is `gzip -c build/mocker.js | wc -c` bytes\"",
"dev": "rm -rf build && npm run dev:watch",
"dev:watch": "webpack --watch --config webpack.config.base.js lib/main.js --target node --output-library-target umd --output-library MockerData build/mocker.js",
"test": "./node_modules/.bin/mocha ./test/mocker.test.js"
},
"devDependencies": {
"autoprefixer-core": "^5.2.0",
"babel-core": "^5.5.8",
"babel-loader": "^5.1.4",
"file-loader": "^0.8.4",
"jscs": "^2.1.1",
"jscs-loader": "^0.2.0",
"json-loader": "^0.5.2",
"node-libs-browser": "^0.5.2",
"script-loader": "^0.6.1",
"style-loader": "^0.12.3",
"ts-loader": "^0.5.3",
"typescript": "^1.6.2",
"webpack": "^1.12.0",
"webpack-dev-server": "^1.10.1",
"mocha": "^2.3.3",
"chai": "^3.4.0"
},
"dependencies": {
"faker": "^3.0.1"
}
}
# mocker-data-generator
A simplified way to generate masive mock data. This proyect is also to learn how to use webpack with ES6 syntax and typescript.
[![Dependency Status](https://david-dm.org/danibram/mocker-data-generator.svg)](https://david-dm.org/danibram/mocker-data-generator) [![Build Status](https://travis-ci.org/danibram/mocker-data-generator.svg)](https://travis-ci.org/danibram/mocker-data-generator)
A simplified way to generate masive mock data based on a schema.
## Getting started

@@ -72,6 +74,6 @@

Every model should contains the specified fields, ***right now not support more levels***. Every key should be the final key:
Every model should contains the specified fields. Key can be 2 types:
- ***Normal string***: indicates the key.
- ***Comaseparated string***: indicates that there is a conditional, before the coma you must specify a conditional (you have all level fields generated in this moment), then you must specify the field if the conditional is true see the example.
- ***Normal string*** key: indicates the key.
- ***Comaseparated string*** key: indicates that there is a conditional, before the coma you must specify a conditional (you have all level fields generated in this moment), then you must specify the field if the conditional is true see the example.

@@ -99,3 +101,3 @@ Inside every value you can put:

You can also pass instead of the number, an object with the a config, from now ```{uniqueField}```. If this field exists tells to the generator that instead of init a fixed length of data, generate an amount of data depending of the alues of the field you will specify. See the ouput of this example:
You can also pass instead of the number, an object with the a config, from now ```{uniqueField}```. If this field exists tells to the generator that instead of init a fixed length of data, generate an amount of data depending of the alues of the field you will specify. See the output of this example:

@@ -116,2 +118,8 @@ ```javascript

####(0.1.1)
- Real Refractor of the code
- Add support multi-level schemas
- Add tests
- Add travis support
####(0.0.1)

@@ -118,0 +126,0 @@ - First release i will update soon with tests and more examples, stay tuned!

import faker = require('faker')
import * as utils from './utils.ts'
///MAKE the config object the final object!!!!
export default class Mocker {
public data = {}
public entity = {}
public initialData = null
public path = []
constructor(private config: any) {}
generate(entity: string, options: any) {
let Phase1 = new Promise((resolve, reject) => {
var d = []
let d = []
this.data[entity + 's'] = []
return new Promise((resolve, reject) => {
if ((Number as any).isInteger(options)){
for (let i = 0; i < options; i++) {
d.push( this.generateEntity(this.config[entity]) )
}
utils.repeatFN( options,
(nxt) => {
this.generateEntity(this.config[entity], function (data) {
d.push(data)
nxt()
})
},
() => {
this.data[entity + 's'] = d
resolve(this.data)
}
)
} else {

@@ -20,75 +38,81 @@ let cfg = this.config[entity]

let length = possibleValues.length
this.initialData = {}
for (let i = 0; i < length; i++) {
let initialData = {}
initialData[f] = possibleValues[i]
d.push( this.generateEntity(this.config[entity], initialData) )
}
utils.eachSeries(
possibleValues,
(k, nxt) => {
this.initialData[f] = {static: k}
this.generateEntity(this.config[entity], (data) => {
d.push(data)
nxt()
})
},
() => {
this.data[entity + 's'] = d
resolve(this.data)
}
)
}
this.data[entity + 's'] = d
resolve(this.data)
})
return Phase1
}
generateEachData() {
return new Promise((resolve, reject) => {
let cfg = this.config
let keys = Object.keys(cfg)
generateEntity(entityConfig: Object, cb) {
this.entity = (Object as any).assign({}, entityConfig)
for (let i = 0; i < keys.length; i++) {
let key = keys[i]
this.data[key + 's'] = [this.generateEntity(cfg[key])]
}
if (this.initialData){
this.entity = (Object as any).assign({}, entityConfig, this.initialData)
}
resolve(this.data)
this.iterator (this.entity, function (object){
cb(object)
})
}
generateEntity(entityConfig: Object, initialObject: Object = {} ){
let keys = Object.keys(entityConfig)
let data = initialObject
let initialKeys = Object.keys(data)
iterator(object, cb) {
utils.overObject(
object,
(k, obj, nxt) => {
let fieldCalculated
let lvl = obj[k]
if (utils.iamLastParent(entityConfig)){
keys.map((k) => {
if (initialKeys.indexOf(k) === -1){
let field = entityConfig[k]
if (!utils.isConditional(k)){
if ( !utils.isArray(field) ){
if (field.values || field.faker || field.function) {
data[k] = this.generateField(field, data)
}
if (utils.iamLastChild(lvl)){
this.generateField(lvl, (fieldCalculated) => {
if (!utils.isConditional(k)){
obj[k] = fieldCalculated
} else {
if (field[0].values || field[0].faker || field[0].function) {
data[k] = this.generateArrayField(field[0], field[1], data)
}
}
} else {
if ( !utils.isArray(field) ){
var key = k.split(',')
if (utils.evalWithContextData(key[0], data)){
data[key[1]] = this.generateField(field, data)
if (utils.evalWithContextData(key[0], this.entity)){
obj[key[1]] = fieldCalculated
delete this.entity[key]
} else {
delete this.entity[key]
}
} else {
var key = k.split(',')
if (utils.evalWithContextData(key[0], data)){
data[key[1]] = this.generateArrayField(field[0], field[1], data)
}
}
}
nxt()
})
} else {
this.iterator(lvl, function (){
nxt()
})
}
})
},
() => {
cb(object)
}
)
}
generateField(field, cb) {
if ( utils.isArray(field) ){
cb(this.generateArrayField(field[0], field[1]))
} else {
cb(this.generateNormalField(field))
}
return data
}
generateArrayField(fieldConfig, arrayConfig, data?) {
generateArrayField(fieldConfig, arrayConfig) {
let array = []
let length = utils.fieldArrayCalcLength(arrayConfig)
for (let i = 0; i < length; i++) {
array.push(this.generateField(fieldConfig, data))
array.push(this.generateNormalField(fieldConfig))
}

@@ -98,3 +122,6 @@ return array

generateField(config, object?) {
generateNormalField(config) {
let object = this.entity
let db = this.data
if (config.faker){

@@ -106,3 +133,2 @@ let split = config.faker.split('.')

} else if (config.function) {
let db = this.data
return config.function.call({object, faker, db})

@@ -109,0 +135,0 @@ } else if (config.static) {

export const each = function(arr, fn) {
for (var i = 0; i < arr.length; ++i) {
for (let i = 0; i < arr.length; ++i) {
fn(arr[i]);

@@ -8,15 +8,13 @@ }

export const iamLastChild = function (obj){
if (!this.isArray(obj)) {
if (this.isObject(obj)) {
let ks = Object.keys(obj)
let last = null
for (let i = 0; i < ks.length; i++) {
let key = ks[i]
if (this.isObject(obj[key])){
ks.map((k) => {
if (this.isObject(obj[k])){
last = false
break
return
} else {
last = true
}
}
})
return last

@@ -34,4 +32,5 @@ } else {

let key = ks[i]
if (this.iamLastChild(obj[key])){
if (obj[key] && this.iamLastChild(obj[key])){
last = true
break
} else {

@@ -46,3 +45,3 @@ last = false

export const isConditional = function (str: String){
var arr = str.split(',')
let arr = str.split(',')
if (arr.length > 1){

@@ -56,3 +55,3 @@ return true

export const evalWithContextData = function (key, object){
// In this way, we can pass object and use inside the eval string
// In this (way, we can pass object and use inside the eval string
return eval(key)

@@ -82,1 +81,69 @@ }

}
export const repeatFN = function (times, fn, callback) {
let completed = 0;
let iterate = function () {
fn(function () {
completed += 1;
if (completed >= times) {
callback();
} else {
iterate();
}
})
}
iterate()
};
export const eachSeries = function (arr, iterator, callback) {
callback = callback || function () {};
if (!arr.length) {
return callback();
}
let completed = 0;
let iterate = function () {
iterator(arr[completed], function (err) {
if (err) {
callback(err);
callback = function () {};
}
else {
completed += 1;
if (completed >= arr.length) {
callback();
}
else {
iterate();
}
}
});
};
iterate();
};
export const overObject = function (obj, iterator, callback) {
callback = callback || function () {};
let arr = Object.keys(obj)
if (!arr.length) {
return callback();
}
let completed = 0;
let iterate = function () {
let k = arr[completed]
iterator(k, obj, function (err) {
if (err) {
callback(err);
callback = function () {};
} else {
completed += 1;
if (completed >= arr.length) {
callback();
}
else {
iterate();
}
}
});
};
iterate();
};

@@ -1,42 +0,9 @@

var mocker = require('../')
var util = require('util')
var mocker = require('../build/mocker.js')
var expect = require('chai').expect
var assert = require('chai').assert
var faker = require('faker')
var config = {
user: {
firstName: {
faker: 'name.firstName'
},
lastName: {
faker: 'name.lastName'
},
country: {
faker: 'address.country'
},
createdAt: {
faker: 'date.past'
},
username:{
function: function() {
return this.object.lastName.substring(0, 5) + this.object.firstName.substring(0, 3) + Math.floor(Math.random() * 10)
}
}
},
group: {
description: {
faker: 'lorem.paragraph'
},
users: [{
function: function() {
return this.faker.random.arrayElement(this.db.users).username
}
}, {length: 10, fixedLength: false}],
},
conditionalField: {
type:{
values: ['HOUSE', 'CAR', 'MOTORBIKE']
},
'object.type=="HOUSE",location':{
faker: 'address.city'
},
'object.type=="CAR"||object.type=="MOTORBIKE",speed':{
user:{
test:{
faker: 'random.number'

@@ -46,10 +13,266 @@ }

}
var m = mocker(config)
m.generate('user', 2)
.then(m.generate('group', 2))
.then(m.generate('conditionalField', 2))
.then(function(data) {
console.log(util.inspect(data, { depth: 10 }))
describe('Mocker: Basic', function() {
it('Should load config correctly', function() {
conf = m.config
expect(conf).to.deep.equal(config)
})
it('Should not have init data', function() {
data = m.data
expect(data).to.deep.equal({})
})
})
describe('Mocker: Methods', function() {
var methods = ['generate','generateEntity','generateArrayField','generateField']
for (var i = 0; i < methods.length; i++) {
var method = methods[i]
it('Should have ' + method, function() {
expect(m[method]).to.be.a('function')
})
}
})
describe('Mocker: Generators (Fields)', function() {
describe('Generators: Fields options', function() {
describe('Options: Faker', function() {
it('Should have faker opts (have access to faker api)', function(done) {
m.generateField({faker: 'name.findName'}, function(str) {
expect(str).to.be.a('string')
m.generateField({faker: 'random.number'}, function(number) {
expect(number).to.be.a('number')
done()
})
})
})
})
describe('Options: Static', function() {
it('Should have static opts', function(done) {
m.generateField({static: 'test'}, function(str) {
expect(str).to.be.a('string')
expect(str).to.deep.equal('test')
done()
})
})
})
describe('Options: Function', function() {
it('Should have funtion opts', function(done) {
m.generateField({
function: function() {
return 'test'
}
}, function(str) {
expect(str).to.be.a('string')
expect(str).to.deep.equal('test')
done()
})
})
it('Should call function and have {db, object, faker} injected', function(done) {
m.generateField({
function: function() {
return this
}
}, function(_this) {
expect(_this).to.be.an('object')
expect(_this.faker).to.deep.equal(faker)
assert.property(_this, 'db')
assert.property(_this, 'object')
assert.property(_this, 'faker')
done()
})
})
})
describe('Options: Values', function() {
it('Should have values opts', function(done) {
var values = ['test', 'this', 'awesome', 'module']
m.generateField({
values: values
}, function(str) {
expect(str).to.be.a('string')
assert.ok(values.indexOf(str) > -1)
done()
})
})
})
})
describe('Generators: Levels', function() {
it('Should work with conditional keys', function(done) {
var conditional = {
condition: {
static: 'a'
},
'object.condition==="a",a':{
static: 'conditionLinkedToConditionField'
},
'object.condition==="b",b':{
static: 'conditionLinkedToConditionField'
}
}
var expectedResult = {
condition: 'a',
a: 'conditionLinkedToConditionField'
}
var m = mocker({user: conditional})
m.generateEntity(conditional, function(data) {
expect(data).to.deep.equal(expectedResult)
done()
})
})
it('Should iterate over more levels', function(done) {
var userMoreLvl = {
name: {
firstName: {
static: 'firstName'
},
lastName: {
static: 'lastName'
},
much:{
more: {
level:{
awesome:{
deeper: {
static: 'yeah'
}
}
}
}
}
}
}
var expectedResult = {
name: {
firstName: 'firstName',
lastName: 'lastName',
much:{
more: {
level:{
awesome:{
deeper: 'yeah'
}
}
}
}
}
}
var m = mocker({user: userMoreLvl})
m.generateEntity(userMoreLvl, function(data) {
expect(data).to.deep.equal(expectedResult)
done()
})
})
it('Should iterate over more complex levels (deeper & function used...)', function(done) {
var userMoreLvl = {
name: {
firstName: {
static: 'firstName'
},
lastName: {
static: 'lastName'
},
much:{
deeper: {
function: function() {
return this.object.name.firstName + ' ' + this.object.name.lastName
}
},
more: {
deeper: {
function: function() {
return this.object.name.firstName + ' ' + this.object.name.lastName
}
},
level:{
deeper: {
function: function() {
return this.object.name.firstName + ' ' + this.object.name.lastName
}
},
awesome:{
deeper: {
function: function() {
return this.object.name.firstName + ' ' + this.object.name.lastName
}
},
deeper: {
function: function() {
return this.object.name.firstName + ' ' + this.object.name.lastName
}
}
}
}
}
}
}
}
var expectedResult = {
name: {
firstName: 'firstName',
lastName: 'lastName',
much:{
deeper: 'firstName lastName',
more: {
deeper: 'firstName lastName',
level:{
deeper: 'firstName lastName',
awesome:{
deeper: 'firstName lastName',
deeper: 'firstName lastName'
}
}
}
}
}
}
var m = mocker({user: userMoreLvl})
m.generateEntity(userMoreLvl, function(data) {
expect(data).to.deep.equal(expectedResult)
done()
})
})
})
describe('Generators: Entities', function() {
it('Should generate prefixed valued data', function(done) {
var length = 10
var request = {
type: {
values: []
}
}
var expectedResult = []
for (var i = 0; i < length; i++) {
var w = faker.lorem.words(1)[0]
request.type.values.push(w)
expectedResult.push({type: w})
}
var m = mocker({request: request})
m.generate('request', {uniqueField: 'type'})
.then(function(data) {
expect(data.requests).to.deep.equal(expectedResult)
expect(data.requests.length).to.equal(length)
done()
})
})
})
})

@@ -24,2 +24,3 @@ {

"src/index.ts",
"src/interfaces/index.ts",
"src/utils.ts",

@@ -26,0 +27,0 @@ "typings/es6-promise/es6-promise.d.ts",

@@ -5,6 +5,3 @@ var webpack = require('webpack')

var plugins = [
new webpack.IgnorePlugin(/\.(css|less)$/),
new webpack.BannerPlugin('require("source-map-support").install();', { raw: true, entryOnly: false })
]
var plugins = []

@@ -33,8 +30,7 @@ if (process.env.COMPRESS) {

preLoaders: [
{ test: /\.(js|jsx)$/, loaders: ['jscs'], exclude: /node_modules/ }
{ test: /\.js$/, loaders: ['jscs'], exclude: /node_modules/ }
],
loaders: [
{ test: /\.(js|jsx)$/, loaders: ['babel?stage=0'], exclude: /node_modules/ },
{ test: /\.ts(x?)$/, loaders: ['ts-loader'], exclude: /node_modules/ },
{ test: /\.json$/, loader: 'json-loader' }
{ test: /\.js$/, loaders: ['babel?stage=0'], exclude: /node_modules/ },
{ test: /\.ts$/, loaders: ['ts-loader'], exclude: /node_modules/ }
],

@@ -45,3 +41,2 @@ noParse: []

plugins: plugins,
devtool: process.env.COMPRESS ? null : 'inline-source-map',
ts: {

@@ -48,0 +43,0 @@ compiler: 'typescript'