Add a bundle script to generate a zip file for theme distribution (#1417)

This commit is contained in:
Ismail El Korchi 2020-04-30 20:15:59 +00:00 committed by GitHub
parent 572888d9cf
commit dfd1dd9e48
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 94 additions and 1 deletions

91
bin/bundle.js Normal file
View File

@ -0,0 +1,91 @@
#!/usr/bin/env node
const path = require( 'path' );
const fs = require( 'fs' );
const archiver = require('archiver');
// Contains the excluded files and folders.
const excludes = [
'.DS_Store',
'.stylelintrc.json',
'.eslintrc',
'.git',
'.gitattributes',
'.github',
'.gitignore',
'README.md',
'bin',
'composer.json',
'composer.lock',
'node_modules',
'package-lock.json',
'package.json',
'vendor',
'.travis.yml',
'phpcs.xml.dist',
'sass',
];
// The path of the zip file.
const zipPath = path.join(
__dirname,
'/../../',
path.basename(path.dirname(__dirname))
) + '.zip';
// Create a file to stream archive data to.
let output = fs.createWriteStream( zipPath );
let archive = archiver('zip', {
zlib: { level: 9 }
});
/**
* Recursively traverse the directory tree and append the files to the archive.
* @param {string} directoryPath - The path of the directory being looped through.
*/
function traverseDirectoryTree( directoryPath ) {
const files = fs.readdirSync( directoryPath );
for ( const i in files ) {
const currentPath = directoryPath + '/' + files[i];
const stats = fs.statSync( currentPath );
let relativePath = path.relative(process.cwd(), currentPath);
if ( stats.isFile() && ! excludes.includes( files[i] ) ) {
archive.file(currentPath, {
name: `${relativePath}`
});
} else if ( stats.isDirectory() && ! excludes.includes( files[i] ) ) {
traverseDirectoryTree( currentPath );
}
}
}
// Listen for all archive data to be written.
output.on('close', function () {
console.log(`Created ${path.basename(path.dirname(__dirname))}.zip of ${archive.pointer()} bytes`);
});
// Catch warnings during archiving.
archive.on('warning', function(err) {
if (err.code === 'ENOENT') {
// log warning
console.log(err);
} else {
// throw error
throw err;
}
});
// Catch errors during archiving.
archive.on('error', function(err){
throw err;
});
// Pipe archive data to the file.
archive.pipe(output);
// Append the files to the archive.
traverseDirectoryTree( '.' );
// Finalize the archive.
archive.finalize();

View File

@ -18,6 +18,7 @@
},
"devDependencies": {
"@wordpress/scripts": "^9.0.0",
"archiver": "^4.0.1",
"node-sass": "^4.14.0",
"rtlcss": "^2.5.0"
},
@ -38,6 +39,7 @@
"compile:css": "node-sass sass/style.scss style.css && node-sass sass/woocommerce.scss woocommerce.css && stylelint '*.css' --fix || true && stylelint '*.css' --fix",
"compile:rtl": "rtlcss style.css style-rtl.css",
"lint:scss": "wp-scripts lint-style 'sass/**/*.scss'",
"lint:js": "wp-scripts lint-js 'js/*.js'"
"lint:js": "wp-scripts lint-js 'js/*.js'",
"bundle": "node bin/bundle.js"
}
}