fix(deps): refresh locked packages and Deno runtime

- update Lucide, Vitest, compatible Cargo locks, and Deno 2.9.7 payloads

- remove unused frontend build dependencies

- make update checks fail closed with independent provider and hash status rows

- preserve FFmpeg, yt-dlp, and patched Aria2 payloads until verified artifacts exist
This commit is contained in:
NimBold
2026-09-19 13:50:25 +03:30
parent 7d54ba45b9
commit 897e6a2da3
8 changed files with 397 additions and 360 deletions
+6 -6
View File
@@ -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",
+2 -2
View File
@@ -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": {
+28 -221
View File
@@ -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"
+2 -5
View File
@@ -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"
}
}
+188 -56
View File
@@ -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,
+126 -24
View File
@@ -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', () => {
+45 -46
View File
@@ -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",
]
Binary file not shown.