1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55const express = require('express');
const bodyParser = require('body-parser');
const convertAxeResultsToEqualifySchema = require('./converters/axe-core');
const Ajv = require('ajv');
const fs = require('fs');
const path = require('path');
const app = express();
const port = 3000;
// Initialize AJV and load the Equalify Schema schema
const ajv = new Ajv({ allErrors: true });
const equalifySchema = JSON.parse(fs.readFileSync(path.join(__dirname, 'equalify-schema.json'), 'utf-8'));
app.use(bodyParser.json());
app.post('/api/reformat', (req, res) => {
const axeResults = req.body;
// Convert axe-core results to Equalify Schema format
const equalifyData = convertAxeResultsToEqualifySchema(axeResults);
// Validate the converted data against the Equalify Schema schema
const validate = ajv.compile(equalifySchema);
const valid = validate(equalifyData);
// Custom validation for unique nodes, tags, urls, and messages with types
const uniqueNodes = new Set();
const uniqueTags = new Set();
const uniqueMessages = new Set();
// Use a combination of HTML and targets to identify unique nodes
equalifyData.nodes.forEach(n => uniqueNodes.add(`${n.html}::${n.targets.join(',')}`));
equalifyData.tags.forEach(t => uniqueTags.add(t.tag));
equalifyData.messages.forEach(m => uniqueMessages.add(`${m.message}::${m.type}`));
// Check for duplicates in the sets
const errors = [];
if (uniqueNodes.size !== equalifyData.nodes.length) errors.push({ message: "Duplicate nodes detected." });
if (uniqueTags.size !== equalifyData.tags.length) errors.push({ message: "Duplicate tags detected." });
if (uniqueMessages.size !== equalifyData.messages.length) errors.push({ message: "Duplicate messages with the same type detected." });
if (!valid || errors.length > 0) {
// If schema validation or custom validation fails, return an error response
return res.status(400).json({
message: "Validation error",
errors: validate.errors ? validate.errors.concat(errors) : errors
});
}
// If all validations pass, return the Equalify Schema data
res.json(equalifyData);
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});