Files
mattermost-mobile/scripts/generate-assets.js
2020-11-17 14:20:58 -03:00

109 lines
3.3 KiB
JavaScript

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
/* eslint-disable no-console */
const fs = require('fs');
const fsPath = require('path');
// Takes the files in rootA/path, overwrites or merges them with the corresponding file in rootB/path, and places the
// resulting file in dest/path. JSON files that exist in both places are shallowly (TODO maybe deeply) merged and all
// other types of files are overwritten.
function leftMergeDirs(rootA, rootB, dest, path) {
const pathA = rootA + path;
const pathB = rootB + path;
try {
fs.mkdirSync(dest + path, {recursive: true});
} catch (e) {
if (e.code !== 'EEXIST') {
console.error('Failed to create destination dir ' + dest + path);
console.log(e);
throw e;
}
}
for (const file of fs.readdirSync(pathA)) {
const filePathA = pathA + file;
const filePathB = pathB + file;
let stat;
try {
stat = fs.statSync(filePathA);
} catch (e) {
console.error('File ' + file + ' doesn\'t exist in ' + pathA);
throw e;
}
if (stat.isDirectory()) {
leftMergeDirs(rootA, rootB, dest, path + file + '/');
} else {
let fileA;
try {
fileA = fs.readFileSync(filePathA);
} catch (e) {
console.error('Failed to read ' + filePathA);
throw e;
}
const outPath = dest + path + file;
let out;
try {
out = fs.createWriteStream(outPath);
} catch (e) {
console.error('Failed to open output file ' + dest + path + file);
throw e;
}
let fileB = null;
try {
fileB = fs.readFileSync(filePathB);
} catch (e) {
// do nothing
}
if (fileB) {
if (file.endsWith('.json')) {
// We need to merge these files
const objA = JSON.parse(fileA);
const objB = JSON.parse(fileB);
console.log('Merging ' + filePathA + ' with ' + filePathB + ' into ' + outPath);
out.write(JSON.stringify(Object.assign({}, objA, objB)));
} else {
// Copy fileB instead of fileA
console.log('Copying ' + filePathB + ' from override to ' + outPath);
out.write(fileB);
}
} else {
// Copy fileA to the destination
console.log('Copying ' + filePathA + ' from base to ' + outPath);
out.write(fileA);
}
}
}
}
const rmdir = (path) => {
const list = fs.readdirSync(path);
for (let i = 0; i < list.length; i++) {
const filename = fsPath.join(path, list[i]);
const stat = fs.statSync(filename);
if (stat.isDirectory()) {
rmdir(filename);
} else {
fs.unlinkSync(filename);
}
}
fs.rmdirSync(path);
};
if (fs.existsSync('dist')) {
rmdir('dist');
}
// Assumes dist/assets exists and is empty
leftMergeDirs('assets/base/', 'assets/override/', 'dist/assets/', '');
/* eslint-enable no-console */