UNPKG

classy-pay-core

Version:

Shared tools used in ClassyPay-related projects

204 lines 7.63 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.runPipes = exports.runScript = void 0; // tslint:disable max-classes-per-file const Getopt = require("node-getopt"); const _ = require("lodash"); const Bluebird = require("bluebird"); const mysql = require("mysql"); const fs = require("fs"); const Config_1 = __importDefault(require("../Config")); const DataSource_1 = __importDefault(require("../DataSource")); const yamljs = require('yamljs'); const runScript = (f, argDescription = '', argValidator = args => undefined) => { // Parse args const opt = Getopt.create([ ['s', 'stage=STAGE'], ['d', 'dryRun=DRYRUN'], ]).parseSystem(); const argStage = _.get(opt.options, 'stage'); if (!argStage) { // tslint:disable-next-line no-console console.error(`Please specify a stage\n` + `usage: ${process.argv[0]} ${process.argv[1]} -s|--stage stage [--d|--dryRun dryRun] ${argDescription}`); return; } if (_.includes(['int', 'staging', 'prod'], argStage) === false) { throw new Error(`Invalid stage ${argStage}`); } const stage = argStage; switch (stage) { case 'int': case 'staging': // tslint:disable-next-line no-string-literal process.env['AWS_PROFILE'] = 'classy-test'; break; case 'prod': // tslint:disable-next-line no-string-literal process.env['AWS_PROFILE'] = 'prod-pay'; break; } const argDryRun = _.get(opt.options, 'dryRun', 'true'); let dryRun = true; if (_.toLower(argDryRun) === 'false') { dryRun = false; } // Let script validate args const validateArgsResult = argValidator(opt.argv, dryRun); if (validateArgsResult) { // tslint:disable-next-line no-console console.error(`Invalid arguments to script: ${validateArgsResult}\n` + `usage: ${process.argv[0]} ${process.argv[1]} -s|--stage stage [--d|--dryRun dryRun] ${argDescription}`); return; } // Generate config const config = new Config_1.default([ new class extends DataSource_1.default { constructor() { super(...arguments); this.dir = process.env.PWD; } async initialize(config) { const environment = {}; const envJSONFile = `${this.dir}/environment.json`; if (fs.existsSync(envJSONFile)) { const jsonEnvironments = require(envJSONFile); if (jsonEnvironments) { _.merge(environment, jsonEnvironments[stage]); } } const envYAMLFile = `${this.dir}/env.yml`; if (fs.existsSync(envYAMLFile)) { const yamlEnvironments = yamljs.load(envYAMLFile); if (yamlEnvironments) { _.merge(environment, yamlEnvironments[stage]); } } this.environment = environment; } async get(key) { switch (key) { case 'stage': return stage; case 'dryRun': return dryRun; case 'args': return opt.argv; case 'dir': return this.dir; } return _.get(this.environment, key, null); } name() { return 'ScriptEnvironment'; } }(), require('../DataSources/Credstash'), require('../DataSources/Clients'), new class extends DataSource_1.default { async initialize(config) { let port; switch (await config.get('stage')) { case 'prod': port = 9306; break; case 'staging': port = 8306; break; } if (port === undefined) { throw new Error(`No port for stage ${await config.get('stage')}`); } this.port = port; this.user = await config.get('CLASSY_DB_USERNAME'); this.password = await config.get('CLASSY_DB_PASSWORD'); } async get(key) { if (key === 'stayClassyDB') { const db = Bluebird.promisifyAll(mysql.createPool({ connectionLimit: 25, host: '127.0.0.1', user: this.user, password: this.password, database: 'stayclassy', port: this.port, })); return db; } return undefined; } name() { return 'LocalDBFactories'; } }(), ]); // Run function f(config, opt.argv).catch(e => { // tslint:disable-next-line no-console console.error(e); }); }; exports.runScript = runScript; const runPipes = (setup, factory, teardown = async () => { }, argDescription = '', argValidator = args => undefined) => { (0, exports.runScript)(async (config, args) => { const context = {}; const pipeline = await factory(config, args, context); let { transforms } = pipeline; const { source, sink } = pipeline; await new Promise(async (resolve, reject) => { let called = false; try { if (!transforms) { transforms = []; } for (let i = 0; i < transforms.length; i++) { if (i === 0) { if (source) { source.pipe(transforms[i]); } } else { transforms[i - 1].pipe(transforms[i]); } } let finalStream = transforms.length > 0 ? transforms[transforms.length - 1] : undefined; if (sink) { finalStream = sink; if (transforms.length > 0) { transforms[transforms.length - 1].pipe(sink); } else if (source) { source.pipe(sink); } } if (finalStream) { finalStream.on('finish', () => { if (!called) { called = true; resolve(null); } }); } else { if (!called) { called = true; resolve(null); } } await setup(config, args, context, pipeline); } catch (e) { if (!called) { called = true; reject(e); } } }); await teardown(config, args, context, pipeline); }, argDescription, argValidator); }; exports.runPipes = runPipes; //# sourceMappingURL=ScriptHelpers.js.map