Current File : /home/pacjaorg/wpt.pacja.org/wp-content/plugins/js_composer/gulp/buildScripts.js |
const path = require('path')
const { src, dest, series } = require('gulp')
const plumber = require('gulp-plumber')
const sourcemaps = require('gulp-sourcemaps')
const uglify = require('gulp-uglify')
const concat = require('gulp-concat')
const mode = require('gulp-mode')()
const buildConfig = require('../build-config.json')
const rename = require('gulp-rename')
const fs = require('fs')
function errorHandler(err) {
console.error(err)
this.emit('end') // Continue the task stream
}
function buildJs(done, files, srcPath, destPath) {
files = files || buildConfig.uglifyList
srcPath = srcPath || buildConfig.globalOptions.js.srcPath
destPath = destPath ? path.join(destPath) : buildConfig.globalOptions.js.destPath
const tasks = files.map((entry) => {
return function buildingJsFiles () {
return src(entry.src.map((src) => {
return srcPath + src
}))
.pipe(plumber(errorHandler))
.pipe(mode.development(sourcemaps.init()))
.pipe(( mode.production( uglify() ) ))
.pipe(concat(entry.dest))
.pipe(mode.development(sourcemaps.write()))
.pipe(dest(destPath))
}
})
// Execute tasks in series
series(tasks)((error) => {
if (error) {
done(error)
} else {
done()
}
})
}
function buildJsPackages() {
const jsTasks = buildConfig.nodeModules.js.map((file) => {
return function buildingJsPackages() {
return src(path.join(buildConfig.nodeModules.srcPath, file.src))
.pipe(uglify())
.pipe(rename({ suffix: '.min' }))
.pipe(dest(path.join(buildConfig.nodeModules.srcPath, file.dest)))
}
})
return series.apply(null, jsTasks)
}
function buildModuleJsFiles(done) {
buildJs(done,
buildConfig.modules.moduleUglifyList,
buildConfig.modules.srcPath,
buildConfig.modules.srcPath
)
}
function buildModuleJsMainFile(done) {
buildJs(
done,
buildConfig.modulesMainFile.modulesMainFileUglifyList,
buildConfig.modulesMainFile.srcPath,
buildConfig.modulesMainFile.destPath
)
}
/**
* Recursively processes all JavaScript files within a given directory and its subdirectories.
* @param {string} directoryPath - The path of the directory to be processed.
* @param {function} done - Callback function to be called when processing is complete.
*/
function processJsFilesInDirectory(directoryPath, done) {
fs.readdir(directoryPath, (err, files) => {
if (err) {
console.error('Error:', err)
return done(err)
}
let pending = files.length
if (pending === 0) {
return done() // If no files, signal completion immediately
}
files.forEach((file) => {
const filePath = path.join(directoryPath, file)
fs.stat(filePath, (err, stats) => {
if (err) {
console.error('Error:', err)
done(err)
return
}
if (stats.isDirectory()) {
// If the current item is a directory, recursively process it
processJsFilesInDirectory(filePath, (err) => {
if (--pending === 0) done(err) // Call done only when all recursive calls are done
})
} else if (path.extname(file) === '.js' && !file.endsWith('.min.js')) {
processJsFile(filePath, () => {
if (--pending === 0) {
done()
}
})
} else {
if (--pending === 0) done() // Call done if no further processing is needed
}
})
})
})
}
/**
* Minifies a single JavaScript file and outputs the minified file to the same folder.
* @param {string} filePath - The path of the JavaScript file to be processed.
* @param {function} done - Callback function to be called when processing is complete.
*/
function processJsFile(filePath, done) {
const destPath = path.dirname(filePath)
const fileNameWithoutExtension = path.basename(filePath, '.js')
const destFileName = fileNameWithoutExtension + '.min.js'
src(filePath)
.pipe(plumber(errorHandler))
.pipe(mode.development(sourcemaps.init()))
.pipe(mode.production(uglify()))
.pipe(mode.development(sourcemaps.write()))
.pipe(rename(destFileName))
.pipe(dest(destPath))
.on('end', done)
}
function buildJsLibs(done) {
const srcPath = buildConfig.globalOptions.jsLibs.srcPath
processJsFilesInDirectory(srcPath, done)
}
module.exports = {
buildJs,
buildJsPackages,
buildModuleJsFiles,
buildModuleJsMainFile,
buildJsLibs
}