UNPKG

stac-node-validator

Version:
118 lines (100 loc) 3.44 kB
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;