diff --git a/.gitignore b/.gitignore index 38bdc31..e4944bf 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,5 @@ electron *.sw? release +src-tauri/target +src-tauri/icons diff --git a/package-lock.json b/package-lock.json index b3f0c63..cb8295b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,6 +41,7 @@ "vue-sonner": "^0.4.2" }, "devDependencies": { + "@electron/fuses": "^1.8.0", "@rushstack/eslint-patch": "^1.2.0", "@types/node": "^16.11.43", "@types/path-browserify": "^1.0.1", @@ -52,8 +53,8 @@ "@vue/tsconfig": "^0.1.3", "concurrently": "^7.6.0", "cross-env": "^7.0.3", - "electron": "^21.3.1", - "electron-builder": "^22.10.3", + "electron": "^41.5.0", + "electron-builder": "^26.8.1", "eslint": "^8.28.0", "eslint-plugin-vue": "^9.8.0", "npm-run-all": "^4.1.5", @@ -541,45 +542,190 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/@electron/asar": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", + "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==", + "dev": true, + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@electron/fuses": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@electron/fuses/-/fuses-1.8.0.tgz", + "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.1", + "fs-extra": "^9.0.1", + "minimist": "^1.2.5" + }, + "bin": { + "electron-fuses": "dist/bin.js" + } + }, + "node_modules/@electron/fuses/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@electron/fuses/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@electron/fuses/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@electron/fuses/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@electron/fuses/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/fuses/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@electron/fuses/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@electron/get": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.14.1.tgz", - "integrity": "sha512-BrZYyL/6m0ZXz/lDxy/nlVhQz+WF+iPS6qXolEU8atw7h6v1aYkjwJZ63m+bJMBTxDE66X+r2tPS4a/8C82sZw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", + "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", "dev": true, "dependencies": { "debug": "^4.1.1", "env-paths": "^2.2.0", "fs-extra": "^8.1.0", - "got": "^9.6.0", + "got": "^11.8.5", "progress": "^2.0.3", "semver": "^6.2.0", "sumchecker": "^3.0.1" }, "engines": { - "node": ">=8.6" + "node": ">=12" }, "optionalDependencies": { - "global-agent": "^3.0.0", - "global-tunnel-ng": "^2.7.1" + "global-agent": "^3.0.0" } }, - "node_modules/@electron/universal": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.0.5.tgz", - "integrity": "sha512-zX9O6+jr2NMyAdSkwEUlyltiI4/EBLu2Ls/VD3pUQdi3cAYeYfdQnT2AJJ38HE4QxLccbU13LSpccw1IWlkyag==", + "node_modules/@electron/get/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "dependencies": { - "@malept/cross-spawn-promise": "^1.1.0", - "asar": "^3.0.3", - "debug": "^4.3.1", - "dir-compare": "^2.4.0", - "fs-extra": "^9.0.1" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=8.6" + "node": ">=6 <7 || >=8" } }, - "node_modules/@electron/universal/node_modules/fs-extra": { + "node_modules/@electron/get/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/get/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@electron/notarize": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz", + "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/notarize/node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", @@ -594,25 +740,150 @@ "node": ">=10" } }, - "node_modules/@electron/universal/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/@electron/osx-sign": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz", + "integrity": "sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==", "dev": true, "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/@electron/rebuild": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-4.0.4.tgz", + "integrity": "sha512-Rzc39XPdk/+/wBG8MfwAHohXflep0ITUfulb6Rgz3R0NeSB1noE+E9/M/cb8ftCAiyDD9PPhLuuWgE1GaInbKg==", + "dev": true, + "dependencies": { + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.1.1", + "node-abi": "^4.2.0", + "node-api-version": "^0.2.1", + "node-gyp": "^12.2.0", + "read-binary-file-arch": "^1.0.6" + }, + "bin": { + "electron-rebuild": "lib/cli.js" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@electron/universal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.3.tgz", + "integrity": "sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==", + "dev": true, + "dependencies": { + "@electron/asar": "^3.3.1", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.3.1", + "dir-compare": "^4.2.0", + "fs-extra": "^11.1.1", + "minimatch": "^9.0.3", + "plist": "^3.1.0" + }, + "engines": { + "node": ">=16.4" + } + }, + "node_modules/@electron/universal/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@electron/universal/node_modules/fs-extra": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": ">=14.14" } }, - "node_modules/@electron/universal/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "node_modules/@electron/universal/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, + "dependencies": { + "brace-expansion": "^2.0.2" + }, "engines": { - "node": ">= 10.0.0" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@electron/windows-sign": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz", + "integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "cross-dirname": "^0.1.0", + "debug": "^4.3.4", + "fs-extra": "^11.1.1", + "minimist": "^1.2.8", + "postject": "^1.0.0-alpha.6" + }, + "bin": { + "electron-windows-sign": "bin/electron-windows-sign.js" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/windows-sign/node_modules/fs-extra": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" } }, "node_modules/@esbuild/android-arm": { @@ -718,6 +989,18 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", @@ -765,9 +1048,9 @@ } }, "node_modules/@malept/cross-spawn-promise": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", - "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", + "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", "dev": true, "funding": [ { @@ -783,7 +1066,7 @@ "cross-spawn": "^7.0.1" }, "engines": { - "node": ">= 10" + "node": ">= 12.13.0" } }, "node_modules/@malept/flatpak-bundler": { @@ -816,27 +1099,6 @@ "node": ">=10" } }, - "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@malept/flatpak-bundler/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -893,12 +1155,15 @@ "dev": true }, "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, "node_modules/@sphinxxxx/color-conversion": { @@ -907,15 +1172,15 @@ "integrity": "sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw==" }, "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dev": true, "dependencies": { - "defer-to-connect": "^1.0.1" + "defer-to-connect": "^2.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" } }, "node_modules/@thednp/color": { @@ -943,15 +1208,6 @@ "resolved": "https://registry.npmjs.org/@thednp/shorty/-/shorty-2.0.0-alpha17.tgz", "integrity": "sha512-CsVmjqRhiIdRZmtrT9pXiucvSAvAgnukd/CRnC/lHc364223KIavGVTGSM3OknKdlkDKFLTZDqkv7i5+VTRXBA==" }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, "node_modules/@types/bootstrap": { "version": "5.2.5", "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.2.5.tgz", @@ -960,10 +1216,22 @@ "@popperjs/core": "^2.9.2" } }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, "node_modules/@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", "dev": true, "dependencies": { "@types/ms": "*" @@ -978,16 +1246,11 @@ "@types/node": "*" } }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "optional": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } + "node_modules/@types/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "dev": true }, "node_modules/@types/json-schema": { "version": "7.0.11", @@ -995,17 +1258,19 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dev": true, - "optional": true + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "dev": true }, "node_modules/@types/node": { @@ -1021,9 +1286,9 @@ "dev": true }, "node_modules/@types/plist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.2.tgz", - "integrity": "sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", "dev": true, "optional": true, "dependencies": { @@ -1037,27 +1302,21 @@ "integrity": "sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==", "optional": true }, - "node_modules/@types/verror": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.6.tgz", - "integrity": "sha512-NNm+gdePAX1VGvPcGZCDKQZKYSiAWigKhKaz5KF94hG6f2s8de9Ow5+7AbXoeKxL8gavZfk4UquSAygOF2duEQ==", - "dev": true, - "optional": true - }, - "node_modules/@types/yargs": { - "version": "17.0.17", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.17.tgz", - "integrity": "sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g==", + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", "dev": true, "dependencies": { - "@types/yargs-parser": "*" + "@types/node": "*" } }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true + "node_modules/@types/verror": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.11.tgz", + "integrity": "sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==", + "dev": true, + "optional": true }, "node_modules/@types/yauzl": { "version": "2.10.0", @@ -1714,12 +1973,30 @@ } } }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz", + "integrity": "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/7zip-bin": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.1.1.tgz", - "integrity": "sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", + "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", "dev": true }, + "node_modules/abbrev": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", + "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", + "dev": true, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "node_modules/acorn": { "version": "8.8.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", @@ -1742,15 +2019,12 @@ } }, "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "dev": true, - "dependencies": { - "debug": "4" - }, "engines": { - "node": ">= 6.0.0" + "node": ">= 14" } }, "node_modules/ajv": { @@ -1778,15 +2052,6 @@ "ajv": "^6.9.1" } }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "dependencies": { - "string-width": "^4.1.0" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -1809,59 +2074,158 @@ } }, "node_modules/app-builder-bin": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.7.1.tgz", - "integrity": "sha512-ql93vEUq6WsstGXD+SBLSIQw6SNnhbDEM0swzgugytMxLp3rT24Ag/jcC80ZHxiPRTdew1niuR7P3/FCrDqIjw==", + "version": "5.0.0-alpha.12", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-5.0.0-alpha.12.tgz", + "integrity": "sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==", "dev": true }, "node_modules/app-builder-lib": { - "version": "22.14.13", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-22.14.13.tgz", - "integrity": "sha512-SufmrtxU+D0Tn948fjEwAOlCN9757UXLkzzTWXMwZKR/5hisvgqeeBepWfphMIE6OkDGz0fbzEhL1P2Pty4XMg==", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.8.1.tgz", + "integrity": "sha512-p0Im/Dx5C4tmz8QEE1Yn4MkuPC8PrnlRneMhWJj7BBXQfNTJUshM/bp3lusdEsDbvvfJZpXWnYesgSLvwtM2Zw==", "dev": true, "dependencies": { "@develar/schema-utils": "~2.6.5", - "@electron/universal": "1.0.5", + "@electron/asar": "3.4.1", + "@electron/fuses": "^1.8.0", + "@electron/get": "^3.0.0", + "@electron/notarize": "2.5.0", + "@electron/osx-sign": "1.3.3", + "@electron/rebuild": "^4.0.3", + "@electron/universal": "2.0.3", "@malept/flatpak-bundler": "^0.4.0", - "7zip-bin": "~5.1.1", + "@types/fs-extra": "9.0.13", "async-exit-hook": "^2.0.1", - "bluebird-lst": "^1.0.9", - "builder-util": "22.14.13", - "builder-util-runtime": "8.9.2", + "builder-util": "26.8.1", + "builder-util-runtime": "9.5.1", "chromium-pickle-js": "^0.2.0", - "debug": "^4.3.2", - "ejs": "^3.1.6", - "electron-osx-sign": "^0.5.0", - "electron-publish": "22.14.13", - "form-data": "^4.0.0", - "fs-extra": "^10.0.0", - "hosted-git-info": "^4.0.2", - "is-ci": "^3.0.0", - "isbinaryfile": "^4.0.8", + "ci-info": "4.3.1", + "debug": "^4.3.4", + "dotenv": "^16.4.5", + "dotenv-expand": "^11.0.6", + "ejs": "^3.1.8", + "electron-publish": "26.8.1", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "isbinaryfile": "^5.0.0", + "jiti": "^2.4.2", "js-yaml": "^4.1.0", + "json5": "^2.2.3", "lazy-val": "^1.0.5", - "minimatch": "^3.0.4", - "read-config-file": "6.2.0", - "sanitize-filename": "^1.6.3", - "semver": "^7.3.5", - "temp-file": "^3.4.0" + "minimatch": "^10.0.3", + "plist": "3.1.0", + "proper-lockfile": "^4.1.2", + "resedit": "^1.7.0", + "semver": "~7.7.3", + "tar": "^7.5.7", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0", + "which": "^5.0.0" }, "engines": { "node": ">=14.0.0" + }, + "peerDependencies": { + "dmg-builder": "26.8.1", + "electron-builder-squirrel-windows": "26.8.1" } }, - "node_modules/app-builder-lib/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "node_modules/app-builder-lib/node_modules/@electron/get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-3.1.0.tgz", + "integrity": "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=12" + "node": ">=6 <7 || >=8" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/app-builder-lib/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/app-builder-lib/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/app-builder-lib/node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" } }, "node_modules/app-builder-lib/node_modules/hosted-git-info": { @@ -1876,26 +2240,35 @@ "node": ">=10" } }, - "node_modules/app-builder-lib/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/app-builder-lib/node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/app-builder-lib/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "dependencies": { - "universalify": "^2.0.0" + "brace-expansion": "^5.0.5" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/app-builder-lib/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -1903,13 +2276,19 @@ "node": ">=10" } }, - "node_modules/app-builder-lib/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "node_modules/app-builder-lib/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, "engines": { - "node": ">= 10.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/argparse": { @@ -1922,31 +2301,9 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/asar": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/asar/-/asar-3.2.0.tgz", - "integrity": "sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg==", - "deprecated": "Please use @electron/asar moving forward. There is no API change, just a package name change", - "dev": true, - "dependencies": { - "chromium-pickle-js": "^0.2.0", - "commander": "^5.0.0", - "glob": "^7.1.6", - "minimatch": "^3.0.4" - }, - "bin": { - "asar": "bin/asar.js" - }, - "engines": { - "node": ">=10.12.0" - }, - "optionalDependencies": { - "@types/glob": "^7.1.1" + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/assert-plus": { @@ -1970,9 +2327,9 @@ } }, "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true }, "node_modules/async-exit-hook": { @@ -2064,21 +2421,6 @@ "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz", "integrity": "sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==" }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "node_modules/bluebird-lst": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", - "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", - "dev": true, - "dependencies": { - "bluebird": "^3.5.5" - } - }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -2089,6 +2431,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dev": true, "optional": true }, @@ -2115,98 +2458,6 @@ "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.9.1.tgz", "integrity": "sha512-d4ZkO30MIkAhQ2nNRJqKXJVEQorALGbLWTuRxyCTJF96lRIV6imcgMehWGJUiJMJhglN0o2tqLIeDnMdiQEE9g==" }, - "node_modules/boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/boxen/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/boxen/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/boxen/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2293,22 +2544,6 @@ "ieee754": "^1.1.13" } }, - "node_modules/buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "dependencies": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "node_modules/buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -2318,21 +2553,6 @@ "node": "*" } }, - "node_modules/buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", - "dev": true - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -2340,37 +2560,36 @@ "dev": true }, "node_modules/builder-util": { - "version": "22.14.13", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-22.14.13.tgz", - "integrity": "sha512-oePC/qrrUuerhmH5iaCJzPRAKlSBylrhzuAJmRQClTyWnZUv6jbaHh+VoHMbEiE661wrj2S2aV7/bQh12cj1OA==", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.8.1.tgz", + "integrity": "sha512-pm1lTYbGyc90DHgCDO7eo8Rl4EqKLciayNbZqGziqnH9jrlKe8ZANGdityLZU+pJh16dfzjAx2xQq9McuIPEtw==", "dev": true, "dependencies": { "@types/debug": "^4.1.6", - "@types/fs-extra": "^9.0.11", - "7zip-bin": "~5.1.1", - "app-builder-bin": "3.7.1", - "bluebird-lst": "^1.0.9", - "builder-util-runtime": "8.9.2", - "chalk": "^4.1.1", - "cross-spawn": "^7.0.3", - "debug": "^4.3.2", - "fs-extra": "^10.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-ci": "^3.0.0", + "7zip-bin": "~5.2.0", + "app-builder-bin": "5.0.0-alpha.12", + "builder-util-runtime": "9.5.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.6", + "debug": "^4.3.4", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", "js-yaml": "^4.1.0", + "sanitize-filename": "^1.6.3", "source-map-support": "^0.5.19", "stat-mode": "^1.0.0", - "temp-file": "^3.4.0" + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0" } }, "node_modules/builder-util-runtime": { - "version": "8.9.2", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.9.2.tgz", - "integrity": "sha512-rhuKm5vh7E0aAmT6i8aoSfEjxzdYEFX7zDApK+eNgOhjofnWb74d9SRJv0H/8nsgOkos0TZ4zxW0P8J4N7xQ2A==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.5.1.tgz", + "integrity": "sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ==", "dev": true, "dependencies": { - "debug": "^4.3.2", + "debug": "^4.3.4", "sax": "^1.2.4" }, "engines": { @@ -2426,20 +2645,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/builder-util/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/builder-util/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2449,18 +2654,6 @@ "node": ">=8" } }, - "node_modules/builder-util/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/builder-util/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -2473,42 +2666,33 @@ "node": ">=8" } }, - "node_modules/builder-util/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", "dev": true, "engines": { - "node": ">= 10.0.0" + "node": ">=10.6.0" } }, "node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "dev": true, "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", + "keyv": "^4.0.0", "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -2522,6 +2706,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2592,6 +2788,15 @@ "node": ">=4" } }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "engines": { + "node": ">=18" + } + }, "node_modules/chromium-pickle-js": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", @@ -2599,26 +2804,20 @@ "dev": true }, "node_modules/ci-info": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz", - "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "engines": { "node": ">=8" } }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cli-truncate": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", @@ -2637,14 +2836,17 @@ } }, "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/clone-response": { @@ -2704,15 +2906,6 @@ "resolved": "https://registry.npmjs.org/color-space/-/color-space-2.0.1.tgz", "integrity": "sha512-nKqUYlo0vZATVOFHY810BSYjmCARrG7e5R3UE3CQlyjJTvv5kSSmPG1kzm/oDyyqjehM+lW1RnEt9It9GNa5JA==" }, - "node_modules/colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, "node_modules/colortranslator": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/colortranslator/-/colortranslator-4.1.0.tgz", @@ -2865,34 +3058,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "optional": true, - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/convert-source-map": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", @@ -2929,6 +3094,14 @@ "buffer": "^5.1.0" } }, + "node_modules/cross-dirname": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", + "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", + "dev": true, + "optional": true, + "peer": true + }, "node_modules/cross-env": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", @@ -2948,9 +3121,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "dependencies": { "path-key": "^3.1.0", @@ -2961,15 +3134,6 @@ "node": ">= 8" } }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/css-line-break": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", @@ -3033,24 +3197,30 @@ } }, "node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dev": true, "dependencies": { - "mimic-response": "^1.0.0" + "mimic-response": "^3.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "dev": true, "engines": { - "node": ">=4.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/deep-is": { @@ -3060,17 +3230,38 @@ "dev": true }, "node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } }, - "node_modules/define-properties": { + "node_modules/define-data-property": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -3097,42 +3288,13 @@ "optional": true }, "node_modules/dir-compare": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-2.4.0.tgz", - "integrity": "sha512-l9hmu8x/rjVC9Z2zmGzkhOEowZvW7pmYws5CWHutg8u1JgvsKWMx7Q/UODeu4djLZ4FgW5besw5yvMQnBHzuCA==", - "dev": true, - "dependencies": { - "buffer-equal": "1.0.0", - "colors": "1.0.3", - "commander": "2.9.0", - "minimatch": "3.0.4" - }, - "bin": { - "dircompare": "src/cli/dircompare.js" - } - }, - "node_modules/dir-compare/node_modules/commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==", - "dev": true, - "dependencies": { - "graceful-readlink": ">= 1.0.0" - }, - "engines": { - "node": ">= 0.6.x" - } - }, - "node_modules/dir-compare/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", + "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "minimatch": "^3.0.5", + "p-limit": "^3.1.0 " } }, "node_modules/dir-glob": { @@ -3153,55 +3315,19 @@ "integrity": "sha512-cw1AgWh6YegrfNcoaA+tB5cBycy99qdr5aYVJwqBRUGHXnfXFLu09hLrzYu1qmrBzDr/uzCBGxl1wX96IBc56w==" }, "node_modules/dmg-builder": { - "version": "22.14.13", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-22.14.13.tgz", - "integrity": "sha512-xNOugB6AbIRETeU2uID15sUfjdZZcKdxK8xkFnwIggsM00PJ12JxpLNPTjcRoUnfwj3WrPjilrO64vRMwNItQg==", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.8.1.tgz", + "integrity": "sha512-glMJgnTreo8CFINujtAhCgN96QAqApDMZ8Vl1r8f0QT8QprvC1UCltV4CcWj20YoIyLZx6IUskaJZ0NV8fokcg==", "dev": true, "dependencies": { - "app-builder-lib": "22.14.13", - "builder-util": "22.14.13", - "builder-util-runtime": "8.9.2", - "fs-extra": "^10.0.0", + "app-builder-lib": "26.8.1", + "builder-util": "26.8.1", + "fs-extra": "^10.1.0", "iconv-lite": "^0.6.2", "js-yaml": "^4.1.0" }, "optionalDependencies": { - "dmg-license": "^1.0.9" - } - }, - "node_modules/dmg-builder/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dmg-builder/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/dmg-builder/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" + "dmg-license": "^1.0.11" } }, "node_modules/dmg-license": { @@ -3248,38 +3374,45 @@ "integrity": "sha512-o1vSNgrmYMQObbSSvF/1brBYEQPHhV1+gsmrusO7/GXtp1T9rCS8cXFqVxK/9crT1jA6Ccv+5MTSjBNqr7Sovw==", "optional": true }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" } }, - "node_modules/dotenv": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", - "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", + "node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", "dev": true, + "dependencies": { + "dotenv": "^16.4.5" + }, "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" } }, - "node_modules/dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, - "node_modules/duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", - "dev": true + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/earcut": { "version": "2.2.4", @@ -3287,9 +3420,9 @@ "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" }, "node_modules/ejs": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", - "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, "dependencies": { "jake": "^10.8.5" @@ -3302,41 +3435,39 @@ } }, "node_modules/electron": { - "version": "21.3.3", - "resolved": "https://registry.npmjs.org/electron/-/electron-21.3.3.tgz", - "integrity": "sha512-2a9l8mUQlzXH/9WZrGYDJTyJOliLKbmEuCrQ8bfX1McAQOmI6PDQxfHV4qFUtyCDUp5SHrq5nuvg0c1pIkDBhg==", + "version": "41.7.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-41.7.0.tgz", + "integrity": "sha512-U6KAKivjk6YQ0Z5+eloJBjwhbHRE206gvy1UBMw2bSluWtMh5waeXMvX6AT/Ujm5ymYXVJOp7g9N7vOFw16wBQ==", "dev": true, "hasInstallScript": true, "dependencies": { - "@electron/get": "^1.14.1", - "@types/node": "^16.11.26", + "@electron/get": "^2.0.0", + "@types/node": "^24.9.0", "extract-zip": "^2.0.1" }, "bin": { "electron": "cli.js" }, "engines": { - "node": ">= 10.17.0" + "node": ">= 12.20.55" } }, "node_modules/electron-builder": { - "version": "22.14.13", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-22.14.13.tgz", - "integrity": "sha512-3fgLxqF2TXVKiUPeg74O4V3l0l3j7ERLazo8sUbRkApw0+4iVAf2BJkHsHMaXiigsgCoEzK/F4/rB5rne/VAnw==", - "dev": true, - "dependencies": { - "@types/yargs": "^17.0.1", - "app-builder-lib": "22.14.13", - "builder-util": "22.14.13", - "builder-util-runtime": "8.9.2", - "chalk": "^4.1.1", - "dmg-builder": "22.14.13", - "fs-extra": "^10.0.0", - "is-ci": "^3.0.0", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.8.1.tgz", + "integrity": "sha512-uWhx1r74NGpCagG0ULs/P9Nqv2nsoo+7eo4fLUOB8L8MdWltq9odW/uuLXMFCDGnPafknYLZgjNX0ZIFRzOQAw==", + "dev": true, + "dependencies": { + "app-builder-lib": "26.8.1", + "builder-util": "26.8.1", + "builder-util-runtime": "9.5.1", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "dmg-builder": "26.8.1", + "fs-extra": "^10.1.0", "lazy-val": "^1.0.5", - "read-config-file": "6.2.0", - "update-notifier": "^5.1.0", - "yargs": "^17.0.1" + "simple-update-notifier": "2.0.0", + "yargs": "^17.6.2" }, "bin": { "electron-builder": "cli.js", @@ -3346,6 +3477,18 @@ "node": ">=14.0.0" } }, + "node_modules/electron-builder-squirrel-windows": { + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.8.1.tgz", + "integrity": "sha512-o288fIdgPLHA76eDrFADHPoo7VyGkDCYbLV1GzndaMSAVBoZrGvM9m2IehdcVMzdAZJ2eV9bgyissQXHv5tGzA==", + "dev": true, + "peer": true, + "dependencies": { + "app-builder-lib": "26.8.1", + "builder-util": "26.8.1", + "electron-winstaller": "5.4.0" + } + }, "node_modules/electron-builder/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -3395,20 +3538,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/electron-builder/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/electron-builder/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3418,18 +3547,6 @@ "node": ">=8" } }, - "node_modules/electron-builder/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/electron-builder/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3442,75 +3559,18 @@ "node": ">=8" } }, - "node_modules/electron-builder/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/electron-osx-sign": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.5.0.tgz", - "integrity": "sha512-icoRLHzFz/qxzDh/N4Pi2z4yVHurlsCAYQvsCSG7fCedJ4UJXBS6PoQyGH71IfcqKupcKeK7HX/NkyfG+v6vlQ==", - "deprecated": "Please use @electron/osx-sign moving forward. Be aware the API is slightly different", - "dev": true, - "dependencies": { - "bluebird": "^3.5.0", - "compare-version": "^0.1.2", - "debug": "^2.6.8", - "isbinaryfile": "^3.0.2", - "minimist": "^1.2.0", - "plist": "^3.0.1" - }, - "bin": { - "electron-osx-flat": "bin/electron-osx-flat.js", - "electron-osx-sign": "bin/electron-osx-sign.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/electron-osx-sign/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/electron-osx-sign/node_modules/isbinaryfile": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", - "dev": true, - "dependencies": { - "buffer-alloc": "^1.2.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/electron-osx-sign/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, "node_modules/electron-publish": { - "version": "22.14.13", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-22.14.13.tgz", - "integrity": "sha512-0oP3QiNj3e8ewOaEpEJV/o6Zrmy2VarVvZ/bH7kyO/S/aJf9x8vQsKVWpsdmSiZ5DJEHgarFIXrnO0ZQf0P9iQ==", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.8.1.tgz", + "integrity": "sha512-q+jrSTIh/Cv4eGZa7oVR+grEJo/FoLMYBAnSL5GCtqwUpr1T+VgKB/dn1pnzxIxqD8S/jP1yilT9VrwCqINR4w==", "dev": true, "dependencies": { "@types/fs-extra": "^9.0.11", - "builder-util": "22.14.13", - "builder-util-runtime": "8.9.2", - "chalk": "^4.1.1", - "fs-extra": "^10.0.0", + "builder-util": "26.8.1", + "builder-util-runtime": "9.5.1", + "chalk": "^4.1.2", + "form-data": "^4.0.5", + "fs-extra": "^10.1.0", "lazy-val": "^1.0.5", "mime": "^2.5.2" } @@ -3564,20 +3624,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/electron-publish/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/electron-publish/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3587,18 +3633,6 @@ "node": ">=8" } }, - "node_modules/electron-publish/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/electron-publish/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3611,37 +3645,83 @@ "node": ">=8" } }, - "node_modules/electron-publish/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/electron-to-chromium": { "version": "1.4.284", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", "dev": true }, + "node_modules/electron-winstaller": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz", + "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==", + "dev": true, + "hasInstallScript": true, + "peer": true, + "dependencies": { + "@electron/asar": "^3.2.1", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash": "^4.17.21", + "temp": "^0.9.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "@electron/windows-sign": "^1.1.2" + } + }, + "node_modules/electron-winstaller/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/electron-winstaller/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-winstaller/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/electron/node_modules/@types/node": { + "version": "24.12.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.4.tgz", + "integrity": "sha512-GUUEShf+PBCGW2KaXwcIt3Yk+e3pkKwWKb9GSyM9WQVE+ep2jzmHdGsHzu4wgcZy5fN9FBdVzjpBQsYlpfpgLA==", + "dev": true, + "dependencies": { + "undici-types": "~7.16.0" + } + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "optional": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -3660,6 +3740,12 @@ "node": ">=6" } }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -3706,6 +3792,47 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -4096,15 +4223,6 @@ "node": ">=6" } }, - "node_modules/escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -4489,6 +4607,12 @@ "node": ">=0.10.0" } }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "dev": true + }, "node_modules/extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -4607,27 +4731,27 @@ } }, "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", + "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", "dev": true, "dependencies": { "minimatch": "^5.0.1" } }, "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -4703,30 +4827,32 @@ } }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { "node": ">= 6" } - }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=12" } }, "node_modules/fs.realpath": { @@ -4750,10 +4876,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { "version": "1.1.5", @@ -4825,19 +4953,40 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "dev": true, + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -4920,14 +5069,11 @@ } }, "node_modules/global-agent/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", "dev": true, "optional": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -4935,46 +5081,6 @@ "node": ">=10" } }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/global-tunnel-ng": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz", - "integrity": "sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==", - "dev": true, - "optional": true, - "dependencies": { - "encodeurl": "^1.0.2", - "lodash": "^4.17.10", - "npm-conf": "^1.1.3", - "tunnel": "^0.0.6" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -4985,13 +5091,14 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "optional": true, "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -5020,50 +5127,46 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "engines": { - "node": ">=8.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/got/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" }, "engines": { - "node": ">=6" + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "node_modules/grapheme-splitter": { @@ -5115,10 +5218,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "engines": { "node": ">= 0.4" }, @@ -5127,12 +5229,11 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -5141,13 +5242,15 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "dependencies": { + "function-bind": "^1.1.2" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, "node_modules/he": { @@ -5191,36 +5294,60 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "dev": true }, "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": ">= 14" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/http2-wrapper/node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "dependencies": { - "agent-base": "6", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/iconv-corefoundation": { @@ -5301,15 +5428,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -5335,12 +5453,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, "node_modules/internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", @@ -5401,18 +5513,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, "node_modules/is-core-module": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", @@ -5470,22 +5570,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -5498,18 +5582,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -5534,15 +5606,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -5610,12 +5673,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -5628,19 +5685,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, "node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz", + "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==", "dev": true, "engines": { - "node": ">= 8.0.0" + "node": ">= 18.0.0" }, "funding": { "url": "https://github.com/sponsors/gjtorikian/" @@ -5653,15 +5704,14 @@ "dev": true }, "node_modules/jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", "dev": true, "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" }, "bin": { "jake": "bin/cli.js" @@ -5670,74 +5720,13 @@ "node": ">=10" } }, - "node_modules/jake/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jake/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jake/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jake/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jake/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jake/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "bin": { + "jiti": "lib/jiti-cli.mjs" } }, "node_modules/js-sdsl": { @@ -5777,9 +5766,9 @@ } }, "node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, "node_modules/json-parse-better-errors": { @@ -5808,9 +5797,9 @@ "optional": true }, "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "bin": { "json5": "lib/cli.js" @@ -5826,10 +5815,13 @@ "dev": true }, "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -5852,24 +5844,12 @@ } }, "node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.0" - } - }, - "node_modules/latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" + "json-buffer": "3.0.1" } }, "node_modules/lazy-val": { @@ -5944,12 +5924,12 @@ "dev": true }, "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/lru-cache": { @@ -5981,21 +5961,6 @@ "node": ">=12" } }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/marked": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.4.tgz", @@ -6034,6 +5999,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", @@ -6118,10 +6091,47 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "peer": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } }, "node_modules/mobx": { "version": "6.6.2", @@ -6185,6 +6195,30 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node_modules/node-abi": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-4.31.0.tgz", + "integrity": "sha512-Erq5w/t3syw3s4sDsUaX4QttIdBPsGKTT1DTRsCkTonGggczhlDKm/wDX3o+HPJpQ41EjXCbcmXf0tgr5YZJXw==", + "dev": true, + "dependencies": { + "semver": "^7.6.3" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/node-addon-api": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", @@ -6192,12 +6226,117 @@ "dev": true, "optional": true }, + "node_modules/node-api-version": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz", + "integrity": "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + } + }, + "node_modules/node-api-version/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.3.0.tgz", + "integrity": "sha512-QNcUWM+HgJplcPzBvFBZ9VXacyGZ4+VTOb80PwWR+TlVzoHbRKULNEzpRsnaoxG3Wzr7Qh7BYxGDU3CbKib2Yg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "tar": "^7.5.4", + "tinyglobby": "^0.2.12", + "undici": "^6.25.0", + "which": "^6.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "dev": true, + "engines": { + "node": ">=20" + } + }, + "node_modules/node-gyp/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/undici": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.25.0.tgz", + "integrity": "sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==", + "dev": true, + "engines": { + "node": ">=18.17" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", + "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", + "dev": true, + "dependencies": { + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "node_modules/node-releases": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", "dev": true }, + "node_modules/nopt": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", + "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", + "dev": true, + "dependencies": { + "abbrev": "^4.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -6220,12 +6359,15 @@ } }, "node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/normalize.css": { @@ -6233,20 +6375,6 @@ "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==" }, - "node_modules/npm-conf": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", - "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", - "dev": true, - "optional": true, - "dependencies": { - "config-chain": "^1.1.11", - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/npm-run-all": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", @@ -6431,12 +6559,12 @@ } }, "node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "dev": true, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/p-limit": { @@ -6469,21 +6597,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/pako": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", @@ -6578,6 +6691,20 @@ "pbf": "bin/pbf" } }, + "node_modules/pe-library": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", + "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==", + "dev": true, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -6591,9 +6718,9 @@ "optional": true }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -6679,16 +6806,17 @@ } }, "node_modules/plist": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.6.tgz", - "integrity": "sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, "dependencies": { + "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", "xmlbuilder": "^15.1.1" }, "engines": { - "node": ">=6" + "node": ">=10.4.0" } }, "node_modules/postcss": { @@ -6727,6 +6855,34 @@ "node": ">=4" } }, + "node_modules/postject": { + "version": "1.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", + "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "commander": "^9.4.0" + }, + "bin": { + "postject": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/postject/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -6736,15 +6892,6 @@ "node": ">= 0.8.0" } }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/prettier": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", @@ -6790,6 +6937,15 @@ "vue": "^3.0.0" } }, + "node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -6799,12 +6955,29 @@ "node": ">=0.4.0" } }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, - "optional": true + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } }, "node_modules/protocol-buffers-schema": { "version": "3.6.0", @@ -6835,18 +7008,6 @@ "node": ">=6" } }, - "node_modules/pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "dependencies": { - "escape-goat": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -6900,44 +7061,16 @@ "quickselect": "^2.0.0" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "node_modules/read-binary-file-arch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", + "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", "dev": true, "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "debug": "^4.3.4" }, "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-config-file": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.2.0.tgz", - "integrity": "sha512-gx7Pgr5I56JtYz+WuqEbQHj/xWo+5Vwua2jhb1VwM4Wid5PqYmZ4i00ZB0YEGIfkVBsCv9UrjgyqCiQfS/Oosg==", - "dev": true, - "dependencies": { - "dotenv": "^9.0.2", - "dotenv-expand": "^5.1.0", - "js-yaml": "^4.1.0", - "json5": "^2.2.0", - "lazy-val": "^1.0.4" - }, - "engines": { - "node": ">=12.0.0" + "read-binary-file-arch": "cli.js" } }, "node_modules/read-pkg": { @@ -7001,37 +7134,30 @@ "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/registry-auth-token": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", - "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, - "dependencies": { - "rc": "1.2.8" - }, "engines": { - "node": ">=6.0.0" + "node": ">=0.10.0" } }, - "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "node_modules/resedit": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.2.tgz", + "integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==", "dev": true, "dependencies": { - "rc": "^1.2.8" + "pe-library": "^0.4.1" }, "engines": { - "node": ">=8" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" } }, "node_modules/resize-observer-polyfill": { @@ -7057,6 +7183,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -7071,16 +7203,28 @@ "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", "dependencies": { - "protocol-buffers-schema": "^3.3.1" + "protocol-buffers-schema": "^3.3.1" + } + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, - "dependencies": { - "lowercase-keys": "^1.0.0" + "engines": { + "node": ">= 4" } }, "node_modules/reusify": { @@ -7201,19 +7345,22 @@ "dev": true }, "node_modules/sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.4.tgz", + "integrity": "sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==", "dev": true, "dependencies": { "truncate-utf8-bytes": "^1.0.0" } }, "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "dev": true, + "engines": { + "node": ">=11.0.0" + } }, "node_modules/semver": { "version": "6.3.0", @@ -7231,18 +7378,6 @@ "dev": true, "optional": true }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/serialize-error": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", @@ -7330,6 +7465,30 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/sl-vue-tree": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/sl-vue-tree/-/sl-vue-tree-1.8.5.tgz", @@ -7472,9 +7631,9 @@ "dev": true }, "node_modules/sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "dev": true, "optional": true }, @@ -7639,49 +7798,67 @@ "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", "dev": true }, - "node_modules/temp-file": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", - "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", + "node_modules/tar": { + "version": "7.5.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.15.tgz", + "integrity": "sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==", "dev": true, "dependencies": { - "async-exit-hook": "^2.0.1", - "fs-extra": "^10.0.0" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" } }, - "node_modules/temp-file/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", "dev": true, + "peer": true, "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" }, "engines": { - "node": ">=12" + "node": ">=6.0.0" } }, - "node_modules/temp-file/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/temp-file": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", + "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", "dev": true, "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "async-exit-hook": "^2.0.1", + "fs-extra": "^10.0.0" } }, - "node_modules/temp-file/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "node_modules/temp/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, - "engines": { - "node": ">= 10.0.0" + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" } }, "node_modules/text-segmentation": { @@ -7699,16 +7876,76 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "node_modules/tiny-async-pool": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz", + "integrity": "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==", + "dev": true, + "dependencies": { + "semver": "^5.5.0" + } + }, + "node_modules/tiny-async-pool/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", "dev": true, "dependencies": { - "rimraf": "^3.0.0" + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, "engines": { - "node": ">=8.17.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true, + "engines": { + "node": ">=14.14" } }, "node_modules/tmp-promise": { @@ -7729,15 +7966,6 @@ "node": ">=4" } }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -7797,16 +8025,6 @@ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, - "node_modules/tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7831,15 +8049,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, "node_modules/typedoc": { "version": "0.23.23", "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.23.tgz", @@ -7906,186 +8115,49 @@ "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dev": true, - "dependencies": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "node_modules/update-notifier/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/update-notifier/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/update-notifier/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier/node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/update-notifier/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, "engines": { - "node": ">=10" + "node": ">= 10.0.0" } }, - "node_modules/update-notifier/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], "dependencies": { - "has-flag": "^4.0.0" + "escalade": "^3.1.1", + "picocolors": "^1.0.0" }, - "engines": { - "node": ">=8" + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, "node_modules/uri-js": { @@ -8097,22 +8169,10 @@ "punycode": "^2.1.0" } }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", - "dev": true, - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/utf8-byte-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", "dev": true }, "node_modules/util-deprecate": { @@ -8372,18 +8432,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -8449,27 +8497,6 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/xml-name-validator": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", @@ -8509,18 +8536,18 @@ "dev": true }, "node_modules/yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" @@ -8911,34 +8938,144 @@ "ajv-keywords": "^3.4.1" } }, + "@electron/asar": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", + "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==", + "dev": true, + "requires": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + } + }, + "@electron/fuses": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@electron/fuses/-/fuses-1.8.0.tgz", + "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==", + "dev": true, + "requires": { + "chalk": "^4.1.1", + "fs-extra": "^9.0.1", + "minimist": "^1.2.5" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "@electron/get": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.14.1.tgz", - "integrity": "sha512-BrZYyL/6m0ZXz/lDxy/nlVhQz+WF+iPS6qXolEU8atw7h6v1aYkjwJZ63m+bJMBTxDE66X+r2tPS4a/8C82sZw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", + "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", "dev": true, "requires": { "debug": "^4.1.1", "env-paths": "^2.2.0", "fs-extra": "^8.1.0", "global-agent": "^3.0.0", - "global-tunnel-ng": "^2.7.1", - "got": "^9.6.0", + "got": "^11.8.5", "progress": "^2.0.3", "semver": "^6.2.0", "sumchecker": "^3.0.1" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } } }, - "@electron/universal": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.0.5.tgz", - "integrity": "sha512-zX9O6+jr2NMyAdSkwEUlyltiI4/EBLu2Ls/VD3pUQdi3cAYeYfdQnT2AJJ38HE4QxLccbU13LSpccw1IWlkyag==", + "@electron/notarize": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz", + "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==", "dev": true, "requires": { - "@malept/cross-spawn-promise": "^1.1.0", - "asar": "^3.0.3", - "debug": "^4.3.1", - "dir-compare": "^2.4.0", - "fs-extra": "^9.0.1" + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" }, "dependencies": { "fs-extra": { @@ -8952,22 +9089,118 @@ "jsonfile": "^6.0.1", "universalify": "^2.0.0" } + } + } + }, + "@electron/osx-sign": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz", + "integrity": "sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==", + "dev": true, + "requires": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "dependencies": { + "isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true + } + } + }, + "@electron/rebuild": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-4.0.4.tgz", + "integrity": "sha512-Rzc39XPdk/+/wBG8MfwAHohXflep0ITUfulb6Rgz3R0NeSB1noE+E9/M/cb8ftCAiyDD9PPhLuuWgE1GaInbKg==", + "dev": true, + "requires": { + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.1.1", + "node-abi": "^4.2.0", + "node-api-version": "^0.2.1", + "node-gyp": "^12.2.0", + "read-binary-file-arch": "^1.0.6" + } + }, + "@electron/universal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.3.tgz", + "integrity": "sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==", + "dev": true, + "requires": { + "@electron/asar": "^3.3.1", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.3.1", + "dir-compare": "^4.2.0", + "fs-extra": "^11.1.1", + "minimatch": "^9.0.3", + "plist": "^3.1.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "fs-extra": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", "dev": true, "requires": { - "graceful-fs": "^4.1.6", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true + "minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.2" + } + } + } + }, + "@electron/windows-sign": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz", + "integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "cross-dirname": "^0.1.0", + "debug": "^4.3.4", + "fs-extra": "^11.1.1", + "minimist": "^1.2.8", + "postject": "^1.0.0-alpha.6" + }, + "dependencies": { + "fs-extra": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } } } }, @@ -9036,6 +9269,15 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "requires": { + "minipass": "^7.0.4" + } + }, "@jridgewell/gen-mapping": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", @@ -9074,9 +9316,9 @@ } }, "@malept/cross-spawn-promise": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", - "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", + "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", "dev": true, "requires": { "cross-spawn": "^7.0.1" @@ -9103,24 +9345,8 @@ "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true + "universalify": "^2.0.0" + } } } }, @@ -9167,9 +9393,9 @@ "dev": true }, "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true }, "@sphinxxxx/color-conversion": { @@ -9178,12 +9404,12 @@ "integrity": "sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw==" }, "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dev": true, "requires": { - "defer-to-connect": "^1.0.1" + "defer-to-connect": "^2.0.0" } }, "@thednp/color": { @@ -9211,12 +9437,6 @@ "resolved": "https://registry.npmjs.org/@thednp/shorty/-/shorty-2.0.0-alpha17.tgz", "integrity": "sha512-CsVmjqRhiIdRZmtrT9pXiucvSAvAgnukd/CRnC/lHc364223KIavGVTGSM3OknKdlkDKFLTZDqkv7i5+VTRXBA==" }, - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true - }, "@types/bootstrap": { "version": "5.2.5", "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.2.5.tgz", @@ -9225,10 +9445,22 @@ "@popperjs/core": "^2.9.2" } }, + "@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "requires": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, "@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", "dev": true, "requires": { "@types/ms": "*" @@ -9243,16 +9475,11 @@ "@types/node": "*" } }, - "@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "optional": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } + "@types/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "dev": true }, "@types/json-schema": { "version": "7.0.11", @@ -9260,17 +9487,19 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, - "@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dev": true, - "optional": true + "requires": { + "@types/node": "*" + } }, "@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "dev": true }, "@types/node": { @@ -9286,9 +9515,9 @@ "dev": true }, "@types/plist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.2.tgz", - "integrity": "sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", "dev": true, "optional": true, "requires": { @@ -9302,27 +9531,21 @@ "integrity": "sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==", "optional": true }, - "@types/verror": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.6.tgz", - "integrity": "sha512-NNm+gdePAX1VGvPcGZCDKQZKYSiAWigKhKaz5KF94hG6f2s8de9Ow5+7AbXoeKxL8gavZfk4UquSAygOF2duEQ==", - "dev": true, - "optional": true - }, - "@types/yargs": { - "version": "17.0.17", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.17.tgz", - "integrity": "sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g==", + "@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", "dev": true, "requires": { - "@types/yargs-parser": "*" + "@types/node": "*" } }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true + "@types/verror": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.11.tgz", + "integrity": "sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==", + "dev": true, + "optional": true }, "@types/yauzl": { "version": "2.10.0", @@ -9795,10 +10018,22 @@ "dev": true, "requires": {} }, + "@xmldom/xmldom": { + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz", + "integrity": "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==", + "dev": true + }, "7zip-bin": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.1.1.tgz", - "integrity": "sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", + "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", + "dev": true + }, + "abbrev": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", + "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", "dev": true }, "acorn": { @@ -9815,13 +10050,10 @@ "requires": {} }, "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true }, "ajv": { "version": "6.12.6", @@ -9842,15 +10074,6 @@ "dev": true, "requires": {} }, - "ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "requires": { - "string-width": "^4.1.0" - } - }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -9867,55 +10090,126 @@ } }, "app-builder-bin": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.7.1.tgz", - "integrity": "sha512-ql93vEUq6WsstGXD+SBLSIQw6SNnhbDEM0swzgugytMxLp3rT24Ag/jcC80ZHxiPRTdew1niuR7P3/FCrDqIjw==", + "version": "5.0.0-alpha.12", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-5.0.0-alpha.12.tgz", + "integrity": "sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==", "dev": true }, "app-builder-lib": { - "version": "22.14.13", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-22.14.13.tgz", - "integrity": "sha512-SufmrtxU+D0Tn948fjEwAOlCN9757UXLkzzTWXMwZKR/5hisvgqeeBepWfphMIE6OkDGz0fbzEhL1P2Pty4XMg==", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.8.1.tgz", + "integrity": "sha512-p0Im/Dx5C4tmz8QEE1Yn4MkuPC8PrnlRneMhWJj7BBXQfNTJUshM/bp3lusdEsDbvvfJZpXWnYesgSLvwtM2Zw==", "dev": true, "requires": { "@develar/schema-utils": "~2.6.5", - "@electron/universal": "1.0.5", + "@electron/asar": "3.4.1", + "@electron/fuses": "^1.8.0", + "@electron/get": "^3.0.0", + "@electron/notarize": "2.5.0", + "@electron/osx-sign": "1.3.3", + "@electron/rebuild": "^4.0.3", + "@electron/universal": "2.0.3", "@malept/flatpak-bundler": "^0.4.0", - "7zip-bin": "~5.1.1", + "@types/fs-extra": "9.0.13", "async-exit-hook": "^2.0.1", - "bluebird-lst": "^1.0.9", - "builder-util": "22.14.13", - "builder-util-runtime": "8.9.2", + "builder-util": "26.8.1", + "builder-util-runtime": "9.5.1", "chromium-pickle-js": "^0.2.0", - "debug": "^4.3.2", - "ejs": "^3.1.6", - "electron-osx-sign": "^0.5.0", - "electron-publish": "22.14.13", - "form-data": "^4.0.0", - "fs-extra": "^10.0.0", - "hosted-git-info": "^4.0.2", - "is-ci": "^3.0.0", - "isbinaryfile": "^4.0.8", + "ci-info": "4.3.1", + "debug": "^4.3.4", + "dotenv": "^16.4.5", + "dotenv-expand": "^11.0.6", + "ejs": "^3.1.8", + "electron-publish": "26.8.1", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "isbinaryfile": "^5.0.0", + "jiti": "^2.4.2", "js-yaml": "^4.1.0", + "json5": "^2.2.3", "lazy-val": "^1.0.5", - "minimatch": "^3.0.4", - "read-config-file": "6.2.0", - "sanitize-filename": "^1.6.3", - "semver": "^7.3.5", - "temp-file": "^3.4.0" - }, - "dependencies": { - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "minimatch": "^10.0.3", + "plist": "3.1.0", + "proper-lockfile": "^4.1.2", + "resedit": "^1.7.0", + "semver": "~7.7.3", + "tar": "^7.5.7", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0", + "which": "^5.0.0" + }, + "dependencies": { + "@electron/get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-3.1.0.tgz", + "integrity": "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==", "dev": true, "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "global-agent": "^3.0.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, + "balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true + }, + "brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "requires": { + "balanced-match": "^4.0.2" } }, + "ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "dev": true + }, "hosted-git-info": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", @@ -9925,30 +10219,35 @@ "lru-cache": "^6.0.0" } }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "dev": true + }, + "minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" + "brace-expansion": "^5.0.5" } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true + }, + "which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "isexe": "^3.1.1" } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true } } }, @@ -9964,19 +10263,6 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, - "asar": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/asar/-/asar-3.2.0.tgz", - "integrity": "sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "chromium-pickle-js": "^0.2.0", - "commander": "^5.0.0", - "glob": "^7.1.6", - "minimatch": "^3.0.4" - } - }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", @@ -9992,9 +10278,9 @@ "optional": true }, "async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true }, "async-exit-hook": { @@ -10057,21 +10343,6 @@ "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz", "integrity": "sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==" }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bluebird-lst": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", - "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5" - } - }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -10096,73 +10367,6 @@ "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.9.1.tgz", "integrity": "sha512-d4ZkO30MIkAhQ2nNRJqKXJVEQorALGbLWTuRxyCTJF96lRIV6imcgMehWGJUiJMJhglN0o2tqLIeDnMdiQEE9g==" }, - "boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -10210,40 +10414,12 @@ "ieee754": "^1.1.13" } }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true }, - "buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ==", - "dev": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", - "dev": true - }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -10251,28 +10427,27 @@ "dev": true }, "builder-util": { - "version": "22.14.13", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-22.14.13.tgz", - "integrity": "sha512-oePC/qrrUuerhmH5iaCJzPRAKlSBylrhzuAJmRQClTyWnZUv6jbaHh+VoHMbEiE661wrj2S2aV7/bQh12cj1OA==", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.8.1.tgz", + "integrity": "sha512-pm1lTYbGyc90DHgCDO7eo8Rl4EqKLciayNbZqGziqnH9jrlKe8ZANGdityLZU+pJh16dfzjAx2xQq9McuIPEtw==", "dev": true, "requires": { "@types/debug": "^4.1.6", - "@types/fs-extra": "^9.0.11", - "7zip-bin": "~5.1.1", - "app-builder-bin": "3.7.1", - "bluebird-lst": "^1.0.9", - "builder-util-runtime": "8.9.2", - "chalk": "^4.1.1", - "cross-spawn": "^7.0.3", - "debug": "^4.3.2", - "fs-extra": "^10.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-ci": "^3.0.0", + "7zip-bin": "~5.2.0", + "app-builder-bin": "5.0.0-alpha.12", + "builder-util-runtime": "9.5.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.6", + "debug": "^4.3.4", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", "js-yaml": "^4.1.0", + "sanitize-filename": "^1.6.3", "source-map-support": "^0.5.19", "stat-mode": "^1.0.0", - "temp-file": "^3.4.0" + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0" }, "dependencies": { "ansi-styles": { @@ -10309,33 +10484,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -10344,46 +10498,38 @@ "requires": { "has-flag": "^4.0.0" } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true } } }, "builder-util-runtime": { - "version": "8.9.2", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.9.2.tgz", - "integrity": "sha512-rhuKm5vh7E0aAmT6i8aoSfEjxzdYEFX7zDApK+eNgOhjofnWb74d9SRJv0H/8nsgOkos0TZ4zxW0P8J4N7xQ2A==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.5.1.tgz", + "integrity": "sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ==", "dev": true, "requires": { - "debug": "^4.3.2", + "debug": "^4.3.4", "sax": "^1.2.4" } }, + "cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true + }, "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "dev": true, "requires": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", + "keyv": "^4.0.0", "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" } }, "call-bind": { @@ -10396,6 +10542,15 @@ "get-intrinsic": "^1.0.2" } }, + "call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -10441,6 +10596,12 @@ "supports-color": "^5.3.0" } }, + "chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true + }, "chromium-pickle-js": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", @@ -10448,15 +10609,9 @@ "dev": true }, "ci-info": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz", - "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==", - "dev": true - }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "dev": true }, "cli-truncate": { @@ -10471,13 +10626,13 @@ } }, "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "requires": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, @@ -10534,12 +10689,6 @@ "resolved": "https://registry.npmjs.org/color-space/-/color-space-2.0.1.tgz", "integrity": "sha512-nKqUYlo0vZATVOFHY810BSYjmCARrG7e5R3UE3CQlyjJTvv5kSSmPG1kzm/oDyyqjehM+lW1RnEt9It9GNa5JA==" }, - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", - "dev": true - }, "colortranslator": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/colortranslator/-/colortranslator-4.1.0.tgz", @@ -10650,31 +10799,6 @@ } } }, - "config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "optional": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - } - }, "convert-source-map": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", @@ -10706,6 +10830,14 @@ "buffer": "^5.1.0" } }, + "cross-dirname": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", + "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", + "dev": true, + "optional": true, + "peer": true + }, "cross-env": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", @@ -10716,9 +10848,9 @@ } }, "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "requires": { "path-key": "^3.1.0", @@ -10726,12 +10858,6 @@ "which": "^2.0.1" } }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true - }, "css-line-break": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", @@ -10774,20 +10900,22 @@ } }, "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dev": true, "requires": { - "mimic-response": "^1.0.0" + "mimic-response": "^3.1.0" + }, + "dependencies": { + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + } } }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -10795,17 +10923,29 @@ "dev": true }, "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true }, - "define-properties": { + "define-data-property": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, + "define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "requires": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } @@ -10823,35 +10963,13 @@ "optional": true }, "dir-compare": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-2.4.0.tgz", - "integrity": "sha512-l9hmu8x/rjVC9Z2zmGzkhOEowZvW7pmYws5CWHutg8u1JgvsKWMx7Q/UODeu4djLZ4FgW5besw5yvMQnBHzuCA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", + "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", "dev": true, "requires": { - "buffer-equal": "1.0.0", - "colors": "1.0.3", - "commander": "2.9.0", - "minimatch": "3.0.4" - }, - "dependencies": { - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } + "minimatch": "^3.0.5", + "p-limit": "^3.1.0 " } }, "dir-glob": { @@ -10869,47 +10987,17 @@ "integrity": "sha512-cw1AgWh6YegrfNcoaA+tB5cBycy99qdr5aYVJwqBRUGHXnfXFLu09hLrzYu1qmrBzDr/uzCBGxl1wX96IBc56w==" }, "dmg-builder": { - "version": "22.14.13", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-22.14.13.tgz", - "integrity": "sha512-xNOugB6AbIRETeU2uID15sUfjdZZcKdxK8xkFnwIggsM00PJ12JxpLNPTjcRoUnfwj3WrPjilrO64vRMwNItQg==", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.8.1.tgz", + "integrity": "sha512-glMJgnTreo8CFINujtAhCgN96QAqApDMZ8Vl1r8f0QT8QprvC1UCltV4CcWj20YoIyLZx6IUskaJZ0NV8fokcg==", "dev": true, "requires": { - "app-builder-lib": "22.14.13", - "builder-util": "22.14.13", - "builder-util-runtime": "8.9.2", - "dmg-license": "^1.0.9", - "fs-extra": "^10.0.0", + "app-builder-lib": "26.8.1", + "builder-util": "26.8.1", + "dmg-license": "^1.0.11", + "fs-extra": "^10.1.0", "iconv-lite": "^0.6.2", "js-yaml": "^4.1.0" - }, - "dependencies": { - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } } }, "dmg-license": { @@ -10944,32 +11032,30 @@ "integrity": "sha512-o1vSNgrmYMQObbSSvF/1brBYEQPHhV1+gsmrusO7/GXtp1T9rCS8cXFqVxK/9crT1jA6Ccv+5MTSjBNqr7Sovw==", "optional": true }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, "dotenv": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", - "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", "dev": true }, "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "dev": true, + "requires": { + "dotenv": "^16.4.5" + } }, - "duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", - "dev": true + "dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + } }, "earcut": { "version": "2.2.4", @@ -10977,43 +11063,52 @@ "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" }, "ejs": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", - "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, "requires": { "jake": "^10.8.5" } }, "electron": { - "version": "21.3.3", - "resolved": "https://registry.npmjs.org/electron/-/electron-21.3.3.tgz", - "integrity": "sha512-2a9l8mUQlzXH/9WZrGYDJTyJOliLKbmEuCrQ8bfX1McAQOmI6PDQxfHV4qFUtyCDUp5SHrq5nuvg0c1pIkDBhg==", + "version": "41.7.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-41.7.0.tgz", + "integrity": "sha512-U6KAKivjk6YQ0Z5+eloJBjwhbHRE206gvy1UBMw2bSluWtMh5waeXMvX6AT/Ujm5ymYXVJOp7g9N7vOFw16wBQ==", "dev": true, "requires": { - "@electron/get": "^1.14.1", - "@types/node": "^16.11.26", + "@electron/get": "^2.0.0", + "@types/node": "^24.9.0", "extract-zip": "^2.0.1" + }, + "dependencies": { + "@types/node": { + "version": "24.12.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.4.tgz", + "integrity": "sha512-GUUEShf+PBCGW2KaXwcIt3Yk+e3pkKwWKb9GSyM9WQVE+ep2jzmHdGsHzu4wgcZy5fN9FBdVzjpBQsYlpfpgLA==", + "dev": true, + "requires": { + "undici-types": "~7.16.0" + } + } } }, "electron-builder": { - "version": "22.14.13", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-22.14.13.tgz", - "integrity": "sha512-3fgLxqF2TXVKiUPeg74O4V3l0l3j7ERLazo8sUbRkApw0+4iVAf2BJkHsHMaXiigsgCoEzK/F4/rB5rne/VAnw==", - "dev": true, - "requires": { - "@types/yargs": "^17.0.1", - "app-builder-lib": "22.14.13", - "builder-util": "22.14.13", - "builder-util-runtime": "8.9.2", - "chalk": "^4.1.1", - "dmg-builder": "22.14.13", - "fs-extra": "^10.0.0", - "is-ci": "^3.0.0", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.8.1.tgz", + "integrity": "sha512-uWhx1r74NGpCagG0ULs/P9Nqv2nsoo+7eo4fLUOB8L8MdWltq9odW/uuLXMFCDGnPafknYLZgjNX0ZIFRzOQAw==", + "dev": true, + "requires": { + "app-builder-lib": "26.8.1", + "builder-util": "26.8.1", + "builder-util-runtime": "9.5.1", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "dmg-builder": "26.8.1", + "fs-extra": "^10.1.0", "lazy-val": "^1.0.5", - "read-config-file": "6.2.0", - "update-notifier": "^5.1.0", - "yargs": "^17.0.1" + "simple-update-notifier": "2.0.0", + "yargs": "^17.6.2" }, "dependencies": { "ansi-styles": { @@ -11050,33 +11145,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -11085,66 +11159,33 @@ "requires": { "has-flag": "^4.0.0" } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true } } }, - "electron-osx-sign": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.5.0.tgz", - "integrity": "sha512-icoRLHzFz/qxzDh/N4Pi2z4yVHurlsCAYQvsCSG7fCedJ4UJXBS6PoQyGH71IfcqKupcKeK7HX/NkyfG+v6vlQ==", + "electron-builder-squirrel-windows": { + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.8.1.tgz", + "integrity": "sha512-o288fIdgPLHA76eDrFADHPoo7VyGkDCYbLV1GzndaMSAVBoZrGvM9m2IehdcVMzdAZJ2eV9bgyissQXHv5tGzA==", "dev": true, + "peer": true, "requires": { - "bluebird": "^3.5.0", - "compare-version": "^0.1.2", - "debug": "^2.6.8", - "isbinaryfile": "^3.0.2", - "minimist": "^1.2.0", - "plist": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "isbinaryfile": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", - "dev": true, - "requires": { - "buffer-alloc": "^1.2.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } + "app-builder-lib": "26.8.1", + "builder-util": "26.8.1", + "electron-winstaller": "5.4.0" } }, "electron-publish": { - "version": "22.14.13", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-22.14.13.tgz", - "integrity": "sha512-0oP3QiNj3e8ewOaEpEJV/o6Zrmy2VarVvZ/bH7kyO/S/aJf9x8vQsKVWpsdmSiZ5DJEHgarFIXrnO0ZQf0P9iQ==", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.8.1.tgz", + "integrity": "sha512-q+jrSTIh/Cv4eGZa7oVR+grEJo/FoLMYBAnSL5GCtqwUpr1T+VgKB/dn1pnzxIxqD8S/jP1yilT9VrwCqINR4w==", "dev": true, "requires": { "@types/fs-extra": "^9.0.11", - "builder-util": "22.14.13", - "builder-util-runtime": "8.9.2", - "chalk": "^4.1.1", - "fs-extra": "^10.0.0", + "builder-util": "26.8.1", + "builder-util-runtime": "9.5.1", + "chalk": "^4.1.2", + "form-data": "^4.0.5", + "fs-extra": "^10.1.0", "lazy-val": "^1.0.5", "mime": "^2.5.2" }, @@ -11183,33 +11224,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -11218,12 +11238,6 @@ "requires": { "has-flag": "^4.0.0" } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true } } }, @@ -11233,19 +11247,58 @@ "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", "dev": true }, + "electron-winstaller": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz", + "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==", + "dev": true, + "peer": true, + "requires": { + "@electron/asar": "^3.2.1", + "@electron/windows-sign": "^1.1.2", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash": "^4.17.21", + "temp": "^0.9.0" + }, + "dependencies": { + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "peer": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "peer": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "peer": true + } + } + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "optional": true - }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -11261,6 +11314,12 @@ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -11301,6 +11360,35 @@ "unbox-primitive": "^1.0.2" } }, + "es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, + "es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "requires": { + "es-errors": "^1.3.0" + } + }, + "es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "requires": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + } + }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -11495,12 +11583,6 @@ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true - }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -11773,6 +11855,12 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "dev": true + }, "extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -11873,27 +11961,27 @@ } }, "filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", + "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", "dev": true, "requires": { "minimatch": "^5.0.1" }, "dependencies": { "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, "requires": { "balanced-match": "^1.0.0" } }, "minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -11942,24 +12030,26 @@ "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" }, "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, "requires": { "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" } }, "fs.realpath": { @@ -11976,10 +12066,9 @@ "optional": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "function.prototype.name": { "version": "1.1.5", @@ -12033,14 +12122,29 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "dev": true, + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "requires": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + } + }, + "get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" } }, "get-stream": { @@ -12079,67 +12183,34 @@ "glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "global-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - "dev": true, - "optional": true, - "requires": { - "boolean": "^3.0.1", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "dependencies": { - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "optional": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "requires": { - "ini": "2.0.0" - }, - "dependencies": { - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true - } + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" } }, - "global-tunnel-ng": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz", - "integrity": "sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==", + "global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", "dev": true, "optional": true, "requires": { - "encodeurl": "^1.0.2", - "lodash": "^4.17.10", - "npm-conf": "^1.1.3", - "tunnel": "^0.0.6" + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "dependencies": { + "semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "optional": true + } } }, "globals": { @@ -12149,13 +12220,14 @@ "dev": true }, "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "optional": true, "requires": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" } }, "globby": { @@ -12172,46 +12244,34 @@ "slash": "^3.0.0" } }, + "gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" + }, "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "dependencies": { - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - } + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "requires": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" } }, "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "grapheme-splitter": { @@ -12251,25 +12311,25 @@ } }, "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" }, "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "requires": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" } }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true + "hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "requires": { + "function-bind": "^1.1.2" + } }, "he": { "version": "1.2.0", @@ -12300,29 +12360,46 @@ } }, "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "dev": true }, "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" + } + }, + "http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "dependencies": { + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + } } }, "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "requires": { - "agent-base": "6", + "agent-base": "^7.1.2", "debug": "4" } }, @@ -12372,12 +12449,6 @@ "resolve-from": "^4.0.0" } }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", - "dev": true - }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -12400,12 +12471,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, "internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", @@ -12448,15 +12513,6 @@ "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", "dev": true }, - "is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "requires": { - "ci-info": "^3.2.0" - } - }, "is-core-module": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", @@ -12496,28 +12552,12 @@ "is-extglob": "^2.1.1" } }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - } - }, "is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true }, - "is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "dev": true - }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -12533,12 +12573,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, "is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -12582,12 +12616,6 @@ "has-symbols": "^1.0.2" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, "is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -12597,16 +12625,10 @@ "call-bind": "^1.0.2" } }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, "isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz", + "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==", "dev": true }, "isexe": { @@ -12616,68 +12638,22 @@ "dev": true }, "jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", "dev": true, "requires": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" } }, + "jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true + }, "js-sdsl": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", @@ -12706,9 +12682,9 @@ "dev": true }, "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, "json-parse-better-errors": { @@ -12737,9 +12713,9 @@ "optional": true }, "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, "jsonc-parser": { @@ -12749,12 +12725,13 @@ "dev": true }, "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "dev": true, "requires": { - "graceful-fs": "^4.1.6" + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" } }, "jspdf": { @@ -12773,21 +12750,12 @@ } }, "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "requires": { - "package-json": "^6.3.0" + "json-buffer": "3.0.1" } }, "lazy-val": { @@ -12850,9 +12818,9 @@ "dev": true }, "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "dev": true }, "lru-cache": { @@ -12878,15 +12846,6 @@ "@jridgewell/sourcemap-codec": "^1.4.15" } }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, "marked": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.4.tgz", @@ -12912,6 +12871,11 @@ } } }, + "math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" + }, "memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", @@ -12969,11 +12933,36 @@ } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true }, + "minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "requires": { + "minipass": "^7.1.2" + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "peer": true, + "requires": { + "minimist": "^1.2.6" + } + }, "mobx": { "version": "6.6.2", "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.6.2.tgz", @@ -13022,6 +13011,23 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-abi": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-4.31.0.tgz", + "integrity": "sha512-Erq5w/t3syw3s4sDsUaX4QttIdBPsGKTT1DTRsCkTonGggczhlDKm/wDX3o+HPJpQ41EjXCbcmXf0tgr5YZJXw==", + "dev": true, + "requires": { + "semver": "^7.6.3" + }, + "dependencies": { + "semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true + } + } + }, "node-addon-api": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", @@ -13029,12 +13035,85 @@ "dev": true, "optional": true }, + "node-api-version": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz", + "integrity": "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==", + "dev": true, + "requires": { + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true + } + } + }, + "node-gyp": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.3.0.tgz", + "integrity": "sha512-QNcUWM+HgJplcPzBvFBZ9VXacyGZ4+VTOb80PwWR+TlVzoHbRKULNEzpRsnaoxG3Wzr7Qh7BYxGDU3CbKib2Yg==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "tar": "^7.5.4", + "tinyglobby": "^0.2.12", + "undici": "^6.25.0", + "which": "^6.0.0" + }, + "dependencies": { + "isexe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "dev": true + }, + "semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true + }, + "undici": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.25.0.tgz", + "integrity": "sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==", + "dev": true + }, + "which": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", + "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", + "dev": true, + "requires": { + "isexe": "^4.0.0" + } + } + } + }, "node-releases": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", "dev": true }, + "nopt": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", + "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", + "dev": true, + "requires": { + "abbrev": "^4.0.0" + } + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -13056,9 +13135,9 @@ } }, "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "dev": true }, "normalize.css": { @@ -13066,17 +13145,6 @@ "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==" }, - "npm-conf": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", - "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", - "dev": true, - "optional": true, - "requires": { - "config-chain": "^1.1.11", - "pify": "^3.0.0" - } - }, "npm-run-all": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", @@ -13215,9 +13283,9 @@ } }, "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "dev": true }, "p-limit": { @@ -13238,18 +13306,6 @@ "p-limit": "^3.0.2" } }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - } - }, "pako": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", @@ -13323,6 +13379,12 @@ "resolve-protobuf-schema": "^2.1.0" } }, + "pe-library": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", + "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==", + "dev": true + }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -13336,9 +13398,9 @@ "optional": true }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "picomatch": { "version": "2.3.1", @@ -13376,11 +13438,12 @@ } }, "plist": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.6.tgz", - "integrity": "sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, "requires": { + "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", "xmlbuilder": "^15.1.1" } @@ -13405,18 +13468,33 @@ "util-deprecate": "^1.0.2" } }, + "postject": { + "version": "1.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", + "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "commander": "^9.4.0" + }, + "dependencies": { + "commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "optional": true, + "peer": true + } + } + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", - "dev": true - }, "prettier": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", @@ -13448,18 +13526,38 @@ "integrity": "sha512-fDaK/SHijvw5ds3RNs4yzPgVFyA1/RYXxnEshHME1zhn9/HiTxEqa0Wv3obbuwSmRckA4fdGh+lZ8dDd1RJJLQ==", "requires": {} }, + "proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, - "optional": true + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } }, "protocol-buffers-schema": { "version": "3.6.0", @@ -13487,15 +13585,6 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "requires": { - "escape-goat": "^2.0.0" - } - }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -13529,37 +13618,13 @@ "quickselect": "^2.0.0" } }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true - } - } - }, - "read-config-file": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.2.0.tgz", - "integrity": "sha512-gx7Pgr5I56JtYz+WuqEbQHj/xWo+5Vwua2jhb1VwM4Wid5PqYmZ4i00ZB0YEGIfkVBsCv9UrjgyqCiQfS/Oosg==", + "read-binary-file-arch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", + "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", "dev": true, "requires": { - "dotenv": "^9.0.2", - "dotenv-expand": "^5.1.0", - "js-yaml": "^4.1.0", - "json5": "^2.2.0", - "lazy-val": "^1.0.4" + "debug": "^4.3.4" } }, "read-pkg": { @@ -13607,30 +13672,21 @@ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, - "registry-auth-token": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", - "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", - "dev": true, - "requires": { - "rc": "1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, + "resedit": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.2.tgz", + "integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==", + "dev": true, + "requires": { + "pe-library": "^0.4.1" + } + }, "resize-observer-polyfill": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", @@ -13648,6 +13704,12 @@ "supports-preserve-symlinks-flag": "^1.0.0" } }, + "resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -13663,14 +13725,20 @@ } }, "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", "dev": true, "requires": { - "lowercase-keys": "^1.0.0" + "lowercase-keys": "^2.0.0" } }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -13755,18 +13823,18 @@ "dev": true }, "sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.4.tgz", + "integrity": "sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==", "dev": true, "requires": { "truncate-utf8-bytes": "^1.0.0" } }, "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", "dev": true }, "semver": { @@ -13782,15 +13850,6 @@ "dev": true, "optional": true }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - } - }, "serialize-error": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", @@ -13859,6 +13918,23 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "requires": { + "semver": "^7.5.3" + }, + "dependencies": { + "semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true + } + } + }, "sl-vue-tree": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/sl-vue-tree/-/sl-vue-tree-1.8.5.tgz", @@ -13978,9 +14054,9 @@ "dev": true }, "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "dev": true, "optional": true }, @@ -14097,45 +14173,60 @@ "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", "dev": true }, - "temp-file": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", - "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", + "tar": { + "version": "7.5.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.15.tgz", + "integrity": "sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==", "dev": true, "requires": { - "async-exit-hook": "^2.0.1", - "fs-extra": "^10.0.0" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" }, "dependencies": { - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true + } + } + }, + "temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "dev": true, + "peer": true, + "requires": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, + "peer": true, "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" + "glob": "^7.1.3" } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true } } }, + "temp-file": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", + "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", + "dev": true, + "requires": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^10.0.0" + } + }, "text-segmentation": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", @@ -14151,15 +14242,54 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "tiny-async-pool": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz", + "integrity": "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==", + "dev": true, + "requires": { + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + } + } + }, + "tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", "dev": true, "requires": { - "rimraf": "^3.0.0" + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "dependencies": { + "fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "requires": {} + }, + "picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true + } } }, + "tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true + }, "tmp-promise": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", @@ -14175,12 +14305,6 @@ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -14228,13 +14352,6 @@ "tslib": "^1.8.1" } }, - "tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "dev": true, - "optional": true - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -14250,15 +14367,6 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, "typedoc": { "version": "0.23.23", "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.23.tgz", @@ -14309,19 +14417,16 @@ "which-boxed-primitive": "^1.0.2" } }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" - } + "undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true }, "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true }, "update-browserslist-db": { @@ -14334,103 +14439,6 @@ "picocolors": "^1.0.0" } }, - "update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dev": true, - "requires": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -14440,19 +14448,10 @@ "punycode": "^2.1.0" } }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, "utf8-byte-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", "dev": true }, "util-deprecate": { @@ -14637,15 +14636,6 @@ "is-symbol": "^1.0.3" } }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "requires": { - "string-width": "^4.0.0" - } - }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -14695,24 +14685,6 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true - }, "xml-name-validator": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", @@ -14743,18 +14715,18 @@ "dev": true }, "yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "requires": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" } }, "yargs-parser": { diff --git a/package.json b/package.json index 1e356b9..c836c63 100644 --- a/package.json +++ b/package.json @@ -3,18 +3,28 @@ "version": "0.1.1", "private": true, "author": "Aleksandr Serdiukov, Anton Zamyatin and CT Lab ITMO University team", - "main": "dist/electron/electron/main/main.js", + "main": "dist/electron/main/main.js", "license": "MIT", "scripts": { "dev": "vite", - "build": "run-p type-check build-only && tsc", + "build": "npm run build:web && npm run electron:compile", + "build:web": "run-p type-check test:api-dto test:map-resolution build-only", + "test:api-dto": "node scripts/check-api-dto-regressions.mjs", + "test:map-resolution": "node scripts/check-map-resolution-model.mjs", "preview": "vite preview --port 4173", "build-only": "vite build", "type-check": "vue-tsc --noEmit", "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore", - "ts": "tsc", - "watch": "tsc -w", - "app:dev": "tsc && concurrently vite \" electron .\" \"tsc -w\"", + "ts": "tsc -p tsconfig.electron.json", + "watch": "tsc -p tsconfig.electron.json -w", + "electron:compile": "tsc -p tsconfig.electron.json", + "electron:payload": "node scripts/build-electron-browser-payload.mjs", + "electron:payload:linux": "npm run build && node scripts/build-electron-browser-payload.mjs --platform linux_x86_64", + "electron:payload:windows": "npm run build && node scripts/build-electron-browser-payload.mjs --platform windows_x86_64", + "tauri:payload": "node scripts/build-tauri-browser-payload.mjs", + "tauri:payload:linux": "npm run build:web && node scripts/build-tauri-browser-payload.mjs --platform linux_x86_64", + "tauri:payload:windows": "npm run build:web && node scripts/build-tauri-browser-payload.mjs --platform windows_x86_64", + "app:dev": "npm run electron:compile && concurrently vite \"electron . http://localhost:8080/\" \"npm run watch\"", "app:build": "npm run build && electron-builder", "app:multibuild": "npm run build && electron-builder -wl --ia-32 --x64 --publish never", "app:linuxbuild": "npm run build && electron-builder -l --x64 --publish never", @@ -65,8 +75,9 @@ "@vue/tsconfig": "^0.1.3", "concurrently": "^7.6.0", "cross-env": "^7.0.3", - "electron": "^21.3.1", - "electron-builder": "^22.10.3", + "@electron/fuses": "^1.8.0", + "electron": "^41.5.0", + "electron-builder": "^26.8.1", "eslint": "^8.28.0", "eslint-plugin-vue": "^9.8.0", "npm-run-all": "^4.1.5", @@ -96,7 +107,13 @@ "build": { "appId": "ru.itmo.hict", "productName": "HiCT WebUI", - "copyright": "Copyright © 2022 ${author}", + "copyright": "Copyright © 2021-2026 ${author}", + "asar": true, + "compression": "maximum", + "npmRebuild": false, + "electronLanguages": [ + "en-US" + ], "publish": [ { "provider": "github", diff --git a/scripts/build-electron-browser-payload.mjs b/scripts/build-electron-browser-payload.mjs new file mode 100644 index 0000000..d0fe65e --- /dev/null +++ b/scripts/build-electron-browser-payload.mjs @@ -0,0 +1,735 @@ +#!/usr/bin/env node +/* + Copyright (c) 2021-2026 Aleksandr Serdiukov, Anton Zamyatin, Aleksandr Sinitsyn, Vitalii Dravgelis and Computer Technologies Laboratory ITMO University team. + + Permission is hereby granted, free of charge, to any person obtaining a copy of + this software and associated documentation files (the "Software"), to deal in + the Software without restriction, including without limitation the rights to + use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + the Software, and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + */ + +import { createHash } from "node:crypto"; +import http from "node:http"; +import https from "node:https"; +import { spawnSync } from "node:child_process"; +import { createWriteStream, existsSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync, symlinkSync, writeFileSync } from "node:fs"; +import { chmod, cp } from "node:fs/promises"; +import { createRequire } from "node:module"; +import { basename, dirname, join, resolve, sep } from "node:path"; +import { pipeline } from "node:stream/promises"; +import { fileURLToPath } from "node:url"; + +const scriptDir = dirname(fileURLToPath(import.meta.url)); +const repoDir = resolve(scriptDir, ".."); + +const args = parseArgs(process.argv.slice(2)); +const platform = args.platform ?? detectPlatform(); +const outputDir = resolve(args.output ?? join(repoDir, "..", "HiCT_JVM", "browsers-dist", platform, "electron")); +const electronPackageDir = resolve(repoDir, "node_modules", "electron"); +const electronPackage = JSON.parse(readFileSync(resolve(electronPackageDir, "package.json"), "utf8")); +const electronRuntimeExecutable = await ensureInstalledElectronExecutable(electronPackageDir, platform); +const electronDist = dirname(electronRuntimeExecutable); +const electronVersion = String(electronPackage.version); + +if (!["linux_x86_64", "windows_x86_64"].includes(platform)) { + throw new Error(`Unsupported Electron browser payload platform: ${platform}`); +} +if (!existsSync(resolve(repoDir, "dist", "electron", "main", "main.js"))) { + throw new Error("Electron main process is not compiled. Run npm run electron:compile first."); +} + +rmSync(outputDir, { recursive: true, force: true }); +mkdirSync(outputDir, { recursive: true }); + +const electronTarget = join(outputDir, "electron"); +await copyElectronRuntime(electronDist, electronTarget); +await copyElectronApp(join(outputDir, "app")); + +const command = resolveElectronCommand(outputDir, platform); +const executablePath = join(outputDir, command); +await chmodExecutableIfPresent(executablePath); +await flipSecurityFuses(executablePath); + +const launchArguments = platform === "linux_x86_64" ? ["--no-sandbox", "app"] : ["app"]; +const manifest = { + name: `HiCT Electron ${electronVersion}`, + engine: "electron-chromium", + version: electronVersion, + priority: 50, + command, + arguments: launchArguments, + license: "Electron MIT; Chromium and bundled third-party components under their upstream licenses", + notices: [ + "electron/LICENSE", + "electron/LICENSES.chromium.html", + "app/package.json" + ], + sizeBytes: directorySize(outputDir), + sha256: sha256OfTree(outputDir), +}; +writeFileSync(join(outputDir, "manifest.json"), `${JSON.stringify(manifest, null, 2)}\n`, "utf8"); + +console.log(`Prepared HiCT Electron browser payload for ${platform}`); +console.log(` output: ${outputDir}`); +console.log(` Electron: ${electronVersion}`); +console.log(` size: ${(manifest.sizeBytes / (1024 * 1024)).toFixed(1)} MiB`); + +function parseArgs(argv) { + const parsed = {}; + for (let i = 0; i < argv.length; i++) { + const arg = argv[i]; + if (arg === "--platform") { + parsed.platform = argv[++i]; + } else if (arg.startsWith("--platform=")) { + parsed.platform = arg.slice("--platform=".length); + } else if (arg === "--output") { + parsed.output = argv[++i]; + } else if (arg.startsWith("--output=")) { + parsed.output = arg.slice("--output=".length); + } else { + throw new Error(`Unknown argument: ${arg}`); + } + } + return parsed; +} + +function detectPlatform() { + if (process.platform === "win32") { + return "windows_x86_64"; + } + if (process.platform === "linux") { + return "linux_x86_64"; + } + throw new Error(`Unsupported platform for HiCT Electron browser payload: ${process.platform}`); +} + +async function copyElectronRuntime(source, target) { + const keepLocales = new Set( + (process.env.HICT_ELECTRON_KEEP_LOCALES ?? "en-US") + .split(",") + .map((locale) => locale.trim()) + .filter(Boolean) + .map((locale) => `${locale}.pak`) + ); + + rmSync(target, { recursive: true, force: true }); + mkdirSync(target, { recursive: true }); + for (const entry of readdirSync(source)) { + await cp(join(source, entry), join(target, entry), { + recursive: true, + dereference: true, + filter: (src) => shouldCopyElectronRuntimePath(src, keepLocales), + }); + } +} + +async function copyElectronApp(target) { + mkdirSync(join(target, "main"), { recursive: true }); + mkdirSync(join(target, "preload"), { recursive: true }); + await cp(resolve(repoDir, "dist", "electron", "main"), join(target, "main"), { recursive: true }); + await cp(resolve(repoDir, "dist", "electron", "preload"), join(target, "preload"), { recursive: true }); + await cp(resolve(repoDir, "dist", "index.html"), join(target, "index.html")); + await cp(resolve(repoDir, "dist", "assets"), join(target, "assets"), { recursive: true }); + + const appPackage = { + name: "hict-electron-browser", + version: JSON.parse(readFileSync(resolve(repoDir, "package.json"), "utf8")).version, + private: true, + main: "main/main.js", + license: "MIT", + }; + writeFileSync(join(target, "package.json"), `${JSON.stringify(appPackage, null, 2)}\n`, "utf8"); +} + +function resolveElectronCommand(payloadRoot, targetPlatform) { + const candidates = + targetPlatform === "windows_x86_64" + ? ["electron/electron.exe", "electron.exe"] + : ["electron/electron", "electron"]; + for (const candidate of candidates) { + const candidatePath = join(payloadRoot, candidate); + if (existsSync(candidatePath) && statSync(candidatePath).isFile()) { + return candidate; + } + } + throw new Error( + [ + `Electron runtime executable was not found in ${payloadRoot}.`, + `Checked: ${candidates.join(", ")}`, + `Installed Electron executable: ${electronRuntimeExecutable}`, + `Installed Electron runtime directory entries: ${describeDirectory(electronDist)}`, + `Payload entries: ${describeDirectory(payloadRoot)}`, + ].join("\n") + ); +} + +async function ensureInstalledElectronExecutable(packageDir, targetPlatform) { + const executable = resolveInstalledElectronExecutable(packageDir, targetPlatform); + if (executable) { + return executable; + } + + console.warn( + [ + "Electron runtime executable was not found after npm install; attempting to repair Electron postinstall.", + `Electron package directory entries: ${describeDirectory(packageDir)}`, + `Electron dist directory entries: ${describeDirectory(resolve(packageDir, "dist"))}`, + ].join("\n") + ); + const repairSucceeded = repairElectronInstall(packageDir, targetPlatform); + + if (repairSucceeded) { + const repairedExecutable = resolveInstalledElectronExecutable(packageDir, targetPlatform); + if (repairedExecutable) { + return repairedExecutable; + } + } else { + console.warn("Electron postinstall repair failed; continuing with direct Electron artifact download."); + } + + console.warn("Electron postinstall repair did not produce a runtime executable; forcing a fresh Electron artifact download."); + await downloadAndExtractElectronRuntime(packageDir, targetPlatform); + + const downloadedExecutable = resolveInstalledElectronExecutable(packageDir, targetPlatform); + if (downloadedExecutable) { + return downloadedExecutable; + } + + throw new Error( + [ + "Electron runtime executable was not found after npm install, postinstall repair, and direct artifact download.", + `Checked package: ${packageDir}`, + `Electron package directory entries: ${describeDirectory(packageDir)}`, + `Electron dist directory entries: ${describeDirectory(resolve(packageDir, "dist"))}`, + "Ensure network access to Electron release artifacts and that no Electron skip/override environment variables are set.", + ].join("\n") + ); +} + +function resolveInstalledElectronExecutable(packageDir, targetPlatform) { + const expectedExecutable = targetPlatform === "windows_x86_64" ? "electron.exe" : "electron"; + const candidates = []; + const pathFile = resolve(packageDir, "path.txt"); + if (existsSync(pathFile)) { + const relativeExecutable = readFileSync(pathFile, "utf8").trim(); + if (relativeExecutable) { + candidates.push(resolve(packageDir, relativeExecutable)); + } + } + candidates.push(resolve(packageDir, "dist", expectedExecutable)); + + for (const candidate of candidates) { + if (existsSync(candidate) && statSync(candidate).isFile()) { + return candidate; + } + } + + return null; +} + +function repairElectronInstall(packageDir, targetPlatform) { + const installScript = resolve(packageDir, "install.js"); + if (!existsSync(installScript)) { + throw new Error(`Electron install script was not found: ${installScript}`); + } + + rmSync(resolve(packageDir, "dist"), { recursive: true, force: true }); + rmSync(resolve(packageDir, "path.txt"), { force: true }); + + const env = { ...process.env }; + for (const key of [ + "ELECTRON_SKIP_BINARY_DOWNLOAD", + "ELECTRON_OVERRIDE_DIST_PATH", + "npm_config_electron_skip_binary_download", + "npm_config_ELECTRON_SKIP_BINARY_DOWNLOAD", + ]) { + delete env[key]; + } + env.npm_config_platform = targetPlatform === "windows_x86_64" ? "win32" : "linux"; + env.npm_config_arch = "x64"; + env.force_no_cache = "true"; + env.electron_config_cache = electronCacheRoot(targetPlatform); + + const result = spawnSync(process.execPath, [installScript], { + cwd: packageDir, + env, + stdio: "inherit", + }); + if (result.error) { + console.warn(`Electron postinstall repair could not start: ${result.error.message}`); + return false; + } + if (result.status !== 0) { + console.warn(`Electron postinstall repair failed with exit code ${result.status}`); + return false; + } + return true; +} + +async function downloadAndExtractElectronRuntime(packageDir, targetPlatform) { + const packageRequire = createRequire(resolve(packageDir, "install.js")); + const distPath = resolve(packageDir, "dist"); + const pathFile = resolve(packageDir, "path.txt"); + const electronDtsInDist = resolve(distPath, "electron.d.ts"); + const electronDtsInPackage = resolve(packageDir, "electron.d.ts"); + const checksumsPath = resolve(packageDir, "checksums.json"); + const artifactName = electronArtifactName(targetPlatform); + const artifactUrl = electronArtifactUrl(artifactName); + const cacheRoot = electronCacheRoot(targetPlatform); + const cachedZipPath = findCachedElectronArtifact(cacheRoot, checksumsPath, artifactName); + const zipPath = cachedZipPath ?? resolve(cacheRoot, artifactName); + + rmSync(distPath, { recursive: true, force: true }); + rmSync(pathFile, { force: true }); + mkdirSync(distPath, { recursive: true }); + + if (cachedZipPath) { + console.warn(`Using cached Electron runtime artifact: ${cachedZipPath}`); + } else { + console.warn(`Downloading Electron runtime artifact: ${artifactUrl}`); + await downloadFile(artifactUrl, zipPath); + } + verifyElectronArtifactChecksum(zipPath, checksumsPath, artifactName); + + await extractElectronRuntimeArtifact(packageRequire, zipPath, distPath, artifactName); + + if (existsSync(electronDtsInDist)) { + rmSync(electronDtsInPackage, { force: true }); + renameSync(electronDtsInDist, electronDtsInPackage); + } + + writeFileSync(pathFile, electronPlatformPath(targetPlatform), "utf8"); +} + +async function extractElectronRuntimeArtifact(packageRequire, zipPath, distPath, artifactName) { + if (extractZipWithJar(zipPath, distPath)) { + console.warn(`Extracted Electron runtime artifact ${artifactName} with JDK jar.`); + return; + } + + const yauzl = packageRequire("yauzl"); + const extractedEntries = await withEventLoopKeepAlive( + () => extractZip(yauzl, zipPath, distPath), + `extracting Electron runtime artifact ${artifactName}` + ); + console.warn(`Extracted ${extractedEntries} Electron runtime artifact entries with bundled yauzl.`); +} + +function electronArtifactName(targetPlatform) { + return `electron-v${electronPackage.version}-${electronArtifactPlatform(targetPlatform)}-x64.zip`; +} + +function electronArtifactPlatform(targetPlatform) { + if (targetPlatform === "windows_x86_64") { + return "win32"; + } + if (targetPlatform === "linux_x86_64") { + return "linux"; + } + throw new Error(`Unsupported Electron platform for download: ${targetPlatform}`); +} + +function electronArtifactUrl(artifactName) { + const version = String(electronPackage.version); + const baseUrl = ( + process.env.ELECTRON_MIRROR ?? + process.env.npm_config_electron_mirror ?? + process.env.electron_mirror ?? + `https://github.com/electron/electron/releases/download/v${version}/` + ).replace(/\/?$/, "/"); + return `${baseUrl}${artifactName}`; +} + +async function downloadFile(url, destination) { + rmSync(destination, { force: true }); + mkdirSync(dirname(destination), { recursive: true }); + + const tempDestination = `${destination}.tmp-${process.pid}`; + rmSync(tempDestination, { force: true }); + + try { + const response = await openDownloadResponse(url); + await pipeline(response, createWriteStream(tempDestination, { flags: "wx" })); + renameSync(tempDestination, destination); + } catch (error) { + rmSync(tempDestination, { force: true }); + rmSync(destination, { force: true }); + throw error; + } +} + +async function openDownloadResponse(url, redirectCount = 0) { + if (redirectCount > 10) { + throw new Error(`Too many redirects while downloading ${url}`); + } + + const response = await new Promise((resolvePromise, rejectPromise) => { + const client = url.startsWith("http://") ? http : https; + const request = client.get( + url, + { + headers: { + "user-agent": "HiCT-Electron-Payload-Builder", + }, + }, + resolvePromise + ); + request.on("error", rejectPromise); + request.setTimeout(120_000, () => { + request.destroy(new Error(`Timed out while downloading Electron runtime artifact: ${url}`)); + }); + }); + + const statusCode = response.statusCode ?? 0; + if ([301, 302, 303, 307, 308].includes(statusCode)) { + response.resume(); + const location = response.headers.location; + if (!location) { + throw new Error(`Electron download redirect did not include Location header: ${url}`); + } + return openDownloadResponse(new URL(location, url).toString(), redirectCount + 1); + } + + if (statusCode < 200 || statusCode >= 300) { + response.resume(); + throw new Error(`Electron download failed with HTTP ${statusCode}: ${url}`); + } + + return response; +} + +async function withEventLoopKeepAlive(action, description) { + let timeout = null; + // Node 24 exits with code 13 if top-level await is pending with no ref'ed handles. + const keepAlive = setInterval(() => {}, 1_000); + try { + return await Promise.race([ + action(), + new Promise((_, rejectPromise) => { + timeout = setTimeout(() => { + rejectPromise(new Error(`Timed out while ${description}`)); + }, 900_000); + }), + ]); + } finally { + clearInterval(keepAlive); + if (timeout) { + clearTimeout(timeout); + } + } +} + +function extractZipWithJar(zipPath, targetDir) { + for (const jarCommand of resolveJarCommands()) { + const result = spawnSync(jarCommand, ["xf", zipPath], { + cwd: targetDir, + stdio: "inherit", + }); + if (!result.error && result.status === 0) { + return true; + } + if (result.error) { + console.warn(`Could not start ${jarCommand} to extract Electron artifact: ${result.error.message}`); + } else { + console.warn(`${jarCommand} failed to extract Electron artifact with exit code ${result.status}`); + } + } + return false; +} + +function resolveJarCommands() { + const executable = process.platform === "win32" ? "jar.exe" : "jar"; + const commands = []; + if (process.env.JAVA_HOME) { + const javaHomeJar = resolve(process.env.JAVA_HOME, "bin", executable); + if (existsSync(javaHomeJar)) { + commands.push(javaHomeJar); + } + } + commands.push(executable); + return [...new Set(commands)]; +} + +async function extractZip(yauzl, zipPath, targetDir) { + return await new Promise((resolvePromise, rejectPromise) => { + let extractedEntries = 0; + let zipfile = null; + let settled = false; + + const rejectOnce = (error) => { + if (settled) { + return; + } + settled = true; + if (zipfile) { + zipfile.close(); + } + rejectPromise(error); + }; + + yauzl.open(zipPath, { lazyEntries: true }, (openError, openedZipfile) => { + if (openError) { + rejectOnce(openError); + return; + } + + zipfile = openedZipfile; + zipfile.on("error", rejectOnce); + zipfile.on("end", () => { + if (settled) { + return; + } + settled = true; + zipfile.close(); + resolvePromise(extractedEntries); + }); + zipfile.on("entry", (entry) => { + extractZipEntry(zipfile, entry, targetDir) + .then((didExtract) => { + if (didExtract) { + extractedEntries += 1; + } + zipfile.readEntry(); + }) + .catch(rejectOnce); + }); + zipfile.readEntry(); + }); + }); +} + +async function extractZipEntry(zipfile, entry, targetDir) { + const entryName = entry.fileName.replace(/\\/g, "/"); + if (entryName.startsWith("__MACOSX/")) { + return false; + } + + const targetPath = resolveZipEntryPath(targetDir, entryName); + const mode = (entry.externalFileAttributes >>> 16) & 0xffff; + const fileType = mode & 0o170000; + let isDirectory = fileType === 0o040000 || entryName.endsWith("/"); + const isSymlink = fileType === 0o120000; + const madeBy = entry.versionMadeBy >> 8; + if (!isDirectory && madeBy === 0 && entry.externalFileAttributes === 16) { + isDirectory = true; + } + const extractedMode = mode ? mode & 0o777 : isDirectory ? 0o755 : 0o644; + + if (isDirectory) { + mkdirSync(targetPath, { recursive: true, mode: extractedMode }); + return true; + } + + mkdirSync(dirname(targetPath), { recursive: true }); + if (isSymlink) { + const target = await readZipEntryText(zipfile, entry); + symlinkSync(target, targetPath); + return true; + } + + await writeZipEntryFile(zipfile, entry, targetPath, extractedMode); + return true; +} + +function resolveZipEntryPath(targetDir, entryName) { + const targetRoot = resolve(targetDir); + const targetPath = resolve(targetRoot, entryName); + if (targetPath !== targetRoot && !targetPath.startsWith(`${targetRoot}${sep}`)) { + throw new Error(`Electron artifact contains an out-of-bounds zip entry: ${entryName}`); + } + return targetPath; +} + +async function writeZipEntryFile(zipfile, entry, targetPath, mode) { + const readStream = await openZipEntryReadStream(zipfile, entry); + await new Promise((resolvePromise, rejectPromise) => { + let settled = false; + const settle = (error) => { + if (settled) { + return; + } + settled = true; + if (error) { + rejectPromise(error); + } else { + resolvePromise(); + } + }; + + const writeStream = createWriteStream(targetPath, { mode }); + readStream.on("error", settle); + writeStream.on("error", settle); + writeStream.on("finish", () => settle()); + readStream.pipe(writeStream); + }); +} + +async function readZipEntryText(zipfile, entry) { + const readStream = await openZipEntryReadStream(zipfile, entry); + const chunks = []; + await new Promise((resolvePromise, rejectPromise) => { + readStream.on("data", (chunk) => chunks.push(Buffer.from(chunk))); + readStream.on("error", rejectPromise); + readStream.on("end", resolvePromise); + }); + return Buffer.concat(chunks).toString("utf8"); +} + +async function openZipEntryReadStream(zipfile, entry) { + return await new Promise((resolvePromise, rejectPromise) => { + zipfile.openReadStream(entry, (error, readStream) => { + if (error) { + rejectPromise(error); + } else { + resolvePromise(readStream); + } + }); + }); +} + +function findCachedElectronArtifact(cacheRoot, checksumsPath, artifactName) { + if (!existsSync(cacheRoot)) { + return null; + } + + const candidates = listFiles(cacheRoot).filter((filePath) => basename(filePath) === artifactName); + for (const candidate of candidates) { + try { + verifyElectronArtifactChecksum(candidate, checksumsPath, artifactName, { removeOnMismatch: false }); + return candidate; + } catch (error) { + console.warn(`Ignoring cached Electron artifact ${candidate}: ${error.message}`); + } + } + + return null; +} + +function verifyElectronArtifactChecksum(zipPath, checksumsPath, artifactName, { removeOnMismatch = true } = {}) { + if (!existsSync(checksumsPath)) { + console.warn(`Electron checksums file is missing; cannot verify ${artifactName}`); + return; + } + + const checksums = JSON.parse(readFileSync(checksumsPath, "utf8")); + const expected = checksums[artifactName]; + if (!expected) { + console.warn(`Electron checksum is missing for ${artifactName}; cannot verify downloaded artifact.`); + return; + } + + const actual = createHash("sha256").update(readFileSync(zipPath)).digest("hex"); + if (actual !== expected) { + if (removeOnMismatch) { + rmSync(zipPath, { force: true }); + } + throw new Error(`Electron artifact checksum mismatch for ${artifactName}: expected ${expected}, got ${actual}`); + } +} + +function electronPlatformPath(targetPlatform) { + return targetPlatform === "windows_x86_64" ? "electron.exe" : "electron"; +} + +function electronCacheRoot(targetPlatform) { + const cacheRoot = resolve( + process.env.HICT_ELECTRON_CACHE_DIR ?? join(repoDir, "node_modules", ".cache", "hict-electron"), + targetPlatform + ); + mkdirSync(cacheRoot, { recursive: true }); + return cacheRoot; +} + +function shouldCopyElectronRuntimePath(path, keepLocales) { + if (path.includes(`${sep}locales${sep}`)) { + return keepLocales.has(basename(path)); + } + if (path.endsWith(".pdb") || path.endsWith(".dSYM") || path.endsWith(".debug")) { + return false; + } + return true; +} + +function describeDirectory(path) { + if (!existsSync(path)) { + return `${path} does not exist`; + } + return listFiles(path) + .slice(0, 80) + .map((filePath) => filePath.slice(path.length + 1)) + .join(", "); +} + +async function chmodExecutableIfPresent(path) { + if (platform !== "linux_x86_64" || !existsSync(path)) { + return; + } + await chmod(path, 0o755); + for (const helper of ["chrome-sandbox", "chrome_crashpad_handler"]) { + const helperPath = join(dirname(path), helper); + if (existsSync(helperPath)) { + await chmod(helperPath, 0o755); + } + } +} + +async function flipSecurityFuses(executablePath) { + try { + const { flipFuses, FuseVersion, FuseV1Options } = await import("@electron/fuses"); + await flipFuses(executablePath, { + version: FuseVersion.V1, + [FuseV1Options.RunAsNode]: false, + [FuseV1Options.EnableCookieEncryption]: true, + [FuseV1Options.EnableNodeOptionsEnvironmentVariable]: false, + [FuseV1Options.EnableNodeCliInspectArguments]: false, + [FuseV1Options.GrantFileProtocolExtraPrivileges]: false, + }); + } catch (error) { + console.warn(`Could not flip Electron security fuses for ${executablePath}: ${error.message}`); + } +} + +function directorySize(path) { + const stats = statSync(path); + if (stats.isFile()) { + return stats.size; + } + return readdirSync(path) + .map((entry) => directorySize(join(path, entry))) + .reduce((left, right) => left + right, 0); +} + +function sha256OfTree(path) { + const hash = createHash("sha256"); + for (const filePath of listFiles(path).sort()) { + if (basename(filePath) === "manifest.json") { + continue; + } + hash.update(filePath.slice(path.length + 1)); + hash.update("\0"); + hash.update(readFileSync(filePath)); + hash.update("\0"); + } + return hash.digest("hex"); +} + +function listFiles(path) { + const stats = statSync(path); + if (stats.isFile()) { + return [path]; + } + return readdirSync(path).flatMap((entry) => listFiles(join(path, entry))); +} diff --git a/scripts/build-tauri-browser-payload.mjs b/scripts/build-tauri-browser-payload.mjs new file mode 100644 index 0000000..6188aa7 --- /dev/null +++ b/scripts/build-tauri-browser-payload.mjs @@ -0,0 +1,337 @@ +#!/usr/bin/env node +/* + Copyright (c) 2021-2026 Aleksandr Serdiukov, Anton Zamyatin, Aleksandr Sinitsyn, Vitalii Dravgelis and Computer Technologies Laboratory ITMO University team. + + Permission is hereby granted, free of charge, to any person obtaining a copy of + this software and associated documentation files (the "Software"), to deal in + the Software without restriction, including without limitation the rights to + use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + the Software, and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + */ + +import { createHash } from "node:crypto"; +import { spawnSync } from "node:child_process"; +import { chmodSync, cpSync, existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs"; +import { basename, dirname, join, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +const scriptDir = dirname(fileURLToPath(import.meta.url)); +const repoDir = resolve(scriptDir, ".."); +const tauriDir = resolve(repoDir, "src-tauri"); +const tauriConfigPath = resolve(tauriDir, "tauri.conf.json"); +const args = parseArgs(process.argv.slice(2)); +const platform = args.platform ?? detectPlatform(); +const outputDir = resolve(args.output ?? join(repoDir, "..", "HiCT_JVM", "browsers-dist", platform, "tauri")); +const executableName = platform === "windows_x86_64" ? "hict-tauri-browser.exe" : "hict-tauri-browser"; +const cargoTargetDir = process.env.CARGO_TARGET_DIR ? resolve(process.env.CARGO_TARGET_DIR) : resolve(tauriDir, "target"); +const builtExecutable = resolve(cargoTargetDir, "release", executableName); +const generatedIconPngBase64 = [ + "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAD6ElEQVR4nM2WQWhUVxSGv/vuezOTmcnMaMSaEBJFEUQSNKVoceWqs6oLSxcVunDRRTfqypWbum1JQ0u7sIiU0oWkENw0WagFQagBwXRjcROkVtq0kCBhJibvni7ezeS+926SSSi0PwyEe879//+ce+ZM4D+GOjt9vQZI+hRWZv7g9dwiKgrSoTBoy6pZnZ3+NnX+VvNDVBREsmZK7rmsGqLRBqV33siqJHTAp8AoYDaOFXq4jPr1FZjULS1GJsP+8menzl80P/9wE4BT5y8S1ArB2p+ty8B7QNyhKmrC4TIoBZLiCoC5ELgLvA/UN2wLeqiM7i8R/9YC5ZYkg/Ff7Z/EyOzbH30MwNqLZeR1+01ELgMDG7mg+0vooXJWHGAJGA+AKWAyFRJQlZBobA+qkH4ChAExcino0aV4oUW80CLo0SUxcglxxAFVCBKOSuhr/yQwFQArwBfA81TYCOFwGX24mr9s5Jxpx01pxUgrxrTjJkbOZYvQh6tJ+01O/bnVXFkv7wnwDVmpUFE42UBVcxVUMVxRJd2nSroPwxWg6oqrakjhZANCRQZitZ4ABPeb19YDN4HH2dRgf5HoeC09BwAiZ2TNXJA1cwGRM6mYguh4jWB/0df6x1aL+81ruA/8ApggeZI02UidYF+OTGPkKkauAjplel+RaKSeN51wT1gtIPkq4HRhCpjJdkH12nbqDKMwkB08tH22Xu/gzViNjmZmxHkFjAN/Z03oI1XCIe9AbcAI4VAZfcQzuAnnuNXooGPA6cID4PvsbVUMiMYaqB7tI0861aOTnGK2LrCcDzJa6Q7YQAx8BTzLCujBMuHRXh85AOHRXvRg2WfwmeWMXfGcAQdPga9xVup6dnSiQVCP0iICQT0iOtHwMcaW66lPKJfuOPwOeJgKCgR9BaLRzIQriEbrBH0FX/UPLRfZ6r0GHCwAnwPL2UB4rIY+UErEBPSBEuGxmo9j2XIsbCbiNeA4/RG4kwoKqIomGtuTbLlQ2X3vHc47lsNb/aYGHLRIFsfLrInwUIXwoP0cqvjEX9q7ra0ENjXgOH4E3MolRIrC6b0UTu+FKL/y7J1HGa4cvDddnJ2+DnCQpJ0j3tv56n8B3gXmtxKH7Z9gHfPAl8Bq6lS84qs2d74b4m0NOBXcBu51wXnP5m7Z+q4NOFgk+UotbZGzZHMWuyXtyoBTyV1sdZvgts3pqvquDTjY6n3n8c3Jv2XAqWgOuEHu14AbNtZ19TsykCG+Bcw6oVl7tiPxHRtw8DvJlmvbz4Q92zG2XUQ+2OVUYeMflw+A5Z1WDxDuxoDFMvCJ8/eusKsOQKcLHeym+v8F/gEnK0D2mS+qQgAAAABJRU5ErkJggg==" +].join(""); + +if (!["linux_x86_64", "windows_x86_64"].includes(platform)) { + throw new Error(`Unsupported Tauri browser payload platform: ${platform}`); +} +if (!existsSync(resolve(repoDir, "dist", "index.html"))) { + throw new Error("HiCT_WebUI dist/index.html was not found. Run npm run build first."); +} +ensureTauriConventionalIcons(); +validateTauriIconConfig(platform); +validateTauriCapabilities(); +if (!args.skipBuild) { + run("cargo", ["build", "--release", "--locked", "--manifest-path", resolve(tauriDir, "Cargo.toml")], repoDir); +} +if (!existsSync(builtExecutable)) { + throw new Error(`Tauri browser executable was not found at ${builtExecutable}`); +} + +rmSync(outputDir, { recursive: true, force: true }); +mkdirSync(join(outputDir, "bin"), { recursive: true }); +mkdirSync(join(outputDir, "licenses"), { recursive: true }); + +const command = platform === "windows_x86_64" ? "bin/hict-tauri-browser.exe" : "bin/hict-tauri-browser"; +cpSync(builtExecutable, join(outputDir, command)); +if (platform === "linux_x86_64") { + chmodExecutable(join(outputDir, command)); +} + +writeFileSync( + join(outputDir, "licenses", "TAURI_BROWSER_NOTICE.txt"), + [ + "HiCT Tauri browser payload", + "===========================", + "", + "This payload contains a small Rust/Tauri wrapper written by the HiCT team.", + "It does not bundle Chromium. It uses the operating system WebView runtime:", + "Microsoft Edge WebView2 on Windows and WebKitGTK on Linux.", + "", + "Tauri, WRY, TAO and their Rust dependencies are redistributed as compiled", + "Rust code under their upstream licenses. See cargo-metadata.json for the", + "exact dependency names, versions, license strings and repositories captured", + "from the build graph.", + "" + ].join("\n"), + "utf8" +); +writeFileSync(join(outputDir, "licenses", "cargo-metadata.json"), cargoMetadata(), "utf8"); + +const manifest = { + name: "HiCT Tauri WebView", + engine: "tauri-system-webview", + priority: 10, + command, + arguments: [], + license: "HiCT MIT; Tauri stack MIT/Apache-2.0 and dependency-specific licenses; system WebView runtime under OS/vendor terms", + notices: [ + "licenses/TAURI_BROWSER_NOTICE.txt", + "licenses/cargo-metadata.json" + ], + runtimeRequirements: { + linux: { + libraries: [ + "libwebkit2gtk-4.1.so.0", + "libjavascriptcoregtk-4.1.so.0", + "libgtk-3.so.0" + ], + installHints: { + "Debian/Ubuntu": "sudo apt-get install libwebkit2gtk-4.1-0 libjavascriptcoregtk-4.1-0 libgtk-3-0", + "Fedora/RHEL": "sudo dnf install webkit2gtk4.1 gtk3", + "Arch Linux": "sudo pacman -S webkit2gtk-4.1 gtk3", + "openSUSE": "sudo zypper install libwebkit2gtk-4_1-0 gtk3" + } + }, + windows: { + runtime: "Microsoft Edge WebView2 Runtime", + detection: "EdgeUpdate Clients {F3017226-FE2A-4295-8BDF-00C3A9A7E4C5} pv registry value or standard Microsoft/EdgeWebView installation directory" + } + }, + sizeBytes: directorySize(outputDir), + sha256: sha256OfTree(outputDir) +}; +writeFileSync(join(outputDir, "manifest.json"), `${JSON.stringify(manifest, null, 2)}\n`, "utf8"); + +console.log(`Prepared HiCT Tauri browser payload for ${platform}`); +console.log(` output: ${outputDir}`); +console.log(` size: ${(manifest.sizeBytes / (1024 * 1024)).toFixed(1)} MiB`); + +function parseArgs(argv) { + const parsed = {}; + for (let i = 0; i < argv.length; i++) { + const arg = argv[i]; + if (arg === "--platform") { + parsed.platform = argv[++i]; + } else if (arg.startsWith("--platform=")) { + parsed.platform = arg.slice("--platform=".length); + } else if (arg === "--output") { + parsed.output = argv[++i]; + } else if (arg.startsWith("--output=")) { + parsed.output = arg.slice("--output=".length); + } else if (arg === "--skip-build") { + parsed.skipBuild = true; + } else { + throw new Error(`Unknown argument: ${arg}`); + } + } + return parsed; +} + +function detectPlatform() { + if (process.platform === "win32") { + return "windows_x86_64"; + } + if (process.platform === "linux") { + return "linux_x86_64"; + } + throw new Error(`Unsupported platform for HiCT Tauri browser payload: ${process.platform}`); +} + +function run(command, commandArgs, cwd) { + const result = spawnSync(command, commandArgs, { cwd, stdio: "inherit" }); + if (result.error) { + throw result.error; + } + if (result.status !== 0) { + throw new Error(`${command} ${commandArgs.join(" ")} failed with exit code ${result.status}`); + } +} + +function ensureTauriConventionalIcons() { + const iconsDir = resolve(tauriDir, "icons"); + const pngPath = resolve(iconsDir, "icon.png"); + const icoPath = resolve(iconsDir, "icon.ico"); + const faviconPath = resolve(repoDir, "public", "favicon.ico"); + const pngBuffer = Buffer.from(generatedIconPngBase64, "base64"); + + mkdirSync(iconsDir, { recursive: true }); + writeFileSync(pngPath, pngBuffer); + if (existsSync(faviconPath)) { + cpSync(faviconPath, icoPath); + } else { + writeFileSync(icoPath, icoBufferFromPng(pngBuffer)); + } +} + +function icoBufferFromPng(pngBuffer) { + const header = Buffer.alloc(22); + header.writeUInt16LE(0, 0); + header.writeUInt16LE(1, 2); + header.writeUInt16LE(1, 4); + header.writeUInt8(32, 6); + header.writeUInt8(32, 7); + header.writeUInt8(0, 8); + header.writeUInt8(0, 9); + header.writeUInt16LE(1, 10); + header.writeUInt16LE(32, 12); + header.writeUInt32LE(pngBuffer.length, 14); + header.writeUInt32LE(header.length, 18); + return Buffer.concat([header, pngBuffer]); +} + +function validateTauriIconConfig(currentPlatform) { + const config = JSON.parse(readFileSync(tauriConfigPath, "utf8")); + const icons = config.bundle?.icon ?? []; + if (!Array.isArray(icons) || icons.length === 0) { + throw new Error("src-tauri/tauri.conf.json must define bundle.icon; Windows Tauri builds require an .ico resource."); + } + const resolvedIcons = icons.map((icon) => resolve(tauriDir, icon)); + const missingIcons = resolvedIcons.filter((iconPath) => !existsSync(iconPath)); + if (missingIcons.length > 0) { + throw new Error(`Tauri icon file(s) do not exist: ${missingIcons.join(", ")}`); + } + if (currentPlatform === "windows_x86_64" && !resolvedIcons.some((iconPath) => iconPath.toLowerCase().endsWith(".ico"))) { + throw new Error("Windows Tauri payload builds require at least one .ico path in bundle.icon."); + } +} + +function validateTauriCapabilities() { + const capabilitiesDir = resolve(tauriDir, "capabilities"); + if (!existsSync(capabilitiesDir)) { + return; + } + + for (const entry of readdirSync(capabilitiesDir)) { + if (!entry.endsWith(".json")) { + continue; + } + const capabilityPath = resolve(capabilitiesDir, entry); + const capability = JSON.parse(readFileSync(capabilityPath, "utf8")); + validateTauriPermissionIdentifiers(capabilityPath, capability.permissions ?? []); + validateTauriRemoteUrlPatterns(capabilityPath, capability.remote?.urls ?? []); + } +} + +function validateTauriPermissionIdentifiers(capabilityPath, permissions) { + if (!Array.isArray(permissions)) { + throw new Error(`${capabilityPath}: permissions must be an array.`); + } + + const identifierPattern = /^(?:[a-z][a-z0-9]*(?:-[a-z0-9]+)*:)?[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/; + for (const permission of permissions) { + if (typeof permission === "string") { + if (!identifierPattern.test(permission)) { + throw new Error( + `${capabilityPath}: invalid Tauri permission identifier '${permission}'. ` + + "Use lowercase kebab-case, for example 'allow-quit-app'." + ); + } + } else if (permission && typeof permission === "object" && typeof permission.identifier === "string") { + if (!identifierPattern.test(permission.identifier)) { + throw new Error( + `${capabilityPath}: invalid Tauri permission identifier '${permission.identifier}'. ` + + "Use lowercase kebab-case, for example 'allow-quit-app'." + ); + } + } else { + throw new Error(`${capabilityPath}: unsupported Tauri permission entry: ${JSON.stringify(permission)}`); + } + } +} + +function validateTauriRemoteUrlPatterns(capabilityPath, urls) { + if (!Array.isArray(urls)) { + throw new Error(`${capabilityPath}: remote.urls must be an array.`); + } + + for (const url of urls) { + if (typeof url !== "string") { + throw new Error(`${capabilityPath}: remote URL patterns must be strings.`); + } + if (/\[[^\]]+\]/.test(url)) { + throw new Error( + `${capabilityPath}: Tauri's URLPattern parser rejects bracketed IPv6 remote URL patterns ('${url}'). ` + + "Use 'http://localhost:*' and 'http://127.0.0.1:*' for the bundled HiCT WebUI." + ); + } + } +} + +function cargoMetadata() { + const result = spawnSync("cargo", ["metadata", "--locked", "--format-version", "1", "--manifest-path", resolve(tauriDir, "Cargo.toml")], { + cwd: repoDir, + encoding: "utf8" + }); + if (result.error || result.status !== 0) { + return JSON.stringify({ + error: result.error?.message ?? result.stderr ?? "cargo metadata failed" + }, null, 2); + } + const metadata = JSON.parse(result.stdout); + const packages = metadata.packages + .map((pkg) => ({ + name: pkg.name, + version: pkg.version, + license: pkg.license, + repository: pkg.repository + })) + .sort((left, right) => `${left.name}@${left.version}`.localeCompare(`${right.name}@${right.version}`)); + return `${JSON.stringify({ packages }, null, 2)}\n`; +} + +function chmodExecutable(path) { + const mode = statSync(path).mode; + chmodSync(path, mode | 0o755); +} + +function directorySize(path) { + const stats = statSync(path); + if (stats.isFile()) { + return stats.size; + } + return readdirSync(path) + .map((entry) => directorySize(join(path, entry))) + .reduce((left, right) => left + right, 0); +} + +function sha256OfTree(path) { + const hash = createHash("sha256"); + for (const filePath of listFiles(path).sort()) { + if (basename(filePath) === "manifest.json") { + continue; + } + hash.update(filePath.slice(path.length + 1)); + hash.update("\0"); + hash.update(readFileSync(filePath)); + hash.update("\0"); + } + return hash.digest("hex"); +} + +function listFiles(path) { + const stats = statSync(path); + if (stats.isFile()) { + return [path]; + } + return readdirSync(path).flatMap((entry) => listFiles(join(path, entry))); +} diff --git a/scripts/check-api-dto-regressions.mjs b/scripts/check-api-dto-regressions.mjs new file mode 100644 index 0000000..c664d79 --- /dev/null +++ b/scripts/check-api-dto-regressions.mjs @@ -0,0 +1,60 @@ +import { readFileSync } from "node:fs"; +import { fileURLToPath } from "node:url"; +import { resolve } from "node:path"; + +const projectRoot = resolve(fileURLToPath(new URL("..", import.meta.url))); +const requestSource = readFileSync( + resolve(projectRoot, "src/app/core/net/api/request.ts"), + "utf8" +); +const requestDtoSource = readFileSync( + resolve(projectRoot, "src/app/core/net/dto/requestDTO.ts"), + "utf8" +); + +const requiredMappings = [ + { + className: "ListConvertibleMatrixFilesRequest", + dtoName: "ListConvertibleMatrixFilesRequestDTO", + requestPath: "/list_convertible_matrices", + }, +]; + +const failures = []; + +for (const mapping of requiredMappings) { + if (!requestSource.includes(`class ${mapping.className}`)) { + failures.push(`Missing request class ${mapping.className}`); + } + if (!requestSource.includes(`requestPath = "${mapping.requestPath}"`)) { + failures.push( + `${mapping.className} does not declare requestPath ${mapping.requestPath}` + ); + } + if (!requestDtoSource.includes(`class ${mapping.dtoName}`)) { + failures.push(`Missing DTO class ${mapping.dtoName}`); + } + if (!requestDtoSource.includes(`instanceof ${mapping.className}`)) { + failures.push(`Missing instanceof DTO mapping for ${mapping.className}`); + } + if (!requestDtoSource.includes(`case "${mapping.requestPath}"`)) { + failures.push(`Missing requestPath DTO fallback for ${mapping.requestPath}`); + } +} + +if (!requestDtoSource.includes(`class EmptyRequestDTO`)) { + failures.push("Missing empty-request DTO fallback for payload-free requests"); +} +if (!requestDtoSource.includes(`"options" in entity`)) { + failures.push("Missing path-based empty-request fallback guard"); +} + +if (failures.length > 0) { + console.error("API DTO regression check failed:"); + for (const failure of failures) { + console.error(`- ${failure}`); + } + process.exit(1); +} + +console.log("API DTO regression check passed."); diff --git a/scripts/check-map-resolution-model.mjs b/scripts/check-map-resolution-model.mjs new file mode 100644 index 0000000..68dcf53 --- /dev/null +++ b/scripts/check-map-resolution-model.mjs @@ -0,0 +1,328 @@ +import assert from "node:assert/strict"; +import fs from "node:fs"; +import { createRequire } from "node:module"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import vm from "node:vm"; +import ts from "typescript"; + +const repoRoot = path.resolve(fileURLToPath(new URL("..", import.meta.url))); +const require = createRequire(import.meta.url); +const sourcePath = path.join( + repoRoot, + "src/app/core/mapmanagers/resolutionModel.ts" +); +const source = fs.readFileSync(sourcePath, "utf8"); +const compiled = ts.transpileModule(source, { + compilerOptions: { + module: ts.ModuleKind.CommonJS, + target: ts.ScriptTarget.ES2020, + }, + fileName: sourcePath, +}).outputText; + +const sandbox = { + exports: {}, + module: { exports: {} }, + require, +}; +sandbox.exports = sandbox.module.exports; +vm.runInNewContext(compiled, sandbox, { filename: sourcePath }); + +const { + buildSourceResolutionDescriptorSet, + calculateMaximumScaledImageSize, + getFinestVisibleResolutionDescriptor, + getNavigationResolutionModel, + getResolutionDescriptorForViewResolution, + getVectorResolutionTuples, +} = sandbox.module.exports; + +function assertResolutionDescriptor(set, viewResolution, expectedBpResolution, message) { + assert.equal( + getResolutionDescriptorForViewResolution(set, viewResolution).bpResolution, + expectedBpResolution, + message + ); +} + +function assertContiguousVisibility(set) { + const tuples = [...set.resolutionTuples].sort( + (a, b) => + a.layerResolutionBorders.minResolutionInclusive - + b.layerResolutionBorders.minResolutionInclusive + ); + assert.equal( + tuples[0].layerResolutionBorders.minResolutionInclusive, + Number.NEGATIVE_INFINITY, + `${set.sourceName} finest layer must be visible during overzoom` + ); + assert.equal( + tuples[tuples.length - 1].layerResolutionBorders.maxResolutionExclusive, + Number.POSITIVE_INFINITY, + `${set.sourceName} coarsest layer must cover far zoom` + ); + for (let i = 1; i < tuples.length; i += 1) { + assert.equal( + tuples[i - 1].layerResolutionBorders.maxResolutionExclusive, + tuples[i].layerResolutionBorders.minResolutionInclusive, + `${set.sourceName} layer visibility intervals must not have gaps` + ); + } +} + +function assertNavigationModel(primarySet, secondarySet, expected) { + const navigationModel = getNavigationResolutionModel(primarySet, secondarySet); + assert.deepEqual( + { + resolutions: [...navigationModel.resolutions], + pixelResolutionSet: [...navigationModel.pixelResolutionSet], + }, + expected + ); +} + +function assertVectorTuples(primarySet, secondarySet, expected, message) { + assert.deepEqual( + JSON.parse( + JSON.stringify( + getVectorResolutionTuples(primarySet, secondarySet).map((descriptor) => [ + descriptor.bpResolution, + descriptor.pixelResolution, + ]) + ) + ), + expected, + message + ); +} + +function assertGuidanceDescriptor( + primarySet, + secondarySet, + viewResolution, + expectedSourceName, + expectedBpResolution, + message +) { + const descriptor = getFinestVisibleResolutionDescriptor( + primarySet, + secondarySet, + viewResolution + ); + assert.deepEqual( + [descriptor.sourceName, descriptor.bpResolution], + [expectedSourceName, expectedBpResolution], + message + ); +} + +const primaryCoarse = buildSourceResolutionDescriptorSet( + "PRIMARY", + [1000, 5000, 10000], + [300000, 60000, 30000], + 250 +); +const secondaryFine = buildSourceResolutionDescriptorSet( + "SECONDARY", + [250, 500, 1000, 2500, 5000, 10000, 20000], + [1200000, 600000, 300000, 120000, 60000, 30000, 15000], + 250 +); + +assertContiguousVisibility(primaryCoarse); +assertContiguousVisibility(secondaryFine); + +assert.deepEqual(primaryCoarse.pixelResolutionSet, [4, 20, 40]); +assert.deepEqual(secondaryFine.pixelResolutionSet, [1, 2, 4, 10, 20, 40, 80]); + +assertResolutionDescriptor( + primaryCoarse, + 0.5, + 1000, + "primary source should overzoom its finest available 1:1000 layer" +); +assertResolutionDescriptor( + secondaryFine, + 0.5, + 250, + "secondary source should overzoom its finest available 1:250 layer" +); +assertResolutionDescriptor( + primaryCoarse, + 3.9, + 1000, + "primary source should remain at 1:1000 until its own next threshold" +); +assertResolutionDescriptor( + secondaryFine, + 3.9, + 500, + "secondary source should independently use 1:500 at the same view resolution" +); +assertGuidanceDescriptor( + primaryCoarse, + secondaryFine, + 0.5, + "SECONDARY", + 250, + "guidance must use secondary when secondary is the finest visible source" +); +assertGuidanceDescriptor( + primaryCoarse, + secondaryFine, + 3.9, + "SECONDARY", + 500, + "guidance must use secondary-specific prefix sums through secondary-only zoom levels" +); +assertResolutionDescriptor(primaryCoarse, 30, 5000); +assertResolutionDescriptor(secondaryFine, 30, 5000); +assertGuidanceDescriptor( + primaryCoarse, + secondaryFine, + 30, + "PRIMARY", + 5000, + "guidance should be stable when both sources expose the same visible pixel resolution" +); +assertResolutionDescriptor(primaryCoarse, 120, 10000); +assertResolutionDescriptor(secondaryFine, 120, 20000); + +assertNavigationModel( + primaryCoarse, + secondaryFine, + { + resolutions: [250, 500, 1000, 2500, 5000, 10000, 20000], + pixelResolutionSet: [1, 2, 4, 10, 20, 40, 80], + } +); + +assertVectorTuples( + primaryCoarse, + secondaryFine, + [ + [1000, 4], + [5000, 20], + [10000, 40], + ], + "vector layers must use the primary assembly resolutions, not secondary-only tile resolutions" +); + +assert.equal( + calculateMaximumScaledImageSize(primaryCoarse, secondaryFine), + 1200000, + "projection extent must cover the largest scaled source pyramid" +); + +const primaryFine = buildSourceResolutionDescriptorSet( + "PRIMARY", + [250, 500, 1000, 2000], + [1200000, 600000, 300000, 150000], + 250 +); +const secondaryCoarse = buildSourceResolutionDescriptorSet( + "SECONDARY", + [1000, 5000, 10000], + [300000, 60000, 30000], + 250 +); + +assertContiguousVisibility(primaryFine); +assertContiguousVisibility(secondaryCoarse); +assertResolutionDescriptor( + primaryFine, + 0.5, + 250, + "primary source may also be the finer source and must overzoom independently" +); +assertResolutionDescriptor( + secondaryCoarse, + 0.5, + 1000, + "secondary source may be coarser and must not pretend to have primary pixels" +); +assertGuidanceDescriptor( + primaryFine, + secondaryCoarse, + 0.5, + "PRIMARY", + 250, + "guidance must also work when primary is the finer source" +); +assertResolutionDescriptor(primaryFine, 3.9, 500); +assertResolutionDescriptor(secondaryCoarse, 3.9, 1000); +assertGuidanceDescriptor( + primaryFine, + secondaryCoarse, + 3.9, + "PRIMARY", + 500, + "primary-only fine zoom levels must remain valid guidance layers" +); +assertNavigationModel(primaryFine, secondaryCoarse, { + resolutions: [250, 500, 1000, 2000, 5000, 10000], + pixelResolutionSet: [1, 2, 4, 8, 20, 40], +}); + +const primaryNonDivisible = buildSourceResolutionDescriptorSet( + "PRIMARY", + [750, 3000, 9000], + [900000, 225000, 75000], + 250 +); +const secondaryNonDivisible = buildSourceResolutionDescriptorSet( + "SECONDARY", + [1000, 2500, 7000], + [675000, 270000, 96429], + 250 +); + +assertContiguousVisibility(primaryNonDivisible); +assertContiguousVisibility(secondaryNonDivisible); +assertResolutionDescriptor(primaryNonDivisible, 2.9, 750); +assertResolutionDescriptor(secondaryNonDivisible, 2.9, 1000); +assertResolutionDescriptor(primaryNonDivisible, 13, 3000); +assertResolutionDescriptor(secondaryNonDivisible, 13, 2500); +assertNavigationModel(primaryNonDivisible, secondaryNonDivisible, { + resolutions: [750, 1000, 2500, 3000, 7000, 9000], + pixelResolutionSet: [3, 4, 10, 12, 28, 36], +}); +assertVectorTuples( + primaryNonDivisible, + secondaryNonDivisible, + [ + [750, 3], + [3000, 12], + [9000, 36], + ], + "vector layers must remain stable on primary assembly resolutions when source resolutions are not multiples" +); + +const equalPrimary = buildSourceResolutionDescriptorSet( + "PRIMARY", + [1000, 5000, 10000], + [300000, 60000, 30000], + 1000 +); +const equalSecondary = buildSourceResolutionDescriptorSet( + "SECONDARY", + [1000, 5000, 10000], + [300000, 60000, 30000], + 1000 +); +assertContiguousVisibility(equalPrimary); +assertContiguousVisibility(equalSecondary); +assertResolutionDescriptor(equalPrimary, 0.25, 1000); +assertResolutionDescriptor(equalSecondary, 0.25, 1000); +assertNavigationModel(equalPrimary, equalSecondary, { + resolutions: [1000, 5000, 10000], + pixelResolutionSet: [1, 5, 10], +}); +assert.equal( + calculateMaximumScaledImageSize(equalPrimary, equalSecondary), + 300000, + "equal-pyramid overlay must keep the original edge-tile extent" +); + +console.log("Map resolution model regression check passed."); diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock new file mode 100644 index 0000000..5ea4440 --- /dev/null +++ b/src-tauri/Cargo.lock @@ -0,0 +1,4568 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "atk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" +dependencies = [ + "serde_core", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[package]] +name = "brotli" +version = "8.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +dependencies = [ + "serde", +] + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.11.1", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror 1.0.69", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.18", +] + +[[package]] +name = "cargo_toml" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" +dependencies = [ + "serde", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "cc" +version = "1.2.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "chrono" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link 0.2.1", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "time", + "version_check", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" +dependencies = [ + "bitflags 2.11.1", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.11.1", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf", + "smallvec", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ctor" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "352d39c2f7bef1d6ad73db6f5160efcaed66d94ef8c6c573a8410c00bf909a98" +dependencies = [ + "ctor-proc-macro", + "dtor", +] + +[[package]] +name = "ctor-proc-macro" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52560adf09603e58c9a7ee1fe1dcb95a16927b17c127f0ac02d6e768a0e25bc1" + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dbus" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b942602992bb7acfd1f51c49811c58a610ef9181b6e66f3e519d79b540a3bf73" +dependencies = [ + "libc", + "libdbus-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "powerfmt", + "serde_core", +] + +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.117", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.11.1", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dlopen2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dom_query" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521e380c0c8afb8d9a1e83a1822ee03556fc3e3e7dbc1fd30be14e37f9cb3f89" +dependencies = [ + "bit-set", + "cssparser", + "foldhash 0.2.0", + "html5ever", + "precomputed-hash", + "selectors", + "tendril", +] + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +dependencies = [ + "serde", +] + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dtor" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1057d6c64987086ff8ed0fd3fbf377a6b7d205cc7715868cd401705f715cbe4" +dependencies = [ + "dtor-proc-macro", +] + +[[package]] +name = "dtor-proc-macro" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f678cf4a922c215c63e0de95eb1ff08a958a81d47e485cf9da1e27bf6305cfa5" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "embed-resource" +version = "3.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31a88c8d26de40ed18fe748c547845aa39de1db3afd958f8cb91579f3644bcb" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 1.1.2+spec-1.1.0", + "vswhom", + "winreg", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "fastrand" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "gdk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", +] + +[[package]] +name = "gdkx11-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps", + "x11", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "wasip2", + "wasip3", +] + +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.11.1", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.2", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hict-tauri-browser" +version = "0.1.1" +dependencies = [ + "tauri", + "tauri-build", + "url", +] + +[[package]] +name = "html5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2" +dependencies = [ + "log", + "markup5ever", +] + +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ico" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371" +dependencies = [ + "byteorder", + "png 0.17.16", +] + +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "infer" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" +dependencies = [ + "cfb", +] + +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "javascriptcore-rs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "js-sys" +version = "0.3.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08" +dependencies = [ + "cfg-if", + "futures-util", + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "jsonptr" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.11.1", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "libappindicator" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading", + "once_cell", +] + +[[package]] +name = "libc" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "libdbus-sys" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "328c4789d42200f1eeec05bd86c9c13c7f091d2ba9a6ea35acdf51f31bc0f043" +dependencies = [ + "pkg-config", +] + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libredox" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" +dependencies = [ + "libc", +] + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "markup5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983d30f2915feeaaab2d6babdd6bc7e9ed1a00b66b5e6d74df19aa9c0e91862" +dependencies = [ + "log", + "tendril", + "web_atoms", +] + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "muda" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47a2e3dff89cd322c66647942668faee0a2b1f88ea6cbb4d374b4a8d7e92528c" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "once_cell", + "png 0.18.1", + "serde", + "thiserror 2.0.18", + "windows-sys 0.61.2", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.11.1", + "jni-sys 0.3.1", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", + "objc2-exception-helper", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.11.1", + "block2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.11.1", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.11.1", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.11.1", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-location" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.11.1", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-exception-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" +dependencies = [ + "cc", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.11.1", + "block2", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.11.1", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.11.1", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.11.1", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-location", + "objc2-core-text", + "objc2-foundation", + "objc2-quartz-core", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-web-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" +dependencies = [ + "bitflags 2.11.1", + "block2", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link 0.2.1", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros", + "phf_shared", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "plist" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "092791278e026273c1b65bbdcfbba3a300f2994c896bd01ab01da613c29c46f1" +dependencies = [ + "base64 0.22.1", + "indexmap 2.14.0", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags 2.11.1", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.117", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit 0.25.11+spec-1.1.0", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.39.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.11.1", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.18", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + +[[package]] +name = "reqwest" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62e0021ea2c22aed41653bc7e1419abb2c97e038ff2c33d0e1309e49a97deec0" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "sync_wrapper", + "tokio", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "rustc-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", + "uuid", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.117", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "selectors" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c" +dependencies = [ + "bitflags 2.11.1", + "cssparser", + "derive_more", + "log", + "new_debug_unreachable", + "phf", + "phf_codegen", + "precomputed-hash", + "rustc-hash", + "servo_arc", + "smallvec", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_with" +version = "3.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e72c1c2cb7b223fafb600a619537a871c2818583d619401b785e7c0b746ccde2" +dependencies = [ + "base64 0.22.1", + "bs58", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.14.0", + "schemars 0.9.0", + "schemars 1.2.1", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b90c488738ecb4fb0262f41f43bc40efc5868d9fb744319ddf5f5317f417bfac" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "servo_arc" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "simd-adler32" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "softbuffer" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +dependencies = [ + "bytemuck", + "js-sys", + "ndk", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall", + "tracing", + "wasm-bindgen", + "web-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "soup3" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "string_cache" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared", + "precomputed-hash", +] + +[[package]] +name = "string_cache_codegen" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "swift-rs" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml 0.8.2", + "version-compare", +] + +[[package]] +name = "tao" +version = "0.35.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33f7f9e486ade65fcf1e45c440f9236c904f5c1002cdc7fc6ae582777345ce4" +dependencies = [ + "bitflags 2.11.1", + "block2", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dbus", + "dispatch2", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "jni", + "libc", + "log", + "ndk", + "ndk-sys", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "once_cell", + "parking_lot", + "percent-encoding", + "raw-window-handle", + "tao-macros", + "unicode-segmentation", + "url", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tauri" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "437404997acf375d85f1177afa7e11bb971f274ed6a7b83a2a3e339015f4cc28" +dependencies = [ + "anyhow", + "bytes", + "cookie", + "dirs", + "dunce", + "embed_plist", + "getrandom 0.3.4", + "glob", + "gtk", + "heck 0.5.0", + "http", + "jni", + "libc", + "log", + "mime", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "percent-encoding", + "plist", + "raw-window-handle", + "reqwest", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror 2.0.18", + "tokio", + "tray-icon", + "url", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows", +] + +[[package]] +name = "tauri-build" +version = "2.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa1f9055fc23919a54e4e125052bed16ed04aef0487086e758fe01a67b451c7" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs", + "glob", + "heck 0.5.0", + "json-patch", + "schemars 0.8.22", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a0319528a025a38c4078e7dae2c446f4e63620ddb0659a643ede1cb38f90e9" +dependencies = [ + "base64 0.22.1", + "brotli", + "ico", + "json-patch", + "plist", + "png 0.17.16", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "syn 2.0.117", + "tauri-utils", + "thiserror 2.0.18", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae6cb4e3896c21d2f6da5b31251d2faea0153bba56ed0e970f918115dbee4924" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-runtime" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48222d7116c8807eaa6fe2f372e023fae125084e61e6eca6d70b7961cdf129ef" +dependencies = [ + "cookie", + "dpi", + "gtk", + "http", + "jni", + "objc2", + "objc2-ui-kit", + "objc2-web-kit", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror 2.0.18", + "url", + "webkit2gtk", + "webview2-com", + "windows", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b83849ee63ecb27a8e8d0fe51915ca215076914aca43f96db1179f0f415f6cd9" +dependencies = [ + "gtk", + "http", + "jni", + "log", + "objc2", + "objc2-app-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "softbuffer", + "tao", + "tauri-runtime", + "tauri-utils", + "url", + "webkit2gtk", + "webview2-com", + "windows", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "092379df9a707631978e6c56b1bc2401d387f01e2d4a3c123360d167bbb9aa95" +dependencies = [ + "anyhow", + "brotli", + "cargo_metadata", + "ctor", + "dom_query", + "dunce", + "glob", + "http", + "infer", + "json-patch", + "log", + "memchr", + "phf", + "plist", + "proc-macro2", + "quote", + "regex", + "schemars 0.8.22", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror 2.0.18", + "toml 1.1.2+spec-1.1.0", + "url", + "urlpattern", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc65d45c68858bfe420dd29e834b5d15dbecf8a07a8a16cf4d532c7b1f69d4b6" +dependencies = [ + "dunce", + "embed-resource", + "toml 1.1.2+spec-1.1.0", +] + +[[package]] +name = "tendril" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4790fc369d5a530f4b544b094e31388b9b3a37c0f4652ade4505945f5660d24" +dependencies = [ + "new_debug_unreachable", + "utf-8", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "time" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "time-macros" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "toml" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap 2.14.0", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" +dependencies = [ + "indexmap 2.14.0", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.3", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.14.0", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.14.0", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.25.11+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" +dependencies = [ + "indexmap 2.14.0", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "winnow 1.0.3", +] + +[[package]] +name = "toml_parser" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +dependencies = [ + "winnow 1.0.3", +] + +[[package]] +name = "toml_writer" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags 2.11.1", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tray-icon" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15edbb0d80583e85ee8df283410038e17314df5cba30da2087a54a85216c0773" +dependencies = [ + "crossbeam-channel", + "dirs", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "once_cell", + "png 0.18.1", + "serde", + "thiserror 2.0.18", + "windows-sys 0.61.2", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-segmentation" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "urlpattern" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "url", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" +dependencies = [ + "getrandom 0.4.2", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "version-compare" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.3+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +dependencies = [ + "wit-bindgen 0.57.1", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen 0.51.0", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49ace1d07c165b0864824eee619580c4689389afa9dc9ed3a4c75040d82e6790" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96492d0d3ffba25305a7dc88720d250b1401d7edca02cc3bcd50633b424673b8" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e68e6f4afd367a562002c05637acb8578ff2dea1943df76afb9e83d177c8578" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95a9ec35c64b2a7cb35d3fead40c4238d0940c86d107136999567a4703259f2" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.117", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4e0100b01e9f0d03189a92b96772a1fb998639d981193d7dbab487302513441" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap 2.14.0", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.1", + "hashbrown 0.15.5", + "indexmap 2.14.0", + "semver", +] + +[[package]] +name = "web-sys" +version = "0.3.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b572dff8bcf38bad0fa19729c89bb5748b2b9b1d8be70cf90df697e3a8f32aa" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web_atoms" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7cff6eef815df1834fd250e3a2ff436044d82a9f1bc1980ca1dbdf07effc538" +dependencies = [ + "phf", + "phf_codegen", + "string_cache", + "string_cache_codegen", +] + +[[package]] +name = "webkit2gtk" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup3", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pkg-config", + "soup3-sys", + "system-deps", +] + +[[package]] +name = "webview2-com" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows", + "windows-core 0.61.2", + "windows-implement", + "windows-interface", +] + +[[package]] +name = "webview2-com-macros" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "webview2-com-sys" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" +dependencies = [ + "thiserror 2.0.18", + "windows", + "windows-core 0.61.2", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "window-vibrancy" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" +dependencies = [ + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "raw-window-handle", + "windows-sys 0.59.0", + "windows-version", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-version" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" + +[[package]] +name = "winnow" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.55.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" +dependencies = [ + "cfg-if", + "windows-sys 0.59.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck 0.5.0", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap 2.14.0", + "prettyplease", + "syn 2.0.117", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.117", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.11.1", + "indexmap 2.14.0", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.14.0", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "wry" +version = "0.55.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186f9871daa55fd9c016578b810d149de58367113db7fb72b462d2323ce19514" +dependencies = [ + "base64 0.22.1", + "block2", + "cookie", + "crossbeam-channel", + "dirs", + "dom_query", + "dpi", + "dunce", + "gdkx11", + "gtk", + "http", + "javascriptcore-rs", + "jni", + "libc", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "sha2", + "soup3", + "tao-macros", + "thiserror 2.0.18", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "yoke" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml new file mode 100644 index 0000000..bd883ae --- /dev/null +++ b/src-tauri/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "hict-tauri-browser" +version = "0.1.1" +description = "Small Tauri WebView wrapper for the local HiCT WebUI" +authors = ["Computer Technologies Laboratory ITMO University team"] +license = "MIT" +repository = "https://github.com/ctlab/HiCT_WebUI" +edition = "2021" +rust-version = "1.77" + +[build-dependencies] +tauri-build = { version = "2", features = [] } + +[dependencies] +tauri = { version = "2", features = [] } +url = "2" diff --git a/src-tauri/build.rs b/src-tauri/build.rs new file mode 100644 index 0000000..50e3143 --- /dev/null +++ b/src-tauri/build.rs @@ -0,0 +1,10 @@ +fn main() { + tauri_build::try_build( + tauri_build::Attributes::new() + .app_manifest(tauri_build::AppManifest::new().commands(&[ + "quit_app", + "save_export", + ])), + ) + .expect("failed to build HiCT Tauri browser metadata"); +} diff --git a/src-tauri/capabilities/localhost-webui.json b/src-tauri/capabilities/localhost-webui.json new file mode 100644 index 0000000..27b0741 --- /dev/null +++ b/src-tauri/capabilities/localhost-webui.json @@ -0,0 +1,13 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "localhost-webui", + "description": "Allow the local HiCT WebUI served by HiCT_JVM to call the small Tauri wrapper commands.", + "windows": ["main"], + "remote": { + "urls": [ + "http://localhost:*", + "http://127.0.0.1:*" + ] + }, + "permissions": ["allow-quit-app", "allow-save-export"] +} diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs new file mode 100644 index 0000000..f52294b --- /dev/null +++ b/src-tauri/src/main.rs @@ -0,0 +1,122 @@ +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + +use std::{env, fs, net::IpAddr, path::PathBuf, process}; +use tauri::{WebviewUrl, WebviewWindowBuilder}; +use url::Url; + +const DEFAULT_HICT_URL: &str = "http://127.0.0.1:8080/"; + +#[tauri::command] +fn quit_app(app: tauri::AppHandle) { + app.exit(0); +} + +#[tauri::command] +fn save_export(filename: String, bytes: Vec) -> Result { + let safe_filename = sanitize_export_filename(&filename); + let export_dir = export_directory()?; + fs::create_dir_all(&export_dir) + .map_err(|error| format!("failed to create export directory {export_dir:?}: {error}"))?; + let output_path = export_dir.join(safe_filename); + fs::write(&output_path, bytes) + .map_err(|error| format!("failed to write export {output_path:?}: {error}"))?; + Ok(output_path.to_string_lossy().to_string()) +} + +fn export_directory() -> Result { + let base = env::var("HICT_EXPORT_DIR") + .ok() + .or_else(|| env::var("HICT_DATA_DIR").ok()) + .map(PathBuf::from) + .or_else(|| env::current_dir().ok()) + .ok_or_else(|| "failed to resolve export directory".to_string())?; + Ok(base.join("hict-export")) +} + +fn sanitize_export_filename(filename: &str) -> String { + let candidate = filename + .trim() + .chars() + .map(|character| match character { + '/' | '\\' | ':' | '*' | '?' | '"' | '<' | '>' | '|' => '_', + _ if character.is_control() => '_', + _ => character, + }) + .collect::(); + if candidate.is_empty() { + "hict-export.bin".to_string() + } else { + candidate + } +} + +fn requested_url() -> String { + env::args() + .skip(1) + .find(|argument| { + let lower = argument.to_ascii_lowercase(); + lower.starts_with("http://") || lower.starts_with("https://") + }) + .or_else(|| env::var("HICT_TAURI_URL").ok()) + .unwrap_or_else(|| DEFAULT_HICT_URL.to_string()) +} + +fn allowed_local_url(raw_url: &str) -> Result { + let url = Url::parse(raw_url).map_err(|error| format!("invalid URL '{raw_url}': {error}"))?; + if !matches!(url.scheme(), "http" | "https") { + return Err(format!("unsupported URL scheme '{}'", url.scheme())); + } + let Some(host) = url.host_str().map(|host| host.to_ascii_lowercase()) else { + return Err(format!("URL has no host: {raw_url}")); + }; + if is_allowed_hict_host(&host) { + Ok(url) + } else { + Err(format!( + "HiCT Tauri browser only opens local HiCT WebUI URLs, got: {raw_url}" + )) + } +} + +fn is_allowed_hict_host(host: &str) -> bool { + if host == "localhost" { + return true; + } + let Ok(address) = host.parse::() else { + return false; + }; + match address { + IpAddr::V4(address) => { + address.is_loopback() || address.is_private() || address.is_link_local() + } + IpAddr::V6(address) => { + address.is_loopback() + || address.is_unique_local() + || address.is_unicast_link_local() + } + } +} + +fn main() { + let webui_url = match allowed_local_url(&requested_url()) { + Ok(url) => url, + Err(error) => { + eprintln!("HiCT Tauri browser refused to start: {error}"); + process::exit(2); + } + }; + + tauri::Builder::default() + .invoke_handler(tauri::generate_handler![quit_app, save_export]) + .setup(move |app| { + WebviewWindowBuilder::new(app, "main", WebviewUrl::External(webui_url.clone())) + .title("HiCT") + .inner_size(1480.0, 980.0) + .min_inner_size(900.0, 640.0) + .center() + .build()?; + Ok(()) + }) + .run(tauri::generate_context!()) + .expect("HiCT Tauri browser failed"); +} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json new file mode 100644 index 0000000..656f42a --- /dev/null +++ b/src-tauri/tauri.conf.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://schema.tauri.app/config/2", + "productName": "HiCT Browser", + "version": "0.1.1", + "identifier": "ru.itmo.ctlab.hict.browser", + "build": { + "beforeBuildCommand": "", + "beforeDevCommand": "", + "devUrl": "http://127.0.0.1:8080", + "frontendDist": "../dist" + }, + "app": { + "withGlobalTauri": true, + "windows": [] + }, + "bundle": { + "active": false, + "category": "Science", + "icon": [ + "../public/favicon.ico" + ], + "targets": "all" + } +} diff --git a/src/BinMousePosition.js b/src/BinMousePosition.js index b9b1c85..083c7a1 100644 --- a/src/BinMousePosition.js +++ b/src/BinMousePosition.js @@ -26,7 +26,6 @@ import { getTransformFromProjections, getUserProjection, identityTransform, - transform, } from "ol/proj"; import TileLayer from "ol/layer/Tile"; @@ -39,6 +38,41 @@ export default class BinMousePosition extends MousePosition { if (opt_options.layers) { this.layers = opt_options.layers; } + if (opt_options.scaffold_holder) { + this.scaffold_holder = opt_options.scaffold_holder; + } + if (opt_options.layersManager) { + this.layersManager = opt_options.layersManager; + } + } + + getGuidanceResolutionDescriptor(fallbackDescriptor) { + if (this.layersManager?.getFinestVisibleSourceResolutionDescriptor) { + const descriptor = + this.layersManager.getFinestVisibleSourceResolutionDescriptor(); + if ( + descriptor && + Number.isFinite(descriptor.bpResolution) && + Number.isFinite(descriptor.pixelResolution) + ) { + return this.layersManager?.ensureGuidanceResolutionDescriptor + ? this.layersManager.ensureGuidanceResolutionDescriptor(descriptor) + : descriptor; + } + } + return this.layersManager?.ensureGuidanceResolutionDescriptor + ? this.layersManager.ensureGuidanceResolutionDescriptor( + fallbackDescriptor + ) + : fallbackDescriptor; + } + + getDimensionHolderForDescriptor(descriptor) { + return ( + this.layersManager?.getDimensionHolderForSource?.( + descriptor.sourceName ?? "PRIMARY" + ) ?? this.dimension_holder + ); } updateHTML_(pixel) { @@ -58,6 +92,7 @@ export default class BinMousePosition extends MousePosition { const map = this.getMap(); const coordinate = map.getCoordinateFromPixelInternal(pixel); if (coordinate) { + const mapCoordinate = [...coordinate]; const userProjection = getUserProjection(); if (userProjection) { this.transform_ = getTransformFromProjections( @@ -76,87 +111,179 @@ export default class BinMousePosition extends MousePosition { ? null : layers .filter((l) => l instanceof TileLayer) - .sort((l1, l2) => l1.getZIndex() - l2.getZIndex())[0]; + .sort((l1, l2) => l2.getZIndex() - l1.getZIndex())[0]; if (hovered_layer) { - const layer_projection = hovered_layer.getSource().getProjection(); - const pixelResolution = hovered_layer.get("pixelResolution"); - const fixed_coordinates = transform( - coordinate, - map.getView().getProjection(), - layer_projection - ).map((c) => Math.ceil(c / pixelResolution)); - const bpResolutionString = hovered_layer.get("bpResolution"); - const bpResolution = Number(bpResolutionString); - const int_coordinates_px = - this.dimension_holder.clampPxCoordinatesAtResolution( - [ - Math.floor(fixed_coordinates[0]), - -Math.floor(fixed_coordinates[1]), - ], - bpResolution + try { + const bpResolutionString = hovered_layer.get("bpResolution"); + const hoveredBpResolution = Number(bpResolutionString); + const hoveredPixelResolution = Number( + hovered_layer.get("pixelResolution") ); - - html = - '
'; - html += "Global projection coordinate: " + coordinate.map(Math.floor); - html = html + "<"; - html = html + "br/>"; - - // html += - // "Center coordinate: " + map.getView().getCenter().map(Math.floor); - // html = html + "<"; - // html = html + "br/>"; - - if (fixed_coordinates) { - html = html + "Bin resolution: 1:" + bpResolution; - html = html + "<"; - html = html + "br/>"; - html = - html + - "Position: px1=" + - int_coordinates_px[0] + - " px2=" + - int_coordinates_px[1]; - } - - if (this.dimension_holder) { - const int_coordinates_bins = this.dimension_holder.pixelsToBins( - int_coordinates_px, - bpResolution + const fallbackDescriptor = { + sourceName: + hovered_layer.get("sourceName") === "SECONDARY" + ? "SECONDARY" + : "PRIMARY", + bpResolution: hoveredBpResolution, + pixelResolution: hoveredPixelResolution, + }; + const guidanceDescriptor = + this.getGuidanceResolutionDescriptor(fallbackDescriptor); + const dimensionHolder = + this.getDimensionHolderForDescriptor(guidanceDescriptor); + const bpResolution = guidanceDescriptor.bpResolution; + const pixelResolution = guidanceDescriptor.pixelResolution; + const fixed_coordinates = mapCoordinate.map((c) => + Math.ceil(c / pixelResolution) ); - html = html + "<"; - html = html + "br/>"; + const int_coordinates_px = + dimensionHolder.clampPxCoordinatesAtResolution( + [ + Math.floor(fixed_coordinates[0]), + -Math.floor(fixed_coordinates[1]), + ], + bpResolution + ); + html = - html + - "Position: bin1=" + - int_coordinates_bins[0] + - " bin2=" + - int_coordinates_bins[1]; + '
'; + html += + "Global projection coordinate: " + coordinate.map(Math.floor); html = html + "<"; html = html + "br/>"; - const bp1 = this.dimension_holder.getStartBpOfPx( - int_coordinates_px[0], - bpResolution - ); - const bp2 = this.dimension_holder.getStartBpOfPx( - int_coordinates_px[1], - bpResolution - ); - const ctg1 = this.dimension_holder.getContigNameByPx( - int_coordinates_px[0], - bpResolution - ); - const ctg2 = this.dimension_holder.getContigNameByPx( - int_coordinates_px[1], - bpResolution - ); - html = html + "Position: bp1=" + bp1 + " bp2=" + bp2; - html = html + "<"; - html = html + "br/>"; - html = html + "Contigs: ctg1=" + ctg1 + " ctg2=" + ctg2; - } - html += "
"; + // html += + // "Center coordinate: " + map.getView().getCenter().map(Math.floor); + // html = html + "<"; + // html = html + "br/>"; + + if (fixed_coordinates) { + html = html + "Bin resolution: 1:" + bpResolution; + html = html + "<"; + html = html + "br/>"; + if ( + Number.isFinite(hoveredBpResolution) && + hoveredBpResolution !== bpResolution + ) { + html = + html + "Hovered tile resolution: 1:" + hoveredBpResolution; + html = html + "<"; + html = html + "br/>"; + } + if (guidanceDescriptor.sourceName) { + html = + html + "Guidance source: " + guidanceDescriptor.sourceName; + html = html + "<"; + html = html + "br/>"; + } + if (this.layersManager?.getVisibleSourceResolutionDescriptors) { + const visible = + this.layersManager.getVisibleSourceResolutionDescriptors(); + const details = [ + visible.primary + ? `Primary 1:${visible.primary.bpResolution}` + : null, + visible.secondary + ? `Secondary 1:${visible.secondary.bpResolution}` + : null, + ].filter(Boolean); + if (details.length > 0) { + html = + html + "Visible source resolutions: " + details.join("; "); + html = html + "<"; + html = html + "br/>"; + } + } + html = + html + + "Position: px1=" + + int_coordinates_px[0] + + " px2=" + + int_coordinates_px[1]; + } + + if (dimensionHolder) { + const int_coordinates_bins = dimensionHolder.pixelsToBins( + int_coordinates_px, + bpResolution + ); + html = html + "<"; + html = html + "br/>"; + html = + html + + "Position: bin1=" + + int_coordinates_bins[0] + + " bin2=" + + int_coordinates_bins[1]; + html = html + "<"; + html = html + "br/>"; + const bp1 = dimensionHolder.getStartBpOfPx( + int_coordinates_px[0], + bpResolution + ); + const bp2 = dimensionHolder.getStartBpOfPx( + int_coordinates_px[1], + bpResolution + ); + const ctg1 = dimensionHolder.getContigNameByPx( + int_coordinates_px[0], + bpResolution + ); + const ctg2 = dimensionHolder.getContigNameByPx( + int_coordinates_px[1], + bpResolution + ); + html = html + "Position: bp1=" + bp1 + " bp2=" + bp2; + html = html + "<"; + html = html + "br/>"; + html = html + "Contigs: ctg1=" + ctg1 + " ctg2=" + ctg2; + if (dimensionHolder.getContigLocusByPx) { + const locus1 = dimensionHolder.getContigLocusByPx( + int_coordinates_px[0], + bpResolution + ); + const locus2 = dimensionHolder.getContigLocusByPx( + int_coordinates_px[1], + bpResolution + ); + html = html + "<"; + html = html + "br/>"; + html = + html + + "In-contig bp: ctg1=+" + + locus1.inContigBp + + " ctg2=+" + + locus2.inContigBp; + } + if (this.scaffold_holder?.getScaffoldLocusByBp) { + const scaffold1 = + this.scaffold_holder.getScaffoldLocusByBp(bp1); + const scaffold2 = + this.scaffold_holder.getScaffoldLocusByBp(bp2); + html = html + "<"; + html = html + "br/>"; + html = + html + + "Scaffolds: scf1=" + + (scaffold1 ? scaffold1.scaffoldName : "unscaffolded") + + " scf2=" + + (scaffold2 ? scaffold2.scaffoldName : "unscaffolded"); + html = html + "<"; + html = html + "br/>"; + html = + html + + "In-scaffold bp: scf1=" + + (scaffold1 ? "+" + scaffold1.inScaffoldBp : "n/a") + + " scf2=" + + (scaffold2 ? "+" + scaffold2.inScaffoldBp : "n/a"); + } + } + + html += "
"; + } catch (error) { + console.warn("Unable to update map mouse position overlay", error); + html = this.placeholder_; + } } } } diff --git a/src/ContigMouseWheelZoom.js b/src/ContigMouseWheelZoom.js index 70f8821..7a3683d 100644 --- a/src/ContigMouseWheelZoom.js +++ b/src/ContigMouseWheelZoom.js @@ -22,7 +22,6 @@ // @no-ts-check import { MouseWheelZoom } from "ol/interaction"; import { clamp } from "ol/math"; -import { transform } from "ol/proj"; import EventType from "ol/events/EventType.js"; import { DEVICE_PIXEL_RATIO, FIREFOX } from "ol/has.js"; import binarySearch from "binary-search"; @@ -41,9 +40,52 @@ export default class ContigMouseWheelZoom extends MouseWheelZoom { this.pixelResolutionSet = [...opt_options.pixelResolutionSet]; this.global_projection = opt_options.global_projection; this.layers = opt_options.layers; + this.layersManager = opt_options.layersManager; this.isTrackPad = undefined; } + setResolutionModel(resolutions, pixelResolutionSet, layers) { + this.resolutions = [...resolutions]; + this.pixelResolutionSet = [...pixelResolutionSet]; + this.layers = layers; + } + + getLayerResolutionDescriptor(layer) { + return { + sourceName: + layer?.get("sourceName") === "SECONDARY" ? "SECONDARY" : "PRIMARY", + bpResolution: Number(layer?.get("bpResolution")), + pixelResolution: Number(layer?.get("pixelResolution")), + }; + } + + getGuidanceResolutionDescriptorForViewResolution( + viewResolution, + fallbackDescriptor + ) { + if ( + this.layersManager?.getGuidanceResolutionDescriptorForViewResolution && + Number.isFinite(viewResolution) + ) { + return this.layersManager.getGuidanceResolutionDescriptorForViewResolution( + viewResolution + ); + } + return this.layersManager?.ensureGuidanceResolutionDescriptor + ? this.layersManager.ensureGuidanceResolutionDescriptor( + fallbackDescriptor + ) + : fallbackDescriptor; + } + + getDimensionHolderForDescriptor(descriptor) { + return ( + this.layersManager?.getDimensionHolderForSource?.( + descriptor.sourceName ?? "PRIMARY" + ) ?? this.dimension_holder + ); + } + /** * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} (if it was a mousewheel-event) and eventually * zooms the map. @@ -67,7 +109,7 @@ export default class ContigMouseWheelZoom extends MouseWheelZoom { const layers = this.layers .filter((l) => l instanceof TileLayer && l.getData(mapBrowserEvent.pixel)) - .sort((l1, l2) => l1.zIndex - l2.zIndex); //[]; + .sort((l1, l2) => (l2.getZIndex?.() ?? 0) - (l1.getZIndex?.() ?? 0)); //[]; // map.forEachLayerAtPixel(mapBrowserEvent.pixel, function (layer) { // layers.push(layer); // }); @@ -85,35 +127,49 @@ export default class ContigMouseWheelZoom extends MouseWheelZoom { } if (hovered_layer) { - const layer_projection = hovered_layer.getSource().getProjection(); - const pixelResolution = hovered_layer.get("pixelResolution"); - const fixed_coordinates = transform( - mapBrowserEvent.coordinate, - map.getView().getProjection(), - layer_projection - ).map((c) => c / pixelResolution); - const bpResolutionString = hovered_layer.get("bpResolution"); - const bpResolution = Number(bpResolutionString); - const int_coordinates_bins = - this.dimension_holder.clampBinCoordinatesAtResolution( - [Math.floor(fixed_coordinates[0]), -Math.floor(fixed_coordinates[1])], - bpResolutionString + try { + const fallbackDescriptor = + this.getLayerResolutionDescriptor(hovered_layer); + const guidanceDescriptor = + this.getGuidanceResolutionDescriptorForViewResolution( + map.getView().getResolution(), + fallbackDescriptor + ); + const dimensionHolder = + this.getDimensionHolderForDescriptor(guidanceDescriptor); + const fixed_coordinates = mapBrowserEvent.coordinate.map( + (c) => c / guidanceDescriptor.pixelResolution ); - const bp1 = this.dimension_holder.getStartBpOfBin( - int_coordinates_bins[0], - bpResolution - ); - const bp2 = this.dimension_holder.getStartBpOfBin( - int_coordinates_bins[1], - bpResolution - ); - const coord_bp = [bp1, bp2]; + const int_coordinates_bins = + dimensionHolder.clampBinCoordinatesAtResolution( + [ + Math.floor(fixed_coordinates[0]), + -Math.floor(fixed_coordinates[1]), + ], + guidanceDescriptor.bpResolution + ); + const bp1 = dimensionHolder.getStartBpOfBin( + int_coordinates_bins[0], + guidanceDescriptor.bpResolution + ); + const bp2 = dimensionHolder.getStartBpOfBin( + int_coordinates_bins[1], + guidanceDescriptor.bpResolution + ); + const coord_bp = [bp1, bp2]; - if (this.useAnchor_) { - this.lastMouseBps = coord_bp; + if (this.useAnchor_) { + this.lastMouseBps = coord_bp; + this.lastGuidanceDescriptor = guidanceDescriptor; + } + } catch (error) { + console.warn("Unable to derive zoom guidance coordinate", error); + this.lastMouseBps = null; + this.lastGuidanceDescriptor = undefined; } } else { this.lastMouseBps = null; + this.lastGuidanceDescriptor = undefined; } // Delta normalisation inspired by @@ -209,8 +265,7 @@ export default class ContigMouseWheelZoom extends MouseWheelZoom { if (currentResolution === undefined) { return; } - const newResolution = - currentResolution / Math.pow(zoomFactor, delta); + const newResolution = currentResolution / Math.pow(zoomFactor, delta); if (newResolution === undefined) { return; } @@ -222,8 +277,30 @@ export default class ContigMouseWheelZoom extends MouseWheelZoom { maxResolution ?? newResolution ); - const old_level_index = this.getClosestResolutionIndex(view.getResolution()); - const new_level_index = this.getClosestResolutionIndex(constrainedResolution); + let oldGuidanceDescriptor; + let newGuidanceDescriptor; + try { + oldGuidanceDescriptor = + this.getGuidanceResolutionDescriptorForViewResolution( + currentResolution, + this.lastGuidanceDescriptor + ); + newGuidanceDescriptor = + this.getGuidanceResolutionDescriptorForViewResolution( + constrainedResolution, + oldGuidanceDescriptor + ); + } catch (error) { + console.warn("Unable to derive zoom target guidance resolution", error); + } + const guidanceResolutionChanged = + oldGuidanceDescriptor && + newGuidanceDescriptor && + (oldGuidanceDescriptor.bpResolution !== + newGuidanceDescriptor.bpResolution || + oldGuidanceDescriptor.pixelResolution !== + newGuidanceDescriptor.pixelResolution || + oldGuidanceDescriptor.sourceName !== newGuidanceDescriptor.sourceName); if ( this.lastMouseBps && @@ -231,22 +308,24 @@ export default class ContigMouseWheelZoom extends MouseWheelZoom { this.lastMousePixel && this.lastMouseCoord && !isNaN(this.lastMouseCoord[0]) && - new_level_index !== old_level_index + guidanceResolutionChanged ) { - const newResolutionSeq = this.resolutions[new_level_index]; - if (newResolutionSeq !== undefined) { - const finish_bin_1 = this.dimension_holder.getBinContainingBp( + if (newGuidanceDescriptor) { + const dimensionHolder = this.getDimensionHolderForDescriptor( + newGuidanceDescriptor + ); + const finish_bin_1 = dimensionHolder.getBinContainingBp( this.lastMouseBps[0], - newResolutionSeq + newGuidanceDescriptor.bpResolution ); - const finish_bin_2 = this.dimension_holder.getBinContainingBp( + const finish_bin_2 = dimensionHolder.getBinContainingBp( this.lastMouseBps[1], - newResolutionSeq + newGuidanceDescriptor.bpResolution ); const finish_coordinate_bins = [finish_bin_1, finish_bin_2]; // const finish_coordinate_on_map = this.transformFromLayerToGlobalCoordinate[new_level_index].apply(null, [finish_coordinate_bins]); const finish_coordinate_on_map = finish_coordinate_bins.map( - (c) => c * this.pixelResolutionSet[new_level_index] + (c) => c * newGuidanceDescriptor.pixelResolution ); finish_coordinate_on_map[1] *= -1; const dx_px = this.lastCenterPixel[0] - this.lastMousePixel[0]; @@ -256,8 +335,8 @@ export default class ContigMouseWheelZoom extends MouseWheelZoom { duration: this.duration_, resolution: constrainedResolution, center: [ - finish_coordinate_on_map[0] + dx_px * newResolution, - finish_coordinate_on_map[1] - dy_px * newResolution, + finish_coordinate_on_map[0] + dx_px * constrainedResolution, + finish_coordinate_on_map[1] - dy_px * constrainedResolution, ], }); } else { diff --git a/src/app/core/VersionedXYZSource.ts b/src/app/core/VersionedXYZSource.ts index c1614fa..7e25dd1 100644 --- a/src/app/core/VersionedXYZSource.ts +++ b/src/app/core/VersionedXYZSource.ts @@ -23,7 +23,10 @@ import { ImageTile } from "ol"; import TileState from "ol/TileState"; import XYZ, { type Options as XYZOptions } from "ol/source/XYZ"; import { unref } from "vue"; -import type { HiCViewAndLayersManager } from "./mapmanagers/HiCViewAndLayersManager"; +import type { + HiCViewAndLayersManager, + MatrixSourceName, +} from "./mapmanagers/HiCViewAndLayersManager"; import { CurrentSignalRangeResponseDTO } from "./net/dto/responseDTO"; import type { CurrentSignalRangeResponse } from "./net/api/response"; import { useUiSettingsStore } from "@/app/stores/uiSettingsStore"; @@ -38,6 +41,7 @@ class VersionedXYZContactMapSource extends XYZ { protected readonly layersManager: HiCViewAndLayersManager, protected readonly zoomLevel: number, protected readonly bpResolution: number, + protected readonly sourceName: MatrixSourceName = "PRIMARY", readonly xyzOptions?: XYZOptions ) { super(xyzOptions); @@ -48,7 +52,11 @@ class VersionedXYZContactMapSource extends XYZ { const image: HTMLImageElement | HTMLVideoElement = imageTile.getImage() as HTMLImageElement | HTMLVideoElement; const uiSettingsStore = useUiSettingsStore(); - if (uiSettingsStore.binaryTileTransportEnabled) { + if ( + uiSettingsStore.binaryTileTransportEnabled && + this.sourceName === "PRIMARY" && + !this.layersManager.hasSecondarySource() + ) { this.loadBinarySignalTile(imageTile, image, src); return; } @@ -122,6 +130,7 @@ class VersionedXYZContactMapSource extends XYZ { endRowPx: parsed.endRowPx, startColPx: parsed.startColPx, endColPx: parsed.endColPx, + source: this.sourceName, signalMode: "PIPELINE_SIGNAL", format: "BINARY_FLOAT32", }; @@ -331,6 +340,7 @@ class VersionedXYZContactMapSource extends XYZ { `/get_tile?version=${this.sourceVersion}` + `&level=${1 + this.zoomLevel}` + `&bpResolution=${this.bpResolution}` + + `&source=${this.sourceName}` + `&row=${row}` + `&col=${col}` + `&tile_size=${unref(this.layersManager.tileSize)}` diff --git a/src/app/core/attribution.ts b/src/app/core/attribution.ts new file mode 100644 index 0000000..146b2bc --- /dev/null +++ b/src/app/core/attribution.ts @@ -0,0 +1,215 @@ +/* + * MIT License + * + * Copyright (c) 2021-2026 Aleksandr Serdiukov, Anton Zamyatin, Aleksandr Sinitsyn, Vitalii Dravgelis, Zakhar Lobanov, Nikita Zheleznov, Pavel Avdeyev, Nikolay Cherkasov and Computer Technologies Laboratory ITMO University team. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +export type AttributionLink = { + label: string; + href: string; +}; + +export type AttributionEntry = { + name: string; + authors: string; + license: string; + note?: string; + links?: AttributionLink[]; +}; + +export const projectAttribution: AttributionEntry = { + name: "HiCT", + authors: + "Aleksandr Serdiukov, Anton Zamyatin, Aleksandr Sinitsyn, Vitalii Dravgelis, Zakhar Lobanov, Nikita Zheleznov, Pavel Avdeyev, Nikolay Cherkasov and Computer Technologies Laboratory ITMO University team.", + license: "MIT License", + note: "Hi-C scaffolding, visualization and conversion workstation.", + links: [ + { label: "HiCT JVM", href: "https://github.com/ctlab/HiCT_JVM" }, + { label: "HiCT WebUI", href: "https://github.com/ctlab/HiCT_WebUI" }, + ], +}; + +export const runtimeAttributions: AttributionEntry[] = [ + { + name: "Eclipse Vert.x", + authors: "Eclipse Foundation and Vert.x contributors.", + license: "Apache License 2.0", + note: "HTTP API, routing, concurrency and WebUI serving.", + links: [{ label: "vertx.io", href: "https://vertx.io/" }], + }, + { + name: "HDF5 and JHDF5", + authors: "The HDF Group, ETH Zurich/CISD and contributors.", + license: "See bundled upstream notices and dependency metadata.", + note: "HiCT matrix storage and native HDF5 access.", + links: [ + { label: "HDF5", href: "https://www.hdfgroup.org/solutions/hdf5/" }, + { label: "JHDF5", href: "https://unlimited.ethz.ch/spaces/JHDF/overview" }, + ], + }, + { + name: "hictk", + authors: "Roberto Rossini, Jonas Paulsen and hictk contributors.", + license: "MIT License", + note: "Optional .hic conversion path. Cite Rossini R, Paulsen J. Bioinformatics 2024;40(7):btae408 when this path is used.", + links: [{ label: "hictk", href: "https://github.com/paulsengroup/hictk" }], + }, + { + name: "minimap2", + authors: "Heng Li and minimap2 contributors.", + license: "MIT License", + note: "Optional FASTA self-alignment engine for dotplot generation.", + links: [{ label: "minimap2", href: "https://github.com/lh3/minimap2" }], + }, + { + name: "mm2-plus", + authors: "Ghanshyam Chandra, Md Vasimuddin, Sanchit Misra, Chirag Jain and contributors.", + license: "See bundled upstream license file.", + note: "Optional accelerated minimap2-compatible self-alignment engine for dotplot generation. Cite the 2024 bioRxiv preprint when this path is used.", + links: [{ label: "mm2-plus", href: "https://github.com/at-cg/mm2-plus" }], + }, + { + name: "HTSJDK and IGV BigWig", + authors: "Broad Institute, IGV team and contributors.", + license: "See upstream license metadata.", + note: "FASTA/sequence and genomic track support.", + links: [ + { label: "HTSJDK", href: "https://github.com/samtools/htsjdk" }, + { label: "IGV", href: "https://github.com/igvteam/igv" }, + ], + }, + { + name: "Apache Commons", + authors: "Apache Software Foundation and contributors.", + license: "Apache License 2.0", + note: "General-purpose JVM utilities.", + links: [{ label: "Apache Commons", href: "https://commons.apache.org/" }], + }, + { + name: "SLF4J, Logback and picocli", + authors: "QOS.ch, Remko Popma and contributors.", + license: "See upstream license metadata.", + note: "Logging and command-line interface.", + links: [ + { label: "SLF4J", href: "https://www.slf4j.org/" }, + { label: "Logback", href: "https://logback.qos.ch/" }, + { label: "picocli", href: "https://picocli.info/" }, + ], + }, + { + name: "Tauri and Electron", + authors: "Tauri Programme, OpenJS Foundation and contributors.", + license: "See upstream license metadata.", + note: "Optional bundled WebUI browser runtimes for portable packages.", + links: [ + { label: "Tauri", href: "https://tauri.app/" }, + { label: "Electron", href: "https://www.electronjs.org/" }, + ], + }, + { + name: "Eclipse Temurin / OpenJDK", + authors: "Eclipse Adoptium, OpenJDK and contributors.", + license: "GPLv2 with Classpath Exception and bundled legal notices.", + note: "Optional Java runtime used by portable HiCT packages.", + links: [{ label: "Eclipse Temurin", href: "https://adoptium.net/temurin/" }], + }, +]; + +export const webAttributions: AttributionEntry[] = [ + { + name: "Vue, Pinia, Vite and TypeScript", + authors: "Vue, Vite, TypeScript and open-source contributors.", + license: "See package metadata.", + note: "WebUI application framework and build tooling.", + links: [ + { label: "Vue", href: "https://vuejs.org/" }, + { label: "Pinia", href: "https://pinia.vuejs.org/" }, + { label: "Vite", href: "https://vite.dev/" }, + { label: "TypeScript", href: "https://www.typescriptlang.org/" }, + ], + }, + { + name: "Bootstrap, Bootstrap Icons, PrimeVue and PrimeIcons", + authors: "Bootstrap, PrimeTek and contributors.", + license: "See package metadata.", + note: "Interface components, layout and icons.", + links: [ + { label: "Bootstrap", href: "https://getbootstrap.com/" }, + { label: "Bootstrap Icons", href: "https://icons.getbootstrap.com/" }, + { label: "PrimeVue", href: "https://primevue.org/" }, + { label: "PrimeIcons", href: "https://primevue.org/icons/" }, + ], + }, + { + name: "OpenLayers and igv.js", + authors: "OpenLayers, IGV.js and contributors.", + license: "See package metadata.", + note: "Interactive map canvas and genomic track visualization.", + links: [ + { label: "OpenLayers", href: "https://openlayers.org/" }, + { label: "igv.js", href: "https://github.com/igvteam/igv.js" }, + ], + }, + { + name: "jsPDF, LiteGraph and color-picker libraries", + authors: "Their respective authors and contributors.", + license: "See package metadata.", + note: "Export, rendering-pipeline editing and color controls.", + links: [ + { label: "jsPDF", href: "https://github.com/parallax/jsPDF" }, + { label: "LiteGraph", href: "https://github.com/jagenjo/litegraph.js" }, + { label: "@thednp/color-picker", href: "https://github.com/thednp/color-picker" }, + { label: "toolcool-color-picker", href: "https://github.com/mzusin/toolcool-color-picker" }, + { label: "vanilla-picker", href: "https://github.com/Sphinxxxx/vanilla-picker" }, + { label: "vue-color-kit", href: "https://github.com/anish2690/vue-color-kit" }, + { label: "ColorTranslator", href: "https://github.com/elchininet/ColorTranslator" }, + ], + }, +]; + +export const redistributionNotes = [ + "Portable packages keep HiCT, WebUI, Java runtime and optional hictk notices with the release artifact.", + "When hictk, minimap2 or mm2-plus are bundled, their license and citation files are available under toolchains//share.", + "The Java runtime legal notices are kept under runtime/legal in portable packages.", + "For exhaustive third-party details, inspect npm package metadata, Gradle dependency metadata and the bundled license folders.", +]; + +export const licenseText = `MIT License + +Copyright (c) 2021-2026 Aleksandr Serdiukov, Anton Zamyatin, Aleksandr Sinitsyn, Vitalii Dravgelis, Zakhar Lobanov, Nikita Zheleznov, Pavel Avdeyev, Nikolay Cherkasov and Computer Technologies Laboratory ITMO University team. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.`; diff --git a/src/app/core/controls/RulerControl.ts b/src/app/core/controls/RulerControl.ts index 8dd93a6..7e4a5c0 100644 --- a/src/app/core/controls/RulerControl.ts +++ b/src/app/core/controls/RulerControl.ts @@ -28,15 +28,13 @@ import { LayerResolutionDescriptor, } from "../mapmanagers/HiCViewAndLayersManager"; import ContigDimensionHolder from "../mapmanagers/ContigDimensionHolder"; -import { transform, transformExtent } from "ol/proj"; -import { toSI } from "display-si"; +import { transform } from "ol/proj"; import { storeToRefs } from "pinia"; import { useStyleStore } from "@/app/stores/styleStore"; import { useVisualizationOptionsStore } from "@/app/stores/visualizationOptionsStore"; import { Ref } from "vue"; import Colormap from "../visualization/colormap/Colormap"; import { ColorTranslator } from "colortranslator"; -import SimpleLinearGradient from "../visualization/colormap/SimpleLinearGradient"; interface Options extends ControlOptions { // position: "top" | "bottom" | "left" | "right"; @@ -46,11 +44,21 @@ interface Options extends ControlOptions { const DEFAULT_CANVAS_SIZE = 200; +interface RulerTick { + screen: number; + mapPx: number; + bp: number; + label: string; + major: boolean; + boundary?: "start" | "end"; +} + class RulerControl extends Control { protected readonly canvas: HTMLCanvasElement; protected readonly mapManager: ContactMapManager; protected readonly viewAndLayersManager: HiCViewAndLayersManager; protected readonly contigDimensionHolder: ContigDimensionHolder; + protected readonly tooltip: HTMLDivElement; protected readonly mapBackgroundColor: Ref; protected readonly colormap: Ref; @@ -60,6 +68,23 @@ class RulerControl extends Control { public constructor(public readonly opt_options: Options) { const canvas = document.createElement("canvas"); + const tooltip = document.createElement("div"); + tooltip.className = "hict-ruler-tooltip"; + Object.assign(tooltip.style, { + position: "absolute", + zIndex: "18", + maxWidth: "250px", + padding: "6px 8px", + borderRadius: "6px", + border: "1px solid rgba(17, 24, 39, 0.35)", + background: "rgba(17, 24, 39, 0.9)", + color: "rgba(244, 247, 252, 0.98)", + fontSize: "11px", + lineHeight: "1.25", + pointerEvents: "none", + boxShadow: "0 6px 20px rgba(0, 0, 0, 0.28)", + display: "none", + }); let canvasSize: number[]; if (opt_options.target) { @@ -70,6 +95,8 @@ class RulerControl extends Control { : (opt_options.target as HTMLElement); if (parent) { parent.appendChild(canvas); + parent.appendChild(tooltip); + parent.style.position ||= "relative"; } else { throw new Error( "Cannot find parent element for RulerControl with target " + @@ -100,6 +127,7 @@ class RulerControl extends Control { }; super(newOptions); this.canvas = canvas; + this.tooltip = tooltip; this.mapManager = opt_options.mapManager; this.viewAndLayersManager = this.mapManager.getLayersManager(); this.contigDimensionHolder = this.mapManager.getContigDimensionHolder(); @@ -114,6 +142,10 @@ class RulerControl extends Control { this.mapBackgroundColor = mapBackgroundColor as Ref; this.canvasSize = canvasSize; + this.canvas.addEventListener("mousemove", (event) => + this.showRulerTooltip(event) + ); + this.canvas.addEventListener("mouseleave", () => this.hideRulerTooltip()); } render(mapEvent: MapEvent) { @@ -135,9 +167,20 @@ class RulerControl extends Control { this.viewAndLayersManager.currentViewState.resolutionDesciptor; const activeHiCLayer = this.viewAndLayersManager.getActiveHiCDataLayer(); - const extent = mapView.calculateExtent(map.getSize()); - const mapProjection = mapView.getProjection(); - + const mapSize = map.getSize(); + const center = mapView.getCenter(); + const pixelResolution = mapView.getResolution(); + if ( + !mapSize || + !center || + center.length < 2 || + !center.every((value) => Number.isFinite(value)) || + pixelResolution === undefined || + !Number.isFinite(pixelResolution) + ) { + return; + } + const extent = mapView.calculateExtent(mapSize); const targetProjection = activeHiCLayer.getSource()?.getProjection(); if (!targetProjection) { @@ -152,14 +195,6 @@ class RulerControl extends Control { } const pixelMapSize = ps[ps.length - 1]; - const extentInTargetProjection = transformExtent( - extent, - mapProjection, - targetProjection - ); - - const pixelResolution = mapView.getResolution() ?? 1; - const layerPixelResolution = Number.isFinite( resolutionDescriptor.pixelResolution ) @@ -303,121 +338,22 @@ class RulerControl extends Control { // context.strokeStyle = "black"; // context.stroke(); - const axisSpanPx = Math.max( - 1, - Math.round((end[0] - start[0]) * deltaDir[0] + (end[1] - start[1]) * deltaDir[1]) - ); - const desiredTickCount = Math.max(2, Math.min(12, Math.floor(axisSpanPx / 90))); - const tickInterval = Math.max(24, Math.round(axisSpanPx / desiredTickCount)); - - { - const TICK_SEMI_HEIGHT = - Math.min(this.canvas.width, this.canvas.height) / 5; - const FONT_SIZE_PX = Math.floor( - Math.min(this.canvas.width, this.canvas.height) / 5 - ); - const FONT_STRING = `bold ${FONT_SIZE_PX}px serif`; - const LAST_TICK_MARGIN = Math.round(tickInterval / 2); - let tickIndex = 0; - let previousAbsoluteLabel: string | null = null; - let previousAbsoluteBp: number | null = null; - for ( - let coord: [number, number] = [start[0], start[1]]; - coord[0] < end[0] - LAST_TICK_MARGIN || - coord[1] < end[1] - LAST_TICK_MARGIN; - coord[0] += deltaDir[0] * tickInterval, - coord[1] += deltaDir[1] * tickInterval - ) { - const tickState = this.drawTickAtPxOffset( - context, - resolutionDescriptor, - coord, - start, - end, - deltaDir, - tickInterval, - mapBoxPixelCoordinates, - visibleMapBoxExtentPixel, - fraction1, - TICK_SEMI_HEIGHT, - FONT_SIZE_PX, - FONT_STRING, - tickIndex, - previousAbsoluteLabel, - previousAbsoluteBp - ); - previousAbsoluteLabel = tickState.absoluteLabel; - previousAbsoluteBp = tickState.absoluteBp; - tickIndex++; - } - this.drawTickAtPxOffset( - context, - resolutionDescriptor, - end, - start, - end, - deltaDir, - tickInterval, - mapBoxPixelCoordinates, - visibleMapBoxExtentPixel, - fraction1, - TICK_SEMI_HEIGHT, - FONT_SIZE_PX, - FONT_STRING, - tickIndex, - previousAbsoluteLabel, - previousAbsoluteBp - ); - } - // Actually, if false, allows drawing smaller grid, currently disabled - if (tickInterval < 0) { - const TICK_SEMI_HEIGHT = - Math.min(this.canvas.width, this.canvas.height) / 10; - const FONT_SIZE_PX = Math.floor( - Math.min(this.canvas.width, this.canvas.height) / 10 - ); - const FONT_STRING = `bold ${FONT_SIZE_PX}px serif`; - - const LAST_TICK_MARGIN = Math.round(tickInterval / 2); - for ( - let coord: [number, number] = [ - start[0] + (tickInterval / 2) * deltaDir[0], - start[1] + (tickInterval / 2) * deltaDir[1], - ]; - coord[0] < end[0] - LAST_TICK_MARGIN || - coord[1] < end[1] - LAST_TICK_MARGIN; - coord[0] += deltaDir[0] * tickInterval, - coord[1] += deltaDir[1] * tickInterval - ) { - // console.log( - // "start", - // start, - // "end", - // end, - // "deltaDir", - // deltaDir, - // "coord", - // coord - // ); - this.drawTickAtPxOffset( - context, - resolutionDescriptor, - coord, - start, - end, - deltaDir, - tickInterval, - mapBoxPixelCoordinates, - visibleMapBoxExtentPixel, - fraction1, - TICK_SEMI_HEIGHT, - FONT_SIZE_PX, - FONT_STRING, - 0, - null, - null - ); - } + const axisStart = this.direction === "horizontal" ? start[0] : start[1]; + const axisEnd = this.direction === "horizontal" ? end[0] : end[1]; + const mapStartScreen = + this.direction === "horizontal" + ? mapBoxPixelCoordinates.left + : mapBoxPixelCoordinates.top; + const ticks = this.buildVisibleRulerTicks({ + axisStart, + axisEnd, + mapStartScreen, + fraction: fraction1, + pixelMapSize, + resolutionDescriptor, + }); + for (const tick of ticks) { + this.drawRulerTick(context, tick, start, deltaDir); } } @@ -442,163 +378,327 @@ class RulerControl extends Control { } } - protected drawTickAtPxOffset( - context: CanvasRenderingContext2D, - resolutionDescriptor: LayerResolutionDescriptor, - coord: [number, number], - start: [number, number], - end: [number, number], - deltaDir: [number, number], - tickInterval: number, - mapBoxPixelCoordinates: { - left: number; - right: number; - top: number; - bottom: number; - }, - visibleMapBoxExtentPixel: { - left: number; - right: number; - top: number; - bottom: number; - }, - fraction1: number, - TICK_SEMI_HEIGHT: number, - FONT_SIZE_PX: number, - FONT_STRING: string, - tickIndex: number, - previousAbsoluteLabel: string | null, - previousAbsoluteBp: number | null - ): { absoluteLabel: string; absoluteBp: number } { - coord = coord.map(Math.round) as [number, number]; - - const dPx = (() => { - switch (this.opt_options.direction) { - case "vertical": - return ( - Math.round( - coord[1] - start[1] - Math.min(0, mapBoxPixelCoordinates.top) - ) * fraction1 - ); - case "horizontal": - return ( - Math.round( - coord[0] - start[0] - Math.min(0, mapBoxPixelCoordinates.left) - ) * fraction1 - ); - } - })(); + private showRulerTooltip(event: MouseEvent): void { + const details = this.resolveRulerHoverDetails(event.offsetX, event.offsetY); + if (!details) { + this.hideRulerTooltip(); + return; + } + const parent = this.canvas.parentElement; + if (!parent) { + return; + } + const left = Math.min( + Math.max(6, event.offsetX + 12), + Math.max(6, parent.clientWidth - 260) + ); + const top = Math.min( + Math.max(6, event.offsetY + 12), + Math.max(6, parent.clientHeight - 86) + ); + this.tooltip.innerHTML = details; + this.tooltip.style.left = `${Math.round(left)}px`; + this.tooltip.style.top = `${Math.round(top)}px`; + this.tooltip.style.display = "block"; + } - const preBP = (() => { - if (dPx == 0) { - return 0; - } else if (coord == end) { - return this.contigDimensionHolder.getStartBpOfPx( - dPx - 1, - resolutionDescriptor.bpResolution - ); - } else { - return this.contigDimensionHolder.getStartBpOfPx( - dPx, - resolutionDescriptor.bpResolution - ); + private hideRulerTooltip(): void { + this.tooltip.style.display = "none"; + } + + private resolveRulerHoverDetails(offsetX: number, offsetY: number): string | null { + const map = this.mapManager.getMap(); + const mapSize = map.getSize(); + if (!mapSize) { + return null; + } + const mapView = map.getView(); + const center = mapView.getCenter(); + const pixelResolution = mapView.getResolution(); + if ( + !center || + center.length < 2 || + !center.every((value) => Number.isFinite(value)) || + pixelResolution === undefined || + !Number.isFinite(pixelResolution) + ) { + return null; + } + const resolutionDescriptor = + this.viewAndLayersManager.currentViewState.resolutionDesciptor; + const activeHiCLayer = this.viewAndLayersManager.getActiveHiCDataLayer(); + const targetProjection = + activeHiCLayer.getSource()?.getProjection() ?? mapView.getProjection(); + const ps = this.contigDimensionHolder.prefix_sum_px.get( + resolutionDescriptor.bpResolution + ); + if (!ps) { + return null; + } + const pixelMapSize = ps[ps.length - 1]; + const fixed = transform( + mapView.calculateExtent(mapSize), + mapView.getProjection(), + targetProjection + ).map((coordinate) => coordinate / pixelResolution); + const layerPixelResolution = Number.isFinite( + resolutionDescriptor.pixelResolution + ) + ? resolutionDescriptor.pixelResolution + : 1; + const fraction = + layerPixelResolution > 0 ? pixelResolution / layerPixelResolution : 1; + const mapBoxPixelCoordinates = { + left: Math.round(-fixed[0]), + top: Math.round(fixed[3]), + }; + const visibleStart = + this.direction === "horizontal" + ? Math.round(Math.max(0, -fixed[0])) + : Math.round(Math.max(0, fixed[3])); + const axisOffset = this.direction === "horizontal" ? offsetX : offsetY; + const unclampedPx = + Math.round( + axisOffset - + visibleStart - + Math.min( + 0, + this.direction === "horizontal" + ? mapBoxPixelCoordinates.left + : mapBoxPixelCoordinates.top + ) + ) * fraction; + const px = Math.max(0, Math.min(pixelMapSize - 1, Math.round(unclampedPx))); + const bp = this.contigDimensionHolder.getStartBpOfPx( + px, + resolutionDescriptor.bpResolution + ); + const bin = this.contigDimensionHolder.pixelToBin( + px, + resolutionDescriptor.bpResolution + ); + const contig = this.contigDimensionHolder.getContigLocusByBp(bp); + const scaffold = this.mapManager.scaffoldHolder.getScaffoldLocusByBp(bp); + const scaffoldLine = scaffold + ? `Scaffold: ${this.escapeHtml(scaffold.scaffoldName)} +${this.formatInteger(scaffold.inScaffoldBp)} bp` + : "Scaffold: n/a"; + const source = this.contigDimensionHolder.getSourceLocusByBp(bp); + return [ + `${this.direction === "horizontal" ? "Horizontal" : "Vertical"} ruler`, + `Assembly: ${this.formatInteger(bp)} bp, bin ${this.formatInteger(bin)}, px ${this.formatInteger(px)}`, + `Contig: ${this.escapeHtml(contig.contigName)} +${this.formatInteger(contig.inContigBp)} bp`, + scaffoldLine, + `Source: ${this.escapeHtml(source.sourceContig)}:${this.formatInteger(source.sourceBp)} bp`, + ].join("
"); + } + + private escapeHtml(value: string): string { + return value + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """); + } + + private formatInteger(value: number): string { + return Math.round(value).toLocaleString(); + } + + private buildVisibleRulerTicks(options: { + axisStart: number; + axisEnd: number; + mapStartScreen: number; + fraction: number; + pixelMapSize: number; + resolutionDescriptor: LayerResolutionDescriptor; + }): RulerTick[] { + const axisStart = Math.round(Math.min(options.axisStart, options.axisEnd)); + const axisEnd = Math.round(Math.max(options.axisStart, options.axisEnd)); + const axisSpan = axisEnd - axisStart; + if (axisSpan <= 0) { + return []; + } + + const spacing = 100; + const screens: number[] = [axisStart]; + for (let screen = axisStart + spacing; screen < axisEnd - 42; screen += spacing) { + screens.push(Math.round(screen)); + } + if (axisEnd - screens[screens.length - 1] >= 34) { + screens.push(axisEnd); + } else { + screens[screens.length - 1] = axisEnd; + } + + const mapPxValues = screens.map((screen) => + this.screenPositionToMapPx( + screen, + options.mapStartScreen, + options.fraction, + options.pixelMapSize + ) + ); + const bpValues = mapPxValues.map((mapPx) => + this.contigDimensionHolder.getStartBpOfPx( + mapPx, + options.resolutionDescriptor.bpResolution + ) + ); + const maxBp = Math.max(...bpValues, 0); + const labelUnit = this.absoluteLabelUnit(maxBp); + let currentAnchor = this.roundDownToUnit(bpValues[0] ?? 0, labelUnit); + return screens.map((screen, index) => { + const bp = bpValues[index] ?? 0; + const mapPx = mapPxValues[index] ?? 0; + const anchor = this.roundDownToUnit(bp, labelUnit); + const boundary = + index === 0 ? "start" : index === screens.length - 1 ? "end" : undefined; + const major = boundary !== undefined || anchor !== currentAnchor; + if (major) { + currentAnchor = anchor; } - })(); + const delta = Math.max(0, Math.round(bp - currentAnchor)); + return { + screen, + mapPx, + bp, + major, + boundary, + label: + major || delta <= 0 + ? this.formatBpLabel(anchor, 0) + : `+${this.formatBpLabel(delta, 0)}`, + }; + }); + } - // console.log( - // this.opt_options.direction, - // "coord", - // coord, - // "dPx", - // dPx, - // "dBp", - // dBp, - // "pre", - // preBP, - // "post", - // postBP - // ); + private screenPositionToMapPx( + screenPosition: number, + mapStartScreen: number, + fraction: number, + pixelMapSize: number + ): number { + const raw = Math.round((screenPosition - mapStartScreen) * fraction); + return Math.max(0, Math.min(Math.max(0, pixelMapSize - 1), raw)); + } + + private drawRulerTick( + context: CanvasRenderingContext2D, + tick: RulerTick, + start: [number, number], + deltaDir: [number, number] + ): void { + const majorTickLength = Math.max( + 8, + Math.min(16, Math.min(this.canvas.width, this.canvas.height) * 0.24) + ); + const minorTickLength = Math.max(5, majorTickLength * 0.62); + const tickLength = tick.major ? majorTickLength : minorTickLength; + const coord: [number, number] = + this.direction === "horizontal" + ? [tick.screen, start[1]] + : [start[0], tick.screen]; const { mainStroke, outlineStroke } = this.getRulerStrokeColors(); context.strokeStyle = outlineStroke; - context.lineWidth = 6; + context.lineWidth = tick.major ? 5 : 4; context.beginPath(); - context.moveTo( - coord[0] - TICK_SEMI_HEIGHT * deltaDir[1], - coord[1] - TICK_SEMI_HEIGHT * deltaDir[0] - ); + context.moveTo(coord[0], coord[1]); context.lineTo( - coord[0] + TICK_SEMI_HEIGHT * deltaDir[1], - coord[1] + TICK_SEMI_HEIGHT * deltaDir[0] + coord[0] - tickLength * deltaDir[1], + coord[1] - tickLength * deltaDir[0] ); context.stroke(); context.strokeStyle = mainStroke; - context.lineWidth = 3; + context.lineWidth = tick.major ? 2.5 : 1.8; context.beginPath(); - context.moveTo( - coord[0] - TICK_SEMI_HEIGHT * deltaDir[1], - coord[1] - TICK_SEMI_HEIGHT * deltaDir[0] - ); + context.moveTo(coord[0], coord[1]); context.lineTo( - coord[0] + TICK_SEMI_HEIGHT * deltaDir[1], - coord[1] + TICK_SEMI_HEIGHT * deltaDir[0] + coord[0] - tickLength * deltaDir[1], + coord[1] - tickLength * deltaDir[0] ); context.stroke(); - const angleDeg = (() => { - switch (this.opt_options.direction) { - case "vertical": - return 0; - case "horizontal": - return -45; - } - })(); - - const textAlign = (() => { - switch (this.opt_options.direction) { - case "vertical": - return "right"; - case "horizontal": - return "left"; - } - })(); + const fontSize = tick.major ? 11 : 9; + const font = `${tick.major ? "bold" : "normal"} ${fontSize}px sans-serif`; + if (this.direction === "horizontal") { + const textX = this.clamp( + tick.boundary === "start" + ? tick.screen + 2 + : tick.boundary === "end" + ? tick.screen - 2 + : tick.screen, + 4, + this.canvas.width - 4 + ); + const textAlign: CanvasTextAlign = + tick.boundary === "start" + ? "left" + : tick.boundary === "end" + ? "right" + : "center"; + this.drawRotatedText( + tick.label, + textX, + Math.max(9, coord[1] - tickLength - 3), + context, + tick.boundary ? 0 : -35, + font, + textAlign, + true, + false + ); + return; + } - const fillBackground = this.opt_options.direction === "horizontal"; - const absoluteLabel = toSI(preBP); - const useDeltaLabel = - tickIndex > 0 && - previousAbsoluteLabel !== null && - previousAbsoluteBp !== null && - previousAbsoluteLabel === absoluteLabel && - preBP > previousAbsoluteBp; - const deltaLabel = "+" + toSI(Math.max(0, preBP - (previousAbsoluteBp ?? preBP))); - const label = useDeltaLabel ? deltaLabel : absoluteLabel; - const fontSize = useDeltaLabel - ? Math.max(9, FONT_SIZE_PX - 2) - : Math.max(11, FONT_SIZE_PX + 2); + const textY = this.clamp(tick.screen + fontSize / 2, fontSize + 1, this.canvas.height - 3); this.drawRotatedText( - label, - Math.round( - coord[0] + - (FONT_SIZE_PX / 3) * deltaDir[0] - - (TICK_SEMI_HEIGHT + 5) * deltaDir[1] - ), - Math.round( - coord[1] + - (FONT_SIZE_PX / 3) * deltaDir[1] - - (TICK_SEMI_HEIGHT + 5) * deltaDir[0] - ), + tick.label, + Math.max(2, coord[0] - tickLength - 4), + textY, context, - angleDeg, - `${useDeltaLabel ? "normal" : "bold"} ${fontSize}px sans-serif`, - textAlign, - false, - fillBackground + 0, + font, + "right", + true, + false ); - return { - absoluteLabel, - absoluteBp: preBP, - }; + } + + private formatBpLabel(bp: number, precision: number): string { + const value = Math.max(0, Math.round(bp)); + const units: Array<[number, string]> = [ + [1_000_000_000, "G"], + [1_000_000, "M"], + [1_000, "K"], + ]; + const [scale, suffix] = + units.find(([candidate]) => value >= candidate) ?? [1, ""]; + const scaled = value / scale; + const digits = precision > 0 && scaled < 100 ? precision : 0; + return `${scaled.toFixed(digits).replace(/\.0+$/, "")}${suffix}`; + } + + private absoluteLabelUnit(maxBp: number): number { + if (maxBp >= 1_000_000_000) { + return 1_000_000_000; + } + if (maxBp >= 1_000_000) { + return 1_000_000; + } + if (maxBp >= 1_000) { + return 1_000; + } + return 1; + } + + private roundDownToUnit(bp: number, unit: number): number { + const safeUnit = Math.max(1, Math.round(unit)); + return Math.floor(Math.max(0, Math.round(bp)) / safeUnit) * safeUnit; + } + + private clamp(value: number, min: number, max: number): number { + return Math.max(min, Math.min(max, value)); } protected drawRotatedText( @@ -633,10 +733,13 @@ class RulerControl extends Control { this.setFillStrokeContrastColors(context); - context.fillText(text, 0, 0); if (stroke) { + const fontSizeMatch = font.match(/(\d+(?:\.\d+)?)px/); + const fontSize = fontSizeMatch ? Number.parseFloat(fontSizeMatch[1]) : 10; + context.lineWidth = Math.max(2, fontSize / 5); context.strokeText(text, 0, 0); } + context.fillText(text, 0, 0); context.restore(); } diff --git a/src/app/core/interactions/SplitRulesInteraction.ts b/src/app/core/interactions/SplitRulesInteraction.ts index 162a543..9692fc5 100644 --- a/src/app/core/interactions/SplitRulesInteraction.ts +++ b/src/app/core/interactions/SplitRulesInteraction.ts @@ -33,7 +33,8 @@ import { Coordinate } from "ol/coordinate"; import MapBrowserEventType from "ol/MapBrowserEventType"; import CommonUtils from "@/CommonUtils"; import TileLayer from "ol/layer/Tile"; -import { transform } from "ol/proj"; +import type { LayerResolutionDescriptor } from "../mapmanagers/resolutionModel"; +import type { VersionedXYZContactMapSource } from "../VersionedXYZSource"; interface Options extends PIOpts { mapManager: ContactMapManager; @@ -80,6 +81,84 @@ class SplitRulesInteraction extends PointerInteraction { this.ruleFeatures = [undefined, undefined]; } + private getHoveredDataLayer( + pixel: Pixel + ): TileLayer | undefined { + const layers = + this.options.mapManager.viewAndLayersManager.layersHolder.hicDataLayers.filter( + (layer) => layer.getData(pixel) + ); + + return layers + .filter( + (layer): layer is TileLayer => + layer instanceof TileLayer + ) + .sort( + (left, right) => (right.getZIndex() ?? 0) - (left.getZIndex() ?? 0) + )[0]; + } + + private getLayerResolutionDescriptor( + layer: TileLayer | undefined + ): LayerResolutionDescriptor | undefined { + if (!layer) { + return undefined; + } + const bpResolution = Number(layer.get("bpResolution")); + const pixelResolution = Number(layer.get("pixelResolution")); + if (!Number.isFinite(bpResolution) || !Number.isFinite(pixelResolution)) { + return undefined; + } + return { + sourceName: + layer.get("sourceName") === "SECONDARY" ? "SECONDARY" : "PRIMARY", + bpResolution, + pixelResolution, + layerResolutionBorders: { + minResolutionInclusive: Number.NEGATIVE_INFINITY, + maxResolutionExclusive: Number.POSITIVE_INFINITY, + }, + imageSizeIndex: 0, + }; + } + + private getGuidanceResolutionDescriptor( + fallback?: LayerResolutionDescriptor + ): LayerResolutionDescriptor { + const layersManager = this.mapManager.viewAndLayersManager; + const viewResolution = this.getMap()?.getView().getResolution(); + if (Number.isFinite(viewResolution)) { + return layersManager.getGuidanceResolutionDescriptorForViewResolution( + viewResolution as number + ); + } + return layersManager.ensureGuidanceResolutionDescriptor(fallback); + } + + private getDimensionHolderForDescriptor( + descriptor: LayerResolutionDescriptor + ) { + return this.mapManager.viewAndLayersManager.getDimensionHolderForSource( + descriptor.sourceName + ); + } + + private coordinateToPxAtResolution( + coordinate: Coordinate, + descriptor: LayerResolutionDescriptor + ): Coordinate { + const fixedCoordinates = coordinate.map((value) => + Math.ceil(value / descriptor.pixelResolution) + ); + return this.getDimensionHolderForDescriptor( + descriptor + ).clampPxCoordinatesAtResolution( + [Math.floor(fixedCoordinates[0]), -Math.floor(fixedCoordinates[1])], + descriptor.bpResolution + ) as Coordinate; + } + protected handlePointerMove(mapBrowserEvent: MapBrowserEvent): void { const pixel = mapBrowserEvent.pixel; @@ -91,51 +170,9 @@ class SplitRulesInteraction extends PointerInteraction { if (!coordinate) { return; } - - const layers = - this.options.mapManager.viewAndLayersManager.layersHolder.hicDataLayers.filter( - (l) => l.getData(pixel) - ); - - const hovered_layer = - layers.length === 0 - ? null - : layers - .filter((l) => l instanceof TileLayer) - .sort((l1, l2) => (l1.getZIndex() ?? 0) - (l2.getZIndex() ?? 0))[0]; - if (!hovered_layer) { + if (!this.getHoveredDataLayer(pixel)) { return; } - const layer_projection = hovered_layer.getSource()?.getProjection(); - if (!layer_projection) { - return; - } - const pixelResolution = hovered_layer.get("pixelResolution"); - const fixed_coordinates = transform( - coordinate, - map.getView().getProjection(), - layer_projection - ).map((c) => Math.ceil(c / pixelResolution)); - const bpResolutionString = hovered_layer.get("bpResolution"); - const bpResolution = Number(bpResolutionString); - const int_coordinates_px = - this.mapManager.contigDimensionHolder.clampPxCoordinatesAtResolution( - [Math.floor(fixed_coordinates[0]), -Math.floor(fixed_coordinates[1])], - bpResolution - ); - - const coordinateFromPixel = this.getMap()?.getCoordinateFromPixelInternal( - mapBrowserEvent.pixel - ) ?? [0, 0]; - - console.log( - "pixel:", - mapBrowserEvent.pixel, - "coordinateFromPixel:", - coordinateFromPixel, - "fixed integer coordinates:", - int_coordinates_px - ); this.createOrUpdateRules(pixel); } @@ -151,15 +188,14 @@ class SplitRulesInteraction extends PointerInteraction { // console.log("SplitRulesInteraction: createOrUpdateRules pixel=", pixel); let [verticalRuleFeature, horizontalRuleFeature] = this.ruleFeatures; - const bpResolution = - this.mapManager.viewAndLayersManager.currentViewState.resolutionDesciptor - .bpResolution; - const pixelResolution = - this.mapManager.viewAndLayersManager.currentViewState.resolutionDesciptor - .pixelResolution; - const contigCount = this.mapManager.contigDimensionHolder.contig_count; - const prefixSumPx = - this.mapManager.contigDimensionHolder.prefix_sum_px.get(bpResolution); + const guidanceDescriptor = this.getGuidanceResolutionDescriptor(); + const dimensionHolder = + this.getDimensionHolderForDescriptor(guidanceDescriptor); + const pixelResolution = guidanceDescriptor.pixelResolution; + const contigCount = dimensionHolder.contig_count; + const prefixSumPx = dimensionHolder.prefix_sum_px.get( + guidanceDescriptor.bpResolution + ); const mapSizePx = prefixSumPx ? prefixSumPx[contigCount] : 1000; const mapSizeProj = mapSizePx * pixelResolution; @@ -231,42 +267,18 @@ class SplitRulesInteraction extends PointerInteraction { return true; } - const layers = - this.options.mapManager.viewAndLayersManager.layersHolder.hicDataLayers.filter( - (l) => l.getData(pixel) - ); - - const hovered_layer = - layers.length === 0 - ? null - : layers - .filter((l) => l instanceof TileLayer) - .sort( - (l1, l2) => (l1.getZIndex() ?? 0) - (l2.getZIndex() ?? 0) - )[0]; - if (!hovered_layer) { - return true; - } - const layer_projection = hovered_layer.getSource()?.getProjection(); - if (!layer_projection) { + const hoveredLayer = this.getHoveredDataLayer(pixel); + if (!hoveredLayer) { return true; } - const pixelResolution = hovered_layer.get("pixelResolution"); - const fixed_coordinates = transform( + const fallbackDescriptor = + this.getLayerResolutionDescriptor(hoveredLayer); + const guidanceDescriptor = + this.getGuidanceResolutionDescriptor(fallbackDescriptor); + const int_coordinates_px = this.coordinateToPxAtResolution( coordinate, - map.getView().getProjection(), - layer_projection - ).map((c) => Math.ceil(c / pixelResolution)); - const bpResolutionString = hovered_layer.get("bpResolution"); - const bpResolution = Number(bpResolutionString); - const int_coordinates_px = - this.mapManager.contigDimensionHolder.clampPxCoordinatesAtResolution( - [ - Math.floor(fixed_coordinates[0]), - -Math.floor(fixed_coordinates[1]), - ], - bpResolution - ); + guidanceDescriptor + ); this.setActive(false); this.ruleFeatures.forEach((f) => { @@ -277,8 +289,7 @@ class SplitRulesInteraction extends PointerInteraction { this.ruleFeatures = [undefined, undefined]; this.options.selectionCallback( int_coordinates_px, - this.mapManager.viewAndLayersManager.currentViewState - .resolutionDesciptor.bpResolution + guidanceDescriptor.bpResolution ); return false; } diff --git a/src/app/core/mapmanagers/ContactMapManager.ts b/src/app/core/mapmanagers/ContactMapManager.ts index 80b785b..433b41d 100644 --- a/src/app/core/mapmanagers/ContactMapManager.ts +++ b/src/app/core/mapmanagers/ContactMapManager.ts @@ -33,7 +33,6 @@ import { transform, transformExtent } from "ol/proj"; import { getCenter, getHeight, getWidth, intersects } from "ol/extent"; import { unByKey } from "ol/Observable"; import type { EventsKey } from "ol/events"; -import { toSI } from "display-si"; import ContigDimensionHolder from "./ContigDimensionHolder"; import { ScaffoldHolder } from "./ScaffoldHolder"; import { HiCViewAndLayersManager } from "./HiCViewAndLayersManager"; @@ -406,8 +405,16 @@ class ContactMapManager { const y = tile.row * tileSize; const tileWidth = Math.min(tileSize, width - x); const tileHeight = Math.min(tileSize, height - y); + const imageHref = + tileWidth < tileSize || tileHeight < tileSize + ? await this.cropTileImageDataUrl( + String(data.image), + tileWidth, + tileHeight + ) + : String(data.image); svgImages.push( - `` + `` ); } completed += 1; @@ -474,18 +481,60 @@ class ContactMapManager { const blob = new Blob([svg], { type: "image/svg+xml" }); const url = URL.createObjectURL(blob); try { - const image = new Image(); - await new Promise((resolve, reject) => { - image.onload = () => resolve(); - image.onerror = (error) => reject(error); - image.src = url; - }); - return image; + return await this.loadImageUrl(url); } finally { URL.revokeObjectURL(url); } } + private async loadImageUrl(url: string): Promise { + const image = new Image(); + await new Promise((resolve, reject) => { + image.onload = () => resolve(); + image.onerror = (error) => reject(error); + image.src = url; + }); + return image; + } + + private async cropTileImageDataUrl( + dataUrl: string, + targetWidth: number, + targetHeight: number + ): Promise { + const width = Math.max(1, Math.round(targetWidth)); + const height = Math.max(1, Math.round(targetHeight)); + const image = await this.loadImageUrl(dataUrl); + const naturalWidth = image.naturalWidth || image.width; + const naturalHeight = image.naturalHeight || image.height; + if (naturalWidth === width && naturalHeight === height) { + return dataUrl; + } + + const canvas = document.createElement("canvas"); + canvas.width = width; + canvas.height = height; + const context = canvas.getContext("2d"); + if (!context) { + return dataUrl; + } + context.clearRect(0, 0, width, height); + const sourceWidth = Math.min(width, Math.max(1, naturalWidth)); + const sourceHeight = Math.min(height, Math.max(1, naturalHeight)); + context.drawImage( + image, + 0, + 0, + sourceWidth, + sourceHeight, + 0, + 0, + sourceWidth, + sourceHeight + ); + return canvas.toDataURL("image/png"); + } + private drawOutlinedCanvasText( context: CanvasRenderingContext2D, text: string, @@ -529,12 +578,12 @@ class ContactMapManager { previousRawLabel: string | null, previousBpValue: number | null ): { text: string; compact: boolean; rawLabel: string } { - const rawLabel = toSI(Math.max(0, Math.round(bpValue))); + const rawLabel = this.formatBpLabel(bpValue, 0); if (previousRawLabel === rawLabel && previousBpValue !== null) { const delta = Math.max(0, Math.round(bpValue - previousBpValue)); if (delta > 0) { return { - text: `+${toSI(delta)}`, + text: this.formatBpLabel(bpValue, 1), compact: true, rawLabel, }; @@ -547,6 +596,20 @@ class ContactMapManager { }; } + private formatBpLabel(bpValue: number, precision: number): string { + const value = Math.max(0, Math.round(bpValue)); + const units: Array<[number, string]> = [ + [1_000_000_000, "G"], + [1_000_000, "M"], + [1_000, "K"], + ]; + const [scale, suffix] = + units.find(([candidate]) => value >= candidate) ?? [1, ""]; + const scaled = value / scale; + const digits = precision > 0 && scaled < 100 ? precision : 0; + return `${scaled.toFixed(digits).replace(/\.0+$/, "")}${suffix}`; + } + private drawFullExtentExportRulers( context: CanvasRenderingContext2D, options: { @@ -935,11 +998,7 @@ class ContactMapManager { ``; } const blob = new Blob([svg], { type: "image/svg+xml" }); - const a = document.createElement("a"); - a.download = `${this.options.filename}.svg`; - a.href = URL.createObjectURL(blob); - a.click(); - URL.revokeObjectURL(a.href); + await this.saveExportBlob(blob, `${this.options.filename}.svg`); } public async exportCurrentMapPng( @@ -960,18 +1019,15 @@ class ContactMapManager { if (options?.includeWorkspaceComposite === true) { progressCallback?.(1); } - await new Promise((resolve) => { + await new Promise((resolve, reject) => { canvas.toBlob((blob) => { if (!blob) { resolve(); return; } - const a = document.createElement("a"); - a.download = `${this.options.filename}.png`; - a.href = URL.createObjectURL(blob); - a.click(); - URL.revokeObjectURL(a.href); - resolve(); + this.saveExportBlob(blob, `${this.options.filename}.png`) + .then(resolve) + .catch(reject); }, "image/png"); }); } @@ -1003,7 +1059,53 @@ class ContactMapManager { format: [canvas.width, canvas.height], }); pdf.addImage(dataUrl, "PNG", 0, 0, canvas.width, canvas.height); - pdf.save(`${this.options.filename}.pdf`); + const blob = pdf.output("blob"); + await this.saveExportBlob(blob, `${this.options.filename}.pdf`); + } + + private async saveExportBlob(blob: Blob, filename: string): Promise { + const sanitizedFilename = ContactMapManager.sanitizeDownloadFilename(filename); + const desktopBridge = (window as unknown as { + hictDesktop?: { + saveExport?: (payload: { + filename: string; + bytes: number[]; + }) => Promise | unknown; + }; + }).hictDesktop; + if (typeof desktopBridge?.saveExport === "function") { + const bytes = Array.from(new Uint8Array(await blob.arrayBuffer())); + await Promise.resolve( + desktopBridge.saveExport({ filename: sanitizedFilename, bytes }) + ); + return; + } + + const tauriBridge = (window as unknown as { + __TAURI__?: { + core?: { + invoke?: (command: string, args?: Record) => Promise; + }; + invoke?: (command: string, args?: Record) => Promise; + }; + }).__TAURI__; + const invoke = tauriBridge?.core?.invoke ?? tauriBridge?.invoke; + if (typeof invoke === "function") { + const bytes = Array.from(new Uint8Array(await blob.arrayBuffer())); + await invoke("save_export", { filename: sanitizedFilename, bytes }); + return; + } + + const a = document.createElement("a"); + a.download = sanitizedFilename; + a.href = URL.createObjectURL(blob); + a.click(); + URL.revokeObjectURL(a.href); + } + + private static sanitizeDownloadFilename(filename: string): string { + const safe = filename.replace(/[\\/:*?"<>|\u0000-\u001f]/g, "_").trim(); + return safe.length > 0 ? safe : "hict-export.bin"; } private exportTracksSvg(bpResolution: number): string { @@ -1021,7 +1123,8 @@ class ContactMapManager { const scaffoldTrack = this.viewAndLayersManager.track2DHolder.scaffoldBordersTrack; const pixelResolution = - this.viewAndLayersManager.resolutionToPixelResolution.get(bpResolution) ?? 1; + this.viewAndLayersManager.getPixelResolutionForBpResolution(bpResolution) ?? + 1; if (!Number.isFinite(pixelResolution) || pixelResolution <= 0) { return ""; } @@ -1478,10 +1581,22 @@ class ContactMapManager { if (!mainMapSize) { return; } - const mainExtent = this.map.getView().calculateExtent(mainMapSize); + const mainView = this.map.getView(); + const mainCenter = mainView.getCenter(); + const mainResolution = mainView.getResolution(); + if ( + !mainCenter || + mainCenter.length < 2 || + !mainCenter.every((value) => Number.isFinite(value)) || + mainResolution === undefined || + !Number.isFinite(mainResolution) + ) { + return; + } + const mainExtent = mainView.calculateExtent(mainMapSize); const transformedMainExtent = transformExtent( mainExtent, - this.map.getView().getProjection(), + mainView.getProjection(), minimapProjection ); if (!transformedMainExtent.every((value) => Number.isFinite(value))) { @@ -1504,7 +1619,9 @@ class ContactMapManager { bounds: [number, number, number, number] ): [number, number, number, number] { const minimapResolution = this.minimap?.getView().getResolution() ?? 1; - const inset = Math.max(1e-6, Math.abs(minimapResolution) * 3); + // Keep the viewport stroke inside the minimap projection. Vector strokes + // clipped exactly at the projection boundary become invisible at map edges. + const inset = Math.max(1e-6, Math.abs(minimapResolution) * 5); const maxInsetX = Math.max(0, (getWidth(bounds) - 1e-6) / 2); const maxInsetY = Math.max(0, (getHeight(bounds) - 1e-6) / 2); const insetX = Math.min(inset, maxInsetX); diff --git a/src/app/core/mapmanagers/ContigDimensionHolder.ts b/src/app/core/mapmanagers/ContigDimensionHolder.ts index 6ae9743..e3b002e 100644 --- a/src/app/core/mapmanagers/ContigDimensionHolder.ts +++ b/src/app/core/mapmanagers/ContigDimensionHolder.ts @@ -63,6 +63,59 @@ export default class ContigDimensionHolder { console.log("Contig dimension holder: ", this); } + public ensureResolution(resolution: number): void { + if (!Number.isFinite(resolution) || resolution <= 0) { + return; + } + if (!this.resolutions.includes(resolution)) { + this.resolutions.push(resolution); + this.resolutions.sort((a, b) => a - b); + } + for (const descriptor of this.contigDescriptors) { + if (!descriptor.contigLengthBins.has(resolution)) { + descriptor.contigLengthBins.set( + resolution, + Math.max(1, Math.ceil(descriptor.contigLengthBp / resolution)) + ); + } + if (!descriptor.presenceAtResolution.has(resolution)) { + descriptor.presenceAtResolution.set( + resolution, + this.inferPresenceAtResolution(descriptor, resolution) + ); + } + } + this.updatePrefixSumBins(); + this.updatePrefixSumPixels(); + } + + private inferPresenceAtResolution( + descriptor: ContigDescriptor, + resolution: number + ): ContigHideType { + let bestResolution: number | undefined = undefined; + let bestDistance = Number.POSITIVE_INFINITY; + descriptor.presenceAtResolution.forEach((_hideType, candidate) => { + if (!Number.isFinite(candidate) || candidate <= 0) { + return; + } + const distance = Math.abs(Math.log(candidate / resolution)); + if ( + distance < bestDistance || + (distance === bestDistance && + (bestResolution === undefined || candidate < bestResolution)) + ) { + bestResolution = candidate; + bestDistance = distance; + } + }); + + return bestResolution === undefined + ? ContigHideType.AUTO_SHOWN + : descriptor.presenceAtResolution.get(bestResolution) ?? + ContigHideType.AUTO_SHOWN; + } + prefix_sum_bp: number[] = []; prefix_sum_bins: Map = new Map(); prefix_sum_px: Map = new Map(); @@ -480,6 +533,39 @@ export default class ContigDimensionHolder { return this.contigDescriptors[contig_ord].contigName; } + public getContigLocusByBp(bp: number): { + contigId: number; + contigName: string; + inContigBp: number; + contigLengthBp: number; + } { + const contigOrd = this.getContigOrderByBp_internal(bp); + const descriptor = this.contigDescriptors[contigOrd]; + const contigStartBp = this.prefix_sum_bp[contigOrd]; + return { + contigId: descriptor.contigId, + contigName: descriptor.contigName, + inContigBp: CommonUtils.clamp( + bp - contigStartBp, + 0, + Math.max(0, descriptor.contigLengthBp - 1) + ), + contigLengthBp: descriptor.contigLengthBp, + }; + } + + public getContigLocusByPx( + px: number, + resolution: number + ): { + contigId: number; + contigName: string; + inContigBp: number; + contigLengthBp: number; + } { + return this.getContigLocusByBp(this.getStartBpOfPx(px, resolution)); + } + public isBpVisibleAtResolution(bp: number, resolution: number): boolean { if (this.contig_count <= 0) { return false; diff --git a/src/app/core/mapmanagers/HiCViewAndLayersManager.ts b/src/app/core/mapmanagers/HiCViewAndLayersManager.ts index 5da6c31..e215939 100644 --- a/src/app/core/mapmanagers/HiCViewAndLayersManager.ts +++ b/src/app/core/mapmanagers/HiCViewAndLayersManager.ts @@ -19,12 +19,12 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import bounds from "binary-search-bounds"; import { Extent, Select } from "ol/interaction"; import { Projection } from "ol/proj"; import type Layer from "ol/layer/Layer"; import type { ContactMapManager } from "./ContactMapManager"; import { Collection, Feature, View } from "ol"; +import type { ViewOptions } from "ol/View"; import type { Geometry } from "ol/geom"; import TileLayer from "ol/layer/Tile"; import VectorLayer from "ol/layer/Vector"; @@ -61,18 +61,19 @@ import { CurrentSignalRangeResponse } from "../net/api/response"; import { SplitRulesInteraction } from "../interactions/SplitRulesInteraction"; import { OverviewMap } from "ol/control"; import { RulerControl } from "../controls/RulerControl"; - -interface LayerResolutionBorders { - minResolutionInclusive: number; - maxResolutionExclusive: number; -} - -interface LayerResolutionDescriptor { - bpResolution: number; - pixelResolution: number; - layerResolutionBorders: LayerResolutionBorders; - imageSizeIndex: number; -} +import type { SecondarySourceCompatibility } from "../net/api/RequestManager"; +import { + buildSourceResolutionDescriptorSet, + calculateMaximumScaledImageSize as calculateMaximumScaledImageSizeForSets, + getNavigationResolutionModel as getNavigationResolutionModelForSets, + getFinestVisibleResolutionDescriptor, + getResolutionDescriptorForViewResolution, + getVectorResolutionTuples as getVectorResolutionTuplesForSets, + type LayerResolutionBorders, + type LayerResolutionDescriptor, + type MatrixSourceName, + type SourceResolutionDescriptorSet, +} from "./resolutionModel"; interface SelectionBorders { leftContigOrderInclusive?: number; @@ -98,12 +99,16 @@ interface CurrentHiCViewState { interface LayersHolder { readonly hicDataLayers: Layer[]; + readonly primaryHiCDataLayers: Layer[]; + readonly secondaryHiCDataLayers: Layer[]; readonly track2DLayers: Layer[]; readonly annotationLayers: Layer[]; readonly contigBordersLayers: Layer[]; readonly contigTranslocationArrowsLayers: Layer[]; readonly scaffoldBordersLayers: Layer[]; readonly bpResolutionToHiCDataLayer: Map; + readonly primaryBpResolutionToHiCDataLayer: Map; + readonly secondaryBpResolutionToHiCDataLayer: Map; readonly bpResolutionToAnnotationLayer: Map; readonly bpResolutionToContigBordersLayer: Map; readonly bpResolutionToContigTranslocationArrowsLayer: Map; @@ -132,12 +137,16 @@ class HiCViewAndLayersManager { // protected readonly contigVectorLayers: Layer[] = []; public readonly layersHolder: LayersHolder = { hicDataLayers: [], + primaryHiCDataLayers: [], + secondaryHiCDataLayers: [], track2DLayers: [], annotationLayers: [], contigBordersLayers: [], contigTranslocationArrowsLayers: [], scaffoldBordersLayers: [], bpResolutionToHiCDataLayer: new Map(), + primaryBpResolutionToHiCDataLayer: new Map(), + secondaryBpResolutionToHiCDataLayer: new Map(), bpResolutionToAnnotationLayer: new Map(), bpResolutionToContigBordersLayer: new Map(), bpResolutionToContigTranslocationArrowsLayer: new Map(), @@ -145,6 +154,10 @@ class HiCViewAndLayersManager { }; protected readonly view: View; public tileSize: number; + private primaryResolutionSet: SourceResolutionDescriptorSet; + private secondaryResolutionSet?: SourceResolutionDescriptorSet; + private wheelZoomInteraction?: ContigMouseWheelZoom; + private coordinateBaseBp: number; public selectionCollections: { readonly selectedContigFeatures: Collection>; @@ -211,59 +224,24 @@ class HiCViewAndLayersManager { public readonly useVectorImageLayer: boolean = false ) { this.mapManager = mapManager; - this.imageSizes = response.matrixSizesBins; - this.pixelResolutionSet = response.pixelResolutions; - this.resolutions = response.resolutions; this.tileSize = mapManager.getOptions().tileSize; - - for (let i = 0; i < this.resolutions.length; ++i) { - this.resolutionToPixelResolution.set( - this.resolutions[i], - this.pixelResolutionSet[i] - ); - - this.imageSizeScaled.push( - this.imageSizes[i] * this.pixelResolutionSet[i] - ); - this.resolutionTuples.push({ - bpResolution: this.resolutions[i], - pixelResolution: this.pixelResolutionSet[i], - layerResolutionBorders: { - minResolutionInclusive: Number.NaN, - maxResolutionExclusive: Number.NaN, - }, - imageSizeIndex: i, - }); - } - - this.resolutionTuples.sort( - (a, b) => a.pixelResolution - b.pixelResolution - ); - for (let i = 0; i < this.resolutionTuples.length; ++i) { - const layerResolutionBorders: LayerResolutionBorders = { - minResolutionInclusive: - i === 0 - ? Number.NEGATIVE_INFINITY - : this.resolutionTuples[i].pixelResolution, - maxResolutionExclusive: - i === this.resolutionTuples.length - 1 - ? Number.POSITIVE_INFINITY - : this.resolutionTuples[i + 1].pixelResolution, - }; - this.resolutionTuples[i].layerResolutionBorders = layerResolutionBorders; - this.layerResolutionBorders.set( - this.resolutionTuples[i].bpResolution, - layerResolutionBorders - ); - } - - this.resolutionTuples.sort( - (a, b) => - a.layerResolutionBorders.minResolutionInclusive - - b.layerResolutionBorders.minResolutionInclusive + const primaryResolutions = response.resolutions + .map((value) => Number(value)) + .filter((value) => Number.isFinite(value) && value > 0); + this.coordinateBaseBp = + primaryResolutions.length > 0 + ? Math.max(1, Math.min(...primaryResolutions)) + : 1; + this.primaryResolutionSet = this.buildResolutionDescriptorSet( + "PRIMARY", + response.resolutions, + response.matrixSizesBins ); + this.applyPrimaryResolutionSet(this.primaryResolutionSet); // Calculate extents for projection: - const maximum_scaled_image_size = Math.max(...this.imageSizes); + const maximum_scaled_image_size = this.calculateMaximumScaledImageSize( + this.primaryResolutionSet + ); const maximum_global_extent = [ 0, -maximum_scaled_image_size, @@ -280,30 +258,22 @@ class HiCViewAndLayersManager { global: false, getPointResolution: (resolution) => resolution, }); - const minPixelResolution = Math.min(...this.pixelResolutionSet); - const maxPixelResolution = Math.max(...this.pixelResolutionSet); - const overzoomFactor = 1024; - const minResolution = minPixelResolution / overzoomFactor; - const maxResolution = maxPixelResolution * overzoomFactor; // Define view: this.view = new View({ + ...this.createViewOptions(maximum_global_extent), center: [ this.pixelProjection.getExtent()[0], this.pixelProjection.getExtent()[3], ], - resolution: maxPixelResolution, - minResolution: minResolution, - maxResolution: maxResolution, - constrainResolution: false, - zoomFactor: 2, - showFullExtent: true, - constrainOnlyCenter: true, - projection: this.pixelProjection, - extent: maximum_global_extent, + resolution: + this.pixelResolutionSet.length > 0 + ? Math.max(...this.pixelResolutionSet) + : 1, }); this.currentViewState = { resolutionDesciptor: { + sourceName: "PRIMARY", bpResolution: Number.NaN, layerResolutionBorders: { maxResolutionExclusive: Number.NaN, @@ -331,12 +301,8 @@ class HiCViewAndLayersManager { }; this.track2DHolder.tracks2D.push(this.track2DHolder.annotationTrack); - this.track2DHolder.contigBordersTrack.setNamePlacement( - NamePlacement.TOP - ); - this.track2DHolder.scaffoldBordersTrack.setNamePlacement( - NamePlacement.TOP - ); + this.track2DHolder.contigBordersTrack.setNamePlacement(NamePlacement.TOP); + this.track2DHolder.scaffoldBordersTrack.setNamePlacement(NamePlacement.TOP); this.deferredInitializationInteractions = { scissorsGuideInteraction: undefined, @@ -406,6 +372,165 @@ class HiCViewAndLayersManager { this.updateCurrentHiCViewState(); } + private buildResolutionDescriptorSet( + sourceName: MatrixSourceName, + resolutionsRaw: readonly number[], + imageSizesRaw: readonly number[] + ): SourceResolutionDescriptorSet { + resolutionsRaw + .map((value) => Number(value)) + .filter((value) => Number.isFinite(value) && value > 0) + .forEach((resolution) => + this.mapManager.contigDimensionHolder.ensureResolution(resolution) + ); + return buildSourceResolutionDescriptorSet( + sourceName, + resolutionsRaw, + imageSizesRaw, + this.coordinateBaseBp + ); + } + + private applyPrimaryResolutionSet(set: SourceResolutionDescriptorSet): void { + this.imageSizes.length = 0; + this.imageSizes.push(...set.imageSizes); + this.pixelResolutionSet.length = 0; + this.pixelResolutionSet.push(...set.pixelResolutionSet); + this.resolutions.length = 0; + this.resolutions.push(...set.resolutions); + this.resolutionToPixelResolution.clear(); + set.resolutionToPixelResolution.forEach((value, key) => + this.resolutionToPixelResolution.set(key, value) + ); + this.layerResolutionBorders.clear(); + set.layerResolutionBorders.forEach((value, key) => + this.layerResolutionBorders.set(key, value) + ); + this.resolutionTuples.length = 0; + this.resolutionTuples.push(...set.resolutionTuples); + this.imageSizeScaled.length = 0; + set.imageSizes.forEach((imageSize, i) => + this.imageSizeScaled.push(imageSize * set.pixelResolutionSet[i]) + ); + } + + private calculateMaximumScaledImageSize( + primarySet: SourceResolutionDescriptorSet, + secondarySet?: SourceResolutionDescriptorSet + ): number { + return calculateMaximumScaledImageSizeForSets(primarySet, secondarySet); + } + + public getNavigationResolutionModel(): { + resolutions: number[]; + pixelResolutionSet: number[]; + } { + return getNavigationResolutionModelForSets( + this.primaryResolutionSet, + this.secondaryResolutionSet + ); + } + + public getVectorResolutionTuples(): LayerResolutionDescriptor[] { + return getVectorResolutionTuplesForSets( + this.primaryResolutionSet, + this.secondaryResolutionSet + ); + } + + private updateWheelZoomResolutionModel(): void { + const navigationModel = this.getNavigationResolutionModel(); + this.wheelZoomInteraction?.setResolutionModel( + navigationModel.resolutions, + navigationModel.pixelResolutionSet, + this.layersHolder.hicDataLayers + ); + } + + public getPixelResolutionForBpResolution( + bpResolution: number + ): number | undefined { + return ( + this.primaryResolutionSet.resolutionToPixelResolution.get(bpResolution) ?? + this.secondaryResolutionSet?.resolutionToPixelResolution.get( + bpResolution + ) ?? + this.resolutionToPixelResolution.get(bpResolution) ?? + (Number.isFinite(bpResolution) && bpResolution > 0 + ? bpResolution / this.coordinateBaseBp + : undefined) + ); + } + + private createViewOptions(extent: number[]): ViewOptions { + const navigationModel = this.getNavigationResolutionModel(); + const minPixelResolution = + navigationModel.pixelResolutionSet.length > 0 + ? Math.min(...navigationModel.pixelResolutionSet) + : 1; + const maxPixelResolution = + navigationModel.pixelResolutionSet.length > 0 + ? Math.max(...navigationModel.pixelResolutionSet) + : 1; + const maximumScaledImageSize = this.calculateMaximumScaledImageSize( + this.primaryResolutionSet, + this.secondaryResolutionSet + ); + const overzoomFactor = 1024; + const minResolution = Math.max( + 1 / overzoomFactor, + minPixelResolution / overzoomFactor + ); + const maxResolution = Math.max( + maxPixelResolution * overzoomFactor, + maximumScaledImageSize + ); + return { + minResolution, + maxResolution, + constrainResolution: false, + zoomFactor: 2, + showFullExtent: true, + constrainOnlyCenter: true, + projection: this.pixelProjection, + extent, + }; + } + + private updateProjectionAndViewExtent(scalePreservedView = 1): void { + const previousCenter = this.view.getCenter(); + const previousResolution = this.view.getResolution(); + const maximumScaledImageSize = this.calculateMaximumScaledImageSize( + this.primaryResolutionSet, + this.secondaryResolutionSet + ); + const extent = [0, -maximumScaledImageSize, maximumScaledImageSize, 0]; + this.pixelProjection.setExtent(extent); + this.view.applyOptions_(this.createViewOptions(extent)); + + const nextCenter = + previousCenter && + previousCenter.length >= 2 && + previousCenter.every((value) => Number.isFinite(value)) + ? ([ + previousCenter[0] * scalePreservedView, + previousCenter[1] * scalePreservedView, + ] as [number, number]) + : ([extent[0], extent[3]] as [number, number]); + const nextResolution = + previousResolution !== undefined && Number.isFinite(previousResolution) + ? previousResolution * scalePreservedView + : Math.max( + ...this.getNavigationResolutionModel().pixelResolutionSet, + 1 + ); + + this.view.setCenter(nextCenter); + if (Number.isFinite(nextResolution) && nextResolution > 0) { + this.view.setResolution(nextResolution); + } + } + public async onViewResolutionChanged(): Promise { this.updateCurrentHiCViewState(); await Promise.all(this.resolutionChangedAsyncSubscribers.map((fn) => fn())); @@ -563,7 +688,9 @@ class HiCViewAndLayersManager { } public onScaffoldLabelOffsetMultiplierChanged(multiplier: number): void { - this.track2DHolder.scaffoldBordersTrack.setLabelOffsetMultiplier(multiplier); + this.track2DHolder.scaffoldBordersTrack.setLabelOffsetMultiplier( + multiplier + ); this.reloadTracks(); } @@ -702,13 +829,11 @@ class HiCViewAndLayersManager { " is it ContigBordersTrack2D: ", track instanceof ContigBordersTrack2D ); - this.resolutionTuples.forEach( - ({ bpResolution, pixelResolution, layerResolutionBorders }) => { + this.getVectorResolutionTuples().forEach( + ({ bpResolution, pixelResolution }) => { const boundingBoxPolygonFeatures = track.features.get(bpResolution); if (!boundingBoxPolygonFeatures) { - throw new Error( - `Track ${track.trackDescriptor.name} has no features at resolution ${bpResolution}` - ); + return; } const vectorSource = new VectorSource(); vectorSource.addFeatures(boundingBoxPolygonFeatures); @@ -718,13 +843,12 @@ class HiCViewAndLayersManager { source: vectorSource, zIndex: this.layersZIndices.TRACK_2D_LAYER_Z_INDEX + track.options.zIndex, - minResolution: layerResolutionBorders.minResolutionInclusive, - maxResolution: layerResolutionBorders.maxResolutionExclusive, }); + vectorLayer.setVisible(false); vectorLayer.set("bpResolution", bpResolution); vectorLayer.set( "pixelResolution", - this.resolutionToPixelResolution.get(bpResolution) + this.getPixelResolutionForBpResolution(bpResolution) ); layersCollection.push(vectorLayer); this.mapManager.getMap().addLayer(vectorLayer); @@ -733,15 +857,30 @@ class HiCViewAndLayersManager { } public initializeMapsDataLayers() { - // Add layers to the view (create tile grid -> create source -> create layer -> map.addLayer): - for (let i = 0; i < this.imageSizes.length; ++i) { - // Prepare parameters: - const layerResolution = this.resolutions[i]; - const layerPixelResolution = this.pixelResolutionSet[i]; - const layer_image_size = this.imageSizes[i] * layerPixelResolution; - const scaled_layer_extent = [0, -layer_image_size, layer_image_size, 0]; + this.addSourceHiCDataLayers(this.primaryResolutionSet); + this.syncLayerVisibilityForCurrentResolution(); + } + + private addSourceHiCDataLayers(set: SourceResolutionDescriptorSet): void { + const layersCollection = + set.sourceName === "PRIMARY" + ? this.layersHolder.primaryHiCDataLayers + : this.layersHolder.secondaryHiCDataLayers; + const resolutionMap = + set.sourceName === "PRIMARY" + ? this.layersHolder.primaryBpResolutionToHiCDataLayer + : this.layersHolder.secondaryBpResolutionToHiCDataLayer; + const zIndex = + this.layersZIndices.HIC_MAP_LAYER_Z_INDEX + + (set.sourceName === "SECONDARY" ? 1 : 0); + + for (let i = 0; i < set.imageSizes.length; ++i) { + const layerResolution = set.resolutions[i]; + const layerPixelResolution = set.pixelResolutionSet[i]; + const layerImageSize = set.imageSizes[i] * layerPixelResolution; + const scaledLayerExtent = [0, -layerImageSize, layerImageSize, 0]; const layerTileGrid = new TileGrid({ - extent: scaled_layer_extent, + extent: scaledLayerExtent, resolutions: [layerPixelResolution], tileSize: [ this.mapManager.getOptions().tileSize, @@ -752,6 +891,7 @@ class HiCViewAndLayersManager { this, i, layerResolution, + set.sourceName, { projection: this.pixelProjection, tileGrid: layerTileGrid, @@ -760,23 +900,30 @@ class HiCViewAndLayersManager { } ); layerSource.do_reload(); - // Define layer: + const borders = set.layerResolutionBorders.get(layerResolution); const layer = new TileLayer({ source: layerSource, - // cacheSize: 0, minResolution: this.toFiniteResolutionBound( - this.layerResolutionBorders.get(layerResolution)?.minResolutionInclusive + borders?.minResolutionInclusive ), maxResolution: this.toFiniteResolutionBound( - this.layerResolutionBorders.get(layerResolution)?.maxResolutionExclusive + borders?.maxResolutionExclusive ), - zIndex: this.layersZIndices.HIC_MAP_LAYER_Z_INDEX, + zIndex, }); + layer.set("sourceName", set.sourceName); layer.set("bpResolution", layerResolution); layer.set("pixelResolution", layerPixelResolution); this.mapManager.getMap().addLayer(layer); + layersCollection.push(layer); this.layersHolder.hicDataLayers.push(layer); - this.layersHolder.bpResolutionToHiCDataLayer.set(layerResolution, layer); + resolutionMap.set(layerResolution, layer); + if (set.sourceName === "PRIMARY") { + this.layersHolder.bpResolutionToHiCDataLayer.set( + layerResolution, + layer + ); + } } } @@ -788,7 +935,7 @@ class HiCViewAndLayersManager { this.mapManager.contigDimensionHolder.getPxContainingBp(bp, bpResolution) ); const [x_glc, y_glc] = [x_pix, y_pix].map( - (p) => p * (this.resolutionToPixelResolution.get(bpResolution) ?? 1.0) + (p) => p * (this.getPixelResolutionForBpResolution(bpResolution) ?? 1.0) ); return [x_glc, -y_glc]; } @@ -801,35 +948,175 @@ class HiCViewAndLayersManager { public viewResolutionToResolutionDescriptor( viewResolution: number ): LayerResolutionDescriptor { - if (this.resolutionTuples.length === 0) { - throw new Error("No resolutions available"); + return this.viewResolutionToSourceResolutionDescriptor( + "PRIMARY", + viewResolution + ); + } + + public viewResolutionToSourceResolutionDescriptor( + sourceName: MatrixSourceName, + viewResolution: number + ): LayerResolutionDescriptor { + const set = + sourceName === "SECONDARY" + ? this.secondaryResolutionSet + : this.primaryResolutionSet; + if (!set) { + throw new Error(`No resolutions available for ${sourceName}`); } - const testElement: LayerResolutionDescriptor = { - bpResolution: Number.NaN, - pixelResolution: Number.NaN, - layerResolutionBorders: { - minResolutionInclusive: viewResolution, - maxResolutionExclusive: Number.NaN, - }, - imageSizeIndex: Number.NaN, + return getResolutionDescriptorForViewResolution(set, viewResolution); + } + + public getVisibleSourceResolutionDescriptors(): { + primary: LayerResolutionDescriptor; + secondary?: LayerResolutionDescriptor; + } { + const viewResolution = this.view.getResolution() ?? 0; + return { + primary: this.viewResolutionToSourceResolutionDescriptor( + "PRIMARY", + viewResolution + ), + secondary: this.secondaryResolutionSet + ? this.viewResolutionToSourceResolutionDescriptor( + "SECONDARY", + viewResolution + ) + : undefined, }; - const descriptorIndexRaw: number = bounds.le( - this.resolutionTuples, - testElement, - (d1, d2) => - d1.layerResolutionBorders.minResolutionInclusive - - d2.layerResolutionBorders.minResolutionInclusive + } + + public getFinestVisibleSourceResolutionDescriptor( + viewResolution: number = this.view.getResolution() ?? 0 + ): LayerResolutionDescriptor { + return getFinestVisibleResolutionDescriptor( + this.primaryResolutionSet, + this.secondaryResolutionSet, + viewResolution ); - const descriptorIndex = Math.max( - 0, - Math.min(descriptorIndexRaw, this.resolutionTuples.length - 1) + } + + public getDimensionHolderForSource( + // Secondary maps are currently kept in the same synchronized assembly + // coordinate system as primary maps. Keeping source in this API makes the + // guidance path explicit and leaves the call site ready for separate + // source-specific holders. + // eslint-disable-next-line @typescript-eslint/no-unused-vars + sourceName: MatrixSourceName = "PRIMARY" + ) { + return this.mapManager.contigDimensionHolder; + } + + public ensureGuidanceResolutionDescriptor( + preferred?: LayerResolutionDescriptor + ): LayerResolutionDescriptor { + const descriptor = + preferred ?? this.getFinestVisibleSourceResolutionDescriptor(); + const holder = this.getDimensionHolderForSource(descriptor.sourceName); + if ( + Number.isFinite(descriptor.bpResolution) && + !holder.prefix_sum_px.has(descriptor.bpResolution) + ) { + holder.ensureResolution(descriptor.bpResolution); + } + if (holder.prefix_sum_px.has(descriptor.bpResolution)) { + return descriptor; + } + return this.getActiveVectorResolutionDescriptor(); + } + + public getGuidanceResolutionDescriptorForViewResolution( + viewResolution: number + ): LayerResolutionDescriptor { + return this.ensureGuidanceResolutionDescriptor( + this.getFinestVisibleSourceResolutionDescriptor(viewResolution) ); - const descriptor = this.resolutionTuples[descriptorIndex]; - return descriptor; + } + + public setSecondaryResolutionModel( + compatibility?: SecondarySourceCompatibility + ): void { + const previousBaseBp = this.coordinateBaseBp; + const nextBaseBp = + compatibility && + compatibility.secondaryResolutions.length > 0 && + compatibility.secondaryBinsByResolution.length > 0 + ? Math.max( + 1, + Math.min( + ...this.primaryResolutionSet.resolutions, + ...compatibility.secondaryResolutions + ) + ) + : this.primaryResolutionSet.resolutions.length > 0 + ? Math.max(1, Math.min(...this.primaryResolutionSet.resolutions)) + : 1; + const baseChanged = nextBaseBp !== this.coordinateBaseBp; + + this.removeSourceHiCDataLayers("SECONDARY"); + this.secondaryResolutionSet = undefined; + if (baseChanged) { + this.removeSourceHiCDataLayers("PRIMARY"); + this.coordinateBaseBp = nextBaseBp; + this.primaryResolutionSet = this.buildResolutionDescriptorSet( + "PRIMARY", + this.primaryResolutionSet.resolutions, + this.primaryResolutionSet.imageSizes + ); + this.applyPrimaryResolutionSet(this.primaryResolutionSet); + this.addSourceHiCDataLayers(this.primaryResolutionSet); + } + if ( + compatibility && + compatibility.secondaryResolutions.length > 0 && + compatibility.secondaryBinsByResolution.length > 0 + ) { + this.secondaryResolutionSet = this.buildResolutionDescriptorSet( + "SECONDARY", + compatibility.secondaryResolutions, + compatibility.secondaryBinsByResolution + ); + this.addSourceHiCDataLayers(this.secondaryResolutionSet); + } + this.updateProjectionAndViewExtent(previousBaseBp / this.coordinateBaseBp); + this.updateWheelZoomResolutionModel(); + this.updateCurrentHiCViewState(); + this.rebuildBuiltinVectorLayers(); + this.reloadTiles(); + } + + public hasSecondarySource(): boolean { + return this.secondaryResolutionSet !== undefined; + } + + private removeSourceHiCDataLayers(sourceName: MatrixSourceName): void { + const layers = + sourceName === "PRIMARY" + ? this.layersHolder.primaryHiCDataLayers + : this.layersHolder.secondaryHiCDataLayers; + for (const layer of layers) { + this.mapManager.getMap().removeLayer(layer); + const idx = this.layersHolder.hicDataLayers.indexOf(layer); + if (idx >= 0) { + this.layersHolder.hicDataLayers.splice(idx, 1); + } + } + layers.length = 0; + if (sourceName === "PRIMARY") { + this.layersHolder.primaryBpResolutionToHiCDataLayer.clear(); + this.layersHolder.bpResolutionToHiCDataLayer.clear(); + } else { + this.layersHolder.secondaryBpResolutionToHiCDataLayer.clear(); + } } public initializeTracks(): void { this.reloadTracks(); + this.addBuiltinVectorLayers(); + } + + private addBuiltinVectorLayers(): void { this.add2DTrackSymmetric( this.track2DHolder.annotationTrack, this.layersHolder.annotationLayers @@ -874,6 +1161,33 @@ class HiCViewAndLayersManager { layer ); }); + this.syncLayerVisibilityForCurrentResolution(); + } + + private removeLayerCollection(layers: Layer[]): void { + for (const layer of layers) { + this.mapManager.getMap().removeLayer(layer); + } + layers.length = 0; + } + + private clearBuiltinVectorLayerMaps(): void { + this.layersHolder.bpResolutionToAnnotationLayer.clear(); + this.layersHolder.bpResolutionToContigBordersLayer.clear(); + this.layersHolder.bpResolutionToContigTranslocationArrowsLayer.clear(); + this.layersHolder.bpResolutionToScaffoldBordersLayer.clear(); + } + + private rebuildBuiltinVectorLayers(): void { + this.removeLayerCollection(this.layersHolder.annotationLayers); + this.removeLayerCollection(this.layersHolder.contigBordersLayers); + this.removeLayerCollection( + this.layersHolder.contigTranslocationArrowsLayers + ); + this.removeLayerCollection(this.layersHolder.scaffoldBordersLayers); + this.clearBuiltinVectorLayerMaps(); + this.reloadTracks(); + this.addBuiltinVectorLayers(); } public initializeMapControls(): void { @@ -881,7 +1195,9 @@ class HiCViewAndLayersManager { new BinMousePosition({ projection: this.pixelProjection, dimension_holder: this.mapManager.getContigDimensionHolder(), + scaffold_holder: this.mapManager.scaffoldHolder, layers: this.layersHolder.hicDataLayers, + layersManager: this, }) ); const rulerH = new RulerControl({ @@ -942,15 +1258,16 @@ class HiCViewAndLayersManager { } public initializeMapInteractions(): void { - this.mapManager.getMap().addInteraction( - new ContigMouseWheelZoom({ - dimension_holder: this.mapManager.getContigDimensionHolder(), - resolutions: this.resolutions, - pixelResolutionSet: this.pixelResolutionSet, - global_projection: this.pixelProjection, - layers: this.layersHolder.hicDataLayers, - }) - ); + const navigationModel = this.getNavigationResolutionModel(); + this.wheelZoomInteraction = new ContigMouseWheelZoom({ + dimension_holder: this.mapManager.getContigDimensionHolder(), + resolutions: navigationModel.resolutions, + pixelResolutionSet: navigationModel.pixelResolutionSet, + global_projection: this.pixelProjection, + layers: this.layersHolder.hicDataLayers, + layersManager: this, + }); + this.mapManager.getMap().addInteraction(this.wheelZoomInteraction); this.mapManager .getMap() .addInteraction(this.selectionInteractions.contigSelectionInteraction); @@ -973,7 +1290,11 @@ class HiCViewAndLayersManager { this.deferredInitializationInteractions.scissorsGuideInteraction = new SplitRulesInteraction({ mapManager: this.mapManager, - selectionCallback: this.mapManager.eventManager.onClickInScissorsMode, + selectionCallback: (coordinatePx, bpResolution) => + this.mapManager.eventManager.onClickInScissorsMode( + coordinatePx, + bpResolution + ), wrapX: false, zIndex: this.layersZIndices.TRACK_2D_LAYER_Z_INDEX * 2 + 1, }); @@ -1042,16 +1363,15 @@ class HiCViewAndLayersManager { return; } - const bpResolution = - this.currentViewState.resolutionDesciptor.bpResolution; + const vectorResolutionDescriptor = + this.getActiveVectorResolutionDescriptor(); + const bpResolution = vectorResolutionDescriptor.bpResolution; const [a, b, c, d] = extent; const [x0, y0, x1, y1] = [a, -d, c, -b]; const [x0_px, y0_px, x1_px, y1_px] = [x0, y0, x1, y1].map((c) => - Math.floor( - c / this.currentViewState.resolutionDesciptor.pixelResolution - ) + Math.floor(c / vectorResolutionDescriptor.pixelResolution) ); const [leftPxInclusive, rightPxInclusive] = [ @@ -1072,12 +1392,13 @@ class HiCViewAndLayersManager { if (leftPxInclusive < 0) { leftContigOrderInclusive = 0; } - if ( - rightPxInclusive > - this.imageSizes[ - this.currentViewState.resolutionDesciptor.imageSizeIndex - ] - ) { + const activePrefixSum = + this.mapManager.contigDimensionHolder.prefix_sum_px.get(bpResolution); + const activeImageSize = + activePrefixSum && activePrefixSum.length > 0 + ? activePrefixSum[activePrefixSum.length - 1] + : Number.POSITIVE_INFINITY; + if (rightPxInclusive > activeImageSize) { rightContigOrderInclusive = this.mapManager.contigDimensionHolder.contig_count - 1; } @@ -1141,7 +1462,7 @@ class HiCViewAndLayersManager { public getActiveHiCDataLayer(): Layer { const bpResolution = this.currentViewState.resolutionDesciptor.bpResolution; const layer = - this.layersHolder.bpResolutionToHiCDataLayer.get(bpResolution); + this.layersHolder.primaryBpResolutionToHiCDataLayer.get(bpResolution); if (!layer) { throw new Error( `Unknown resolution ${bpResolution} for Hi-C data layers` @@ -1151,7 +1472,8 @@ class HiCViewAndLayersManager { } public getActiveContigBordersLayer(): Layer { - const bpResolution = this.currentViewState.resolutionDesciptor.bpResolution; + const bpResolution = + this.getActiveVectorResolutionDescriptor().bpResolution; const layer = !isNaN(bpResolution) ? this.layersHolder.bpResolutionToContigBordersLayer.get(bpResolution) : this.layersHolder.contigBordersLayers[0]; @@ -1164,7 +1486,8 @@ class HiCViewAndLayersManager { } public getActiveScaffoldBordersLayer(): Layer { - const bpResolution = this.currentViewState.resolutionDesciptor.bpResolution; + const bpResolution = + this.getActiveVectorResolutionDescriptor().bpResolution; const layer = this.layersHolder.bpResolutionToScaffoldBordersLayer.get(bpResolution); if (!layer) { @@ -1290,42 +1613,58 @@ class HiCViewAndLayersManager { this.mapManager.map.changed(); } - private toFiniteResolutionBound(bound: number | undefined): number | undefined { + private toFiniteResolutionBound( + bound: number | undefined + ): number | undefined { return Number.isFinite(bound) ? bound : undefined; } + public getActiveVectorResolutionDescriptor(): LayerResolutionDescriptor { + return this.getVisibleSourceResolutionDescriptors().primary; + } + private syncLayerVisibilityForCurrentResolution(): void { - const activeResolution = this.currentViewState.resolutionDesciptor.bpResolution; + const visibleDescriptors = this.getVisibleSourceResolutionDescriptors(); + const activeResolution = visibleDescriptors.primary.bpResolution; if (!Number.isFinite(activeResolution)) { return; } + const activeVectorResolution = + this.getActiveVectorResolutionDescriptor().bpResolution; - for (const layer of this.layersHolder.hicDataLayers) { + for (const layer of this.layersHolder.primaryHiCDataLayers) { const layerResolution = Number(layer.get("bpResolution")); layer.setVisible(layerResolution === activeResolution); } + for (const layer of this.layersHolder.secondaryHiCDataLayers) { + const layerResolution = Number(layer.get("bpResolution")); + layer.setVisible( + visibleDescriptors.secondary !== undefined && + layerResolution === visibleDescriptors.secondary.bpResolution + ); + } for (const layer of this.layersHolder.contigBordersLayers) { const layerResolution = Number(layer.get("bpResolution")); - layer.setVisible(layerResolution === activeResolution); + layer.setVisible(layerResolution === activeVectorResolution); } for (const layer of this.layersHolder.scaffoldBordersLayers) { const layerResolution = Number(layer.get("bpResolution")); - layer.setVisible(layerResolution === activeResolution); + layer.setVisible(layerResolution === activeVectorResolution); } for (const layer of this.layersHolder.contigTranslocationArrowsLayers) { const layerResolution = Number(layer.get("bpResolution")); layer.setVisible( - layerResolution === activeResolution && + layerResolution === activeVectorResolution && this.currentViewState.activeTool === ActiveTool.TRANSLOCATION ); } for (const layer of this.layersHolder.annotationLayers) { const layerResolution = Number(layer.get("bpResolution")); - layer.setVisible(layerResolution === activeResolution); + layer.setVisible(layerResolution === activeVectorResolution); } } @@ -1346,7 +1685,8 @@ class HiCViewAndLayersManager { this.track2DHolder.annotationTrack.addMarkerFromAssemblyBp( xBp, yBp, - name ?? `marker_${this.track2DHolder.annotationTrack.getMarkerCount() + 1}` + name ?? + `marker_${this.track2DHolder.annotationTrack.getMarkerCount() + 1}` ); this.reloadTracks(); } @@ -1378,6 +1718,7 @@ export { HiCViewAndLayersManager, type LayerResolutionDescriptor, type LayerResolutionBorders, + type MatrixSourceName, type LayersHolder, type CurrentHiCViewState, type SelectionBorders, diff --git a/src/app/core/mapmanagers/LinearTrackManager.ts b/src/app/core/mapmanagers/LinearTrackManager.ts index e12b932..310e866 100644 --- a/src/app/core/mapmanagers/LinearTrackManager.ts +++ b/src/app/core/mapmanagers/LinearTrackManager.ts @@ -242,9 +242,14 @@ class LinearTrackManager { await this.refreshTrackList(); } - public async openCoolerWeightsTrack(name?: string): Promise { + public async openCoolerWeightsTrack( + name?: string, + source: "PRIMARY" | "SECONDARY" = "PRIMARY" + ): Promise { await this.mapManager.networkManager.requestManager.openCoolerWeightsTrack( - name + name, + undefined, + source ); await this.refreshTrackList(); } @@ -274,6 +279,9 @@ class LinearTrackManager { renderMode?: string; aggregationMode?: string; logScale?: boolean; + rangeAuto?: boolean; + rangeMin?: number; + rangeMax?: number; } ): Promise { await this.mapManager.networkManager.requestManager.updateTrack( @@ -437,6 +445,15 @@ class LinearTrackManager { axisOffsetPx: number, crossOffsetPx: number ): FeatureHoverInfo | null { + const hit = this.getTrackHoverAt(orientation, axisOffsetPx, crossOffsetPx); + return hit?.kind === "feature" ? hit : null; + } + + public getTrackHoverAt( + orientation: Orientation, + axisOffsetPx: number, + crossOffsetPx: number + ): TrackHoverInfo | null { const snapshot = this.lastRenderedSnapshot[orientation]; if (!snapshot || snapshot.tracks.length === 0) { return null; @@ -453,14 +470,12 @@ class LinearTrackManager { return null; } const track = snapshot.tracks[laneIndex]; - if ((track.renderStyle ?? "SIGNAL").toUpperCase() !== "FEATURE") { - return null; - } const laneStart = laneIndex * laneSize; const laneEnd = laneStart + laneSize; if (crossOffsetPx < laneStart || crossOffsetPx > laneEnd) { return null; } + const renderStyle = (track.renderStyle ?? "SIGNAL").toUpperCase(); for (const bin of track.bins) { const interval = this.resolveBinIntervalPx(bin, snapshot.viewport.bpResolution); if (!interval.visible) { @@ -477,9 +492,24 @@ class LinearTrackManager { if (axisOffsetPx < start || axisOffsetPx > end) { continue; } + if (renderStyle !== "FEATURE") { + return { + kind: "signal", + trackId: track.trackId, + trackName: track.name, + trackType: track.type, + startBp: Math.min(bin.startBp, bin.endBp), + endBp: Math.max(bin.startBp, bin.endBp), + startPx: interval.startPx, + endPx: interval.endPx, + value: Number.isFinite(bin.value) ? bin.value : 0, + count: bin.count, + }; + } const label = (bin.label ?? "").trim(); const featureType = (bin.featureType ?? "").trim(); return { + kind: "feature", trackId: track.trackId, trackName: track.name, label: label.length > 0 ? label : null, @@ -487,7 +517,10 @@ class LinearTrackManager { strand: bin.strand, startBp: Math.min(bin.startBp, bin.endBp), endBp: Math.max(bin.startBp, bin.endBp), + startPx: interval.startPx, + endPx: interval.endPx, value: bin.value, + attributes: bin.attributes, }; } return null; @@ -560,9 +593,10 @@ class LinearTrackManager { : this.mapManager.getLayersManager().currentViewState.resolutionDesciptor .bpResolution; const finestPixelResolution = - this.mapManager.getLayersManager().resolutionToPixelResolution.get( - safeFinestBpResolution - ) ?? currentResolution; + this.mapManager + .getLayersManager() + .getPixelResolutionForBpResolution(safeFinestBpResolution) ?? + currentResolution; const targetSpanPx = Math.max(180, Math.min(mapSize[0], mapSize[1]) * 0.52); const spanPxAtFinest = spanBp / Math.max(1, safeFinestBpResolution); const minViewResolution = view.getMinResolution() ?? 0; @@ -752,6 +786,9 @@ class LinearTrackManager { } const viewport = this.getViewportGeometry(orientation); + if (!viewport) { + return; + } const cacheEpoch = this.cacheEpoch; try { const prefetch = this.buildPrefetchViewport(viewport); @@ -927,11 +964,16 @@ class LinearTrackManager { const useLogScale = renderStyle === "SIGNAL" && !!trackSummary?.logScale; const logBase = this.getTrackLogBase(track.trackId); - const maxValue = + const signalRange = renderStyle === "SIGNAL" - ? this.getVisibleSignalMax(track.bins, viewport, bpResolution) - : Math.max(track.maxValue, 0); - const scaleTransform = this.buildScaleTransform(maxValue, useLogScale, logBase); + ? this.resolveSignalRange(trackSummary, track.bins, viewport, bpResolution) + : { min: 0, max: Math.max(track.maxValue, 0) }; + const scaleTransform = this.buildScaleTransform( + signalRange.min, + signalRange.max, + useLogScale, + logBase + ); const binsToRender = renderStyle === "FEATURE" ? this.sortFeatureBinsForDraw(track.bins) @@ -1717,6 +1759,27 @@ class LinearTrackManager { return maxValue; } + private resolveSignalRange( + trackSummary: TrackSummaryResponse | undefined, + bins: TrackBinResponse[], + viewport: ViewportGeometry, + bpResolution: number + ): { min: number; max: number } { + if ( + trackSummary && + trackSummary.rangeAuto === false && + Number.isFinite(trackSummary.rangeMin) && + Number.isFinite(trackSummary.rangeMax) && + trackSummary.rangeMax > trackSummary.rangeMin + ) { + return { min: trackSummary.rangeMin, max: trackSummary.rangeMax }; + } + return { + min: 0, + max: this.getVisibleSignalMax(bins, viewport, bpResolution), + }; + } + private resolveBinIntervalPx( bin: TrackBinResponse, bpResolution: number @@ -1755,13 +1818,16 @@ class LinearTrackManager { } private formatScaleValue(value: number): string { - if (!Number.isFinite(value) || value <= 0) { + if (!Number.isFinite(value)) { + return "n/a"; + } + if (value === 0) { return "0"; } - if (value >= 1000 || value < 0.01) { + if (Math.abs(value) >= 1000 || Math.abs(value) < 0.01) { return value.toExponential(2); } - if (value >= 10) { + if (Math.abs(value) >= 10) { return value.toFixed(1); } return value.toFixed(3); @@ -1776,39 +1842,48 @@ class LinearTrackManager { } private buildScaleTransform( + minValue: number, maxValue: number, logScale: boolean, logBase: number ): SignalScaleTransform { + const safeMin = Number.isFinite(minValue) ? minValue : 0; const safeMax = - Number.isFinite(maxValue) && maxValue > 0 ? maxValue : 1; + Number.isFinite(maxValue) && maxValue > safeMin ? maxValue : safeMin + 1; + const span = Math.max(Number.EPSILON, safeMax - safeMin); if (!logScale) { return { logScale: false, + minValue: safeMin, maxValue: safeMax, logBase: 10, - display: (value: number) => (Number.isFinite(value) ? Math.max(0, value) : 0), + display: (value: number) => (Number.isFinite(value) ? value : safeMin), normalize: (value: number) => - Math.max(0, Math.min(1, (Number.isFinite(value) ? value : 0) / safeMax)), + Math.max( + 0, + Math.min(1, ((Number.isFinite(value) ? value : safeMin) - safeMin) / span) + ), }; } const safeBase = Number.isFinite(logBase) && logBase > 1 ? logBase : 10; const logDenominator = Math.log(safeBase); - const toLog = (value: number): number => Math.log1p(Math.max(0, value)) / logDenominator; + const toLog = (value: number): number => + Math.log1p(Math.max(0, value - safeMin)) / logDenominator; const maxLog = toLog(safeMax); const safeMaxLog = Number.isFinite(maxLog) && maxLog > 0 ? maxLog : 1; return { logScale: true, + minValue: safeMin, maxValue: safeMax, logBase: safeBase, display: (value: number) => { - if (!Number.isFinite(value) || value <= 0) { - return 0; + if (!Number.isFinite(value)) { + return safeMin; } - return toLog(value); + return value; }, normalize: (value: number) => { - if (!Number.isFinite(value) || value <= 0) { + if (!Number.isFinite(value) || value <= safeMin) { return 0; } return Math.max(0, Math.min(1, toLog(value) / safeMaxLog)); @@ -2020,14 +2095,15 @@ class LinearTrackManager { pixelSpan: number ): number[] { const maxTickCount = Math.max(2, Math.min(7, Math.floor(pixelSpan / 16))); - const maxValue = Math.max(scale.maxValue, 0); - if (!Number.isFinite(maxValue) || maxValue <= 0) { - return [0]; + const minValue = Number.isFinite(scale.minValue) ? scale.minValue : 0; + const maxValue = Number.isFinite(scale.maxValue) ? scale.maxValue : minValue + 1; + if (!Number.isFinite(maxValue) || maxValue <= minValue) { + return [minValue]; } if (!scale.logScale) { - const step = this.niceStep(maxValue / Math.max(1, maxTickCount - 1)); - const ticks: number[] = [0]; - for (let value = step; value < maxValue; value += step) { + const step = this.niceStep((maxValue - minValue) / Math.max(1, maxTickCount - 1)); + const ticks: number[] = [minValue]; + for (let value = minValue + step; value < maxValue; value += step) { ticks.push(value); } ticks.push(maxValue); @@ -2035,11 +2111,11 @@ class LinearTrackManager { } const safeBase = Number.isFinite(scale.logBase) && scale.logBase > 1 ? scale.logBase : 10; - const maxLog = Math.log1p(maxValue) / Math.log(safeBase); + const maxLog = Math.log1p(maxValue - minValue) / Math.log(safeBase); const stepLog = maxLog / Math.max(1, maxTickCount - 1); - const ticks: number[] = []; + const ticks: number[] = [minValue]; for (let i = 0; i < maxTickCount; i++) { - ticks.push(Math.max(0, Math.pow(safeBase, i * stepLog) - 1)); + ticks.push(minValue + Math.max(0, Math.pow(safeBase, i * stepLog) - 1)); } ticks.push(maxValue); return this.uniqueSortedTicks(ticks); @@ -2063,19 +2139,30 @@ class LinearTrackManager { return multiplier * base; } - private getViewportGeometry(orientation: Orientation): ViewportGeometry { + private getViewportGeometry(orientation: Orientation): ViewportGeometry | null { const descriptor = this.mapManager.getLayersManager().currentViewState.resolutionDesciptor; const bpResolution = descriptor.bpResolution; const map = this.mapManager.getMap(); const view = this.mapManager.getView(); const mapSize = map.getSize(); + const center = view.getCenter(); + const pixelResolution = view.getResolution(); + if ( + !mapSize || + !center || + center.length < 2 || + !center.every((value) => Number.isFinite(value)) || + pixelResolution === undefined || + !Number.isFinite(pixelResolution) + ) { + return null; + } const extent = view.calculateExtent(mapSize); const activeHiCLayer = this.mapManager.getLayersManager().getActiveHiCDataLayer(); const targetProjection = activeHiCLayer.getSource()?.getProjection() ?? view.getProjection(); - const pixelResolution = view.getResolution() ?? 1; const layerPixelResolution = Number.isFinite(descriptor.pixelResolution) ? descriptor.pixelResolution : 1; @@ -2398,6 +2485,7 @@ type TrackQueryCache = { type SignalScaleTransform = { logScale: boolean; + minValue: number; maxValue: number; logBase: number; display: (value: number) => number; @@ -2417,6 +2505,7 @@ type FeatureSearchEntry = { }; type FeatureHoverInfo = { + kind: "feature"; trackId: string; trackName: string; label: string | null; @@ -2424,9 +2513,27 @@ type FeatureHoverInfo = { strand: string | null; startBp: number; endBp: number; + startPx: number; + endPx: number; + value: number; + attributes: Record; +}; + +type SignalHoverInfo = { + kind: "signal"; + trackId: string; + trackName: string; + trackType: string; + startBp: number; + endBp: number; + startPx: number; + endPx: number; value: number; + count: number; }; +type TrackHoverInfo = FeatureHoverInfo | SignalHoverInfo; + type SelectedTrackFeature = { trackId: string; label: string; diff --git a/src/app/core/mapmanagers/ScaffoldHolder.ts b/src/app/core/mapmanagers/ScaffoldHolder.ts index 278fb6d..bb926f1 100644 --- a/src/app/core/mapmanagers/ScaffoldHolder.ts +++ b/src/app/core/mapmanagers/ScaffoldHolder.ts @@ -77,6 +77,41 @@ class ScaffoldHolder { throw new Error(`Unknown scaffold with id=${scaffoldId}`); } } + + public getScaffoldLocusByBp(bp: number): { + scaffoldId: ScaffoldId; + scaffoldName: string; + inScaffoldBp: number; + startBp: number; + endBp: number; + } | null { + let left = 0; + let right = this.scaffoldBordersSorted.length - 1; + while (left <= right) { + const middle = Math.floor((left + right) / 2); + const [borders, scaffoldId] = this.scaffoldBordersSorted[middle]; + if (bp < borders.startBP) { + right = middle - 1; + continue; + } + if (bp >= borders.endBP) { + left = middle + 1; + continue; + } + const descriptor = this.scaffoldTable.get(scaffoldId); + if (!descriptor) { + return null; + } + return { + scaffoldId, + scaffoldName: descriptor.scaffoldName, + inScaffoldBp: bp - borders.startBP, + startBp: borders.startBP, + endBp: borders.endBP, + }; + } + return null; + } } export { type ScaffoldId, ScaffoldHolder }; diff --git a/src/app/core/mapmanagers/VisualizationManager.ts b/src/app/core/mapmanagers/VisualizationManager.ts index 9d89eee..ed0f0d0 100644 --- a/src/app/core/mapmanagers/VisualizationManager.ts +++ b/src/app/core/mapmanagers/VisualizationManager.ts @@ -29,6 +29,11 @@ import VisualizationOptions from "../visualization/VisualizationOptions"; import SimpleLinearGradient from "../visualization/colormap/SimpleLinearGradient"; import type { EventsKey } from "ol/events"; import { unByKey } from "ol/Observable"; +import { + buildColorExpression, + type SourceName, +} from "../visualization/renderPipelineWizard"; +import { ColorTranslator } from "colortranslator"; type ViewportPixelBounds = { bpResolution: number; @@ -38,8 +43,6 @@ type ViewportPixelBounds = { endColPx: number; }; -type SourceName = "PRIMARY" | "SECONDARY"; - type PipelineSignalProfile = { source: SourceName; preLogBase: number | null; @@ -83,6 +86,40 @@ const computeFiniteQuantile = (values: Float32Array, quantile: number): number | return filtered[position] ?? filtered[filtered.length - 1] ?? null; }; +const computeFinitePositiveMax = (values: Float32Array): number | null => { + let maxValue: number | null = null; + for (const value of values) { + if (Number.isFinite(value) && value > 0) { + maxValue = maxValue == null ? value : Math.max(maxValue, value); + } + } + return maxValue; +}; + +const resolveSafeAutoUpperBound = ( + values: Float32Array, + quantile: number, + minSignal: number, + currentMaxSignal: number +): number | null => { + const quantileValue = computeFiniteQuantile(values, quantile); + const maxValue = computeFinitePositiveMax(values); + const minGap = Math.max(Math.abs(minSignal) * 1e-6, 1e-12); + const candidate = + quantileValue != null && quantileValue > minSignal + minGap + ? quantileValue + : maxValue != null && maxValue > minSignal + minGap + ? maxValue + : null; + if (candidate == null || !Number.isFinite(candidate)) { + return null; + } + if (Math.abs(candidate - currentMaxSignal) < 1e-9) { + return currentMaxSignal; + } + return candidate; +}; + const isRecord = (value: unknown): value is Record => typeof value === "object" && value !== null; @@ -91,6 +128,37 @@ const toFiniteNumber = (value: unknown, fallback: number): number => { return Number.isFinite(numeric) ? numeric : fallback; }; +const safeColorTranslator = (value: unknown, fallback: string): ColorTranslator => { + if (typeof value !== "string" || value.length > 128) { + return new ColorTranslator(fallback, { legacyCSS: true }); + } + try { + return new ColorTranslator(value, { legacyCSS: true }); + } catch { + return new ColorTranslator(fallback, { legacyCSS: true }); + } +}; + +const withAlphaZero = (value: unknown, fallback: string): string => { + if (typeof value === "string") { + const normalized = value.trim(); + if (/^#[0-9a-f]{8}$/i.test(normalized)) { + return `${normalized.slice(0, 7)}00`; + } + if (/^#[0-9a-f]{6}$/i.test(normalized)) { + return `${normalized}00`; + } + } + try { + const translated = new ColorTranslator(String(value ?? fallback), { + legacyCSS: true, + }); + return `${translated.HEXA.slice(0, 7)}00`; + } catch { + return fallback; + } +}; + const normalizePositiveLogBase = (value: unknown): number | null => { const numeric = Number(value); if (!Number.isFinite(numeric) || numeric <= 0 || Math.abs(numeric - 1) < 1e-9) { @@ -237,6 +305,156 @@ const collectColormapTargets = ( }); }; +const collectTopLayerSources = ( + expression: unknown, + output: Set +): void => { + if (!isRecord(expression)) { + return; + } + if (String(expression.type ?? "").trim().toLowerCase() === "pixel_blend") { + const topTargets: ColormapTarget[] = []; + collectColormapTargets(expression.top, topTargets); + topTargets.forEach((target) => output.add(target.profile.source)); + } + ["input", "left", "right", "top", "bottom", "c1", "c2", "c3", "alpha"].forEach( + (key) => { + if (key in expression) { + collectTopLayerSources(expression[key], output); + } + } + ); +}; + +const cloneRecord = (value: T): T => + JSON.parse(JSON.stringify(value)) as T; + +const isTransparentMinimumColor = (color: unknown): boolean => + typeof color === "string" && + /^#[0-9a-f]{8}$/i.test(color.trim()) && + color.trim().slice(7).toLowerCase() === "00"; + +const preserveMinimumAlpha = ( + nextColor: unknown, + previousColor: unknown +): unknown => { + if ( + typeof nextColor !== "string" || + !/^#[0-9a-f]{8}$/i.test(nextColor.trim()) || + !isTransparentMinimumColor(previousColor) + ) { + return nextColor; + } + return `${nextColor.trim().slice(0, 7)}00`; +}; + +const replaceColormapNode = ( + target: ColormapTarget, + replacement: Record +): void => { + const previousStartColor = target.node.startColor; + target.node.type = "colormap"; + target.node.mode = replacement.mode ?? "LINEAR"; + target.node.input = cloneRecord(replacement.input); + target.node.startColor = preserveMinimumAlpha( + replacement.startColor, + previousStartColor + ); + target.node.endColor = replacement.endColor; + target.node.minSignal = replacement.minSignal; + target.node.maxSignal = replacement.maxSignal; +}; + +const visualizationOptionsFromTarget = ( + target: ColormapTarget, + currentOptions: VisualizationOptions, + forceTransparentMinimum = false +): VisualizationOptions => + new VisualizationOptions( + target.profile.preLogBase ?? -1, + target.profile.postLogBase ?? -1, + target.profile.applyCoolerWeights, + target.profile.resolutionScaling, + target.profile.resolutionLinearScaling, + new SimpleLinearGradient( + safeColorTranslator( + forceTransparentMinimum + ? withAlphaZero(target.node.startColor, "#ffffff00") + : target.node.startColor, + "#ffffff00" + ), + safeColorTranslator(target.node.endColor, "#006000ff"), + target.minSignal, + target.maxSignal + ), + currentOptions.autoThresholdEnabled, + currentOptions.autoThresholdQuantile, + currentOptions.signalDisplayMode + ); + +const forceMinimumAlphaZero = (target: ColormapTarget): void => { + const color = target.node.startColor; + if (typeof color === "string" && /^#[0-9a-f]{8}$/i.test(color.trim())) { + target.node.startColor = `${color.trim().slice(0, 7)}00`; + } +}; + +const applyTopLayerTransparency = ( + expression: unknown, + source: SourceName +): void => { + if (!isRecord(expression)) { + return; + } + if (expression.type === "pixel_blend") { + const topTargets: ColormapTarget[] = []; + collectColormapTargets(expression.top, topTargets); + topTargets + .filter((target) => target.profile.source === source) + .forEach(forceMinimumAlphaZero); + } + [ + "input", + "left", + "right", + "upper", + "lower", + "bottom", + "c1", + "c2", + "c3", + "alpha", + ].forEach((key) => { + if (key in expression) { + applyTopLayerTransparency(expression[key], source); + } + }); +}; + +const swapPixelBlendLayers = (expression: unknown): boolean => { + if (!isRecord(expression)) { + return false; + } + let changed = false; + if (String(expression.type ?? "").trim().toLowerCase() === "pixel_blend") { + const top = expression.top; + expression.top = expression.bottom; + expression.bottom = top; + const topOpacity = expression.topOpacity; + expression.topOpacity = expression.bottomOpacity; + expression.bottomOpacity = topOpacity; + changed = true; + } + ["input", "left", "right", "top", "bottom", "c1", "c2", "c3", "alpha"].forEach( + (key) => { + if (key in expression && swapPixelBlendLayers(expression[key])) { + changed = true; + } + } + ); + return changed; +}; + const transformSignalsForProfile = ( values: Float32Array, profile: PipelineSignalProfile, @@ -306,6 +524,40 @@ class VisualizationManager { }); } + public async loadVisualizationOptionsForSource( + source?: SourceName + ): Promise { + if (!source) { + return this.fetchVisualizationOptions(); + } + const pipelineConfig = await this.getActiveRenderPipelineConfig(); + if (!pipelineConfig) { + return this.fetchVisualizationOptions(); + } + const targets: ColormapTarget[] = []; + collectColormapTargets(pipelineConfig.upperExpression, targets); + collectColormapTargets(pipelineConfig.lowerExpression, targets); + const topLayerSources = new Set(); + collectTopLayerSources(pipelineConfig.upperExpression, topLayerSources); + collectTopLayerSources(pipelineConfig.lowerExpression, topLayerSources); + const target = targets.find((candidate) => candidate.profile.source === source); + if (!target) { + return this.fetchVisualizationOptions(); + } + const options = visualizationOptionsFromTarget( + target, + this.visualizationOptionsStore.asVisualizationOptions(), + topLayerSources.has(source) + ); + this.visualizationOptionsStore.setVisualizationOptions(options); + window.dispatchEvent( + new CustomEvent(VisualizationManager.VISUALIZATION_OPTIONS_UPDATED_EVENT, { + detail: { source: "pipeline_source_fetch", options }, + }) + ); + return options; + } + private async getActiveRenderPipelineConfig(): Promise | null> { const config = await this.mapManager.networkManager.requestManager @@ -314,6 +566,30 @@ class VisualizationManager { return isRecord(config) && Boolean(config.enabled ?? false) ? config : null; } + private updateRenderPipelineSource( + config: Record, + source: SourceName, + options: VisualizationOptions + ): boolean { + const targets: ColormapTarget[] = []; + collectColormapTargets(config.upperExpression, targets); + collectColormapTargets(config.lowerExpression, targets); + const replacement = buildColorExpression(source, options) as unknown as Record< + string, + unknown + >; + let changed = false; + for (const target of targets) { + if (target.profile.source === source) { + replaceColormapNode(target, replacement); + changed = true; + } + } + applyTopLayerTransparency(config.upperExpression, source); + applyTopLayerTransparency(config.lowerExpression, source); + return changed; + } + private resolveResolutionScalingCoefficients(): { quadratic: number; linear: number; @@ -373,7 +649,19 @@ class VisualizationManager { return null; } const mapSizePx = Math.max(1, Math.round(rawMapSizePx)); - const extent = this.mapManager.getView().calculateExtent(size); + const view = this.mapManager.getView(); + const center = view.getCenter(); + const resolution = view.getResolution(); + if ( + !center || + center.length < 2 || + !center.every((value) => Number.isFinite(value)) || + resolution === undefined || + !Number.isFinite(resolution) + ) { + return null; + } + const extent = view.calculateExtent(size); const pad = Math.max(0, Math.round(paddingPx)); const clampLowerBound = (value: number): number => Math.max(0, Math.min(mapSizePx - 1, value)); @@ -471,9 +759,11 @@ class VisualizationManager { signalMode: "TRADITIONAL_NORMALIZED", } ); - const nextUpperBound = computeFiniteQuantile( + const nextUpperBound = resolveSafeAutoUpperBound( response.values, - options.autoThresholdQuantile + options.autoThresholdQuantile, + options.colormap.minSignal, + options.colormap.maxSignal ); if ( nextUpperBound == null || @@ -507,7 +797,8 @@ class VisualizationManager { } private async syncPipelineAutoThresholdToViewport( - config?: Record + config?: Record, + sourceFilter?: SourceName ): Promise { const options = this.visualizationOptionsStore.asVisualizationOptions(); if (!options.autoThresholdEnabled) { @@ -525,7 +816,10 @@ class VisualizationManager { const targets: ColormapTarget[] = []; collectColormapTargets(activeConfig.upperExpression, targets); collectColormapTargets(activeConfig.lowerExpression, targets); - if (targets.length === 0) { + const filteredTargets = sourceFilter + ? targets.filter((target) => target.profile.source === sourceFilter) + : targets; + if (filteredTargets.length === 0) { return false; } @@ -533,7 +827,7 @@ class VisualizationManager { const thresholdCache = new Map(); let changed = false; - for (const target of targets) { + for (const target of filteredTargets) { const cacheKey = JSON.stringify(target.profile); let nextUpperBound = thresholdCache.get(cacheKey); if (nextUpperBound === undefined) { @@ -545,13 +839,15 @@ class VisualizationManager { ? "COOLER_WEIGHTED" : "RAW_COUNTS", }); - nextUpperBound = computeFiniteQuantile( + nextUpperBound = resolveSafeAutoUpperBound( transformSignalsForProfile( response.values, target.profile, scalingCoefficients ), - options.autoThresholdQuantile + options.autoThresholdQuantile, + target.minSignal, + target.maxSignal ); thresholdCache.set(cacheKey, nextUpperBound); } @@ -632,10 +928,62 @@ class VisualizationManager { return result; } - public async refreshAutoThresholdAndReload(): Promise { + public async applyVisualizationSettingsForSourceAndReload( + source: SourceName + ): Promise { + const pipelineConfig = await this.getActiveRenderPipelineConfig(); + if (!pipelineConfig) { + return this.applyVisualizationSettingsAndReload(); + } + + const options = this.visualizationOptionsStore.asVisualizationOptions(); + const changed = this.updateRenderPipelineSource(pipelineConfig, source, options); + if (!changed) { + const hydrated = await this.loadVisualizationOptionsForSource(source); + await this.mapManager.reloadTilesFromBackend(); + return hydrated; + } + + await this.mapManager.networkManager.requestManager.setRenderPipelineConfig( + pipelineConfig + ); + if (options.autoThresholdEnabled) { + await this.syncPipelineAutoThresholdToViewport(pipelineConfig, source).catch( + () => false + ); + } + const hydrated = await this.loadVisualizationOptionsForSource(source); + await this.mapManager.reloadTilesFromBackend(); + return hydrated; + } + + public async swapRenderPipelineLayersAndReload(): Promise { + const pipelineConfig = await this.getActiveRenderPipelineConfig(); + if (!pipelineConfig) { + return false; + } + let changed = false; + changed = swapPixelBlendLayers(pipelineConfig.upperExpression) || changed; + changed = swapPixelBlendLayers(pipelineConfig.lowerExpression) || changed; + if (!changed) { + const upperExpression = pipelineConfig.upperExpression; + pipelineConfig.upperExpression = pipelineConfig.lowerExpression; + pipelineConfig.lowerExpression = upperExpression; + changed = true; + } + await this.mapManager.networkManager.requestManager.setRenderPipelineConfig( + pipelineConfig + ); + await this.mapManager.reloadTilesFromBackend(); + return changed; + } + + public async refreshAutoThresholdAndReload( + source?: SourceName + ): Promise { const pipelineConfig = await this.getActiveRenderPipelineConfig(); if (pipelineConfig) { - await this.syncPipelineAutoThresholdToViewport(pipelineConfig); + await this.syncPipelineAutoThresholdToViewport(pipelineConfig, source); return null; } const nextUpperBound = await this.syncAutoThresholdToViewport(); diff --git a/src/app/core/mapmanagers/resolutionModel.ts b/src/app/core/mapmanagers/resolutionModel.ts new file mode 100644 index 0000000..e05c280 --- /dev/null +++ b/src/app/core/mapmanagers/resolutionModel.ts @@ -0,0 +1,197 @@ +export type MatrixSourceName = "PRIMARY" | "SECONDARY"; + +export interface LayerResolutionBorders { + minResolutionInclusive: number; + maxResolutionExclusive: number; +} + +export interface LayerResolutionDescriptor { + sourceName: MatrixSourceName; + bpResolution: number; + pixelResolution: number; + layerResolutionBorders: LayerResolutionBorders; + imageSizeIndex: number; +} + +export interface SourceResolutionDescriptorSet { + sourceName: MatrixSourceName; + resolutions: number[]; + pixelResolutionSet: number[]; + imageSizes: number[]; + resolutionToPixelResolution: Map; + layerResolutionBorders: Map; + resolutionTuples: LayerResolutionDescriptor[]; +} + +export interface NavigationResolutionModel { + resolutions: number[]; + pixelResolutionSet: number[]; +} + +export function buildSourceResolutionDescriptorSet( + sourceName: MatrixSourceName, + resolutionsRaw: readonly number[], + imageSizesRaw: readonly number[], + coordinateBaseBp: number +): SourceResolutionDescriptorSet { + const baseBp = + Number.isFinite(coordinateBaseBp) && coordinateBaseBp > 0 + ? coordinateBaseBp + : 1; + const resolutions = resolutionsRaw + .map((value) => Number(value)) + .filter((value) => Number.isFinite(value) && value > 0); + const imageSizes = imageSizesRaw + .slice(0, resolutions.length) + .map((value) => Number(value)); + const pixelResolutionSet = resolutions.map((resolution) => resolution / baseBp); + const resolutionToPixelResolution = new Map(); + const layerResolutionBorders = new Map(); + const resolutionTuples: LayerResolutionDescriptor[] = []; + + for (let i = 0; i < resolutions.length; ++i) { + const bpResolution = resolutions[i]; + const pixelResolution = pixelResolutionSet[i]; + resolutionToPixelResolution.set(bpResolution, pixelResolution); + resolutionTuples.push({ + sourceName, + bpResolution, + pixelResolution, + layerResolutionBorders: { + minResolutionInclusive: Number.NaN, + maxResolutionExclusive: Number.NaN, + }, + imageSizeIndex: i, + }); + } + + resolutionTuples.sort((a, b) => a.pixelResolution - b.pixelResolution); + for (let i = 0; i < resolutionTuples.length; ++i) { + const borders: LayerResolutionBorders = { + minResolutionInclusive: + i === 0 ? Number.NEGATIVE_INFINITY : resolutionTuples[i].pixelResolution, + maxResolutionExclusive: + i === resolutionTuples.length - 1 + ? Number.POSITIVE_INFINITY + : resolutionTuples[i + 1].pixelResolution, + }; + resolutionTuples[i].layerResolutionBorders = borders; + layerResolutionBorders.set(resolutionTuples[i].bpResolution, borders); + } + resolutionTuples.sort( + (a, b) => + a.layerResolutionBorders.minResolutionInclusive - + b.layerResolutionBorders.minResolutionInclusive + ); + + return { + sourceName, + resolutions, + pixelResolutionSet, + imageSizes, + resolutionToPixelResolution, + layerResolutionBorders, + resolutionTuples, + }; +} + +export function calculateMaximumScaledImageSize( + primarySet: SourceResolutionDescriptorSet, + secondarySet?: SourceResolutionDescriptorSet +): number { + const candidates = [primarySet, secondarySet] + .filter((set): set is SourceResolutionDescriptorSet => Boolean(set)) + .flatMap((set) => + set.imageSizes.map( + (imageSize, index) => imageSize * (set.pixelResolutionSet[index] ?? 1) + ) + ); + return Math.max(1, ...candidates); +} + +export function getNavigationResolutionModel( + primarySet: SourceResolutionDescriptorSet, + secondarySet?: SourceResolutionDescriptorSet +): NavigationResolutionModel { + const descriptors = [ + ...primarySet.resolutionTuples, + ...(secondarySet?.resolutionTuples ?? []), + ].sort((a, b) => a.pixelResolution - b.pixelResolution); + const byPixelResolution = new Map(); + for (const descriptor of descriptors) { + if (!byPixelResolution.has(descriptor.pixelResolution)) { + byPixelResolution.set(descriptor.pixelResolution, descriptor); + } + } + const uniqueDescriptors = [...byPixelResolution.values()].sort( + (a, b) => a.pixelResolution - b.pixelResolution + ); + return { + resolutions: uniqueDescriptors.map((descriptor) => descriptor.bpResolution), + pixelResolutionSet: uniqueDescriptors.map( + (descriptor) => descriptor.pixelResolution + ), + }; +} + +export function getVectorResolutionTuples( + primarySet: SourceResolutionDescriptorSet, + // Vector overlays describe the current assembly state, not a matrix source. + // Keep them on the primary assembly resolution pyramid; OpenLayers scales + // their coordinates correctly while secondary data layers use their own + // independent, possibly finer, tile pyramid. + // eslint-disable-next-line @typescript-eslint/no-unused-vars + secondarySet?: SourceResolutionDescriptorSet +): LayerResolutionDescriptor[] { + const descriptors = [...primarySet.resolutionTuples]; + const byBpResolution = new Map(); + for (const descriptor of descriptors) { + const existing = byBpResolution.get(descriptor.bpResolution); + if (!existing || descriptor.pixelResolution < existing.pixelResolution) { + byBpResolution.set(descriptor.bpResolution, descriptor); + } + } + return [...byBpResolution.values()].sort( + (a, b) => a.pixelResolution - b.pixelResolution + ); +} + +export function getFinestVisibleResolutionDescriptor( + primarySet: SourceResolutionDescriptorSet, + secondarySet: SourceResolutionDescriptorSet | undefined, + viewResolution: number +): LayerResolutionDescriptor { + const primaryDescriptor = getResolutionDescriptorForViewResolution( + primarySet, + viewResolution + ); + if (!secondarySet) { + return primaryDescriptor; + } + const secondaryDescriptor = getResolutionDescriptorForViewResolution( + secondarySet, + viewResolution + ); + return secondaryDescriptor.pixelResolution < primaryDescriptor.pixelResolution + ? secondaryDescriptor + : primaryDescriptor; +} + +export function getResolutionDescriptorForViewResolution( + set: SourceResolutionDescriptorSet, + viewResolution: number +): LayerResolutionDescriptor { + const tuples = set.resolutionTuples; + if (tuples.length === 0) { + throw new Error("No resolutions available"); + } + let descriptor = tuples[0]; + for (const tuple of tuples) { + if (tuple.layerResolutionBorders.minResolutionInclusive <= viewResolution) { + descriptor = tuple; + } else { + break; + } + } + return descriptor; +} diff --git a/src/app/core/net/api/RequestManager.ts b/src/app/core/net/api/RequestManager.ts index 1883ed1..e11a72e 100644 --- a/src/app/core/net/api/RequestManager.ts +++ b/src/app/core/net/api/RequestManager.ts @@ -75,9 +75,12 @@ import { SetViewportExpectedProfileRequest, StartBatchConversionJobsRequest, StartConversionJobRequest, + StartDotplotJobsRequest, + ListDotplotJobsRequest, ListConversionJobsRequest, GetConversionJobRequest, GetConversionToolchainStatusRequest, + SetDotplotAlignerPreferenceRequest, StopConversionJobRequest, RenameContigRequest, RenameScaffoldRequest, @@ -106,6 +109,9 @@ import { GetTracksPrecomputeStatusRequest, ProbeTrackPrecomputeCacheRequest, GetWorkerDiagnosticsRequest, + GetNativeProcessingStatusRequest, + GetServerStatisticsRequest, + SetNativeProcessingEnabledRequest, GetRenderPipelineRequest, SetRenderPipelineRequest, ResetRenderPipelineRequest, @@ -137,6 +143,10 @@ export type SecondarySourceCompatibility = { exactMatch: boolean; primaryMaxBins: number; secondaryMaxBins: number; + primaryResolutions: number[]; + secondaryResolutions: number[]; + primaryPixelResolutions: number[]; + secondaryPixelResolutions: number[]; primaryBinsByResolution: number[]; secondaryBinsByResolution: number[]; mismatchedResolutionOrders: number[]; @@ -152,6 +162,48 @@ export type SecondarySourceStatusResponse = { compatibility?: SecondarySourceCompatibility; }; +export type NativeProcessingStatusResponse = { + requested: boolean; + enabled: boolean; + available: boolean; + version: string; + source: string; + reason: string; + lastFailure: string; + nativeSessionActive?: boolean; + nativeOperationCount?: number; + nativeFailedOperationCount?: number; + nativeHdf5BackendAvailable?: boolean; +}; + +export type ServerEndpointStatisticsResponse = { + path: string; + totalRequests: number; + requestsPerSecondLast10s: number; + requestsPerSecondLast60s: number; +}; + +export type ServerStatisticsResponse = { + timestampMs: number; + startedMs: number; + uptimeSeconds: number; + totalRequests: number; + inFlightRequests: number; + meanRequestsPerSecond: number; + requestsPerSecondLast10s: number; + requestsPerSecondLast60s: number; + heapUsedBytes: number; + heapCommittedBytes: number; + heapMaxBytes: number; + nonHeapUsedBytes: number; + availableProcessors: number; + liveThreads: number; + daemonThreads: number; + peakThreads: number; + endpoints: ServerEndpointStatisticsResponse[]; + nativeProcessing: NativeProcessingStatusResponse; +}; + class RequestManager { constructor(public readonly networkManager: NetworkManager) {} @@ -204,6 +256,34 @@ class RequestManager { exactMatch: Boolean(compatibilityRaw.exactMatch ?? false), primaryMaxBins: Number(compatibilityRaw.primaryMaxBins ?? 0), secondaryMaxBins: Number(compatibilityRaw.secondaryMaxBins ?? 0), + primaryResolutions: Array.isArray( + compatibilityRaw.primaryResolutions + ) + ? (compatibilityRaw.primaryResolutions as unknown[]).map( + (value) => Number(value ?? 0) + ) + : [], + secondaryResolutions: Array.isArray( + compatibilityRaw.secondaryResolutions + ) + ? (compatibilityRaw.secondaryResolutions as unknown[]).map( + (value) => Number(value ?? 0) + ) + : [], + primaryPixelResolutions: Array.isArray( + compatibilityRaw.primaryPixelResolutions + ) + ? (compatibilityRaw.primaryPixelResolutions as unknown[]).map( + (value) => Number(value ?? 0) + ) + : [], + secondaryPixelResolutions: Array.isArray( + compatibilityRaw.secondaryPixelResolutions + ) + ? (compatibilityRaw.secondaryPixelResolutions as unknown[]).map( + (value) => Number(value ?? 0) + ) + : [], primaryBinsByResolution: Array.isArray( compatibilityRaw.primaryBinsByResolution ) @@ -246,6 +326,59 @@ class RequestManager { }; } + private parseNativeProcessingStatus( + json: Record + ): NativeProcessingStatusResponse { + return { + requested: Boolean(json.requested ?? false), + enabled: Boolean(json.enabled ?? false), + available: Boolean(json.available ?? false), + version: String(json.version ?? "unknown"), + source: String(json.source ?? ""), + reason: String(json.reason ?? ""), + lastFailure: String(json.lastFailure ?? ""), + nativeSessionActive: Boolean(json.nativeSessionActive ?? false), + nativeOperationCount: Number(json.nativeOperationCount ?? 0), + nativeFailedOperationCount: Number(json.nativeFailedOperationCount ?? 0), + nativeHdf5BackendAvailable: Boolean(json.nativeHdf5BackendAvailable ?? false), + }; + } + + private parseServerStatistics( + json: Record + ): ServerStatisticsResponse { + const endpointsRaw = Array.isArray(json.endpoints) + ? (json.endpoints as Record[]) + : []; + const nativeProcessingRaw = + (json.nativeProcessing as Record | undefined) ?? {}; + return { + timestampMs: Number(json.timestampMs ?? 0), + startedMs: Number(json.startedMs ?? 0), + uptimeSeconds: Number(json.uptimeSeconds ?? 0), + totalRequests: Number(json.totalRequests ?? 0), + inFlightRequests: Number(json.inFlightRequests ?? 0), + meanRequestsPerSecond: Number(json.meanRequestsPerSecond ?? 0), + requestsPerSecondLast10s: Number(json.requestsPerSecondLast10s ?? 0), + requestsPerSecondLast60s: Number(json.requestsPerSecondLast60s ?? 0), + heapUsedBytes: Number(json.heapUsedBytes ?? 0), + heapCommittedBytes: Number(json.heapCommittedBytes ?? 0), + heapMaxBytes: Number(json.heapMaxBytes ?? 0), + nonHeapUsedBytes: Number(json.nonHeapUsedBytes ?? 0), + availableProcessors: Number(json.availableProcessors ?? 0), + liveThreads: Number(json.liveThreads ?? 0), + daemonThreads: Number(json.daemonThreads ?? 0), + peakThreads: Number(json.peakThreads ?? 0), + endpoints: endpointsRaw.map((endpoint) => ({ + path: String(endpoint.path ?? ""), + totalRequests: Number(endpoint.totalRequests ?? 0), + requestsPerSecondLast10s: Number(endpoint.requestsPerSecondLast10s ?? 0), + requestsPerSecondLast60s: Number(endpoint.requestsPerSecondLast60s ?? 0), + })), + nativeProcessing: this.parseNativeProcessingStatus(nativeProcessingRaw), + }; + } + public async sendRequest( request: HiCTAPIRequest, axiosConfig?: AxiosRequestConfig | undefined, @@ -457,9 +590,10 @@ class RequestManager { public async openCoolerWeightsTrack( name?: string, - color?: string + color?: string, + source?: "PRIMARY" | "SECONDARY" ): Promise { - return this.sendRequest(new OpenCoolerWeightsTrackRequest({ name, color })) + return this.sendRequest(new OpenCoolerWeightsTrackRequest({ name, color, source })) .then((response) => response.data) .then((json) => new TrackSummaryResponseDTO(json).toEntity()); } @@ -494,6 +628,9 @@ class RequestManager { renderMode?: string; aggregationMode?: string; logScale?: boolean; + rangeAuto?: boolean; + rangeMin?: number; + rangeMax?: number; } ): Promise { return this.sendRequest( @@ -505,6 +642,9 @@ class RequestManager { renderMode: options.renderMode, aggregationMode: options.aggregationMode, logScale: options.logScale, + rangeAuto: options.rangeAuto, + rangeMin: options.rangeMin, + rangeMax: options.rangeMax, }) ) .then((response) => response.data) @@ -680,6 +820,26 @@ class RequestManager { ); } + public async getNativeProcessingStatus(): Promise { + return this.sendRequest(new GetNativeProcessingStatusRequest()) + .then((response) => response.data as Record) + .then((json) => this.parseNativeProcessingStatus(json)); + } + + public async getServerStatistics(): Promise { + return this.sendRequest(new GetServerStatisticsRequest()) + .then((response) => response.data as Record) + .then((json) => this.parseServerStatistics(json)); + } + + public async setNativeProcessingEnabled( + enabled: boolean + ): Promise { + return this.sendRequest(new SetNativeProcessingEnabledRequest({ enabled })) + .then((response) => response.data as Record) + .then((json) => this.parseNativeProcessingStatus(json)); + } + public async getRenderPipelineConfig(): Promise> { return this.sendRequest(new GetRenderPipelineRequest()).then( (response) => response.data as Record @@ -728,6 +888,20 @@ class RequestManager { return this.sendRequest(request).then((response) => response.data); } + public async startDotplotJobs( + request: StartDotplotJobsRequest + ): Promise<{ status: string; groupId: string; jobIds: string[] }> { + return this.sendRequest(request).then((response) => response.data); + } + + public async listDotplotJobs(): Promise { + return this.sendRequest(new ListDotplotJobsRequest()).then((response) => + (response.data as Record[]).map((job) => + new ConversionJobResponseDTO(job).toEntity() + ) + ); + } + public async listConversionJobs(): Promise { return this.sendRequest(new ListConversionJobsRequest()).then((response) => (response.data as Record[]).map((job) => @@ -757,6 +931,16 @@ class RequestManager { ); } + public async setDotplotAlignerPreference( + alignerPreference: string + ): Promise { + return this.sendRequest( + new SetDotplotAlignerPreferenceRequest(alignerPreference) + ).then((response) => + new ConversionToolchainStatusResponseDTO(response.data).toEntity() + ); + } + public async renameContig( contigId: number, newName: string | null @@ -875,18 +1059,24 @@ class RequestManager { }); } - public async loadAGP(request: LoadAGPRequest): Promise { + public async loadAGP( + request: LoadAGPRequest, + options: { updateAssemblyState?: boolean } = {} + ): Promise { return this.sendRequest(request) .then((response) => response.data) .then((json) => new AssemblyInfoDTO(json).toEntity()) .then((asmInfo) => { - this.networkManager.mapManager?.contigDimensionHolder.updateContigData( - asmInfo.contigDescriptors - ); - this.networkManager.mapManager?.scaffoldHolder.updateScaffoldData( - asmInfo.scaffoldDescriptors - ); - this.networkManager.mapManager?.reloadVisuals(); + if (options.updateAssemblyState !== false) { + this.networkManager.mapManager?.contigDimensionHolder.updateContigData( + asmInfo.contigDescriptors + ); + this.networkManager.mapManager?.scaffoldHolder.updateScaffoldData( + asmInfo.scaffoldDescriptors + ); + this.networkManager.mapManager?.reloadVisuals(); + } + return asmInfo; }) .catch((err) => { throw new Error("Cannot link AGP file: " + err); diff --git a/src/app/core/net/api/request.ts b/src/app/core/net/api/request.ts index c8f0d08..82b8366 100644 --- a/src/app/core/net/api/request.ts +++ b/src/app/core/net/api/request.ts @@ -183,6 +183,7 @@ class StartConversionJobRequest implements HiCTAPIRequest { public constructor( public readonly options: { readonly filename: string; + readonly assemblyFilename?: string; readonly direction?: string; readonly overwrite?: boolean; readonly resolutions?: string; @@ -200,6 +201,8 @@ class StartBatchConversionJobsRequest implements HiCTAPIRequest { public constructor( public readonly options: { readonly files: string[]; + readonly assemblyFilename?: string; + readonly assemblyFilenameByFile?: Record; readonly parallelJobs: number; readonly parallelism: number; readonly overwrite?: boolean; @@ -233,6 +236,43 @@ class GetConversionToolchainStatusRequest implements HiCTAPIRequest { requestPath = "/convert/toolchain"; } +class SetDotplotAlignerPreferenceRequest implements HiCTAPIRequest { + requestPath = "/convert/toolchain/dotplot-aligner"; + + public constructor(public readonly alignerPreference: string) {} +} + +class StartDotplotJobsRequest implements HiCTAPIRequest { + requestPath = "/dotplot/jobs"; + + public constructor( + public readonly options: { + readonly fastaFiles: string[]; + readonly outputDirectory?: string; + readonly binSize: number; + readonly resolutions?: string; + readonly referenceMapFilename?: string; + readonly assemblyAgpFilename?: string; + readonly minimizerK: number; + readonly minimizerWindow: number; + readonly minChainScore: number; + readonly skipDiagonal: boolean; + readonly dropNearDiagonalBins: number; + readonly sampleBp?: number; + readonly minAlignmentLength?: number; + readonly extraMinimap2Args?: string; + readonly alignerPreference?: string; + readonly alignmentThreads: number; + readonly conversionThreads: number; + readonly overwrite?: boolean; + } + ) {} +} + +class ListDotplotJobsRequest implements HiCTAPIRequest { + requestPath = "/dotplot/jobs/list"; +} + class SetContrastRangeRequest implements HiCTAPIRequest { requestPath = "/set_contrast_range"; @@ -389,6 +429,24 @@ class GetWorkerDiagnosticsRequest implements HiCTAPIRequest { requestPath = "/diagnostics/workers"; } +class GetNativeProcessingStatusRequest implements HiCTAPIRequest { + requestPath = "/native_processing/status"; +} + +class GetServerStatisticsRequest implements HiCTAPIRequest { + requestPath = "/statistics"; +} + +class SetNativeProcessingEnabledRequest implements HiCTAPIRequest { + requestPath = "/native_processing/enabled"; + + public constructor( + public readonly options: { + readonly enabled: boolean; + } + ) {} +} + class GetRenderPipelineRequest implements HiCTAPIRequest { requestPath = "/render_pipeline/get"; } @@ -455,6 +513,7 @@ class OpenCoolerWeightsTrackRequest implements HiCTAPIRequest { public readonly options: { readonly name?: string; readonly color?: string; + readonly source?: "PRIMARY" | "SECONDARY"; } = {} ) {} } @@ -485,6 +544,9 @@ class UpdateTrackRequest implements HiCTAPIRequest { readonly renderMode?: string; readonly aggregationMode?: string; readonly logScale?: boolean; + readonly rangeAuto?: boolean; + readonly rangeMin?: number; + readonly rangeMax?: number; } ) {} } @@ -612,6 +674,9 @@ export { GetConversionJobRequest, StopConversionJobRequest, GetConversionToolchainStatusRequest, + SetDotplotAlignerPreferenceRequest, + StartDotplotJobsRequest, + ListDotplotJobsRequest, RenameContigRequest, RenameScaffoldRequest, ExportNameMappingRequest, @@ -661,6 +726,9 @@ export { GetTracksPrecomputeStatusRequest, ProbeTrackPrecomputeCacheRequest, GetWorkerDiagnosticsRequest, + GetNativeProcessingStatusRequest, + GetServerStatisticsRequest, + SetNativeProcessingEnabledRequest, GetRenderPipelineRequest, SetRenderPipelineRequest, ResetRenderPipelineRequest, diff --git a/src/app/core/net/api/response.ts b/src/app/core/net/api/response.ts index 892494e..deb66d5 100644 --- a/src/app/core/net/api/response.ts +++ b/src/app/core/net/api/response.ts @@ -72,6 +72,15 @@ class ConversionToolchainStatusResponse { public readonly hicConversionAvailable: boolean, public readonly hictkAvailable: boolean, public readonly hictkCommand: string | null, + public readonly minimap2Available: boolean, + public readonly minimap2Command: string | null, + public readonly mm2PlusAvx2Available: boolean, + public readonly mm2PlusAvx2Command: string | null, + public readonly mm2PlusAvx512Available: boolean, + public readonly mm2PlusAvx512Command: string | null, + public readonly dotplotAlignerPreference: string, + public readonly selectedDotplotAligner: string, + public readonly selectedDotplotAlignerCommand: string | null, public readonly coolerAvailable: boolean, public readonly coolerCommand: string | null, public readonly pythonAvailable: boolean, @@ -110,7 +119,10 @@ class TrackSummaryResponse { public readonly renderStyle: string, public readonly renderMode: string, public readonly aggregationMode: string, - public readonly logScale: boolean + public readonly logScale: boolean, + public readonly rangeAuto: boolean, + public readonly rangeMin: number, + public readonly rangeMax: number ) {} } @@ -139,7 +151,8 @@ class TrackBinResponse { public readonly thickStartPx: number | null, public readonly thickEndPx: number | null, public readonly featureType: string | null, - public readonly blocks: TrackBinBlockResponse[] + public readonly blocks: TrackBinBlockResponse[], + public readonly attributes: Record ) {} } diff --git a/src/app/core/net/dto/requestDTO.ts b/src/app/core/net/dto/requestDTO.ts index 7a426fe..677b62d 100644 --- a/src/app/core/net/dto/requestDTO.ts +++ b/src/app/core/net/dto/requestDTO.ts @@ -41,6 +41,8 @@ import { GetSecondarySourceStatusRequest, SetAssemblyInfoSourceRequest, GetWorkerDiagnosticsRequest, + GetNativeProcessingStatusRequest, + SetNativeProcessingEnabledRequest, GetRenderPipelineRequest, SetRenderPipelineRequest, ResetRenderPipelineRequest, @@ -51,6 +53,7 @@ import { SaveFileRequest, GetAGPForAssemblyRequest, ListCoolerFilesRequest, + ListConvertibleMatrixFilesRequest, ListTrackFilesRequest, ResolveMatrixSourceRequest, DropAllCachesRequest, @@ -69,6 +72,9 @@ import { ProbeTrackPrecomputeCacheRequest, StartConversionJobRequest, StartBatchConversionJobsRequest, + StartDotplotJobsRequest, + SetDotplotAlignerPreferenceRequest, + ListDotplotJobsRequest, ListConversionJobsRequest, GetConversionJobRequest, StopConversionJobRequest, @@ -123,6 +129,16 @@ abstract class HiCTAPIRequestDTO< return new StartBatchConversionJobsRequestDTO( entity as StartBatchConversionJobsRequest ); + case entity instanceof StartDotplotJobsRequest: + return new StartDotplotJobsRequestDTO( + entity as StartDotplotJobsRequest + ); + case entity instanceof SetDotplotAlignerPreferenceRequest: + return new SetDotplotAlignerPreferenceRequestDTO( + entity as SetDotplotAlignerPreferenceRequest + ); + case entity instanceof ListDotplotJobsRequest: + return new ListDotplotJobsRequestDTO(entity as ListDotplotJobsRequest); case entity instanceof UngroupContigsFromScaffoldRequest: return new UngroupContigsFromScaffoldRequestDTO( entity as UngroupContigsFromScaffoldRequest @@ -149,6 +165,8 @@ abstract class HiCTAPIRequestDTO< return new ListFilesDetailedRequestDTO(entity); case entity instanceof ListCoolerFilesRequest: return new ListCoolerFilesRequestDTO(entity); + case entity instanceof ListConvertibleMatrixFilesRequest: + return new ListConvertibleMatrixFilesRequestDTO(entity); case entity instanceof ListTrackFilesRequest: return new ListTrackFilesRequestDTO(entity); case entity instanceof ResolveMatrixSourceRequest: @@ -237,6 +255,12 @@ abstract class HiCTAPIRequestDTO< ); case entity instanceof GetWorkerDiagnosticsRequest: return new GetWorkerDiagnosticsRequestDTO(entity); + case entity instanceof GetNativeProcessingStatusRequest: + return new GetNativeProcessingStatusRequestDTO(entity); + case entity instanceof SetNativeProcessingEnabledRequest: + return new SetNativeProcessingEnabledRequestDTO( + entity as SetNativeProcessingEnabledRequest + ); case entity instanceof GetRenderPipelineRequest: return new GetRenderPipelineRequestDTO(entity); case entity instanceof SetRenderPipelineRequest: @@ -308,7 +332,22 @@ abstract class HiCTAPIRequestDTO< ); case "/tracks/reorder": return new ReorderTrackRequestDTO(entity as ReorderTrackRequest); + case "/list_convertible_matrices": + return new ListConvertibleMatrixFilesRequestDTO( + entity as ListConvertibleMatrixFilesRequest + ); + case "/native_processing/status": + return new GetNativeProcessingStatusRequestDTO( + entity as GetNativeProcessingStatusRequest + ); + case "/native_processing/enabled": + return new SetNativeProcessingEnabledRequestDTO( + entity as SetNativeProcessingEnabledRequest + ); default: + if (!("options" in entity)) { + return new EmptyRequestDTO(entity); + } throw new Error( `Unknown HiCTAPIRequest type: ${typeof entity}, constructor ${ entity.constructor @@ -318,6 +357,12 @@ abstract class HiCTAPIRequestDTO< } } +class EmptyRequestDTO extends HiCTAPIRequestDTO { + toDTO(): Record { + return {}; + } +} + class GetVisualizationOptionsRequestDTO extends HiCTAPIRequestDTO { toDTO(): Record { return {}; @@ -365,6 +410,20 @@ class GetWorkerDiagnosticsRequestDTO extends HiCTAPIRequestDTO { + toDTO(): Record { + return {}; + } +} + +class SetNativeProcessingEnabledRequestDTO extends HiCTAPIRequestDTO { + toDTO(): Record { + return { + enabled: this.entity.options.enabled, + }; + } +} + class GetRenderPipelineRequestDTO extends HiCTAPIRequestDTO { toDTO(): Record { return {}; @@ -427,6 +486,7 @@ class StartConversionJobRequestDTO extends HiCTAPIRequestDTO { return { filename: this.entity.options.filename, + assemblyFilename: this.entity.options.assemblyFilename, direction: this.entity.options.direction, overwrite: this.entity.options.overwrite, resolutions: this.entity.options.resolutions, @@ -442,6 +502,8 @@ class StartBatchConversionJobsRequestDTO extends HiCTAPIRequestDTO { return { files: this.entity.options.files, + assemblyFilename: this.entity.options.assemblyFilename, + assemblyFilenameByFile: this.entity.options.assemblyFilenameByFile, parallelJobs: this.entity.options.parallelJobs, parallelism: this.entity.options.parallelism, overwrite: this.entity.options.overwrite, @@ -453,6 +515,45 @@ class StartBatchConversionJobsRequestDTO extends HiCTAPIRequestDTO { + toDTO(): Record { + return { + fastaFiles: this.entity.options.fastaFiles, + outputDirectory: this.entity.options.outputDirectory, + binSize: this.entity.options.binSize, + resolutions: this.entity.options.resolutions, + referenceMapFilename: this.entity.options.referenceMapFilename, + assemblyAgpFilename: this.entity.options.assemblyAgpFilename, + minimizerK: this.entity.options.minimizerK, + minimizerWindow: this.entity.options.minimizerWindow, + minChainScore: this.entity.options.minChainScore, + skipDiagonal: this.entity.options.skipDiagonal, + dropNearDiagonalBins: this.entity.options.dropNearDiagonalBins, + sampleBp: this.entity.options.sampleBp, + minAlignmentLength: this.entity.options.minAlignmentLength, + extraMinimap2Args: this.entity.options.extraMinimap2Args, + alignerPreference: this.entity.options.alignerPreference, + alignmentThreads: this.entity.options.alignmentThreads, + conversionThreads: this.entity.options.conversionThreads, + overwrite: this.entity.options.overwrite, + }; + } +} + +class SetDotplotAlignerPreferenceRequestDTO extends HiCTAPIRequestDTO { + toDTO(): Record { + return { + alignerPreference: this.entity.alignerPreference, + }; + } +} + +class ListDotplotJobsRequestDTO extends HiCTAPIRequestDTO { + toDTO(): Record { + return {}; + } +} + class ListConversionJobsRequestDTO extends HiCTAPIRequestDTO { toDTO(): Record { return {}; @@ -635,6 +736,12 @@ class ListCoolerFilesRequestDTO extends HiCTAPIRequestDTO { + toDTO(): Record { + return {}; + } +} + class ListTrackFilesRequestDTO extends HiCTAPIRequestDTO { toDTO(): Record { return {}; @@ -670,6 +777,7 @@ class OpenCoolerWeightsTrackRequestDTO extends HiCTAPIRequestDTO { renderMode: this.entity.options.renderMode, aggregationMode: this.entity.options.aggregationMode, logScale: this.entity.options.logScale, + rangeAuto: this.entity.options.rangeAuto, + rangeMin: this.entity.options.rangeMin, + rangeMax: this.entity.options.rangeMax, }; } } @@ -876,6 +987,9 @@ export { DropAllCachesRequestDTO, StartConversionJobRequestDTO, StartBatchConversionJobsRequestDTO, + StartDotplotJobsRequestDTO, + SetDotplotAlignerPreferenceRequestDTO, + ListDotplotJobsRequestDTO, ListConversionJobsRequestDTO, GetConversionJobRequestDTO, StopConversionJobRequestDTO, @@ -913,4 +1027,6 @@ export { SetVisualizationOptionsRequestDTO, SetViewportExpectedProfileRequestDTO, GetWorkerDiagnosticsRequestDTO, + GetNativeProcessingStatusRequestDTO, + SetNativeProcessingEnabledRequestDTO, }; diff --git a/src/app/core/net/dto/responseDTO.ts b/src/app/core/net/dto/responseDTO.ts index b8e743e..e32625e 100644 --- a/src/app/core/net/dto/responseDTO.ts +++ b/src/app/core/net/dto/responseDTO.ts @@ -131,6 +131,15 @@ class ConversionToolchainStatusResponseDTO extends InboundDTO { (this.json["renderStyle"] as string) ?? "SIGNAL", (this.json["renderMode"] as string) ?? "COVERAGE", (this.json["aggregationMode"] as string) ?? "MAX", - (this.json["logScale"] as boolean) ?? false + (this.json["logScale"] as boolean) ?? false, + (this.json["rangeAuto"] as boolean) ?? true, + Number(this.json["rangeMin"] ?? 0), + Number(this.json["rangeMax"] ?? 1) ); } } @@ -196,7 +208,21 @@ class TrackBinResponseDTO extends InboundDTO { (this.json["featureType"] as string) ?? null, ((this.json["blocks"] as Record[]) ?? []).map( (block) => new TrackBinBlockResponseDTO(block).toEntity() - ) + ), + this.parseAttributes(this.json["attributes"]) + ); + } + + private parseAttributes(value: unknown): Record { + if (typeof value !== "object" || value === null || Array.isArray(value)) { + return {}; + } + return Object.fromEntries( + Object.entries(value as Record) + .filter((entry): entry is [string, string | number | boolean] => + ["string", "number", "boolean"].includes(typeof entry[1]) + ) + .map(([key, rawValue]) => [key, String(rawValue)]) ); } } diff --git a/src/app/core/tracks/Track2DAnnotations.ts b/src/app/core/tracks/Track2DAnnotations.ts index 8bebd2f..04dafcb 100644 --- a/src/app/core/tracks/Track2DAnnotations.ts +++ b/src/app/core/tracks/Track2DAnnotations.ts @@ -157,7 +157,7 @@ class AnnotationTrack2D extends Track2DSymmetric { this.features.set(resolution, []); } const viewManager = this.mapManager.getLayersManager(); - for (const resolutionTuple of viewManager.resolutionTuples) { + for (const resolutionTuple of viewManager.getVectorResolutionTuples()) { const bpResolution = resolutionTuple.bpResolution; const pixelResolution = resolutionTuple.pixelResolution; const targetFeatures = this.features.get(bpResolution); diff --git a/src/app/core/tracks/Track2DSymmetric.ts b/src/app/core/tracks/Track2DSymmetric.ts index 20b2cd0..f854724 100644 --- a/src/app/core/tracks/Track2DSymmetric.ts +++ b/src/app/core/tracks/Track2DSymmetric.ts @@ -261,7 +261,7 @@ class BasePairsTrack2DSymmetric extends Track2DSymmetric { } this.descriptor.bordersBp.forEach((bordersBp) => { for (const resolutionTuple of this.viewAndLayersManager - .resolutionTuples) { + .getVectorResolutionTuples()) { const [fromPx, toPx] = bordersBp.map((bp) => this.contigDimensionHolder.getPxContainingBp( bp, @@ -375,7 +375,7 @@ class ContigBordersTrack2D extends WithRing { ]; const pixelResolution = - viewAndLayersManager.resolutionToPixelResolution.get(resolution); + viewAndLayersManager.getPixelResolutionForBpResolution(resolution); if (!pixelResolution) { throw new Error( `Cannot get pixel resolution for bp resolution = ${resolution}` @@ -505,7 +505,7 @@ class ScaffoldBordersTrack2D extends WithRing { } const pixelResolution = - viewAndLayersManager.resolutionToPixelResolution.get( + viewAndLayersManager.getPixelResolutionForBpResolution( bpResolution ); if (!pixelResolution) { @@ -640,7 +640,7 @@ class TranslocationArrowsTrack2D extends Track2DSymmetric { const multiPolygonRings = []; const pixelResolution = - viewAndLayersManager.resolutionToPixelResolution.get( + viewAndLayersManager.getPixelResolutionForBpResolution( resolution ); if (!pixelResolution) { @@ -744,7 +744,7 @@ class TranslocationArrowsTrack2D extends Track2DSymmetric { const multiPolygonRings = []; const pixelResolution = - viewAndLayersManager.resolutionToPixelResolution.get(resolution); + viewAndLayersManager.getPixelResolutionForBpResolution(resolution); if (!pixelResolution) { throw new Error( `Cannot get pixel resolution for bp resolution = ${resolution}` diff --git a/src/app/core/visualization/colormap/default_options.json b/src/app/core/visualization/colormap/default_options.json index c568a8a..5499bfc 100644 --- a/src/app/core/visualization/colormap/default_options.json +++ b/src/app/core/visualization/colormap/default_options.json @@ -442,6 +442,52 @@ "labelColor": "rgba(255, 255, 0, 1)" } } + }, + { + "option_id": 9, + "options": { + "preLogBase": 10, + "postLogBase": 5, + "applyCoolerWeights": true, + "autoThresholdEnabled": true, + "autoThresholdQuantile": 0.995, + "colormap": { + "colormapType": "SimpleLinearGradient", + "startColorRGBAString": "rgba(255,255,255,1.000000)", + "endColorRGBAString": "rgba(232,0,0,1.000000)", + "minSignal": 0, + "maxSignal": 0.003 + } + }, + "name": "Hi-C balanced red auto", + "backgroundColor": "rgb(255,255,255)", + "signalThresholds": { + "lowerSignalBound": 0, + "upperSignalBound": 0.003 + } + }, + { + "option_id": 10, + "options": { + "preLogBase": 10, + "postLogBase": 0, + "applyCoolerWeights": false, + "autoThresholdEnabled": true, + "autoThresholdQuantile": 0.995, + "colormap": { + "colormapType": "SimpleLinearGradient", + "startColorRGBAString": "rgba(255,255,255,0.000000)", + "endColorRGBAString": "rgba(0,0,0,1.000000)", + "minSignal": 0, + "maxSignal": 1 + } + }, + "name": "Dotplot overlay black", + "backgroundColor": "rgb(255,255,255)", + "signalThresholds": { + "lowerSignalBound": 0, + "upperSignalBound": 1 + } } ] } diff --git a/src/app/core/visualization/renderPipelineWizard.ts b/src/app/core/visualization/renderPipelineWizard.ts index 929b95c..ca3b81f 100644 --- a/src/app/core/visualization/renderPipelineWizard.ts +++ b/src/app/core/visualization/renderPipelineWizard.ts @@ -34,7 +34,7 @@ export type WizardBlendMode = | "DARKEN" | "XOR"; -type SourceName = "PRIMARY" | "SECONDARY"; +export type SourceName = "PRIMARY" | "SECONDARY"; type TrackAxis = "ROW" | "COL"; type PipelineExpression = @@ -161,7 +161,7 @@ const buildSignalExpression = ( return expression; }; -const buildColorExpression = ( +export const buildColorExpression = ( source: SourceName, options: VisualizationOptions ): PipelineExpression => { @@ -191,6 +191,18 @@ const buildColorExpression = ( }; }; +const withTransparentMinimumColor = ( + expression: PipelineExpression +): PipelineExpression => { + if (expression.type !== "colormap") { + return expression; + } + return { + ...expression, + startColor: `${expression.startColor.slice(0, 7)}00`, + }; +}; + export const buildWizardRenderPipelineConfig = (options: { viewMode: WizardViewMode; primaryOptions: VisualizationOptions; @@ -214,8 +226,8 @@ export const buildWizardRenderPipelineConfig = (options: { const overlay: PipelineExpression = { type: "pixel_blend", mode: options.blendMode ?? "OVER", - top: primary, - bottom: secondary, + top: withTransparentMinimumColor(secondary), + bottom: primary, topOpacity: typeof options.topOpacity === "number" ? options.topOpacity : 0.5, bottomOpacity: diff --git a/src/app/stores/matrixViewStore.ts b/src/app/stores/matrixViewStore.ts index 029daef..49c1a9e 100644 --- a/src/app/stores/matrixViewStore.ts +++ b/src/app/stores/matrixViewStore.ts @@ -8,6 +8,8 @@ export const useMatrixViewStore = defineStore("matrixViewStore", () => { const presentationMode = ref("single"); const horizontalFastaSource = ref("PRIMARY"); const verticalFastaSource = ref("PRIMARY"); + const activeVisualizationSource = ref("PRIMARY"); + const layersSwapped = ref(false); function setPresentationMode(mode: MatrixPresentationMode) { presentationMode.value = mode; @@ -21,18 +23,37 @@ export const useMatrixViewStore = defineStore("matrixViewStore", () => { verticalFastaSource.value = vertical; } + function setActiveVisualizationSource(source: MatrixSourceName) { + activeVisualizationSource.value = source; + } + + function setLayersSwapped(value: boolean) { + layersSwapped.value = value; + } + + function toggleLayersSwapped() { + layersSwapped.value = !layersSwapped.value; + } + function reset() { presentationMode.value = "single"; horizontalFastaSource.value = "PRIMARY"; verticalFastaSource.value = "PRIMARY"; + activeVisualizationSource.value = "PRIMARY"; + layersSwapped.value = false; } return { presentationMode, horizontalFastaSource, verticalFastaSource, + activeVisualizationSource, + layersSwapped, setPresentationMode, setSelectionFastaSources, + setActiveVisualizationSource, + setLayersSwapped, + toggleLayersSwapped, reset, }; }); diff --git a/src/app/ui/MainUIComponent.vue b/src/app/ui/MainUIComponent.vue index d1e0262..58bdc4f 100644 --- a/src/app/ui/MainUIComponent.vue +++ b/src/app/ui/MainUIComponent.vue @@ -755,6 +755,9 @@ function onFileSelected(newFilename: string) { .main-ui-component { width: 100%; height: 100vh; + overflow: hidden; + display: flex; + flex-direction: column; } .open-progress-modal { diff --git a/src/app/ui/components/common/FileSelectionTable.vue b/src/app/ui/components/common/FileSelectionTable.vue new file mode 100644 index 0000000..93bf2e3 --- /dev/null +++ b/src/app/ui/components/common/FileSelectionTable.vue @@ -0,0 +1,422 @@ + + + + + + + diff --git a/src/app/ui/components/common/FileSelectionTableTypes.ts b/src/app/ui/components/common/FileSelectionTableTypes.ts new file mode 100644 index 0000000..e1e16c2 --- /dev/null +++ b/src/app/ui/components/common/FileSelectionTableTypes.ts @@ -0,0 +1,32 @@ +/* + * MIT License + * + * Copyright (c) 2021-2026 Aleksandr Serdiukov, Anton Zamyatin, Aleksandr Sinitsyn, Vitalii Dravgelis, Zakhar Lobanov, Nikita Zheleznov and Computer Technologies Laboratory ITMO University team. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +export type FileSelectionTableEntry = { + path: string; + name?: string; + sizeBytes?: number; + modifiedAtMs?: number; + extension?: string; + iconClass?: string; +}; diff --git a/src/app/ui/components/sidebar/ColorPickerRectangle.vue b/src/app/ui/components/sidebar/ColorPickerRectangle.vue index 3405413..a77f0f2 100644 --- a/src/app/ui/components/sidebar/ColorPickerRectangle.vue +++ b/src/app/ui/components/sidebar/ColorPickerRectangle.vue @@ -20,7 +20,7 @@ --> @@ -114,4 +114,27 @@ const colorSelectorStyleObject: Ref> = ref({ "border-radius": "2px", }); - + diff --git a/src/app/ui/components/sidebar/SavedLocations.vue b/src/app/ui/components/sidebar/SavedLocations.vue index 87ddc7f..094fcef 100644 --- a/src/app/ui/components/sidebar/SavedLocations.vue +++ b/src/app/ui/components/sidebar/SavedLocations.vue @@ -30,7 +30,7 @@ name="btnradio" type="radio" :checked="activeTab === 'bookmarks'" - @change="activeTab = 'bookmarks'" + @change="setActiveTab('bookmarks')" />