wheel-of-fortune-participants
Version:
Easy generate files for https://github.com/finanzcheck/wheel-of-fortune
170 lines (147 loc) • 3.82 kB
JavaScript
;
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var faker = _interopDefault(require('faker'));
var fs = _interopDefault(require('fs'));
var path = _interopDefault(require('path'));
var shelljs = require('shelljs');
var Chance = _interopDefault(require('chance'));
var chance = new Chance();
const MIN = 20;
const MAX = 50;
class Generator {
/**
*
* @param {String} ext
* @param {String} filename
* @param {Number} [min]
* @param {Number} [max]
*/
constructor(ext, filename) {
let min = arguments.length <= 2 || arguments[2] === undefined ? MIN : arguments[2];
let max = arguments.length <= 3 || arguments[3] === undefined ? MAX : arguments[3];
this.ext = ext;
this._filename = filename;
this.min = min;
this.max = max;
this._participants = null;
}
/**
*
* @returns {Generator}
*/
generate() {
shelljs.mkdir('-p', path.dirname(this.filename));
fs.writeFileSync(this.filename, this, 'utf8');
return this;
}
/**
*
* @returns {String}
*/
get filename() {
const _filename = this._filename;
const ext = this.ext;
return `${ _filename }.${ ext }`;
}
/**
*
* @returns {[{name:String, spokes:Number}]}
*/
get participants() {
const _participants = this._participants;
const min = this.min;
const max = this.max;
if (null !== _participants) {
return _participants;
}
const p = () => {
let spokes = chance.integer({ min: 0, max: 79 });
let name = faker.fake('{{name.firstName}} {{name.lastName}}');
return { spokes, name };
};
let participants = [];
let i = 0,
amount = chance.integer({ min, max });
for (i; i < amount; i++) {
participants.push(p());
}
this._participants = participants;
return participants;
}
/**
*
* @returns {string}
*/
toString() {
return '';
}
/**
*
* @returns {Generator}
*/
log() {
const filename = this.filename;
const participants = this.participants;
console.log(`${ filename } successful generated with ${ participants.length } participants.`);
return this;
}
/**
*
* @param generator
* @returns {Generator}
*/
static file(generator) {
return generator.generate().log();
}
}
class GeneratorCSV extends Generator {
constructor(filename, cols) {
super('csv', filename);
this.cols = cols;
}
/**
*
* @returns {string}
*/
toString() {
let participants = super.participants.map(data => {
let p = [];
this.cols.forEach(col => {
p.push(data[col]);
});
return p.join(';');
});
return [this.cols.join(';')].concat(participants).join(require('os').EOL);
}
/**
*
* @param filename
* @param cols
* @returns {Generator}
*/
static file(filename, cols) {
return super.file(new GeneratorCSV(filename, cols));
}
}
class GeneratorJSON extends Generator {
constructor(filename) {
super('json', filename);
}
/**
*
* @returns {String}
*/
toString() {
return JSON.stringify(super.participants, null, 2);
}
/**
*
* @param filename
* @returns {Generator}
*/
static file(filename) {
return super.file(new GeneratorJSON(filename));
}
}
exports.GeneratorCSV = GeneratorCSV;
exports.GeneratorJSON = GeneratorJSON;