UNPKG

flamingo-carotene-pug

Version:

Provide the pug compiler used in a setup using the flamingo.me/pugtemplate render engine with integration into the flamingo-carotene-dev-server module

152 lines (112 loc) 3.52 kB
const glob = require('glob') const path = require('path') const pugBuild = (core) => { const config = core.getConfig() const cliTools = core.getCliTools() core.getJobmanager().addJob('pug', 'Pug Compile', 'pug') const files = glob.sync(config.paths.pug.src + config.pug.filesPattern) // removing duplicates... const normalizedFiles = {} for (const file of files) { const normFile = path.normalize(file) normalizedFiles[normFile] = true } let allFiles = Object.keys(normalizedFiles); if (cliTools.getOptionValue('page')) { const pageFilter = new RegExp(cliTools.getOptionValue('page')) const filteredFiles = [] for (const file of allFiles) { if (pageFilter.test(file)) { filteredFiles.push(file) } } allFiles = filteredFiles } const jobParameters = [] jobParameters.push('flamingo-carotene-pug') jobParameters.push(path.resolve(config.paths.src)) // sourceDir jobParameters.push(path.resolve(config.paths.pug.dist)) // distDir jobParameters.push(path.join(config.paths.project, 'node_modules')) // nodeDir jobParameters.push(config.pug.fileMode) // fileMode if (config.pug.useRelativeSrc) { jobParameters.push(path.resolve(config.paths.pug.src)) } else { jobParameters.push(path.resolve(config.paths.src)) } // leave 1 cpu core unused... const threadCount = (require('os').cpus().length || 2) - 1 const jobArrays = chunkifyArray(allFiles, threadCount) core.getJobmanager().setSubJobTotalCount('pug', jobArrays.length) let results = []; let errors = []; let finishedSubJobs = 0; // starting jobs... for (const jobArray of jobArrays) { const jobFileList = [] for (const file of jobArray) { jobFileList.push(path.relative(path.resolve(config.paths.src), file)) // nodeDir } const childProcess = core.getSpawner().spawnJobNpx(jobParameters.concat(jobFileList)) childProcess.stdout.on('data', function (data) { results.push(data) }) childProcess.stderr.on('data', function (data) { errors.push(data) }) childProcess.on('exit', (code) => { finishedSubJobs++ core.getJobmanager().setSubJobProgress('pug', finishedSubJobs) if (finishedSubJobs >= jobArrays.length) { core.getJobmanager().reportFinishJob('pug') const output = [].concat(results, errors).join('\n').trim() if (output.length > 0) { if (code !== 0 || errors.length > 0) { if (config.pug.breakOnError) { cliTools.error(output) core.reportError('Pug reports errors.') } else { cliTools.warn(output) core.reportBuildNotes('Pug reports notes.') } } else { cliTools.info(output) } } core.getJobmanager().finishJob('pug') } }) } } function chunkifyArray(a, n, balanced) { if (n < 2) return [a]; var len = a.length, out = [], i = 0, size; if (len % n === 0) { size = Math.floor(len / n); while (i < len) { out.push(a.slice(i, i += size)); } } else if (balanced) { while (i < len) { size = Math.ceil((len - i) / n--); out.push(a.slice(i, i += size)); } } else { n--; size = Math.floor(len / n); if (len % size === 0) size--; while (i < size * n) { out.push(a.slice(i, i += size)); } out.push(a.slice(size * n)); } return out; } module.exports = pugBuild