UNPKG

epic-formulae

Version:

Simple data store to house epic formulae

94 lines (93 loc) 3.36 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const core_1 = require("@oclif/core"); const sync_1 = require("csv-stringify/sync"); const db_1 = require("../db"); const formula_1 = require("../models/formula"); const document_1 = require("../document"); class List extends core_1.Command { constructor() { super(...arguments); this.document = new document_1.default('Formulae'); } async findAndGroupByMetre() { this.document.paragraph('Ordered by metre'); const formulae = await formula_1.Formula.find().sort({ metricalSortKey: 1 }); for (const [idx, element] of formulae.entries()) { // this.log(`Working on formula: ${element}`) const lastPrettyMetre = idx > 0 ? formulae[idx - 1].prettyMetreForGrouping : ''; if (element.prettyMetreForGrouping !== lastPrettyMetre) { this.document.heading(element.prettyMetreForGrouping); } this.document.paragraph(`${element.text} _(${element.referent})_`); } } async findAndGroupByReferent() { this.document.paragraph('Ordered by referent'); const formulae = await formula_1.Formula.find().sort({ referent: 1 }); for (const [idx, element] of formulae.entries()) { // this.log(`Working on formula: ${element}`) const lastReferent = idx > 0 ? formulae[idx - 1].referent : ''; if (element.referent !== lastReferent) { this.document.heading(element.referent); } this.document.paragraph(`${element.text} \`${element.metre}\``); } } async generateCsv(group) { const rows = [['text', 'metre', 'referent']]; const sortBy = group === 'metre' ? 'metricalSortKey' : 'referent'; const formulae = await formula_1.Formula.find().sort({ [sortBy]: 1 }); for (const formula of formulae) { rows.push([ formula.text, formula.metre, formula.referent, ]); } return (0, sync_1.stringify)(rows); } async generateMarkdown(group) { await (group === 'metre' ? this.findAndGroupByMetre() : this.findAndGroupByReferent()); return this.document.toString(); } async generate(format, group) { return (format === 'markdown' ? this.generateMarkdown(group) : this.generateCsv(group)); } writeOutput(body) { this.log(body); } async run() { const { flags } = await this.parse(List); const { format, group } = flags; await (0, db_1.connect)(); const output = await this.generate(format, group); await (0, db_1.disconnect)(); this.writeOutput(output); } } exports.default = List; List.description = 'List the formulae from the data store'; List.examples = [ 'formula list', 'formula list -g metre', 'formula list -f csv', ]; List.flags = { format: core_1.Flags.string({ char: 'f', default: 'markdown', description: 'Output format', options: ['csv', 'markdown'], }), group: core_1.Flags.string({ char: 'g', default: 'referent', description: 'Group results', options: ['metre', 'referent'], }), };