factory-girl
Version:
A factory library for Node.js and JavaScript inspired by factory_girl
1,414 lines (1,194 loc) • 45.1 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var _slicedToArray = _interopDefault(require('babel-runtime/helpers/slicedToArray'));
var _getIterator = _interopDefault(require('babel-runtime/core-js/get-iterator'));
var _extends = _interopDefault(require('babel-runtime/helpers/extends'));
var _Promise = _interopDefault(require('babel-runtime/core-js/promise'));
var _regeneratorRuntime = _interopDefault(require('babel-runtime/regenerator'));
var _asyncToGenerator = _interopDefault(require('babel-runtime/helpers/asyncToGenerator'));
var _Object$assign = _interopDefault(require('babel-runtime/core-js/object/assign'));
var _Set = _interopDefault(require('babel-runtime/core-js/set'));
var _classCallCheck = _interopDefault(require('babel-runtime/helpers/classCallCheck'));
var _createClass = _interopDefault(require('babel-runtime/helpers/createClass'));
var _Object$keys = _interopDefault(require('babel-runtime/core-js/object/keys'));
var _typeof = _interopDefault(require('babel-runtime/helpers/typeof'));
var _Object$getPrototypeOf = _interopDefault(require('babel-runtime/core-js/object/get-prototype-of'));
var _possibleConstructorReturn = _interopDefault(require('babel-runtime/helpers/possibleConstructorReturn'));
var _inherits = _interopDefault(require('babel-runtime/helpers/inherits'));
var Chance = _interopDefault(require('chance'));
/* eslint-disable no-underscore-dangle */
function asyncPopulate(target, source) {
if ((typeof target === 'undefined' ? 'undefined' : _typeof(target)) !== 'object') {
return _Promise.reject(new Error('Invalid target passed'));
}
if ((typeof source === 'undefined' ? 'undefined' : _typeof(source)) !== 'object') {
return _Promise.reject(new Error('Invalid source passed'));
}
var promises = _Object$keys(source).map(function (attr) {
var promise = void 0;
if (Array.isArray(source[attr])) {
target[attr] = [];
promise = asyncPopulate(target[attr], source[attr]);
} else if (source[attr] === null || source[attr] === undefined) {
target[attr] = source[attr];
} else if (isPlainObject(source[attr])) {
target[attr] = target[attr] || {};
promise = asyncPopulate(target[attr], source[attr]);
} else if (typeof source[attr] === 'function') {
promise = _Promise.resolve(source[attr]()).then(function (v) {
target[attr] = v;
});
} else {
promise = _Promise.resolve(source[attr]).then(function (v) {
target[attr] = v;
});
}
return promise;
});
return _Promise.all(promises);
}
/* eslint-enable no-underscore-dangle */
var objectProto = _Object$getPrototypeOf({});
function isPlainObject(o) {
return _Object$getPrototypeOf(o) === objectProto;
}
var Factory = function () {
function Factory(Model, initializer) {
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
_classCallCheck(this, Factory);
this.name = null;
this.Model = null;
this.initializer = null;
this.options = {};
if (!Model) {
throw new Error('Invalid Model constructor passed to the factory');
}
if ((typeof initializer === 'undefined' ? 'undefined' : _typeof(initializer)) !== 'object' && typeof initializer !== 'function' || !initializer) {
throw new Error('Invalid initializer passed to the factory');
}
this.Model = Model;
this.initializer = initializer;
this.options = _extends({}, this.options, options);
}
_createClass(Factory, [{
key: 'getFactoryAttrs',
value: function getFactoryAttrs() {
var buildOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var attrs = void 0;
if (typeof this.initializer === 'function') {
attrs = this.initializer(buildOptions);
} else {
attrs = _extends({}, this.initializer);
}
return _Promise.resolve(attrs);
}
}, {
key: 'attrs',
value: function () {
var _ref = _asyncToGenerator(_regeneratorRuntime.mark(function _callee() {
var extraAttrs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var buildOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var factoryAttrs, modelAttrs, filteredAttrs;
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return this.getFactoryAttrs(buildOptions);
case 2:
factoryAttrs = _context.sent;
modelAttrs = {};
filteredAttrs = _Object$keys(factoryAttrs).reduce(function (attrs, name) {
if (!extraAttrs.hasOwnProperty(name)) attrs[name] = factoryAttrs[name];
return attrs;
}, {});
_context.next = 7;
return asyncPopulate(modelAttrs, filteredAttrs);
case 7:
_context.next = 9;
return asyncPopulate(modelAttrs, extraAttrs);
case 9:
return _context.abrupt('return', modelAttrs);
case 10:
case 'end':
return _context.stop();
}
}
}, _callee, this);
}));
function attrs() {
return _ref.apply(this, arguments);
}
return attrs;
}()
}, {
key: 'build',
value: function () {
var _ref2 = _asyncToGenerator(_regeneratorRuntime.mark(function _callee2(adapter) {
var extraAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var buildOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var modelAttrs, model;
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
_context2.next = 2;
return this.attrs(extraAttrs, buildOptions);
case 2:
modelAttrs = _context2.sent;
model = adapter.build(this.Model, modelAttrs);
return _context2.abrupt('return', this.options.afterBuild ? this.options.afterBuild(model, extraAttrs, buildOptions) : model);
case 5:
case 'end':
return _context2.stop();
}
}
}, _callee2, this);
}));
function build(_x5) {
return _ref2.apply(this, arguments);
}
return build;
}()
}, {
key: 'create',
value: function () {
var _ref3 = _asyncToGenerator(_regeneratorRuntime.mark(function _callee3(adapter) {
var _this = this;
var attrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var buildOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var model;
return _regeneratorRuntime.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
_context3.next = 2;
return this.build(adapter, attrs, buildOptions);
case 2:
model = _context3.sent;
return _context3.abrupt('return', adapter.save(model, this.Model).then(function (savedModel) {
return _this.options.afterCreate ? _this.options.afterCreate(savedModel, attrs, buildOptions) : savedModel;
}));
case 4:
case 'end':
return _context3.stop();
}
}
}, _callee3, this);
}));
function create(_x8) {
return _ref3.apply(this, arguments);
}
return create;
}()
}, {
key: 'attrsMany',
value: function attrsMany(num) {
var attrsArray = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
var buildOptionsArray = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
var attrObject = null;
var buildOptionsObject = null;
if ((typeof attrsArray === 'undefined' ? 'undefined' : _typeof(attrsArray)) === 'object' && !Array.isArray(attrsArray)) {
attrObject = attrsArray;
attrsArray = [];
}
if ((typeof buildOptionsArray === 'undefined' ? 'undefined' : _typeof(buildOptionsArray)) === 'object' && !Array.isArray(buildOptionsArray)) {
buildOptionsObject = buildOptionsArray;
buildOptionsArray = [];
}
if (typeof num !== 'number' || num < 1) {
return _Promise.reject(new Error('Invalid number of objects requested'));
}
if (!Array.isArray(attrsArray)) {
return _Promise.reject(new Error('Invalid attrsArray passed'));
}
if (!Array.isArray(buildOptionsArray)) {
return _Promise.reject(new Error('Invalid buildOptionsArray passed'));
}
attrsArray.length = buildOptionsArray.length = num;
var models = [];
for (var i = 0; i < num; i++) {
models[i] = this.attrs(attrObject || attrsArray[i] || {}, buildOptionsObject || buildOptionsArray[i] || {});
}
return _Promise.all(models);
}
}, {
key: 'buildMany',
value: function () {
var _ref4 = _asyncToGenerator(_regeneratorRuntime.mark(function _callee4(adapter, num) {
var attrsArray = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
var _this2 = this;
var buildOptionsArray = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
var buildCallbacks = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
var attrs, models;
return _regeneratorRuntime.wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
_context4.next = 2;
return this.attrsMany(num, attrsArray, buildOptionsArray);
case 2:
attrs = _context4.sent;
models = attrs.map(function (attr) {
return adapter.build(_this2.Model, attr);
});
return _context4.abrupt('return', _Promise.all(models).then(function (builtModels) {
return _this2.options.afterBuild && buildCallbacks ? _Promise.all(builtModels.map(function (builtModel) {
return _this2.options.afterBuild(builtModel, attrsArray, buildOptionsArray);
})) : builtModels;
}));
case 5:
case 'end':
return _context4.stop();
}
}
}, _callee4, this);
}));
function buildMany(_x13, _x14) {
return _ref4.apply(this, arguments);
}
return buildMany;
}()
}, {
key: 'createMany',
value: function () {
var _ref5 = _asyncToGenerator(_regeneratorRuntime.mark(function _callee5(adapter, num) {
var _this3 = this;
var attrsArray = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
var buildOptionsArray = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
var models, savedModels;
return _regeneratorRuntime.wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
if (Array.isArray(num)) {
buildOptionsArray = attrsArray;
attrsArray = num;
num = attrsArray.length;
}
_context5.next = 3;
return this.buildMany(adapter, num, attrsArray, buildOptionsArray);
case 3:
models = _context5.sent;
savedModels = models.map(function (model) {
return adapter.save(model, _this3.Model);
});
return _context5.abrupt('return', _Promise.all(savedModels).then(function (createdModels) {
return _this3.options.afterCreate ? _Promise.all(createdModels.map(function (createdModel) {
return _this3.options.afterCreate(createdModel, attrsArray, buildOptionsArray);
})) : createdModels;
}));
case 6:
case 'end':
return _context5.stop();
}
}
}, _callee5, this);
}));
function createMany(_x18, _x19) {
return _ref5.apply(this, arguments);
}
return createMany;
}()
}]);
return Factory;
}();
var Generator = function () {
function Generator(factoryGirl) {
_classCallCheck(this, Generator);
if (!factoryGirl) {
throw new Error('No FactoryGirl instance provided');
}
this.factoryGirl = factoryGirl;
}
_createClass(Generator, [{
key: 'generate',
value: function generate() {
throw new Error('Override this method to generate a value');
}
}, {
key: 'getAttribute',
value: function getAttribute(name, model, key) {
return this.factoryGirl.getAdapter(name).get(model, key);
}
}]);
return Generator;
}();
var Sequence = function (_Generator) {
_inherits(Sequence, _Generator);
function Sequence() {
_classCallCheck(this, Sequence);
return _possibleConstructorReturn(this, (Sequence.__proto__ || _Object$getPrototypeOf(Sequence)).apply(this, arguments));
}
_createClass(Sequence, [{
key: 'generate',
value: function generate() {
var id = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
if (typeof id === 'function') {
callback = id;
id = null;
}
id = id || this.id || (this.id = generateId());
Sequence.sequences[id] = Sequence.sequences[id] || 1;
var next = Sequence.sequences[id]++;
return callback ? callback(next) : next;
}
}], [{
key: 'reset',
value: function reset() {
var id = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
if (!id) {
Sequence.sequences = {};
} else {
Sequence.sequences[id] = undefined;
}
}
}]);
return Sequence;
}(Generator);
Sequence.sequences = {};
function generateId() {
var id = void 0;
var i = 0;
do {
id = '_' + i++;
} while (id in Sequence.sequences);
return id;
}
var Assoc = function (_Generator) {
_inherits(Assoc, _Generator);
function Assoc() {
_classCallCheck(this, Assoc);
return _possibleConstructorReturn(this, (Assoc.__proto__ || _Object$getPrototypeOf(Assoc)).apply(this, arguments));
}
_createClass(Assoc, [{
key: 'generate',
value: function () {
var _ref = _asyncToGenerator(_regeneratorRuntime.mark(function _callee(name) {
var key = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
var attrs = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var buildOptions = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
var model;
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return this.factoryGirl.create(name, attrs, buildOptions);
case 2:
model = _context.sent;
return _context.abrupt('return', key ? this.getAttribute(name, model, key) : model);
case 4:
case 'end':
return _context.stop();
}
}
}, _callee, this);
}));
function generate(_x) {
return _ref.apply(this, arguments);
}
return generate;
}()
}]);
return Assoc;
}(Generator);
var AssocAttrs = function (_Generator) {
_inherits(AssocAttrs, _Generator);
function AssocAttrs() {
_classCallCheck(this, AssocAttrs);
return _possibleConstructorReturn(this, (AssocAttrs.__proto__ || _Object$getPrototypeOf(AssocAttrs)).apply(this, arguments));
}
_createClass(AssocAttrs, [{
key: 'generate',
value: function () {
var _ref = _asyncToGenerator(_regeneratorRuntime.mark(function _callee(name) {
var key = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
var attrs = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var buildOptions = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
var model;
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return this.factoryGirl.attrs(name, attrs, buildOptions);
case 2:
model = _context.sent;
return _context.abrupt('return', key ? this.getAttribute(name, model, key) : model);
case 4:
case 'end':
return _context.stop();
}
}
}, _callee, this);
}));
function generate(_x) {
return _ref.apply(this, arguments);
}
return generate;
}()
}]);
return AssocAttrs;
}(Generator);
var AssocMany = function (_Generator) {
_inherits(AssocMany, _Generator);
function AssocMany() {
_classCallCheck(this, AssocMany);
return _possibleConstructorReturn(this, (AssocMany.__proto__ || _Object$getPrototypeOf(AssocMany)).apply(this, arguments));
}
_createClass(AssocMany, [{
key: 'generate',
value: function () {
var _ref = _asyncToGenerator(_regeneratorRuntime.mark(function _callee(name, num) {
var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
var _this2 = this;
var attrs = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
var buildOptions = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
var models;
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return this.factoryGirl.createMany(name, num, attrs, buildOptions);
case 2:
models = _context.sent;
return _context.abrupt('return', key ? models.map(function (model) {
return _this2.getAttribute(name, model, key);
}) : models);
case 4:
case 'end':
return _context.stop();
}
}
}, _callee, this);
}));
function generate(_x, _x2) {
return _ref.apply(this, arguments);
}
return generate;
}()
}]);
return AssocMany;
}(Generator);
var AssocAttrsMany = function (_Generator) {
_inherits(AssocAttrsMany, _Generator);
function AssocAttrsMany() {
_classCallCheck(this, AssocAttrsMany);
return _possibleConstructorReturn(this, (AssocAttrsMany.__proto__ || _Object$getPrototypeOf(AssocAttrsMany)).apply(this, arguments));
}
_createClass(AssocAttrsMany, [{
key: 'generate',
value: function () {
var _ref = _asyncToGenerator(_regeneratorRuntime.mark(function _callee(name, num) {
var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
var _this2 = this;
var attrs = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
var buildOptions = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
var models;
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (!(typeof num !== 'number' || num < 1)) {
_context.next = 2;
break;
}
throw new Error('Invalid number of items requested');
case 2:
_context.next = 4;
return this.factoryGirl.attrsMany(name, num, attrs, buildOptions);
case 4:
models = _context.sent;
return _context.abrupt('return', key ? models.map(function (model) {
return _this2.getAttribute(name, model, key);
}) : models);
case 6:
case 'end':
return _context.stop();
}
}
}, _callee, this);
}));
function generate(_x, _x2) {
return _ref.apply(this, arguments);
}
return generate;
}()
}]);
return AssocAttrsMany;
}(Generator);
var chance = new Chance();
var ChanceGenerator = function (_Generator) {
_inherits(ChanceGenerator, _Generator);
function ChanceGenerator() {
_classCallCheck(this, ChanceGenerator);
return _possibleConstructorReturn(this, (ChanceGenerator.__proto__ || _Object$getPrototypeOf(ChanceGenerator)).apply(this, arguments));
}
_createClass(ChanceGenerator, [{
key: 'generate',
value: function generate(chanceMethod) {
if (typeof chance[chanceMethod] !== 'function') {
throw new Error('Invalid chance method requested');
}
for (var _len = arguments.length, options = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
options[_key - 1] = arguments[_key];
}
return chance[chanceMethod].apply(chance, options);
}
}]);
return ChanceGenerator;
}(Generator);
var OneOf = function (_Generator) {
_inherits(OneOf, _Generator);
function OneOf() {
_classCallCheck(this, OneOf);
return _possibleConstructorReturn(this, (OneOf.__proto__ || _Object$getPrototypeOf(OneOf)).apply(this, arguments));
}
_createClass(OneOf, [{
key: 'generate',
value: function () {
var _ref = _asyncToGenerator(_regeneratorRuntime.mark(function _callee(possibleValues) {
var size, randomIndex, value;
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (Array.isArray(possibleValues)) {
_context.next = 2;
break;
}
throw new Error('Expected an array of possible values');
case 2:
if (!(possibleValues.length < 1)) {
_context.next = 4;
break;
}
throw new Error('Empty array passed for possible values');
case 4:
size = possibleValues.length;
randomIndex = Math.floor(Math.random() * size);
value = possibleValues[randomIndex];
return _context.abrupt('return', typeof value === 'function' ? value() : value);
case 8:
case 'end':
return _context.stop();
}
}
}, _callee, this);
}));
function generate(_x) {
return _ref.apply(this, arguments);
}
return generate;
}()
}]);
return OneOf;
}(Generator);
/* eslint-disable no-unused-vars */
var DefaultAdapter = function () {
function DefaultAdapter() {
_classCallCheck(this, DefaultAdapter);
}
_createClass(DefaultAdapter, [{
key: "build",
value: function build(Model, props) {
return new Model(props);
}
}, {
key: "save",
value: function () {
var _ref = _asyncToGenerator(_regeneratorRuntime.mark(function _callee(model, Model) {
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
return _context.abrupt("return", _Promise.resolve(model.save()).then(function () {
return model;
}));
case 1:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
function save(_x, _x2) {
return _ref.apply(this, arguments);
}
return save;
}()
}, {
key: "destroy",
value: function () {
var _ref2 = _asyncToGenerator(_regeneratorRuntime.mark(function _callee2(model, Model) {
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
return _context2.abrupt("return", _Promise.resolve(model.destroy()).then(function () {
return model;
}));
case 1:
case "end":
return _context2.stop();
}
}
}, _callee2, this);
}));
function destroy(_x3, _x4) {
return _ref2.apply(this, arguments);
}
return destroy;
}()
}, {
key: "get",
value: function get(model, attr, Model) {
return model.get(attr);
}
}, {
key: "set",
value: function set(props, model, Model) {
return model.set(props);
}
}]);
return DefaultAdapter;
}();
var FactoryGirl = function () {
function FactoryGirl() {
var _this = this;
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, FactoryGirl);
this.factories = {};
this.options = {};
this.adapters = {};
this.created = new _Set();
this.assoc = generatorThunk(this, Assoc);
this.assocMany = generatorThunk(this, AssocMany);
this.assocBuild = deprecate('assocBuild', 'assocAttrs');
this.assocBuildMany = deprecate('assocBuildMany', 'assocAttrsMany');
this.assocAttrs = generatorThunk(this, AssocAttrs);
this.assocAttrsMany = generatorThunk(this, AssocAttrsMany);
this.seq = this.sequence = function () {
return generatorThunk(_this, Sequence).apply(undefined, arguments);
};
this.resetSeq = this.resetSequence = function (id) {
Sequence.reset(id);
};
this.chance = generatorThunk(this, ChanceGenerator);
this.oneOf = generatorThunk(this, OneOf);
this.defaultAdapter = new DefaultAdapter();
this.options = options;
}
_createClass(FactoryGirl, [{
key: 'define',
value: function define(name, Model, initializer) {
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
if (this.getFactory(name, false)) {
throw new Error('Factory ' + name + ' already defined');
}
var factory = this.factories[name] = new Factory(Model, initializer, options);
return factory;
}
}, {
key: 'extend',
value: function extend(parent, name, childInitializer) {
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
if (this.getFactory(name, false)) {
throw new Error('Factory ' + name + ' already defined');
}
var parentFactory = this.getFactory(parent, true);
var Model = options.model || parentFactory.Model;
var jointInitializer = void 0;
function resolveInitializer(initializer, buildOptions) {
return typeof initializer === 'function' ? initializer(buildOptions) : initializer;
}
if (typeof parentFactory.initializer === 'function' || typeof childInitializer === 'function') {
jointInitializer = function initializer() {
var buildOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return _Object$assign({}, resolveInitializer(parentFactory.initializer, buildOptions), resolveInitializer(childInitializer, buildOptions));
};
} else {
jointInitializer = _Object$assign({}, parentFactory.initializer, childInitializer);
}
var factory = this.factories[name] = new Factory(Model, jointInitializer, options);
return factory;
}
}, {
key: 'attrs',
value: function () {
var _ref = _asyncToGenerator(_regeneratorRuntime.mark(function _callee(name, _attrs) {
var buildOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
return _context.abrupt('return', this.getFactory(name).attrs(_attrs, buildOptions));
case 1:
case 'end':
return _context.stop();
}
}
}, _callee, this);
}));
function attrs(_x5, _x6) {
return _ref.apply(this, arguments);
}
return attrs;
}()
}, {
key: 'build',
value: function () {
var _ref2 = _asyncToGenerator(_regeneratorRuntime.mark(function _callee2(name) {
var _this2 = this;
var attrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var buildOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var adapter;
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
adapter = this.getAdapter(name);
return _context2.abrupt('return', this.getFactory(name).build(adapter, attrs, buildOptions).then(function (model) {
return _this2.options.afterBuild ? _this2.options.afterBuild(model, attrs, buildOptions) : model;
}));
case 2:
case 'end':
return _context2.stop();
}
}
}, _callee2, this);
}));
function build(_x8) {
return _ref2.apply(this, arguments);
}
return build;
}()
}, {
key: 'create',
value: function () {
var _ref3 = _asyncToGenerator(_regeneratorRuntime.mark(function _callee3(name, attrs) {
var _this3 = this;
var buildOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var adapter;
return _regeneratorRuntime.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
adapter = this.getAdapter(name);
return _context3.abrupt('return', this.getFactory(name).create(adapter, attrs, buildOptions).then(function (createdModel) {
return _this3.addToCreatedList(adapter, createdModel);
}).then(function (model) {
return _this3.options.afterCreate ? _this3.options.afterCreate(model, attrs, buildOptions) : model;
}));
case 2:
case 'end':
return _context3.stop();
}
}
}, _callee3, this);
}));
function create(_x11, _x12) {
return _ref3.apply(this, arguments);
}
return create;
}()
}, {
key: 'attrsMany',
value: function attrsMany(name, num, attrs) {
var buildOptions = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
return this.getFactory(name).attrsMany(num, attrs, buildOptions);
}
}, {
key: 'buildMany',
value: function () {
var _ref4 = _asyncToGenerator(_regeneratorRuntime.mark(function _callee4(name, num, attrs) {
var _this4 = this;
var buildOptions = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
var adapter;
return _regeneratorRuntime.wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
adapter = this.getAdapter(name);
return _context4.abrupt('return', this.getFactory(name).buildMany(adapter, num, attrs, buildOptions).then(function (models) {
return _this4.options.afterBuild ? _Promise.all(models.map(function (model) {
return _this4.options.afterBuild(model, attrs, buildOptions);
})) : models;
}));
case 2:
case 'end':
return _context4.stop();
}
}
}, _callee4, this);
}));
function buildMany(_x15, _x16, _x17) {
return _ref4.apply(this, arguments);
}
return buildMany;
}()
}, {
key: 'createMany',
value: function () {
var _ref5 = _asyncToGenerator(_regeneratorRuntime.mark(function _callee5(name, num, attrs) {
var _this5 = this;
var buildOptions = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
var adapter;
return _regeneratorRuntime.wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
adapter = this.getAdapter(name);
return _context5.abrupt('return', this.getFactory(name).createMany(adapter, num, attrs, buildOptions).then(function (models) {
return _this5.addToCreatedList(adapter, models);
}).then(function (models) {
return _this5.options.afterCreate ? _Promise.all(models.map(function (model) {
return _this5.options.afterCreate(model, attrs, buildOptions);
})) : models;
}));
case 2:
case 'end':
return _context5.stop();
}
}
}, _callee5, this);
}));
function createMany(_x19, _x20, _x21) {
return _ref5.apply(this, arguments);
}
return createMany;
}()
}, {
key: 'getFactory',
value: function getFactory(name) {
var throwError = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
if (!this.factories[name] && throwError) {
throw new Error('Invalid factory \'' + name + '\' requested');
}
return this.factories[name];
}
}, {
key: 'withOptions',
value: function withOptions(options) {
var merge = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
this.options = merge ? _extends({}, this.options, options) : options;
}
}, {
key: 'getAdapter',
value: function getAdapter(factory) {
return factory ? this.adapters[factory] || this.defaultAdapter : this.defaultAdapter;
}
}, {
key: 'addToCreatedList',
value: function addToCreatedList(adapter, models) {
if (!Array.isArray(models)) {
this.created.add([adapter, models]);
} else {
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = _getIterator(models), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var model = _step.value;
this.created.add([adapter, model]);
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
}
return models;
}
}, {
key: 'cleanUp',
value: function cleanUp() {
var createdArray = [];
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = _getIterator(this.created), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var c = _step2.value;
createdArray.push(c);
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
var promise = createdArray.reduce(function (prev, _ref6) {
var _ref7 = _slicedToArray(_ref6, 2),
adapter = _ref7[0],
model = _ref7[1];
return prev.then(function () {
return adapter.destroy(model, model.constructor);
});
}, _Promise.resolve());
this.created.clear();
this.resetSeq();
return promise;
}
}, {
key: 'setAdapter',
value: function setAdapter(adapter) {
var _this6 = this;
var factoryNames = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
if (!factoryNames) {
this.defaultAdapter = adapter;
} else {
factoryNames = Array.isArray(factoryNames) ? factoryNames : [factoryNames];
factoryNames.forEach(function (name) {
_this6.adapters[name] = adapter;
});
}
return adapter;
}
}]);
return FactoryGirl;
}();
function generatorThunk(factoryGirl, SomeGenerator) {
var generator = new SomeGenerator(factoryGirl);
return function () {
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return function () {
return generator.generate.apply(generator, args);
};
};
}
function deprecate(method, see) {
return function () {
throw new Error('The ' + method + ' method has been deprecated, use ' + see + ' instead');
};
}
/* eslint-disable no-unused-vars */
var ObjectAdapter = function (_DefaultAdapter) {
_inherits(ObjectAdapter, _DefaultAdapter);
function ObjectAdapter() {
_classCallCheck(this, ObjectAdapter);
return _possibleConstructorReturn(this, (ObjectAdapter.__proto__ || _Object$getPrototypeOf(ObjectAdapter)).apply(this, arguments));
}
_createClass(ObjectAdapter, [{
key: 'build',
value: function build(Model, props) {
var model = new Model();
this.set(props, model, Model);
return model;
}
}, {
key: 'save',
value: function () {
var _ref = _asyncToGenerator(_regeneratorRuntime.mark(function _callee(model, Model) {
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
return _context.abrupt('return', model);
case 1:
case 'end':
return _context.stop();
}
}
}, _callee, this);
}));
function save(_x, _x2) {
return _ref.apply(this, arguments);
}
return save;
}()
}, {
key: 'destroy',
value: function () {
var _ref2 = _asyncToGenerator(_regeneratorRuntime.mark(function _callee2(model, Model) {
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
return _context2.abrupt('return', model);
case 1:
case 'end':
return _context2.stop();
}
}
}, _callee2, this);
}));
function destroy(_x3, _x4) {
return _ref2.apply(this, arguments);
}
return destroy;
}()
}, {
key: 'get',
value: function get(model, attr, Model) {
return model[attr];
}
}, {
key: 'set',
value: function set(props, model, Model) {
return _Object$assign(model, props);
}
}]);
return ObjectAdapter;
}(DefaultAdapter);
/* eslint-disable no-unused-vars */
var BookshelfAdapter = function (_DefaultAdapter) {
_inherits(BookshelfAdapter, _DefaultAdapter);
function BookshelfAdapter() {
_classCallCheck(this, BookshelfAdapter);
return _possibleConstructorReturn(this, (BookshelfAdapter.__proto__ || _Object$getPrototypeOf(BookshelfAdapter)).apply(this, arguments));
}
_createClass(BookshelfAdapter, [{
key: 'save',
value: function save(doc, Model) {
return doc.save(null, { method: 'insert' });
}
}]);
return BookshelfAdapter;
}(DefaultAdapter);
/* eslint-disable no-unused-vars */
var MongooseAdapter = function (_DefaultAdapter) {
_inherits(MongooseAdapter, _DefaultAdapter);
function MongooseAdapter() {
_classCallCheck(this, MongooseAdapter);
return _possibleConstructorReturn(this, (MongooseAdapter.__proto__ || _Object$getPrototypeOf(MongooseAdapter)).apply(this, arguments));
}
_createClass(MongooseAdapter, [{
key: 'destroy',
value: function () {
var _ref = _asyncToGenerator(_regeneratorRuntime.mark(function _callee(model, Model) {
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
return _context.abrupt('return', model.remove());
case 1:
case 'end':
return _context.stop();
}
}
}, _callee, this);
}));
function destroy(_x, _x2) {
return _ref.apply(this, arguments);
}
return destroy;
}()
}]);
return MongooseAdapter;
}(DefaultAdapter);
/* eslint-disable no-unused-vars */
var SequelizeAdapter = function (_DefaultAdapter) {
_inherits(SequelizeAdapter, _DefaultAdapter);
function SequelizeAdapter() {
_classCallCheck(this, SequelizeAdapter);
return _possibleConstructorReturn(this, (SequelizeAdapter.__proto__ || _Object$getPrototypeOf(SequelizeAdapter)).apply(this, arguments));
}
_createClass(SequelizeAdapter, [{
key: 'build',
value: function build(Model, props) {
return Model.build(props);
}
}]);
return SequelizeAdapter;
}(DefaultAdapter);
/* eslint-disable no-unused-vars */
var ReduxORMAdapter = function (_DefaultAdapter) {
_inherits(ReduxORMAdapter, _DefaultAdapter);
function ReduxORMAdapter(session) {
_classCallCheck(this, ReduxORMAdapter);
var _this = _possibleConstructorReturn(this, (ReduxORMAdapter.__proto__ || _Object$getPrototypeOf(ReduxORMAdapter)).call(this));
_this.session = session;
return _this;
}
_createClass(ReduxORMAdapter, [{
key: 'build',
value: function build(modelName, props) {
return this.session[modelName].create(props);
}
}, {
key: 'get',
value: function get(model, attr) {
return model[attr];
}
}, {
key: 'save',
value: function () {
var _ref = _asyncToGenerator(_regeneratorRuntime.mark(function _callee(model, Model) {
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
return _context.abrupt('return', model);
case 1:
case 'end':
return _context.stop();
}
}
}, _callee, this);
}));
function save(_x, _x2) {
return _ref.apply(this, arguments);
}
return save;
}()
}, {
key: 'destroy',
value: function () {
var _ref2 = _asyncToGenerator(_regeneratorRuntime.mark(function _callee2(model, Model) {
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
return _context2.abrupt('return', _Promise.resolve(model.delete()).then(function () {
return true;
}));
case 1:
case 'end':
return _context2.stop();
}
}
}, _callee2, this);
}));
function destroy(_x3, _x4) {
return _ref2.apply(this, arguments);
}
return destroy;
}()
}]);
return ReduxORMAdapter;
}(DefaultAdapter);
var factory = new FactoryGirl();
factory.FactoryGirl = FactoryGirl;
exports.ObjectAdapter = ObjectAdapter;
exports.BookshelfAdapter = BookshelfAdapter;
exports.DefaultAdapter = DefaultAdapter;
exports.MongooseAdapter = MongooseAdapter;
exports.SequelizeAdapter = SequelizeAdapter;
exports.ReduxORMAdapter = ReduxORMAdapter;
exports.factory = factory;
exports['default'] = factory;
//# sourceMappingURL=index.js.map