From e1ca27e9ddfb65345e80b97654116e9cfabbc256 Mon Sep 17 00:00:00 2001 From: Mintu Gogoi <127925465+Min2who@users.noreply.github.com> Date: Mon, 29 Jan 2024 23:34:16 +0530 Subject: [PATCH] fix: reduced the complexity of validate-schema.js (#483) --- scripts/validate-schemas.js | 122 +++++++++++++++--------------------- 1 file changed, 52 insertions(+), 70 deletions(-) diff --git a/scripts/validate-schemas.js b/scripts/validate-schemas.js index 200f2c52..1922a451 100644 --- a/scripts/validate-schemas.js +++ b/scripts/validate-schemas.js @@ -1,90 +1,72 @@ const fs = require('fs'); const path = require('path'); - const AjvDraft04 = require('ajv-draft-04'); const ajvDraft04 = new AjvDraft04(); - const Ajv = require('ajv'); const ajv = new Ajv(); -function validation (excludedFiles){ +function validateSchema(filePath, fileContent, schemaValidator) { + try { + const obj = JSON.parse(fileContent); + const validate = schemaValidator(obj); + const errors = validate ? [] : (obj.$schema === 'http://json-schema.org/draft-04/schema' ? ajvDraft04.errors : ajv.errors); + + return { filePath, validate, errors }; + } catch (error) { + return { + filePath, + validate: false, + errors: [{ message: `Error reading or parsing JSON Schema: ${error.message}` }], + }; + } +} - // Specify the path to the 'schemas' directory +function validation(excludedFiles) { const directoryPath = './schemas'; - try{ - + try { const files = fs.readdirSync(directoryPath); + const filteredFiles = files.filter(file => !excludedFiles.includes(file) && path.extname(file).toLowerCase() === '.json'); - // Filter files - const filteredFiles = files.filter(file => !excludedFiles.includes(file) && path.extname(file).toLowerCase() === '.json'); - - - // Collect errors in an array const validationErrors = []; - - // Iterate through the filtered files - filteredFiles.forEach(file => { - // Construct the full path to the JSON schema file - const filePath = path.join(directoryPath, file); - - try { - // Read and parse the JSON schema - const fileContent = fs.readFileSync(filePath, 'utf8'); - const obj = JSON.parse(fileContent); - - let validate; - if (obj.$schema === 'http://json-schema.org/draft-04/schema') { - // Validate the schema - validate = ajvDraft04.validateSchema(obj); - if(validate){ - console.log(`\n${file}: JSON Schema is valid!`); - } - } else { - // Validate the schema - validate = ajv.validateSchema(obj); - if(validate){ - console.log(`\n${file}: JSON Schema is valid!`); - } - } - - // Check if the schema is not valid and collect errors - if (!validate) { - validationErrors.push({ - file, - errors: obj.$schema === 'http://json-schema.org/draft-04/schema' - ? ajvDraft04.errors - : ajv.errors - }); - } - } catch (error) { - validationErrors.push({ - file, - errors: [{ message: `\nError reading or parsing JSON Schema: ${error.message}` }] - }); - } - }); - - // Print errors after processing all files - validationErrors.forEach(({ file, errors }) => { - console.error(`\n${file}: JSON Schema is not valid:`, errors); - }); - - // Exit with an error code if there are validation errors - if (validationErrors.length > 0) { - process.exit(1); + filteredFiles.forEach(file => { + const filePath = path.join(directoryPath, file); + + const schemaValidator = (obj) => { + return (obj.$schema === 'http://json-schema.org/draft-04/schema') ? ajvDraft04.validateSchema(obj) : ajv.validateSchema(obj); + }; + + const validationResult = validateSchema(filePath, fs.readFileSync(filePath, 'utf8'), schemaValidator); + + if (!validationResult.validate || validationResult.errors.length > 0) { + validationErrors.push(validationResult); + } + }); + + if (validationErrors.length > 0) { + console.error('\nValidation errors:'); + validationErrors.forEach(({ filePath, validate, errors }) => { + console.error(`${filePath}: JSON Schema is not valid:`); + + if (validate) { + console.error('Detailed Error Information:'); + errors.forEach(error => { + console.error(JSON.stringify(error, null, 2)); + }); + } else { + console.error(errors); } - - } catch (error) { - console.error('\nError during validation:', error.message); - process.exit(1); + }); + process.exit(1); } + } catch (error) { + console.error('\nError during validation:', error.message); + process.exit(1); + } } - -const excludedFiles=['2.0.0-rc1.json', '2.0.0-rc1-without-$id.json']; // added temporarily to avoid validation failure due to these two files. The schemas version are incorrect in these and needs to be fixed. +const excludedFiles = ['2.0.0-rc1.json', '2.0.0-rc1-without-$id.json']; // added temporarily to avoid validation failure due to these two files. The schemas version are incorrect in these and needs to be fixed. validation(excludedFiles); - -console.log('\nValidation completed successfully.'); \ No newline at end of file +console.log('\nValidation completed successfully.');