2020-08-23 13:08:53 +02:00
|
|
|
module.exports = plugin;
|
|
|
|
|
|
|
|
|
|
const utils = require('./utils');
|
|
|
|
|
const fs = require('fs');
|
2020-09-06 10:28:48 +01:00
|
|
|
const regexRegisterColors = /registerCSSVarColors\((\$[a-z]+)\)/g;
|
2020-08-23 13:08:53 +02:00
|
|
|
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;
|
|
|
|
|
|
2020-09-06 10:28:48 +01:00
|
|
|
const COLOR_MAPS = {
|
|
|
|
|
'$colors': ["white", "black", "light", "dark", "primary", "link", "info", "success", "warning", "danger"],
|
|
|
|
|
'$shades': ["black-bis", "black-ter", "grey-darker", "grey-dark", "grey", "grey-light", "grey-lighter", "white-ter", "white-bis"],
|
|
|
|
|
}
|
|
|
|
|
|
2020-08-23 13:08:53 +02:00
|
|
|
function logThis(message) {
|
|
|
|
|
if (LOG_EVERYTHING) {
|
|
|
|
|
console.log(message);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-09-06 10:28:48 +01:00
|
|
|
function getFirstGroup(regexp, str) {
|
|
|
|
|
const array = [...str.matchAll(regexp)];
|
|
|
|
|
return array.map(m => m[1]);
|
|
|
|
|
}
|
|
|
|
|
|
2020-08-23 13:08:53 +02:00
|
|
|
function plugin() {
|
|
|
|
|
return (files, metalsmith, done) => {
|
|
|
|
|
setImmediate(done);
|
|
|
|
|
|
|
|
|
|
let hasErrors = false;
|
|
|
|
|
|
2020-09-06 10:28:48 +01:00
|
|
|
const cssvars = fs.readFileSync(`../sass/themes/basic.sass`, "utf8");
|
|
|
|
|
|
|
|
|
|
// Check for --cyan: #{$cyan}
|
|
|
|
|
let defaultAssignments = cssvars.match(regexAssign) || [];
|
2020-08-24 11:41:30 +02:00
|
|
|
defaultAssignments = defaultAssignments.map(assignment => assignment.replace(':', ''));
|
|
|
|
|
|
2020-09-06 10:28:48 +01:00
|
|
|
// Check for +registerCSSVarColors($colors)
|
|
|
|
|
let registerMaps = getFirstGroup(regexRegisterColors, cssvars);
|
|
|
|
|
|
|
|
|
|
if (registerMaps) {
|
|
|
|
|
registerMaps.forEach(mapName => {
|
|
|
|
|
if (mapName in COLOR_MAPS) {
|
|
|
|
|
const colors = COLOR_MAPS[mapName].map(colorName => {
|
|
|
|
|
defaultAssignments.push(`--${colorName}`);
|
|
|
|
|
defaultAssignments.push(`--${colorName}-invert`);
|
|
|
|
|
defaultAssignments.push(`--${colorName}-light`);
|
|
|
|
|
defaultAssignments.push(`--${colorName}-dark`);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
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();
|
2020-08-23 13:15:42 +02:00
|
|
|
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
|
|
|
}
|
|
|
|
|
|
2020-08-23 13:15:42 +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;
|
|
|
|
|
}
|
|
|
|
|
|
2020-08-23 13:15:42 +02:00
|
|
|
// 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(', #', '');
|
2020-08-23 13:15:42 +02:00
|
|
|
return usage;
|
|
|
|
|
});
|
|
|
|
|
|
2020-08-23 13:08:53 +02:00
|
|
|
usages.forEach(usage => {
|
2020-08-23 13:15:42 +02:00
|
|
|
if (!allAssignments.includes(usage)) {
|
2020-08-23 13:08:53 +02:00
|
|
|
console.log(`${usage} is not assigned`);
|
|
|
|
|
errorCount++;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2020-08-23 13:15:42 +02:00
|
|
|
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 {
|
2020-08-23 13:15:42 +02:00
|
|
|
console.log(`All CSS variables are used and assigned correctly!`);
|
2020-08-23 13:08:53 +02:00
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|