pvpokemon/cssConcatenator.js
2019-01-02 18:25:58 -05:00

95 lines
2.4 KiB
JavaScript

// inspired by https://github.com/lydell/source-map-concat
var fs = require('fs');
var path = require('path');
var concat = require('source-map-concat');
var glob = require('glob');
var resolveSourceMapSync = require('source-map-resolve').resolveSourceMapSync;
var createDummySourceMap = require('source-map-dummy');
// console.log(process.argv);
var sourceWorkingDirectory = null;
var sourceFiles = null;
var output = null;
var sourceMaps = false;
if (process.argv.length < 4 || process.argv.length > 6) {
throw new Error('invalid arguments');
}
process.argv.forEach(function (argument, index) {
if (index > 1) {
if (index === 2) {
sourceWorkingDirectory = argument;
} else if (index === 3) {
sourceFiles = sourceWorkingDirectory + '/' + argument;
} else if (index === 4) {
output = sourceWorkingDirectory + '/' + argument;
} else if (index === 5) {
sourceMaps = argument == 'true'; // intentionally loose ==
}
}
});
// console.log(sourceWorkingDirectory, sourceFiles, output, sourceMaps);
glob(sourceFiles, {
nodir: true,
nosort: true
}, function (error, files) {
// console.log(error, files);
// files is an array of filenames.
// If the `nonull` option is set, and nothing
// was found, then files is ["**/*.js"]
// er is an error object or null.
if (error) {
throw error;
}
sourceFiles = files.map(function(file) {
return {
source: file,
code: '/** Source: ' + file + ' */\n' + fs.readFileSync(file).toString()
}
});
if (sourceMaps) {
sourceFiles.forEach(function (file) {
var previousMap = resolveSourceMapSync(file.code, file.source, fs.readFileSync);
if (previousMap) {
file.map = previousMap.map;
file.sourcesRelativeTo = previousMap.sourcesRelativeTo;
} else {
file.map = createDummySourceMap(file.code, {
source: file.source,
type: 'css'
});
}
});
}
var concatenated = concat(sourceFiles, {
delimiter: '\n',
mapPath: sourceMaps ? output + '.map' : null
});
var outputFile = path.basename(output);
concatenated.prepend('/* Generated by cssConcatenator.js */\n');
if (sourceMaps) {
concatenated.add('\n/*# sourceMappingURL=' + outputFile + '.map*/');
}
var result = concatenated.toStringWithSourceMap({
file: outputFile
});
fs.writeFileSync(output, result.code);
if (sourceMaps) {
fs.writeFileSync(output + '.map', result.map.toString());
}
});