classy-pay-core
Version:
Shared tools used in ClassyPay-related projects
204 lines • 7.63 kB
JavaScript
;
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