From 149d64aeaf8acf3b74f0568e5dc93a7518132e9a Mon Sep 17 00:00:00 2001 From: Afonso Jorge Ramos Date: Tue, 10 Nov 2026 17:44:02 +0000 Subject: [PATCH 1/2] build: replace concurrently with vp run tasks --- package.json | 9 +- pnpm-lock.yaml | 267 +++++++++++++------------------ scripts/dev.mjs | 40 ----- scripts/prepare-dev-electron.mjs | 30 ++++ vite.config.mts | 39 +++++ 5 files changed, 182 insertions(+), 203 deletions(-) delete mode 100644 scripts/dev.mjs diff --git a/package.json b/package.json index c2a61f6a6..73c550c8b 100644 --- a/package.json +++ b/package.json @@ -55,9 +55,9 @@ "prepare": "husky", "build": "vp build", "codegen": "graphql-codegen --config codegen.ts", - "codegen:watch": "pnpm codegen --watch", - "dev": "node scripts/dev.mjs", - "devtools": "concurrently --names \"dev,devtools\" --prefix-colors \"cyan,green\" \"pnpm dev\" \"react-devtools\"", + "codegen:watch": "graphql-codegen --config codegen.ts --watch", + "dev": "vp run --log labeled dev:all", + "devtools": "vp run --log labeled devtools:all", "start": "pnpm build && pnpm dev", "package:linux": "electron-builder --linux", "package:macos": "electron-builder --mac", @@ -65,7 +65,7 @@ "check": "vp check", "check:fix": "vp check --fix", "i18n:extract": "i18next-cli extract --sync-all", - "i18n:check": "concurrently --kill-others-on-fail --names \"sync,values,defaults\" --prefix-colors \"yellow,green,cyan\" \"pnpm i18n:check:sync\" \"pnpm i18n:check:values\" \"pnpm i18n:check:defaults\"", + "i18n:check": "vp run --log labeled i18n:check:all", "i18n:check:sync": "i18next-cli extract --ci --quiet", "i18n:check:values": "node ./scripts/check-en-locales.mjs", "i18n:check:defaults": "node ./scripts/check-t-defaults.mjs", @@ -124,7 +124,6 @@ "@vitest/browser-playwright": "catalog:", "@vitest/coverage-v8": "catalog:", "cn": "0.5.2", - "concurrently": "10.0.6", "date-fns": "4.4.0", "dotenv": "18.0.9", "electron": "catalog:", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 32d068833..998ee773b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -197,20 +197,20 @@ importers: version: 5.4.4 electron-menubar: specifier: 11.1.3 - version: 11.1.3(electron@45.2.3(supports-color@10.2.2)) + version: 11.1.3(electron@45.2.3(supports-color@7.2.0)) electron-updater: specifier: 6.8.11 - version: 6.8.11(supports-color@10.2.2) + version: 6.8.11(supports-color@7.2.0) devDependencies: '@discordapp/twemoji': specifier: 16.0.1 version: 16.0.1 '@electron/notarize': specifier: 3.1.2 - version: 3.1.2(supports-color@10.2.2) + version: 3.1.2(supports-color@7.2.0) '@graphql-codegen/cli': specifier: 7.4.6 - version: 7.4.6(@parcel/watcher@2.6.0)(@types/node@24.19.2)(graphql@17.1.0)(supports-color@10.2.2)(typescript@7.0.2) + version: 7.4.6(@parcel/watcher@2.6.0)(@types/node@24.19.2)(graphql@17.1.0)(supports-color@7.2.0)(typescript@7.0.2) '@graphql-codegen/schema-ast': specifier: 6.1.1 version: 6.1.1(graphql@17.1.0) @@ -307,9 +307,6 @@ importers: cn: specifier: 0.5.2 version: 0.5.2 - concurrently: - specifier: 10.0.6 - version: 10.0.6 date-fns: specifier: 4.4.0 version: 4.4.0 @@ -318,10 +315,10 @@ importers: version: 18.0.9 electron: specifier: 45.2.3 - version: 45.2.3(supports-color@10.2.2) + version: 45.2.3(supports-color@7.2.0) electron-builder: specifier: 26.18.0 - version: 26.18.0(electron-builder-squirrel-windows@26.18.0)(supports-color@10.2.2) + version: 26.18.0(electron-builder-squirrel-windows@26.18.0)(supports-color@7.2.0) graphql: specifier: 17.1.0 version: 17.1.0 @@ -351,7 +348,7 @@ importers: version: 19.3.1 react-devtools: specifier: 8.0.0 - version: 8.0.0(supports-color@10.2.2) + version: 8.0.0(supports-color@7.2.0) react-dom: specifier: 19.3.1 version: 19.3.1(react@19.3.1) @@ -2584,11 +2581,6 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - concurrently@10.0.6: - resolution: {integrity: sha512-qgICXXFp2/3nAebRLmxcINKEXM1mLK3ij/y31P02VTs/KIkddIeC05n73DxOXsXMB9LFSqNU1/na3lDlOhcbIw==} - engines: {node: '>=22'} - hasBin: true - confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} @@ -4118,9 +4110,6 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - rxjs@7.8.2: - resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -4271,10 +4260,6 @@ packages: resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} engines: {node: '>= 8.0'} - supports-color@10.2.2: - resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} - engines: {node: '>=18'} - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -4355,10 +4340,6 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - truncate-utf8-bytes@1.0.2: resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} @@ -4673,10 +4654,6 @@ packages: resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} engines: {node: '>=12'} - yargs@18.0.0: - resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=23} - yargs@18.2.0: resolution: {integrity: sha512-9OpKOLeaoNFecEp7P6iYbzze/5CqWoH7N3SMs/6y1XF4nMvFMspEGZzJ6uFi9MmQwXhyzqYoSEKO3tvA3Z/o2w==} engines: {node: ^20.19.0 || ^22.12.0 || >=23} @@ -4738,20 +4715,20 @@ snapshots: '@babel/compat-data@7.29.7': {} - '@babel/core@7.29.13(supports-color@10.2.2)': + '@babel/core@7.29.13(supports-color@7.2.0)': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.13 '@babel/helper-compilation-targets': 7.29.13 - '@babel/helper-module-transforms': 7.29.13(@babel/core@7.29.13(supports-color@10.2.2))(supports-color@10.2.2) + '@babel/helper-module-transforms': 7.29.13(@babel/core@7.29.13(supports-color@7.2.0))(supports-color@7.2.0) '@babel/helpers': 7.29.13 '@babel/parser': 7.29.13 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.13(supports-color@10.2.2) + '@babel/traverse': 7.29.13(supports-color@7.2.0) '@babel/types': 7.29.11 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@7.2.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.2 @@ -4776,19 +4753,19 @@ snapshots: '@babel/helper-globals@7.29.7': {} - '@babel/helper-module-imports@7.29.7(supports-color@10.2.2)': + '@babel/helper-module-imports@7.29.7(supports-color@7.2.0)': dependencies: - '@babel/traverse': 7.29.13(supports-color@10.2.2) + '@babel/traverse': 7.29.13(supports-color@7.2.0) '@babel/types': 7.29.11 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.29.13(@babel/core@7.29.13(supports-color@10.2.2))(supports-color@10.2.2)': + '@babel/helper-module-transforms@7.29.13(@babel/core@7.29.13(supports-color@7.2.0))(supports-color@7.2.0)': dependencies: - '@babel/core': 7.29.13(supports-color@10.2.2) - '@babel/helper-module-imports': 7.29.7(supports-color@10.2.2) + '@babel/core': 7.29.13(supports-color@7.2.0) + '@babel/helper-module-imports': 7.29.7(supports-color@7.2.0) '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.13(supports-color@10.2.2) + '@babel/traverse': 7.29.13(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -4819,7 +4796,7 @@ snapshots: '@babel/parser': 7.29.13 '@babel/types': 7.29.11 - '@babel/traverse@7.29.13(supports-color@10.2.2)': + '@babel/traverse@7.29.13(supports-color@7.2.0)': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.13 @@ -4827,7 +4804,7 @@ snapshots: '@babel/parser': 7.29.13 '@babel/template': 7.29.7 '@babel/types': 7.29.11 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -4867,52 +4844,52 @@ snapshots: fs-extra: 9.1.0 minimist: 1.2.8 - '@electron/get@3.1.0(supports-color@10.2.2)': + '@electron/get@3.1.0(supports-color@7.2.0)': dependencies: - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@7.2.0) env-paths: 2.2.1 fs-extra: 8.1.0 got: 11.8.6 progress: 2.0.3 semver: 6.3.2 - sumchecker: 3.0.1(supports-color@10.2.2) + sumchecker: 3.0.1(supports-color@7.2.0) optionalDependencies: global-agent: 3.0.0 transitivePeerDependencies: - supports-color - '@electron/get@5.1.0(supports-color@10.2.2)': + '@electron/get@5.1.0(supports-color@7.2.0)': dependencies: - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@7.2.0) env-paths: 3.0.0 graceful-fs: 4.2.11 progress: 2.0.3 semver: 7.8.6 - sumchecker: 3.0.1(supports-color@10.2.2) + sumchecker: 3.0.1(supports-color@7.2.0) optionalDependencies: undici: 7.30.2 transitivePeerDependencies: - supports-color - '@electron/notarize@2.5.0(supports-color@10.2.2)': + '@electron/notarize@2.5.0(supports-color@7.2.0)': dependencies: - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@7.2.0) fs-extra: 9.1.0 promise-retry: 2.0.1 transitivePeerDependencies: - supports-color - '@electron/notarize@3.1.2(supports-color@10.2.2)': + '@electron/notarize@3.1.2(supports-color@7.2.0)': dependencies: - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@7.2.0) promise-retry: 2.0.1 transitivePeerDependencies: - supports-color - '@electron/osx-sign@1.3.3(supports-color@10.2.2)': + '@electron/osx-sign@1.3.3(supports-color@7.2.0)': dependencies: compare-version: 0.1.2 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@7.2.0) fs-extra: 10.1.0 isbinaryfile: 4.0.10 minimist: 1.2.8 @@ -4920,22 +4897,22 @@ snapshots: transitivePeerDependencies: - supports-color - '@electron/rebuild@4.2.1(supports-color@10.2.2)': + '@electron/rebuild@4.2.1(supports-color@7.2.0)': dependencies: '@malept/cross-spawn-promise': 2.0.0 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@7.2.0) node-abi: 4.40.0 node-api-version: 0.2.1 node-gyp: 12.4.0 - read-binary-file-arch: 1.0.6(supports-color@10.2.2) + read-binary-file-arch: 1.0.6(supports-color@7.2.0) transitivePeerDependencies: - supports-color - '@electron/universal@2.0.3(supports-color@10.2.2)': + '@electron/universal@2.0.3(supports-color@7.2.0)': dependencies: '@electron/asar': 3.4.1 '@malept/cross-spawn-promise': 2.0.0 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@7.2.0) dir-compare: 4.2.0 fs-extra: 11.4.1 minimatch: 9.0.9 @@ -4943,10 +4920,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@electron/windows-sign@1.2.2(supports-color@10.2.2)': + '@electron/windows-sign@1.2.2(supports-color@7.2.0)': dependencies: cross-dirname: 0.1.0 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@7.2.0) fs-extra: 11.4.1 minimist: 1.2.8 postject: 1.0.0-alpha.6 @@ -4989,7 +4966,7 @@ snapshots: graphql: 17.1.0 tslib: 2.9.1 - '@graphql-codegen/cli@7.4.6(@parcel/watcher@2.6.0)(@types/node@24.19.2)(graphql@17.1.0)(supports-color@10.2.2)(typescript@7.0.2)': + '@graphql-codegen/cli@7.4.6(@parcel/watcher@2.6.0)(@types/node@24.19.2)(graphql@17.1.0)(supports-color@7.2.0)(typescript@7.0.2)': dependencies: '@babel/generator': 7.29.13 '@babel/template': 7.29.7 @@ -4998,9 +4975,9 @@ snapshots: '@graphql-codegen/core': 6.2.2(graphql@17.1.0) '@graphql-codegen/plugin-helpers': 7.4.2(graphql@17.1.0) '@graphql-tools/apollo-engine-loader': 8.0.40(graphql@17.1.0) - '@graphql-tools/code-file-loader': 8.1.43(graphql@17.1.0)(supports-color@10.2.2) - '@graphql-tools/git-loader': 8.0.46(graphql@17.1.0)(supports-color@10.2.2) - '@graphql-tools/github-loader': 9.1.13(@types/node@24.19.2)(graphql@17.1.0)(supports-color@10.2.2) + '@graphql-tools/code-file-loader': 8.1.43(graphql@17.1.0)(supports-color@7.2.0) + '@graphql-tools/git-loader': 8.0.46(graphql@17.1.0)(supports-color@7.2.0) + '@graphql-tools/github-loader': 9.1.13(@types/node@24.19.2)(graphql@17.1.0)(supports-color@7.2.0) '@graphql-tools/graphql-file-loader': 8.1.24(graphql@17.1.0) '@graphql-tools/json-file-loader': 8.0.38(graphql@17.1.0) '@graphql-tools/load': 8.1.21(graphql@17.1.0) @@ -5150,9 +5127,9 @@ snapshots: graphql: 17.1.0 tslib: 2.9.1 - '@graphql-tools/code-file-loader@8.1.43(graphql@17.1.0)(supports-color@10.2.2)': + '@graphql-tools/code-file-loader@8.1.43(graphql@17.1.0)(supports-color@7.2.0)': dependencies: - '@graphql-tools/graphql-tag-pluck': 8.3.41(graphql@17.1.0)(supports-color@10.2.2) + '@graphql-tools/graphql-tag-pluck': 8.3.41(graphql@17.1.0)(supports-color@7.2.0) '@graphql-tools/utils': 12.1.0(graphql@17.1.0) globby: 11.1.0 graphql: 17.1.0 @@ -5248,9 +5225,9 @@ snapshots: graphql: 17.1.0 tslib: 2.9.1 - '@graphql-tools/git-loader@8.0.46(graphql@17.1.0)(supports-color@10.2.2)': + '@graphql-tools/git-loader@8.0.46(graphql@17.1.0)(supports-color@7.2.0)': dependencies: - '@graphql-tools/graphql-tag-pluck': 8.3.41(graphql@17.1.0)(supports-color@10.2.2) + '@graphql-tools/graphql-tag-pluck': 8.3.41(graphql@17.1.0)(supports-color@7.2.0) '@graphql-tools/utils': 12.1.0(graphql@17.1.0) graphql: 17.1.0 is-glob: 4.0.3 @@ -5260,10 +5237,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@graphql-tools/github-loader@9.1.13(@types/node@24.19.2)(graphql@17.1.0)(supports-color@10.2.2)': + '@graphql-tools/github-loader@9.1.13(@types/node@24.19.2)(graphql@17.1.0)(supports-color@7.2.0)': dependencies: '@graphql-tools/executor-http': 3.6.0(@types/node@24.19.2)(graphql@17.1.0) - '@graphql-tools/graphql-tag-pluck': 8.3.41(graphql@17.1.0)(supports-color@10.2.2) + '@graphql-tools/graphql-tag-pluck': 8.3.41(graphql@17.1.0)(supports-color@7.2.0) '@graphql-tools/utils': 12.1.0(graphql@17.1.0) '@whatwg-node/fetch': 0.12.1 '@whatwg-node/promise-helpers': 2.0.1 @@ -5292,11 +5269,11 @@ snapshots: tslib: 2.9.1 unixify: 1.0.0 - '@graphql-tools/graphql-tag-pluck@8.3.41(graphql@17.1.0)(supports-color@10.2.2)': + '@graphql-tools/graphql-tag-pluck@8.3.41(graphql@17.1.0)(supports-color@7.2.0)': dependencies: - '@babel/core': 7.29.13(supports-color@10.2.2) + '@babel/core': 7.29.13(supports-color@7.2.0) '@babel/parser': 7.29.13 - '@babel/traverse': 7.29.13(supports-color@10.2.2) + '@babel/traverse': 7.29.13(supports-color@7.2.0) '@babel/types': 7.29.11 '@graphql-tools/utils': 12.1.0(graphql@17.1.0) graphql: 17.1.0 @@ -5625,9 +5602,9 @@ snapshots: dependencies: cross-spawn: 7.0.6 - '@malept/flatpak-bundler@0.4.0(supports-color@10.2.2)': + '@malept/flatpak-bundler@0.4.0(supports-color@7.2.0)': dependencies: - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@7.2.0) fs-extra: 9.1.0 lodash: 4.18.1 tmp-promise: 3.0.3 @@ -6559,33 +6536,33 @@ snapshots: ansi-styles@6.2.3: {} - app-builder-lib@26.18.0(dmg-builder@26.18.0)(electron-builder-squirrel-windows@26.18.0)(supports-color@10.2.2): + app-builder-lib@26.18.0(dmg-builder@26.18.0)(electron-builder-squirrel-windows@26.18.0)(supports-color@7.2.0): dependencies: '@electron/asar': 3.4.1 '@electron/fuses': 1.8.0 - '@electron/get': 3.1.0(supports-color@10.2.2) - '@electron/notarize': 2.5.0(supports-color@10.2.2) - '@electron/osx-sign': 1.3.3(supports-color@10.2.2) - '@electron/rebuild': 4.2.1(supports-color@10.2.2) - '@electron/universal': 2.0.3(supports-color@10.2.2) - '@malept/flatpak-bundler': 0.4.0(supports-color@10.2.2) + '@electron/get': 3.1.0(supports-color@7.2.0) + '@electron/notarize': 2.5.0(supports-color@7.2.0) + '@electron/osx-sign': 1.3.3(supports-color@7.2.0) + '@electron/rebuild': 4.2.1(supports-color@7.2.0) + '@electron/universal': 2.0.3(supports-color@7.2.0) + '@malept/flatpak-bundler': 0.4.0(supports-color@7.2.0) '@noble/hashes': 1.8.0 '@peculiar/webcrypto': 1.7.2 '@types/fs-extra': 9.0.13 ajv: 8.20.0 asn1js: 3.1.0 async-exit-hook: 2.0.1 - builder-util: 26.16.0(supports-color@10.2.2) - builder-util-runtime: 9.7.0(supports-color@10.2.2) + builder-util: 26.16.0(supports-color@7.2.0) + builder-util-runtime: 9.7.0(supports-color@7.2.0) chromium-pickle-js: 0.2.0 ci-info: 4.3.1 - debug: 4.4.3(supports-color@10.2.2) - dmg-builder: 26.18.0(electron-builder-squirrel-windows@26.18.0)(supports-color@10.2.2) + debug: 4.4.3(supports-color@7.2.0) + dmg-builder: 26.18.0(electron-builder-squirrel-windows@26.18.0)(supports-color@7.2.0) dotenv: 16.6.1 dotenv-expand: 11.0.7 ejs: 3.1.10 - electron-builder-squirrel-windows: 26.18.0(dmg-builder@26.18.0)(supports-color@10.2.2) - electron-publish: 26.18.0(supports-color@10.2.2) + electron-builder-squirrel-windows: 26.18.0(dmg-builder@26.18.0)(supports-color@7.2.0) + electron-publish: 26.18.0(supports-color@7.2.0) fs-extra: 10.1.0 hosted-git-info: 4.1.0 isbinaryfile: 5.0.7 @@ -6700,23 +6677,23 @@ snapshots: dependencies: '@types/node': 24.19.2 - builder-util-runtime@9.7.0(supports-color@10.2.2): + builder-util-runtime@9.7.0(supports-color@7.2.0): dependencies: - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@7.2.0) sax: 1.6.1 transitivePeerDependencies: - supports-color - builder-util@26.16.0(supports-color@10.2.2): + builder-util@26.16.0(supports-color@7.2.0): dependencies: '@types/debug': 4.1.13 - builder-util-runtime: 9.7.0(supports-color@10.2.2) + builder-util-runtime: 9.7.0(supports-color@7.2.0) chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@7.2.0) fs-extra: 10.1.0 - http-proxy-agent: 7.0.2(supports-color@10.2.2) - https-proxy-agent: 7.0.6(supports-color@10.2.2) + http-proxy-agent: 7.0.2(supports-color@7.2.0) + https-proxy-agent: 7.0.6(supports-color@7.2.0) js-yaml: 4.3.2 sanitize-filename: 1.6.5 source-map-support: 0.5.21 @@ -6843,15 +6820,6 @@ snapshots: concat-map@0.0.1: {} - concurrently@10.0.6: - dependencies: - chalk: 5.6.2 - rxjs: 7.8.2 - shell-quote: 1.12.0 - supports-color: 10.2.2 - tree-kill: 1.2.2 - yargs: 18.0.0 - confbox@0.1.8: {} confbox@0.3.2: {} @@ -6918,11 +6886,11 @@ snapshots: debounce@3.0.0: {} - debug@4.4.3(supports-color@10.2.2): + debug@4.4.3(supports-color@7.2.0): dependencies: ms: 2.1.3 optionalDependencies: - supports-color: 10.2.2 + supports-color: 7.2.0 decompress-response@6.0.0: dependencies: @@ -6974,10 +6942,10 @@ snapshots: dependencies: path-type: 4.0.0 - dmg-builder@26.18.0(electron-builder-squirrel-windows@26.18.0)(supports-color@10.2.2): + dmg-builder@26.18.0(electron-builder-squirrel-windows@26.18.0)(supports-color@7.2.0): dependencies: - app-builder-lib: 26.18.0(dmg-builder@26.18.0)(electron-builder-squirrel-windows@26.18.0)(supports-color@10.2.2) - builder-util: 26.16.0(supports-color@10.2.2) + app-builder-lib: 26.18.0(dmg-builder@26.18.0)(electron-builder-squirrel-windows@26.18.0)(supports-color@7.2.0) + builder-util: 26.16.0(supports-color@7.2.0) fs-extra: 10.1.0 js-yaml: 4.3.2 transitivePeerDependencies: @@ -7014,23 +6982,23 @@ snapshots: dependencies: jake: 10.9.4 - electron-builder-squirrel-windows@26.18.0(dmg-builder@26.18.0)(supports-color@10.2.2): + electron-builder-squirrel-windows@26.18.0(dmg-builder@26.18.0)(supports-color@7.2.0): dependencies: - app-builder-lib: 26.18.0(dmg-builder@26.18.0)(electron-builder-squirrel-windows@26.18.0)(supports-color@10.2.2) - builder-util: 26.16.0(supports-color@10.2.2) - electron-winstaller: 5.4.0(supports-color@10.2.2) + app-builder-lib: 26.18.0(dmg-builder@26.18.0)(electron-builder-squirrel-windows@26.18.0)(supports-color@7.2.0) + builder-util: 26.16.0(supports-color@7.2.0) + electron-winstaller: 5.4.0(supports-color@7.2.0) transitivePeerDependencies: - dmg-builder - supports-color - electron-builder@26.18.0(electron-builder-squirrel-windows@26.18.0)(supports-color@10.2.2): + electron-builder@26.18.0(electron-builder-squirrel-windows@26.18.0)(supports-color@7.2.0): dependencies: - app-builder-lib: 26.18.0(dmg-builder@26.18.0)(electron-builder-squirrel-windows@26.18.0)(supports-color@10.2.2) - builder-util: 26.16.0(supports-color@10.2.2) - builder-util-runtime: 9.7.0(supports-color@10.2.2) + app-builder-lib: 26.18.0(dmg-builder@26.18.0)(electron-builder-squirrel-windows@26.18.0)(supports-color@7.2.0) + builder-util: 26.16.0(supports-color@7.2.0) + builder-util-runtime: 9.7.0(supports-color@7.2.0) chalk: 4.1.2 ci-info: 4.4.0 - dmg-builder: 26.18.0(electron-builder-squirrel-windows@26.18.0)(supports-color@10.2.2) + dmg-builder: 26.18.0(electron-builder-squirrel-windows@26.18.0)(supports-color@7.2.0) fs-extra: 10.1.0 lazy-val: 1.0.5 simple-update-notifier: 2.0.0 @@ -7041,16 +7009,16 @@ snapshots: electron-log@5.4.4: {} - electron-menubar@11.1.3(electron@45.2.3(supports-color@10.2.2)): + electron-menubar@11.1.3(electron@45.2.3(supports-color@7.2.0)): dependencies: - electron: 45.2.3(supports-color@10.2.2) + electron: 45.2.3(supports-color@7.2.0) - electron-publish@26.18.0(supports-color@10.2.2): + electron-publish@26.18.0(supports-color@7.2.0): dependencies: '@types/fs-extra': 9.0.13 aws4: 1.13.2 - builder-util: 26.16.0(supports-color@10.2.2) - builder-util-runtime: 9.7.0(supports-color@10.2.2) + builder-util: 26.16.0(supports-color@7.2.0) + builder-util-runtime: 9.7.0(supports-color@7.2.0) chalk: 4.1.2 form-data: 4.0.6 fs-extra: 10.1.0 @@ -7061,9 +7029,9 @@ snapshots: electron-to-chromium@1.5.478: {} - electron-updater@6.8.11(supports-color@10.2.2): + electron-updater@6.8.11(supports-color@7.2.0): dependencies: - builder-util-runtime: 9.7.0(supports-color@10.2.2) + builder-util-runtime: 9.7.0(supports-color@7.2.0) fs-extra: 10.1.0 js-yaml: 4.3.2 lazy-val: 1.0.5 @@ -7074,22 +7042,22 @@ snapshots: transitivePeerDependencies: - supports-color - electron-winstaller@5.4.0(supports-color@10.2.2): + electron-winstaller@5.4.0(supports-color@7.2.0): dependencies: '@electron/asar': 3.4.1 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@7.2.0) fs-extra: 7.0.1 lodash: 4.18.1 temp: 0.9.4 optionalDependencies: - '@electron/windows-sign': 1.2.2(supports-color@10.2.2) + '@electron/windows-sign': 1.2.2(supports-color@7.2.0) transitivePeerDependencies: - supports-color - electron@45.2.3(supports-color@10.2.2): + electron@45.2.3(supports-color@7.2.0): dependencies: '@electron-internal/extract-zip': 1.0.8 - '@electron/get': 5.1.0(supports-color@10.2.2) + '@electron/get': 5.1.0(supports-color@7.2.0) '@types/node': 24.19.2 transitivePeerDependencies: - supports-color @@ -7476,10 +7444,10 @@ snapshots: http-cache-semantics@4.3.0: {} - http-proxy-agent@7.0.2(supports-color@10.2.2): + http-proxy-agent@7.0.2(supports-color@7.2.0): dependencies: agent-base: 7.1.4 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -7488,10 +7456,10 @@ snapshots: quick-lru: 5.1.1 resolve-alpn: 1.2.1 - https-proxy-agent@7.0.6(supports-color@10.2.2): + https-proxy-agent@7.0.6(supports-color@7.2.0): dependencies: agent-base: 7.1.4 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -8253,10 +8221,10 @@ snapshots: - bufferutil - utf-8-validate - react-devtools@8.0.0(supports-color@10.2.2): + react-devtools@8.0.0(supports-color@7.2.0): dependencies: cross-spawn: 7.0.6 - electron: 45.2.3(supports-color@10.2.2) + electron: 45.2.3(supports-color@7.2.0) internal-ip: 6.2.0 minimist: 1.2.8 react-devtools-core: 8.0.0 @@ -8302,9 +8270,9 @@ snapshots: react@19.3.1: {} - read-binary-file-arch@1.0.6(supports-color@10.2.2): + read-binary-file-arch@1.0.6(supports-color@7.2.0): dependencies: - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -8391,10 +8359,6 @@ snapshots: dependencies: queue-microtask: 1.2.3 - rxjs@7.8.2: - dependencies: - tslib: 2.9.1 - safe-buffer@5.1.2: {} safer-buffer@2.1.2: {} @@ -8518,14 +8482,12 @@ snapshots: strip-json-comments@2.0.1: {} - sumchecker@3.0.1(supports-color@10.2.2): + sumchecker@3.0.1(supports-color@7.2.0): dependencies: - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color - supports-color@10.2.2: {} - supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -8599,8 +8561,6 @@ snapshots: totalist@3.0.1: {} - tree-kill@1.2.2: {} - truncate-utf8-bytes@1.0.2: dependencies: utf8-byte-length: 1.0.5 @@ -8909,15 +8869,6 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - yargs@18.0.0: - dependencies: - cliui: 9.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - string-width: 7.2.0 - y18n: 5.0.8 - yargs-parser: 22.0.0 - yargs@18.2.0: dependencies: cliui: 9.0.1 diff --git a/scripts/dev.mjs b/scripts/dev.mjs deleted file mode 100644 index 119fb7df9..000000000 --- a/scripts/dev.mjs +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env node -/** - * Start the development server with a branded macOS Electron bundle. - * - * The notification-enabled dev process must not run from the generic - * Electron.app, or macOS activates the default Electron app on a notification - * click. The prepared bundle is selected through ELECTRON_OVERRIDE_DIST_PATH. - */ -import { spawn } from 'node:child_process'; - -import { prepareDevElectronBundle } from './prepare-dev-electron.mjs'; - -const env = { ...process.env }; -const overrideDirectory = prepareDevElectronBundle(); - -if (overrideDirectory) { - env.ELECTRON_OVERRIDE_DIST_PATH = overrideDirectory; -} - -const command = process.platform === 'win32' ? 'pnpm.cmd' : 'pnpm'; -const child = spawn( - command, - [ - 'exec', - 'concurrently', - '--names', - 'vite,codegen', - '--prefix-colors', - 'blue,magenta', - 'vp dev', - 'pnpm codegen:watch', - ], - { env, stdio: 'inherit' }, -); - -child.on('exit', (code) => process.exit(code ?? 0)); -child.on('error', (error) => { - console.error('[dev] failed to start the development server', error); - process.exit(1); -}); diff --git a/scripts/prepare-dev-electron.mjs b/scripts/prepare-dev-electron.mjs index 7ed6145ce..056404215 100644 --- a/scripts/prepare-dev-electron.mjs +++ b/scripts/prepare-dev-electron.mjs @@ -86,6 +86,36 @@ export function prepareDevElectronBundle() { return cacheRoot; } +/** + * Prepare the bundle and point this process's `electron` package at it. + * + * `electron` resolves its binary path once, when first required, and + * preparing the bundle has already required it. Dropping that module from the + * require cache makes the next `require('electron')`, such as the one + * vite-plugin-electron makes before spawning, read + * `ELECTRON_OVERRIDE_DIST_PATH`. + * + * A dev server restart calls this again in the same process, so the override + * from the previous call is cleared first. Otherwise preparation would treat + * the prepared copy as its source and delete it before copying. + */ +export function applyDevElectronBundle() { + if (process.platform !== 'darwin') { + return; + } + + const require = createRequire(import.meta.url); + const electronModule = require.resolve('electron'); + + delete process.env.ELECTRON_OVERRIDE_DIST_PATH; + delete require.cache[electronModule]; + + const overrideDirectory = prepareDevElectronBundle(); + + process.env.ELECTRON_OVERRIDE_DIST_PATH = overrideDirectory; + delete require.cache[electronModule]; +} + /** * Register the prepared bundle with Launch Services. * diff --git a/vite.config.mts b/vite.config.mts index 9e1184cb8..99395ad21 100644 --- a/vite.config.mts +++ b/vite.config.mts @@ -12,6 +12,7 @@ import electron from 'vite-plugin-electron/simple'; import type { Logger, Plugin } from 'vite-plus'; import { createLogger, defineConfig } from 'vite-plus'; +import { applyDevElectronBundle } from './scripts/prepare-dev-electron.mjs'; import { Constants } from './src/renderer/constants.ts'; const projectRoot = fileURLToPath(new URL('.', import.meta.url)); @@ -238,6 +239,19 @@ const storeBarrelBoundaryPattern = { 'Renderer boundary: import the specific store module instead of the `stores` barrel (see ARCHITECTURE.md).', }; +/** + * Prepare the branded macOS Electron bundle once per dev server, before either + * Electron entry's `onstart` can spawn Electron (see + * scripts/prepare-dev-electron.mjs). + */ +const devElectronBundlePlugin = (): Plugin => ({ + name: 'dev-electron-bundle', + apply: 'serve', + configureServer() { + applyDevElectronBundle(); + }, +}); + export default defineConfig({ // Keep the dev output to real problems: see `createDevLogger` above. customLogger: createDevLogger(), @@ -279,6 +293,7 @@ export default defineConfig({ reactDevToolsPlugin(), react(), tailwindcss(), + devElectronBundlePlugin(), electron({ main: { entry: fileURLToPath(new URL('src/main/index.ts', import.meta.url)), @@ -347,6 +362,30 @@ export default defineConfig({ // Development Keys - See CONTRIBUTING.md 'process.env.OAUTH_CLIENT_ID': JSON.stringify('Ov23liQIkFs5ehQLNzHF'), }, + // `vp run` accepts a single task, so each group below runs its members as + // independent `dependsOn` entries, which start concurrently. The group's own + // command is a no-op that runs only after every member succeeds. + run: { + tasks: { + 'dev:all': { + command: 'node -e ""', + cache: false, + dependsOn: ['dev:renderer', 'codegen:watch'], + }, + 'dev:renderer': { command: 'vp dev', cache: false }, + 'devtools:all': { + command: 'node -e ""', + cache: false, + dependsOn: ['dev:all', 'devtools:react'], + }, + 'devtools:react': { command: 'react-devtools', cache: false }, + 'i18n:check:all': { + command: 'node -e ""', + cache: false, + dependsOn: ['i18n:check:sync', 'i18n:check:values', 'i18n:check:defaults'], + }, + }, + }, lint: { plugins: ['typescript', 'react', 'unicorn', 'oxc', 'import', 'vitest', 'jsdoc'], // Enable the type-aware path so `vp check` runs TypeScript type checks From 41510f17ef75f04400885e453a8a37f34992c50e Mon Sep 17 00:00:00 2001 From: Afonso Jorge Ramos Date: Tue, 10 Nov 2026 17:47:13 +0000 Subject: [PATCH 2/2] build: drop standalone entry from dev Electron bundle script --- scripts/prepare-dev-electron.mjs | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/scripts/prepare-dev-electron.mjs b/scripts/prepare-dev-electron.mjs index 056404215..c52cdcdca 100644 --- a/scripts/prepare-dev-electron.mjs +++ b/scripts/prepare-dev-electron.mjs @@ -1,4 +1,3 @@ -#!/usr/bin/env node /** * Prepare a Gitify-branded development Electron bundle. * @@ -13,7 +12,7 @@ * checkout also keeps one stable bundle across worktrees instead of a new * identity for every path. * - * Returns the directory to use with `ELECTRON_OVERRIDE_DIST_PATH`. + * The Vite dev server calls `applyDevElectronBundle()` before starting Electron. */ import { execFileSync } from 'node:child_process'; import fs from 'node:fs'; @@ -30,8 +29,8 @@ const MARKER_VERSION = 1; const LSREGISTER = '/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister'; -export const DEV_BUNDLE_IDENTIFIER = 'com.electron.gitify.dev'; -export const DEV_BUNDLE_NAME = 'Gitify Dev'; +const DEV_BUNDLE_IDENTIFIER = 'com.electron.gitify.dev'; +const DEV_BUNDLE_NAME = 'Gitify Dev'; /** * Prepare and return the override directory, or undefined when the current @@ -39,7 +38,7 @@ export const DEV_BUNDLE_NAME = 'Gitify Dev'; * * @returns {string | undefined} */ -export function prepareDevElectronBundle() { +function prepareDevElectronBundle() { if (process.platform !== 'darwin') { return undefined; } @@ -227,11 +226,3 @@ function resolveIdentity() { return '-'; } } - -if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) { - const overrideDirectory = prepareDevElectronBundle(); - - if (overrideDirectory) { - console.log(overrideDirectory); - } -}