From dfd1dd9e48a43e002763905894110afa1f984fe2 Mon Sep 17 00:00:00 2001 From: Ismail El Korchi Date: Thu, 30 Apr 2020 20:15:59 +0000 Subject: [PATCH] Add a bundle script to generate a zip file for theme distribution (#1417) --- bin/bundle.js | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 4 ++- 2 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 bin/bundle.js diff --git a/bin/bundle.js b/bin/bundle.js new file mode 100644 index 00000000..8ba5311b --- /dev/null +++ b/bin/bundle.js @@ -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(); diff --git a/package.json b/package.json index 6a3abd37..c632f656 100644 --- a/package.json +++ b/package.json @@ -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" } }