diff --git a/.github/workflows/electron.yml b/.github/workflows/electron.yml index 4b7544326..36cf88960 100644 --- a/.github/workflows/electron.yml +++ b/.github/workflows/electron.yml @@ -115,7 +115,9 @@ jobs: Write-Host "Spectre libs present: $($found.FullName)" - name: Install dependencies - run: npm ci + run: | + npm ci + node scripts/install-windows-sharp.cjs # Bundled plugins are counted as downloads in the plugin store, so a # build only fetches them when the pins change. diff --git a/CHANGELOG.md b/CHANGELOG.md index 919a3e603..bc1da26fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,6 +53,7 @@ - Linking the desktop app to a server no longer stalls on the server dashboard after sign in - Exporting your data no longer fails when a plugin table has a text key, like saved passkeys +- The Windows on ARM desktop app starts again instead of failing with a local server error ### Removed diff --git a/scripts/install-windows-sharp.cjs b/scripts/install-windows-sharp.cjs new file mode 100644 index 000000000..1a6a1391e --- /dev/null +++ b/scripts/install-windows-sharp.cjs @@ -0,0 +1,26 @@ +const fs = require("node:fs"); +const path = require("node:path"); +const { execFileSync } = require("node:child_process"); + +function findPackage(start) { + let directory = path.dirname(start); + while (directory !== path.dirname(directory)) { + const manifest = path.join(directory, "package.json"); + if (fs.existsSync(manifest)) return JSON.parse(fs.readFileSync(manifest)); + directory = path.dirname(directory); + } + throw new Error("Could not locate the installed sharp package manifest"); +} + +// The build runs on x64 but ships arm64 and ia32 too, so npm ci alone +// only installs the x64 binary. +const sharpPackage = findPackage(require.resolve("sharp")); +const packages = [ + "@img/sharp-win32-arm64", + "@img/sharp-win32-ia32", + "@img/sharp-win32-x64", +].map((name) => `${name}@${sharpPackage.optionalDependencies[name]}`); + +execFileSync("npm.cmd", ["install", "--force", "--no-save", ...packages], { + stdio: "inherit", +});