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);