From 874a01922743e82a6ad7e3baad5b768a507cf1ea Mon Sep 17 00:00:00 2001 From: Fedor Indutny <79877362+indutny-signal@users.noreply.github.com> Date: Fri, 3 Dec 2021 23:49:15 +0100 Subject: [PATCH] M1 Support --- .github/workflows/ci.yml | 2 + package.json | 37 ++-- patches/@types+sharp+0.28.0.patch | 27 --- patches/app-builder-lib+22.11.7.patch | 68 ------- patches/app-builder-lib+22.14.5.patch | 26 +++ ts/build/notarize.ts | 31 +-- ts/scripts/zip-macos-release.ts | 96 ++++----- ts/test-node/updater/common_test.ts | 70 ++++--- ts/updater/common.ts | 54 +++++- ts/updater/generateSignature.ts | 33 ++-- yarn.lock | 269 +++++++++++++++----------- 11 files changed, 397 insertions(+), 316 deletions(-) delete mode 100644 patches/@types+sharp+0.28.0.patch delete mode 100644 patches/app-builder-lib+22.11.7.patch create mode 100644 patches/app-builder-lib+22.14.5.patch diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7087d2e1d6..ed10dc35f1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -59,6 +59,8 @@ jobs: - run: yarn generate - run: yarn prepare-beta-build - run: yarn build + - name: Rebuild native modules for x64 + run: yarn electron:install-app-deps - run: yarn test-node - run: yarn test-electron - run: yarn grunt test-release:osx diff --git a/package.json b/package.json index 63b13f27f8..f634dd2a37 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ }, "main": "app/main.js", "scripts": { - "postinstall": "yarn build:acknowledgments && yarn build:fuses && patch-package && electron-builder install-app-deps && rimraf node_modules/dtrace-provider", + "postinstall": "yarn build:acknowledgments && yarn build:fuses && patch-package && yarn electron:install-app-deps && rimraf node_modules/dtrace-provider", "postuninstall": "yarn build:acknowledgments", "start": "electron .", "grunt": "grunt", @@ -67,7 +67,8 @@ "build:zip": "node scripts/zip-macos-release.js", "preverify:ts": "yarn build:typed-scss", "verify": "run-p --print-label verify:*", - "verify:ts": "tsc --noEmit" + "verify:ts": "tsc --noEmit", + "electron:install-app-deps": "electron-builder install-app-deps" }, "optionalDependencies": { "fs-xattr": "0.3.0" @@ -75,7 +76,7 @@ "dependencies": { "@popperjs/core": "2.9.2", "@react-spring/web": "9.2.6", - "@signalapp/signal-client": "0.11.0", + "@signalapp/signal-client": "0.11.1", "@sindresorhus/is": "0.8.0", "@types/fabric": "4.5.3", "abort-controller": "3.0.0", @@ -161,7 +162,7 @@ "rotating-file-stream": "2.1.5", "sanitize.css": "11.0.0", "semver": "5.4.1", - "sharp": "0.28.1", + "sharp": "0.29.3", "split2": "4.0.0", "testcheck": "1.0.0-rc.2", "typeface-inter": "3.10.0", @@ -226,7 +227,7 @@ "@types/redux-logger": "3.0.7", "@types/rimraf": "2.0.2", "@types/semver": "5.5.0", - "@types/sharp": "0.28.0", + "@types/sharp": "0.29.4", "@types/sinon": "10.0.2", "@types/split2": "3.2.1", "@types/storybook__addon-actions": "3.4.3", @@ -250,7 +251,7 @@ "cross-env": "5.2.0", "css-loader": "3.2.0", "electron": "15.3.2", - "electron-builder": "22.11.7", + "electron-builder": "22.14.5", "electron-mocha": "10.1.0", "electron-notarize": "0.1.1", "eslint": "7.7.0", @@ -308,7 +309,7 @@ "asarUnpack": [ "**/*.node" ], - "artifactName": "${name}-mac-${version}.${ext}", + "artifactName": "${name}-mac-${arch}-${version}.${ext}", "category": "public.app-category.social-networking", "darkModeSupport": true, "hardenedRuntime": true, @@ -321,8 +322,20 @@ } ], "target": [ - "zip", - "dmg" + { + "target": "zip", + "arch": [ + "x64", + "arm64" + ] + }, + { + "target": "dmg", + "arch": [ + "x64", + "arm64" + ] + } ], "bundleVersion": "1" }, @@ -439,13 +452,13 @@ "node_modules/socks/build/common/*.js", "node_modules/socks/build/client/*.js", "node_modules/smart-buffer/build/*.js", - "node_modules/sharp/build/**", + "node_modules/sharp/build/**/*${arch}*.node", "!node_modules/sharp/{install,src,vendor/include,vendor/*/include}", "!node_modules/better-sqlite3/deps/*", "!node_modules/better-sqlite3/src/*", "node_modules/better-sqlite3/build/Release/better_sqlite3.node", - "node_modules/@signalapp/signal-client/prebuilds/*${platform}*/*.node", - "node_modules/ringrtc/build/${platform}/**", + "node_modules/@signalapp/signal-client/prebuilds/${platform}-${arch}/*.node", + "node_modules/ringrtc/build/${platform}/*${arch}*.node", "node_modules/mac-screen-capture-permissions/build/Release/*.node", "!**/node_modules/react-dom/*/*.development.js", "!node_modules/.cache" diff --git a/patches/@types+sharp+0.28.0.patch b/patches/@types+sharp+0.28.0.patch deleted file mode 100644 index d9c3def471..0000000000 --- a/patches/@types+sharp+0.28.0.patch +++ /dev/null @@ -1,27 +0,0 @@ -diff --git a/node_modules/@types/sharp/index.d.ts b/node_modules/@types/sharp/index.d.ts -index 3210332..4808af0 100755 ---- a/node_modules/@types/sharp/index.d.ts -+++ b/node_modules/@types/sharp/index.d.ts -@@ -23,7 +23,21 @@ import { Duplex } from "stream"; - * @returns A sharp instance that can be used to chain operations - */ - declare function sharp(options?: sharp.SharpOptions): sharp.Sharp; --declare function sharp(input?: string | Buffer, options?: sharp.SharpOptions): sharp.Sharp; -+declare function sharp( -+ input?: -+ | Buffer -+ | Uint8Array -+ | Uint8ClampedArray -+ | Int8Array -+ | Uint16Array -+ | Int16Array -+ | Uint32Array -+ | Int32Array -+ | Float32Array -+ | Float64Array -+ | string, -+ options?: sharp.SharpOptions -+): sharp.Sharp; - - declare namespace sharp { - /** Object containing nested boolean values representing the available input and output formats/methods. */ diff --git a/patches/app-builder-lib+22.11.7.patch b/patches/app-builder-lib+22.11.7.patch deleted file mode 100644 index 4010389a41..0000000000 --- a/patches/app-builder-lib+22.11.7.patch +++ /dev/null @@ -1,68 +0,0 @@ -diff --git a/node_modules/app-builder-lib/out/targets/LinuxTargetHelper.js b/node_modules/app-builder-lib/out/targets/LinuxTargetHelper.js -index ed6b8d3..98495fd 100644 ---- a/node_modules/app-builder-lib/out/targets/LinuxTargetHelper.js -+++ b/node_modules/app-builder-lib/out/targets/LinuxTargetHelper.js -@@ -85,7 +85,7 @@ class LinuxTargetHelper { - exec += " "; - exec += executableArgs.join(" "); - } -- exec += " %U"; -+ exec += " --no-sandbox %U"; - } - const desktopMeta = { - Name: appInfo.productName, -diff --git a/node_modules/app-builder-lib/templates/linux/after-install.tpl b/node_modules/app-builder-lib/templates/linux/after-install.tpl -index 1536059..555f8f5 100644 ---- a/node_modules/app-builder-lib/templates/linux/after-install.tpl -+++ b/node_modules/app-builder-lib/templates/linux/after-install.tpl -@@ -3,8 +3,5 @@ - # Link to the binary - ln -sf '/opt/${sanitizedProductName}/${executable}' '/usr/bin/${executable}' - --# SUID chrome-sandbox for Electron 5+ --chmod 4755 '/opt/${sanitizedProductName}/chrome-sandbox' || true -- - update-mime-database /usr/share/mime || true - update-desktop-database /usr/share/applications || true -diff --git a/node_modules/app-builder-lib/templates/nsis/messages.yml b/node_modules/app-builder-lib/templates/nsis/messages.yml -index 94c8e9e..7e25e3d 100644 ---- a/node_modules/app-builder-lib/templates/nsis/messages.yml -+++ b/node_modules/app-builder-lib/templates/nsis/messages.yml -@@ -67,7 +67,36 @@ appRunning: - es: "${PRODUCT_NAME} se está ejecutando. Haz clic en Aceptar para cerrarlo." - da: "${PRODUCT_NAME} er i gang. Klik OK for at lukke." - appCannotBeClosed: -- en: "${PRODUCT_NAME} cannot be closed. \nPlease close it manually and click Retry to continue" -+ en: "${PRODUCT_NAME} cannot be closed. \nPlease close it manually and click Retry to continue." -+ ar: "‫لم يتمكن من إغلاق ${PRODUCT_NAME} \nيُرجى إغلاقه يدويا ثم الضغط مرة أخرى على إعادة المحاولة للاستمرار.‏" -+ az: "${PRODUCT_NAME}, bağlanıla bilmir. \nZəhmət olmasa əllə bağlayın və davam etmək üçün \"Yenidən sına\"ya klikləyin." -+ ca: "No es pot tancar el ${PRODUCT_NAME}. \nTanqueu-lo manualment i cliqueu a tornar-ho a provar per continuar." -+ cs: "Aplikaci ${PRODUCT_NAME} se nepodařilo zavřít. \nZavřete ji ručně a poté klikněte na Opakovat pro pokračování." -+ cy: "Nid oes modd cau ${PRODUCT_NAME}. \nCaewch ef â llaw a chliciwch ar Ailgynnig i barhau." -+ da: "${PRODUCT_NAME} kan ikke afsluttes \nLuk den manuelt og klik Prøv igen for at fortsætte" -+ de: "${PRODUCT_NAME} kann nicht geschlossen werden. \nSchließ es bitte manuell und klicke auf »Wiederholen«, um fortzufahren." -+ el: "Το ${PRODUCT_NAME} δεν μπορεί να κλείσει. \nΠαρακαλώ κλείστο χειροκίνητα και πάτα Δοκιμή Ξανά για να συνεχίσεις." -+ es: "No se puede cerrar ${PRODUCT_NAME}. \nPor favor cierra la aplicación manualmente y haz clic en reintentar para continuar." -+ et: "${PRODUCT_NAME} ei saa sulgeda. \nPalun sulge see käsitsi ja klõpsa jätkamiseks \"Proovi uuesti\"." -+ fi: "${PRODUCT_NAME} ei voi sulkea. \nSulje se itse ja napsauta Yritä uudelleen jatkaaksesi." -+ he: "${PRODUCT_NAME} לא יכול להיסגר. \nאנא סגור אותו באופן ידני ולחץ על נסה שוב כדי להמשיך." -+ is: "Ekki er hægt að loka ${PRODUCT_NAME}. \nLokaðu því handvirkt og ýttu á 'Reyna aftur' til að halda áfram." -+ it: "${PRODUCT_NAME} non può essere chiuso. \nPer favore, chiudilo manualmente e clicca su Riprova per continuare." -+ ja: "${PRODUCT_NAME}が終了できません。\n手動で閉じて、『再試行』をクリックしてください。" -+ lt: "Nepavyksta užverti ${PRODUCT_NAME}. \nPabandykite ją užverti rankiniu būdu ir norėdami tęsti spustelėkite „Bandyti dar kartą“." -+ nl_NL: "${PRODUCT_NAME} kan niet automatisch worden afgesloten. \nSluit zelf de ${PRODUCT_NAME} app en klik vervolgens op ‘Opnieuw proberen’." -+ pl: "Nie można zamknąć ${PRODUCT_NAME}. \nZamknij aplikację i kliknij Ponów, aby kontynuować." -+ pt_BR: "Não é possível fechar o ${PRODUCT_NAME}. \nFeche a janela do ${PRODUCT_NAME} e clique em Repetir para continuar." -+ pt_PT: "Não é possível fechar o ${PRODUCT_NAME}. \nPor favor, feche-o manualmente e clique em ´Tentar novamente' para continuar." -+ ro: "${PRODUCT_NAME} nu poate fi închis \nVă rugăm închideți-l manual și apăsați Reîncercare pentru a continua." -+ ru: "Не удалось закрыть ${PRODUCT_NAME}. \nПожалуйста, закройте ${PRODUCT_NAME} вручную и нажмите «Повторить», чтобы продолжить." -+ sk: "${PRODUCT_NAME} nie je možné zatvoriť. \nZatvorte ho ručne a pokračujte kliknutím na položku Opakovať." -+ sl: "${PRODUCT_NAME} se ne more zapreti. \nPoskusite ga zapreti ročno in kliknite Ponovi za nadaljevanje." -+ sq: "${PRODUCT_NAME} s’mund të mbyllet. \nQë të vazhdohet, ju lutemi, mbylleni dorazi dhe klikoni mbi Riprovo." -+ sr: "${PRODUCT_NAME} не може да се затвори. \nЗатворите га ручно и кликните на Покушај да наставите." -+ sv: "${PRODUCT_NAME} går inte att stängas. \nVänligen stäng det manuellt och klicka på Försök igen för att fortsätta." -+ tr: "${PRODUCT_NAME} kapatılamaz. \nLütfen elle kapatın ve devam etmek için Tekrar'a tıklayın" -+ zh_TW: "${PRODUCT_NAME} 無法關閉。\n請手動關閉它,然後單擊重試以繼續。" - installing: - en: Installing, please wait... - de: Installation läuft, bitte warten... diff --git a/patches/app-builder-lib+22.14.5.patch b/patches/app-builder-lib+22.14.5.patch new file mode 100644 index 0000000000..9df9806033 --- /dev/null +++ b/patches/app-builder-lib+22.14.5.patch @@ -0,0 +1,26 @@ +diff --git a/node_modules/app-builder-lib/out/targets/LinuxTargetHelper.js b/node_modules/app-builder-lib/out/targets/LinuxTargetHelper.js +index ed6b8d3..98495fd 100644 +--- a/node_modules/app-builder-lib/out/targets/LinuxTargetHelper.js ++++ b/node_modules/app-builder-lib/out/targets/LinuxTargetHelper.js +@@ -85,7 +85,7 @@ class LinuxTargetHelper { + exec += " "; + exec += executableArgs.join(" "); + } +- exec += " %U"; ++ exec += " --no-sandbox %U"; + } + const desktopMeta = { + Name: appInfo.productName, +diff --git a/node_modules/app-builder-lib/templates/linux/after-install.tpl b/node_modules/app-builder-lib/templates/linux/after-install.tpl +index 1536059..555f8f5 100644 +--- a/node_modules/app-builder-lib/templates/linux/after-install.tpl ++++ b/node_modules/app-builder-lib/templates/linux/after-install.tpl +@@ -3,8 +3,5 @@ + # Link to the binary + ln -sf '/opt/${sanitizedProductName}/${executable}' '/usr/bin/${executable}' + +-# SUID chrome-sandbox for Electron 5+ +-chmod 4755 '/opt/${sanitizedProductName}/chrome-sandbox' || true +- + update-mime-database /usr/share/mime || true + update-desktop-database /usr/share/applications || true diff --git a/ts/build/notarize.ts b/ts/build/notarize.ts index d990499a7f..e50938f4c1 100644 --- a/ts/build/notarize.ts +++ b/ts/build/notarize.ts @@ -27,7 +27,7 @@ async function go() { return; } - const appPath = await findDMG(); + const appPaths = await findDMGs(); const appBundleId = packageJson.build.appId; if (!appBundleId) { throw new Error( @@ -50,32 +50,41 @@ async function go() { } console.log('Notarizing with...'); - console.log(` file: ${appPath}`); + console.log(` files: ${appPaths.join(', ')}`); console.log(` primaryBundleId: ${appBundleId}`); console.log(` username: ${appleId}`); - await notarize({ - appBundleId, - appPath, - appleId, - appleIdPassword, - }); + await Promise.all( + appPaths.map(async appPath => { + return notarize({ + appBundleId, + appPath, + appleId, + appleIdPassword, + }); + }) + ); } const IS_DMG = /\.dmg$/; -async function findDMG(): Promise { +async function findDMGs(): Promise> { const releaseDir = resolve('release'); const files: Array = await readdir(releaseDir); const max = files.length; + const results = new Array(); for (let i = 0; i < max; i += 1) { const file = files[i]; const fullPath = join(releaseDir, file); if (IS_DMG.test(file)) { - return fullPath; + results.push(fullPath); } } - throw new Error("No suitable file found in 'release' folder!"); + if (results.length === 0) { + throw new Error("No suitable files found in 'release' folder!"); + } + + return results; } diff --git a/ts/scripts/zip-macos-release.ts b/ts/scripts/zip-macos-release.ts index 596945961c..2c9b9c85d4 100644 --- a/ts/scripts/zip-macos-release.ts +++ b/ts/scripts/zip-macos-release.ts @@ -22,61 +22,65 @@ export function zipMacOSRelease(): void { 'No zip file found. Maybe the release did not complete properly?' ); } - if (files.length > 1) { + if (files.length !== 2) { throw new Error( - 'More than one zip file found, release directory was not cleared.' + 'Multiple versions of zip files found, release directory was not cleared.' ); } - const zipFile = files[0]; - const zipPath = path.join('release', zipFile); - console.log('Removing current zip file'); - rimraf.sync(zipPath); + for (const zipFile of files) { + const zipPath = path.join('release', zipFile); - const appName = `${packageJSON.productName}.app`; - const appPath = path.join('release', 'mac', appName); + console.log('Removing current zip file', zipFile); + rimraf.sync(zipPath); - const tmpPath = path.join('release', 'tmp'); - const appDir = path.dirname(appPath); - const tmpZip = path.join(appDir, zipFile); - console.log('Creating temporary zip file at', tmpZip); - try { - execSync(`cd ${appDir} && zip -ro ${zipFile} "${appName}"`); - console.log( - 'Unzipping to remove duplicate electron references from', - tmpZip + const postfix = zipFile.includes('arm64') ? '-arm64' : ''; + + const appName = `${packageJSON.productName}.app`; + const appPath = path.join('release', `mac${postfix}`, appName); + + const tmpPath = path.join('release', `tmp${postfix}`); + const appDir = path.dirname(appPath); + const tmpZip = path.join(appDir, zipFile); + console.log('Creating temporary zip file at', tmpZip); + try { + execSync(`cd ${appDir} && zip -ro ${zipFile} "${appName}"`); + console.log( + 'Unzipping to remove duplicate electron references from', + tmpZip + ); + execSync(`unzip ${tmpZip} -d ${tmpPath}`); + } catch (err) { + console.log('stdout:', String(err.stdout)); + console.log('stderr:', String(err.stderr)); + throw err; + } + console.log('Removing temporary zip file'); + rimraf.sync(tmpZip); + + const electronFrameworkPath = path.join( + tmpPath, + appName, + 'Contents', + 'Frameworks', + 'Electron Framework.framework', + 'Versions' ); - execSync(`unzip ${tmpZip} -d ${tmpPath}`); - } catch (err) { - console.log('stdout:', String(err.stdout)); - console.log('stderr:', String(err.stderr)); - throw err; - } - console.log('Removing temporary zip file'); - rimraf.sync(tmpZip); + console.log('Removing duplicate electron framework', electronFrameworkPath); + rimraf.sync(electronFrameworkPath); - const electronFrameworkPath = path.join( - tmpPath, - appName, - 'Contents', - 'Frameworks', - 'Electron Framework.framework', - 'Versions' - ); - console.log('Removing duplicate electron framework', electronFrameworkPath); - rimraf.sync(electronFrameworkPath); - - try { - console.log('Creating final zip'); - execSync(`cd ${tmpPath} && zip -ro ${zipFile} "${appName}"`); - } catch (err) { - console.log('stdout:', String(err.stdout)); - console.log('stderr:', String(err.stderr)); - throw err; + try { + console.log('Creating final zip'); + execSync(`cd ${tmpPath} && zip -ro ${zipFile} "${appName}"`); + } catch (err) { + console.log('stdout:', String(err.stdout)); + console.log('stderr:', String(err.stderr)); + throw err; + } + console.log('Moving into the final destination', zipPath); + fs.renameSync(path.join(tmpPath, zipFile), zipPath); + rimraf.sync(tmpPath); } - console.log('Moving into the final destination', zipPath); - fs.renameSync(path.join(tmpPath, zipFile), zipPath); - rimraf.sync(tmpPath); console.log('zip-macos-release is done'); } diff --git a/ts/test-node/updater/common_test.ts b/ts/test-node/updater/common_test.ts index 30ba116187..81ad04838f 100644 --- a/ts/test-node/updater/common_test.ts +++ b/ts/test-node/updater/common_test.ts @@ -24,13 +24,21 @@ releaseDate: '2019-03-29T16:58:08.210Z' `); const mac = parseYaml(`version: 1.23.2 files: - - url: signal-desktop-mac-1.23.2.zip - sha512: f4pPo3WulTVi9zBWGsJPNIlvPOTCxPibPPDmRFDoXMmFm6lqJpXZQ9DSWMJumfc4BRp4y/NTQLGYI6b4WuJwhg== - size: 105179791 - blockMapSize: 111109 -path: signal-desktop-mac-1.23.2.zip -sha512: f4pPo3WulTVi9zBWGsJPNIlvPOTCxPibPPDmRFDoXMmFm6lqJpXZQ9DSWMJumfc4BRp4y/NTQLGYI6b4WuJwhg== -releaseDate: '2019-03-29T16:57:16.997Z' + - url: signal-desktop-mac-x64-1.23.2.zip + sha512: STurwHhpE2rwwpwz3/RQBbMbVYY2Hh1DVpeofwIWPXoDTX/41zia+ByKXq8BvnjIMdQ3YmPHu+UppAW/+CFkFQ== + size: 150317727 + - url: signal-desktop-mac-arm64-1.23.2.zip + sha512: PGFqCtiFep27rJcE3s8J2BAH9GQIRg460J0IVwbUCQERLZlN8YP71B1xWW09gCmA5YeEY4oDynqBLmgQfEFtfw== + size: 148022367 + - url: signal-desktop-mac-x64-1.23.2.dmg + sha512: xbX5QDyzdvQd6rVzpamRLfWu+oIbhlW9pLbpKywQSiEx6BPZHTYCulBx9V5zrKh7TNM9nRpZJ3Sph2bU3v+5uQ== + size: 154866781 + - url: signal-desktop-mac-arm64-1.23.2.dmg + sha512: 7wgGWCogQ9OWMGnqEUmiSeRct3w60zyzYp5cIUvJIVFe8WoB/qS7n721n+xCsrdteclR6yu1cqkOh/xN/wgS0Q== + size: 152618547 +path: signal-desktop-mac-x64-1.23.2.zip +sha512: STurwHhpE2rwwpwz3/RQBbMbVYY2Hh1DVpeofwIWPXoDTX/41zia+ByKXq8BvnjIMdQ3YmPHu+UppAW/+CFkFQ== +releaseDate: '2021-12-03T19:00:23.754Z' `); const windowsBeta = parseYaml(`version: 1.23.2-beta.1 files: @@ -43,13 +51,21 @@ releaseDate: '2019-03-29T01:56:00.544Z' `); const macBeta = parseYaml(`version: 1.23.2-beta.1 files: - - url: signal-desktop-beta-mac-1.23.2-beta.1.zip - sha512: h/01N0DD5Jw2Q6M1n4uLGLTCrMFxcn8QOPtLR3HpABsf3w9b2jFtKb56/2cbuJXP8ol8TkTDWKnRV6mnqnLBDw== - size: 105182398 - blockMapSize: 110894 -path: signal-desktop-beta-mac-1.23.2-beta.1.zip -sha512: h/01N0DD5Jw2Q6M1n4uLGLTCrMFxcn8QOPtLR3HpABsf3w9b2jFtKb56/2cbuJXP8ol8TkTDWKnRV6mnqnLBDw== -releaseDate: '2019-03-29T01:53:23.881Z' + - url: signal-desktop-mac-x64-1.23.2-beta.1.zip + sha512: STurwHhpE2rwwpwz3/RQBbMbVYY2Hh1DVpeofwIWPXoDTX/41zia+ByKXq8BvnjIMdQ3YmPHu+UppAW/+CFkFQ== + size: 150317727 + - url: signal-desktop-mac-arm64-1.23.2-beta.1.zip + sha512: PGFqCtiFep27rJcE3s8J2BAH9GQIRg460J0IVwbUCQERLZlN8YP71B1xWW09gCmA5YeEY4oDynqBLmgQfEFtfw== + size: 148022367 + - url: signal-desktop-mac-x64-1.23.2-beta.1.dmg + sha512: xbX5QDyzdvQd6rVzpamRLfWu+oIbhlW9pLbpKywQSiEx6BPZHTYCulBx9V5zrKh7TNM9nRpZJ3Sph2bU3v+5uQ== + size: 154866781 + - url: signal-desktop-mac-arm64-1.23.2-beta.1.dmg + sha512: 7wgGWCogQ9OWMGnqEUmiSeRct3w60zyzYp5cIUvJIVFe8WoB/qS7n721n+xCsrdteclR6yu1cqkOh/xN/wgS0Q== + size: 152618547 +path: signal-desktop-mac-x64-1.23.2-beta.1.zip +sha512: STurwHhpE2rwwpwz3/RQBbMbVYY2Hh1DVpeofwIWPXoDTX/41zia+ByKXq8BvnjIMdQ3YmPHu+UppAW/+CFkFQ== +releaseDate: '2021-12-03T19:00:23.754Z' `); describe('#getVersion', () => { @@ -67,20 +83,28 @@ releaseDate: '2019-03-29T01:53:23.881Z' describe('#getUpdateFileName', () => { it('successfully gets version', () => { assert.strictEqual( - getUpdateFileName(windows), + getUpdateFileName(windows, 'win32', 'x64'), 'signal-desktop-win-1.23.2.exe' ); assert.strictEqual( - getUpdateFileName(mac), - 'signal-desktop-mac-1.23.2.zip' + getUpdateFileName(mac, 'darwin', 'x64'), + 'signal-desktop-mac-x64-1.23.2.zip' ); assert.strictEqual( - getUpdateFileName(windowsBeta), + getUpdateFileName(mac, 'darwin', 'arm64'), + 'signal-desktop-mac-arm64-1.23.2.zip' + ); + assert.strictEqual( + getUpdateFileName(windowsBeta, 'win32', 'x64'), 'signal-desktop-beta-win-1.23.2-beta.1.exe' ); assert.strictEqual( - getUpdateFileName(macBeta), - 'signal-desktop-beta-mac-1.23.2-beta.1.zip' + getUpdateFileName(macBeta, 'darwin', 'x64'), + 'signal-desktop-mac-x64-1.23.2-beta.1.zip' + ); + assert.strictEqual( + getUpdateFileName(macBeta, 'darwin', 'arm64'), + 'signal-desktop-mac-arm64-1.23.2-beta.1.zip' ); }); }); @@ -92,7 +116,7 @@ releaseDate: '2019-03-29T01:53:23.881Z' true ); assert.strictEqual( - isUpdateFileNameValid('signal-desktop-mac-1.23.2-beta.1.zip'), + isUpdateFileNameValid('signal-desktop-mac-x64-1.23.2-beta.1.zip'), true ); }); @@ -102,11 +126,11 @@ releaseDate: '2019-03-29T01:53:23.881Z' false ); assert.strictEqual( - isUpdateFileNameValid('%signal-desktop-mac-1.23.2-beta.1.zip'), + isUpdateFileNameValid('%signal-desktop-mac-x64-1.23.2-beta.1.zip'), false ); assert.strictEqual( - isUpdateFileNameValid('@signal-desktop-mac-1.23.2-beta.1.zip'), + isUpdateFileNameValid('@signal-desktop-mac-x64-1.23.2-beta.1.zip'), false ); }); diff --git a/ts/updater/common.ts b/ts/updater/common.ts index 86f383f52d..5489f083f7 100644 --- a/ts/updater/common.ts +++ b/ts/updater/common.ts @@ -7,6 +7,8 @@ import { statSync, writeFile as writeFileCallback, } from 'fs'; +import { promisify } from 'util'; +import { execFile } from 'child_process'; import { join, normalize, dirname } from 'path'; import { tmpdir } from 'os'; import { throttle } from 'lodash'; @@ -47,7 +49,6 @@ import type { LoggerType } from '../types/Logging'; const writeFile = pify(writeFileCallback); const mkdirpPromise = pify(mkdirp); const rimrafPromise = pify(rimraf); -const { platform } = process; export const GOT_CONNECT_TIMEOUT = 2 * 60 * 1000; export const GOT_LOOKUP_TIMEOUT = 2 * 60 * 1000; @@ -267,7 +268,11 @@ export abstract class Updater { `forceUpdate=${forceUpdate}` ); - const fileName = getUpdateFileName(parsedYaml); + const fileName = getUpdateFileName( + parsedYaml, + process.platform, + await this.getArch() + ); return { fileName, @@ -377,6 +382,27 @@ export abstract class Updater { this.logger.error(`quitHandler: ${Errors.toLogFormat(error)}`); } } + + private async getArch(): Promise { + if (process.platform !== 'darwin' || process.arch === 'arm64') { + return process.arch; + } + + try { + // We might be running under Rosetta + if (promisify(execFile)('uname', ['-m']).toString().trim() === 'arm64') { + this.logger.info('updater: running under Rosetta'); + return 'arm64'; + } + } catch (error) { + this.logger.warn( + `updater: "uname -m" failed with ${Errors.toLogFormat(error)}` + ); + } + + this.logger.info('updater: not running under Rosetta'); + return process.arch; + } } export function validatePath(basePath: string, targetPath: string): void { @@ -408,7 +434,7 @@ export function getProxyUrl(): string | undefined { export function getUpdatesFileName(): string { const prefix = getChannel(); - if (platform === 'darwin') { + if (process.platform === 'darwin') { return `${prefix}-mac.yml`; } @@ -442,12 +468,30 @@ export function isUpdateFileNameValid(name: string): boolean { return validFile.test(name); } -export function getUpdateFileName(info: JSONUpdateSchema): string { +export function getUpdateFileName( + info: JSONUpdateSchema, + platform: typeof process.platform, + arch: typeof process.arch +): string { if (!info || !info.path) { throw new Error('getUpdateFileName: No path present in YAML file'); } - const { path } = info; + let path: string | undefined; + if (platform === 'darwin') { + const { files } = info; + + const candidates = files.filter( + ({ url }) => url.includes(arch) && url.endsWith('.zip') + ); + + if (candidates.length === 1) { + path = candidates[0].url; + } + } + + path = path ?? info.path; + if (!isUpdateFileNameValid(path)) { throw new Error( `getUpdateFileName: Path '${path}' contains invalid characters` diff --git a/ts/updater/generateSignature.ts b/ts/updater/generateSignature.ts index 277cf735a2..412aa5929f 100644 --- a/ts/updater/generateSignature.ts +++ b/ts/updater/generateSignature.ts @@ -52,35 +52,46 @@ go(cliOptions).catch(error => { async function go(options: OptionsType) { const { private: privateKeyPath, version } = options; - let { update: updatePath } = options; - if (!updatePath) { - updatePath = await findUpdatePath(); + let updatePaths: Array; + if (options.update) { + updatePaths = [options.update]; + } else { + updatePaths = await findUpdatePaths(); } - console.log('Signing with...'); - console.log(` version: ${version}`); - console.log(` update file: ${updatePath}`); - console.log(` private key file: ${privateKeyPath}`); + await Promise.all( + updatePaths.map(async updatePath => { + console.log('Signing with...'); + console.log(` version: ${version}`); + console.log(` update file: ${updatePath}`); + console.log(` private key file: ${privateKeyPath}`); - await writeSignature(updatePath, version, privateKeyPath); + await writeSignature(updatePath, version, privateKeyPath); + }) + ); } const IS_EXE = /\.exe$/; const IS_ZIP = /\.zip$/; -async function findUpdatePath(): Promise { +async function findUpdatePaths(): Promise> { const releaseDir = resolve('release'); const files: Array = await readdir(releaseDir); const max = files.length; + const results = new Array(); for (let i = 0; i < max; i += 1) { const file = files[i]; const fullPath = join(releaseDir, file); if (IS_EXE.test(file) || IS_ZIP.test(file)) { - return fullPath; + results.push(fullPath); } } - throw new Error("No suitable file found in 'release' folder!"); + if (results.length === 0) { + throw new Error("No suitable file found in 'release' folder!"); + } + + return results; } diff --git a/yarn.lock b/yarn.lock index f8890a5005..8a299d215b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1858,10 +1858,10 @@ "@react-spring/shared" "~9.2.6-beta.0" "@react-spring/types" "~9.2.6-beta.0" -"@signalapp/signal-client@0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@signalapp/signal-client/-/signal-client-0.11.0.tgz#a7a4a0b5f94de9c025934a2c99dce13555aefb07" - integrity sha512-0ENfmFCadJgp6cEnjvD8+f6a4B//Fo4sH9Urrc7MY4ltdy/7tQ5K8sXR3Hr5rYHdapJW01zVRvOyv6Out5KTFQ== +"@signalapp/signal-client@0.11.1": + version "0.11.1" + resolved "https://registry.yarnpkg.com/@signalapp/signal-client/-/signal-client-0.11.1.tgz#f1f859453c2d187e5f47ab02707ae4580edaa6fc" + integrity sha512-TXvspNNq5fRMMM7SDMjSzPd7lBPRt7oSb5tzJNoLVHNOwwSAwdpo+P6fzN5LszeNJYNjOXlXTSuBD4HB8v4TMg== dependencies: node-gyp-build "^4.2.3" uuid "^8.3.0" @@ -2456,10 +2456,12 @@ resolved "https://registry.yarnpkg.com/@types/dashdash/-/dashdash-1.14.0.tgz#bfa457c2688497cf0e6695dbd522c67a9232833f" integrity sha512-dBnfu9H6TVawx85FGmVEs5lYFXNwUVxn3Nqu5FHhCAi4aPvZR35W4FEMK3ljlpM2vHPGgEnCZGARF59/QGTNJw== -"@types/debug@^4.1.5": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" - integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ== +"@types/debug@^4.1.6": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" + integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + dependencies: + "@types/ms" "*" "@types/eslint-scope@^3.7.0": version "3.7.0" @@ -2692,6 +2694,11 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.0.0.tgz#a3014921991066193f6c8e47290d4d598dfd19e6" integrity sha512-ZS0vBV7Jn5Z/Q4T3VXauEKMDCV8nWOtJJg90OsDylkYJiQwcWtKuLzohWzrthBkerUF7DLMmJcwOPEP0i/AOXw== +"@types/ms@*": + version "0.7.31" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" + integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + "@types/mustache@4.1.2": version "4.1.2" resolved "https://registry.yarnpkg.com/@types/mustache/-/mustache-4.1.2.tgz#d0e158013c81674a5b6d8780bc3fe234e1804eaf" @@ -2894,10 +2901,10 @@ "@types/express-serve-static-core" "*" "@types/mime" "*" -"@types/sharp@0.28.0": - version "0.28.0" - resolved "https://registry.yarnpkg.com/@types/sharp/-/sharp-0.28.0.tgz#d61865182e386f1ec8d8b6a052da846695638a84" - integrity sha512-YvRFnQM44wAihAKzBDzu3BxnEohpqWd/5KXkwsSUl3qFTb51NyKHCKHX1D62YAy0jZij5aXgm/33v/Cv6VVsdA== +"@types/sharp@0.29.4": + version "0.29.4" + resolved "https://registry.yarnpkg.com/@types/sharp/-/sharp-0.29.4.tgz#e47d8677befc9944d4b9d76ed837452814166de0" + integrity sha512-asrPef2LYenr76zBzyy+Fw40yGzq/q/CY77mUP5n43DnuWjQoOB+8vxnzFcqccz+LF+A7mbnknGCfpVWSG82Bw== dependencies: "@types/node" "*" @@ -3044,10 +3051,10 @@ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== -"@types/yargs@^16.0.2": - version "16.0.4" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" - integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== +"@types/yargs@^17.0.1": + version "17.0.7" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.7.tgz#44a484c634761da4391477515a98772b82b5060f" + integrity sha512-OvLKmpKdea1aWtqHv9bxVVcMoT6syAeK+198dfETIFkAevYRGwqh4H+KFxfjUETZuUuE5sQCAFwdOdoHUdo8eg== dependencies: "@types/yargs-parser" "*" @@ -3783,15 +3790,15 @@ anymatch@~3.1.1, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -app-builder-bin@3.5.13: - version "3.5.13" - resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-3.5.13.tgz#6dd7f4de34a4e408806f99b8c7d6ef1601305b7e" - integrity sha512-ighVe9G+bT1ENGdp9ecO1P+94vv/f+FUwaI+XkNzeg9bYF8Oi3BQ+mJuxS00UgyHs8luuOzjzC+qnAtdb43Mpg== +app-builder-bin@3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-3.7.1.tgz#cb0825c5e12efc85b196ac3ed9c89f076c61040e" + integrity sha512-ql93vEUq6WsstGXD+SBLSIQw6SNnhbDEM0swzgugytMxLp3rT24Ag/jcC80ZHxiPRTdew1niuR7P3/FCrDqIjw== -app-builder-lib@22.11.7: - version "22.11.7" - resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-22.11.7.tgz#c0ad1119ebfbf4189a8280ad693625f5e684dca6" - integrity sha512-pS9/cR4/TnNZVAHZECiSvvwTBzbwblj7KBBZkMKDG57nibq0I1XY8zAaYeHFdlYTyrRcz9JUXbAqJKezya7UFQ== +app-builder-lib@22.14.5: + version "22.14.5" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-22.14.5.tgz#a61a50b132b858e98fdc70b6b88994ae99b4f96d" + integrity sha512-k3VwKP4kpsnUaXoUkm1s4zaSHPHIMFnN4kPMU9yXaKmE1LfHHqBaEah5bXeTAX5V/BC41wFdg8CF5vOjvgy8Rg== dependencies: "7zip-bin" "~5.1.1" "@develar/schema-utils" "~2.6.5" @@ -3799,12 +3806,14 @@ app-builder-lib@22.11.7: "@malept/flatpak-bundler" "^0.4.0" async-exit-hook "^2.0.1" bluebird-lst "^1.0.9" - builder-util "22.11.7" - builder-util-runtime "8.7.7" + builder-util "22.14.5" + builder-util-runtime "8.9.1" chromium-pickle-js "^0.2.0" debug "^4.3.2" ejs "^3.1.6" - electron-publish "22.11.7" + electron-osx-sign "^0.5.0" + electron-publish "22.14.5" + form-data "^4.0.0" fs-extra "^10.0.0" hosted-git-info "^4.0.2" is-ci "^3.0.0" @@ -4766,6 +4775,11 @@ bluebird@^3.3.5, bluebird@^3.5.5: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== +bluebird@^3.5.0: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + blueimp-load-image@5.14.0: version "5.14.0" resolved "https://registry.yarnpkg.com/blueimp-load-image/-/blueimp-load-image-5.14.0.tgz#e8086415e580df802c33ff0da6b37a8d20205cc6" @@ -5009,6 +5023,19 @@ browserslist@^4.14.5: escalade "^3.1.1" node-releases "^1.1.70" +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + buffer-crc32@^0.2.1, buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" @@ -5019,6 +5046,11 @@ buffer-equal@1.0.0: resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74= +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + buffer-from@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531" @@ -5047,34 +5079,27 @@ buffer@^5.1.0, buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -builder-util-runtime@8.7.6: - version "8.7.6" - resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.7.6.tgz#4b43c96db2bd494ced7694bcd7674934655e8324" - integrity sha512-rj9AIY7CzLSuTOXpToiaQkruYh6UEQ+kYnd5UET22ch8MGClEtIZKXHG14qEiXEr2x4EOKDMxkcTa+9TYaE+ug== +builder-util-runtime@8.9.1: + version "8.9.1" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.9.1.tgz#25f066b3fbc20b3e6236a9b956b1ebb0e33ff66a" + integrity sha512-c8a8J3wK6BIVLW7ls+7TRK9igspTbzWmUqxFbgK0m40Ggm6efUbxtWVCGIjc+dtchyr5qAMAUL6iEGRdS/6vwg== dependencies: debug "^4.3.2" sax "^1.2.4" -builder-util-runtime@8.7.7: - version "8.7.7" - resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.7.7.tgz#6c83cc3abe7a7a5c8b4ec8878f68adc828c07f0d" - integrity sha512-RUfoXzVrmFFI0K/Oft0CtP1LpTIOlBeLJatt5DePTI0KlxE156am4SGUpqtbbdqZNm++LkV9mX4olBDcXyGPow== - dependencies: - debug "^4.3.2" - sax "^1.2.4" - -builder-util@22.11.7: - version "22.11.7" - resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-22.11.7.tgz#ae9707afa6a31feafa13c274ac83b4fe28ef1467" - integrity sha512-ihqUe5ey82LM9qqQe0/oIcaSm9w+B9UjcsWJZxJliTBsbU+sErOpDFpHW+sim0veiTF/EIcGUh9HoduWw+l9FA== +builder-util@22.14.5: + version "22.14.5" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-22.14.5.tgz#42a18608d2a566c0846e91266464776c8bfb0cc9" + integrity sha512-zqIHDFJwmA7jV7SC9aI+33MWwT2mWoijH+Ol9IntNAwuuRXoS+7XeJwnhLBXOhcDBzXT4kDzHnRk4JKeaygEYA== dependencies: "7zip-bin" "~5.1.1" - "@types/debug" "^4.1.5" + "@types/debug" "^4.1.6" "@types/fs-extra" "^9.0.11" - app-builder-bin "3.5.13" + app-builder-bin "3.7.1" bluebird-lst "^1.0.9" - builder-util-runtime "8.7.7" + builder-util-runtime "8.9.1" chalk "^4.1.1" + cross-spawn "^7.0.3" debug "^4.3.2" fs-extra "^10.0.0" is-ci "^3.0.0" @@ -5717,7 +5742,7 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.9.0, color-convert@^1.9.1: +color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -5741,7 +5766,7 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@1.5.5, color-string@^1.5.4: +color-string@1.5.5, color-string@^1.7.4: version "1.5.5" resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.5.tgz#65474a8f0e7439625f3d27a6a19d89fc45223014" integrity sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg== @@ -5749,13 +5774,13 @@ color-string@1.5.5, color-string@^1.5.4: color-name "^1.0.0" simple-swizzle "^0.2.2" -color@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/color/-/color-3.1.3.tgz#ca67fb4e7b97d611dcde39eceed422067d91596e" - integrity sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ== +color@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/color/-/color-4.0.2.tgz#8bdb639132a37ae8823fd672de5180d0988fca80" + integrity sha512-fSu0jW2aKQG2FHlDywqdFPdabJHsUdZ0xabSt3wFZdcgRKtLnUHs19nUtuFuLGVMFhINGgfZEIjbUOsGZXGu7Q== dependencies: - color-convert "^1.9.1" - color-string "^1.5.4" + color-convert "^2.0.1" + color-string "^1.7.4" colorette@^1.2.1: version "1.2.2" @@ -5844,6 +5869,11 @@ commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" +compare-version@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" + integrity sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA= + component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" @@ -6541,13 +6571,6 @@ decompress-response@^3.3.0: dependencies: mimic-response "^1.0.0" -decompress-response@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" - integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== - dependencies: - mimic-response "^2.0.0" - decompress-response@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" @@ -6791,14 +6814,14 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -dmg-builder@22.11.7: - version "22.11.7" - resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-22.11.7.tgz#5956008c18d40ee72c0ea01ffea9590dbf51df89" - integrity sha512-+I+XfP2DODHB6PwFANgpH/WMzzCA5r5XoMvbFCIYjQjJpXlO0XnqQaamzFl2vh/Wz/Qt0d0lJMgRy8gKR3MGdQ== +dmg-builder@22.14.5: + version "22.14.5" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-22.14.5.tgz#137c0b55e639badcc0b119eb060e6fa4ed61d948" + integrity sha512-1GvFGQE332bvPamcMwZDqWqfWfJTyyDLOsHMcGi0zs+Jh7JOn6/zuBkHJIWHdsj2QJbhzLVyd2/ZqttOKv7I8w== dependencies: - app-builder-lib "22.11.7" - builder-util "22.11.7" - builder-util-runtime "8.7.6" + app-builder-lib "22.14.5" + builder-util "22.14.5" + builder-util-runtime "8.9.1" fs-extra "^10.0.0" iconv-lite "^0.6.2" js-yaml "^4.1.0" @@ -7023,17 +7046,17 @@ ejs@~2.5.6: version "2.5.7" resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.7.tgz#cc872c168880ae3c7189762fd5ffc00896c9518a" -electron-builder@22.11.7: - version "22.11.7" - resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-22.11.7.tgz#cd97a0d9f6e6d388112e66b4376de431cca4d596" - integrity sha512-yQExSLt7Hbz/P8lLkZDdE/OnJJ7NCX+uiQcV+XIH0TeEZcD87ZnSqBBzGUN5akySU4BXXlrVZKeUsXACWrm5Kw== +electron-builder@22.14.5: + version "22.14.5" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-22.14.5.tgz#3a25547bd4fe3728d4704da80956a794c5c31496" + integrity sha512-N73hSbXFz6Mz5Z6h6C5ly6CB+dUN6k1LuCDJjI8VF47bMXv/QE0HE+Kkb0GPKqTqM7Hsk/yIYX+kHCfSkR5FGg== dependencies: - "@types/yargs" "^16.0.2" - app-builder-lib "22.11.7" - builder-util "22.11.7" - builder-util-runtime "8.7.7" + "@types/yargs" "^17.0.1" + app-builder-lib "22.14.5" + builder-util "22.14.5" + builder-util-runtime "8.9.1" chalk "^4.1.1" - dmg-builder "22.11.7" + dmg-builder "22.14.5" fs-extra "^10.0.0" is-ci "^3.0.0" lazy-val "^1.0.5" @@ -7089,14 +7112,26 @@ electron-notarize@0.1.1: debug "^4.1.1" fs-extra "^8.0.1" -electron-publish@22.11.7: - version "22.11.7" - resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-22.11.7.tgz#4126cbb08ccf082a2aa7fef89ee629b3a4b8ae9a" - integrity sha512-A4EhRRNBVz4SPzUlBrPO6BmuyDeI0pyprggPAV9rQ+SDVSnSB/WKPot9JwWMyArkGj3AUUTMNVT6hwZhMvhfqw== +electron-osx-sign@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.5.0.tgz#fc258c5e896859904bbe3d01da06902c04b51c3a" + integrity sha512-icoRLHzFz/qxzDh/N4Pi2z4yVHurlsCAYQvsCSG7fCedJ4UJXBS6PoQyGH71IfcqKupcKeK7HX/NkyfG+v6vlQ== + dependencies: + bluebird "^3.5.0" + compare-version "^0.1.2" + debug "^2.6.8" + isbinaryfile "^3.0.2" + minimist "^1.2.0" + plist "^3.0.1" + +electron-publish@22.14.5: + version "22.14.5" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-22.14.5.tgz#34bcdce671f0e651330db20040d6919c77c94bd6" + integrity sha512-h+NANRdaA0PqGF15GKvorseWPzh1PXa/zx4I37//PIokW8eKIov8ky23foUSb55ZFWUHGpxQJux7y2NCfBtQeg== dependencies: "@types/fs-extra" "^9.0.11" - builder-util "22.11.7" - builder-util-runtime "8.7.7" + builder-util "22.14.5" + builder-util-runtime "8.9.1" chalk "^4.1.1" fs-extra "^10.0.0" lazy-val "^1.0.5" @@ -8566,7 +8601,7 @@ fork-ts-checker-webpack-plugin@1.5.0: tapable "^1.0.0" worker-rpc "^0.1.0" -form-data@4.0.0: +form-data@4.0.0, form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== @@ -10709,6 +10744,13 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= +isbinaryfile@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" + integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== + dependencies: + buffer-alloc "^1.2.0" + isbinaryfile@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.8.tgz#5d34b94865bd4946633ecc78a026fc76c5b11fcf" @@ -11901,11 +11943,6 @@ mimic-response@^1.0.1: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== -mimic-response@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" - integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== - mimic-response@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" @@ -12321,15 +12358,22 @@ node-abi@^2.21.0: dependencies: semver "^5.4.1" +node-abi@^3.3.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.5.0.tgz#26e8b7b251c3260a5ac5ba5aef3b4345a0229248" + integrity sha512-LtHvNIBgOy5mO8mPEUtkCW/YCRWYEKshIvqhe1GHHyXEHEB5mgICyYnAcl4qan3uFeRROErKGzatFHPf6kDxWw== + dependencies: + semver "^7.3.5" + node-addon-api@^1.6.3: version "1.7.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== -node-addon-api@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.1.0.tgz#98b21931557466c6729e51cb77cd39c965f42239" - integrity sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw== +node-addon-api@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.2.0.tgz#117cbb5a959dff0992e1c586ae0393573e4d2a87" + integrity sha512-eazsqzwG2lskuzBqCGPi7Ac2UgOoMz8JVOXVhTvvPDYhthvNpefx8jWD8Np7Gv+2Sz0FlPWZk0nJV0z598Wn8Q== node-dir@^0.1.10: version "0.1.17" @@ -13795,10 +13839,10 @@ prebuild-install@^6.0.0: tar-fs "^2.0.0" tunnel-agent "^0.6.0" -prebuild-install@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-6.1.1.tgz#6754fa6c0d55eced7f9e14408ff9e4cba6f097b4" - integrity sha512-M+cKwofFlHa5VpTWub7GLg5RLcunYIcLqtY5pKcls/u7xaAb8FrXZ520qY8rkpYy5xw90tYCyMO0MP5ggzR3Sw== +prebuild-install@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.0.0.tgz#3c5ce3902f1cb9d6de5ae94ca53575e4af0c1574" + integrity sha512-IvSenf33K7JcgddNz2D5w521EgO+4aMMjFt73Uk9FRzQ7P+QZPKrp7qPsDydsSwjGt3T5xRNnM1bj1zMTD5fTA== dependencies: detect-libc "^1.0.3" expand-template "^2.0.3" @@ -13806,12 +13850,11 @@ prebuild-install@^6.1.1: minimist "^1.2.3" mkdirp-classic "^0.5.3" napi-build-utils "^1.0.1" - node-abi "^2.21.0" - noop-logger "^0.1.1" + node-abi "^3.3.0" npmlog "^4.0.1" pump "^3.0.0" rc "^1.2.7" - simple-get "^3.0.3" + simple-get "^4.0.0" tar-fs "^2.0.0" tunnel-agent "^0.6.0" @@ -15832,17 +15875,17 @@ shallowequal@1.1.0, shallowequal@^1.1.0: resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== -sharp@0.28.1: - version "0.28.1" - resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.28.1.tgz#9d7bbce1ca95b2c27482243cd4839c62ef40b0b7" - integrity sha512-4mCGMEN4ntaVuFGwHx7FvkJQkIgbI+S+F9a3bI7ugdvKjPr4sF7/ibvlRKhJyzhoQi+ODM+XYY1de8xs7MHbfA== +sharp@0.29.3: + version "0.29.3" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.29.3.tgz#0da183d626094c974516a48fab9b3e4ba92eb5c2" + integrity sha512-fKWUuOw77E4nhpyzCCJR1ayrttHoFHBT2U/kR/qEMRhvPEcluG4BKj324+SCO1e84+knXHwhJ1HHJGnUt4ElGA== dependencies: - color "^3.1.3" + color "^4.0.1" detect-libc "^1.0.3" - node-addon-api "^3.1.0" - prebuild-install "^6.1.1" + node-addon-api "^4.2.0" + prebuild-install "^7.0.0" semver "^7.3.5" - simple-get "^3.1.0" + simple-get "^4.0.0" tar-fs "^2.1.1" tunnel-agent "^0.6.0" @@ -15934,12 +15977,12 @@ simple-get@^3.0.3: once "^1.3.1" simple-concat "^1.0.0" -simple-get@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3" - integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA== +simple-get@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.0.tgz#73fa628278d21de83dadd5512d2cc1f4872bd675" + integrity sha512-ZalZGexYr3TA0SwySsr5HlgOOinS4Jsa8YB2GJ6lUNAazyAu4KG/VmzMTwAt2YVXzzVj8QmefmAonZIK2BSGcQ== dependencies: - decompress-response "^4.2.0" + decompress-response "^6.0.0" once "^1.3.1" simple-concat "^1.0.0"