Files
standardnotes-app-web/scripts/desktop/fix-mac-zip.js
2022-06-07 11:52:15 -05:00

80 lines
2.4 KiB
JavaScript

/*
* There is an issue with electron-builder generating invalid zip files for Catalina.
* This is a script implementation of the following workaround:
* https://snippets.cacher.io/snippet/354a3eb7b0dcbe711383
*/
if (process.platform !== 'darwin') {
console.error(`this script (${__filename}) can only be run from a darwin platform.`);
process.exitCode = 1;
return;
}
const fs = require('fs');
const childProcess = require('child_process');
const yaml = require('js-yaml');
const assert = require('assert').strict;
const os = require('os');
function exec(command) {
console.log(command);
return new Promise((resolve, reject) => {
childProcess.exec(command, (err, stdout, stderr) => {
if (err) reject(err);
else if (stderr) reject(Error(stderr));
else resolve(stdout);
});
});
}
async function getBlockMapInfo(fileName) {
return JSON.parse(
await exec(
'./node_modules/app-builder-bin/mac/app-builder_amd64 blockmap' +
` -i ${fileName}` +
` -o ${os.tmpdir()}/a.zip`
)
);
}
(async () => {
try {
const { version } = JSON.parse(await fs.promises.readFile('app/package.json'));
const zipName = `standard-notes-${version}-mac-x64.zip`;
const zipPath = `dist/${zipName}`;
console.log(`Removing ${zipPath}`);
await fs.promises.unlink(zipPath);
process.chdir('dist/mac');
const appName = process.argv.includes('--beta')
? 'Standard\\ Notes\\ \\(Beta\\).app'
: 'Standard\\ Notes.app';
/** @see https://superuser.com/questions/574032/what-is-the-equivalent-unix-command-to-a-mac-osx-compress-menu-action */
await exec(`ditto -c -k --sequesterRsrc --keepParent ${appName} ../${zipName}`);
process.chdir('../..');
const [blockMapInfo, latestVersionInfo] = await Promise.all([
getBlockMapInfo(zipPath),
fs.promises.readFile('dist/latest-mac.yml').then(yaml.load),
]);
const index = latestVersionInfo.files.findIndex((file) => file.url === zipName);
assert(index >= 0);
latestVersionInfo.files[index] = {
...latestVersionInfo.files[index],
...blockMapInfo,
};
latestVersionInfo.sha512 = blockMapInfo.sha512;
console.log('Writing new size, hash and blockMap size to dist/latest-mac.yml');
await fs.promises.writeFile(
'dist/latest-mac.yml',
yaml.dump(latestVersionInfo, {
lineWidth: Infinity,
}),
'utf8'
);
} catch (err) {
console.error(err);
process.exitCode = 1;
}
})();