-
-
Notifications
You must be signed in to change notification settings - Fork 54
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix: reduced the complexity of validate-schema.js (#483)
- Loading branch information
Showing
1 changed file
with
52 additions
and
70 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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.'); | ||
console.log('\nValidation completed successfully.'); |