101 lines
3 KiB
JavaScript
101 lines
3 KiB
JavaScript
|
const fs = require('fs');
|
||
|
const path = require('path');
|
||
|
const readline = require('readline');
|
||
|
const utils = require('./utils.js');
|
||
|
|
||
|
exports.process = async function(root, options) {
|
||
|
const macroPrefix = options.prefix || '#';
|
||
|
const entryPoint = options.entry || '';
|
||
|
|
||
|
root = fs.realpathSync(root);
|
||
|
|
||
|
const included = [];
|
||
|
|
||
|
const processFile = async function(fileName) {
|
||
|
const fullPath = path.join(root, fileName);
|
||
|
if(included.includes(fullPath))
|
||
|
return '';
|
||
|
included.push(fullPath);
|
||
|
|
||
|
if(!fullPath.startsWith(root)) {
|
||
|
console.error('INVALID PATH: ' + fullPath);
|
||
|
return '/* *** INVALID PATH: ' + fullPath + ' */';
|
||
|
}
|
||
|
|
||
|
if(!fs.existsSync(fullPath)) {
|
||
|
console.error('FILE NOT FOUND: ' + fullPath);
|
||
|
return '/* *** FILE NOT FOUND: ' + fullPath + ' */';
|
||
|
}
|
||
|
|
||
|
const lines = readline.createInterface({
|
||
|
input: fs.createReadStream(fullPath),
|
||
|
crlfDelay: Infinity,
|
||
|
});
|
||
|
|
||
|
let output = '';
|
||
|
let lastWasEmpty = false;
|
||
|
|
||
|
if(options.showPath)
|
||
|
output += "/* *** PATH: " + fullPath + " */\n";
|
||
|
|
||
|
for await(const line of lines) {
|
||
|
const lineTrimmed = utils.trim(line);
|
||
|
if(lineTrimmed === '')
|
||
|
continue;
|
||
|
|
||
|
if(line.startsWith(macroPrefix)) {
|
||
|
const args = lineTrimmed.split(' ');
|
||
|
const macro = utils.trim(utils.trimStart(args.shift(), macroPrefix));
|
||
|
|
||
|
switch(macro) {
|
||
|
case 'comment':
|
||
|
break;
|
||
|
|
||
|
case 'include': {
|
||
|
const includePath = utils.trimEnd(args.join(' '), ';');
|
||
|
output += utils.trim(await processFile(includePath));
|
||
|
output += "\n";
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
default:
|
||
|
output += line;
|
||
|
output += "\n";
|
||
|
break;
|
||
|
}
|
||
|
} else {
|
||
|
output += line;
|
||
|
output += "\n";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return output;
|
||
|
};
|
||
|
|
||
|
return await processFile(entryPoint);
|
||
|
};
|
||
|
|
||
|
exports.housekeep = function(assetsPath) {
|
||
|
const files = fs.readdirSync(assetsPath).map(fileName => {
|
||
|
const stats = fs.statSync(path.join(assetsPath, fileName));
|
||
|
return {
|
||
|
name: fileName,
|
||
|
lastMod: stats.mtimeMs,
|
||
|
};
|
||
|
}).sort((a, b) => b.lastMod - a.lastMod).map(info => info.name);
|
||
|
|
||
|
const regex = /^(.+)-([a-f0-9]+)\.(.+)$/i;
|
||
|
const counts = {};
|
||
|
|
||
|
for(const fileName of files) {
|
||
|
const match = fileName.match(regex);
|
||
|
if(match) {
|
||
|
const name = match[1] + '-' + match[3];
|
||
|
counts[name] = (counts[name] || 0) + 1;
|
||
|
|
||
|
if(counts[name] > 5)
|
||
|
fs.unlinkSync(path.join(assetsPath, fileName));
|
||
|
} else console.log(`Encountered file name in assets folder with unexpected format: ${fileName}`);
|
||
|
}
|
||
|
};
|