2020-01-16 13:40:46 +03:00
|
|
|
#!/usr/bin/env node
|
|
|
|
/**
|
2021-02-08 19:14:31 +03:00
|
|
|
* @fileoverview
|
|
|
|
* Linters for the package that can't easily be implemented in the existing
|
|
|
|
* linters (e.g. jsonlint/svglint).
|
2020-01-16 13:40:46 +03:00
|
|
|
*/
|
2021-01-15 23:47:00 +03:00
|
|
|
|
2020-12-13 23:17:41 +03:00
|
|
|
const fs = require("fs");
|
|
|
|
const path = require("path");
|
2020-01-16 13:40:46 +03:00
|
|
|
|
2020-12-13 23:17:41 +03:00
|
|
|
const { diffLinesUnified } = require("jest-diff");
|
|
|
|
|
2021-02-08 19:14:31 +03:00
|
|
|
const UTF8 = "utf8";
|
|
|
|
|
2021-05-07 20:55:06 +03:00
|
|
|
const rootDir = path.resolve(__dirname, "..", "..");
|
|
|
|
const dataFile = path.resolve(rootDir, "_data", "simple-icons.json");
|
2021-02-08 19:14:31 +03:00
|
|
|
const data = require(dataFile);
|
2020-01-16 13:40:46 +03:00
|
|
|
|
|
|
|
/**
|
2021-02-08 19:14:31 +03:00
|
|
|
* Contains our tests so they can be isolated from each other.
|
2020-01-16 13:40:46 +03:00
|
|
|
* @type {{[k:string]: () => (string|undefined)}}
|
|
|
|
*/
|
|
|
|
const TESTS = {
|
2020-12-13 23:17:41 +03:00
|
|
|
/* Tests whether our icons are in alphabetical order */
|
2020-01-16 13:40:46 +03:00
|
|
|
alphabetical: function() {
|
|
|
|
const collector = (invalidEntries, icon, index, array) => {
|
|
|
|
if (index > 0) {
|
|
|
|
const prev = array[index - 1];
|
2021-04-16 19:05:44 +03:00
|
|
|
const compare = icon.title.localeCompare(prev.title);
|
|
|
|
if (compare < 0) {
|
2020-01-16 13:40:46 +03:00
|
|
|
invalidEntries.push(icon);
|
2021-04-16 19:05:44 +03:00
|
|
|
} else if (compare === 0) {
|
|
|
|
if (prev.slug) {
|
|
|
|
if (!icon.slug || icon.slug.localeCompare(prev.slug) < 0) {
|
|
|
|
invalidEntries.push(icon);
|
|
|
|
}
|
|
|
|
}
|
2020-01-16 13:40:46 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return invalidEntries;
|
|
|
|
};
|
2021-04-16 19:05:44 +03:00
|
|
|
const format = icon => {
|
|
|
|
if (icon.slug) {
|
|
|
|
return `${icon.title} (${icon.slug})`;
|
|
|
|
}
|
|
|
|
return icon.title;
|
|
|
|
};
|
2020-01-16 13:40:46 +03:00
|
|
|
|
2021-02-08 19:14:31 +03:00
|
|
|
const invalids = data.icons.reduce(collector, []);
|
2020-01-16 13:40:46 +03:00
|
|
|
if (invalids.length) {
|
|
|
|
return `Some icons aren't in alphabetical order:
|
2021-04-16 19:05:44 +03:00
|
|
|
${invalids.map(icon => format(icon)).join(", ")}`;
|
2020-01-16 13:40:46 +03:00
|
|
|
}
|
2020-12-13 23:17:41 +03:00
|
|
|
},
|
|
|
|
|
2021-02-08 19:14:31 +03:00
|
|
|
/* Check the formatting of the data file */
|
2020-12-13 23:17:41 +03:00
|
|
|
prettified: function() {
|
2021-02-08 19:14:31 +03:00
|
|
|
const dataString = fs.readFileSync(dataFile, UTF8).replace(/\r\n/g, '\n');
|
|
|
|
const dataPretty = `${JSON.stringify(data, null, " ")}\n`;
|
|
|
|
if (dataString !== dataPretty) {
|
|
|
|
const dataDiff = diffLinesUnified(
|
|
|
|
dataString.split("\n"),
|
|
|
|
dataPretty.split("\n"),
|
|
|
|
{
|
|
|
|
expand: false,
|
|
|
|
omitAnnotationLines: true
|
|
|
|
},
|
|
|
|
);
|
|
|
|
|
|
|
|
return `Data file is formatted incorrectly:\n\n${dataDiff}`;
|
2020-12-13 23:17:41 +03:00
|
|
|
}
|
2020-01-16 13:40:46 +03:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2021-02-08 19:14:31 +03:00
|
|
|
// execute all tests and log all errors
|
2020-01-16 13:40:46 +03:00
|
|
|
const errors = Object.keys(TESTS)
|
|
|
|
.map(k => TESTS[k]())
|
|
|
|
.filter(Boolean);
|
|
|
|
|
2021-02-08 19:14:31 +03:00
|
|
|
if (errors.length > 0) {
|
|
|
|
errors.forEach(error => console.error(`\u001b[31m${error}\u001b[0m`));
|
2020-01-16 13:40:46 +03:00
|
|
|
process.exit(1);
|
|
|
|
}
|