#!/usr/bin/env node /** * @fileoverview Lints for the package that can't be implemented in the existing linters (e.g. jsonlint/svglint) */ const fs = require("fs"); const path = require("path"); const { diffLinesUnified } = require("jest-diff"); const simpleIconsData = require("../_data/simple-icons.json"); const simpleIconsDataFile = path.resolve( __dirname, "..", "_data", "simple-icons.json"); /** * Contains our tests so they can be isolated from eachother; I don't think each test is worth its own file * @type {{[k:string]: () => (string|undefined)}} */ const TESTS = { /* Tests whether our icons are in alphabetical order */ alphabetical: function() { const collector = (invalidEntries, icon, index, array) => { if (index > 0) { const prev = array[index - 1]; if (icon.title.localeCompare(prev.title) < 0) { invalidEntries.push(icon); } } return invalidEntries; }; const invalids = simpleIconsData.icons.reduce(collector, []); if (invalids.length) { return `Some icons aren't in alphabetical order: ${invalids.map(icon => icon.title).join(", ")}`; } }, /* Check the prettification of the data file */ prettified: function() { const simpleIconsDataString = fs.readFileSync( simpleIconsDataFile, "utf8").replace(/\r\n/g, '\n'); const simpleIconsDataPretty = `${JSON.stringify(simpleIconsData, null, " ")}\n`; if (simpleIconsDataString !== simpleIconsDataPretty) { const dataDiff = diffLinesUnified(simpleIconsDataString.split("\n"), simpleIconsDataPretty.split("\n"), { expand: false, omitAnnotationLines: true }); return `Data file is not prettified:\n\n${dataDiff}`; } } }; // execute all tests and log potential errors const errors = Object.keys(TESTS) .map(k => TESTS[k]()) .filter(Boolean); if (errors.length) { errors.forEach(error => { console.error(`\u001b[31m${error}\u001b[0m`); }); process.exit(1); }