mocker-data-generator
Advanced tools
Comparing version
@@ -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. | ||
[](https://david-dm.org/danibram/mocker-data-generator) [](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! |
142
src/index.ts
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' |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
1
-50%21
16.67%1067
61.42%131
6.5%2
-33.33%49418
-14.19%16
14.29%3
50%- Removed
- Removed
- Removed
- Removed