guide201
Version:
Atlas is living style-guides & pattern library static site generator with extensive CSS monitoring and components info that could be used virtually with any scss/css project
117 lines (100 loc) • 3.48 kB
JavaScript
;
const fs = require('fs');
const path = require('path');
const log = require('fancy-log');
const c = require('ansi-colors');
const projectRoot = process.cwd();
function prepareSCSSConstantsFiles(constantsSrc) {
const sourcesListRaw = Array.isArray(constantsSrc) ? constantsSrc : [constantsSrc];
let sourcesList = [];
let contaminatedSources = '';
sourcesListRaw.forEach(source => {
const file = source;
if (!fs.existsSync(file)) {
// TODO: Fix this
console.log('NO FILE' + file);
throw source;
}
sourcesList.push(file);
const content = fs.readFileSync(file, 'utf8');
contaminatedSources += content;
});
return {
constantsPaths: sourcesList,
constantsSourceString: contaminatedSources
};
}
/**
* Prepare regexps that much user defined constants. Return array of objects:
* [{
* name: 'color'
* regex: '(\$|--)color-' | '.^'
* }]
* @param declaredConstants
* @return {Array}
*/
function prepareConstants(declaredConstants) {
const constants = [
'colorPrefix',
'fontPrefix',
'scalePrefix',
'spacePrefix',
'motionPrefix',
'depthPrefix',
'breakpointPrefix'
];
let constantsList = [];
constants.forEach(constant => {
const internalConstantName = constant.replace(/Prefix/g, ''); // remove "Prefix" from "colorPrefix" string
const declaredConstantName = declaredConstants[constant];
return constantsList.push({
'name': internalConstantName,
'regex': declaredConstantName !== undefined ? '(\\$|--)' + declaredConstantName : '.^'
});
});
return constantsList;
}
/**
* Check and map configured constants to internal configuration.
* Return full or partial object depending of weather is config has error or not.
* {
* isDefined: boolean,
* constantsList: Array of objects with name-regexp | empty object if constants not defined
* ?constantsSrc: Array of absolute paths to scss settings file,
* ?constantsFile: String of scss file/s
* }
* @param config
* @return {{ isDefined: boolean, constantsList: Array }}
*/
function getDeclaredConstants(config) {
let settingsFilesData;
let result = {
'isDefined': false,
'constantsList': []
};
// Check config and FS
if (config.projectConstants === undefined) {
return result;
}
if (config.projectConstants.constantsSrc === undefined) {
if (Object.keys(config.projectConstants).length > 0) {
log(c.yellow('Warning: ') + 'It seems "projectConstants" is declared, but path to constants file' +
' ("constantsSrc") is missed. Constants could not be fetched.');
}
return result;
}
try {
settingsFilesData = prepareSCSSConstantsFiles(config.projectConstants.constantsSrc);
} catch (e) {
log(c.yellow('Warning: ') + '"projectConstants" is declared, but constants file not found (' + e +
'). Constants could not be fetched.');
return result;
}
// If all ok return full object
result.isDefined = true;
result.constantsSrc = settingsFilesData.constantsPaths;
result.constantsFile = settingsFilesData.constantsSourceString;
result.constantsList = prepareConstants(config.projectConstants);
return result;
}
module.exports = getDeclaredConstants;