stac-node-validator
Version:
STAC Validator for NodeJS
118 lines (100 loc) • 3.44 kB
JavaScript
const fs = require('fs-extra');
const path = require('path');
const { version } = require('../package.json');
const ConfigSource = require('./config.js');
const validate = require('../src/index.js');
const { printConfig, printLint, printSummary, resolveFiles, printReport, abort } = require('./nodeUtils');
const nodeLoader = require('./loader/node');
const { getSummary, normalizePath } = require('./utils');
const lint = require('./lint');
async function run() {
console.log(`STAC Node/JS Validator v${version}\n`);
console.warn(
'Warning: Schema-based STAC validation may be incomplete and should only be considered as a first indicator of validity.\n',
);
// Read config from CLI and config file (if any)
let config = ConfigSource.fromCLI();
if (typeof config.config === 'string') {
Object.assign(config, await ConfigSource.fromFile(config.config));
}
if (!config.loader) {
config.loader = nodeLoader;
}
// Handle ignoreCerts option in Node
if (config.ignoreCerts) {
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0;
}
// Abort if no files have been provided
if (config.files.length === 0) {
abort('No path or URL specified.');
}
config.depth = config.depth >= 0 ? config.depth : -1;
// Verify files exist / read folders
const files = await resolveFiles(config.files, config.depth);
delete config.files;
for (let file in files.error) {
const error = files.error[file];
console.warn(`${file}: Can't be validated for the following reason: ${error}`);
}
let data;
if (files.files.length === 0) {
abort('No files found that are suitable for validation.');
} else if (files.files.length === 1) {
data = files.files[0];
} else {
data = files.files;
}
// Resolve schema folder
if (config.schemas) {
let stat = await fs.lstat(config.schemas);
if (stat.isDirectory()) {
config.schemas = normalizePath(config.schemas);
} else {
abort('Schema folder is not a directory');
}
}
// Print config
if (config.verbose) {
printConfig(config);
console.log();
}
if (config.lint || config.format) {
config.lintFn = async (report, config) => {
if (!report.apiList) {
report.lint = await lint(report.source, config);
if (report.lint && !report.lint.valid) {
report.valid = false;
}
}
return report;
};
}
if (config.custom) {
const absPath = path.resolve(process.cwd(), config.custom);
const validator = require(absPath);
config.customValidator = new validator();
}
// In Node, automatically enable JSON Schema 2019-09 and 2020-12 support
// (no bundle size concern in Node; browser users can opt-in via config.schemaVersions)
config.schemaVersions = {
'2019-09': require('ajv/dist/2019'),
'2020-12': require('ajv/dist/2020'),
};
// Finally run validation
const result = await validate(data, config);
// Print not a "supported error" once for API lists
if (result.apiList) {
printLint(null, config);
}
// Print report and summary
printReport(result, config);
if (config.verbose || !result.valid) {
console.log();
}
const summary = getSummary(result, config);
printSummary(summary);
// Exit with error code or report success
let errored = summary.invalid > 0 || (config.lint && !config.format && summary.malformed > 0) ? 1 : 0;
process.exit(errored);
}
module.exports = run;