Files
bulma/test/plugins/check-css-variables-exist.js

87 lines
2.4 KiB
JavaScript
Raw Normal View History

2020-08-23 13:08:53 +02:00
module.exports = plugin;
const utils = require('./utils');
const fs = require('fs');
const regexAssign = /--[a-z-]*:/g;
2020-08-27 09:57:33 +02:00
const regexUsage = /var\(--[a-z-]*(\, \#|\))/g;
2020-08-23 13:08:53 +02:00
const LOG_EVERYTHING = false;
function logThis(message) {
if (LOG_EVERYTHING) {
console.log(message);
}
}
function plugin() {
return (files, metalsmith, done) => {
setImmediate(done);
let hasErrors = false;
2020-08-24 11:41:30 +02:00
const cssvars = fs.readFileSync(`../sass/themes/default.sass`, "utf8");
let defaultAssignments = cssvars.match(regexAssign);
defaultAssignments = defaultAssignments.map(assignment => assignment.replace(':', ''));
2020-08-23 13:08:53 +02:00
Object.keys(files).forEach(filePath => {
const {fileName, lines} = utils.getLines(files, filePath);
const file = files[filePath];
const contents = file.contents.toString();
const assignments = contents.match(regexAssign);
2020-08-24 11:41:30 +02:00
let fileAssignments = [];
let allAssignments = [];
2020-08-23 18:46:09 +02:00
let errorCount = 0;
2020-08-24 11:41:30 +02:00
if (assignments) {
// --foobar: ==> --foobar
fileAssignments = assignments.map(assignment => assignment.replace(':', ''));
allAssignments = [...defaultAssignments, ...fileAssignments];
} else {
2020-08-23 13:08:53 +02:00
logThis(`${filePath} has no CSS var assignments`);
2020-08-24 11:41:30 +02:00
allAssignments = [...defaultAssignments];
2020-08-23 13:08:53 +02:00
}
let usages = contents.match(regexUsage);
2020-08-23 13:08:53 +02:00
if (!usages) {
logThis(`${filePath} has no CSS var usages`);
return;
}
// var(--foobar) ==> --foobar
usages = usages.map(usage => {
usage = usage.replace('var(', '');
usage = usage.replace(')', '');
2020-08-27 09:57:33 +02:00
usage = usage.replace(', #', '');
return usage;
});
2020-08-23 13:08:53 +02:00
usages.forEach(usage => {
if (!allAssignments.includes(usage)) {
2020-08-23 13:08:53 +02:00
console.log(`${usage} is not assigned`);
errorCount++;
}
});
fileAssignments.forEach(assignment => {
if (!usages.includes(assignment)) {
console.log(`${assignment} is not used`);
errorCount++;
}
});
2020-08-23 13:08:53 +02:00
if (errorCount) {
2020-08-24 11:41:30 +02:00
console.log(`There are some errors in ${filePath}.`);
2020-08-23 18:46:09 +02:00
hasErrors = true;
2020-08-23 13:08:53 +02:00
} else {
logThis(`${filePath} is all good!`);
}
});
if (hasErrors) {
2020-08-24 11:41:30 +02:00
console.log(`There are some errors.`);
2020-08-23 13:08:53 +02:00
} else {
console.log(`All CSS variables are used and assigned correctly!`);
2020-08-23 13:08:53 +02:00
}
};
}