diff options
Diffstat (limited to 'dev/build.js')
| -rw-r--r-- | dev/build.js | 215 | 
1 files changed, 17 insertions, 198 deletions
| diff --git a/dev/build.js b/dev/build.js index 55358e59..7d670895 100644 --- a/dev/build.js +++ b/dev/build.js @@ -21,13 +21,10 @@ const assert = require('assert');  const readline = require('readline');  const childProcess = require('child_process');  const util = require('./util'); -const {getAllFiles, getDefaultManifestAndVariants, createManifestString, getArgs, testMain} = util; +const {getAllFiles, getArgs, testMain} = util; +const {ManifestUtil} = require('./manifest-util'); -function clone(value) { -    return JSON.parse(JSON.stringify(value)); -} -  async function createZip(directory, excludeFiles, outputFileName, sevenZipExes, onUpdate, dryRun) {      try {          fs.unlinkSync(outputFileName); @@ -110,179 +107,7 @@ function getIndexOfFilePath(array, item) {      return -1;  } -function applyModifications(manifest, modifications) { -    if (Array.isArray(modifications)) { -        for (const modification of modifications) { -            const {action, path: path2} = modification; -            switch (action) { -                case 'set': -                    { -                        const {value, before, after} = modification; -                        const object = getObjectProperties(manifest, path2, path2.length - 1); -                        const key = path2[path2.length - 1]; - -                        let {index} = modification; -                        if (typeof index !== 'number') { -                            index = -1; -                        } -                        if (typeof before === 'string') { -                            index = getObjectKeyIndex(object, before); -                        } -                        if (typeof after === 'string') { -                            index = getObjectKeyIndex(object, after); -                            if (index >= 0) { ++index; } -                        } - -                        setObjectKeyAtIndex(object, key, value, index); -                    } -                    break; -                case 'replace': -                    { -                        const {pattern, patternFlags, replacement} = modification; -                        const value = getObjectProperties(manifest, path2, path2.length - 1); -                        const regex = new RegExp(pattern, patternFlags); -                        const last = path2[path2.length - 1]; -                        let value2 = value[last]; -                        value2 = `${value2}`.replace(regex, replacement); -                        value[last] = value2; -                    } -                    break; -                case 'delete': -                    { -                        const value = getObjectProperties(manifest, path2, path2.length - 1); -                        const last = path2[path2.length - 1]; -                        delete value[last]; -                    } -                    break; -                case 'remove': -                    { -                        const {item} = modification; -                        const value = getObjectProperties(manifest, path2, path2.length); -                        const index = value.indexOf(item); -                        if (index >= 0) { value.splice(index, 1); } -                    } -                    break; -                case 'splice': -                    { -                        const {start, deleteCount, items} = modification; -                        const value = getObjectProperties(manifest, path2, path2.length); -                        const itemsNew = items.map((v) => clone(v)); -                        value.splice(start, deleteCount, ...itemsNew); -                    } -                    break; -                case 'copy': -                case 'move': -                    { -                        const {newPath, before, after} = modification; -                        const oldKey = path2[path2.length - 1]; -                        const newKey = newPath[newPath.length - 1]; -                        const oldObject = getObjectProperties(manifest, path2, path2.length - 1); -                        const newObject = getObjectProperties(manifest, newPath, newPath.length - 1); -                        const oldObjectIsNewObject = arraysAreSame(path2, newPath, -1); -                        const value = oldObject[oldKey]; - -                        let {index} = modification; -                        if (typeof index !== 'number' || index < 0) { -                            index = (oldObjectIsNewObject && action !== 'copy') ? getObjectKeyIndex(oldObject, oldKey) : -1; -                        } -                        if (typeof before === 'string') { -                            index = getObjectKeyIndex(newObject, before); -                        } -                        if (typeof after === 'string') { -                            index = getObjectKeyIndex(newObject, after); -                            if (index >= 0) { ++index; } -                        } - -                        setObjectKeyAtIndex(newObject, newKey, value, index); -                        if (action !== 'copy' && (!oldObjectIsNewObject || oldKey !== newKey)) { -                            delete oldObject[oldKey]; -                        } -                    } -                    break; -                case 'add': -                    { -                        const {items} = modification; -                        const value = getObjectProperties(manifest, path2, path2.length); -                        const itemsNew = items.map((v) => clone(v)); -                        value.push(...itemsNew); -                    } -                    break; -            } -        } -    } - -    return manifest; -} - -function arraysAreSame(array1, array2, lengthOffset) { -    let ii = array1.length; -    if (ii !== array2.length) { return false; } -    ii += lengthOffset; -    for (let i = 0; i < ii; ++i) { -        if (array1[i] !== array2[i]) { return false; } -    } -    return true; -} - -function getObjectKeyIndex(object, key) { -    return Object.keys(object).indexOf(key); -} - -function setObjectKeyAtIndex(object, key, value, index) { -    if (index < 0 || typeof key === 'number' || Object.prototype.hasOwnProperty.call(object, key)) { -        object[key] = value; -        return; -    } - -    const entries = Object.entries(object); -    index = Math.min(index, entries.length); -    for (let i = index, ii = entries.length; i < ii; ++i) { -        const [key2] = entries[i]; -        delete object[key2]; -    } -    entries.splice(index, 0, [key, value]); -    for (let i = index, ii = entries.length; i < ii; ++i) { -        const [key2, value2] = entries[i]; -        object[key2] = value2; -    } -} - -function getObjectProperties(object, path2, count) { -    for (let i = 0; i < count; ++i) { -        object = object[path2[i]]; -    } -    return object; -} - -function getInheritanceChain(variant, variantMap) { -    const visited = new Set(); -    const inheritance = []; -    while (true) { -        const {name, inherit} = variant; -        if (visited.has(name)) { break; } - -        visited.add(name); -        inheritance.unshift(variant); - -        if (typeof inherit !== 'string') { break; } - -        const nextVariant = variantMap.get(inherit); -        if (typeof nextVariant === 'undefined') { break; } - -        variant = nextVariant; -    } -    return inheritance; -} - -function createVariantManifest(manifest, variant, variantMap) { -    let modifiedManifest = clone(manifest); -    for (const {modifications} of getInheritanceChain(variant, variantMap)) { -        modifiedManifest = applyModifications(modifiedManifest, modifications); -    } -    return modifiedManifest; -} - -async function build(manifest, buildDir, extDir, manifestPath, variantMap, variantNames, dryRun, dryRunBuildZip) { +async function build(buildDir, extDir, manifestUtil, variantNames, manifestPath, dryRun, dryRunBuildZip) {      const sevenZipExes = ['7za', '7z'];      // Create build directory @@ -305,8 +130,8 @@ async function build(manifest, buildDir, extDir, manifestPath, variantMap, varia      };      for (const variantName of variantNames) { -        const variant = variantMap.get(variantName); -        if (typeof variant === 'undefined') { continue; } +        const variant = manifestUtil.getVariant(variantName); +        if (typeof variant === 'undefined' || variant.buildable === false) { continue; }          const {name, fileName, fileCopies} = variant;          let {excludeFiles} = variant; @@ -314,13 +139,13 @@ async function build(manifest, buildDir, extDir, manifestPath, variantMap, varia          process.stdout.write(`Building ${name}...\n`); -        const modifiedManifest = createVariantManifest(manifest, variant, variantMap); +        const modifiedManifest = manifestUtil.getManifest(variant.name);          const fileNameSafe = path.basename(fileName);          const fullFileName = path.join(buildDir, fileNameSafe);          ensureFilesExist(extDir, excludeFiles);          if (!dryRun) { -            fs.writeFileSync(manifestPath, createManifestString(modifiedManifest)); +            fs.writeFileSync(manifestPath, ManifestUtil.createManifestString(modifiedManifest));          }          if (!dryRun || dryRunBuildZip) { @@ -360,33 +185,27 @@ async function main(argv) {      const dryRun = args.get('dry-run');      const dryRunBuildZip = args.get('dry-run-build-zip'); -    const {manifest, variants} = getDefaultManifestAndVariants(); +    const manifestUtil = new ManifestUtil();      const rootDir = path.join(__dirname, '..');      const extDir = path.join(rootDir, 'ext');      const buildDir = path.join(rootDir, 'builds');      const manifestPath = path.join(extDir, 'manifest.json'); -    const variantMap = new Map(); -    for (const variant of variants) { -        variantMap.set(variant.name, variant); -    } -      try { -        const variantNames = (argv.length === 0 || args.get('all') ? variants.map(({name}) => name) : args.get(null)); -        await build(manifest, buildDir, extDir, manifestPath, variantMap, variantNames, dryRun, dryRunBuildZip); +        const variantNames = ( +            argv.length === 0 || args.get('all') ? +            manifestUtil.getVariants().filter(({buildable}) => buildable !== false).map(({name}) => name) : +            args.get(null) +        ); +        await build(buildDir, extDir, manifestUtil, variantNames, manifestPath, dryRun, dryRunBuildZip);      } finally {          // Restore manifest -        let restoreManifest = manifest; -        if (!args.get('default') && args.get('manifest') !== null) { -            const variant = variantMap.get(args.get('manifest')); -            if (typeof variant !== 'undefined') { -                restoreManifest = createVariantManifest(manifest, variant, variantMap); -            } -        } +        const manifestName = (!args.get('default') && args.get('manifest') !== null) ? args.get('manifest') : null; +        const restoreManifest = manifestUtil.getManifest(manifestName);          process.stdout.write('Restoring manifest...\n');          if (!dryRun) { -            fs.writeFileSync(manifestPath, createManifestString(restoreManifest)); +            fs.writeFileSync(manifestPath, ManifestUtil.createManifestString(restoreManifest));          }      }  } |