diff --git a/engine-sources.lock.json b/engine-sources.lock.json index 1f56850..74a1856 100644 --- a/engine-sources.lock.json +++ b/engine-sources.lock.json @@ -8,9 +8,9 @@ "sha256": "30b4c14aafab6082becff7881e41b76df46dc43ea7633479410a91e29da492bf" }, "deno": { - "version": "2.9.6", - "url": "https://github.com/denoland/deno/releases/download/v2.9.6/deno-x86_64-pc-windows-msvc.zip", - "sha256": "15e5300b0ba3c3695a7621d90160a746ec9e710228cee639afa9d580f6e3cd11" + "version": "2.9.7", + "url": "https://github.com/denoland/deno/releases/download/v2.9.7/deno-x86_64-pc-windows-msvc.zip", + "sha256": "a0c3101b4158d1dfb7d6a78a7bf0f3de80c96bb423c152beec8beb22786f2238" }, "ffmpeg": { "version": "9.0.1-29-gad500d59cb", @@ -40,9 +40,9 @@ "sha256": "32e72032766bef9199d99d15beb69fd52e46df8f8b06f0d8745db59e04d339e9" }, "deno": { - "version": "2.9.6", - "url": "https://github.com/denoland/deno/releases/download/v2.9.6/deno-x86_64-unknown-linux-gnu.zip", - "sha256": "394f07f4da2bebe6ce6f1e7ce0fa16429b29b08c35e3fac3fe25972676dff4b2" + "version": "2.9.7", + "url": "https://github.com/denoland/deno/releases/download/v2.9.7/deno-x86_64-unknown-linux-gnu.zip", + "sha256": "c6527f24f4b16031d3ae4fa9f658d5f11534c8d84ce7dc8502420280919c3490" }, "ffmpeg": { "version": "9.0.1-29-gad500d59cb", diff --git a/engines.lock.json b/engines.lock.json index 37ca52e..f374351 100644 --- a/engines.lock.json +++ b/engines.lock.json @@ -32,10 +32,10 @@ "sha256": "393e4c395020a1cb7cbd77fbe00599ce69d1c6466fee0dbd59d13f86a81a1611" }, "deno": { - "version": "2.9.6", + "version": "2.9.7", "source": "https://github.com/denoland/deno", "build": "official aarch64-apple-darwin executable", - "sha256": "b3ac3bd206e48c26026cadd80c1367e96c149f9c66130952382a642b09fa8a71" + "sha256": "b73737579d5a84c160e3316487594783fa5c15f4e13252a6a07050b755317f1a" } }, "runtimeTrees": { diff --git a/package-lock.json b/package-lock.json index 7381d7c..a0998e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,6 @@ "@fontsource-variable/outfit": "^5.3.0", "@fontsource-variable/roboto": "^5.3.0", "@fontsource-variable/vazirmatn": "^5.3.0", - "@formkit/auto-animate": "^0.10.0", "@tailwindcss/vite": "^4.3.3", "@tauri-apps/api": "^2.11.1", "@tauri-apps/plugin-clipboard-manager": "^2.3.3", @@ -25,7 +24,7 @@ "@tauri-apps/plugin-notification": "^2.4.0", "@tauri-apps/plugin-opener": "^2.5.5", "i18next": "^26.4.2", - "lucide-react": "^1.46.0", + "lucide-react": "^1.47.0", "react": "^19.3.0", "react-dom": "^19.3.0", "react-i18next": "^17.0.14", @@ -36,12 +35,10 @@ "@types/react": "^19.3.0", "@types/react-dom": "^19.3.0", "@vitejs/plugin-react": "^6.1.1", - "autoprefixer": "^10.6.0", - "postcss": "^8.5.28", "tailwindcss": "^4.3.3", "typescript": "^7.0.2", "vite": "^8.3.0", - "vitest": "^5.0.0" + "vitest": "^5.0.1" }, "engines": { "node": ">=22.12" @@ -110,12 +107,6 @@ "url": "https://github.com/sponsors/ayuhito" } }, - "node_modules/@formkit/auto-animate": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@formkit/auto-animate/-/auto-animate-0.10.0.tgz", - "integrity": "sha512-KGomRttjUfORuPUaR/ZGQw+6xfMrTM+sxnILv7JAd9AmabU9rg9i6gF/iC0Ih+QpKCubJpCA/1DX9UHKE8cX+A==", - "license": "MIT" - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -146,9 +137,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { @@ -1455,14 +1446,14 @@ } }, "node_modules/@vitest/mocker": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-5.0.0.tgz", - "integrity": "sha512-66PGTMIiVJP3t4a5yxU9qPtf7MdTBs8jmToMvy+HVflB3Yy13WJZTtPePdvU+wjRV02SKK5doLbSA6o9pwOmiA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-5.0.1.tgz", + "integrity": "sha512-6K1DoBNAPGvuOcSsGA4D6x+5zEEff/KmOOP3uetT2TrGpVfI+HRHRnJJfKi5ib/g1vx8IYHQD8s0pbJz8WQI7Q==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.31", - "@vitest/spy": "5.0.0", + "@vitest/spy": "5.0.1", "estree-walker": "^3.0.3", "magic-string": "^1.2.3" }, @@ -1483,19 +1474,19 @@ } }, "node_modules/@vitest/mocker/node_modules/magic-string": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.2.3.tgz", - "integrity": "sha512-Bpb0W2TbLKOZ7vJnOUnVRGq3WL2p+ISV29M6hYPL1AFCpyKZpdr5ytiXoTSSxRVhg8YW7f65+6gbG8WG6PCa/g==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.1.tgz", + "integrity": "sha512-8lyCu36ErXR0J9uaGKlKQoiLZKmtI63YGLE8G2o9jyRPdr4X47LusSOwgOJOzcVtp81fTAAjxR7BwKz682Jhow==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" + "@jridgewell/sourcemap-codec": "^1.6.0" } }, "node_modules/@vitest/spy": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-5.0.0.tgz", - "integrity": "sha512-uy+luWBAPw9XfthoHi5AkfHUnuPYEESjl0p/r+meoBnU8bxg5GDQ3Ey8MjcJ6sqahkL4PFyrvfMJJBw7LbU06g==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-5.0.1.tgz", + "integrity": "sha512-rbto/mF/SGERxEgYOek7Xm6B9b+y+mVoo+f4b2LymYO8zM1b7uB5nHuhVMTP2hxdzgxvGiZYGxGIaMvL5y180Q==", "dev": true, "license": "MIT", "funding": { @@ -1512,111 +1503,6 @@ "node": ">=12" } }, - "node_modules/autoprefixer": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.6.0.tgz", - "integrity": "sha512-A26d6qs9kqGgkmImIXMYvXTzqb4Qv7AVgpY1NXzr9Y659J8qHHnLOO/zE8ewIGFMprOolAoRAQYDgNryXIJKBw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.9", - "caniuse-lite": "^1.0.30001810", - "fraction.js": "^5.3.4", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.11.21", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.21.tgz", - "integrity": "sha512-uh8vpY/1/YyFkunIDFH/12p7/7VdPKA1hejMVEbdkEaWnUz0Hesvx5EbiU6XxjyHZIOju+ZMbQJkRh+es3/spQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/browserslist": { - "version": "4.28.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.9.tgz", - "integrity": "sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.11.20", - "caniuse-lite": "^1.0.30001810", - "electron-to-chromium": "^1.5.420", - "node-releases": "^2.0.54", - "update-browserslist-db": "^1.3.2" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001810", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", - "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, "node_modules/chai": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", @@ -1643,13 +1529,6 @@ "node": ">=8" } }, - "node_modules/electron-to-chromium": { - "version": "1.5.422", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.422.tgz", - "integrity": "sha512-UvA/32XqrLDdZSn7Jllo1AYNcWji/G0d5M0GTViE7KoGBiMunw3a34Sb2KO4ZZyrSEhqsxFoVhWWJshdyfKqJA==", - "dev": true, - "license": "ISC" - }, "node_modules/enhanced-resolve": { "version": "5.24.5", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", @@ -1670,16 +1549,6 @@ "dev": true, "license": "MIT" }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", @@ -1717,20 +1586,6 @@ } } }, - "node_modules/fraction.js": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", - "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/rawify" - } - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -2059,9 +1914,9 @@ } }, "node_modules/lucide-react": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.46.0.tgz", - "integrity": "sha512-Bv+FZXgZPrxc/NCl1e7JJVQFLdiCxYgxNVhqoV7X0p6I8ADJo8DxBnK1auH0fZz4AmqOJ3jgneL4f1i8LJQRAA==", + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.47.0.tgz", + "integrity": "sha512-o8C23aXpNQypRY73W7fW02EyvWJinEMXgKeGjFoKym0zj3Q73hD97A1IQps1g8C14HTGsOpZL0Am+xjfgFZAbg==", "license": "ISC", "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -2094,16 +1949,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/node-releases": { - "version": "2.0.54", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.54.tgz", - "integrity": "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/obug": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", @@ -2164,13 +2009,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true, - "license": "MIT" - }, "node_modules/react": { "version": "19.3.0", "resolved": "https://registry.npmjs.org/react/-/react-19.3.0.tgz", @@ -2378,37 +2216,6 @@ "@typescript/typescript-win32-x64": "7.0.2" } }, - "node_modules/update-browserslist-db": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz", - "integrity": "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, "node_modules/use-sync-external-store": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", @@ -2757,14 +2564,14 @@ } }, "node_modules/vitest": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-5.0.0.tgz", - "integrity": "sha512-gpsMNoRhMjMktVxPtstOH4/PJuPyovVaMDr4oDilXaGH1EcqM2OE96SoHT2VIQ6fTGtTjqmHDrEu2X9RQiXf8Q==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-5.0.1.tgz", + "integrity": "sha512-iA95lQbKEkvrtTkdAgnWbXfbipWiiWe/hDl2P5tMi6WFwD76G0NxXAGp/M9EOcYupeGJRr6wppMc7CoA41TQjg==", "dev": true, "license": "MIT", "dependencies": { "@types/chai": "^5.2.2", - "@vitest/mocker": "5.0.0", + "@vitest/mocker": "5.0.1", "chai": "^6.2.2", "es-module-lexer": "^2.3.2", "expect-type": "^1.4.0", @@ -2790,12 +2597,12 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "5.0.0", - "@vitest/browser-preview": "5.0.0", + "@vitest/browser-playwright": "5.0.1", + "@vitest/browser-preview": "5.0.1", "@vitest/browser-webdriverio": "^5.0.0-beta.5 || >=5.0.0", - "@vitest/coverage-istanbul": "5.0.0", - "@vitest/coverage-v8": "5.0.0", - "@vitest/ui": "5.0.0", + "@vitest/coverage-istanbul": "5.0.1", + "@vitest/coverage-v8": "5.0.1", + "@vitest/ui": "5.0.1", "happy-dom": "*", "jsdom": "*", "vite": "^6.4.0 || ^7.0.0 || ^8.0.0" diff --git a/package.json b/package.json index 713dd8e..ea61263 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,6 @@ "@fontsource-variable/outfit": "^5.3.0", "@fontsource-variable/roboto": "^5.3.0", "@fontsource-variable/vazirmatn": "^5.3.0", - "@formkit/auto-animate": "^0.10.0", "@tailwindcss/vite": "^4.3.3", "@tauri-apps/api": "^2.11.1", "@tauri-apps/plugin-clipboard-manager": "^2.3.3", @@ -61,7 +60,7 @@ "@tauri-apps/plugin-notification": "^2.4.0", "@tauri-apps/plugin-opener": "^2.5.5", "i18next": "^26.4.2", - "lucide-react": "^1.46.0", + "lucide-react": "^1.47.0", "react": "^19.3.0", "react-dom": "^19.3.0", "react-i18next": "^17.0.14", @@ -72,11 +71,9 @@ "@types/react": "^19.3.0", "@types/react-dom": "^19.3.0", "@vitejs/plugin-react": "^6.1.1", - "autoprefixer": "^10.6.0", - "postcss": "^8.5.28", "tailwindcss": "^4.3.3", "typescript": "^7.0.2", "vite": "^8.3.0", - "vitest": "^5.0.0" + "vitest": "^5.0.1" } } diff --git a/scripts/check-updates.js b/scripts/check-updates.js index 55446b7..165c1c2 100644 --- a/scripts/check-updates.js +++ b/scripts/check-updates.js @@ -323,6 +323,18 @@ function printCargoReport(updates) { return updates.length; } +function hasUpdateCheckFailures({ + outdatedCount, + engineIssueCount, + providerFailures, + providerBehind, +}) { + return outdatedCount > 0 + || engineIssueCount > 0 + || providerFailures.length > 0 + || providerBehind.length > 0; +} + function printNpmReport(label, outdated) { const entries = Object.entries(outdated); if (!entries.length) { @@ -370,14 +382,6 @@ function packagedEngineVersions(engineLock) { return rows; } -function unavailableLatestVersionError(target, engine, targetSpecific) { - const error = new Error( - `${targetSpecific ? 'Latest provider version' : 'Latest version'} is unavailable for ${target} ${engine}` - ); - error.code = 'LATEST_VERSION_UNAVAILABLE'; - return error; -} - function checkRows( rows, latestByEngine, @@ -386,17 +390,74 @@ function checkRows( targetSpecificEngines = new Set(), latestHashesByTargetEngine = {}, latestHashesByUrl = {}, + providerStatusesByTargetEngine = {}, + providerStatusesByEngine = {}, ) { - let outdated = 0; + const report = { + rows: [], + counts: { + current: 0, + outdated: 0, + 'hash-mismatch': 0, + 'provider-behind': 0, + unverified: 0, + }, + }; + + const providerStatus = value => { + if (!value) return undefined; + if (typeof value === 'string') return { status: value }; + return value; + }; + + const printRow = rowResult => { + const wanted = rowResult.latest || 'unavailable'; + console.log(` ${rowResult.target} ${rowResult.engine}: ${rowResult.current} -> ${wanted} ${rowResult.status}`); + if (rowResult.reason) console.log(` reason: ${rowResult.reason}`); + if (rowResult.source) console.log(` source: ${rowResult.source}`); + if (rowResult.hash) { + console.log(` source sha256: ${rowResult.hash.current || 'missing'} -> ${rowResult.hash.latest || 'unavailable'}`); + } + }; + for (const row of rows) { const targetSpecific = targetSpecificEngines.has(row.engine); const targetKey = `${row.target}:${row.engine}`; + const provider = providerStatus( + providerStatusesByTargetEngine[targetKey] || providerStatusesByEngine[row.engine], + ); const latest = targetSpecific ? latestByTargetEngine[targetKey] : latestByTargetEngine[targetKey] || latestByEngine[row.engine]; - if (typeof latest !== 'string' || !latest.trim()) { - throw unavailableLatestVersionError(row.target, row.engine, targetSpecific); + + if (provider?.status === 'provider-behind' || provider?.status === 'unverified') { + const rowResult = { + ...row, + current: normalizeVersion(row.version), + latest: latest ? normalizeVersion(latest) : undefined, + status: provider.status, + reason: provider.detail, + }; + report.rows.push(rowResult); + report.counts[provider.status] += 1; + printRow(rowResult); + continue; } + + if (typeof latest !== 'string' || !latest.trim()) { + const rowResult = { + ...row, + current: normalizeVersion(row.version), + latest: undefined, + status: 'unverified', + reason: `${targetSpecific ? 'target-specific provider' : 'latest provider'} version is unavailable`, + }; + report.rows.push(rowResult); + report.counts.unverified += 1; + printRow(rowResult); + continue; + } + const current = normalizeVersion(row.version); const wanted = normalizeVersion(latest); const latestUrl = latestUrlsByTargetEngine[targetKey]; @@ -405,20 +466,35 @@ function checkRows( const latestHash = latestHashesByTargetEngine[targetKey] || latestHashesByUrl[row.url]; const checkedHash = row.sourceSha256 || row.sha256; const currentHash = typeof checkedHash === 'string' ? checkedHash.toLowerCase() : ''; - const hashOutdated = Boolean(latestHash && currentHash !== latestHash); + const hashMismatch = Boolean(latestHash && currentHash !== latestHash); + const hashRequired = Object.hasOwn(row, 'sourceSha256') || Object.hasOwn(row, 'sha256'); + const hashUnavailable = Boolean(hashRequired && !latestHash); const status = versionOutdated ? 'outdated' : sourceOutdated - ? 'source-outdated' - : hashOutdated - ? 'hash-outdated' - : 'current'; - if (status !== 'current') outdated += 1; - console.log(` ${row.target} ${row.engine}: ${current} -> ${wanted} ${status}`); - if (sourceOutdated) console.log(` source: ${row.url} -> ${latestUrl}`); - if (hashOutdated) console.log(` source sha256: ${checkedHash || 'missing'} -> ${latestHash}`); + ? 'outdated' + : hashMismatch + ? 'hash-mismatch' + : hashUnavailable + ? 'unverified' + : 'current'; + + const rowResult = { + ...row, + current, + latest: wanted, + status, + source: sourceOutdated ? `${row.url} -> ${latestUrl}` : undefined, + hash: hashMismatch || hashUnavailable + ? { current: checkedHash, latest: latestHash } + : undefined, + reason: hashUnavailable ? 'provider did not supply a verifiable SHA-256 digest' : undefined, + }; + report.rows.push(rowResult); + report.counts[status] += 1; + printRow(rowResult); } - return outdated; + return report; } async function main() { @@ -433,15 +509,24 @@ async function main() { const ffmpegStablePromise = latestFfmpegStable(); const providerChecks = [ - ['yt-dlp latest release', () => githubLatest('yt-dlp/yt-dlp')], - ['Deno latest release', () => githubLatest('denoland/deno')], - ['aria2 latest release', () => githubLatest('aria2/aria2')], + ['yt-dlp latest release', async () => ({ + status: 'available', + value: await githubLatest('yt-dlp/yt-dlp'), + })], + ['Deno latest release', async () => ({ + status: 'available', + value: await githubLatest('denoland/deno'), + })], + ['aria2 latest release', async () => ({ + status: 'available', + value: await githubLatest('aria2/aria2'), + })], [ 'FFmpeg stable release', async () => { const version = await ffmpegStablePromise; if (!version) throw new Error('FFmpeg release provider response has no usable version'); - return version; + return { status: 'available', value: version }; }, ], [ @@ -455,9 +540,12 @@ async function main() { !build.sha256 || compareVersions(build.version, stableVersion) !== 0 ) { - throw new Error('Martin Riedl FFmpeg provider response has no complete matching macOS arm64 stable build'); + return { + status: 'provider-behind', + detail: 'no complete matching macOS arm64 stable build is published', + }; } - return build; + return { status: 'available', value: build }; }, ], [ @@ -471,24 +559,44 @@ async function main() { !build.hashes?.windows || !build.hashes?.linux ) { - throw new Error('BtbN FFmpeg provider response has no complete Windows/Linux build with SHA-256 digests'); + return { + status: 'provider-behind', + detail: 'no complete matching Windows/Linux stable build with SHA-256 digests is published', + }; } - return build; + return { status: 'available', value: build }; }, ], ]; const providerResults = await Promise.allSettled(providerChecks.map(([, check]) => check())); const providerFailures = []; - for (const [index, [label]] of providerChecks.entries()) { + const providerBehind = []; + const providerOutcomes = providerChecks.map(([label], index) => { const result = providerResults[index]; if (result.status === 'rejected') { const detail = result.reason instanceof Error ? result.reason.message : String(result.reason); + return { status: 'unverified', detail, label }; + } + if ( + !result.value || + !['available', 'provider-behind'].includes(result.value.status) + ) { + return { status: 'unverified', detail: 'provider returned an invalid result', label }; + } + return { ...result.value, label }; + }); + for (const [index, [label]] of providerChecks.entries()) { + const outcome = providerOutcomes[index]; + if (outcome.status === 'unverified') { providerFailures.push(label); - console.error(`provider unavailable: ${label}: ${detail}`); + console.error(`provider unavailable: ${label}: ${outcome.detail}`); + } else if (outcome.status === 'provider-behind') { + providerBehind.push(label); + console.error(`provider behind: ${label}: ${outcome.detail}`); } } const providerValue = index => - providerResults[index].status === 'fulfilled' ? providerResults[index].value : undefined; + providerOutcomes[index].status === 'available' ? providerOutcomes[index].value : undefined; const ytDlp = providerValue(0); const deno = providerValue(1); const aria2 = providerValue(2); @@ -505,6 +613,19 @@ async function main() { const latestUrlsByTargetEngine = {}; const latestHashesByTargetEngine = {}; const latestHashesByUrl = providerAssetHashes({ ytDlp, deno, aria2 }); + const providerStatus = outcome => outcome.status === 'available' + ? undefined + : { status: outcome.status, detail: outcome.detail }; + const providerStatusesByEngine = { + 'yt-dlp': providerStatus(providerOutcomes[0]), + deno: providerStatus(providerOutcomes[1]), + aria2c: providerStatus(providerOutcomes[2]), + }; + const providerStatusesByTargetEngine = { + 'aarch64-apple-darwin:ffmpeg': providerStatus(providerOutcomes[4]), + 'x86_64-pc-windows-msvc:ffmpeg': providerStatus(providerOutcomes[5]), + 'x86_64-unknown-linux-gnu:ffmpeg': providerStatus(providerOutcomes[5]), + }; if (btbnFfmpegStableBuild?.version && btbnFfmpegStableBuild.urls?.windows && btbnFfmpegStableBuild.urls?.linux) { latestByTargetEngine['x86_64-pc-windows-msvc:ffmpeg'] = btbnFfmpegStableBuild.version; latestByTargetEngine['x86_64-unknown-linux-gnu:ffmpeg'] = btbnFfmpegStableBuild.version; @@ -529,50 +650,60 @@ async function main() { console.log(` Martin Riedl FFmpeg macOS arm64 stable: ${displayVersion(martinRiedlMacArm64Release?.version)}`); const targetSpecificEngines = new Set(['ffmpeg']); - const engineCheckFailures = []; + const engineReports = []; const runEngineCheck = (label, rows) => { - try { - return checkRows( - rows, - latestByEngine, - latestByTargetEngine, - latestUrlsByTargetEngine, - targetSpecificEngines, - latestHashesByTargetEngine, - latestHashesByUrl, - ); - } catch (error) { - if (error?.code !== 'LATEST_VERSION_UNAVAILABLE') throw error; - const detail = error instanceof Error ? error.message : String(error); - engineCheckFailures.push(label); - console.error(`engine provider unavailable: ${label}: ${detail}`); - return 0; - } + const report = checkRows( + rows, + latestByEngine, + latestByTargetEngine, + latestUrlsByTargetEngine, + targetSpecificEngines, + latestHashesByTargetEngine, + latestHashesByUrl, + providerStatusesByTargetEngine, + providerStatusesByEngine, + ); + engineReports.push({ label, ...report }); + return report; }; console.log('\nengine source lock:'); - outdatedCount += runEngineCheck( + runEngineCheck( 'engine source lock', sourceEngineVersions(parseJsonFile('engine-sources.lock.json')), ); console.log('\npackaged engine lock:'); - outdatedCount += runEngineCheck( + runEngineCheck( 'packaged engine lock', packagedEngineVersions(parseJsonFile('engines.lock.json')), ); + const engineCounts = engineReports.reduce((totals, report) => { + for (const [status, count] of Object.entries(report.counts)) totals[status] += count; + return totals; + }, { current: 0, outdated: 0, 'hash-mismatch': 0, 'provider-behind': 0, unverified: 0 }); + const engineIssueCount = Object.entries(engineCounts) + .filter(([status]) => status !== 'current') + .reduce((total, [, count]) => total + count, 0); + + if (engineIssueCount > 0) { + console.error('\nengine row status summary:'); + for (const [status, count] of Object.entries(engineCounts)) { + if (status !== 'current' && count > 0) console.error(` ${status}: ${count}`); + } + } + if (outdatedCount > 0) { console.error(`\n${outdatedCount} outdated item(s) found.`); - process.exit(1); } if (providerFailures.length > 0) { console.error(`\n${providerFailures.length} provider check(s) unavailable; refusing to claim that all updates are current.`); } - if (engineCheckFailures.length > 0) { - console.error(`\n${engineCheckFailures.length} engine lock check(s) unavailable; refusing to claim that all engines are current.`); + if (providerBehind.length > 0) { + console.error(`\n${providerBehind.length} provider build check(s) are behind the latest stable release; refusing to claim that all updates are current.`); } - if (providerFailures.length > 0 || engineCheckFailures.length > 0) { + if (hasUpdateCheckFailures({ outdatedCount, engineIssueCount, providerFailures, providerBehind })) { process.exit(1); } console.log('\nAll checked packages and engines are current.'); @@ -591,6 +722,7 @@ export { fetchJson, fetchText, fetchWithContext, + hasUpdateCheckFailures, latestBtbnFfmpegStableBuild, latestMartinRiedlMacArm64Release, npmExecutable, diff --git a/scripts/check-updates.node-test.js b/scripts/check-updates.node-test.js index 42e974f..7c60431 100644 --- a/scripts/check-updates.node-test.js +++ b/scripts/check-updates.node-test.js @@ -8,6 +8,7 @@ import { fetchText, latestBtbnFfmpegStableBuild, latestMartinRiedlMacArm64Release, + hasUpdateCheckFailures, npmExecutable, providerAssetHashes, } from './check-updates.js'; @@ -50,33 +51,31 @@ test('fetchText does not retry terminal HTTP responses', async () => { assert.equal(attempts, 1); }); -test('checkRows fails closed when a latest version is unavailable', () => { - assert.throws( - () => - checkRows( - [{ target: 'test-target', engine: 'test-engine', version: '1.0.0', url: 'https://example.test/engine' }], - {} - ), - /Latest version is unavailable for test-target test-engine/ +test('checkRows reports an unverified row when a latest version is unavailable', () => { + const report = checkRows( + [{ target: 'test-target', engine: 'test-engine', version: '1.0.0', url: 'https://example.test/engine' }], + {}, ); + + assert.equal(report.rows[0].status, 'unverified'); + assert.equal(report.counts.unverified, 1); }); test('checkRows does not fall back to the generic release for target-specific engines', () => { - assert.throws( - () => - checkRows( - [{ target: 'test-target', engine: 'ffmpeg', version: '8.1.2', url: 'https://example.test/engine' }], - { ffmpeg: '9.0.1' }, - {}, - {}, - new Set(['ffmpeg']) - ), - /Latest provider version is unavailable for test-target ffmpeg/ + const report = checkRows( + [{ target: 'test-target', engine: 'ffmpeg', version: '8.1.2', url: 'https://example.test/engine' }], + { ffmpeg: '9.0.1' }, + {}, + {}, + new Set(['ffmpeg']), ); + + assert.equal(report.rows[0].status, 'unverified'); + assert.equal(report.counts.unverified, 1); }); test('checkRows detects a provider hash change when version and URL are current', () => { - const outdated = checkRows( + const report = checkRows( [{ target: 'test-target', engine: 'test-engine', @@ -92,11 +91,29 @@ test('checkRows detects a provider hash change when version and URL are current' { 'https://example.test/engine': 'b'.repeat(64) }, ); - assert.equal(outdated, 1); + assert.equal(report.rows[0].status, 'hash-mismatch'); + assert.equal(report.counts['hash-mismatch'], 1); +}); + +test('checkRows fails closed when the provider supplies no digest', () => { + const report = checkRows( + [{ + target: 'test-target', + engine: 'test-engine', + version: '1.0.0', + url: 'https://example.test/engine', + sha256: 'a'.repeat(64), + }], + { 'test-engine': '1.0.0' }, + ); + + assert.equal(report.rows[0].status, 'unverified'); + assert.match(report.rows[0].reason, /verifiable SHA-256/); + assert.equal(report.counts.unverified, 1); }); test('checkRows compares packaged source provenance without confusing the payload digest', () => { - const outdated = checkRows( + const report = checkRows( [{ target: 'aarch64-apple-darwin', engine: 'ffmpeg', @@ -112,7 +129,8 @@ test('checkRows compares packaged source provenance without confusing the payloa { 'aarch64-apple-darwin:ffmpeg': 'a'.repeat(64) }, ); - assert.equal(outdated, 0); + assert.equal(report.rows[0].status, 'current'); + assert.equal(report.counts.current, 1); }); test('checkRows detects an aria2 asset digest change when the provider supplies it', () => { @@ -122,7 +140,7 @@ test('checkRows detects an aria2 asset digest change when the provider supplies aria2: { assets: [{ browser_download_url: url, digest: `sha256:${digest}` }] }, }); - const outdated = checkRows( + const report = checkRows( [{ target: 'x86_64-pc-windows-msvc', engine: 'aria2c', @@ -138,7 +156,91 @@ test('checkRows detects an aria2 asset digest change when the provider supplies hashes, ); - assert.equal(outdated, 1); + assert.equal(report.rows[0].status, 'hash-mismatch'); + assert.equal(report.counts['hash-mismatch'], 1); +}); + +test('checkRows preserves independent row results when one provider is unavailable', () => { + const report = checkRows( + [ + { target: 'test-target', engine: 'yt-dlp', version: '1.0.0', url: 'https://example.test/yt-dlp' }, + { target: 'test-target', engine: 'deno', version: '1.0.0', url: 'https://example.test/deno' }, + ], + { 'yt-dlp': '1.0.0', deno: '1.0.0' }, + {}, + {}, + new Set(), + {}, + {}, + {}, + { deno: { status: 'unverified', detail: 'GitHub response failed' } }, + ); + + assert.deepEqual( + report.rows.map(row => [row.engine, row.status]), + [['yt-dlp', 'current'], ['deno', 'unverified']], + ); + assert.equal(report.counts.current, 1); + assert.equal(report.counts.unverified, 1); +}); + +test('checkRows reports provider-behind instead of using generic FFmpeg data', () => { + const report = checkRows( + [{ target: 'test-target', engine: 'ffmpeg', version: '9.0.1', url: 'https://example.test/ffmpeg' }], + { ffmpeg: '9.0.2' }, + {}, + {}, + new Set(['ffmpeg']), + {}, + {}, + { 'test-target:ffmpeg': { status: 'provider-behind', detail: 'matching target build is not published' } }, + ); + + assert.equal(report.rows[0].status, 'provider-behind'); + assert.equal(report.rows[0].latest, undefined); + assert.equal(report.counts['provider-behind'], 1); +}); + +test('checkRows still reports Deno after an FFmpeg provider failure', () => { + const report = checkRows( + [ + { target: 'test-target', engine: 'ffmpeg', version: '9.0.1', url: 'https://example.test/ffmpeg' }, + { target: 'test-target', engine: 'deno', version: '2.9.6', url: 'https://example.test/deno' }, + ], + { ffmpeg: '9.0.2', deno: '2.9.7' }, + { 'test-target:deno': '2.9.7' }, + {}, + new Set(['ffmpeg']), + {}, + {}, + { 'test-target:ffmpeg': { status: 'unverified', detail: 'FFmpeg provider request failed' } }, + ); + + assert.deepEqual( + report.rows.map(row => [row.engine, row.status]), + [['ffmpeg', 'unverified'], ['deno', 'outdated']], + ); + assert.equal(report.rows.length, 2); + assert.equal(report.counts.unverified, 1); + assert.equal(report.counts.outdated, 1); +}); + +test('update checks fail when npm or Cargo rows are outdated', () => { + assert.equal(hasUpdateCheckFailures({ + outdatedCount: 1, + engineIssueCount: 0, + providerFailures: [], + providerBehind: [], + }), true); +}); + +test('update checks pass only when every blocking count is clear', () => { + assert.equal(hasUpdateCheckFailures({ + outdatedCount: 0, + engineIssueCount: 0, + providerFailures: [], + providerBehind: [], + }), false); }); test('npm executable selection uses the Windows command shim when needed', () => { diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 5fe765e..7268c42 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -235,7 +235,7 @@ checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -526,9 +526,9 @@ dependencies = [ [[package]] name = "camino" -version = "1.2.5" +version = "1.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb1307f12aa967b5a58416e87b3653360e0fd614a016b6e970db08fecbb1b80d" +checksum = "bbbad30e4b4c14a39e3cc8aed085a12a327257c316619c93581e017bc52be591" dependencies = [ "serde_core", ] @@ -577,9 +577,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.4.6" +version = "1.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3eb0f42d6c360dc3f8a821f6bf2fdea7f72bfd36b3076eb0e6d1e9e0752fff4" +checksum = "54413ede23c2daf518f35156dfde027feb2374004d63bd497f983c8db9c0e313" dependencies = [ "find-msvc-tools", "shlex", @@ -614,9 +614,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" [[package]] name = "cfg_aliases" @@ -940,7 +940,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -962,7 +962,7 @@ checksum = "2ac7135c3ef02b2f7833bbeb1be5ba7f966dcde8a87c6b87f65a778d71a02785" dependencies = [ "darling_core 0.24.1", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -1137,7 +1137,7 @@ checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -1423,9 +1423,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0f1c7c3a72c66fd80abe965175f7523475c0489a87d3ff9d6e8c87d87a9d2d" +checksum = "ef25905e51abafe4dcea6c15fec58c57b601cdbd0ee53d22ea1d3016c587d39b" [[package]] name = "firelink" @@ -1533,7 +1533,7 @@ checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -1604,7 +1604,7 @@ checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -2848,7 +2848,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -3792,11 +3792,10 @@ dependencies = [ [[package]] name = "redox_users" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +checksum = "60dc65c0ff1a7ae1294b0c67b9f14baf70b644404010370171787bfac1038fc0" dependencies = [ - "getrandom 0.2.17", "libredox", "thiserror 2.0.20", ] @@ -3818,7 +3817,7 @@ checksum = "92ecd8964f8453721699a1ed72037b0db49ce2f5a5138486ee89bed6f67cdf3a" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -3979,9 +3978,9 @@ dependencies = [ [[package]] name = "rustix" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" dependencies = [ "bitflags 2.13.2", "errno", @@ -4260,7 +4259,7 @@ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -4306,7 +4305,7 @@ checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -4369,7 +4368,7 @@ dependencies = [ "darling 0.24.1", "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -4682,9 +4681,9 @@ dependencies = [ [[package]] name = "syn" -version = "3.0.5" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12df2e0110f65b775f769bb17ef989067a1d931b2eb822bd4346631eeada89f9" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" dependencies = [ "proc-macro2", "quote", @@ -4702,13 +4701,13 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.2" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.6", ] [[package]] @@ -5293,7 +5292,7 @@ checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -5391,7 +5390,7 @@ checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -5806,9 +5805,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.24" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" [[package]] name = "unicode-normalization" @@ -5994,7 +5993,7 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", "wasm-bindgen-shared", ] @@ -6886,13 +6885,13 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +checksum = "33811428bee40dbceb6d545e95754741d17a6aef9a4849f0fd62e2ba4f412a78" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.6", "synstructure", ] @@ -6951,7 +6950,7 @@ dependencies = [ "proc-macro-crate 3.5.0", "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", "zbus_names", "zvariant", "zvariant_utils", @@ -7008,13 +7007,13 @@ dependencies = [ [[package]] name = "zerofrom-derive" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.6", "synstructure", ] @@ -7054,14 +7053,14 @@ checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] name = "zlib-rs" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34b31d188d9d685a4f9c7b46d6e36631b07058d2cfe190267adce54dc230bf12" +checksum = "b268e58e7c693d7c271f93ffc4ba3b380412554231c85bf61ca7af91042a4112" [[package]] name = "zmij" @@ -7108,7 +7107,7 @@ dependencies = [ "proc-macro-crate 3.5.0", "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", "zvariant_utils", ] @@ -7121,6 +7120,6 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 3.0.5", + "syn 3.0.6", "winnow 1.0.4", ] diff --git a/src-tauri/binaries/deno-aarch64-apple-darwin b/src-tauri/binaries/deno-aarch64-apple-darwin index 54984fa..f3c56fd 100755 Binary files a/src-tauri/binaries/deno-aarch64-apple-darwin and b/src-tauri/binaries/deno-aarch64-apple-darwin differ