apantle/awsome-factory-associator

View on GitHub
lib/Factory.js

Summary

Maintainability
A
0 mins
Test Coverage
const path = require('path');
const require_tree = require('require-tree');
const Definition = require('./Definition');

class Factory {
  constructor() {
    this.definitions = {};
    for (const method of ['build', 'create']) {
      Factory.prototype[method] = (name, options) => {
        const definition = this.createDefinitionFromTemplate(name, options);

        return definition[method]();
      };
    }
  }

  static defaultFolder() {
    return path.join(process.cwd(), 'test', 'factories');
  }

  define(name, model) {
    if (this.definitions[name]) {
      throw new Error('Factory name ' + name + ' already used');
    }
    this.definitions[name] = new Definition(this, name, model);
    return this.definitions[name];
  }

  createDefinitionFromTemplate(name, options) {
    if (!this.definitions[name]) {
      throw new Error('No factory defined for name ' + name);
    }
    const definitionCopy = new Definition(this.definitions[name]);

    definitionCopy.addOptionsToConfig(options);
    return definitionCopy;
  }

  load(folder) {
    folder = folder ? folder : Factory.defaultFolder();
    const definitions = require_tree(folder);

    for (const index in definitions) {
      definitions[index](this);
    }
  }
}

module.exports = Factory;