From 0d0728fac0efa567af4da26aa4954829a6ea21a1 Mon Sep 17 00:00:00 2001 From: toasted-nutbread Date: Fri, 18 Dec 2020 16:46:00 -0500 Subject: [PATCH] Build exclude files (#1125) * Add support for excluding files from the build process * Delete existing file before creating .zip * Exclude sw.js from non-MV3 builds --- dev/build.js | 38 ++++++++++++++++++++++++++++----- dev/data/manifest-variants.json | 14 +++++++++++- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/dev/build.js b/dev/build.js index 3d0a427b..df38e2a4 100644 --- a/dev/build.js +++ b/dev/build.js @@ -27,15 +27,18 @@ function clone(value) { return JSON.parse(JSON.stringify(value)); } -async function createZip(directory, outputFileName, sevenZipExes=[], onUpdate=null) { +async function createZip(directory, excludeFiles, outputFileName, sevenZipExes=[], onUpdate=null) { + fs.unlinkSync(outputFileName); for (const exe of sevenZipExes) { try { + const excludeArguments = excludeFiles.map((excludeFilePath) => `-x!${excludeFilePath}`); childProcess.execFileSync( exe, [ 'a', outputFileName, - '.' + '.', + ...excludeArguments ], { cwd: directory @@ -46,12 +49,13 @@ async function createZip(directory, outputFileName, sevenZipExes=[], onUpdate=nu // NOP } } - return await createJSZip(directory, outputFileName, onUpdate); + return await createJSZip(directory, excludeFiles, outputFileName, onUpdate); } -async function createJSZip(directory, outputFileName, onUpdate) { +async function createJSZip(directory, excludeFiles, outputFileName, onUpdate) { const JSZip = util.JSZip; const files = getAllFiles(directory, directory); + removeItemsFromArray(files, excludeFiles); const zip = new JSZip(); for (const fileName of files) { zip.file( @@ -75,6 +79,27 @@ async function createJSZip(directory, outputFileName, onUpdate) { fs.writeFileSync(outputFileName, data, {encoding: null, flag: 'w'}); } +function removeItemsFromArray(array, removeItems) { + for (const item of removeItems) { + const index = getIndexOfFilePath(array, item); + if (index >= 0) { + array.splice(index, 1); + } + } +} + +function getIndexOfFilePath(array, item) { + const pattern = /\\/g; + const separator = '/'; + item = item.replace(pattern, separator); + for (let i = 0, ii = array.length; i < ii; ++i) { + if (array[i].replace(pattern, separator) === item) { + return i; + } + } + return -1; +} + function applyModifications(manifest, modifications) { if (Array.isArray(modifications)) { for (const modification of modifications) { @@ -271,6 +296,9 @@ async function build(manifest, buildDir, extDir, manifestPath, variantMap, varia if (typeof variant === 'undefined') { continue; } const {name, fileName, fileCopies} = variant; + let {excludeFiles} = variant; + if (!Array.isArray(excludeFiles)) { excludeFiles = []; } + process.stdout.write(`Building ${name}...\n`); const modifiedManifest = createVariantManifest(manifest, variant, variantMap); @@ -278,7 +306,7 @@ async function build(manifest, buildDir, extDir, manifestPath, variantMap, varia const fileNameSafe = path.basename(fileName); const fullFileName = path.join(buildDir, fileNameSafe); fs.writeFileSync(manifestPath, createManifestString(modifiedManifest)); - await createZip(extDir, fullFileName, sevenZipExes, onUpdate); + await createZip(extDir, excludeFiles, fullFileName, sevenZipExes, onUpdate); if (Array.isArray(fileCopies)) { for (const fileName2 of fileCopies) { diff --git a/dev/data/manifest-variants.json b/dev/data/manifest-variants.json index 0532ab9b..43d06032 100644 --- a/dev/data/manifest-variants.json +++ b/dev/data/manifest-variants.json @@ -108,7 +108,10 @@ "variants": [ { "name": "chrome", - "fileName": "yomichan-chrome.zip" + "fileName": "yomichan-chrome.zip", + "excludeFiles": [ + "sw.js" + ] }, { "name": "chrome-dev", @@ -128,6 +131,9 @@ "patternFlags": "", "replacement": "$1. This is a development build; get the stable version here: https://tinyurl.com/yaatdjmp" } + ], + "excludeFiles": [ + "sw.js" ] }, { @@ -179,6 +185,9 @@ } } } + ], + "excludeFiles": [ + "sw.js" ] }, { @@ -205,6 +214,9 @@ "path": ["browser_specific_settings", "gecko", "id"], "value": "alex.testing@foosoft.net" } + ], + "excludeFiles": [ + "sw.js" ] } ]