Files
standardnotes-app/packages/desktop/scripts/fixMacZip.js

71 lines
2.2 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
*/
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 = process.argv.slice(2)[0]
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
}
})()