89 lines
3.2 KiB
JavaScript
89 lines
3.2 KiB
JavaScript
const process = require('node:process');
|
|
const Ajv = require('ajv');
|
|
const addFormats = require('ajv-formats');
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
const sizeOf = require('image-size');
|
|
|
|
const schema = require('./token-schema.json');
|
|
|
|
const ajv = new Ajv();
|
|
addFormats(ajv);
|
|
const validate = ajv.compile(schema);
|
|
|
|
const dataDirectoryPath = path.resolve(process.cwd(), 'data');
|
|
const iconsDirectoryPath = path.resolve(dataDirectoryPath, 'icons');
|
|
|
|
function validateJsonFile(filePath, iconUsage) {
|
|
try {
|
|
const data = JSON.parse(fs.readFileSync(filePath, 'utf8'));
|
|
const valid = validate(data);
|
|
if (valid) {
|
|
console.log(`File ${path.basename(filePath)} is valid.`);
|
|
const iconFileName = data.iconFileName.toLowerCase();
|
|
if (iconUsage[iconFileName]) {
|
|
iconUsage[iconFileName]++;
|
|
} else {
|
|
iconUsage[iconFileName] = 1;
|
|
}
|
|
} else {
|
|
console.log(`File ${path.basename(filePath)} is invalid:`, validate.errors);
|
|
}
|
|
} catch (error) {
|
|
console.error(`Error reading or parsing the file ${path.basename(filePath)}:`, error);
|
|
}
|
|
}
|
|
|
|
function validatePngFile(filePath, iconUsage) {
|
|
if (path.extname(filePath) !== '.png') {
|
|
throw new Error(`File ${path.basename(filePath)} is invalid: Image must be in PNG format.`);
|
|
}
|
|
|
|
const dimensions = sizeOf(filePath);
|
|
const fileName = path.basename(filePath).toLowerCase();
|
|
const MIN_SIZE = 128;
|
|
const MAX_SIZE = 1024;
|
|
if (dimensions.width !== dimensions.height || dimensions.width < MIN_SIZE || dimensions.width > MAX_SIZE) {
|
|
throw new Error(`File ${fileName} is invalid: Image must be square and at least ${MIN_SIZE}x${MIN_SIZE} pixels, Your image is ${dimensions.width}x${dimensions.height} pixels.`);
|
|
} else if (!iconUsage[fileName] || iconUsage[fileName] > 1) {
|
|
throw new Error(`File ${fileName} is invalid: Icon must be used in exactly one JSON file.`);
|
|
} else {
|
|
console.log(`File ${fileName} is valid.`);
|
|
}
|
|
}
|
|
|
|
function validateAllFilesInDirectory(directoryPath, extension, validationFunction, iconUsage) {
|
|
fs.readdir(directoryPath, (err, files) => {
|
|
if (err) {
|
|
console.error('Error reading directory:', err);
|
|
return;
|
|
}
|
|
|
|
const fileNames = new Set();
|
|
files.forEach(file => {
|
|
const filePath = path.join(directoryPath, file);
|
|
const fileName = path.basename(file, extension).toLowerCase();
|
|
|
|
if (fileNames.has(fileName)) {
|
|
console.log(`File ${file} is invalid: Duplicate file name (case insensitive).`);
|
|
} else {
|
|
fileNames.add(fileName);
|
|
if (path.extname(file) === extension) {
|
|
validationFunction(filePath, iconUsage);
|
|
}
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
function validateJsonFiles(iconUsage) {
|
|
validateAllFilesInDirectory(dataDirectoryPath, '.json', validateJsonFile, iconUsage);
|
|
}
|
|
|
|
function validatePngFiles(iconUsage) {
|
|
validateAllFilesInDirectory(iconsDirectoryPath, '.png', validatePngFile, iconUsage);
|
|
}
|
|
|
|
const iconUsage = {};
|
|
validateJsonFiles(iconUsage);
|
|
validatePngFiles(iconUsage); |