/* jslint node: true */ /* eslint-disable no-console */ 'use strict'; const config = require('../../core/config.js'); const db = require('../../core/database.js'); const _ = require('lodash'); const async = require('async'); const inq = require('inquirer'); const fs = require('fs'); const hjson = require('hjson'); const log = require('../../core/logger'); const packageJson = require('../../package.json'); exports.printUsageAndSetExitCode = printUsageAndSetExitCode; exports.getDefaultConfigPath = getDefaultConfigPath; exports.getConfigPath = getConfigPath; exports.initConfigAndDatabases = initConfigAndDatabases; exports.getAreaAndStorage = getAreaAndStorage; exports.looksLikePattern = looksLikePattern; exports.getAnswers = getAnswers; exports.writeConfig = writeConfig; const HJSONStringifyCommonOpts = (exports.HJSONStringifyCommonOpts = { emitRootBraces: true, bracesSameLine: true, space: 4, keepWsc: true, quotes: 'min', eol: '\n', }); const exitCodes = (exports.ExitCodes = { SUCCESS: 0, ERROR: -1, BAD_COMMAND: -2, BAD_ARGS: -3, }); const argv = (exports.argv = require('minimist')(process.argv.slice(2), { alias: { h: 'help', v: 'version', c: 'config', n: 'no-prompt', }, })); function printUsageAndSetExitCode(errMsg, exitCode) { if (_.isUndefined(exitCode)) { exitCode = exitCodes.ERROR; } process.exitCode = exitCode; if (errMsg) { console.error(errMsg); } } function getDefaultConfigPath() { return './config/'; } function getConfigPath() { const baseConfigPath = argv.config ? argv.config : config.Config.getDefaultPath(); return baseConfigPath + 'config.hjson'; } function initConfig(cb) { const configPath = getConfigPath(); config.Config.create(configPath, { keepWsc: true, hotReload: false }, cb); } function initConfigAndDatabases(cb) { async.series( [ function init(callback) { initConfig(callback); }, function initDb(callback) { log.init(); db.initializeDatabases(callback); }, function initArchiveUtil(callback) { // ensure we init ArchiveUtil without events require('../../core/archive_util').getInstance(false); // false=hotReload return callback(null); }, ], err => { return cb(err); } ); } function getAreaAndStorage(tags) { return tags.map(tag => { const parts = tag.toString().split('@'); const entry = { areaTag: parts[0], }; entry.pattern = entry.areaTag; // handy if (parts[1]) { entry.storageTag = parts[1]; } return entry; }); } function looksLikePattern(tag) { // globs can start with @ if (tag.indexOf('@') > 0) { return false; } return /[*?[\]!()+|^]/.test(tag); } function getAnswers(questions, cb) { inq.prompt(questions).then(answers => { return cb(answers); }); } function writeConfig(config, path) { config = hjson .stringify(config, HJSONStringifyCommonOpts) .replace(/%ENIG_VERSION%/g, packageJson.version) .replace(/%HJSON_VERSION%/g, hjson.version); try { fs.writeFileSync(path, config, 'utf8'); return true; } catch (e) { return false; } }