/* * 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; } })();