json-schema-everywhere/pajv

View on GitHub
commands/util.js

Summary

Maintainability
A
0 mins
Test Coverage
'use strict';

var anyjson = require('any-json');
var glob = require('glob');
var path = require('path');
var fs = require('fs');
var wait = require('deasync-promise');


module.exports = {
    getFiles: getFiles,
    openFile: openFile,
    logJSON: logJSON,
    compile: compile
};


function getFiles(args) {
    var files = [];
    if (Array.isArray(args)) args.forEach(_getFiles);
    else _getFiles(args);
    return files;

    function _getFiles(fileOrPattern) {
        if (glob.hasMagic(fileOrPattern)) {
            var dataFiles = glob.sync(fileOrPattern, { cwd: process.cwd() });
            files = files.concat(dataFiles);
        } else {
            files.push(fileOrPattern);
        }
    }
}

function getFormatFromFileName(filename) {
    var format = path.extname(filename).substr(1).toLowerCase();
    return format === 'yml' ? 'yaml' : format;
}


function openFile(filename, suffix){
    var file = path.resolve(process.cwd(), filename);
    try {
        var contents = fs.readFileSync(file).toString();
        var format = getFormatFromFileName(filename);
        return wait(anyjson.decode(contents, format));
    } catch(err) {
        console.error('error:  ' + err.message.replace(' module', ' ' + suffix));
        process.exit(2);
    }
}


function logJSON(mode, data, ajv) {
    switch (mode) {
        case 'json': data = JSON.stringify(data, null, '  '); break;
        case 'line': data = JSON.stringify(data); break;
        case 'no':   data = ''; break;
        case 'text': if (ajv) data = ajv.errorsText(data);
    }
    return data;
}


function compile(ajv, schemaFile) {
    var schema = openFile(schemaFile, 'schema');
    try { return ajv.compile(schema); }
    catch (err) {
        console.error('schema', schemaFile, 'is invalid');
        console.error('error:', err.message);
        process.exit(1);
    }
}