diff --git a/.github/ai/compiled/pr.d.ts b/.github/ai/compiled/pr.d.ts new file mode 100644 index 0000000..7336346 --- /dev/null +++ b/.github/ai/compiled/pr.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=pr.d.ts.map \ No newline at end of file diff --git a/.github/ai/compiled/pr.d.ts.map b/.github/ai/compiled/pr.d.ts.map new file mode 100644 index 0000000..dea976d --- /dev/null +++ b/.github/ai/compiled/pr.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pr.d.ts","sourceRoot":"","sources":["../src/pr.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/.github/ai/compiled/pr.js b/.github/ai/compiled/pr.js new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/.github/ai/compiled/pr.js @@ -0,0 +1 @@ +export {}; diff --git a/.github/ai/compiled/prompt.d.ts b/.github/ai/compiled/prompt.d.ts new file mode 100644 index 0000000..69ca8a8 --- /dev/null +++ b/.github/ai/compiled/prompt.d.ts @@ -0,0 +1,2 @@ +export declare const handle: (text: string) => Promise; +//# sourceMappingURL=prompt.d.ts.map \ No newline at end of file diff --git a/.github/ai/compiled/prompt.d.ts.map b/.github/ai/compiled/prompt.d.ts.map new file mode 100644 index 0000000..1fb752f --- /dev/null +++ b/.github/ai/compiled/prompt.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,MAAM,GAAU,MAAM,MAAM,iBAmCxC,CAAA"} \ No newline at end of file diff --git a/.github/ai/compiled/prompt.js b/.github/ai/compiled/prompt.js new file mode 100644 index 0000000..674aef8 --- /dev/null +++ b/.github/ai/compiled/prompt.js @@ -0,0 +1,46 @@ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +import { join } from "node:path"; +import { readFileSync } from "node:fs"; +const data = join(import.meta.dirname, "../prompt.schema.json"); +const schema = JSON.parse(readFileSync(data).toString()); +export const handle = (text) => __awaiter(void 0, void 0, void 0, function* () { + const path = "https://models.github.ai/orgs/ahqstore/inference/chat/completions"; + const response = yield fetch(path, { + method: "POST", + body: JSON.stringify({ + max_tokens: 4096, + messages: [ + { + content: "Classify the text as per the schema given", + role: "system" + }, + { + content: text, + role: "user" + } + ], + model: "openai/gpt-4.1-mini", + response_format: { + type: "json_schema", + json_schema: schema + } + }, null, 2), + headers: { + "content-type": "application/json", + "accept": "application/vnd.github+json", + "User-Agent": "AHQ Store Scripts", + "Authorization": `Bearer ${process.env["GITHUB_TOKEN"]}` + } + }).then((d) => d.json()); + console.log(response); + console.log(JSON.stringify(response, null, 4)); + return JSON.parse(response.choices[0].message.content); +}); diff --git a/.github/ai/compiled/type.d.ts b/.github/ai/compiled/type.d.ts new file mode 100644 index 0000000..d28c088 --- /dev/null +++ b/.github/ai/compiled/type.d.ts @@ -0,0 +1,24 @@ +export interface Body { + model: "openai/gpt-4.1-mini"; + messages: Message[]; + max_tokens: number; + response_format: { + type: "json_schema"; + json_schema: Object; + }; +} +export interface Message { + role: "assistant" | "developer" | "system" | "user"; + content: string; +} +export interface Response { + choices: Array<{ + message: { + /** The content of the message. */ + content: string; + /** The role of the message. */ + role: string; + }; + }>; +} +//# sourceMappingURL=type.d.ts.map \ No newline at end of file diff --git a/.github/ai/compiled/type.d.ts.map b/.github/ai/compiled/type.d.ts.map new file mode 100644 index 0000000..95c6f68 --- /dev/null +++ b/.github/ai/compiled/type.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../src/type.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,qBAAqB,CAAA;IAC5B,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,eAAe,EAAE;QACf,IAAI,EAAE,aAAa,CAAC;QACpB,WAAW,EAAE,MAAM,CAAA;KACpB,CAAA;CACF;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAA;IACnD,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,KAAK,CAAC;QACb,OAAO,EAAE;YACP,kCAAkC;YAClC,OAAO,EAAE,MAAM,CAAC;YAChB,+BAA+B;YAC/B,IAAI,EAAE,MAAM,CAAC;SACd,CAAC;KACH,CAAC,CAAC;CACJ"} \ No newline at end of file diff --git a/.github/ai/compiled/type.js b/.github/ai/compiled/type.js new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/.github/ai/compiled/type.js @@ -0,0 +1 @@ +export {}; diff --git a/.github/ai/package.json b/.github/ai/package.json new file mode 100644 index 0000000..e07138a --- /dev/null +++ b/.github/ai/package.json @@ -0,0 +1,20 @@ +{ + "name": "ai", + "version": "1.0.0", + "description": "", + "main": "index.js", + "type": "module", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "packageManager": "pnpm@10.13.1", + "devDependencies": { + "@types/node": "^24.1.0", + "concurrently": "^9.2.0", + "nodemon": "^3.1.10", + "typescript": "^5.8.3" + } +} diff --git a/.github/ai/pnpm-lock.yaml b/.github/ai/pnpm-lock.yaml new file mode 100644 index 0000000..930bb2c --- /dev/null +++ b/.github/ai/pnpm-lock.yaml @@ -0,0 +1,472 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@types/node': + specifier: ^24.1.0 + version: 24.1.0 + concurrently: + specifier: ^9.2.0 + version: 9.2.0 + nodemon: + specifier: ^3.1.10 + version: 3.1.10 + typescript: + specifier: ^5.8.3 + version: 5.8.3 + +packages: + + '@types/node@24.1.0': + resolution: {integrity: sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concurrently@9.2.0: + resolution: {integrity: sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ==} + engines: {node: '>=18'} + hasBin: true + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nodemon@3.1.10: + resolution: {integrity: sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==} + engines: {node: '>=10'} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + touch@3.1.1: + resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} + hasBin: true + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + + undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + + undici-types@7.8.0: + resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + +snapshots: + + '@types/node@24.1.0': + dependencies: + undici-types: 7.8.0 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + balanced-match@1.0.2: {} + + binary-extensions@2.3.0: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + concat-map@0.0.1: {} + + concurrently@9.2.0: + dependencies: + chalk: 4.1.2 + lodash: 4.17.21 + rxjs: 7.8.2 + shell-quote: 1.8.3 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + + debug@4.4.1(supports-color@5.5.0): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 5.5.0 + + emoji-regex@8.0.0: {} + + escalade@3.2.0: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + fsevents@2.3.3: + optional: true + + get-caller-file@2.0.5: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + ignore-by-default@1.0.1: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + lodash@4.17.21: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + ms@2.1.3: {} + + nodemon@3.1.10: + dependencies: + chokidar: 3.6.0 + debug: 4.4.1(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 7.7.2 + simple-update-notifier: 2.0.0 + supports-color: 5.5.0 + touch: 3.1.1 + undefsafe: 2.0.5 + + normalize-path@3.0.0: {} + + picomatch@2.3.1: {} + + pstree.remy@1.1.8: {} + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + require-directory@2.1.1: {} + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + semver@7.7.2: {} + + shell-quote@1.8.3: {} + + simple-update-notifier@2.0.0: + dependencies: + semver: 7.7.2 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + touch@3.1.1: {} + + tree-kill@1.2.2: {} + + tslib@2.8.1: {} + + typescript@5.8.3: {} + + undefsafe@2.0.5: {} + + undici-types@7.8.0: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + y18n@5.0.8: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 diff --git a/.github/ai/pr.schema.json b/.github/ai/pr.schema.json new file mode 100644 index 0000000..1f61eae --- /dev/null +++ b/.github/ai/pr.schema.json @@ -0,0 +1,35 @@ +{ + "name": "Response", + "strict": true, + "schema": { + "type": "object", + "properties": { + "length": { + "description": "Suggest the length of the body. Use the items in the enum.\nToo Long: The description is too long for its provided intent.\nLong: The Description is a bit longer than how much long an issue should be (recommended size: 200words max)\nGood: The description is perfect for its intent", + "enum": ["Too Long", "Long", "Good"] + }, + "words": { + "description": "Total words present", + "type": "integer" + }, + "tone": { + "description": "Describes the tone of the body", + "enum": ["Respectful", "Casual", "Too Formal", "Disrespectful"] + }, + "spam": { + "description": "Is it spam?", + "enum": ["Absolutely", "Probably", "No"] + }, + "warn": { + "description": "Warning to the user only if the user is desrespectful in the conversation", + "type": "string" + }, + "summary": { + "description": "Provide a summary in nicely formatted markdown, you should use `-` to show bullet points (set it only if the length is set to \"Too Long\" or \"Long\" or else let it be an empty string)", + "type": "string" + } + }, + "additionalProperties": false, + "required": ["length", "warn", "spam", "tone", "words", "summary"] + } +} diff --git a/.github/ai/prompt.schema.json b/.github/ai/prompt.schema.json new file mode 100644 index 0000000..2705834 --- /dev/null +++ b/.github/ai/prompt.schema.json @@ -0,0 +1,52 @@ +{ + "name": "Response", + "strict": true, + "schema": { + "type": "object", + "properties": { + "length": { + "description": "Suggest the length of the body. Use the items in the enum. A description within 300 words is considered Good in length. Longer descriptions takes more time to read and can be easily shortened.\nToo Long: The description is too long for its provided intent.\nLong: The Description is a bit longer than how much long an issue should be\nGood: The description is perfect for its intent", + "enum": ["Too Long", "Long", "Good"] + }, + "words": { + "description": "Total words present", + "type": "integer" + }, + "tone": { + "description": "Describes the tone of the body", + "enum": ["Respectful", "Casual", "Too Formal", "Disrespectful"] + }, + "toneInfo": { + "description": "Inform that user that the tone is casual or too formal and that it inhibits professionalism (Empty string if the tone is not \"Casual\" or \"Too Formal\"). You can use `@user` to ping them", + "type": "string" + }, + "spam": { + "description": "Is it spam?", + "type": "boolean" + }, + "warn": { + "description": "Warning to the user only if the user is desrespectful in the conversation or is engaged in spam activities. You can use `@user` to ping them. Do inform them that they can get blocked if they continue this.", + "type": "string" + }, + "summary": { + "description": "Provide a summary in nicely formatted markdown, you should use `-` and form the summary in bullet points in all the languages English, Hindi, Bengali, Sanskrit, French, German, Chinese. You can omit the English summary if the original body is not more than 300 characters. Start with \"# Summary (English)\", \"# Summary (Hindi)\", \"# Summary (Bengali)\", \"# Summary (Sanskrit)\", \"# Summary (French)\", \"# Summary (German)\", \"# Summary (Chinese)\"", + "type": "string" + }, + "comment": { + "description": "Anything else you'd like to tell the user, \"@user\" to ping them if you want to. You can also add a short comment about length, if thats too long. Also that the devs will look into it shortly etc. Can be empty string. Recommendation is to say something to the user. Keep it a bit long and a bit details (not too long). Also tell them to share more information if the information provided is not enough.", + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "length", + "warn", + "spam", + "tone", + "toneInfo", + "words", + "summary", + "comment" + ] + } +} diff --git a/src-plugin/android/.gradle/8.5/dependencies-accessors/gc.properties b/.github/ai/src/pr.ts similarity index 100% rename from src-plugin/android/.gradle/8.5/dependencies-accessors/gc.properties rename to .github/ai/src/pr.ts diff --git a/.github/ai/src/prompt.ts b/.github/ai/src/prompt.ts new file mode 100644 index 0000000..12bbd9b --- /dev/null +++ b/.github/ai/src/prompt.ts @@ -0,0 +1,44 @@ +import { join } from "node:path" +import { readFileSync } from "node:fs" + +import type { Body, Response } from "./type.js" + +const data = join(import.meta.dirname, "../prompt.schema.json"); +const schema = JSON.parse(readFileSync(data).toString()) + +export const handle = async (text: string) => { + const path = "https://models.github.ai/orgs/ahqstore/inference/chat/completions" + + const response = await fetch(path, { + method: "POST", + body: JSON.stringify({ + max_tokens: 4096, + messages: [ + { + content: "Classify the text as per the schema given", + role: "system" + }, + { + content: text, + role: "user" + } + ], + model: "openai/gpt-4.1-mini", + response_format: { + type: "json_schema", + json_schema: schema + } + } as Body, null, 2), + headers: { + "content-type": "application/json", + "accept": "application/vnd.github+json", + "User-Agent": "AHQ Store Scripts", + "Authorization": `Bearer ${process.env["GITHUB_TOKEN"]}` + } + }).then((d) => d.json() as Promise); + + console.log(response); + console.log(JSON.stringify(response, null, 4)); + + return JSON.parse(response.choices[0].message.content); +} diff --git a/.github/ai/src/type.ts b/.github/ai/src/type.ts new file mode 100644 index 0000000..0f2dd9f --- /dev/null +++ b/.github/ai/src/type.ts @@ -0,0 +1,25 @@ +export interface Body { + model: "openai/gpt-4.1-mini" + messages: Message[] + max_tokens: number + response_format: { + type: "json_schema", + json_schema: Object + } +} + +export interface Message { + role: "assistant" | "developer" | "system" | "user" + content: string +} + +export interface Response { + choices: Array<{ + message: { + /** The content of the message. */ + content: string; + /** The role of the message. */ + role: string; + }; + }>; +} \ No newline at end of file diff --git a/.github/ai/tsconfig.json b/.github/ai/tsconfig.json new file mode 100644 index 0000000..3247468 --- /dev/null +++ b/.github/ai/tsconfig.json @@ -0,0 +1,113 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es6" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "libReplacement": true, /* Enable lib replacement. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "nodenext" /* Specify what module code is generated. */, + "rootDir": "./src" /* Specify the root folder within your source files. */, + "moduleResolution": "nodenext" /* Specify how TypeScript looks up a file from a given module specifier. */, + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "rewriteRelativeImportExtensions": true, /* Rewrite '.ts', '.tsx', '.mts', and '.cts' file extensions in relative import paths to their JavaScript equivalent in output files. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "noUncheckedSideEffectImports": true, /* Check side effect imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + "allowJs": true /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */, + "checkJs": true /* Enable error reporting in type-checked JavaScript files. */, + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + "declaration": true /* Generate .d.ts files from TypeScript and JavaScript files in your project. */, + "declarationMap": true /* Create sourcemaps for d.ts files. */, + // "emitDeclarationOnly": true /* Only output d.ts files and not JavaScript files. */, + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + "outDir": "./compiled" /* Specify an output folder for all emitted files. */, + // "removeComments": true, /* Disable emitting comments. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */ + // "erasableSyntaxOnly": true, /* Do not allow runtime constructs that are not part of ECMAScript. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "strictBuiltinIteratorReturn": true, /* Built-in iterators are instantiated with a 'TReturn' type of 'undefined' instead of 'any'. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml new file mode 100644 index 0000000..dd758eb --- /dev/null +++ b/.github/workflows/dependency-review.yml @@ -0,0 +1,39 @@ +# Dependency Review Action +# +# This Action will scan dependency manifest files that change as part of a Pull Request, +# surfacing known-vulnerable versions of the packages declared or updated in the PR. +# Once installed, if the workflow run is marked as required, PRs introducing known-vulnerable +# packages will be blocked from merging. +# +# Source repository: https://github.com/actions/dependency-review-action +# Public documentation: https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review#dependency-review-enforcement +name: 'Dependency review' +on: + pull_request: + branches: [ "main", "release" ] + +# If using a dependency submission action in this workflow this permission will need to be set to: +# +# permissions: +# contents: write +# +# https://docs.github.com/en/enterprise-cloud@latest/code-security/supply-chain-security/understanding-your-software-supply-chain/using-the-dependency-submission-api +permissions: + contents: read + # Write permissions for pull-requests are required for using the `comment-summary-in-pr` option, comment out if you aren't using this option + pull-requests: write + +jobs: + dependency-review: + runs-on: ubuntu-latest + steps: + - name: 'Checkout repository' + uses: actions/checkout@v4 + - name: 'Dependency Review' + uses: actions/dependency-review-action@v4 + # Commonly enabled options, see https://github.com/actions/dependency-review-action#configuration-options for all available options. + with: + comment-summary-in-pr: always + # fail-on-severity: moderate + # deny-licenses: GPL-1.0-or-later, LGPL-2.0-or-later + # retry-on-snapshot-warnings: true diff --git a/.github/workflows/issue-summary.yml b/.github/workflows/issue-summary.yml new file mode 100644 index 0000000..64f456f --- /dev/null +++ b/.github/workflows/issue-summary.yml @@ -0,0 +1,87 @@ +name: Summarize new issues + +on: + issues: + types: [opened] + +jobs: + summary: + runs-on: ubuntu-latest + permissions: + issues: write + models: read + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Run AI Inference + uses: actions/github-script@v7 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + script: | + const ai = await import("${{ github.workspace }}/.github/scripts/ai/compiled/prompt.js"); + + const issue = context.payload.issue; + + const resp = await ai.handle(`# ${issue.title}\n ${issue.body}`) + + const [owner, repo] = "${{ github.repository }}".split("/"); + const issue_number = ${{ github.event.issue.number }}; + + console.log(JSON.stringify(issue, null, 2)); + + if (resp.warn.length > 0) { + await github.rest.issues.createComment({ + owner, + repo, + issue_number, + body: `${resp.warn}`.replace(/@user/g, `@${issue.user.login}`), + }); + } + + if (resp.toneInfo.length > 0) { + await github.rest.issues.createComment({ + owner, + repo, + issue_number, + body: resp.toneInfo.replace(/@user/g, `@${issue.user.login}`), + }); + } + + const comment = await github.rest.issues.createComment({ + owner, + repo, + issue_number, + body: JSON.stringify(resp, null, 4) + }); + + + console.log(comment.data); + + await github.rest.issues.updateComment({ + owner, + repo, + comment_id: comment.data.id, + body: "_Mods logs are here_" + }); + + if (resp.comment.length > 0) { + await github.rest.issues.updateComment({ + owner, + repo, + comment_id: comment.data.id, + body: resp.comment.replace(/@user/g, `@${issue.user.login}`) + }); + } + + if (resp.summary.length > 0) { + await github.rest.issues.createComment({ + owner, + repo, + issue_number, + body: resp.summary, + }); + } diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index e9dd68d..bcc9bc1 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -127,15 +127,19 @@ jobs: with: toolchain: nightly + - name: Authenticate with registry + id: auth + uses: rust-lang/crates-io-auth-action@v1 + - name: Publish types to cargo run: cargo publish working-directory: src-ahqstore-types env: - CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_TOKEN }} + CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }} continue-on-error: true publish-types-npm: - name: Publish ahqstore-types to npmjs + name: Publish packages to npmjs runs-on: ubuntu-latest @@ -156,20 +160,36 @@ jobs: node-version: 20 registry-url: "https://registry.npmjs.org" - - name: Install wasm-pack - run: npm i -g wasm-pack + - name: Install npm + run: | + npm i -g npm@latest working-directory: src-ahqstore-types - - name: Build NPM Binaries - run: wasm-pack build --release -- --features js + - name: Build & Publish NPM Binaries + shell: pwsh + run: ./publish.ps1 working-directory: src-ahqstore-types - - name: Publish NPM Binaries - run: npm publish - working-directory: src-ahqstore-types/pkg + - name: Publish plugin api + run: | + npm install + npm run build + npm publish --access public + working-directory: pkg-ahqstore + continue-on-error: true + + - name: Publish environment types + run: | + npm install + npm run build + npm run build:types + + cd types + npm install + npm publish --access public + cd .. + working-directory: src-tauri/plugin-script continue-on-error: true - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_AHQSTORE_TYPES }} make-setup: needs: create-release @@ -181,16 +201,12 @@ jobs: include: - os: windows-latest target: x86_64-pc-windows-msvc - arch: amd64 + arch: amd64,arm64 - os: ubuntu-latest target: x86_64-unknown-linux-gnu arch: amd64 - - os: windows-latest - target: aarch64-pc-windows-msvc - arch: arm64 - runs-on: ${{ matrix.os }} steps: @@ -217,10 +233,27 @@ jobs: sudo apt-get update sudo apt-get install gcc-aarch64-linux-gnu + - name: Install Windows Certificate + if: runner.os == 'Windows' + env: + WINDOWS_CERTIFICATE: ${{ secrets.WINDOWS_CERTIFICATE }} + WINDOWS_CERTIFICATE_PASSWORD: ${{ secrets.WINDOWS_CERTIFICATE_PASSWORD }} + run: | + New-Item -ItemType directory -Path certificate + Set-Content -Path certificate/tempCert.txt -Value $env:WINDOWS_CERTIFICATE + certutil -decode certificate/tempCert.txt certificate/certificate.pfx + Remove-Item -path certificate -include tempCert.txt + Import-PfxCertificate -FilePath certificate/certificate.pfx -CertStoreLocation Cert:\CurrentUser\My -Password (ConvertTo-SecureString -String $env:WINDOWS_CERTIFICATE_PASSWORD -Force -AsPlainText) + + - name: Setup .NET + uses: actions/setup-dotnet@v5 + with: + dotnet-version: "10.0.x" + - name: Build Windows GUI Setup if: matrix.os == 'windows-latest' - run: cargo build --release --target ${{ matrix.target }} - working-directory: src-setup + run: ./build.ps1 + working-directory: dotnet-win32-setup - name: Build Linux CLI Setup if: matrix.os != 'windows-latest' @@ -228,15 +261,26 @@ jobs: env: TAG: ${{ needs.create-release.outputs.tag_name }} - - name: Upload Windows Setup + - name: Upload Windows Setup (X64) if: matrix.os == 'windows-latest' uses: ahqstore/upload-release-assets@v60 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ needs.create-release.outputs.upload_url }} - asset_path: ./src-setup/target/${{ matrix.target }}/release/ahqstore_setup_amd64.exe - asset_name: ahqstore_setup_win32_${{ matrix.arch }}.exe + asset_path: ./dotnet-win32-setup/outputs/ahqstore_setup_x64.exe + asset_name: ahqstore_setup_win32_amd64.exe + asset_content_type: application/vnd.microsoft.portable-executable + + - name: Upload Windows Setup (Arm64) + if: matrix.os == 'windows-latest' + uses: ahqstore/upload-release-assets@v60 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ needs.create-release.outputs.upload_url }} + asset_path: ./dotnet-win32-setup/outputs/ahqstore_setup_arm64.exe + asset_name: ahqstore_setup_win32_arm64.exe asset_content_type: application/vnd.microsoft.portable-executable - name: Upload Linux Setup @@ -253,7 +297,34 @@ jobs: publish-android: needs: create-release runs-on: ubuntu-latest - name: Build Tauri App (universal-linux-android) + name: Build Tauri App (${{ matrix.target }}) + + strategy: + matrix: + include: + - target: universal-linux-android + suffix: universal + args: "" + + - target: aarch64-linux-android + suffix: aarch64 + args: -t aarch64 + + - target: armv7-linux-android + suffix: armv7 + args: -t armv7 + + - target: i686-linux-android + suffix: i686 + args: -t i686 + + - target: x86_64-linux-android + suffix: x86_64 + args: -t x86_64 + + - target: arm-linux-android + suffix: universal + args: -t aarch64 armv7 steps: - name: Checkout @@ -282,19 +353,29 @@ jobs: echo "storeFile=$RUNNER_TEMP/keystore.jks" >> keystore.properties - name: Build ahqstore-types locally + shell: pwsh run: | - npm i -g wasm-pack - wasm-pack build --release -- --features js + ./publish.ps1 cd ../src-plugin npm i -g pnpm pnpm install pnpm build - - cd ../src-tauri - rm Cargo.toml - cp ./Cargo.patch.toml ./Cargo.toml working-directory: src-ahqstore-types + env: + NO_PUBLISH: true + + - name: Build plugin api + run: | + npm install + npm run build + working-directory: pkg-ahqstore + + - name: Build plugin script + run: | + npm install + npm run build + working-directory: src-tauri/plugin-script - name: Build Tauri App run: | @@ -302,10 +383,17 @@ jobs: export NDK_HOME="$ANDROID_NDK_HOME" pnpm install - pnpm tauri android build + pnpm tauri android build --apk true ${{ matrix.args }} env: CI: "false" + - name: Upload Apk + uses: shogo82148/actions-upload-release-asset@v1 + with: + asset_path: ./src-tauri/gen/android/app/build/outputs/apk/universal/release/app-universal-release.apk + asset_name: ahqstore_${{ matrix.target }}.apk + upload_url: ${{ needs.create-release.outputs.upload_url }} + publish-tauri: needs: create-release name: Build Tauri App (${{ matrix.target }}) @@ -322,6 +410,7 @@ jobs: target: x86_64-unknown-linux-gnu arch: amd64 + # Commented out due to instability rn - os: ubuntu-24.04-arm target: aarch64-unknown-linux-gnu arch: arm64 @@ -349,6 +438,18 @@ jobs: targets: ${{ matrix.target }} toolchain: nightly + - name: Install Windows Certificate + if: runner.os == 'Windows' + env: + WINDOWS_CERTIFICATE: ${{ secrets.WINDOWS_CERTIFICATE }} + WINDOWS_CERTIFICATE_PASSWORD: ${{ secrets.WINDOWS_CERTIFICATE_PASSWORD }} + run: | + New-Item -ItemType directory -Path certificate + Set-Content -Path certificate/tempCert.txt -Value $env:WINDOWS_CERTIFICATE + certutil -decode certificate/tempCert.txt certificate/certificate.pfx + Remove-Item -path certificate -include tempCert.txt + Import-PfxCertificate -FilePath certificate/certificate.pfx -CertStoreLocation Cert:\CurrentUser\My -Password (ConvertTo-SecureString -String $env:WINDOWS_CERTIFICATE_PASSWORD -Force -AsPlainText) + - name: install dependencies (ubuntu only) if: runner.os == 'Linux' run: | @@ -363,15 +464,29 @@ jobs: sudo chmod -R 777 /usr - name: Build ahqstore-types locally + shell: pwsh run: | - npm i -g wasm-pack - wasm-pack build --release -- --features js + ./publish.ps1 cd ../src-plugin npm i -g pnpm pnpm install pnpm build working-directory: src-ahqstore-types + env: + NO_PUBLISH: "true" + + - name: Build plugin api + run: | + npm install + npm run build + working-directory: pkg-ahqstore + + - name: Build plugin script + run: | + npm install + npm run build + working-directory: src-tauri/plugin-script - name: install Vite dependencies and Build React App run: pnpm install; pnpm build @@ -380,7 +495,7 @@ jobs: - name: Build Tauri App id: tauri-app - uses: tauri-apps/tauri-action@dev + uses: tauri-apps/tauri-action@v0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI }} @@ -389,7 +504,7 @@ jobs: args: --verbose --target ${{ matrix.target }} releaseId: ${{ needs.create-release.outputs.release_id }} includeRelease: true - includeUpdaterJson: false + includeUpdaterJson: true undraft-release: needs: [create-release, publish-tauri, make-setup, publish-android] diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml new file mode 100644 index 0000000..a8d01b1 --- /dev/null +++ b/.github/workflows/scorecard.yml @@ -0,0 +1,78 @@ +# This workflow uses actions that are not certified by GitHub. They are provided +# by a third-party and are governed by separate terms of service, privacy +# policy, and support documentation. + +name: Scorecard supply-chain security +on: + # For Branch-Protection check. Only the default branch is supported. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection + branch_protection_rule: + # To guarantee Maintained check is occasionally updated. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained + schedule: + - cron: '32 23 * * 0' + push: + branches: [ "main", "release" ] + +# Declare default permissions as read only. +permissions: read-all + +jobs: + analysis: + name: Scorecard analysis + runs-on: ubuntu-latest + # `publish_results: true` only works when run from the default branch. conditional can be removed if disabled. + if: github.event.repository.default_branch == github.ref_name || github.event_name == 'pull_request' + permissions: + # Needed to upload the results to code-scanning dashboard. + security-events: write + # Needed to publish results and get a badge (see publish_results below). + id-token: write + # Uncomment the permissions below if installing in a private repository. + # contents: read + # actions: read + + steps: + - name: "Checkout code" + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: false + + - name: "Run analysis" + uses: ossf/scorecard-action@f49aabe0b5af0936a0987cfb85d86b75731b0186 # v2.4.1 + with: + results_file: results.sarif + results_format: sarif + # (Optional) "write" PAT token. Uncomment the `repo_token` line below if: + # - you want to enable the Branch-Protection check on a *public* repository, or + # - you are installing Scorecard on a *private* repository + # To create the PAT, follow the steps in https://github.com/ossf/scorecard-action?tab=readme-ov-file#authentication-with-fine-grained-pat-optional. + # repo_token: ${{ secrets.SCORECARD_TOKEN }} + + # Public repositories: + # - Publish results to OpenSSF REST API for easy access by consumers + # - Allows the repository to include the Scorecard badge. + # - See https://github.com/ossf/scorecard-action#publishing-results. + # For private repositories: + # - `publish_results` will always be set to `false`, regardless + # of the value entered here. + publish_results: true + + # (Optional) Uncomment file_mode if you have a .gitattributes with files marked export-ignore + # file_mode: git + + # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF + # format to the repository Actions tab. + - name: "Upload artifact" + uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 + with: + name: SARIF file + path: results.sarif + retention-days: 5 + + # Upload the results to GitHub's code scanning dashboard (optional). + # Commenting out will disable upload of results to your repo's Code Scanning dashboard + - name: "Upload to code-scanning" + uses: github/codeql-action/upload-sarif@v3 + with: + sarif_file: results.sarif diff --git a/.gitignore b/.gitignore index bdbd6df..85a002b 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,8 @@ dist dist-ssr *.local +/src-plugin/android/.gradle/**/* + # Editor directories and files .vscode/* !.vscode/extensions.json @@ -25,4 +27,5 @@ dist-ssr .keys function_to_encrypt.cjs -keystore.properties \ No newline at end of file +keystore.properties +src-plugin/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..c8b13d6 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +ahqsecret@gmail.com. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. diff --git a/README.md b/README.md index 102e366..0e7cd7a 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,28 @@ -# Tauri + React + Typescript +[![Banner](./readme/banner.png)](https://ahqstore.github.io/download) -This template should help get you started developing with Tauri, React and Typescript in Vite. +[![References](https://img.icons8.com/cute-clipart/13/book.png) References](#references) -## Recommended IDE Setup +# [Logo AHQ Store](https://ahqstore.github.io) -- [VS Code](https://code.visualstudio.com/) + [Tauri](https://marketplace.visualstudio.com/items?itemName=tauri-apps.tauri-vscode) + [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer) +Empowering app distribution for all + +AHQ Store is a **free** and **open sourced** App Store, which allows you to publish apps for **free** and no restrictions[\*](#references) + +## Features + +- Simple GUI +- Multi-platform +- Free & Open Sourced +- **0 data collection** + +## Licensed under MIT + +- The software has been provided **as is** without any warnnanty of any kind +- The developer is not responsible for any damages cause by use of this software in any way + +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fahqstore%2Fclient.svg?type=large&issueType=license)](https://app.fossa.com/projects/git%2Bgithub.com%2Fahqstore%2Fclient?ref=badge_large&issueType=license) + +# References + +- [Terms of Service](https://github.com/ahqsoftwares/tauri-ahq-store/security/policy) +- [\*](#ahq-store) Your app might be screened by the maintainers AND your app will be scanned by Windows Defender (windows) on every install on every users' computer diff --git a/certificates/windows.b64.txt b/certificates/windows.b64.txt new file mode 100644 index 0000000..f22b109 --- /dev/null +++ b/certificates/windows.b64.txt @@ -0,0 +1 @@ +MIIFQjCCAyqgAwIBAgIQfuy5U6xI4IhJJgZHTAchsDANBgkqhkiG9w0BAQsFADA5MQswCQYDVQQGEwJJTjEWMBQGA1UECgwNQUhRIFNvZnR3YXJlczESMBAGA1UEAwwJQUhRIFN0b3JlMB4XDTI1MTAyMDA3NDYzM1oXDTQ1MTAyMDA3NTYzMlowOTELMAkGA1UEBhMCSU4xFjAUBgNVBAoMDUFIUSBTb2Z0d2FyZXMxEjAQBgNVBAMMCUFIUSBTdG9yZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALfkhGbpIIrXrT9B6cca+ZSGe6doUir0bsoBQVQcdQyG08eFmc15D08q9An7rRHUJYYsq1MWzKxjz4B0a9Hpzg8sEsUiKydFzha8UeNk84R5N0jsgmF5lDh4NcHSZfVM7S4/6CnvnJ1QFzgiN9kzbNhNhOC6q+30ptljWUaOa0MMyjoMOsRv4dBhjJUstMxl5cgLvcAmoCZuMuhJlJSgAOTWoQEi7GV87dquEu/F/lUeDckvs2sqydbH2LtPe7M5m3+zg7KggCf7sSQ4V7G295P+2Xq1A+YGB6aOuUJOeXHrCnKVKW1iGylDrBA4TPBGjHdW6iE7d+mESGwyqks7YCkKwa2gLic9GcOxxldj/c4Xp70NKHmmehJuXNRCmpRTXoIMuIcdfRoV4TUYv6hCcd70y6S70MFihoxLUw/21V14+sgd5KLlgaxEda55UUkrOAtqEyZatVQnv6HxKg7XJWwQJrpEIQI4UY5RDVXcwO60XmZwibNSISmSi5uVFCvlmyTlqjjlHGGk/WTt7mjD4x2QM7VaIgT2C7APeguum2JF7r1T9V//O0xXLFoQh/o6d3ebhzdBCnmkf1ZZJe4KfmhdJBye0rTMth503fwL1L0Ttr/tLYyg9PfZQYA5uCr7LSkopCeQubaDhcp5MCbtPesYL8RyRscO39lS+AkvLn8RAgMBAAGjRjBEMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUS5zNtRM30MI/5dDqBMT+QH3R7gEwDQYJKoZIhvcNAQELBQADggIBAG1R8ok/iCW0i/xu2rhAph0U7QJQpConSKqpQxHUf0agjjReLoS3c2zlqSEOBjEiUIKeIL4RRODSt495pMFAPN7DAqtAFUvlPyJv5+QyRl+XM48TdF57COqib0ZnlQi52T0qNoSKiv9SlQ5MWwRTLi/RUQVBs0nq5ydILDvqNYCu5v1N2uXkq6Q8AUR9hsMLBxre8zmP722Gr0ukYLJlf7srW0fPLGLMlnTiovQ+UnucGype+L831L5k1EyU1Mtj3dIMTwHqC32D+s6qpTJUhpsYefmP/ZDsGYEp7v8dKXnZNmbhh4FEIdO3LhWkug9aOx1WPO/Tg3/x6sQyF64sbY1hcQCI6D0yCiHrOW0y9mK4GrMiE6FbvjE3f2sxOPVsPGUbHjvoVM351lmz4U9qwFbbmFSxPVf5m+AbqBZz792viDji+vbBQMMjMwle0IHkIEfUfOfEf5f5pkAQ0Zf8nxIXJAZPd4Inj1eZnuunsmWw/sSIP7KQI7W6GtI19rPlkzBDMXBoeiukrOpbeZmNY5LEggpgXRynlVxdbIIcBOY2klcl5s2t1mRo4vS29wPeiNCA+2d82A1ER1RCzfhULhay/KFiy5qrmT4W/6+rcC90WoloUbDIySKbc+WIHjBYDDMJmjoWWEwErCu8Nf68P6ec+nmOOzjAz0Q/4fdCGHsd diff --git a/certificates/windows.cer b/certificates/windows.cer new file mode 100644 index 0000000..5a0fef5 Binary files /dev/null and b/certificates/windows.cer differ diff --git a/dotnet-win32-setup/.gitignore b/dotnet-win32-setup/.gitignore new file mode 100644 index 0000000..8e9cda5 --- /dev/null +++ b/dotnet-win32-setup/.gitignore @@ -0,0 +1,3 @@ +obj +bin +target \ No newline at end of file diff --git a/dotnet-win32-setup/AHQStoreWin32Setup.csproj b/dotnet-win32-setup/AHQStoreWin32Setup.csproj new file mode 100644 index 0000000..4501c46 --- /dev/null +++ b/dotnet-win32-setup/AHQStoreWin32Setup.csproj @@ -0,0 +1,52 @@ + + + + WinExe + net10.0-windows + enable + enable + true + + + true + false + + true + + none + false + + false + + app.manifest + + Assets\icon.ico + + AHQ Store Setup + AHQ Store + AHQ Store Windows Setup + Copyright © 2026 + + + + + + + + + + + + + + + $(SIGNTOOL_PATH) + signtool.exe + + + + + + + \ No newline at end of file diff --git a/dotnet-win32-setup/App.xaml b/dotnet-win32-setup/App.xaml new file mode 100644 index 0000000..74b1daa --- /dev/null +++ b/dotnet-win32-setup/App.xaml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/dotnet-win32-setup/App.xaml.cs b/dotnet-win32-setup/App.xaml.cs new file mode 100644 index 0000000..f1f50d9 --- /dev/null +++ b/dotnet-win32-setup/App.xaml.cs @@ -0,0 +1,13 @@ +using System.Configuration; +using System.Data; +using System.Windows; + +namespace AHQStoreWin32Setup; + +/// +/// Interaction logic for App.xaml +/// +public partial class App : Application +{ +} + diff --git a/dotnet-win32-setup/AssemblyInfo.cs b/dotnet-win32-setup/AssemblyInfo.cs new file mode 100644 index 0000000..cc29e7f --- /dev/null +++ b/dotnet-win32-setup/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Windows; + +[assembly:ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] diff --git a/dotnet-win32-setup/Assets/icon.ico b/dotnet-win32-setup/Assets/icon.ico new file mode 100644 index 0000000..a018bcd Binary files /dev/null and b/dotnet-win32-setup/Assets/icon.ico differ diff --git a/src-setup/ui/icon.png b/dotnet-win32-setup/Assets/splashable.png similarity index 100% rename from src-setup/ui/icon.png rename to dotnet-win32-setup/Assets/splashable.png diff --git a/dotnet-win32-setup/MainWindow.xaml b/dotnet-win32-setup/MainWindow.xaml new file mode 100644 index 0000000..2fe05b9 --- /dev/null +++ b/dotnet-win32-setup/MainWindow.xaml @@ -0,0 +1,917 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dotnet-win32-setup/MainWindow.xaml.cs b/dotnet-win32-setup/MainWindow.xaml.cs new file mode 100644 index 0000000..abb447d --- /dev/null +++ b/dotnet-win32-setup/MainWindow.xaml.cs @@ -0,0 +1,499 @@ +using System.Diagnostics; +using System.Timers; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Animation; +using MdXaml; +using Microsoft.Win32; + +namespace AHQStoreWin32Setup; + +/// +/// Interaction logic for MainWindow.xaml +/// +public partial class MainWindow : Window +{ + public bool installEnabled + { + get { return (bool)GetValue(IsButtonEnabledProperty); } + set { SetValue(IsButtonEnabledProperty, value); } + } + + public string ArchStatusText + { + get { return (string)GetValue(StatusTxtProperty); } + set { SetValue(StatusTxtProperty, value); } + } + + public string installingStatusText + { + get { return (string)GetValue(InstallerStatusTextProperty); } + set { SetValue(InstallerStatusTextProperty, value); } + } + + + + public static readonly DependencyProperty StatusTxtProperty = + DependencyProperty.Register( + "statusText", + typeof(string), + typeof(MainWindow), + new PropertyMetadata("Hang tight!")); + + public static readonly DependencyProperty IsButtonEnabledProperty = + DependencyProperty.Register( + "installEnabled", + typeof(bool), + typeof(MainWindow), + new PropertyMetadata(false)); + + public static readonly DependencyProperty InstallerStatusTextProperty = DependencyProperty.Register( + "installingStatusText", + typeof(string), + typeof(MainWindow), + new PropertyMetadata("Downloading...")); + + Markdown engine; + GitHubService service; + + private readonly PeriodicTimer _timer; + private CancellationTokenSource _cts = new(); + + Urls urls; + + public MainWindow() + { + _timer = new PeriodicTimer(TimeSpan.FromSeconds(0.5)); + + InitializeComponent(); + + Resources["NormalTextBrush"] = Resources["TextFillColorTertiaryBrush"]; + + if (OperatingSystem.IsWindowsVersionAtLeast(10, 0, 22000, 0)) + { + Background = Brushes.Transparent; + } + + service = new GitHubService(); + urls = new Urls(); + + this.DataContext = this; + + LicenseText.Text = """""" +MIT License + +Copyright(c) 2024 AHQ Softwares + +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. +""""""; + + engine = new Markdown(); + + var h1 = new Style(); + h1.Setters.Add(new Setter(FlowDocument.FontFamilyProperty, new FontFamily("Segoe UI Variable Text"))); + h1.Setters.Add(new Setter(FlowDocument.FontSizeProperty, 24.0)); + h1.Setters.Add(new Setter(FlowDocument.FontWeightProperty, FontWeights.Bold)); + engine.Heading1Style = h1; + + var h2 = new Style(); + h2.Setters.Add(new Setter(FlowDocument.FontFamilyProperty, new FontFamily("Segoe UI Variable Text"))); + h2.Setters.Add(new Setter(FlowDocument.FontSizeProperty, 20.0)); + h2.Setters.Add(new Setter(FlowDocument.FontWeightProperty, FontWeights.Bold)); + engine.Heading2Style = h2; + + var link = new Style(); + link.Setters.Add(new Setter(FlowDocument.ForegroundProperty, new SolidColorBrush(Color.FromRgb(0, 120, 212)))); + engine.LinkStyle = link; + + this.CommandBindings.Add(new CommandBinding(NavigationCommands.GoToPage, (s, e) => + { + Process.Start(new ProcessStartInfo(e.Parameter.ToString()!) { UseShellExecute = true }); + })); + + _ = StartThemeMgr(); + + Activate(); + } + + public async Task StartThemeMgr() + { + try + { + + // This loop repeats every interval + while (await _timer.WaitForNextTickAsync(_cts.Token)) + { + // Mutate 'this' (the class instance state) + using (var key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize")) + { + int registryValueObject = (int)key?.GetValue("AppsUseLightTheme")!; + + var dark = registryValueObject == 0; + + if (dark) + { + Resources["NormalTextBrush"] = Resources["TextFillColorTertiaryBrush"]; + } + else + { + Resources["NormalTextBrush"] = Resources["TextFillColorPrimaryBrush"]; + } + } + } + } + catch (OperationCanceledException) + { + Console.WriteLine("Timer stopped."); + } + } + + + private async Task Setup() + { + await service.Setup(); + + string tos; + + try + { + urls = await service.GetMSIUrls(); + } + catch (Exception) + { + + } + + try + { + tos = await service.FetchTOS(); + } + catch (Exception) + { + tos = "## Error\nFailed to load, visit [https://ahqstore.github.io/tos](https://ahqstore.github.io/tos)"; + } + + FlowDocument tosFlow = engine.Transform(tos); + + foreach (var doc in tosFlow.Blocks.ToList()) + { + TermsOfService.Blocks.Add(doc); + } + + string pp; + + try + { + pp = await service.FetchPP(); + } + catch (Exception) + { + pp = "## Error\nFailed to load, visit [https://ahqstore.github.io/privacy](https://ahqstore.github.io/privacy)"; + } + + FlowDocument ppFlow = engine.Transform(pp); + + foreach (var doc in ppFlow.Blocks.ToList()) + { + PrivacyPolicyMarkdown.Blocks.Add(doc); + } + + } + + private async void Open_License(object sender, RoutedEventArgs e) + { + Welcome.Visibility = Visibility.Collapsed; + LoadingPrepping.Visibility = Visibility.Visible; + + Storyboard sb = (Storyboard)this.FindResource("SlideAndFadeIn"); + sb.Begin(LoadingPrepping); + + + try + { + await Setup(); + + LoadingPrepping.Visibility = Visibility.Collapsed; + License.Visibility = Visibility.Visible; + + sb.Begin(License); + } + catch (Exception err) + { + Console.WriteLine(err); + } + + } + + private async void Open_Terms(object sender, RoutedEventArgs e) + { + License.Visibility = Visibility.Collapsed; + Terms.Visibility = Visibility.Visible; + + Storyboard sb = (Storyboard)this.FindResource("SlideAndFadeIn"); + sb.Begin(Terms); + } + + private async void Launch_PP(object sender, RoutedEventArgs e) + { + Terms.Visibility = Visibility.Collapsed; + PrivacyPolicy.Visibility = Visibility.Visible; + + Storyboard sb = (Storyboard)this.FindResource("SlideAndFadeIn"); + sb.Begin(PrivacyPolicy); + } + + private bool canCloseWindow = true; + + private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) + { + if (!canCloseWindow) + { + e.Cancel = true; + } + } + + private async void Launch_Install(object sender, RoutedEventArgs e) + { + Configuration.Visibility = Visibility.Collapsed; + Installing.Visibility = Visibility.Visible; + + Storyboard sb = (Storyboard)this.FindResource("SlideAndFadeIn"); + sb.Begin(Installing); + + canCloseWindow = false; + + try + { + AHQInstaller inst = new AHQInstaller(); + + string url; + + int idx = ReleaseChannel.SelectedIndex; + + if (idx == 0) + { + url = urls.Release!; + } + else + { + url = urls.Prerelease!; + } + + await inst.Install(url, InstallCertificate.IsChecked.GetValueOrDefault(false), (txt, state, status) => + { + installingStatusText = txt; + + switch (state) + { + case Typeof.Downloading: + TaskbarInfo.ProgressState = System.Windows.Shell.TaskbarItemProgressState.Normal; + TaskbarInfo.ProgressValue = (double)status! / 100.0; + + InstallingProgressStatus.Value = (double)status!; + InstallingProgressStatus.IsIndeterminate = false; + break; + case Typeof.Indeterminate: + TaskbarInfo.ProgressState = System.Windows.Shell.TaskbarItemProgressState.Indeterminate; + + InstallingProgressStatus.IsIndeterminate = true; + break; + case Typeof.Installed: + TaskbarInfo.ProgressState = System.Windows.Shell.TaskbarItemProgressState.None; + + Installing.Visibility = Visibility.Collapsed; + Installed.Visibility = Visibility.Visible; + + Storyboard sb = (Storyboard)this.FindResource("SlideAndFadeIn"); + sb.Begin(Installed); + + break; + case Typeof.Error: + TaskbarInfo.ProgressState = System.Windows.Shell.TaskbarItemProgressState.None; + InstallingProgressStatus.IsIndeterminate = false; + InstallingProgressStatus.Value = 0; + break; + case Typeof.None: + TaskbarInfo.ProgressState = System.Windows.Shell.TaskbarItemProgressState.Indeterminate; + + InstallingProgressStatus.IsIndeterminate = true; + break; + } + + }); + } + catch (Exception) + { + + } + finally + { + canCloseWindow = true; + } + } + + private async void ArchitectureSelect(object sender, RoutedEventArgs e) + { + PrivacyPolicy.Visibility = Visibility.Collapsed; + Configuration.Visibility = Visibility.Visible; + + Storyboard sb = (Storyboard)this.FindResource("SlideAndFadeIn"); + sb.Begin(Configuration); + + CheckInstallTask(); + CheckInstallTask(); + } + + private void Close_App(object sender, RoutedEventArgs e) + { + Close(); + } + + bool first = true; + + private void CheckInstallTask() + { + if (first) + { + first = false; + return; + } + + + int idx = ReleaseChannel.SelectedIndex; + + if ((idx == 0 && urls.Release == null) || (idx == 1 && urls.Prerelease == null)) + { + DisableInstall("This Release is not available!"); + return; + } + + EnableInstall(); + } + + private void ReleaseChannel_Changed(object sender, SelectionChangedEventArgs e) + { + CheckInstallTask(); + } + + private void DisableInstall( + string text + ) + { + installEnabled = false; + ArchStatusText = text; + ProgressStatus.IsIndeterminate = true; + } + + private void EnableInstall() + { + installEnabled = true; + ArchStatusText = "Great, you can install now!"; + } + + + protected override void OnSourceInitialized(EventArgs e) + { + base.OnSourceInitialized(e); + + var argLast = Environment.GetCommandLineArgs().Last(); + + switch (argLast) + { + case "uninstall": + Launch_UninstallPrep(); + break; + case "uninstall-step2": + _ = Launch_UninstallFInal(); + break; + default: + Launch_Normal(); + break; + } + } + + public string unstStatusText + { + get { return (string)GetValue(UnstStatusTxt); } + set { SetValue(UnstStatusTxt, value); } + } + + public static readonly DependencyProperty UnstStatusTxt = + DependencyProperty.Register( + "unstStatusTxt", + typeof(string), + typeof(MainWindow), + new PropertyMetadata("We are checking a few things...")); + + private async Task Launch_UninstallFInal() + { + UninstallPrep.Visibility = Visibility.Visible; + + Storyboard sb = (Storyboard)this.FindResource("SlideAndFadeIn"); + sb.Begin(UninstallPrep); + + unstStatusText = "We're starting..."; + + var unst = new AHQStoreCoreUninstaller(); + + await unst.Uninstall((cb) => + { + unstStatusText = cb; + }); + + await Task.Delay(1500); + Environment.Exit(0); + } + + private async void Launch_UninstallPrep() + { + UninstallPrep.Visibility = Visibility.Visible; + + Storyboard sb = (Storyboard)this.FindResource("SlideAndFadeIn"); + sb.Begin(UninstallPrep); + + var unst = new AHQStoreUninstallerEligibility(); + + if (!unst.Eligible()) + { + unstStatusText = "You cannot uninstall because AHQ Store system apps are installed! Uninstall them first from the store app."; + } + else + { + unstStatusText = "Launching uninstall..."; + + unst.RunMainUninstaller(); + + await Task.Delay(1500); + + Environment.Exit(0); + } + } + + private void Launch_Normal() + { + Welcome.Visibility = Visibility.Visible; + + Storyboard sb = (Storyboard)this.FindResource("SlideAndFadeIn"); + sb.Begin(Welcome); + + } +} \ No newline at end of file diff --git a/dotnet-win32-setup/ahqstore_setup/.cargo/config.toml b/dotnet-win32-setup/ahqstore_setup/.cargo/config.toml new file mode 100644 index 0000000..81b00ec --- /dev/null +++ b/dotnet-win32-setup/ahqstore_setup/.cargo/config.toml @@ -0,0 +1,5 @@ +[target.x86_64-pc-windows-msvc] +rustflags = ["-C", "target-feature=+crt-static"] + +[target.aarch64-pc-windows-msvc] +rustflags = ["-C", "target-feature=+crt-static"] diff --git a/dotnet-win32-setup/ahqstore_setup/Cargo.lock b/dotnet-win32-setup/ahqstore_setup/Cargo.lock new file mode 100644 index 0000000..20a8a8a --- /dev/null +++ b/dotnet-win32-setup/ahqstore_setup/Cargo.lock @@ -0,0 +1,2353 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahqstore_setup" +version = "1.0.0" +dependencies = [ + "resvg", + "softbuffer", + "ureq", + "windows", + "winit", + "winres", +] + +[[package]] +name = "android-activity" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" +dependencies = [ + "android-properties", + "bitflags 2.10.0", + "cc", + "cesu8", + "jni", + "jni-sys", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "num_enum", + "thiserror", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + +[[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.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" + +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2 0.5.2", +] + +[[package]] +name = "bumpalo" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" + +[[package]] +name = "bytemuck" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + +[[package]] +name = "bytes" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" + +[[package]] +name = "calloop" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" +dependencies = [ + "bitflags 2.10.0", + "log", + "polling", + "rustix 0.38.44", + "slab", + "thiserror", +] + +[[package]] +name = "cc" +version = "1.2.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a0aeaff4ff1a90589618835a598e545176939b97874f7abc7851caa0618f203" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +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.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "core_maths" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30" +dependencies = [ + "libm", +] + +[[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-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "ctor-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f791803201ab277ace03903de1594460708d2d54df6053f2d9e82f592b19e3b" + +[[package]] +name = "cursor-icon" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" + +[[package]] +name = "data-url" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.10.0", + "objc2 0.6.3", +] + +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" + +[[package]] +name = "drm" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80bc8c5c6c2941f70a55c15f8d9f00f9710ebda3ffda98075f996a0e6c92756f" +dependencies = [ + "bitflags 2.10.0", + "bytemuck", + "drm-ffi", + "drm-fourcc", + "libc", + "rustix 0.38.44", +] + +[[package]] +name = "drm-ffi" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8e41459d99a9b529845f6d2c909eb9adf3b6d2f82635ae40be8de0601726e8b" +dependencies = [ + "drm-sys", + "rustix 0.38.44", +] + +[[package]] +name = "drm-fourcc" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aafbcdb8afc29c1a7ee5fbe53b5d62f4565b35a042a662ca9fecd0b54dae6f4" + +[[package]] +name = "drm-sys" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bafb66c8dbc944d69e15cfcc661df7e703beffbaec8bd63151368b06c5f9858c" +dependencies = [ + "libc", + "linux-raw-sys 0.6.5", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "euclid" +version = "0.22.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" +dependencies = [ + "num-traits", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645cbb3a84e60b7531617d5ae4e57f7e27308f6445f5abf653209ea76dec8dff" + +[[package]] +name = "flate2" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" + +[[package]] +name = "fontconfig-parser" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbc773e24e02d4ddd8395fd30dc147524273a83e54e0f312d986ea30de5f5646" +dependencies = [ + "roxmltree", +] + +[[package]] +name = "fontdb" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "457e789b3d1202543297a350643cf459f836cade38934e7a4cf6a39e7cde2905" +dependencies = [ + "fontconfig-parser", + "log", + "memmap2", + "slotmap", + "tinyvec", + "ttf-parser", +] + +[[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", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "gethostname" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" +dependencies = [ + "rustix 1.1.3", + "windows-link", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +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", + "wasip2", +] + +[[package]] +name = "gif" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b" +dependencies = [ + "color_quant", + "weezl", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "image-webp" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imagesize" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" + +[[package]] +name = "indexmap" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "itoa" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee5b5339afb4c41626dde77b7a611bd4f2c202b897852b4bcf5d03eddc61010" + +[[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", + "log", + "thiserror", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "kurbo" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62026ae44756f8a599ba21140f350303d4f08dcdcc71b5ad9c9bb8128c13c62" +dependencies = [ + "arrayvec", + "euclid", + "smallvec", +] + +[[package]] +name = "libc" +version = "0.2.178" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link", +] + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "libredox" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df15f6eac291ed1cf25865b1ee60399f57e7c227e7f51bdbd4c5270396a9ed50" +dependencies = [ + "bitflags 2.10.0", + "libc", + "redox_syscall 0.6.0", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a385b1be4e5c3e362ad2ffa73c392e53f031eaa5b7d648e64cd87f27f6063d7" + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "memmap2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" +dependencies = [ + "libc", +] + +[[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 = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.10.0", + "jni-sys", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys", +] + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +dependencies = [ + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.10.0", + "block2", + "libc", + "objc2 0.5.2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation 0.2.2", + "objc2-quartz-core 0.2.2", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" +dependencies = [ + "bitflags 2.10.0", + "block2", + "objc2 0.5.2", + "objc2-core-location", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-contacts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.10.0", + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.10.0", + "dispatch2", + "objc2 0.6.3", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.10.0", + "dispatch2", + "objc2 0.6.3", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal", +] + +[[package]] +name = "objc2-core-location" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +dependencies = [ + "block2", + "objc2 0.5.2", + "objc2-contacts", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.10.0", + "block2", + "dispatch", + "libc", + "objc2 0.5.2", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.10.0", + "objc2 0.6.3", + "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.10.0", + "objc2 0.6.3", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-link-presentation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2", + "objc2 0.5.2", + "objc2-app-kit", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.10.0", + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.10.0", + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-core-foundation", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-symbols" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +dependencies = [ + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +dependencies = [ + "bitflags 2.10.0", + "block2", + "objc2 0.5.2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-image", + "objc2-core-location", + "objc2-foundation 0.2.2", + "objc2-link-presentation", + "objc2-quartz-core 0.2.2", + "objc2-symbols", + "objc2-uniform-type-identifiers", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-uniform-type-identifiers" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" +dependencies = [ + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.10.0", + "block2", + "objc2 0.5.2", + "objc2-core-location", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "orbclient" +version = "0.3.49" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "247ad146e19b9437f8604c21f8652423595cf710ad108af40e77d3ae6e96b827" +dependencies = [ + "libredox", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pico-args" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[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 = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix 1.1.3", + "windows-sys 0.61.2", +] + +[[package]] +name = "proc-macro-crate" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + +[[package]] +name = "quick-xml" +version = "0.37.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +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 = "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.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.10.0", +] + +[[package]] +name = "redox_syscall" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec96166dafa0886eb81fe1c0a388bece180fbef2135f97c1e2cf8302e74b43b5" +dependencies = [ + "bitflags 2.10.0", +] + +[[package]] +name = "resvg" +version = "0.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8928798c0a55e03c9ca6c4c6846f76377427d2c1e1f7e6de3c06ae57942df43" +dependencies = [ + "gif", + "image-webp", + "log", + "pico-args", + "rgb", + "svgtypes", + "tiny-skia", + "usvg", + "zune-jpeg", +] + +[[package]] +name = "rgb" +version = "0.8.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "roxmltree" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.10.0", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" +dependencies = [ + "bitflags 2.10.0", + "errno", + "libc", + "linux-raw-sys 0.11.0", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21e6f2ab2928ca4291b86736a8bd920a277a399bba1589409d72154ff87c1282" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "rustybuzz" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702" +dependencies = [ + "bitflags 2.10.0", + "bytemuck", + "core_maths", + "log", + "smallvec", + "ttf-parser", + "unicode-bidi-mirroring", + "unicode-ccc", + "unicode-properties", + "unicode-script", +] + +[[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 = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", +] + +[[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", +] + +[[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.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + +[[package]] +name = "simplecss" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a9c6883ca9c3c7c90e888de77b7a5c849c779d25d74a1269b0218b14e8b136c" +dependencies = [ + "log", +] + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "slotmap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", +] + +[[package]] +name = "softbuffer" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +dependencies = [ + "as-raw-xcb-connection", + "bytemuck", + "drm", + "fastrand", + "js-sys", + "memmap2", + "ndk", + "objc2 0.6.3", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", + "raw-window-handle", + "redox_syscall 0.5.18", + "rustix 1.1.3", + "tiny-xlib", + "tracing", + "wasm-bindgen", + "wayland-backend", + "wayland-client", + "wayland-sys", + "web-sys", + "windows-sys 0.61.2", + "x11rb", +] + +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" +dependencies = [ + "float-cmp", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "svgtypes" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" +dependencies = [ + "kurbo", + "siphasher", +] + +[[package]] +name = "syn" +version = "2.0.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[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", +] + +[[package]] +name = "tiny-skia" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "log", + "png", + "tiny-skia-path", +] + +[[package]] +name = "tiny-skia-path" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + +[[package]] +name = "tiny-xlib" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0324504befd01cab6e0c994f34b2ffa257849ee019d3fb3b64fb2c858887d89e" +dependencies = [ + "as-raw-xcb-connection", + "ctor-lite", + "libloading", + "pkg-config", + "tracing", +] + +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +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 = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +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_edit" +version = "0.23.10+spec-1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" +dependencies = [ + "indexmap", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" +dependencies = [ + "winnow", +] + +[[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" + +[[package]] +name = "ttf-parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" +dependencies = [ + "core_maths", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-bidi-mirroring" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfa6e8c60bb66d49db113e0125ee8711b7647b5579dc7f5f19c42357ed039fe" + +[[package]] +name = "unicode-ccc" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce61d488bcdc9bc8b5d1772c404828b17fc481c0a582b5581e95fb233aef503e" + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "unicode-properties" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" + +[[package]] +name = "unicode-script" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "383ad40bb927465ec0ce7720e033cb4ca06912855fc35db31b5755d0de75b1ee" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-vo" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "ureq" +version = "3.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d39cb1dbab692d82a977c0392ffac19e188bd9186a9f32806f0aaa859d75585a" +dependencies = [ + "base64", + "flate2", + "log", + "percent-encoding", + "rustls", + "rustls-pki-types", + "ureq-proto", + "utf-8", + "webpki-roots", +] + +[[package]] +name = "ureq-proto" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d81f9efa9df032be5934a46a068815a10a042b494b6a58cb0a1a97bb5467ed6f" +dependencies = [ + "base64", + "http", + "httparse", + "log", +] + +[[package]] +name = "usvg" +version = "0.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80be9b06fbae3b8b303400ab20778c80bbaf338f563afe567cf3c9eea17b47ef" +dependencies = [ + "base64", + "data-url", + "flate2", + "fontdb", + "imagesize", + "kurbo", + "log", + "pico-args", + "roxmltree", + "rustybuzz", + "simplecss", + "siphasher", + "strict-num", + "svgtypes", + "tiny-skia-path", + "unicode-bidi", + "unicode-script", + "unicode-vo", + "xmlwriter", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[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 = "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.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wayland-backend" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" +dependencies = [ + "cc", + "downcast-rs", + "rustix 1.1.3", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" +dependencies = [ + "bitflags 2.10.0", + "rustix 1.1.3", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3" +dependencies = [ + "proc-macro2", + "quick-xml", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142" +dependencies = [ + "dlib", + "log", + "once_cell", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "weezl" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" + +[[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 = "windows" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +dependencies = [ + "windows-collections", + "windows-core", + "windows-future", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" +dependencies = [ + "windows-core", +] + +[[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", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +dependencies = [ + "windows-core", + "windows-link", + "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", +] + +[[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", +] + +[[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.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" +dependencies = [ + "windows-core", + "windows-link", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[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.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[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", +] + +[[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.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" +dependencies = [ + "windows-link", +] + +[[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 = "winit" +version = "0.30.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c66d4b9ed69c4009f6321f762d6e61ad8a2389cd431b97cb1e146812e9e6c732" +dependencies = [ + "android-activity", + "atomic-waker", + "bitflags 2.10.0", + "block2", + "calloop", + "cfg_aliases", + "concurrent-queue", + "core-foundation", + "core-graphics", + "cursor-icon", + "dpi", + "js-sys", + "libc", + "ndk", + "objc2 0.5.2", + "objc2-app-kit", + "objc2-foundation 0.2.2", + "objc2-ui-kit", + "orbclient", + "pin-project", + "raw-window-handle", + "redox_syscall 0.4.1", + "rustix 0.38.44", + "smol_str", + "tracing", + "unicode-segmentation", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "web-time", + "windows-sys 0.52.0", + "xkbcommon-dl", +] + +[[package]] +name = "winnow" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +dependencies = [ + "memchr", +] + +[[package]] +name = "winres" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c" +dependencies = [ + "toml", +] + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "x11rb" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" +dependencies = [ + "as-raw-xcb-connection", + "gethostname", + "libc", + "libloading", + "once_cell", + "rustix 1.1.3", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" + +[[package]] +name = "xkbcommon-dl" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" +dependencies = [ + "bitflags 2.10.0", + "dlib", + "log", + "once_cell", + "xkeysym", +] + +[[package]] +name = "xkeysym" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" + +[[package]] +name = "xmlwriter" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + +[[package]] +name = "zune-jpeg" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" +dependencies = [ + "zune-core", +] diff --git a/dotnet-win32-setup/ahqstore_setup/Cargo.toml b/dotnet-win32-setup/ahqstore_setup/Cargo.toml new file mode 100644 index 0000000..b81b25f --- /dev/null +++ b/dotnet-win32-setup/ahqstore_setup/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "ahqstore_setup" +description = "AHQ Store Setup" +version = "1.0.0" +edition = "2024" + +[dependencies] +windows = { version = "0.62", features = ["Win32_System_Console"] } + +softbuffer = "0.4" +resvg = "0.45" +winit = { version = "0.30", default-features = false, features = ["rwh_06"] } +ureq = "3" + +[build-dependencies] +winres = "0.1" + +[profile.release] +strip = true +opt-level = "z" +lto = true +codegen-units = 1 +panic = "abort" diff --git a/dotnet-win32-setup/ahqstore_setup/build.rs b/dotnet-win32-setup/ahqstore_setup/build.rs new file mode 100644 index 0000000..c90d030 --- /dev/null +++ b/dotnet-win32-setup/ahqstore_setup/build.rs @@ -0,0 +1,19 @@ +fn main() { + let mut res = winres::WindowsResource::new(); + res + .set_icon("./ui/icon.ico") + .set("InternalName", "ahqstore_setup.exe") + .set_manifest(r#" + + + + + + + + + + "#); + + res.compile().expect("Error"); +} diff --git a/dotnet-win32-setup/ahqstore_setup/fonts/Khula-Bold.ttf b/dotnet-win32-setup/ahqstore_setup/fonts/Khula-Bold.ttf new file mode 100644 index 0000000..4dfc076 Binary files /dev/null and b/dotnet-win32-setup/ahqstore_setup/fonts/Khula-Bold.ttf differ diff --git a/dotnet-win32-setup/ahqstore_setup/fonts/Khula-Light.ttf b/dotnet-win32-setup/ahqstore_setup/fonts/Khula-Light.ttf new file mode 100644 index 0000000..4da0ab9 Binary files /dev/null and b/dotnet-win32-setup/ahqstore_setup/fonts/Khula-Light.ttf differ diff --git a/dotnet-win32-setup/ahqstore_setup/fonts/OFL.txt b/dotnet-win32-setup/ahqstore_setup/fonts/OFL.txt new file mode 100644 index 0000000..f52d5a4 --- /dev/null +++ b/dotnet-win32-setup/ahqstore_setup/fonts/OFL.txt @@ -0,0 +1,93 @@ +Copyright (c) 2014, Erin McLaughlin (hello@erinmclaughlin.com). Digitized data copyright 2010, Google Corporation. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/dotnet-win32-setup/ahqstore_setup/src/main.rs b/dotnet-win32-setup/ahqstore_setup/src/main.rs new file mode 100644 index 0000000..438de74 --- /dev/null +++ b/dotnet-win32-setup/ahqstore_setup/src/main.rs @@ -0,0 +1,240 @@ +#![windows_subsystem = "windows"] + +use std::{mem::transmute, num::NonZeroU32, thread}; + +use resvg::{ + tiny_skia::{Color, Pixmap}, + usvg::{Options, Transform, Tree}, +}; +use softbuffer::{Context, Surface}; +use winit::{ + application::ApplicationHandler, + dpi::LogicalSize, + event::WindowEvent, + event_loop::{ControlFlow, EventLoop, EventLoopBuilder}, + platform::windows::{ + CornerPreference, EventLoopBuilderExtWindows, IconExtWindows, WindowAttributesExtWindows, + }, + window::{Icon, Window, WindowAttributes}, +}; + +use crate::net::handle_installer_loop; + +mod net; + +pub static SVG: &'static str = include_str!("../ui/splash.svg"); + +pub static KHULA_LIGHT_FONT: &'static [u8] = include_bytes!("../fonts/Khula-Light.ttf"); +pub static KHULA_BOLD_FONT: &'static [u8] = include_bytes!("../fonts/Khula-Bold.ttf"); + +#[derive(Debug, Default)] +pub struct DrawRequest { + perc: u64, + txt: &'static str, +} + +#[cfg(target_arch = "x86_64")] +pub static NEXT_SETUP: &'static [u8] = + include_bytes!("../../bin/Release/net10.0-windows/win-x64/publish/AHQStoreWin32Setup.exe"); + +#[cfg(target_arch = "aarch64")] +pub static NEXT_SETUP: &'static [u8] = + include_bytes!("../../bin/Release/net10.0-windows/win-arm64/publish/AHQStoreWin32Setup.exe"); + +fn main() { + { + use windows::Win32::System::Console::*; + let _ = unsafe { AttachConsole(ATTACH_PARENT_PROCESS) }; + } + + println!( + "We're displaying a few software licenses for the fonts used by us.\n{}", + include_str!("../fonts/OFL.txt") + ); + + let ev_loop: EventLoop = EventLoopBuilder::default() + .with_dpi_aware(true) + .build() + .expect("Unable to create event loop"); + + ev_loop.set_control_flow(ControlFlow::Poll); + + ev_loop.set_control_flow(ControlFlow::Wait); + + let sink = ev_loop.create_proxy(); + + thread::spawn(move || { + handle_installer_loop(sink); + }); + + let mut app = App::default(); + ev_loop.run_app(&mut app).expect("Unable to run app"); +} + +#[derive(Default)] +struct App { + window: Option, + ctx: Option>, + surface: Option>, + + // Window Content Rendered + opt: Option>, + content: String, +} + +impl ApplicationHandler for App { + fn resumed(&mut self, event_loop: &winit::event_loop::ActiveEventLoop) { + if self.window.is_none() { + self.content = SVG + .replace("{WIDTH}", "100%") + .replace("{TEXT}", "Checking for dependencies..."); + + self.opt = Some({ + let mut opt = Options::default(); + + opt.fontdb_mut().load_font_data(KHULA_BOLD_FONT.to_vec()); + opt.fontdb_mut().load_font_data(KHULA_LIGHT_FONT.to_vec()); + + opt + }); + + let window = event_loop + .create_window( + WindowAttributes::default() + .with_title("Preparing AHQ Store") + .with_active(true) + .with_resizable(false) + .with_decorations(false) + .with_inner_size(LogicalSize::new(600, 250)) + .with_min_inner_size(LogicalSize::new(600, 250)) + .with_max_inner_size(LogicalSize::new(600, 250)) + .with_transparent(true) + .with_corner_preference(CornerPreference::DoNotRound) + .with_window_icon(Some( + Icon::from_resource(1, None).expect("Impossible since resource is set by winres"), + )), + ) + .expect("unable to create window"); + + unsafe { + let ctx = transmute(Context::new(&window).expect("Context")); + + self.ctx = Some(ctx); + + let surface = transmute( + Surface::new(self.ctx.as_ref().unwrap(), &window).expect("Could not generate surface"), + ); + + self.surface = Some(surface); + } + + if let Some(monitor) = window.current_monitor() { + let monitor_size = monitor.size(); + let scale = monitor.scale_factor(); + + let window_width = (600.0 * scale) as i32; + let window_height = (250.0 * scale) as i32; + + let x = (monitor_size.width as i32 - window_width) / 2; + let y = (monitor_size.height as i32 - window_height) / 2; + + window.set_outer_position(winit::dpi::PhysicalPosition::new(x, y)); + } + + self.window = Some(window); + } + } + + fn user_event(&mut self, _: &winit::event_loop::ActiveEventLoop, event: DrawRequest) { + self.content = SVG + .replace("{WIDTH}", format!("{}%", event.perc).as_str()) + .replace("{TEXT}", event.txt); + + self.window.as_ref().unwrap().request_redraw(); + } + + fn window_event( + &mut self, + event_loop: &winit::event_loop::ActiveEventLoop, + _: winit::window::WindowId, + event: winit::event::WindowEvent, + ) { + match event { + WindowEvent::CloseRequested => { + event_loop.exit(); + } + WindowEvent::RedrawRequested => { + // Redraw the application. + // + // It's preferable for applications that do not render continuously to render in + // this event rather than in AboutToWait, since rendering in here allows + // the program to gracefully handle redraws requested by the OS. + + // Draw. + let (width, height): (u32, u32) = self.window.as_ref().unwrap().inner_size().into(); + + let surface = self.surface.as_mut().unwrap(); + + let rtree = + Tree::from_str(&self.content, self.opt.as_ref().unwrap()).expect("Unwanted Trees"); + let mut pixmap = Pixmap::new(width, height).unwrap(); + + pixmap.fill(Color::TRANSPARENT); + + let svg_size = rtree.size(); + let scale_x = width as f32 / svg_size.width(); + let scale_y = height as f32 / svg_size.height(); + // Preserve aspect ratio by taking the smaller scale + let scale = scale_x.min(scale_y); + + // Create a transform to scale the SVG + let transform = Transform::from_scale(scale, scale); + + // Render! + resvg::render(&rtree, transform, &mut pixmap.as_mut()); + + // Render into window + surface + .resize( + NonZeroU32::new(width).unwrap(), + NonZeroU32::new(height).unwrap(), + ) + .expect("Could not resize"); + + let mut buffer = surface.buffer_mut().unwrap(); + let src_data = pixmap.data(); + + for (i, chunk) in src_data.chunks_exact(4).enumerate() { + // Determine destination index (ensure we don't go out of bounds) + if i < buffer.len() { + let r = chunk[0] as u32; + let g = chunk[1] as u32; + let b = chunk[2] as u32; + let a = chunk[3] as u32; // 1. Get the Alpha channel + + // Pack into u32: AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB + buffer[i] = (a << 24) | (r << 16) | (g << 8) | b; + } + } + + buffer.present().unwrap(); + + let window = self.window.as_ref().unwrap(); + + if let Some(monitor) = window.current_monitor() { + let monitor_size = monitor.size(); + let scale = monitor.scale_factor(); + + let window_width = (600.0 * scale) as i32; + let window_height = (250.0 * scale) as i32; + + let x = (monitor_size.width as i32 - window_width) / 2; + let y = (monitor_size.height as i32 - window_height) / 2; + + window.set_outer_position(winit::dpi::PhysicalPosition::new(x, y)); + } + } + _ => (), + } + } +} diff --git a/dotnet-win32-setup/ahqstore_setup/src/net.rs b/dotnet-win32-setup/ahqstore_setup/src/net.rs new file mode 100644 index 0000000..e2a8a7c --- /dev/null +++ b/dotnet-win32-setup/ahqstore_setup/src/net.rs @@ -0,0 +1,142 @@ +use std::{ + env::{self, temp_dir}, + fs::{self, File, read_dir}, + io::{Read, Write}, + path::PathBuf, + process::{Command, exit}, + thread::sleep, + time::Duration, +}; + +use winit::event_loop::EventLoopProxy; + +use crate::{DrawRequest, NEXT_SETUP}; + +pub fn handle_installer_loop(sink: EventLoopProxy) { + let dotnetpath = r"C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App"; + + if let Ok(x) = read_dir(dotnetpath) { + if x.into_iter().any(|x| { + if let Ok(x) = x { + if let Ok(x) = x.file_name().into_string() { + let (x, _) = x.split_once(".").unwrap_or(("", "")); + let x = x.parse::().unwrap_or(0); + + if x >= 10 { + return true; + } + } + } + + false + }) { + run_installer(&sink); + } + } + + _ = sink.send_event(DrawRequest { + perc: 0, + txt: "Downloading runtime...", + }); + + #[cfg(target_arch = "x86_64")] + let dotneturl = "https://builds.dotnet.microsoft.com/dotnet/WindowsDesktop/10.0.1/windowsdesktop-runtime-10.0.1-win-x64.exe"; + + #[cfg(target_arch = "aarch64")] + let dotneturl = "https://builds.dotnet.microsoft.com/dotnet/WindowsDesktop/10.0.1/windowsdesktop-runtime-10.0.1-win-arm64.exe"; + + let mut dotnetfilepath = temp_dir(); + dotnetfilepath.push("install_dotnet10.exe"); + + let mut dotnetfile = File::create(&dotnetfilepath).expect("Unable to create dotnet"); + + let mut dotnet = ureq::get(dotneturl).call().expect("Sending response"); + let total = dotnet + .headers() + .get("Content-Length") + .and_then(|v| v.to_str().expect("NoErr").parse::().ok()); + + let mut reader = dotnet.body_mut().as_reader(); + + let mut downloaded = 0; + + let mut buf = Box::new([0u8; 16 * 1024]); + + let mut last_sent_perc = 0; + + while let Ok(n) = reader.read(buf.as_mut()) { + if n == 0 { + break; + } + + dotnetfile + .write_all(&buf[..n]) + .expect("Something else wrong!"); + + downloaded += n as u64; + + if let Some(total) = total { + let perc = downloaded * 100 / total; + + if perc != last_sent_perc { + last_sent_perc = perc; + let _ = sink.send_event(DrawRequest { + perc, + txt: "Downloading runtime...", + }); + } + } + } + + dotnetfile.sync_all().expect("Unable to flush"); + drop(dotnetfile); + + let _ = sink.send_event(DrawRequest { + perc: 100, + txt: "Installing runtime...", + }); + + if !install_dotnet(dotnetfilepath) { + _ = sink.send_event(DrawRequest { + perc: 100, + txt: "Something went wrong!", + }); + + sleep(Duration::from_secs(5)); + + // 100: Dotnet Failed + exit(100); + } + + run_installer(&sink); +} + +fn install_dotnet(path: PathBuf) -> bool { + Command::new(path) + .args(["/install", "/quiet", "/norestart"]) + .spawn() + .expect("Unable to spawn") + .wait() + .expect("Unable to wait") + .success() +} + +fn run_installer(sink: &EventLoopProxy) { + _ = sink.send_event(DrawRequest { + perc: 100, + txt: "Starting installer...", + }); + + sleep(Duration::from_secs(2)); + + let mut tmp = temp_dir(); + tmp.push("ahqstore_dotnet_setup.exe"); + fs::write(&tmp, NEXT_SETUP).unwrap(); + + Command::new(tmp) + .args(env::args()) + .spawn() + .expect("Unknown, unwanted error"); + + exit(0); +} diff --git a/dotnet-win32-setup/ahqstore_setup/ui/icon.ico b/dotnet-win32-setup/ahqstore_setup/ui/icon.ico new file mode 100644 index 0000000..a018bcd Binary files /dev/null and b/dotnet-win32-setup/ahqstore_setup/ui/icon.ico differ diff --git a/dotnet-win32-setup/ahqstore_setup/ui/splash.svg b/dotnet-win32-setup/ahqstore_setup/ui/splash.svg new file mode 100644 index 0000000..c70cc39 --- /dev/null +++ b/dotnet-win32-setup/ahqstore_setup/ui/splash.svg @@ -0,0 +1,15 @@ + + + + + AHQ Softwares + Transparency. Security. Integrity + {TEXT} + \ No newline at end of file diff --git a/dotnet-win32-setup/app.manifest b/dotnet-win32-setup/app.manifest new file mode 100644 index 0000000..8b6214d --- /dev/null +++ b/dotnet-win32-setup/app.manifest @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dotnet-win32-setup/build.ps1 b/dotnet-win32-setup/build.ps1 new file mode 100644 index 0000000..e306068 --- /dev/null +++ b/dotnet-win32-setup/build.ps1 @@ -0,0 +1,36 @@ +rustup target add aarch64-pc-windows-msvc + +$items = Get-ChildItem -Path "C:\Program Files (x86)\Windows Kits\10\bin\" -Filter "10.*" +$item = $items[-1].Name + +$signtoolDir = "C:\Program Files (x86)\Windows Kits\10\bin\${item}\x64" + +$signtool = "C:\Program Files (x86)\Windows Kits\10\bin\${item}\x64\signtool.exe" + +$env:SIGNTOOL_PATH = $signtool + +$env:PATH = "$env:PATH;$signtoolDir" + +[System.Environment]::SetEnvironmentVariable("PATH", $env:PATH) + +dotnet publish -c Release -r win-x64 +dotnet publish -c Release -r win-arm64 + +$sha = "8B85C3AE8D2243C2B62D53D14479A99D413F52A7" + +&$signtool sign /sha1 "$sha" /fd SHA256 /t http://timestamp.digicert.com "./bin/Release/net10.0-windows/win-x64/publish/AHQStoreWin32Setup.exe" +&$signtool sign /sha1 "$sha" /fd SHA256 /t http://timestamp.digicert.com "./bin/Release/net10.0-windows/win-arm64/publish/AHQStoreWin32Setup.exe" + +Set-Location .\ahqstore_setup + +cargo build --target x86_64-pc-windows-msvc --release +cargo build --target aarch64-pc-windows-msvc --release + +Set-Location .. + +&$signtool sign /sha1 "$sha" /fd SHA256 /t http://timestamp.digicert.com "./ahqstore_setup/target/x86_64-pc-windows-msvc/release/ahqstore_setup.exe" +&$signtool sign /sha1 "$sha" /fd SHA256 /t http://timestamp.digicert.com "./ahqstore_setup/target/aarch64-pc-windows-msvc/release/ahqstore_setup.exe" + +mkdir outputs +Copy-Item "./ahqstore_setup/target/x86_64-pc-windows-msvc/release/ahqstore_setup.exe" ./outputs/ahqstore_setup_x64.exe +Copy-Item "./ahqstore_setup/target/aarch64-pc-windows-msvc/release/ahqstore_setup.exe" ./outputs/ahqstore_setup_arm64.exe diff --git a/dotnet-win32-setup/src/GitHubServer.cs b/dotnet-win32-setup/src/GitHubServer.cs new file mode 100644 index 0000000..4e32744 --- /dev/null +++ b/dotnet-win32-setup/src/GitHubServer.cs @@ -0,0 +1,127 @@ +using System.Net.Http; +using System.Net.Http.Json; +using System.Runtime.InteropServices; +using System.Text.Json.Serialization; +using System.Text.RegularExpressions; + +namespace AHQStoreWin32Setup; + +public class Commit +{ + [JsonPropertyName("sha")] + public string SHA { get; set; } = string.Empty; +} + +public class Release +{ + [JsonPropertyName("assets")] + public List Assets { get; set; } = []; +} + +public class Asset +{ + [JsonPropertyName("name")] + public string NAME { get; set; } = ""; + + [JsonPropertyName("browser_download_url")] + public string Url { get; set; } = ""; +} + +public class Urls +{ + public string? Prerelease; + public string? Release; +} + +public partial class GitHubService +{ + string commits = "https://api.github.com/repos/ahqstore/ahqstore.github.io/commits"; + + string releases = "https://api.github.com/repos/ahqstore/client/releases"; + string latest = "https://api.github.com/repos/ahqstore/client/releases/latest"; + + string terms_of_service = "https://cdn.jsdelivr.net/gh/ahqstore/ahqstore.github.io@{sha}/docs/tos.mdx"; + + string privacy_policy = "https://cdn.jsdelivr.net/gh/ahqstore/ahqstore.github.io@{sha}/docs/privacy.mdx"; + + + HttpClient client = new HttpClient(); + + public async Task Setup() + { + client.DefaultRequestHeaders.UserAgent.ParseAdd("AHQStore"); + client.Timeout = TimeSpan.FromSeconds(30); + + var output = (await client.GetFromJsonAsync>(commits))![0]!; + + terms_of_service = terms_of_service.Replace("{sha}", output.SHA); + privacy_policy = privacy_policy.Replace("{sha}", output.SHA); + } + + public async Task FetchTOS() + { + + string tos = await client.GetStringAsync(terms_of_service); + + tos = FrontMatter().Replace(tos, ""); + + tos = tos.Replace("[Usage Guidelines](#usage-guidelines)", "**Usage Guidelines**").Replace("(/", "(https://ahqstore.github.io/"); + + return tos; + } + + public async Task FetchPP() + { + string pp = await client.GetStringAsync(privacy_policy); + + pp = FrontMatter().Replace(pp, ""); + + pp = pp.Replace("[Your Data Rights](#your-data-rights)", "**Your Data Rights**").Replace("(/", "(https://ahqstore.github.io/"); + + return pp; + } + + public async Task GetMSIUrls() + { + Release? data = await client.GetFromJsonAsync(latest); + + Release? prereleases = (await client.GetFromJsonAsync>(releases))?.First(); + + Predicate reducer = (asset) => + { + Architecture arch = RuntimeInformation.OSArchitecture; + + if (arch == Architecture.X64) + { + return asset.NAME.Contains("_x64_") && asset.NAME.EndsWith(".msi"); + } + + if (arch == Architecture.Arm64) + { + return asset.NAME.Contains("_arm64_") && asset.NAME.EndsWith(".msi"); + } + + return false; + }; + + Asset? asset = data?.Assets.Find(reducer); + Asset? preasset = prereleases?.Assets.Find(reducer); + + Urls output = new Urls(); + + if (asset != null) + { + output.Release = asset.Url; + } + + if (preasset != null) + { + output.Prerelease = preasset.Url; + } + + return output; + } + + [GeneratedRegex(@"---(.*)---", RegexOptions.Singleline)] + private static partial Regex FrontMatter(); +} \ No newline at end of file diff --git a/dotnet-win32-setup/src/Installer.cs b/dotnet-win32-setup/src/Installer.cs new file mode 100644 index 0000000..18895b0 --- /dev/null +++ b/dotnet-win32-setup/src/Installer.cs @@ -0,0 +1,277 @@ +using System.Diagnostics; +using System.IO; +using System.Net.Http; +using System.Security.Cryptography.X509Certificates; +using Microsoft.VisualBasic.FileIO; +using Microsoft.Win32; +using WixToolset.Dtf.WindowsInstaller; + +public enum Typeof +{ + Downloading, + Indeterminate, + None, + Installed, + Error +} + +public class AHQInstaller +{ + + public string GetTmpPath() + { + var idx = $"ahqstore_{Guid.NewGuid()}.msi"; + + var tmp = SpecialDirectories.Temp; + + return Path.Combine(tmp, idx); ; + } + + public async Task Install( + string url, + bool installCerts, + Action data + ) + { + data("Downloading...", Typeof.Indeterminate, null); + + var msiexecRan = GetTmpPath(); + + /** + This part handling all of download + */ + HttpClient client = new HttpClient(); + + HttpResponseMessage response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead); + response.EnsureSuccessStatusCode(); + + long totalBytes = (long)response.Content.Headers.ContentLength!; + long downloaded = 0; + + using (var fileStream = new FileStream(msiexecRan, FileMode.Create, FileAccess.Write, FileShare.None, 8192, true)) + { + + var stream = await response.Content.ReadAsStreamAsync(); + var buffer = new byte[8192]; + int read; + + + while ((read = await stream.ReadAsync(buffer, 0, buffer.Length)) != 0) + { + await fileStream.WriteAsync(buffer, 0, read); + downloaded += read; + + data("Downloading...", Typeof.Downloading, (int)((downloaded * 100) / totalBytes)); + } + + await fileStream.FlushAsync(); + await fileStream.DisposeAsync(); + } + + /** + Installer module + */ + data("Closing running ahqstore processes...", Typeof.Indeterminate, null); + + foreach (var process in Process.GetProcesses()) + { + try + { + if (process.ProcessName.Contains("ahqstore")) + { + process.Kill(true); + process.WaitForExit(3000); + } + } + catch { /* Ignore if already exiting */ } + } + + data("Preparing install...", Typeof.Indeterminate, null); + + await Task.Delay(3000); + + data("Installing...", Typeof.Indeterminate, null); + + try + { + + Installer.SetInternalUI(InstallUIOptions.Silent); + Installer.InstallProduct(msiexecRan, ""); + + data("Finalizing...", Typeof.Indeterminate, null); + + var hook = new InstallerHook(); + + if (installCerts) + { + hook.InstallRootCA(); + } + + hook.InstallTheInstaller(); + hook.RegisterRegistryEntries(); + + FileSystem.DeleteFile(msiexecRan); + + data("Installed", Typeof.Installed, null); + } + catch (InstallCanceledException) + { + data("Installation cancelled by user.", Typeof.Error, null); + } + catch (InstallerException ex) + { + Console.WriteLine(ex); + + if (ex.ErrorCode == 1618) + { + data($"Another installation is in progress, try again later", Typeof.Error, null); + return; + } + + if (ex.ErrorCode == 112) + { + data($"Your disk is full. Free up space and try again.", Typeof.Error, null); + return; + } + + if (ex.ErrorCode == 1603) + { + data("Uninstall AHQ Store first to install again!", Typeof.Error, null); + return; + } + + if (ex.ErrorCode == 3010 || ex.ErrorCode == 1641) + { + data($"AHQ Store should be installed. If not, please restart your computer and try again.", Typeof.Error, null); + return; + } + + data($"Failed: {ex.Message} (Error {ex.ErrorCode})", Typeof.Error, null); + } + catch (Exception e) + { + data($"Critical Error: {e.Message}", Typeof.Error, null); + } + } +} + +public class InstallerHook +{ + public readonly string setupclone = @"C:\Program Files\AHQ Store Neo\instmgnt.exe"; + + public readonly string certLocation = @"C:\Program Files\AHQ Store Neo\windows.cer"; + + public readonly string preUninstall = @"C:\Program Files\AHQ Store Neo\.msiexec"; + + public readonly string windowsCertB64 = @"MIIFQjCCAyqgAwIBAgIQfuy5U6xI4IhJJgZHTAchsDANBgkqhkiG9w0BAQsFADA5MQswCQYDVQQGEwJJTjEWMBQGA1UECgwNQUhRIFNvZnR3YXJlczESMBAGA1UEAwwJQUhRIFN0b3JlMB4XDTI1MTAyMDA3NDYzM1oXDTQ1MTAyMDA3NTYzMlowOTELMAkGA1UEBhMCSU4xFjAUBgNVBAoMDUFIUSBTb2Z0d2FyZXMxEjAQBgNVBAMMCUFIUSBTdG9yZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALfkhGbpIIrXrT9B6cca+ZSGe6doUir0bsoBQVQcdQyG08eFmc15D08q9An7rRHUJYYsq1MWzKxjz4B0a9Hpzg8sEsUiKydFzha8UeNk84R5N0jsgmF5lDh4NcHSZfVM7S4/6CnvnJ1QFzgiN9kzbNhNhOC6q+30ptljWUaOa0MMyjoMOsRv4dBhjJUstMxl5cgLvcAmoCZuMuhJlJSgAOTWoQEi7GV87dquEu/F/lUeDckvs2sqydbH2LtPe7M5m3+zg7KggCf7sSQ4V7G295P+2Xq1A+YGB6aOuUJOeXHrCnKVKW1iGylDrBA4TPBGjHdW6iE7d+mESGwyqks7YCkKwa2gLic9GcOxxldj/c4Xp70NKHmmehJuXNRCmpRTXoIMuIcdfRoV4TUYv6hCcd70y6S70MFihoxLUw/21V14+sgd5KLlgaxEda55UUkrOAtqEyZatVQnv6HxKg7XJWwQJrpEIQI4UY5RDVXcwO60XmZwibNSISmSi5uVFCvlmyTlqjjlHGGk/WTt7mjD4x2QM7VaIgT2C7APeguum2JF7r1T9V//O0xXLFoQh/o6d3ebhzdBCnmkf1ZZJe4KfmhdJBye0rTMth503fwL1L0Ttr/tLYyg9PfZQYA5uCr7LSkopCeQubaDhcp5MCbtPesYL8RyRscO39lS+AkvLn8RAgMBAAGjRjBEMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUS5zNtRM30MI/5dDqBMT+QH3R7gEwDQYJKoZIhvcNAQELBQADggIBAG1R8ok/iCW0i/xu2rhAph0U7QJQpConSKqpQxHUf0agjjReLoS3c2zlqSEOBjEiUIKeIL4RRODSt495pMFAPN7DAqtAFUvlPyJv5+QyRl+XM48TdF57COqib0ZnlQi52T0qNoSKiv9SlQ5MWwRTLi/RUQVBs0nq5ydILDvqNYCu5v1N2uXkq6Q8AUR9hsMLBxre8zmP722Gr0ukYLJlf7srW0fPLGLMlnTiovQ+UnucGype+L831L5k1EyU1Mtj3dIMTwHqC32D+s6qpTJUhpsYefmP/ZDsGYEp7v8dKXnZNmbhh4FEIdO3LhWkug9aOx1WPO/Tg3/x6sQyF64sbY1hcQCI6D0yCiHrOW0y9mK4GrMiE6FbvjE3f2sxOPVsPGUbHjvoVM351lmz4U9qwFbbmFSxPVf5m+AbqBZz792viDji+vbBQMMjMwle0IHkIEfUfOfEf5f5pkAQ0Zf8nxIXJAZPd4Inj1eZnuunsmWw/sSIP7KQI7W6GtI19rPlkzBDMXBoeiukrOpbeZmNY5LEggpgXRynlVxdbIIcBOY2klcl5s2t1mRo4vS29wPeiNCA+2d82A1ER1RCzfhULhay/KFiy5qrmT4W/6+rcC90WoloUbDIySKbc+WIHjBYDDMJmjoWWEwErCu8Nf68P6ec+nmOOzjAz0Q/4fdCGHsd"; + + public void InstallTheInstaller() + { + var location = Environment.ProcessPath!; + try + { + FileSystem.DeleteFile(setupclone); + } + catch (Exception) { } + + /* + Try to create AHQStoreNEO directory, if it exists, we assume its an update/reintall + */ + try + { + FileSystem.CreateDirectory(@"C:\ProgramData\AHQStoreNEO"); + FileSystem.CreateDirectory(@"C:\ProgramData\AHQStoreNEO\Applications"); + FileSystem.CreateDirectory(@"C:\ProgramData\AHQStoreNEO\Manifests"); + FileSystem.CreateDirectory(@"C:\ProgramData\AHQStoreNEO\Temp"); + + // For future runtimes (if it comes) + FileSystem.CreateDirectory(@"C:\ProgramData\AHQStoreNEO\Runtimes"); + + // For future usage, Rhai based AHQDB + FileSystem.CreateDirectory(@"C:\ProgramData\AHQStoreNEO\Runtimes\RhaiAHQDB"); + } + catch (Exception) { } + + FileSystem.CopyFile(location, setupclone); + } + + public void RegisterRegistryEntries() + { + const string uninstallKeyPath = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; + + using (var baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)) + { + using (var uninstall = baseKey!.OpenSubKey(uninstallKeyPath, true)) + { + if (uninstall == null) return; + + foreach (var key in uninstall.GetSubKeyNames()) + { + var unst = uninstall.OpenSubKey(key, true); + + if (unst == null) continue; + + var value = unst.GetValue("InstallLocation"); + + if (value == null) continue; + if (value.GetType() != "".GetType()) continue; + + var val = (string)value; + + if (val.Contains(@"C:\Program Files\AHQ Store Neo")) + { + var data = (string)unst.GetValue("UninstallString")!; + + FileSystem.WriteAllText(preUninstall, data, false); + + try + { + unst.DeleteValue("ModifyPath"); + } + catch (Exception) { } + + unst.SetValue("NoModify", 1, RegistryValueKind.DWord); + unst.SetValue("NoRepair", 1, RegistryValueKind.DWord); + unst.SetValue("WindowsInstaller", 0, RegistryValueKind.DWord); + + unst.SetValue("DisplayIcon", @"""C:\Program Files\AHQ Store Neo\ahqstore-new.exe"", 0"); + + unst.SetValue("UninstallString", $"\"{setupclone}\" uninstall"); + break; + } + } + } + } + } + + public void InstallRootCA() + { + var bytes = Convert.FromBase64String(windowsCertB64); + + try + { + var certificate = X509CertificateLoader.LoadCertificate(bytes); + + using (var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine)) + { + store.Open(OpenFlags.ReadWrite); + + if (!store.Certificates.Contains(certificate)) + { + store.Add(certificate); + Console.WriteLine("Certificate installed to Trusted Root CA."); + } + + store.Close(); + } + + // Write to file for preservation reasons + // + acts as a marker that certificate was loaded + FileSystem.WriteAllBytes(certLocation, bytes, false); + } + catch (Exception) + { + + } + } +} \ No newline at end of file diff --git a/dotnet-win32-setup/src/Uninstaller.cs b/dotnet-win32-setup/src/Uninstaller.cs new file mode 100644 index 0000000..09c5543 --- /dev/null +++ b/dotnet-win32-setup/src/Uninstaller.cs @@ -0,0 +1,166 @@ +using System.Diagnostics; +using System.IO; +using System.Security.Cryptography.X509Certificates; +using Microsoft.VisualBasic.FileIO; + +public class AHQStoreCoreUninstaller +{ + public readonly string apps = @"C:\ProgramData\AHQStoreNEO"; + + public readonly string users = @"C:\Users"; + + public async Task Uninstall( + Action cb + ) + { + cb("Uninstalling AHQ Store Core"); + + foreach (var process in Process.GetProcesses()) + { + try + { + if (process.ProcessName.Contains("ahqstore")) + { + process.Kill(true); + process.WaitForExit(3000); + } + } + catch { /* Ignore if already exiting */ } + } + + UninstallMsi(); + + cb("Uninstalling AHQ Store Apps"); + + UninstallApps(); + + cb("Finishing up"); + + Finish(); + + cb("Uninstalled!"); + } + + public readonly string msiUninstall = @"C:\Program Files\AHQ Store Neo\.msiexec"; + + public void UninstallMsi() + { + var execString = FileSystem.ReadAllText(msiUninstall).Split(" "); + + var proc = new Process(); + proc.StartInfo.FileName = execString[0]; + proc.StartInfo.ArgumentList.Add(execString[1]); + proc.StartInfo.ArgumentList.Add("/qn"); + proc.StartInfo.Verb = "runas"; + + proc.StartInfo.CreateNoWindow = true; + proc.StartInfo.CreateNewProcessGroup = true; + + proc.Start(); + proc.WaitForExit(); + } + + public readonly string inst = @"C:\Program Files\AHQ Store Neo\"; + + public readonly string certLocation = @"C:\Program Files\AHQ Store Neo\windows.cer"; + + public void Finish() + { + try + { + var certificate = X509CertificateLoader.LoadCertificateFromFile(certLocation); + + using (var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine)) + { + store.Open(OpenFlags.ReadWrite); + + if (store.Certificates.Contains(certificate)) + { + store.Remove(certificate); + } + + store.Close(); + } + + FileSystem.DeleteDirectory(inst, DeleteDirectoryOption.DeleteAllContents); + } + catch (Exception) + { + + } + + } + + public void UninstallApps() + { + FileSystem.DeleteDirectory(apps, DeleteDirectoryOption.DeleteAllContents); + + foreach (var user in FileSystem.GetDirectories(users)) + { + var userahqstore = Path.Combine(user, "AHQStoreNEO"); + + if (FileSystem.DirectoryExists(userahqstore)) + { + try + { + FileSystem.DeleteDirectory(userahqstore, DeleteDirectoryOption.DeleteAllContents); + + } + catch (Exception) { } + + } + } + } + +} + +public class AHQStoreUninstallerEligibility +{ + public readonly string apps = @"C:\ProgramData\AHQStoreNEO\Applications"; + + public readonly string users = @"C:\Users"; + + public bool Eligible() + { + var files = FileSystem.GetDirectories(apps).Count == 0; + + var files2 = (FileSystem.GetDirectories(users)?.All((user) => + { + var userahqstore = Path.Combine(user, "AHQStoreNEO", "Applications"); + + if (FileSystem.DirectoryExists(userahqstore)) + { + try + { + return FileSystem.GetDirectories(userahqstore).Count == 0; + } + catch (Exception) { } + + return false; + } + + return true; + })).GetValueOrDefault(false); + + return files && files2; + } + + public void RunMainUninstaller() + { + var tempFolder = SpecialDirectories.Temp; + var guid = Guid.NewGuid(); + var tempFile = Path.Combine(tempFolder, $"ahqstore_cleanup_{guid}.exe"); + + FileSystem.CopyFile(Environment.ProcessPath!, tempFile); + + var proc = new Process(); + proc.StartInfo.FileName = tempFile; + proc.StartInfo.ArgumentList.Add("uninstall-step2"); + proc.StartInfo.Verb = "runas"; + + proc.StartInfo.CreateNoWindow = false; + proc.StartInfo.CreateNewProcessGroup = true; + + proc.Start(); + } +} \ No newline at end of file diff --git a/index.html b/index.html index ff93803..9559a03 100644 --- a/index.html +++ b/index.html @@ -1,14 +1,13 @@ - + - + - Tauri + React + Typescript + AHQ Store - Application
- diff --git a/latest.md b/latest.md index cc10712..fc10a43 100644 --- a/latest.md +++ b/latest.md @@ -1,12 +1,55 @@ -The v2.0.1 stable release of AHQ Store - -## Changes 🎉 -- Migrate from `server` to `no-server` 💿 -- Stabilized ahqstore-types v3 -- Update to Tauri v2 -- Migration from `vite` to `rsbuild` - -## Additions 🎉 -- Arm64 Support 💻 -- Context Menu 📃 -- Performance Improvements ✈️ \ No newline at end of file +v0.0.1 (Release) + +## AHQ Store, Reborn + +- Welcome to AHQ Store Neo, with a newer, better UI +- Based off of FluentUI and React +- **MicaUI** in Windows 11 +- Intagration with Windows 10/11 Accent Color +- Finally we've replaced **vite** with **rsbuild** +- Unified Android & Desktop Channels + +## What's new in support tier 🎉 + +- AHQ Store now finally provides **Arm64** binaries for both Windows and Linux +- Official **Android** binaries in 6 variants:- + - x86 + - x86_64 + - armv7 + - aarch64 + - **Phone Pack:** armv7 + aarch64 combined + - **All in 1 Pack:** x86 + x86_64 + armv7 + aarch64 + +## Committment + +AHQ Store has committed to the following OSes: + +- Windows 11 (x86_64) +- Windows 11 (aarch64) +- Android 12+ (x86) +- Android 12+ (x86_64) +- Android 12+ (armv7) [literally my phone] +- Android 12+ (aarch64) + +### What about Windows 10? + +AHQ Store is **designed** to run on **Windows 10**. Windows 11 and 10 basically share the same core so if it works on Windows 11, you can expect it to work with Windows 10 as well. In case there is any problem, create an issue and it will be worked on. + +Also, we are trying our most to support: + +- Ubuntu 24.04 (x86_64) +- Ubuntu 24.04 (aarch64) +- Android 9+ (same arches; you must update your "Android System Webview" to latest available version) + +## More exciting news 👌 + +- We finally support **Large Banners** in the app page +- Our own online app listing page: https://ahqstore.github.io/applications +- **Rapid Cooldown Technology:** AHQ Store closes its browser instance when running in background +- More quality of life enhancements + +## Cool News for developers 👨‍💻 + +- We've an API for querying AHQ Store Apps, learn more here: + + https://ahqstore.github.io/applications/api/v1/help.json diff --git a/package.json b/package.json index f83a05b..43d10f0 100644 --- a/package.json +++ b/package.json @@ -1,49 +1,67 @@ { - "name": "ahqstore-new", + "name": "ahqstore-app", "private": true, "version": "0.1.0", "type": "module", "scripts": { - "dev": "vite", - "build": "tsc && vite build", - "preview": "vite preview", + "dev": "rsbuild dev", + "build": "tsc && rsbuild build", + "preview": "rsbuild preview", "tauri": "tauri" }, "dependencies": { - "@radix-ui/react-slot": "^1.1.2", - "@tailwindcss/postcss": "^4.0.4", - "@tauri-apps/api": "^2.2.0", - "@tauri-apps/plugin-autostart": "~2.2.0", - "@tauri-apps/plugin-deep-link": "~2.2.0", - "@tauri-apps/plugin-os": "~2.2.0", - "@tauri-apps/plugin-updater": "~2.5.0", - "ahqstore-types": "link:src-ahqstore-types\\pkg", + "@ahqstore/core-types": "link:src-ahqstore-types\\types", + "@ahqstore/plugin-api": "link:pkg-ahqstore", + "@fluentui/react-icons": "^2.0.316", + "@radix-ui/react-popover": "^1.1.15", + "@radix-ui/react-select": "^2.2.6", + "@radix-ui/react-separator": "^1.1.8", + "@radix-ui/react-slot": "^1.2.4", + "@tailwindcss/postcss": "^4.1.18", + "@tauri-apps/api": "^2.9.1", + "@tauri-apps/plugin-autostart": "~2.5.1", + "@tauri-apps/plugin-deep-link": "~2.4.6", + "@tauri-apps/plugin-http": "~2.5.5", + "@tauri-apps/plugin-os": "~2.3.2", + "@tauri-apps/plugin-updater": "~2.9.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", - "lucide-react": "^0.474.0", - "next-themes": "^0.4.4", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "sonner": "^1.7.4", - "tailwind-merge": "^3.0.1", + "lucide-react": "^0.562.0", + "next-themes": "^0.4.6", + "react": "^19.2.3", + "react-dom": "^19.2.3", + "react-intersection-observer": "^10.0.0", + "react-scan": "^0.4.3", + "scheduler": "0.27.0", + "ses": "^1.14.0", + "sonner": "^2.0.7", + "tailwind-merge": "^3.4.0", "tailwindcss-animate": "^1.0.7", "tauri-plugin-ahqstore-api": "link:src-plugin" }, "devDependencies": { - "@fluentui/react-components": "^9.58.3", - "@tauri-apps/cli": "^2.2.7", - "@types/node": "^22.13.1", - "@types/react": "^19.0.8", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "daisyui": "5.0.0-beta.7", - "postcss": "^8.5.1", - "tailwindcss": "^4.0.4", - "typescript": "~5.7.3", - "vite": "^6.1.0" + "@fluentui/react-components": "^9.72.9", + "@rsbuild/core": "^1.7.2", + "@rsbuild/plugin-babel": "^1.0.6", + "@rsbuild/plugin-react": "^1.4.2", + "@rspack/core": "^1.7.1", + "@tauri-apps/cli": "^2.9.6", + "@types/node": "^25.0.6", + "@types/react": "^19.2.8", + "@types/react-dom": "^19.2.3", + "babel-plugin-react-compiler": "^1.0.0", + "daisyui": "5.5.14", + "postcss": "^8.5.6", + "postcss-loader": "^8.2.0", + "prettier": "^3.7.4", + "tailwindcss": "^4.1.18", + "typescript": "~5.9.3" }, "pnpm": { "onlyBuiltDependencies": [ + "@swc/core", + "@tailwindcss/oxide", + "core-js", "esbuild" ] } diff --git a/pkg-ahqstore/.gitignore b/pkg-ahqstore/.gitignore new file mode 100644 index 0000000..89e507f --- /dev/null +++ b/pkg-ahqstore/.gitignore @@ -0,0 +1,4 @@ +dist +docs +api +legacy \ No newline at end of file diff --git a/pkg-ahqstore/.npmignore b/pkg-ahqstore/.npmignore new file mode 100644 index 0000000..2dcad05 --- /dev/null +++ b/pkg-ahqstore/.npmignore @@ -0,0 +1,4 @@ +tsdown.config.ts +tsconfig.json +pnpm-lock.yaml +src \ No newline at end of file diff --git a/pkg-ahqstore/README.md b/pkg-ahqstore/README.md new file mode 100644 index 0000000..59eb233 --- /dev/null +++ b/pkg-ahqstore/README.md @@ -0,0 +1,22 @@ +# AHQ Store Plugin API + +This is an Plugin API Wrapper. As you'd know AHQ Store Worker Plugins run in a specialized containerized environment called AHQStoreJS. + +This whole plugin is written using the runtimes and interfaces available in AHQStoreJS and will not work in environments like **NodeJS, Deno, Bun**. + +You only have to import the `Plugin` interface from `@ahqstore/plugin-api` + +## Scope + +This part of the API exports the functions needed to integrate an **AHQ Store** +**`CORE PLUGIN WORKER`** + +A core plugin worker basically extends the core of **AHQ Store** using the provided +api and api **conventions** that keep changing like the time (I bet it has changed +since you last read it) + +```ts +import { Plugin } from "@ahqstore/plugin-api"; + +const plugin = new Plugin(); +``` diff --git a/pkg-ahqstore/icon.png b/pkg-ahqstore/icon.png new file mode 100644 index 0000000..cae0abb Binary files /dev/null and b/pkg-ahqstore/icon.png differ diff --git a/pkg-ahqstore/package.json b/pkg-ahqstore/package.json new file mode 100644 index 0000000..736ca41 --- /dev/null +++ b/pkg-ahqstore/package.json @@ -0,0 +1,57 @@ +{ + "name": "@ahqstore/plugin-api", + "version": "0.0.12", + "description": "A utility package to use AHQ Store Plugin API that doesn't break like the fragile internal low level ipc", + "keywords": [ + "plugin", + "api", + "wrapper", + "abstraction" + ], + "homepage": "https://github.com/ahqstore/client#readme", + "bugs": { + "url": "https://github.com/ahqstore/client/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ahqstore/client.git" + }, + "license": "MIT", + "author": "A. Chakraborty (@ahqsoftwares)", + "type": "module", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "exports": { + ".": { + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "require": { + "types": "./dist/index.d.cts", + "default": "./dist/index.cjs" + } + } + }, + "files": [ + "./dist/**/*" + ], + "scripts": { + "build": "tsdown", + "dev": "tsdown --watch", + "build:docs:legacy": "typedoc --options typedoc-legacy.json --out legacy", + "build:docs": "typedoc", + "dev:docs": "typedoc --watch" + }, + "devDependencies": { + "ahqstore-types": "^3", + "tsdown": "^0.15", + "typedoc": "^0.28", + "typedoc-plugin-markdown": "^4.9.0", + "typedoc-vitepress-theme": "^1.1.2", + "typescript": "^5" + }, + "engines": { + "node": ">=22.0.0" + } +} diff --git a/pkg-ahqstore/pnpm-lock.yaml b/pkg-ahqstore/pnpm-lock.yaml new file mode 100644 index 0000000..85fa9bc --- /dev/null +++ b/pkg-ahqstore/pnpm-lock.yaml @@ -0,0 +1,777 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + ahqstore-types: + specifier: ^3 + version: 3.17.3 + tsdown: + specifier: ^0.15 + version: 0.15.4(typescript@5.9.2) + typedoc: + specifier: ^0.28 + version: 0.28.13(typescript@5.9.2) + typedoc-plugin-markdown: + specifier: ^4.9.0 + version: 4.9.0(typedoc@0.28.13(typescript@5.9.2)) + typedoc-vitepress-theme: + specifier: ^1.1.2 + version: 1.1.2(typedoc-plugin-markdown@4.9.0(typedoc@0.28.13(typescript@5.9.2))) + typescript: + specifier: ^5 + version: 5.9.2 + +packages: + + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} + + '@emnapi/core@1.5.0': + resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} + + '@emnapi/runtime@1.5.0': + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@gerrit0/mini-shiki@3.13.0': + resolution: {integrity: sha512-mCrNvZNYNrwKer5PWLF6cOc0OEe2eKzgy976x+IT2tynwJYl+7UpHTSeXQJGijgTcoOf+f359L946unWlYRnsg==} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@napi-rs/wasm-runtime@1.0.5': + resolution: {integrity: sha512-TBr9Cf9onSAS2LQ2+QHx6XcC6h9+RIzJgbqG3++9TUZSH204AwEy5jg3BTQ0VATsyoGj4ee49tN/y6rvaOOtcg==} + + '@oxc-project/types@0.92.0': + resolution: {integrity: sha512-PDLfCbwgXjGdTBxzcuDOUxJYNBl6P8dOp3eDKWw54dYvqONan9rwGDRQU0zrkdEMiItfXQQUOI17uOcMX5Zm7A==} + + '@quansync/fs@0.1.5': + resolution: {integrity: sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA==} + + '@rolldown/binding-android-arm64@1.0.0-beta.40': + resolution: {integrity: sha512-9Ii9phC7QU6Lb+ncMfG1Xlosq0NBB1N/4sw+EGZ3y0BBWGy02TOb5ghWZalphAKv9rn1goqo5WkBjyd2YvsLmA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-beta.40': + resolution: {integrity: sha512-5O6d0y2tBQTL+ecQY3qXIwSnF1/Zik8q7LZMKeyF+VJ9l194d0IdMhl2zUF0cqWbYHuF4Pnxplk4OhurPQ/Z9Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.40': + resolution: {integrity: sha512-izB9jygt3miPQbOTZfSu5K51isUplqa8ysByOKQqcJHgrBWmbTU8TM9eouv6tRmBR0kjcEcID9xhmA1CeZ1VIg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.40': + resolution: {integrity: sha512-2fdpEpKT+wwP0vig9dqxu+toTeWmVSjo3psJQVDeLJ51rO+GXcCJ1IkCXjhMKVEevNtZS7B8T8Z2vvmRV9MAdA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.40': + resolution: {integrity: sha512-HP2lo78OWULN+8TewpLbS9PS00jh0CaF04tA2u8z2I+6QgVgrYOYKvX+T0hlO5smgso4+qb3YchzumWJl3yCPQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.40': + resolution: {integrity: sha512-ng00gfr9BhA2NPAOU5RWAlTiL+JcwAD+L+4yUD1sbBy6tgHdLiNBOvKtHISIF9RM9/eQeS0tAiWOYZGIH9JMew==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.40': + resolution: {integrity: sha512-mF0R1l9kLcaag/9cLEiYYdNZ4v1uuX4jklSDZ1s6vJE4RB3LirUney0FavdVRwCJ5sDvfvsPgXgtBXWYr2M2tQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.40': + resolution: {integrity: sha512-+wi08S7wT5iLPHRZb0USrS6n+T6m+yY++dePYedE5uvKIpWCJJioFTaRtWjpm0V6dVNLcq2OukrvfdlGtH9Wgg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.40': + resolution: {integrity: sha512-W5qBGAemUocIBKCcOsDjlV9GUt28qhl/+M6etWBeLS5gQK0J6XDg0YVzfOQdvq57ZGjYNP0NvhYzqhOOnEx+4g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.40': + resolution: {integrity: sha512-vJwoDehtt+yqj2zacq1AqNc2uE/oh7mnRGqAUbuldV6pgvU01OSQUJ7Zu+35hTopnjFoDNN6mIezkYlGAv5RFA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.40': + resolution: {integrity: sha512-Oj3YyqVUPurr1FlMpEE/bJmMC+VWAWPM/SGUfklO5KUX97bk5Q/733nPg4RykK8q8/TluJoQYvRc05vL/B74dw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.40': + resolution: {integrity: sha512-0ZtO6yN8XjVoFfN4HDWQj4nDu3ndMybr7jIM00DJqOmc+yFhly7rdOy7fNR9Sky3leCpBtsXfepVqRmVpYKPVA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.40': + resolution: {integrity: sha512-BPl1inoJXPpIe38Ja46E4y11vXlJyuleo+9Rmu//pYL5fIDYJkXUj/oAXqjSuwLcssrcwnuPgzvzvlz9++cr3w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.40': + resolution: {integrity: sha512-UguA4ltbAk+nbwHRxqaUP/etpTbR0HjyNlsu4Zjbh/ytNbFsbw8CA4tEBkwDyjgI5NIPea6xY11zpl7R2/ddVA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-beta.40': + resolution: {integrity: sha512-s3GeJKSQOwBlzdUrj4ISjJj5SfSh+aqn0wjOar4Bx95iV1ETI7F6S/5hLcfAxZ9kXDcyrAkxPlqmd1ZITttf+w==} + + '@shikijs/engine-oniguruma@3.13.0': + resolution: {integrity: sha512-O42rBGr4UDSlhT2ZFMxqM7QzIU+IcpoTMzb3W7AlziI1ZF7R8eS2M0yt5Ry35nnnTX/LTLXFPUjRFCIW+Operg==} + + '@shikijs/langs@3.13.0': + resolution: {integrity: sha512-672c3WAETDYHwrRP0yLy3W1QYB89Hbpj+pO4KhxK6FzIrDI2FoEXNiNCut6BQmEApYLfuYfpgOZaqbY+E9b8wQ==} + + '@shikijs/themes@3.13.0': + resolution: {integrity: sha512-Vxw1Nm1/Od8jyA7QuAenaV78BG2nSr3/gCGdBkLpfLscddCkzkL36Q5b67SrLLfvAJTOUzW39x4FHVCFriPVgg==} + + '@shikijs/types@3.13.0': + resolution: {integrity: sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + ahqstore-types@3.17.3: + resolution: {integrity: sha512-N/b89xrvhWbRd34lp+r2h8MOTmiE4oggP5tNPk4ioTYmroIx2aguD6AEfASd+ekDQtRW8Ydb3hLcLrztYbmGOQ==} + + ansis@4.1.0: + resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==} + engines: {node: '>=14'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + ast-kit@2.1.2: + resolution: {integrity: sha512-cl76xfBQM6pztbrFWRnxbrDm9EOqDr1BF6+qQnnDZG2Co2LjyUktkN9GTJfBAfdae+DbT2nJf2nCGAdDDN7W2g==} + engines: {node: '>=20.18.0'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + birpc@2.5.0: + resolution: {integrity: sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + + diff@8.0.2: + resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} + engines: {node: '>=0.3.1'} + + dts-resolver@2.1.2: + resolution: {integrity: sha512-xeXHBQkn2ISSXxbJWD828PFjtyg+/UrMDo7W4Ffcs7+YWCquxU8YjV1KoxuiL+eJ5pg3ll+bC6flVv61L3LKZg==} + engines: {node: '>=20.18.0'} + peerDependencies: + oxc-resolver: '>=11.0.0' + peerDependenciesMeta: + oxc-resolver: + optional: true + + empathic@2.0.0: + resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} + engines: {node: '>=14'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + jiti@2.5.1: + resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + + magic-string@0.30.19: + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + rolldown-plugin-dts@0.16.7: + resolution: {integrity: sha512-9iDzS4MHXMyieisFbWxuz96i/idGJNpvWILqCH06mrEZvn8Q2el3Q63xxjOt7HJjTOUNFhB1isvZFy4dA87lPQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + '@ts-macro/tsc': ^0.3.6 + '@typescript/native-preview': '>=7.0.0-dev.20250601.1' + rolldown: ^1.0.0-beta.9 + typescript: ^5.0.0 + vue-tsc: ~3.0.3 + peerDependenciesMeta: + '@ts-macro/tsc': + optional: true + '@typescript/native-preview': + optional: true + typescript: + optional: true + vue-tsc: + optional: true + + rolldown@1.0.0-beta.40: + resolution: {integrity: sha512-VqEHbKpOgTPmQrZ4fVn4eshDQS/6g/fRpNE7cFSJY+eQLDZn4B9X61J6L+hnlt1u2uRI+pF7r1USs6S5fuWCvw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + tinyexec@1.0.1: + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + tsdown@0.15.4: + resolution: {integrity: sha512-aoFE8disBg8BgYcOgradr/5Yd+QDBRQ+6z8mXo/Ib7+GIaJwJsI5l/ppve05CZGcSDqwdhF4gdrA0HPHBtbBqA==} + engines: {node: '>=20.19.0'} + hasBin: true + peerDependencies: + '@arethetypeswrong/core': ^0.18.1 + publint: ^0.3.0 + typescript: ^5.0.0 + unplugin-lightningcss: ^0.4.0 + unplugin-unused: ^0.5.0 + peerDependenciesMeta: + '@arethetypeswrong/core': + optional: true + publint: + optional: true + typescript: + optional: true + unplugin-lightningcss: + optional: true + unplugin-unused: + optional: true + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + typedoc-plugin-markdown@4.9.0: + resolution: {integrity: sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==} + engines: {node: '>= 18'} + peerDependencies: + typedoc: 0.28.x + + typedoc-vitepress-theme@1.1.2: + resolution: {integrity: sha512-hQvCZRr5uKDqY1bRuY1+eNTNn6d4TE4OP5pnw65Y7WGgajkJW9X1/lVJK2UJpcwCmwkdjw1QIO49H9JQlxWhhw==} + peerDependencies: + typedoc-plugin-markdown: '>=4.4.0' + + typedoc@0.28.13: + resolution: {integrity: sha512-dNWY8msnYB2a+7Audha+aTF1Pu3euiE7ySp53w8kEsXoYw7dMouV5A1UsTUY345aB152RHnmRMDiovuBi7BD+w==} + engines: {node: '>= 18', pnpm: '>= 10'} + hasBin: true + peerDependencies: + typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x + + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + unconfig@7.3.3: + resolution: {integrity: sha512-QCkQoOnJF8L107gxfHL0uavn7WD9b3dpBcFX6HtfQYmjw2YzWxGuFQ0N0J6tE9oguCBJn9KOvfqYDCMPHIZrBA==} + + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} + hasBin: true + +snapshots: + + '@babel/generator@7.28.3': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/parser@7.28.4': + dependencies: + '@babel/types': 7.28.4 + + '@babel/types@7.28.4': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@emnapi/core@1.5.0': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.5.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@gerrit0/mini-shiki@3.13.0': + dependencies: + '@shikijs/engine-oniguruma': 3.13.0 + '@shikijs/langs': 3.13.0 + '@shikijs/themes': 3.13.0 + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@napi-rs/wasm-runtime@1.0.5': + dependencies: + '@emnapi/core': 1.5.0 + '@emnapi/runtime': 1.5.0 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@oxc-project/types@0.92.0': {} + + '@quansync/fs@0.1.5': + dependencies: + quansync: 0.2.11 + + '@rolldown/binding-android-arm64@1.0.0-beta.40': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-beta.40': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.40': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.40': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.40': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.40': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.40': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.40': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.40': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.40': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.40': + dependencies: + '@napi-rs/wasm-runtime': 1.0.5 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.40': + optional: true + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.40': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.40': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.40': {} + + '@shikijs/engine-oniguruma@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + + '@shikijs/themes@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + + '@shikijs/types@3.13.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/unist@3.0.3': {} + + ahqstore-types@3.17.3: {} + + ansis@4.1.0: {} + + argparse@2.0.1: {} + + ast-kit@2.1.2: + dependencies: + '@babel/parser': 7.28.4 + pathe: 2.0.3 + + balanced-match@1.0.2: {} + + birpc@2.5.0: {} + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + cac@6.7.14: {} + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + defu@6.1.4: {} + + diff@8.0.2: {} + + dts-resolver@2.1.2: {} + + empathic@2.0.0: {} + + entities@4.5.0: {} + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + get-tsconfig@4.10.1: + dependencies: + resolve-pkg-maps: 1.0.0 + + hookable@5.5.3: {} + + jiti@2.5.1: {} + + jsesc@3.1.0: {} + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + lunr@2.3.9: {} + + magic-string@0.30.19: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + mdurl@2.0.0: {} + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + ms@2.1.3: {} + + pathe@2.0.3: {} + + picomatch@4.0.3: {} + + punycode.js@2.3.1: {} + + quansync@0.2.11: {} + + readdirp@4.1.2: {} + + resolve-pkg-maps@1.0.0: {} + + rolldown-plugin-dts@0.16.7(rolldown@1.0.0-beta.40)(typescript@5.9.2): + dependencies: + '@babel/generator': 7.28.3 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + ast-kit: 2.1.2 + birpc: 2.5.0 + debug: 4.4.3 + dts-resolver: 2.1.2 + get-tsconfig: 4.10.1 + magic-string: 0.30.19 + rolldown: 1.0.0-beta.40 + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - oxc-resolver + - supports-color + + rolldown@1.0.0-beta.40: + dependencies: + '@oxc-project/types': 0.92.0 + '@rolldown/pluginutils': 1.0.0-beta.40 + ansis: 4.1.0 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.40 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.40 + '@rolldown/binding-darwin-x64': 1.0.0-beta.40 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.40 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.40 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.40 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.40 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.40 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.40 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.40 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.40 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.40 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.40 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.40 + + semver@7.7.2: {} + + tinyexec@1.0.1: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tree-kill@1.2.2: {} + + tsdown@0.15.4(typescript@5.9.2): + dependencies: + ansis: 4.1.0 + cac: 6.7.14 + chokidar: 4.0.3 + debug: 4.4.3 + diff: 8.0.2 + empathic: 2.0.0 + hookable: 5.5.3 + rolldown: 1.0.0-beta.40 + rolldown-plugin-dts: 0.16.7(rolldown@1.0.0-beta.40)(typescript@5.9.2) + semver: 7.7.2 + tinyexec: 1.0.1 + tinyglobby: 0.2.15 + tree-kill: 1.2.2 + unconfig: 7.3.3 + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - '@ts-macro/tsc' + - '@typescript/native-preview' + - oxc-resolver + - supports-color + - vue-tsc + + tslib@2.8.1: + optional: true + + typedoc-plugin-markdown@4.9.0(typedoc@0.28.13(typescript@5.9.2)): + dependencies: + typedoc: 0.28.13(typescript@5.9.2) + + typedoc-vitepress-theme@1.1.2(typedoc-plugin-markdown@4.9.0(typedoc@0.28.13(typescript@5.9.2))): + dependencies: + typedoc-plugin-markdown: 4.9.0(typedoc@0.28.13(typescript@5.9.2)) + + typedoc@0.28.13(typescript@5.9.2): + dependencies: + '@gerrit0/mini-shiki': 3.13.0 + lunr: 2.3.9 + markdown-it: 14.1.0 + minimatch: 9.0.5 + typescript: 5.9.2 + yaml: 2.8.1 + + typescript@5.9.2: {} + + uc.micro@2.1.0: {} + + unconfig@7.3.3: + dependencies: + '@quansync/fs': 0.1.5 + defu: 6.1.4 + jiti: 2.5.1 + quansync: 0.2.11 + + yaml@2.8.1: {} diff --git a/pkg-ahqstore/src/communication.ts b/pkg-ahqstore/src/communication.ts new file mode 100644 index 0000000..f65c387 --- /dev/null +++ b/pkg-ahqstore/src/communication.ts @@ -0,0 +1,131 @@ +/** + * This defines the types of `Events` that can be passed around + * + * Events starting with `Request` indicate events + * that are sent to the daemon + * + * These are internally wrapped for your convienience + * + * @experimental + */ +export enum EventName { + Search = 0, + AppFetch = 1, + AppVerFetch = 12, + AppAssetFetch = 2, + + OnThemeUpdate = 3, + CommonStateUpdated = 4, + + RequestInitialization = 5, + RequestState = 6, + RequestInjectCSS = 7, + RequestThemeData = 8, + RequestRestart = 9, + RequestFetch = 10, + /** + * @requires v1 + */ + RequestUpdateState = 11 +} + +/** + * Determines the `EventType` received by the application + * + * These are also internally managed by our plugin + * @experimental + */ +export enum EventType { + Request = 0, + Event = 1, + Response = 2 +} + +/** + * Response status provided by the Server + * + * These are also internally managed + * + * @experimental + */ +export enum ResponseStatus { + Unauthorized = 0, + ServerError = 1, + /** + * Request to terminate the plugin + */ + Error_Terminate = 2, + Ok = 3 +} + +/** + * This whole interface is also internally managed by our plugin + * @experimental + */ +export type CommunicationInterface = + /** + * This is the communication interface provided + * if the event is a request + * + * This gives a refId to use to fulfil the request from the + * Plugin End. + */ + { + /** + * Event Name {@link EventName} + */ + event: EventName; + /** + * Event Type {@link EventType} + * + * Set to {@link EventType.Request} + */ + eventType: EventType.Request; + /** + * A reference id + */ + refId: number; + /** + * Data to be attested + */ + data: unknown; + } | + { + /** + * Event Name {@link EventName} + */ + event: EventName; + /** + * Event Type {@link EventType} + * + * Set to {@link EventType.Request} + */ + eventType: EventType.Event; + /** + * Data to be attested + */ + data: unknown; + } | + /** + * This is the communication interface provided + * if the event is a response + * + * This gives an eventType and finally response data + */ + { + /** + * Event Type {@link EventType} + * + * Set to {@link EventType.Response} + */ + eventType: EventType.Response; + status: ResponseStatus; + /** + * A reference id + */ + refId: number; + /** + * Data whose type is not yet known + */ + data: unknown + }; \ No newline at end of file diff --git a/pkg-ahqstore/src/index.ts b/pkg-ahqstore/src/index.ts new file mode 100644 index 0000000..7263a2d --- /dev/null +++ b/pkg-ahqstore/src/index.ts @@ -0,0 +1,783 @@ +import { EventType, ResponseStatus, EventName, type CommunicationInterface } from "./communication.js"; +import type { AHQStoreApplication, RefId } from "ahqstore-types"; + +/** + * This declares the maximum IPC version that this api is compatible with + * + * This means that all the functions upto this api version is implemented + */ +export const PLUGIN_IPC_INTERFACE_VERSION = 1 as const; + +/** + * An enum that defines capabilities that + * your plugin possesses + */ +export enum Capability { + /** + * This allows your app to get events related to + * lifecycle of your plugin. + * + * The events are :- + * - **CommonStateUpdated:** Emitted when the common state gets updated + * - **ThemeUpdate:** Emitted when the theme updates + */ + RequestsEvents = 0, + /** + * This defines that this plugin also acts as an external + * app installation source. + * + * You are requried to register `search` and `appGet` + * + * ### WARNING ⚠️ + * Please note that apps installed from external sources will never + * be updated by AHQ Store + */ + AppInstallationSource = 1, + /** + * This means that the application is allowed to use state data that + * is set by the `pluginUI.html` or `settings.html` + * + * Generally Worker Plugins aren't allowed to access this state. But this + * capability allows them to + */ + UsesState = 2, + /** + * This allows the app to inject custom css + * like theme updates + * + * This allows you to style the UI + * + * This also allows you to get the current **Theme** preference + * + * like, if its dark mode or light mode, if vibrant visuals (transparency) is enabled etc + */ + UsesTheming = 3, + /** + * This allows your application to request Client (i.e. Application) + * frontend restart. + * + * This is useful for cases like CSS Theming, or CSS Injection + * You can restart the client and then request `CSS Injection` + */ + RequestClientRestart = 4, + /** + * This gives access to the fetch api (no any other fancy api) + * + * You can `HTTP` fetch any url, provided its https:// + */ + HTTP = 5, + /** + * Allows HTTP Request to set timeouts longer than `10_000`ms + * + * @requires API v1 else its a NOOP + */ + InfiniteTimeout = 6, + /** + * Allows to update the Plugin State. + * + * @requires API v1 else its a NOOP + */ + UpdatesState = 7 +} + +/** + * Application ID + * + * In AHQ Store these are just `string`s + */ +export type AppId = string; + +/** + * Represents a version + * + * In AHQ Store these are just `string`s + */ +export type Version = string; + +/** + * Application Interface + * + * This is just a reexport from `ahqstore-types` + * + * Feel free to omit the `free` functions from here + */ +export type App = AHQStoreApplication; + +/** + * The function takes the user's query as string and returns a list of AppId + */ +export type SearchFn = (term: String) => Promise; + +/** + * The function takes an appId to return the versions that are available + */ +export type GetApplicationVersionsFn = (appId: AppId) => Promise; + +/** + * The function takes an appId to return the `Application` manifest that AHQ Store Uses + */ +export type GetApplicationFn = (appId: AppId, version: string) => Promise; + +/** + * The function takes the user's query as string and returns a list of AppId + * + * This should return an Uint8Array as directed in the function declaration + */ +export type GetApplicationAssetFn = (appId: AppId, assetId: string) => Promise; + +/** + * This is an internal function + */ +export type InternalCallback = (data: CommunicationInterface) => void; + +export type OnMessageCallback = ((data: MessageEvent) => void) + | ((data: MessageEvent) => Promise); + +export interface ThemeData { + dark: boolean; + vibrant: boolean; +} + +export interface FetchOptions { + url: string; + method: "GET" | "HEAD" | "OPTIONS" | "TRACE" | "PUT" | "DELETE" | "POST" | "PATCH" | "CONNECT"; + /** + * # WARNING 🚨 + * - We recommend a body smaller than `20MB` + * - Our wrapper will exclipitly deny a body longer than `50MB` + * + * Both of them are a recommendation can is not enforced from the ahq store side + * + * ## Why? + * The usecase of plugins should be thought of. They are to provide search and + * manifests. Which means from the request side you'll need to send minimal data. + * + * If the server sends too much data, we'll 100% get it back to you. + */ + body?: ArrayBuffer; + cache?: "default" | "no-store" | "reload" | "no-cache" | "force-cache"; + headers?: Record; + redirect?: "follow" | "error" | "manual"; + /** + * The time (in milliseconds) to wait before timing out the whole request + * + * If omitted, defaults to `5000`ms + * If set to `Infinity`, waits for the whole request to respond no matter how long it takes + * + * Must have `InfiniteTimeout` capability to set this to a number greater than `10_000`ms + * + * @requires API v1 or else its NOOP and ignored + */ + timeout?: number; +} + +export interface HTTPOutputData { + ok: boolean; + status: number; + statusText: string; + headers: Record; + body: ArrayBuffer; +} + +export class HTTPOutput implements HTTPOutputData { + ok: boolean; + status: number; + statusText: string; + headers: Record; + body: ArrayBuffer; + + constructor(data: HTTPOutputData) { + this.ok = data.ok; + this.status = data.status; + this.statusText = data.statusText; + this.headers = data.headers; + this.body = data.body; + } + + /** + * Converts the data into string + * @param encoding The encoding of the string, default `utf-8` + * @returns string output of the data + */ + text(encoding: string = "utf-8") { + const decoder = new TextDecoder(encoding); + + return decoder.decode(this.body) + } + + /** + * Converts the data into json + * @param encoding The encoding of the string, default `utf-8` + * @returns Type of data + */ + json(encoding: string = "utf-8"): T { + return JSON.parse(this.text(encoding)) + } + + /** + * Converts the data to object URL + * @returns Object URL of the data + */ + toObjectURL(): string { + return URL.createObjectURL( + new Blob([this.body]) + ); + } +} + +export interface Metadata { + capabilities: Set, + newSourceName?: string; +} + +/** + * This is the global instance of an `AHQStore` Plugin + * + * ```ts + * import { Plugin } from "@ahqstore/plugin-api" + * + * (async() => { + * const api = new Plugin( + * { + * capabilities: [] + * } + * ); + * + * // Must call after creation + * // AHQ Store has a timeout after which + * // it'll otherwise terminate your plugin + * await api.initialize(); + * })() + * ``` + */ +export class Plugin { + static #instance: Plugin; + static #constructed: boolean = false; + static #registered = false; + static #counter = 0; + + private emitters: { + [key: string]: ((data: any) => void)[] + } = {}; + private fetchSizeLimitInBytes = 50 * 1024 * 1024; + + private capabilities: Set = new Set(); + private newSourceName?: string; + private onMessage?: OnMessageCallback; + + private responseHandlingQueue: Map = new Map(); + + private search?: SearchFn; + private getAppVer?: GetApplicationVersionsFn; + private getApp?: GetApplicationFn; + private getAppAsset?: GetApplicationAssetFn; + private interfaceApi: number = -1; + + /** + * This abstracts away the complexities of the AHQStore Plugin api + * + * This constructor also handles the IPC communication and gives you a quick way to community + * via async wrappers + * + * Use {@link registerSearchFn}, {@link registerAppFetchFn}, {@link registerAppAssetFetchFn}, {@link registerAppVersionFetchFn} to register + * handlers for the capability + * + * ## You must call {@link initialize} afterwards + * + * @param meta Defines the metadata for your plugin + */ + constructor( + meta: Metadata + ) { + if (Plugin.#constructed) { + throw new Error("Cannot reconstruct the Plugin constructor multiple times."); + } + + meta.capabilities.forEach((cap) => + this.capabilities.add(cap) + ); + + meta.newSourceName && (this.newSourceName = meta.newSourceName); + + if (this.capabilities.has(Capability.AppInstallationSource) && !this.newSourceName) { + throw new Error("Please provide the `newSourceName` of your plugin or remove `Capability.AppInstallationSource`"); + } + + Plugin.#constructed = true; + + Plugin.#instance = this; + + // Take ownership of message channel + self.onmessage = (data: MessageEvent) => { + this.onMessage && this.onMessage(data); + + const payload = data.data; + + if (payload.eventType == EventType.Response) { + const ref = this.responseHandlingQueue.get(payload.refId); + + typeof (ref) == "function" && ( + ref(payload) + ) + + this.responseHandlingQueue.delete(payload.refId); + } else if (payload.eventType == EventType.Event) { + const ev: EmittedEvent | null = (() => { + switch (payload.event) { + case EventName.CommonStateUpdated: + return "commonStateUpdate"; + case EventName.OnThemeUpdate: + return "themeUpdate"; + default: + console.warn(`Unknown event with id \`${payload.event}\``); + return null; + } + })(); + + if (ev !== null) { + this.emit(ev, payload.data); + } + } else { + const promise = (() => { + switch (payload.event) { + case EventName.Search: + return this.nonNullPromise(this.search)(payload.data as string) + case EventName.AppVerFetch: + return this.nonNullPromise(this.getAppVer)(payload.data as string); + case EventName.AppFetch: + const dataf: [string, string] = payload.data as any; + + return this.nonNullPromise(this.getApp)(dataf[0] as string, dataf[1] as string); + case EventName.AppAssetFetch: + const data: [string, string] = payload.data as any; + + return this.nonNullPromise(this.getAppAsset)(data[0] as string, data[1] as string) + default: + break; + } + })(); + + + promise && promise.then((output) => { + this.sendResponse({ + data: output, + eventType: EventType.Response, + refId: payload.refId, + status: ResponseStatus.Ok + }); + }) + .catch((e) => { + console.error(e); + this.sendResponse({ + data: null, + eventType: EventType.Response, + refId: payload.refId, + status: ResponseStatus.Error_Terminate + }); + }); + } + } + } + + private sendRequest(data: CommunicationInterface, callback: InternalCallback, transfer: Transferable[] = []) { + Plugin.#counter += 1; + + const refId = Plugin.#counter; + + self.postMessage({ + ...data, + refId + } as CommunicationInterface, { + transfer + }); + + this.responseHandlingQueue.set(refId, callback); + } + + private sendAsyncRequest(data: CommunicationInterface, transfer: Transferable[] = []): Promise { + return new Promise((resolve, reject) => { + this.sendRequest(data, (response) => { + if (response.eventType == EventType.Response) { + if (response.status == ResponseStatus.Ok) { + resolve(response.data as unknown as T); + } else { + reject(`Error: ${response.status}. Outputs: ${response.data}`); + } + } else { + reject("Unknown response"); + } + }, transfer); + }); + } + + private sendResponse(data: CommunicationInterface) { + self.postMessage({ + ...data, + eventType: EventType.Response, + } as CommunicationInterface); + } + + /** + * Initializes the AHQ Store Plugin + * + * If you don't call it, the plugin manager will kill your process + * + * @throws If it failed to initialize + */ + async initialize() { + const apiVer = await this.sendAsyncRequest({ + eventType: EventType.Request, + event: EventName.RequestInitialization, + refId: 0, + data: { + capabilities: this.capabilities, + newSourceName: this.newSourceName + } + }); + + if (typeof (apiVer) != "number") { + throw new Error("Unknown api version returned"); + } + + this.interfaceApi = apiVer; + + Plugin.#registered = true; + } + + /** + * Gets the capabilities that your worker plugin is registered with + * + * This requires you to get the plugin initialized + * + * @returns A list of capabilities + */ + getCapabilities(): Set { + this.ensure([]); + + return this.capabilities; + } + + /** + * Gets the api version that AHQ Store Supports + * + * This requires you to get the plugin initialized + * + * @returns API Version as number + */ + getHostApi(): number { + this.ensure([]); + + return this.interfaceApi; + } + + /** + * Gets the target api that the plugin is **intended** to work with. + * @returns API Version as number + */ + getTargetApi(): number { + return PLUGIN_IPC_INTERFACE_VERSION; + } + + + /** + * Injects the provided css into the client gui application + * + * ## NOTE + * This modifies the already injected css to the new css data + * + * Please note the above + * + * @param css The css string to inject + */ + async injectCustomCss(css: string) { + this.needsApi(0); + this.ensure([Capability.UsesTheming]); + + await this.sendAsyncRequest({ + eventType: EventType.Request, + event: EventName.RequestInjectCSS, + data: css, + refId: 0 + }); + } + + /** + * Gets the state under the stateId specified + * @param stateId ID (file of the state) + * @returns The string data of the state + */ + async getState(stateId: string): Promise { + this.needsApi(0); + this.ensure([Capability.UsesState]); + + return await this.sendAsyncRequest({ + eventType: EventType.Request, + refId: 0, + event: EventName.RequestState, + data: stateId + }); + } + + /** + * Sets the state under the stateId specified + * @param stateId ID (file of the state) + * @param stateData Data of the state to update it with + * @returns The string data of the state + */ + async setState(stateId: string, stateData: string): Promise { + this.needsApi(1); + this.ensure([Capability.UpdatesState]); + + return await this.sendAsyncRequest({ + eventType: EventType.Request, + refId: 0, + event: EventName.RequestUpdateState, + data: { + stateId, + stateData + } + }); + } + + /** + * Gets the AHQ Store Theme Data + * + * ## NOTE + * The returned data does not automatically + * update with theme changes + * + * @returns The theme data {@link ThemeData} + */ + async getThemeData(): Promise { + this.needsApi(0); + + this.ensure([Capability.UsesTheming]); + + return await this.sendAsyncRequest({ + eventType: EventType.Request, + event: EventName.RequestThemeData, + data: null, + refId: 0 + }); + } + + /** + * Requests the user to restart + * + * ## NOTE + * This does not guarantee restart + * + * @param desc Explain why you would like to restart (optional, a template is already provided) + */ + async requestRestart(desc: string = "A restart is required to apply custom theme data. Are you ready?") { + this.needsApi(0); + + this.ensure([Capability.RequestClientRestart]); + + await this.sendAsyncRequest({ + eventType: EventType.Request, + event: EventName.RequestRestart, + data: desc, + refId: 0 + }); + } + + + /** + * Performs an HTTP request like the `fetch` api + * + * The maximum size of the body is 50MB + * + * ## Note + * - This function consumes the body and you don't get the array buffer back + * + * @param data Please read the information at {@link FetchOptions} + * @returns the {@link HTTPOutput} data type + */ + async fetch(data: FetchOptions) { + this.needsApi(0); + this.ensure([Capability.HTTP]); + + if (this.interfaceApi >= 1) { + if (!data.timeout) { + data.timeout = 5000; + } + + if (data.timeout > 10_000) { + this.ensure([Capability.InfiniteTimeout]); + } + } + + const tooBigErr = "The provided body is too big. The hard limit is 50MB"; + + if (data.body) { + const d = data.body; + + if (d instanceof ArrayBuffer) { + if (d.byteLength > this.fetchSizeLimitInBytes) { + throw new Error(tooBigErr); + } + } else { + throw new Error("Invalid data type provided. Expected ArrayBuffer"); + } + } + + return new HTTPOutput( + await this.sendAsyncRequest({ + eventType: EventType.Request, + event: EventName.RequestFetch, + data, + refId: 0 + }, data.body ? [data.body] : []) + ); + } + + /** + * + * Add your own custom handler to the OnMessage + * @deprecated This is unsafe and hence marked deprecated + * @experimental This is unsafe and hence marked so + */ + unsafeAddCustomOnMessage(fn: OnMessageCallback) { + this.onMessage = fn; + } + + private nonNullPromise(c?: T): T { + if (!c) { + return ((..._data: any[]) => { + return new Promise((_resolve, reject) => { + reject("Runtime Exiting... Null data encountered"); + }); + }) as unknown as T; + } + + return c!!; + } + + private needsApi(api: number) { + if (api > this.interfaceApi) { + throw new Error(`This function requires a newer version of AHQStoreJS. Current version is ${this.interfaceApi} and at least AHQStoreJS ${api} is required`); + } + } + + private ensure(c: Capability[]) { + if (!Plugin.#registered) { + throw new Error(`Plugin not registered. Did you forget to run \`await register()\`?`); + } + + const unsatisfied = c + .filter((cap) => !this.capabilities.has(cap)) + .map((cap) => Capability[cap]) + .filter((cap): cap is string => cap !== undefined); + + let errors: string[] = []; + + unsatisfied.forEach((cap) => { + errors.push(`\`${cap}\``) + }); + + const error = errors.join(", "); + + if (unsatisfied.length != 0) { + throw new Error(`${error} is not provided`) + } + } + + /** + * + * Returns the single instance of the Plugin. + * If the instance does not exist, it returns nothing. + * + * @returns The single Plugin instance. + */ + static getInstance(): Plugin | undefined { + if (Plugin.#instance) { + return Plugin.#instance; + } + } + + /** + * Register the search function and overrides the current search function if present + * + * You can only register it if you have {@link Capability.AppInstallationSource} + * @param fn The search fn itself + */ + registerSearchFn(fn: SearchFn) { + this.needsApi(0); + this.ensure([Capability.AppInstallationSource]); + + this.search = fn; + } + + /** + * Register a function and overrides the current function meant to provide application metadata + * @param fn The fn itself + */ + registerAppFetchFn(fn: GetApplicationFn) { + this.needsApi(0); + this.ensure([Capability.AppInstallationSource]); + + this.getApp = fn; + } + + /** + * Register a function and overrides the current function meant to provide application versions + * @param fn The fn itself + */ + registerAppVersionFetchFn(fn: GetApplicationVersionsFn) { + this.needsApi(0); + this.ensure([Capability.AppInstallationSource]); + + this.getAppVer = fn; + } + + /** + * Register a function and overrides the current function meant to provide application metadata + * @param fn The fn itself + */ + registerAppAssetFetchFn(fn: GetApplicationAssetFn) { + this.needsApi(0); + this.ensure([Capability.AppInstallationSource]); + + this.getAppAsset = fn; + } + + /** + * + * @param capability + * @returns True is the capability is present + */ + hasCapability(capability: Capability): boolean { + return this.capabilities.has(capability) + } + + on(event: "themeUpdate", handler: (data: ThemeData) => void): UnregisterFn; + on(event: "commonStateUpdate", handler: (data: undefined) => void): UnregisterFn; + + on(event: EmittedEvent, handler: (data: T) => void): UnregisterFn { + this.ensure([Capability.RequestsEvents]); + + if (!this.emitters[event]) { + this.emitters[event] = []; + } + + this.emitters[event].push(handler); + + return () => { + this.emitters[event] = this.emitters[event]!!.filter((d) => d != handler); + } + } + + private emit(event: EmittedEvent, data: T) { + if (!this.emitters[event]) { + this.emitters[event] = []; + } + + this.emitters[event].forEach((f) => f(data)); + } +} + +export type EmittedEvent = "themeUpdate" | "commonStateUpdate"; +export type UnregisterFn = () => void; + +export { EventType, ResponseStatus, type CommunicationInterface, EventName } \ No newline at end of file diff --git a/pkg-ahqstore/tsconfig.json b/pkg-ahqstore/tsconfig.json new file mode 100644 index 0000000..0eaef7f --- /dev/null +++ b/pkg-ahqstore/tsconfig.json @@ -0,0 +1,45 @@ +{ + // Visit https://aka.ms/tsconfig to read more about this file + "compilerOptions": { + // File Layout + "rootDir": "./src", + // "outDir": "./dist", + + // Environment Settings + // See also https://aka.ms/tsconfig/module + "module": "nodenext", + "target": "esnext", + "types": [], + // For nodejs: + // "lib": ["esnext"], + // "types": ["node"], + // and npm install -D @types/node + + // Other Outputs + "sourceMap": true, + "declaration": true, + "declarationMap": true, + + // Stricter Typechecking Options + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true, + + // Style Options + // "noImplicitReturns": true, + // "noImplicitOverride": true, + // "noUnusedLocals": true, + // "noUnusedParameters": true, + // "noFallthroughCasesInSwitch": true, + // "noPropertyAccessFromIndexSignature": true, + + // Recommended Options + "strict": true, + "jsx": "react-jsx", + "verbatimModuleSyntax": true, + "isolatedModules": true, + "noUncheckedSideEffectImports": true, + "moduleDetection": "force", + "skipLibCheck": true + }, + "exclude": ["tsdown.config.ts"] +} diff --git a/pkg-ahqstore/tsdown.config.ts b/pkg-ahqstore/tsdown.config.ts new file mode 100644 index 0000000..078ad4a --- /dev/null +++ b/pkg-ahqstore/tsdown.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'tsdown' + +export default defineConfig({ + entry: ['./src/**.ts'], + dts: true, + clean: true, + treeshake: false, + format: ["cjs", "esm"], + platform: "browser" +}) \ No newline at end of file diff --git a/pkg-ahqstore/typedoc-legacy.json b/pkg-ahqstore/typedoc-legacy.json new file mode 100644 index 0000000..d7542dd --- /dev/null +++ b/pkg-ahqstore/typedoc-legacy.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://typedoc.org/schema.json", + "lang": "en", + "entryPoints": ["./src/index.ts"], + "includeHierarchySummary": true, + "includeVersion": true, + "externalSymbolLinkMappings": { + "typescript": { + "fetch": "https://developer.mozilla.org/en-US/docs/Web/API/fetch" + } + }, + "searchInComments": true, + "githubPages": true, + "gitRemote": "origin", + "favicon": "./icon.png", + "navigationLinks": { + "GitHub": "https://github.com/ahqstore" + } +} diff --git a/pkg-ahqstore/typedoc.json b/pkg-ahqstore/typedoc.json new file mode 100644 index 0000000..02cda9b --- /dev/null +++ b/pkg-ahqstore/typedoc.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://typedoc.org/schema.json", + "lang": "en", + "entryPoints": ["./src/index.ts"], + "includeHierarchySummary": true, + "includeVersion": true, + "externalSymbolLinkMappings": { + "typescript": { + "fetch": "https://developer.mozilla.org/en-US/docs/Web/API/fetch" + } + }, + "plugin": ["typedoc-plugin-markdown", "typedoc-vitepress-theme"], + "out": "./docs/@ahqstore/plugin-api", + "docsRoot": "./docs", + "sidebar": { + "autoConfiguration": true, + "format": "vitepress", + "pretty": false, + "collapsed": true + }, + "searchInComments": true, + "githubPages": true, + "gitRemote": "origin", + "favicon": "./icon.png", + "navigationLinks": { + "GitHub": "https://github.com/ahqstore" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 98838a2..f835e9b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,30 +8,48 @@ importers: .: dependencies: + '@ahqstore/core-types': + specifier: link:src-ahqstore-types\types + version: link:src-ahqstore-types/types + '@ahqstore/plugin-api': + specifier: link:pkg-ahqstore + version: link:pkg-ahqstore + '@fluentui/react-icons': + specifier: ^2.0.316 + version: 2.0.316(react@19.2.3) + '@radix-ui/react-popover': + specifier: ^1.1.15 + version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-select': + specifier: ^2.2.6 + version: 2.2.6(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-separator': + specifier: ^1.1.8 + version: 1.1.8(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@radix-ui/react-slot': - specifier: ^1.1.2 - version: 1.1.2(@types/react@19.0.8)(react@19.0.0) + specifier: ^1.2.4 + version: 1.2.4(@types/react@19.2.8)(react@19.2.3) '@tailwindcss/postcss': - specifier: ^4.0.4 - version: 4.0.4 + specifier: ^4.1.18 + version: 4.1.18 '@tauri-apps/api': - specifier: ^2.2.0 - version: 2.2.0 + specifier: ^2.9.1 + version: 2.9.1 '@tauri-apps/plugin-autostart': - specifier: ~2.2.0 - version: 2.2.0 + specifier: ~2.5.1 + version: 2.5.1 '@tauri-apps/plugin-deep-link': - specifier: ~2.2.0 - version: 2.2.0 + specifier: ~2.4.6 + version: 2.4.6 + '@tauri-apps/plugin-http': + specifier: ~2.5.5 + version: 2.5.5 '@tauri-apps/plugin-os': - specifier: ~2.2.0 - version: 2.2.0 + specifier: ~2.3.2 + version: 2.3.2 '@tauri-apps/plugin-updater': - specifier: ~2.5.0 - version: 2.5.0 - ahqstore-types: - specifier: link:src-ahqstore-types\pkg - version: link:src-ahqstore-types/pkg + specifier: ~2.9.0 + version: 2.9.0 class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -39,63 +57,90 @@ importers: specifier: ^2.1.1 version: 2.1.1 lucide-react: - specifier: ^0.474.0 - version: 0.474.0(react@19.0.0) + specifier: ^0.562.0 + version: 0.562.0(react@19.2.3) next-themes: - specifier: ^0.4.4 - version: 0.4.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^0.4.6 + version: 0.4.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: - specifier: ^19.0.0 - version: 19.0.0 + specifier: ^19.2.3 + version: 19.2.3 react-dom: - specifier: ^19.0.0 - version: 19.0.0(react@19.0.0) + specifier: ^19.2.3 + version: 19.2.3(react@19.2.3) + react-intersection-observer: + specifier: ^10.0.0 + version: 10.0.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react-scan: + specifier: ^0.4.3 + version: 0.4.3(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + scheduler: + specifier: 0.27.0 + version: 0.27.0 + ses: + specifier: ^1.14.0 + version: 1.14.0 sonner: - specifier: ^1.7.4 - version: 1.7.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^2.0.7 + version: 2.0.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3) tailwind-merge: - specifier: ^3.0.1 - version: 3.0.1 + specifier: ^3.4.0 + version: 3.4.0 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@4.0.4) + version: 1.0.7(tailwindcss@4.1.18) tauri-plugin-ahqstore-api: specifier: link:src-plugin version: link:src-plugin devDependencies: '@fluentui/react-components': - specifier: ^9.58.3 - version: 9.58.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) + specifier: ^9.72.9 + version: 9.72.9(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@rsbuild/core': + specifier: ^1.7.2 + version: 1.7.2 + '@rsbuild/plugin-babel': + specifier: ^1.0.6 + version: 1.0.6(@rsbuild/core@1.7.2) + '@rsbuild/plugin-react': + specifier: ^1.4.2 + version: 1.4.2(@rsbuild/core@1.7.2) + '@rspack/core': + specifier: ^1.7.1 + version: 1.7.1(@swc/helpers@0.5.18) '@tauri-apps/cli': - specifier: ^2.2.7 - version: 2.2.7 + specifier: ^2.9.6 + version: 2.9.6 '@types/node': - specifier: ^22.13.1 - version: 22.13.1 + specifier: ^25.0.6 + version: 25.0.6 '@types/react': - specifier: ^19.0.8 - version: 19.0.8 + specifier: ^19.2.8 + version: 19.2.8 '@types/react-dom': - specifier: ^19.0.3 - version: 19.0.3(@types/react@19.0.8) - '@vitejs/plugin-react': - specifier: ^4.3.4 - version: 4.3.4(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)(yaml@2.7.0)) + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.8) + babel-plugin-react-compiler: + specifier: ^1.0.0 + version: 1.0.0 daisyui: - specifier: 5.0.0-beta.7 - version: 5.0.0-beta.7 + specifier: 5.5.14 + version: 5.5.14 postcss: - specifier: ^8.5.1 - version: 8.5.1 + specifier: ^8.5.6 + version: 8.5.6 + postcss-loader: + specifier: ^8.2.0 + version: 8.2.0(@rspack/core@1.7.1(@swc/helpers@0.5.18))(postcss@8.5.6)(typescript@5.9.3) + prettier: + specifier: ^3.7.4 + version: 3.7.4 tailwindcss: - specifier: ^4.0.4 - version: 4.0.4 + specifier: ^4.1.18 + version: 4.1.18 typescript: - specifier: ~5.7.3 - version: 5.7.3 - vite: - specifier: ^6.1.0 - version: 6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)(yaml@2.7.0) + specifier: ~5.9.3 + version: 5.9.3 packages: @@ -103,1100 +148,1765 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.5': + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.5': + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.28.5': + resolution: {integrity: sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.26.5': - resolution: {integrity: sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==} + '@babel/helper-member-expression-to-functions@7.28.5': + resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} engines: {node: '>=6.9.0'} - '@babel/core@7.26.7': - resolution: {integrity: sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==} + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/generator@7.26.5': - resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==} + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@babel/helper-compilation-targets@7.26.5': - resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.25.9': - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.26.0': - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-plugin-utils@7.26.5': - resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.25.9': - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.26.7': - resolution: {integrity: sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==} + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} - '@babel/parser@7.26.7': - resolution: {integrity: sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==} + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-transform-react-jsx-self@7.25.9': - resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + '@babel/plugin-proposal-decorators@7.28.0': + resolution: {integrity: sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-decorators@7.27.1': + resolution: {integrity: sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.27.1': + resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.27.1': + resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.28.5': + resolution: {integrity: sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.25.9': - resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + '@babel/preset-typescript@7.28.5': + resolution: {integrity: sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.26.7': - resolution: {integrity: sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==} + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} - '@babel/template@7.25.9': - resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.26.7': - resolution: {integrity: sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==} + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.26.7': - resolution: {integrity: sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==} + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} + '@clack/core@0.3.5': + resolution: {integrity: sha512-5cfhQNH+1VQ2xLQlmzXMqUoiaH0lRBq9/CLW9lTyMbuKLC3+xEK01tHVvyut++mLOn5urSHmkm6I0Lg9MaJSTQ==} + + '@clack/prompts@0.8.2': + resolution: {integrity: sha512-6b9Ab2UiZwJYA9iMyboYyW9yJvAO9V753ZhS+DHKEjZRKAxPPOb7MXXu84lsPFG+vZt6FRFniZ8rXi+zCIw4yQ==} + + '@ctrl/tinycolor@3.6.1': + resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} + engines: {node: '>=10'} + + '@emnapi/core@1.8.1': + resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} + + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + '@emotion/hash@0.9.2': resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} - '@esbuild/aix-ppc64@0.24.2': - resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + '@endo/cache-map@1.1.0': + resolution: {integrity: sha512-owFGshs/97PDw9oguZqU/px8Lv1d0KjAUtDUiPwKHNXRVUE/jyettEbRoTbNJR1OaI8biMn6bHr9kVJsOh6dXw==} + + '@endo/env-options@1.1.11': + resolution: {integrity: sha512-p9OnAPsdqoX4YJsE98e3NBVhIr2iW9gNZxHhAI2/Ul5TdRfoOViItzHzTqrgUVopw6XxA1u1uS6CykLMDUxarA==} + + '@endo/immutable-arraybuffer@1.1.2': + resolution: {integrity: sha512-u+NaYB2aqEugQ3u7w3c5QNkPogf8q/xGgsPaqdY6pUiGWtYiTiFspKFcha6+oeZhWXWQ23rf0KrUq0kfuzqYyQ==} + + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.27.2': + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.24.2': - resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.24.2': - resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + '@esbuild/android-arm64@0.27.2': + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.27.2': + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.24.2': - resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.24.2': - resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + '@esbuild/android-x64@0.27.2': + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.27.2': + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.24.2': - resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.24.2': - resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + '@esbuild/darwin-x64@0.27.2': + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.27.2': + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.24.2': - resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.24.2': - resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + '@esbuild/freebsd-x64@0.27.2': + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.27.2': + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.24.2': - resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.24.2': - resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + '@esbuild/linux-arm@0.27.2': + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.27.2': + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.24.2': - resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.24.2': - resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + '@esbuild/linux-loong64@0.27.2': + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.27.2': + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.24.2': - resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.24.2': - resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + '@esbuild/linux-ppc64@0.27.2': + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.2': + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.24.2': - resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.24.2': - resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + '@esbuild/linux-s390x@0.27.2': + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.27.2': + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.24.2': - resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.24.2': - resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + '@esbuild/netbsd-arm64@0.27.2': + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.2': + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.24.2': - resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.24.2': - resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + '@esbuild/openbsd-arm64@0.27.2': + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.2': + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.24.2': - resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/openharmony-arm64@0.27.2': + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.27.2': + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.24.2': - resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.27.2': + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.24.2': - resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.27.2': + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.24.2': - resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.27.2': + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@floating-ui/core@1.6.9': - resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + '@floating-ui/core@1.7.3': + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} - '@floating-ui/devtools@0.2.1': - resolution: {integrity: sha512-8PHJLbD6VhBh+LJ1uty/Bz30qs02NXCE5u8WpOhSewlYXUWl03GNXknr9AS2yaAWJEQaY27x7eByJs44gODBcw==} + '@floating-ui/devtools@0.2.3': + resolution: {integrity: sha512-ZTcxTvgo9CRlP7vJV62yCxdqmahHTGpSTi5QaTDgGoyQq0OyjaVZhUhXv/qdkQFOI3Sxlfmz0XGG4HaZMsDf8Q==} peerDependencies: - '@floating-ui/dom': '>=1.5.4' + '@floating-ui/dom': ^1.0.0 - '@floating-ui/dom@1.6.13': - resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + '@floating-ui/dom@1.7.4': + resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} + + '@floating-ui/react-dom@2.1.6': + resolution: {integrity: sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' - '@floating-ui/utils@0.2.9': - resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} '@fluentui/keyboard-keys@9.0.8': resolution: {integrity: sha512-iUSJUUHAyTosnXK8O2Ilbfxma+ZyZPMua5vB028Ys96z80v+LFwntoehlFsdH3rMuPsA8GaC1RE7LMezwPBPdw==} - '@fluentui/priority-overflow@9.1.14': - resolution: {integrity: sha512-tIH8EhvjZF4MhxSjqrWOyodrQQW+RlVZqxuNFQF5OWRdSqcIK8g+Z+UbC5fYHQooCgVsthk2mFurfGMKFtf9ug==} + '@fluentui/priority-overflow@9.2.1': + resolution: {integrity: sha512-WH5dv54aEqWo/kKQuADAwjv66W6OUMFllQMjpdkrktQp7pu4JXtmF60iYcp9+iuIX9iCeW01j8gNTU08MQlfIQ==} - '@fluentui/react-accordion@9.5.14': - resolution: {integrity: sha512-mS9NHxeZn3WwRR0T/D7JKfLY2QEksCewrZIcSvYdgyPmlJCyd71YlkICn3PIvZIpySpoSEA/dqwWTYcC8cU8Zg==} + '@fluentui/react-accordion@9.8.15': + resolution: {integrity: sha512-/KMZKD97C6hvRUF4S/GiMaguFh2VWHAm0z58y++Si9drmgTvpAUHxXKHELxnZFYKLS76Gc0gMXnKrPMlp0wDkw==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-alert@9.0.0-beta.124': - resolution: {integrity: sha512-yFBo3B5H9hnoaXxlkuz8wRz04DEyQ+ElYA/p5p+Vojf19Zuta8DmFZZ6JtWdtxcdnnQ4LvAfC5OYYlzdReozPA==} + '@fluentui/react-alert@9.0.0-beta.131': + resolution: {integrity: sha512-mpt5uMuAjUG/J6T0yq/r54pwhVl/D/lk/OLF3ovhYzWuiNhEOinwx2b81fK02Rm/K3i4sl25QX4h19Aie5NLKg==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-aria@9.13.14': - resolution: {integrity: sha512-+RbBh5sTJ9CguPfj9Bw6AUgTC05ts2XqBepNFZ3H51rZMF3PB/YCPftebmySIW6jp1ZbJ10EtQZ/EqJqgJH7YQ==} + '@fluentui/react-aria@9.17.7': + resolution: {integrity: sha512-OsPKp6BmE+W73UNMM7JX6WNQa5H4/oFKgt/BAQxp9mhM6lYw4Skmf9ZLn0vBccFuc0wh2hYDuMgKQ2/2uTUfow==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-avatar@9.6.50': - resolution: {integrity: sha512-xhgOIm9l/yPsSbMvwWOk1LbylcoYGsWotghgX8Nurgek4wST+xzegIogKr7PHIEid1InMgzHJmwqZxPtYvpFtw==} + '@fluentui/react-avatar@9.9.13': + resolution: {integrity: sha512-a8eVQ2WYiGQvV7BVzcMXGkpZHfNzduC8S74ux5cMbeDuFG8JH8XKBIgOErAxQwFt0wATqyISelo5vn176sQwmw==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-badge@9.2.50': - resolution: {integrity: sha512-rMptIUeUWwbTvzSo917GOVDY5nKeNbcSfvtvop54zrFNrcMicAZIfrJK8fB1hFggT2cuaiI9qWdWuSTd+q1LZw==} + '@fluentui/react-badge@9.4.12': + resolution: {integrity: sha512-N7B3l3PGH1HKzjvXBmnElyTpd7JIIimuxEWSu6v+4Jas3UCbbEjv6DfhmEOLeBFle09q3ILTJ/Hf7t9jhEAyyg==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-breadcrumb@9.0.52': - resolution: {integrity: sha512-hjXAD3kIoLuOdF46luqGGPA7FaZkdGbW2VoYKHGhCP09AQWWwXaX3Ou+u8F9ch03rzxYPmiD70ECrDxRmCIl7A==} + '@fluentui/react-breadcrumb@9.3.14': + resolution: {integrity: sha512-KfMXejIEWA5VWPkp0lJIN18qqlf/3TpwnkBafRCxeeVx5dVuT6z2PW5bxJiDQ1jRSpmYiGzs3MkJOnlWuMdLhw==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-button@9.3.102': - resolution: {integrity: sha512-m5yhRTfpC47wy9712bVVaJDSFE7VMWo07MvX3GDKyXF20T3+tKWiHT4LIqLTIv7d/229kl4mvrJOgRCUs6tA/A==} + '@fluentui/react-button@9.7.1': + resolution: {integrity: sha512-nPrsnORTrf4Hy4uZTxULgUmqd1hQK3ZorDfIYhzcbnBnn78+9zl9NyKQI0SqKxM8jG16FuK8jgrpHLiYq/8PSA==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-card@9.0.104': - resolution: {integrity: sha512-Tb8qyquac3moWqUBH9TH8MznzPSig1Qeu7Q22BmTEN87ENYYsWqtQBqEea95ImzpvNADS/A44hVHuJHsf1aBVg==} + '@fluentui/react-card@9.5.8': + resolution: {integrity: sha512-nS/q3Vw2AqAOhKTOxgwU0xgE4neFB9OT+9fK/OuwmvgFLvkV5in/oszod+QlqJzarn3hTp1avWlSOItswPoyOw==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-carousel@9.4.7': - resolution: {integrity: sha512-J9lpqMZLYnEP7U3nqKrPJ44QxhjbjBpk0RqhrQtBPvyrtXwNIBR8qbwDs+KAw66px8dY4RRjJivTFbIkC8r/PQ==} + '@fluentui/react-carousel@9.9.0': + resolution: {integrity: sha512-EaiEe1oT9lFrIZfBfgF046h+2qcwKQZUJcc0Rv7yFDyWkNXrdM1YKG+q89V+D7P3z8tJYXKsNy4+tpFc/xgrKg==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-checkbox@9.2.47': - resolution: {integrity: sha512-3XETLtPUpRpztQphWZ4Md/pqkDDcE2CqH0gVAEUb7rnLHfimrRvDC+tlccKmqvlK3QoPfX2oDy3nvz/YwxWoTg==} + '@fluentui/react-checkbox@9.5.12': + resolution: {integrity: sha512-km1itgOZJ/Io1/F9wLMp9yHgfgyM1HnYBKJjUD4+H+wkdVoF7ZsjWls2s8tB2EMvsbWRBqgPH80yCMNsGyipjw==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-combobox@9.13.18': - resolution: {integrity: sha512-t1sF+TpC0BGwSxY0FSM4GUUyo+ToLgWNyt80usoOe6j4vIP1N6O2JSaWg5/+24mn+whnsheyDTby5kpmyI1rwg==} + '@fluentui/react-color-picker@9.2.12': + resolution: {integrity: sha512-fToyincQFiuYxzfIMii9M4A55taEFtQ0DzDZPlyIi45j/39eSmlwGzBDfFq7KKvVqGHvZKCKcSymUlxA+PPEcQ==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-components@9.58.3': - resolution: {integrity: sha512-Inz+mx70f3wzQwe2Ogr3w2hAUYkJF+6vvg8NlykICfWPeqKadEQengD0Mjaog38+E/GSCI7PQiWVAaq3VevCrA==} + '@fluentui/react-combobox@9.16.13': + resolution: {integrity: sha512-FavYGlTKOBED44h6d587Ic1AVi9/eqEh+B2Xph7EujCvq9ZFtjYPtZVDcgEuAZd/C6QY5vrFoZ5+abjLqal1bg==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-context-selector@9.1.72': - resolution: {integrity: sha512-n9M7o81fuIzKuvrzdOK9Rcc+SyYg9hkr0bXhdclTHWKBYw2RgIEzXuld1qL3+gOFcSYS6AoNKpqrd9mithWYpw==} + '@fluentui/react-components@9.72.9': + resolution: {integrity: sha512-yiNzCjPixUhYokf8kgl0ItXQ/smPceFvz9XP73z0Tp0dRNzRQG20dK0Oz3w+7vnOt9VmnAH9KGNRXqNAY+CPdg==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - scheduler: '>=0.19.0 <=0.23.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-dialog@9.11.31': - resolution: {integrity: sha512-RoRPxJm9URck3kgZ6nFu7uNbJvOoCi9zY2OBvPsReCoTnya0Md8vk4OV6O+09a+anTRgVjw3+ETY+bWJ7Me5XQ==} + '@fluentui/react-context-selector@9.2.13': + resolution: {integrity: sha512-Jzo4aDzGHh131wub7XqDaaZB2V+kd90HgpvFHdtBenL8LjDVxuSYpuHlqVF+Lu1mQBDu4V8JQS6KiYLv9xFp8g==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' + scheduler: '>=0.19.0' + + '@fluentui/react-dialog@9.16.5': + resolution: {integrity: sha512-5MogBImDZ/qXY2ShXAJBbC9XFRwgxDU7lbe31DcD1RLJYV+zXbXIXbMNvTCtSFc3qKRORZgWiYJidR9zb4MiwA==} + peerDependencies: + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' + + '@fluentui/react-divider@9.5.1': + resolution: {integrity: sha512-bWc1gbHYqT3werzx+Suw0rBJfn6+bMtmZ8PDy4UIg/Fn06oPum4IqgHn3r9HpQtmphhspBGrI/q2BD/YWEHAyg==} + peerDependencies: + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-divider@9.2.82': - resolution: {integrity: sha512-U3krzGswRxpFgMkXafkl12+R7R1SeX+JdTZpw8SMnvQsBroEWgy6hq8bWhh8AFUcqCoHIbieBOrRFV68pvIvGg==} + '@fluentui/react-drawer@9.11.1': + resolution: {integrity: sha512-xGbiGCc0j7smvet+ZbGCl9yrnk9WDVxD1RN7egO6CXZ6qRurE76AX/9dtnw22/Md+HPkzOmNAw95A0LOYUg04g==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-drawer@9.6.11': - resolution: {integrity: sha512-b0uE3hRDDSS1uGeVwoNqWu8G9M2mHbQYELShyvj0cO0PlIprkQDXfhcqlaGzHUVdUqeuFXb5zYcJbigTDfjiyw==} + '@fluentui/react-field@9.4.12': + resolution: {integrity: sha512-GJq/SbXXAduKUJK8XpIphfGLNgBZm2fizxZt0pKttE4HkBjFbHaBbEkjlNZc8S+2d8ec0adkqx9hwC9OnqZMUw==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-field@9.1.86': - resolution: {integrity: sha512-InM4y61PzKp2Y17VdkXYTHKLJhEZLYW0roeBDxMwUbnII059RtC/O30zBIS6n4Cn1+/y1tMZK6NEjTcI1HIVmQ==} + '@fluentui/react-icons@2.0.316': + resolution: {integrity: sha512-tZPOtsUmoOrgLeM/rLjkzLlWOEmIghXNh/DYQzm5RD/Q4epklOzjnsFvc/Mn2tuXiVxi+vvXxsQp21E1aLpmWg==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + react: '>=16.8.0 <20.0.0' - '@fluentui/react-icons@2.0.274': - resolution: {integrity: sha512-URmKlK8yS8f+RNsqi1pHBiL91V8RFBJlIBrPnsm8GcZsZv3vhA8k9jUinGyiMKgcsgcUulGPT/T7JUOLGEE+oQ==} + '@fluentui/react-image@9.3.12': + resolution: {integrity: sha512-S02tX0s5UrWY0MyVfkq8P/3vyyAZ6LPdFAwjy2dWIWoEpYA2XH+fCDDsnPSThSZs6IUKUqgN/BpXW0/lsPcCuA==} peerDependencies: - react: '>=16.8.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-image@9.1.80': - resolution: {integrity: sha512-Vw6cPJaGSGy9usjXxaK0If9Ow3wo0e2yUIsKRWpWtiX7CTwENGP7N6WYbJFw26gY4AVer/S9bfGlen/gqq3cHg==} + '@fluentui/react-infobutton@9.0.0-beta.108': + resolution: {integrity: sha512-mXwi5LuVNJK66HxOid4mzZaV571E3ZmyKDK8BG0Bd+nErTixc0H6D3kPIxgBbN4RaZjurPkovg5vluAYAzMgxg==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-infobutton@9.0.0-beta.102': - resolution: {integrity: sha512-3kA4F0Vga8Ds6JGlBajLCCDOo/LmPuS786Wg7ui4ZTDYVIMzy1yp2XuVcZniifBFvEp0HQCUoDPWUV0VI3FfzQ==} + '@fluentui/react-infolabel@9.4.13': + resolution: {integrity: sha512-szas/IPeg3XETtxily/9muYM9/czky+CVuntdbhHaCGyg1YZ1xMbRhXgaGUpJtBnOuCaLQV4wcX+r6bCYkN95A==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.8.0 <20.0.0' + '@types/react-dom': '>=16.8.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.8.0 <20.0.0' - '@fluentui/react-infolabel@9.0.57': - resolution: {integrity: sha512-jIDJvV1Zzqc6gbD+JWGx2xMmoS9dO0pjMC17tlx1oNpmYe0rBdzu7BJqZrEt+uVt/wFUh39YinrPdhtQdQaXIg==} + '@fluentui/react-input@9.7.12': + resolution: {integrity: sha512-91h/J6xsH4hRrtclPL0sEU2zdAfs2t2IpDz+AWwJ7LTWn+DfxNjr4ItncbBC8DCB69IoKOmNma/Hup/4LaCsMA==} peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-input@9.4.99': - resolution: {integrity: sha512-6TEjYtw+PSgkbudNjmAlGgxO5ZQUqrYk0AVlulB202MwKflJ+2A8XcHC5aMuLUI4xRrLWRoYwZTzgxiXa2obsQ==} + '@fluentui/react-jsx-runtime@9.3.4': + resolution: {integrity: sha512-socz8H63f7CBYECzBkeeZGUAGgPDvsr4kZRHQoQw5eXBKlSb+08p7F7Zdq0hYAPQhTgXoxH1DZ4JlXzCCmweVg==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + react: '>=16.14.0 <20.0.0' - '@fluentui/react-jsx-runtime@9.0.50': - resolution: {integrity: sha512-dnelPmz0x591tr58B/jbIHVzgjWskMkBmWEvZJc2rlbGH1oZl+MPJqvVdOAMvLTKJzqVmNkeSDtQmkjzjccogA==} + '@fluentui/react-label@9.3.12': + resolution: {integrity: sha512-drVHXtiK/uhWF83lbeGm+z4r2IBVA8Zp6+VXD5lsR0nJ6o9v2TubJDTgOpgpWMaFDPDSHUO7jCAqwNdzQ3lpsw==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - react: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-label@9.1.83': - resolution: {integrity: sha512-XJF78Vwn4sSRJUyWcTj/F6hJVcHlPozDBcGWipMpnFgKBljuVmE2sg581CUGKn4AOTa9/blc81DLv0AE3itNtQ==} + '@fluentui/react-link@9.7.1': + resolution: {integrity: sha512-OkFR95N8D1KQPmz4eZPu+mei79JNYjURLythuNfgvLG3SgNpOKfT7b5hzhUCafzEB1e6Oviw/nGF99t65pfdMA==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-link@9.3.7': - resolution: {integrity: sha512-kjl/TjFO66ROFFXL9FExmoTYWgIb/p6pKqXA+eGTaQZ+7S1qTAKma0cTQtjnqAfj7UcimnWLLmXnlWaXx4FixA==} + '@fluentui/react-list@9.6.7': + resolution: {integrity: sha512-/vUcP6QeUrVuVVZGab+W/a66O/7RxbqErt9S3teC90X8e5Bq0Nb7Q1aeiC4gyQr1XvwzKGKhqe/3srU8X+54Qw==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.8.0 <20.0.0' + '@types/react-dom': '>=16.8.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.8.0 <20.0.0' - '@fluentui/react-list@9.0.2': - resolution: {integrity: sha512-bXwwkzayFMwXPldwZSAQWkhQIUJyPoBYKUpDU+e1Z4wHod8mkTspWqoUTZHkL+t2zLMGR7v9c5PqyjSeYVhXYw==} + '@fluentui/react-menu@9.20.6': + resolution: {integrity: sha512-AsbtrJigDeMlVJbIZMHDjNrW2DFe0hzgEN4/Dc/fYaHqOFIe1OazNAWZl4dsXyEHZxkCo791X5jhR12gvBDbcA==} peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-menu@9.15.0': - resolution: {integrity: sha512-G/WhGTrhQpoa0nbzEEQB8aK4pvtYym2m/sMeN9+fLFVZzAv9hyigzTwaSouQUoMfvIj2bmw5lcfXBKgJ4Rzreg==} + '@fluentui/react-message-bar@9.6.16': + resolution: {integrity: sha512-yg1vSYLDaTKwDeia2t1ivngBy7sinx4McBjyX8l8pUaAdrT+OqDcDeevXpFNZ0/0eA2a3BVJ6qbu4iab1d9FPQ==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.8.0 <20.0.0' + '@types/react-dom': '>=16.8.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.8.0 <20.0.0' - '@fluentui/react-message-bar@9.3.3': - resolution: {integrity: sha512-uAx0BD/+Tyuaau8V06Mmwx70BaYOhWrOwdr+okG4CCNTL49MP1Ol/nljHyjYEe/UkhiqQR3f3TwEkuZe/Jm4ug==} + '@fluentui/react-motion-components-preview@0.14.2': + resolution: {integrity: sha512-QbdbgzcM02AvYCN4PbBMZCw10vMh9AvPK8kK2kbMdNWXolbRau2ndNVfXpXvZxY9KZFc2lJlYUBLWJTLDINQXA==} peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-motion-components-preview@0.4.3': - resolution: {integrity: sha512-g6ACukFXcZ8TFYP30WnVjkvRuQkkx2Q48jI7TowTsJBQg01FFT4w22ii5s2ABuO6L1TR02kAL3wvvo5O2KP5Ew==} + '@fluentui/react-motion@9.11.5': + resolution: {integrity: sha512-o4rTgeQbxER4tZ47eZ+ej/uy9iUNvQtB5fF55+8G00beBSX2acwmslb/GJOOw/mnkcB14Hoa6f8LU2JabYNXSw==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.8.0 <20.0.0' + '@types/react-dom': '>=16.8.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.8.0 <20.0.0' - '@fluentui/react-motion@9.6.7': - resolution: {integrity: sha512-xvNsN8n7e7OOMnNK1ynIZcREpoYY+97WuI+qnEiqkwJWKA+WzWYN+ydvH7IFI1PV7wz7qhyXUga5L10CjFeCAA==} + '@fluentui/react-nav@9.3.16': + resolution: {integrity: sha512-qoPfC/pAYDZQxAhfFhzP6a5QH/1lafmOWNXLrZxX5DadGl9mg9Tr6/t6rcP/ZuJSTHGzVX1IUmxboc+z62gcww==} peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-overflow@9.2.8': - resolution: {integrity: sha512-x9RsbQWFv8cgJ8scU6G61IVltliiY/07TT3t1nNtHBJP3tECttphn6EmJHIaKwmCpNzLq8pCYobj8/GxGZ0Kkw==} + '@fluentui/react-overflow@9.6.6': + resolution: {integrity: sha512-iXXEQCSNn6xfzzUrEURplq7uc+OrxTvU6EbWVeFxCQnwmbnEJlmxtFzWTS4XHR1Z00Z+lZ4pCUxD1q7DH9926Q==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-persona@9.2.109': - resolution: {integrity: sha512-APEuGmInsWTojToruDJ41cjx0qTvOFAozPe1NC3itS3QIBeaz1YHkj/72QKCfSQHpqa2b5bjK6WN9/bBjIAOjA==} + '@fluentui/react-persona@9.5.13': + resolution: {integrity: sha512-H2gUXRp3U28szgjMskKRM0OI1TvEaZ9LJwvCo2aEf03ijvWVeJYSg8Q3XLmglrAbjENRWIR7/kZg2r8Hd0vlvw==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-popover@9.9.32': - resolution: {integrity: sha512-8bEjFqWokvk8oB408ZRerGx/+1r+rHB/+KBodBVt8BBlv20Zb4WZbPTN7zt4N1rlkIyFbf4v5otGJCO36PTOGw==} + '@fluentui/react-popover@9.12.13': + resolution: {integrity: sha512-hb1G/zLCfoD4fUHwPLZ7Qqwaoqm5nk8dyV8s491J3tpKhifce+cVgqA2/5MYMcZeo07QRIzn5oZ10t7QZCBOKw==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-portal@9.4.42': - resolution: {integrity: sha512-x7mH9Y4/ziHKGAL+NnJGJdlH/eqBGpqNRbFLCyAithcpS1TCCROzyTzSxli0f8BcZGy9GMDoxIN9wiHP4wZf/A==} + '@fluentui/react-portal@9.8.9': + resolution: {integrity: sha512-zmaEPXwSLMmCzRlKQUZ+ZZqNjGe+h6K+Gz4NIFuz+jVbCRpOPEfumaoE6oy9wRITQFHq3DQrkPSRQxrZ7oUHRQ==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-positioning@9.16.3': - resolution: {integrity: sha512-z8phNPD0BhREOPsqt4iMsIvzzkBbfuA3TaXwQeLhM0imISWBnctTAaLjDZDQno/Bt/pbEd+qulPV7fagL20tWQ==} + '@fluentui/react-positioning@9.20.11': + resolution: {integrity: sha512-LjLQiIZw9wM7OSSi1CesrV6yvmJTsLFOMA8jypglm4GoPCXf4BzD7bEk55fgJYBGfa1YQNGMbv2LlFqmNOGrQQ==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-progress@9.1.97': - resolution: {integrity: sha512-tVqm64vnFNJJygLHPo+ul3CR2fWo0/mwGdUVkvzyQKi6PMNuSHzRAQjrj09c0S12+vbOxuxgpICBQNYw8xzXUw==} + '@fluentui/react-progress@9.4.12': + resolution: {integrity: sha512-CGlk1yXhT6hBDbjgYyk+qgKbuU089iwYeueiYit5TLFb0LUUjfWjdcex7s73Qa+Obyss5MeHun8DQwX9Ve/FoQ==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-provider@9.19.0': - resolution: {integrity: sha512-fha+QqD7JW3eo+rLOYvfROOkiSLotH7NnpfJ67EBHIh5JGAn3KyiSJj42RvFTo05LyQGYXME6oQ5yitbDT5YIg==} + '@fluentui/react-provider@9.22.12': + resolution: {integrity: sha512-GhNd18zORZ/7m37TjF3UTKAJCfRgCXZi3PcdoI5SvseR3SPWl93R8mYi0SDCe6tIw7TNgzCn6fS7X6O+hAV+rA==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-radio@9.2.42': - resolution: {integrity: sha512-Tk84/6THneFTInCoXxLuCR/wGogPX40eScoKzrqD82oTlDmLfgaiWM6hh5VsLSLyhnarINVjkaP6ZFqD8lRfZA==} + '@fluentui/react-radio@9.5.12': + resolution: {integrity: sha512-T0UdYn8comjc05SyZc37Cx8QT6ZhdGr/0az+ygK15uutRrj6ZQJV+xYAOo8rEwu5P51tD077nV8A9k1asf0TAQ==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-rating@9.0.28': - resolution: {integrity: sha512-eEU9NeYDg6qTw/6kev8uvfOs0wG3obwFQ14Aix64dZngaG+t00VuCiCSvAs7GpR6ofRwQljqTzWyylmD8Q4m3w==} + '@fluentui/react-rating@9.3.12': + resolution: {integrity: sha512-q8P0sQ5b5EPNLJZH6jN37avhZkm5aHPmaE4btOHMsAYivh5CMtQfgsBZ5vO/z6acXTdWV+r5DoF1gKIMdwEtrA==} peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' + '@types/react': '>=16.8.0 <20.0.0' + '@types/react-dom': '>=16.8.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.8.0 <20.0.0' - '@fluentui/react-search@9.0.29': - resolution: {integrity: sha512-RJKwdomLYpgj11tyS8aqtb1wfuOesl3ZA/E3q/Uj3eNNu6hqT676cxrOwlWSBUYNCYbZbKhFQcoKXQGqB+FBHg==} + '@fluentui/react-search@9.3.12': + resolution: {integrity: sha512-F1qvEaoeLh4aYTbRXI5gOb63EFjBTVBeb084RKAYAzFBaiv7w4nUdPAuyK6+mevtO+wSdUHvb9HFwrxkLpY05w==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-select@9.1.97': - resolution: {integrity: sha512-tdhakc4UC+jtWHw7/wuYo71zzszukSGdpjl6AYUs0Edxm9LZzJ/zLWEr1y1/OpDZiXnjOcTABzfBc2simRN9VQ==} + '@fluentui/react-select@9.4.12': + resolution: {integrity: sha512-IwIc9qGNTmgMC/zP05mempBSaZWoSG3JknOoQjoFVpi6sOL4pw/1L2f2fH7DvnNQtWymFuXt9jEpJdI2xKPVTA==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-shared-contexts@9.21.2': - resolution: {integrity: sha512-5hw9CfCmKaEbxmFi+ZF4EZzYWFKrfRLq9pXFIoJWprP1D3ZAds/ymtIOG/CsJzig8zQ1LQ3cNSUzNB75XWg6IQ==} + '@fluentui/react-shared-contexts@9.26.0': + resolution: {integrity: sha512-r52B+LUevs930pe45pFsppM9XNvY+ojgRgnDE+T/6aiwR/Mo4YoGrtjhLEzlQBeTGuySICTeaAiXfuH6Keo5Dg==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - react: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + react: '>=16.14.0 <20.0.0' - '@fluentui/react-skeleton@9.1.26': - resolution: {integrity: sha512-vrFaHRF4DuJneAjRSklb27qICVY3yGETQNv0AFS3IRjb8iwS7gWg5aI9Viy9Su7Zg9lIKes4teAafdkjvLUoyg==} + '@fluentui/react-skeleton@9.4.12': + resolution: {integrity: sha512-aOaoOn4L3SMqGW83GmvGrRrv6TnT0uuxsDk6/mSfPW7P9QwhaZZQRiBiymH01RYSMBF9J3DFgZzKsKqVihts0w==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-slider@9.2.7': - resolution: {integrity: sha512-K3oZTYXkkqyxT1MahFyk2kpX3WMfuVbiJUqXTZcvd7U79bFeSeHA67r/yj42ngzSQztfaqlYZCnU6+T191zOpw==} + '@fluentui/react-slider@9.5.12': + resolution: {integrity: sha512-zfMyC0+ytNMtZEtqVXg+8l8dRrXAfRccPxofngZzHiVgLknMlc7L9jjWBYOGiB4VbO1XR/+D7/KrsjBf0xvXyA==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-spinbutton@9.2.98': - resolution: {integrity: sha512-fJx+a45jTLJs/O5CVum950c8qRLRDirXi+myJHlVF9CyyjXABmosd43WUxa/zQ8H4spSWxKOo4pgUBwST2hYbA==} + '@fluentui/react-spinbutton@9.5.12': + resolution: {integrity: sha512-+t7GOyJkaevduT6CYEX9PLlsdPnJKWeXP6Va1Ml2wFnDz8RtJTTqzbedSqmk8CLpwbZ8+/Ix40pIbp+9Q5v2Ow==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-spinner@9.5.7': - resolution: {integrity: sha512-DdfQAbdiz50V2DqRSX1MfN6ehw+9etcLysueSeH2n1PnpZ8TVEZYrJzBW608S/bCWrR8OAEVoY/3W/nDjwf8qw==} + '@fluentui/react-spinner@9.7.12': + resolution: {integrity: sha512-8jTG1DTKipkpkaNwl9uxDs8yMKMK8ogzYrMMbNR1pfYVtpiDSfwxwZIXTqh9r1vS4SU3WnFQ0irRu1tIIumAnQ==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-swatch-picker@9.1.20': - resolution: {integrity: sha512-XJ5OKBSjQyXxTJjkNm9Orfc3ypDUn56Ylbmx2njOa8xxy4TBov/B0x5/mk++qCgYVgh0MUdf8ugpeYuXPabjRA==} + '@fluentui/react-swatch-picker@9.4.12': + resolution: {integrity: sha512-c3OHBbPNneQLm+A9rzVaU757FPTBog+tYQU7nnmHlM0LZSTIhJf1XRBsLGNSnqmlAzLc94PjW/867SstQ+vuaQ==} peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' + '@types/react': '>=16.8.0 <20.0.0' + '@types/react-dom': '>=16.8.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.8.0 <20.0.0' - '@fluentui/react-switch@9.1.104': - resolution: {integrity: sha512-MKw9hUPLNVSOkQlYr4QHTymU2R7MVwaAFDFRhT6q45POL/YbbJnSBJCtkkPuc5qMQN62RkarMkOTdLhzxJPe6Q==} + '@fluentui/react-switch@9.5.1': + resolution: {integrity: sha512-fa9EKNyssYwrkbWQn3CQ4IfnsVy+ttiRWom+s9eJDtM9NTtLZMJpei0Ve6vCD27SIbwBJhngWLe7j5/HeAg0uQ==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-table@9.15.29': - resolution: {integrity: sha512-z38vjSJGKqRCCtI9oAzyIO2A15Kre5JAlLr73vE+v4n0bbrIvtpfBi5eQ2CbpyCIWBPO5LKTTNupd267rcu4yg==} + '@fluentui/react-table@9.19.6': + resolution: {integrity: sha512-LKGuFnYfknmaFCH35T0VjgbeaQIfg5SCVPgnNGKHDmNd85QvOR5AG7CMBm0LSltjZW6NFHblkRmnOkF2AkPucQ==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-tabs@9.6.7': - resolution: {integrity: sha512-7EFDetqfGBb8X0aVBSIB6Ab9V9NiBhju3NqlW9zN8nvXovzkhjTtSY6LOxEdWHEl8NFTW8jQsBpiJTcM+oe8zw==} + '@fluentui/react-tabs@9.10.8': + resolution: {integrity: sha512-Msxd4Ajhu+YZW7Iv5WQZBr2yynsOkwQjXkSH28ObjAZ/rFkb2Iq9uXvSAFJHba++Ecz1i2tchAsELWqT9oyLxA==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-tabster@9.23.3': - resolution: {integrity: sha512-sGLePr6QmUbYq/rGkaE6MUTRCFucY5HphKEvWoB8ec32btQmAsMlv9YT5BzJ+YQ2Byc39mm1Uthz/Pw5H+tCpA==} + '@fluentui/react-tabster@9.26.11': + resolution: {integrity: sha512-x2UjXowknK4gHJT14ezIeaLAKozZrpqsvWj8Mqa6p+TiOdHyo8YO6mecpCV1QWyz86qYsOPYhK/i0MSapwaELA==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-tag-picker@9.4.3': - resolution: {integrity: sha512-5efPjQEZJJyP3PDaGU9gvdNPfA5i2K3/tYk65Er5EBwtsPdQMIY5tMwzdL7hO0SC9ufJvX6EbYN8HOLNfCDPhg==} + '@fluentui/react-tag-picker@9.7.14': + resolution: {integrity: sha512-SMrLFkuVdZ/UPLHhumodQcM/V4uxkS3GayCBykddn1OWtWGVLjN4idCes56XGdZyNq79u4BEu7Vtxwucjv3oXg==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-tags@9.3.30': - resolution: {integrity: sha512-EyGhog+wUuPhrMleDe0RpvzZMagsPz8y9xU572CbMbk0B8HKe9NV7I2YoHn9ITQInu2l2c0FPbS+eneqcbO+0w==} + '@fluentui/react-tags@9.7.13': + resolution: {integrity: sha512-lg6C4b0RZKroQROSyezrLusR8/p/W6poQyKrJSEigiYhGZUm32Z+oi7qS7FDahVV/DA2vpRnuY/IfclIDszvTQ==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-teaching-popover@9.2.4': - resolution: {integrity: sha512-Sems0cZT43g7iNovo8cY7dNJwFWiWjH4+q8OXFGRgN9pOnPbIz/VNMdqLDcbJ+QWcxUs9lkacE9HrY4oHKFwOQ==} + '@fluentui/react-teaching-popover@9.6.14': + resolution: {integrity: sha512-3FRyaoRSO/XJGiOJxRe1E7bdDPr8KZEX/Dp/IYRn45Y2War308sscaUUPz0N3ut9iRQlT2edsHSlBMNprLEXRQ==} peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' + '@types/react': '>=16.8.0 <20.0.0' + '@types/react-dom': '>=16.8.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.8.0 <20.0.0' - '@fluentui/react-text@9.4.32': - resolution: {integrity: sha512-unEqjCSX8MjcW7+ZavEZ2D+JYM8DEpkIlgNb8lF1ye/ACqTQINKFEc9ShAeXIk/1yVNlA02P3pjbHOWL2Vgwhg==} + '@fluentui/react-text@9.6.12': + resolution: {integrity: sha512-IYiyYflw3ozS2Kil93vIqgu4JAJvFLswldJ5oBgBVOAM+MGG7G7He7Dp9tVRYxqHxkA54Um5Mv3HcUUgJ5sqww==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-textarea@9.3.98': - resolution: {integrity: sha512-dsdASrLG7XgELMB8ddQgHaOU5vN1G+YAgXqFvFXn1IkQZCz439lxnSKyzmMSRhrsg2IPOZNOPiwILj8GOJGgXQ==} + '@fluentui/react-textarea@9.6.12': + resolution: {integrity: sha512-xoRYQpc76qc0WsAlOKhygnhZActTbbPvNdQU12R6bk6P4fUPBgX6rNMsNv6cVSr3ZvPuWn3bQq80PjPO10iezA==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-theme@9.1.24': - resolution: {integrity: sha512-OhVKYD7CMYHxzJEn4PtIszledj8hbQJNWBMfIZsp4Sytdp9vCi0txIQUx4BhS1WqtQPhNGCF16eW9Q3NRrnIrQ==} + '@fluentui/react-theme@9.2.0': + resolution: {integrity: sha512-Q0zp/MY1m5RjlkcwMcjn/PQRT2T+q3bgxuxWbhgaD07V+tLzBhGROvuqbsdg4YWF/IK21zPfLhmGyifhEu0DnQ==} - '@fluentui/react-toast@9.3.65': - resolution: {integrity: sha512-rQ3jvvKWjankXpjyrazRtw56pPR7sWF9QF81z7mMdTsIdPpyZTclHJ7tYShk2Qzt0s+WglNO7k4qXw/txemA9w==} + '@fluentui/react-toast@9.7.10': + resolution: {integrity: sha512-Zvh/19VpFXft7VFvlHEyURg766RyKBE6eekrmtgE416ow07pfn1a7X7VqTyfp90uEaJsowB//twJNjCc3r3oAw==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-toolbar@9.2.18': - resolution: {integrity: sha512-iN1voIcvMoO/qyaeLj+Yo53zlTrU6Rvt5r96GkI7UafuLGXe6XYEemaK4RnUVWV1ba4pMdWPH3FexPiflAwWmQ==} + '@fluentui/react-toolbar@9.6.14': + resolution: {integrity: sha512-wjUqbfNSGlmgpMsJvpd8C7qzXUav3pb88ctyzziweURZskOMAIx8wv0PHUih9h9haMB5ayTiLuJL4Lcpv6jNlA==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-tooltip@9.5.5': - resolution: {integrity: sha512-+cA6BRu04LIJEIifnQzL0N0mEkkPOty3LysFklsXSDGKa4kJ1NKgLqbAZivcRPh0pX0Xleq+pCYfB5TI6s7uTw==} + '@fluentui/react-tooltip@9.8.12': + resolution: {integrity: sha512-ZA36KqmGWhK1HmNd1HO5p3Fz3cM06p/1kSKEB6b+F2opY+Db8IQGa6ER8wVtxLnUs/WFrcjJPcy7DuD2oyeSFQ==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-tree@9.9.3': - resolution: {integrity: sha512-Nbrm3Kj20K+u/kZKGOVOjQM6FbqujowiYVRtsPWxaspJeotXp+YF1a3I6uyBkMwq1MIbADoTatoxHTuxe/gXgQ==} + '@fluentui/react-tree@9.15.8': + resolution: {integrity: sha512-T2USjFQ2tPb0TzX3FagifQzJKYGq0T8IQYHdfHO7LP7sThI13Mnt6ke7mGC3SOPi8WKUCMRaoXAksbggUMXFUQ==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/react-utilities@9.18.20': - resolution: {integrity: sha512-4uIgf4e4yP1HWAQapFQKNN88+L88NqbzXyQPf+NWE9lmP5xRyyMePKRX7i4PcJFdSt7lN4BYvwUxJ7DkQ/Npnw==} + '@fluentui/react-utilities@9.26.0': + resolution: {integrity: sha512-3i/Vdt9UzDs/vuQvdR6HJFMhkOqB22lOGJ+v6VpkjGO81ywnQwP4LKkaKK534q+qiVbcKumCkHOeRhtMAUJXPQ==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - react: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + react: '>=16.14.0 <20.0.0' - '@fluentui/react-virtualizer@9.0.0-alpha.92': - resolution: {integrity: sha512-hT7xwMXyXco/tQRdZgPZS3O8DjJnYIKc9EnZ2qQMYrv0PEiee01WwH2NVFbhkn2utD9TZlE3Gu0j25fSYICBxQ==} + '@fluentui/react-virtualizer@9.0.0-alpha.108': + resolution: {integrity: sha512-2uaGDhGbVZqBd/INh2tiSefVUwdAPK/PDJ8e0pJ34+N77A1Mcq9eSbyaBp5GLZ/GcycHAWnnyDCall9Avpqo6g==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.14.0 <20.0.0' + '@types/react-dom': '>=16.9.0 <20.0.0' + react: '>=16.14.0 <20.0.0' + react-dom: '>=16.14.0 <20.0.0' - '@fluentui/tokens@1.0.0-alpha.21': - resolution: {integrity: sha512-xQ1T56sNgDFGl+kJdIwhz67mHng8vcwO7Dvx5Uja4t+NRULQBgMcJ4reUo4FGF3TjufHj08pP0/OnKQgnOaSVg==} + '@fluentui/tokens@1.0.0-alpha.22': + resolution: {integrity: sha512-i9fgYyyCWFRdUi+vQwnV6hp7wpLGK4p09B+O/f2u71GBXzPuniubPYvrIJYtl444DD6shLjYToJhQ1S6XTFwLg==} - '@griffel/core@1.19.1': - resolution: {integrity: sha512-ZItAAOm8YH1FW0ebzOxS3jwENqd+Dz4CGiPEdgkL4kr7D6mBpjjBbQC6VRXxnA+VqHeEQGy69Ll4M1peY8MX/g==} + '@griffel/core@1.19.2': + resolution: {integrity: sha512-WkB/QQkjy9dE4vrNYGhQvRRUHFkYVOuaznVOMNTDT4pS9aTJ9XPrMTXXlkpcwaf0D3vNKoerj4zAwnU2lBzbOg==} - '@griffel/react@1.5.29': - resolution: {integrity: sha512-xKenEIfV2PnLKVsM8yp2ZCUTknh2790937XlI88zDaO9TC8ylG10mZ3MrcgCdSecrVjKq9JKmm24tsODpkh4pw==} + '@griffel/react@1.5.32': + resolution: {integrity: sha512-jN3SmSwAUcWFUQuQ9jlhqZ5ELtKY21foaUR0q1mJtiAeSErVgjkpKJyMLRYpvaFGWrDql0Uz23nXUogXbsS2wQ==} peerDependencies: - react: '>=16.8.0 <19.0.0' + react: '>=16.8.0 <20.0.0' '@griffel/style-types@1.3.0': resolution: {integrity: sha512-bHwD3sUE84Xwv4dH011gOKe1jul77M1S6ZFN9Tnq8pvZ48UMdY//vtES6fv7GRS5wXYT4iqxQPBluAiYAfkpmw==} - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@module-federation/error-codes@0.22.0': + resolution: {integrity: sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug==} + + '@module-federation/runtime-core@0.22.0': + resolution: {integrity: sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA==} + + '@module-federation/runtime-tools@0.22.0': + resolution: {integrity: sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA==} + + '@module-federation/runtime@0.22.0': + resolution: {integrity: sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA==} + + '@module-federation/sdk@0.22.0': + resolution: {integrity: sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==} + + '@module-federation/webpack-bundler-runtime@0.22.0': + resolution: {integrity: sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA==} + + '@napi-rs/wasm-runtime@1.0.7': + resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} + + '@pivanov/utils@0.0.2': + resolution: {integrity: sha512-q9CN0bFWxWgMY5hVVYyBgez1jGiLBa6I+LkG37ycylPhFvEGOOeaADGtUSu46CaZasPnlY8fCdVJZmrgKb1EPA==} + peerDependencies: + react: '>=18' + react-dom: '>=18' - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@preact/signals-core@1.12.1': + resolution: {integrity: sha512-BwbTXpj+9QutoZLQvbttRg5x3l5468qaV2kufh+51yha1c53ep5dY4kTuZR35+3pAZxpfQerGJiQqg34ZNZ6uA==} - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@preact/signals@1.3.2': + resolution: {integrity: sha512-naxcJgUJ6BTOROJ7C3QML7KvwKwCXQJYTc5L/b0eEsdYgPB6SxwoQ1vDGcS0Q7GVjAenVq/tXrybVdFShHYZWg==} + peerDependencies: + preact: 10.x + + '@radix-ui/number@1.1.1': + resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} - '@radix-ui/react-compose-refs@1.1.1': - resolution: {integrity: sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==} + '@radix-ui/primitive@1.1.3': + resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + + '@radix-ui/react-arrow@1.1.7': + resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} peerDependencies: '@types/react': '*' + '@types/react-dom': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true + '@types/react-dom': + optional: true - '@radix-ui/react-slot@1.1.2': - resolution: {integrity: sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==} + '@radix-ui/react-collection@1.1.7': + resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} peerDependencies: '@types/react': '*' + '@types/react-dom': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true + '@types/react-dom': + optional: true - '@rollup/rollup-android-arm-eabi@4.34.5': - resolution: {integrity: sha512-JXmmQcKQtpf3Z6lvA8akkrHDZ5AEfgc2hLMix1/X5BhQbezBQ0AP5GYLdU8jsQRme8qr2sscCe3wizp7UT0L9g==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.34.5': - resolution: {integrity: sha512-9/A8/ZBOprUjkrJoP9BBEq2vdSud6BPd3LChw09bJQiEZH5oN4kWIkHu90cA0Cj0cSF5cIaD76+0lA+d5KHmpQ==} - cpu: [arm64] - os: [android] + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - '@rollup/rollup-darwin-arm64@4.34.5': - resolution: {integrity: sha512-b9oCfgHKfc1AJEQ5sEpE8Kf6s7aeygj5bZAsl1hTpZc1V9cfZASFSXzzNj7o/BQNPbjmVkVxpCCLRhBfLXhJ5g==} - cpu: [arm64] - os: [darwin] + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - '@rollup/rollup-darwin-x64@4.34.5': - resolution: {integrity: sha512-Gz42gKBQPoFdMYdsVqkcpttYOO/0aP7f+1CgMaeZEz0gss7dop1TsO3hT77Iroz/TV7PdPUG/RYlj9EA39L4dw==} - cpu: [x64] - os: [darwin] + '@radix-ui/react-direction@1.1.1': + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - '@rollup/rollup-freebsd-arm64@4.34.5': - resolution: {integrity: sha512-JPkafjkOFaupd8VQYsXfGFKC2pfMr7hwSYGkVGNwhbW0k0lHHyIdhCSNBendJ4O7YlT4yRyKXoms1TL7saO7SQ==} - cpu: [arm64] - os: [freebsd] + '@radix-ui/react-dismissable-layer@1.1.11': + resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@rollup/rollup-freebsd-x64@4.34.5': - resolution: {integrity: sha512-j6Q8VFqyI8hZM33h1JC6DZK2w8ejkXqEMozTrtIEGfRVMpVZL3GrLOOYEUkAgUSpJ9sb2w+FEpjGj7IHRcQfdw==} - cpu: [x64] - os: [freebsd] + '@radix-ui/react-focus-guards@1.1.3': + resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.34.5': - resolution: {integrity: sha512-6jyiXKF9Xq6x9yQjct5xrRT0VghJk5VzAfed3o0hgncwacZkzOdR0TXLRNjexsEXWN8tG7jWWwsVk7WeFi//gw==} - cpu: [arm] - os: [linux] + '@radix-ui/react-focus-scope@1.1.7': + resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@rollup/rollup-linux-arm-musleabihf@4.34.5': - resolution: {integrity: sha512-cOTYe5tLcGAvGztRLIqx87LE7j/qjaAqFrrHsPFlnuhhhFO5LSr2AzvdQYuxomJMzMBrXkMRNl9bQEpDZ5bjLQ==} - cpu: [arm] - os: [linux] + '@radix-ui/react-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - '@rollup/rollup-linux-arm64-gnu@4.34.5': - resolution: {integrity: sha512-KHlrd+YqmS7rriW+LBb1kQNYmd5w1sAIG3z7HEpnQOrg/skeYYv9DAcclGL9gpFdpnzmiAEkzsTT74kZWUtChQ==} - cpu: [arm64] - os: [linux] + '@radix-ui/react-popover@1.1.15': + resolution: {integrity: sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@rollup/rollup-linux-arm64-musl@4.34.5': - resolution: {integrity: sha512-uOb6hzDqym4Sw+qw3+svS3SmwQGVUhyTdPKyHDdlYg1Z0aHjdNmjwRY7zw/90/UfBe/yD7Mv2mYKhQpOfy4RYA==} - cpu: [arm64] - os: [linux] + '@radix-ui/react-popper@1.2.8': + resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.34.5': - resolution: {integrity: sha512-pARu8ZKANZH4wINLdHLKG69EPwJswM6A+Ox1a9LpiclRQoyjacFFTtXN3akKQ2ufJXDasO/pWvxKN9ZfCgEoFA==} - cpu: [loong64] - os: [linux] + '@radix-ui/react-portal@1.1.9': + resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.34.5': - resolution: {integrity: sha512-crUWn12NRmCdao2YwS1GvlPCVypMBMJlexTaantaP2+dAMd2eZBErFcKG8hZYEHjSbbk2UoH1aTlyeA4iKLqSA==} - cpu: [ppc64] + '@radix-ui/react-presence@1.1.5': + resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.1.3': + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.1.4': + resolution: {integrity: sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-select@2.2.6': + resolution: {integrity: sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-separator@1.1.8': + resolution: {integrity: sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.2.3': + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-slot@1.2.4': + resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.2.2': + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.2': + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.1.1': + resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.1': + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.1': + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.2.3': + resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.1': + resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-linux-x64-gnu@4.53.3': + resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} + cpu: [x64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.34.5': - resolution: {integrity: sha512-XtD/oMhCdixi3x8rCNyDRMUsLo1Z+1UQcK+oR7AsjglGov9ETiT3TNFhUPzaGC1jH+uaMtPhxrVRUub+pnAKTg==} - cpu: [riscv64] + '@rsbuild/core@1.7.2': + resolution: {integrity: sha512-VAFO6cM+cyg2ntxNW6g3tB2Jc5J5mpLjLluvm7VtW2uceNzyUlVv41o66Yp1t1ikxd3ljtqegViXem62JqzveA==} + engines: {node: '>=18.12.0'} + hasBin: true + + '@rsbuild/plugin-babel@1.0.6': + resolution: {integrity: sha512-tWnqG938MedKJx7U4F1lHb156VDtNzj7mSsi2ZoxZVBnECQE01/V6QTN1XKw7nWunGyGoETb+nQBGc+fkVZjvw==} + peerDependencies: + '@rsbuild/core': 1.x + + '@rsbuild/plugin-react@1.4.2': + resolution: {integrity: sha512-2rJb5mOuqVof2aDq4SbB1E65+0n1vjhAADipC88jvZRNuTOulg79fh7R4tsCiBMI4VWq46gSpwekiK8G5bq6jg==} + peerDependencies: + '@rsbuild/core': 1.x + + '@rspack/binding-darwin-arm64@1.7.1': + resolution: {integrity: sha512-3C0w0kfCHfgOH+AP/Dx1bm/b3AR/or5CmU22Abevek0m95ndU3iT902eLcm9JNiMQnDQLBQbolfj5P591t0oPg==} + cpu: [arm64] + os: [darwin] + + '@rspack/binding-darwin-x64@1.7.1': + resolution: {integrity: sha512-HTrBpdw2gWwcpJ3c8h4JF8B1YRNvrFT+K620ycttrlu/HvI4/U770BBJ/ej36R/hdh59JvMCGe+w49FyXv6rzg==} + cpu: [x64] + os: [darwin] + + '@rspack/binding-linux-arm64-gnu@1.7.1': + resolution: {integrity: sha512-BX9yAPCO0WBFyOzKl9bSXT/cH27nnOJp02smIQMxfv7RNfwGkJg5GgakYcuYG+9U1HEFitBSzmwS2+dxDcAxlg==} + cpu: [arm64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.34.5': - resolution: {integrity: sha512-V3+BvgyHb21aF7lw0sc78Tv0+xLp4lm2OM7CKFVrBuppsMvtl/9O5y2OX4tdDT0EhIsDP/ObJPqDuEg1ZoTwSQ==} - cpu: [s390x] + '@rspack/binding-linux-arm64-musl@1.7.1': + resolution: {integrity: sha512-maBX19XyiVkxzh/NA79ALetCobc4zUyoWkWLeCGyW5xKzhPVFatJp+qCiHqHkqUZcgRo+1i5ihoZ2bXmelIeZg==} + cpu: [arm64] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.34.5': - resolution: {integrity: sha512-SkCIXLGk42yldTcH8UXh++m0snVxp9DLf4meb1mWm0lC8jzxjFBwSLGtUSeLgQDsC05iBaIhyjNX46DlByrApQ==} + '@rspack/binding-linux-x64-gnu@1.7.1': + resolution: {integrity: sha512-8KJAeBLiWcN7zEc9aaS7LRJPZVtZuQU8mCsn+fRhdQDSc+a9FcTN8b6Lw29z8cejwbU6Gxr/8wk5XGexMWFaZA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.34.5': - resolution: {integrity: sha512-iUcH3FBtBN2/Ce0rI84suRhD0+bB5BVEffqOwsGaX5py5TuYLOQa7S7oVBP0NKtB5rub3i9IvZtMXiD96l5v0A==} + '@rspack/binding-linux-x64-musl@1.7.1': + resolution: {integrity: sha512-Gn9x5vhKRELvSoZ3ZjquY8eWtCXur0OsYnZ2/ump8mofM6IDaL7Qqu3Hf4Kud31PDH0tfz0jWf9piX32HHPmgg==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.34.5': - resolution: {integrity: sha512-PUbWd+h/h6rUowalDYIdc9S9LJXbQDMcJe0BjABl3oT3efYRgZ8aUe8ZZDSie7y+fz6Z+rueNfdorIbkWv5Eqg==} + '@rspack/binding-wasm32-wasi@1.7.1': + resolution: {integrity: sha512-2r9M5iVchmsFkp3sz7A5YnMm2TfpkB71LK3AoaRWKMfvf5oFky0GSGISYd2TCBASO+X2Qskaq+B24Szo8zH5FA==} + cpu: [wasm32] + + '@rspack/binding-win32-arm64-msvc@1.7.1': + resolution: {integrity: sha512-/WIHp982yqqqAuiz2WLtf1ofo9d1lHDGZJ7flxFllb1iMgnUeSRyX6stxEi11K3Rg6pQa7FdCZGKX/engyj2bw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.34.5': - resolution: {integrity: sha512-3vncGhOJiAUR85fnAXJyvSp2GaDWYByIQmW68ZAr+e8kIxgvJ1VaZbfHD5BO5X6hwRQdY6Um/XfA3l5c2lV+OQ==} + '@rspack/binding-win32-ia32-msvc@1.7.1': + resolution: {integrity: sha512-Kpela29n+kDGGsss6q/3qTd6n9VW7TOQaiA7t1YLdCCl8qqcdKlz/vWjFMd2MqgcSGC/16PvChE4sgpUvryfCQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.34.5': - resolution: {integrity: sha512-Mi8yVUlQOoeBpY72n75VLATptPGvj2lHa47rQdK9kZ4MoG5Ve86aVIU+PO3tBklTCBtILtdRfXS0EvIbXgmCAg==} + '@rspack/binding-win32-x64-msvc@1.7.1': + resolution: {integrity: sha512-B/y4MWqP2Xeto1/HV0qtZNOMPSLrEVOqi2b7JSIXG/bhlf+3IAkDzEEoHs+ZikLR4C8hMaS0pVJsDGKFmGzC9A==} cpu: [x64] os: [win32] - '@swc/helpers@0.5.15': - resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@rspack/binding@1.7.1': + resolution: {integrity: sha512-qVTV1/UWpMSZktvK5A8+HolgR1Qf0nYR3Gg4Vax5x3/BcHDpwGZ0fbdFRUirGVWH/XwxZ81zoI6F2SZq7xbX+w==} - '@tailwindcss/node@4.0.4': - resolution: {integrity: sha512-VLFq80IyoV1hsHPcCm1mmlyPyUT6NlovQLoO2y7PGm84mW94ZrNJ7ax5H6K4M7Aj/fdMfem5IX7Ka+LXWZpDGg==} + '@rspack/core@1.7.1': + resolution: {integrity: sha512-kRxfY8RRa6nU3/viDvAIP6CRpx+0rfXFRonPL0pHBx8u6HhV7m9rLEyaN6MWsLgNIAWkleFGb7tdo4ux2ljRJQ==} + engines: {node: '>=18.12.0'} + peerDependencies: + '@swc/helpers': '>=0.5.1' + peerDependenciesMeta: + '@swc/helpers': + optional: true - '@tailwindcss/oxide-android-arm64@4.0.4': - resolution: {integrity: sha512-hiGUA8d15ynH/LdurQNObnuTjri7i4ApAzhesusNxoz4br7vhZ6QO5CFgniYAYNZvf8Q8wCTBg0nj61RalBeVQ==} + '@rspack/lite-tapable@1.1.0': + resolution: {integrity: sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==} + + '@rspack/plugin-react-refresh@1.6.0': + resolution: {integrity: sha512-OO53gkrte/Ty4iRXxxM6lkwPGxsSsupFKdrPFnjwFIYrPvFLjeolAl5cTx+FzO5hYygJiGnw7iEKTmD+ptxqDA==} + peerDependencies: + react-refresh: '>=0.10.0 <1.0.0' + webpack-hot-middleware: 2.x + peerDependenciesMeta: + webpack-hot-middleware: + optional: true + + '@swc/helpers@0.5.18': + resolution: {integrity: sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==} + + '@tailwindcss/node@4.1.18': + resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} + + '@tailwindcss/oxide-android-arm64@4.1.18': + resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.0.4': - resolution: {integrity: sha512-vTca+ysNl8BYmYJTni9pLC+L3S4bvrj0ai1eUV3yYXYa5Cpugr5Fni6ylV0gcTZOyETm2RCCJ/0azU6MgqE6HA==} + '@tailwindcss/oxide-darwin-arm64@4.1.18': + resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.0.4': - resolution: {integrity: sha512-rxPWb5AQJ/aAM/5UDCjaQaMYIcrZHe/Dr9xZu9+P9nJf3WAweNsGi+e+SW9EYGRiF3hkBtP2dvxVNAkTiEbNQQ==} + '@tailwindcss/oxide-darwin-x64@4.1.18': + resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.0.4': - resolution: {integrity: sha512-UOnRHzlS5V5cxaMgBo6rk1E92tTDUtO/falc9vOpNiRdWhNcofYNN9zvZP63Wuo5FC6/XCyAnJo6OXUm18TwrQ==} + '@tailwindcss/oxide-freebsd-x64@4.1.18': + resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.4': - resolution: {integrity: sha512-0Ry9Qfnf22rmJwHxsCFmHQIl5RZw+yOUUGHaqNT42REL8r308cU/bi4UqdrjqVRfAlu51gOGxTRf2NRueczuIA==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': + resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.0.4': - resolution: {integrity: sha512-5a7WD30nVdI7Rl1ohZ0Ojj9t5yRnZkJBizvh3uIW52h9UeNpon8TfoknF6rU/TwD32dQ0Cjo5CcCHtQ2wW9PCA==} + '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': + resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-arm64-musl@4.0.4': - resolution: {integrity: sha512-m6s5jKSqos07l6NtHFd49Ljcaw4jIWHE7jq6eNPNz9SCzQqRzs4esP1t7jH8UljQ7JffKOl7yZPwK5Nf+irliw==} + '@tailwindcss/oxide-linux-arm64-musl@4.1.18': + resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-x64-gnu@4.0.4': - resolution: {integrity: sha512-K5dBjGHzby9eyUBwy9YHFhKY+5i8fzIBZM1NBWp6L2xpM7OzW9WJDgNcgESkZami9g+EozkQLt3ZmMZHAieXkw==} + '@tailwindcss/oxide-linux-x64-gnu@4.1.18': + resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-linux-x64-musl@4.0.4': - resolution: {integrity: sha512-J8sskt+fA5ooq+kxy0Tf4E2TRWZD9Y8j3K+pnBwp9zdilLmSd8OHrB3e0/rO78KveZ6BE9ae75cKOWrT6wONmw==} + '@tailwindcss/oxide-linux-x64-musl@4.1.18': + resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-win32-arm64-msvc@4.0.4': - resolution: {integrity: sha512-flFaaMc77NQbz0Fq73wBs9EH2lX1Oc2Z/3JuxoewpnGHpAGJ/j05tvBNMyTaGrKcHvf/+dk+mCDxb6+PmzGgnQ==} + '@tailwindcss/oxide-wasm32-wasi@4.1.18': + resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': + resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.0.4': - resolution: {integrity: sha512-WzMA0aL/24/JyNrv2Yhr/Og24QGRPWJMjRyCJ4HRoGMs6/8svOQKrnnZ/9LUFwn56irAndFBjWWnlaqykH+g5Q==} + '@tailwindcss/oxide-win32-x64-msvc@4.1.18': + resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.0.4': - resolution: {integrity: sha512-vPpu30KFLiGyPOoElkYt8WRvzGKVrrOz49KpfiGGtnQGmyUpL8VCbJzzEEcpKT5BpaaQidhFok+OXscf6hHjOQ==} + '@tailwindcss/oxide@4.1.18': + resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==} engines: {node: '>= 10'} - '@tailwindcss/postcss@4.0.4': - resolution: {integrity: sha512-Up8fB+DUhy8qvDqlHgZAWaL5iVEbypcuOjzlW4K6EyU+aGEvXK0/wrcKBKOTvg3KKP5givJMexJ0aG1hDPOuRg==} + '@tailwindcss/postcss@4.1.18': + resolution: {integrity: sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==} - '@tauri-apps/api@2.2.0': - resolution: {integrity: sha512-R8epOeZl1eJEl603aUMIGb4RXlhPjpgxbGVEaqY+0G5JG9vzV/clNlzTeqc+NLYXVqXcn8mb4c5b9pJIUDEyAg==} + '@tauri-apps/api@2.9.1': + resolution: {integrity: sha512-IGlhP6EivjXHepbBic618GOmiWe4URJiIeZFlB7x3czM0yDHHYviH1Xvoiv4FefdkQtn6v7TuwWCRfOGdnVUGw==} - '@tauri-apps/cli-darwin-arm64@2.2.7': - resolution: {integrity: sha512-54kcpxZ3X1Rq+pPTzk3iIcjEVY4yv493uRx/80rLoAA95vAC0c//31Whz75UVddDjJfZvXlXZ3uSZ+bnCOnt0A==} + '@tauri-apps/cli-darwin-arm64@2.9.6': + resolution: {integrity: sha512-gf5no6N9FCk1qMrti4lfwP77JHP5haASZgVbBgpZG7BUepB3fhiLCXGUK8LvuOjP36HivXewjg72LTnPDScnQQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@tauri-apps/cli-darwin-x64@2.2.7': - resolution: {integrity: sha512-Vgu2XtBWemLnarB+6LqQeLanDlRj7CeFN//H8bVVdjbNzxcSxsvbLYMBP8+3boa7eBnjDrqMImRySSgL6IrwTw==} + '@tauri-apps/cli-darwin-x64@2.9.6': + resolution: {integrity: sha512-oWh74WmqbERwwrwcueJyY6HYhgCksUc6NT7WKeXyrlY/FPmNgdyQAgcLuTSkhRFuQ6zh4Np1HZpOqCTpeZBDcw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@tauri-apps/cli-linux-arm-gnueabihf@2.2.7': - resolution: {integrity: sha512-+Clha2iQAiK9zoY/KKW0KLHkR0k36O78YLx5Sl98tWkwI3OBZFg5H5WT1plH/4sbZIS2aLFN6dw58/JlY9Bu/g==} + '@tauri-apps/cli-linux-arm-gnueabihf@2.9.6': + resolution: {integrity: sha512-/zde3bFroFsNXOHN204DC2qUxAcAanUjVXXSdEGmhwMUZeAQalNj5cz2Qli2elsRjKN/hVbZOJj0gQ5zaYUjSg==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@tauri-apps/cli-linux-arm64-gnu@2.2.7': - resolution: {integrity: sha512-Z/Lp4SQe6BUEOays9BQAEum2pvZF4w9igyXijP+WbkOejZx4cDvarFJ5qXrqSLmBh7vxrdZcLwoLk9U//+yQrg==} + '@tauri-apps/cli-linux-arm64-gnu@2.9.6': + resolution: {integrity: sha512-pvbljdhp9VOo4RnID5ywSxgBs7qiylTPlK56cTk7InR3kYSTJKYMqv/4Q/4rGo/mG8cVppesKIeBMH42fw6wjg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tauri-apps/cli-linux-arm64-musl@2.2.7': - resolution: {integrity: sha512-+8HZ+txff/Y3YjAh80XcLXcX8kpGXVdr1P8AfjLHxHdS6QD4Md+acSxGTTNbplmHuBaSHJvuTvZf9tU1eDCTDg==} + '@tauri-apps/cli-linux-arm64-musl@2.9.6': + resolution: {integrity: sha512-02TKUndpodXBCR0oP//6dZWGYcc22Upf2eP27NvC6z0DIqvkBBFziQUcvi2n6SrwTRL0yGgQjkm9K5NIn8s6jw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tauri-apps/cli-linux-x64-gnu@2.2.7': - resolution: {integrity: sha512-ahlSnuCnUntblp9dG7/w5ZWZOdzRFi3zl0oScgt7GF4KNAOEa7duADsxPA4/FT2hLRa0SvpqtD4IYFvCxoVv3Q==} + '@tauri-apps/cli-linux-riscv64-gnu@2.9.6': + resolution: {integrity: sha512-fmp1hnulbqzl1GkXl4aTX9fV+ubHw2LqlLH1PE3BxZ11EQk+l/TmiEongjnxF0ie4kV8DQfDNJ1KGiIdWe1GvQ==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + + '@tauri-apps/cli-linux-x64-gnu@2.9.6': + resolution: {integrity: sha512-vY0le8ad2KaV1PJr+jCd8fUF9VOjwwQP/uBuTJvhvKTloEwxYA/kAjKK9OpIslGA9m/zcnSo74czI6bBrm2sYA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tauri-apps/cli-linux-x64-musl@2.2.7': - resolution: {integrity: sha512-+qKAWnJRSX+pjjRbKAQgTdFY8ecdcu8UdJ69i7wn3ZcRn2nMMzOO2LOMOTQV42B7/Q64D1pIpmZj9yblTMvadA==} + '@tauri-apps/cli-linux-x64-musl@2.9.6': + resolution: {integrity: sha512-TOEuB8YCFZTWVDzsO2yW0+zGcoMiPPwcUgdnW1ODnmgfwccpnihDRoks+ABT1e3fHb1ol8QQWsHSCovb3o2ENQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tauri-apps/cli-win32-arm64-msvc@2.2.7': - resolution: {integrity: sha512-aa86nRnrwT04u9D9fhf5JVssuAZlUCCc8AjqQjqODQjMd4BMA2+d4K9qBMpEG/1kVh95vZaNsLogjEaqSTTw4A==} + '@tauri-apps/cli-win32-arm64-msvc@2.9.6': + resolution: {integrity: sha512-ujmDGMRc4qRLAnj8nNG26Rlz9klJ0I0jmZs2BPpmNNf0gM/rcVHhqbEkAaHPTBVIrtUdf7bGvQAD2pyIiUrBHQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@tauri-apps/cli-win32-ia32-msvc@2.2.7': - resolution: {integrity: sha512-EiJ5/25tLSQOSGvv+t6o3ZBfOTKB5S3vb+hHQuKbfmKdRF0XQu2YPdIi1CQw1DU97ZAE0Dq4frvnyYEKWgMzVQ==} + '@tauri-apps/cli-win32-ia32-msvc@2.9.6': + resolution: {integrity: sha512-S4pT0yAJgFX8QRCyKA1iKjZ9Q/oPjCZf66A/VlG5Yw54Nnr88J1uBpmenINbXxzyhduWrIXBaUbEY1K80ZbpMg==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@tauri-apps/cli-win32-x64-msvc@2.2.7': - resolution: {integrity: sha512-ZB8Kw90j8Ld+9tCWyD2fWCYfIrzbQohJ4DJSidNwbnehlZzP7wAz6Z3xjsvUdKtQ3ibtfoeTqVInzCCEpI+pWg==} + '@tauri-apps/cli-win32-x64-msvc@2.9.6': + resolution: {integrity: sha512-ldWuWSSkWbKOPjQMJoYVj9wLHcOniv7diyI5UAJ4XsBdtaFB0pKHQsqw/ItUma0VXGC7vB4E9fZjivmxur60aw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@tauri-apps/cli@2.2.7': - resolution: {integrity: sha512-ZnsS2B4BplwXP37celanNANiIy8TCYhvg5RT09n72uR/o+navFZtGpFSqljV8fy1Y4ixIPds8FrGSXJCN2BerA==} + '@tauri-apps/cli@2.9.6': + resolution: {integrity: sha512-3xDdXL5omQ3sPfBfdC8fCtDKcnyV7OqyzQgfyT5P3+zY6lcPqIYKQBvUasNvppi21RSdfhy44ttvJmftb0PCDw==} engines: {node: '>= 10'} hasBin: true - '@tauri-apps/plugin-autostart@2.2.0': - resolution: {integrity: sha512-TzVcDZdOvdot0avkpstUWJKKEl4cyxLpFB9DZZRW5zH8k+Bv8IVJmO0zyYuw+7oKlGdHOINbD/7Je7GHMViw5w==} + '@tauri-apps/plugin-autostart@2.5.1': + resolution: {integrity: sha512-zS/xx7yzveCcotkA+8TqkI2lysmG2wvQXv2HGAVExITmnFfHAdj1arGsbbfs3o6EktRHf6l34pJxc3YGG2mg7w==} - '@tauri-apps/plugin-deep-link@2.2.0': - resolution: {integrity: sha512-H6mkxr2KZ3XJcKL44tiq6cOjCw9DL8OgU1xjn3j26Qsn+H/roPFiyhR7CHuB8Ar+sQFj4YVlfmJwtBajK2FETQ==} + '@tauri-apps/plugin-deep-link@2.4.6': + resolution: {integrity: sha512-UUOSt0U5juK20uhO2MoHZX/IPblkrhUh+VPtIeu3RwtzI0R9Em3Auzfg/PwcZ9Pv8mLne3cQ4p9CFXD6WxqCZA==} - '@tauri-apps/plugin-os@2.2.0': - resolution: {integrity: sha512-HszbCdbisMlu5QhCNAN8YIWyz2v33abAWha6+uvV2CKX8P5VSct/y+kEe22JeyqrxCnWlQ3DRx7s49Byg7/0EA==} + '@tauri-apps/plugin-http@2.5.5': + resolution: {integrity: sha512-4hTS7AIBLmj8opDM3s8muEp7PBJQEiGDFvFF4fdMscQCOwhzXJf5hIZEHC867eH2Ck145Oce+H0AU0G/k9TbNg==} - '@tauri-apps/plugin-updater@2.5.0': - resolution: {integrity: sha512-CWpwrkgpMESDPgJ0EuXgQTI/U9zeZQ9NLUvMyuWVrsuRez7tJ/3c7y73LAkvkI6+ekUxVaRJrxYrSfd8W+DRvQ==} + '@tauri-apps/plugin-os@2.3.2': + resolution: {integrity: sha512-n+nXWeuSeF9wcEsSPmRnBEGrRgOy6jjkSU+UVCOV8YUGKb2erhDOxis7IqRXiRVHhY8XMKks00BJ0OAdkpf6+A==} + + '@tauri-apps/plugin-updater@2.9.0': + resolution: {integrity: sha512-j++sgY8XpeDvzImTrzWA08OqqGqgkNyxczLD7FjNJJx/uXxMZFz5nDcfkyoI/rCjYuj2101Tci/r/HFmOmoxCg==} + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - '@types/babel__generator@7.6.8': - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.6': - resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/node@22.13.1': - resolution: {integrity: sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==} + '@types/node@20.19.28': + resolution: {integrity: sha512-VyKBr25BuFDzBFCK5sUM6ZXiWfqgCTwTAOK8qzGV/m9FCirXYDlmczJ+d5dXBAQALGCdRRdbteKYfJ84NGEusw==} - '@types/react-dom@19.0.3': - resolution: {integrity: sha512-0Knk+HJiMP/qOZgMyNFamlIjw9OFCsyC2ZbigmEEyXXixgre6IQpm/4V+r3qH4GC1JPvRJKInw+on2rV6YZLeA==} + '@types/node@25.0.6': + resolution: {integrity: sha512-NNu0sjyNxpoiW3YuVFfNz7mxSQ+S4X2G28uqg2s+CzoqoQjLPsWSbsFFyztIAqt2vb8kfEAsJNepMGPTxFDx3Q==} + + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: - '@types/react': ^19.0.0 + '@types/react': ^19.2.0 - '@types/react@19.0.8': - resolution: {integrity: sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw==} + '@types/react-reconciler@0.28.9': + resolution: {integrity: sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==} + peerDependencies: + '@types/react': '*' + + '@types/react@19.2.8': + resolution: {integrity: sha512-3MbSL37jEchWZz2p2mjntRZtPt837ij10ApxKfgmXCTuHWagYg7iA5bqPw6C8BMPfwidlvfPI/fxOc42HLhcyg==} - '@vitejs/plugin-react@4.3.4': - resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} - engines: {node: ^14.18.0 || >=16.0.0} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + + babel-plugin-react-compiler@1.0.0: + resolution: {integrity: sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==} + + baseline-browser-mapping@2.9.14: + resolution: {integrity: sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==} + hasBin: true + + bippy@0.3.34: + resolution: {integrity: sha512-vmptmU/20UdIWHHhq7qCSHhHzK7Ro3YJ1utU0fBG7ujUc58LEfTtilKxcF0IOgSjT5XLcm7CBzDjbv4lcKApGQ==} peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + react: '>=17.0.1' - browserslist@4.24.4: - resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - caniuse-lite@1.0.30001698: - resolution: {integrity: sha512-xJ3km2oiG/MbNU8G6zIq6XRZ6HtAOVXsbOrP/blGazi52kc5Yy7b6sDA5O+FbROzRrV7BSTllLHuNvmawYUJjw==} + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001763: + resolution: {integrity: sha512-mh/dGtq56uN98LlNX9qdbKnzINhX0QzhiWBFEkFfsFO4QyCvL8YegrJAazCwXIeqkIob8BlZPGM3xdnY+sgmvQ==} class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} @@ -1208,14 +1918,26 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + core-js@3.47.0: + resolution: {integrity: sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==} + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true - daisyui@5.0.0-beta.7: - resolution: {integrity: sha512-AW158KxukhyWwU9HTlfNkjAa9nPcfUZilITK7Taa3pqwVH/Suq31+1FHVcw7zLVRRw5jBUKrJ76xBQJOcRiKgQ==} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + daisyui@5.5.14: + resolution: {integrity: sha512-L47rvw7I7hK68TA97VB8Ee0woHew+/ohR6Lx6Ah/krfISOqcG4My7poNpX5Mo5/ytMxiR40fEaz6njzDi7cuSg==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1223,33 +1945,54 @@ packages: supports-color: optional: true - detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} - hasBin: true + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} - electron-to-chromium@1.5.96: - resolution: {integrity: sha512-8AJUW6dh75Fm/ny8+kZKJzI1pgoE8bKLZlzDU2W1ENd+DXKJrx7I7l9hb8UWR4ojlnb5OlixMt00QWiYJoVw1w==} + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - embla-carousel-autoplay@8.5.2: - resolution: {integrity: sha512-27emJ0px3q/c0kCHCjwRrEbYcyYUPfGO3g5IBWF1i7714TTzE6L9P81V6PHLoSMAKJ1aHoT2e7YFOsuFKCbyag==} + electron-to-chromium@1.5.267: + resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} + + embla-carousel-autoplay@8.6.0: + resolution: {integrity: sha512-OBu5G3nwaSXkZCo1A6LTaFMZ8EpkYbwIaH+bPqdBnDGQ2fh4+NbzjXjs2SktoPNKCtflfVMc75njaDHOYXcrsA==} peerDependencies: - embla-carousel: 8.5.2 + embla-carousel: 8.6.0 - embla-carousel-fade@8.5.2: - resolution: {integrity: sha512-QJ46Xy+mpijjquQeIY0d0sPSy34XduREUnz7tn1K20hcKyZYTONNIXQZu3GGNwG59cvhMqYJMw9ki92Rjd14YA==} + embla-carousel-fade@8.6.0: + resolution: {integrity: sha512-qaYsx5mwCz72ZrjlsXgs1nKejSrW+UhkbOMwLgfRT7w2LtdEB03nPRI06GHuHv5ac2USvbEiX2/nAHctcDwvpg==} peerDependencies: - embla-carousel: 8.5.2 + embla-carousel: 8.6.0 - embla-carousel@8.5.2: - resolution: {integrity: sha512-xQ9oVLrun/eCG/7ru3R+I5bJ7shsD8fFwLEY7yPe27/+fDHCNj0OT5EoG5ZbFyOxOcG6yTwW8oTz/dWyFnyGpg==} + embla-carousel@8.6.0: + resolution: {integrity: sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==} - enhanced-resolve@5.18.1: - resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + enhanced-resolve@5.18.4: + resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} engines: {node: '>=10.13.0'} - esbuild@0.24.2: - resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.27.2: + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} engines: {node: '>=18'} hasBin: true @@ -1257,6 +2000,17 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1266,25 +2020,45 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + get-tsconfig@4.13.0: + resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - jiti@2.4.2: - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + html-entities@2.6.0: + resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} hasBin: true + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -1293,138 +2067,273 @@ packages: keyborg@2.6.0: resolution: {integrity: sha512-o5kvLbuTF+o326CMVYpjlaykxqYP9DphFQZ2ZpgrvBouyvOxyEB7oqe8nOLFpiV5VCtz0D3pt8gXQYWpLpBnmA==} - lightningcss-darwin-arm64@1.29.1: - resolution: {integrity: sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==} + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + lightningcss-android-arm64@1.30.2: + resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.30.2: + resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.29.1: - resolution: {integrity: sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==} + lightningcss-darwin-x64@1.30.2: + resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.29.1: - resolution: {integrity: sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==} + lightningcss-freebsd-x64@1.30.2: + resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.29.1: - resolution: {integrity: sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==} + lightningcss-linux-arm-gnueabihf@1.30.2: + resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.29.1: - resolution: {integrity: sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==} + lightningcss-linux-arm64-gnu@1.30.2: + resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - lightningcss-linux-arm64-musl@1.29.1: - resolution: {integrity: sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==} + lightningcss-linux-arm64-musl@1.30.2: + resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - lightningcss-linux-x64-gnu@1.29.1: - resolution: {integrity: sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==} + lightningcss-linux-x64-gnu@1.30.2: + resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - lightningcss-linux-x64-musl@1.29.1: - resolution: {integrity: sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==} + lightningcss-linux-x64-musl@1.30.2: + resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - lightningcss-win32-arm64-msvc@1.29.1: - resolution: {integrity: sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==} + lightningcss-win32-arm64-msvc@1.30.2: + resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.29.1: - resolution: {integrity: sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==} + lightningcss-win32-x64-msvc@1.30.2: + resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.29.1: - resolution: {integrity: sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==} + lightningcss@1.30.2: + resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} engines: {node: '>= 12.0.0'} + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lucide-react@0.474.0: - resolution: {integrity: sha512-CmghgHkh0OJNmxGKWc0qfPJCYHASPMVSyGY8fj3xgk4v84ItqDg64JNKFZn5hC6E0vHi6gxnbCgwhyVB09wQtA==} + lucide-react@0.562.0: + resolution: {integrity: sha512-82hOAu7y0dbVuFfmO4bYF1XEwYk/mEbM5E+b1jgci/udUBEE/R7LF5Ip0CCEmXe8AybRM8L+04eP+LGZeDvkiw==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.8: - resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - next-themes@0.4.4: - resolution: {integrity: sha512-LDQ2qIOJF0VnuVrrMSMLrWGjRMkq+0mpgl6e0juCLqdJ+oo8Q84JRWT6Wh11VDQKkMMe+dVzDKLWs5n87T+PkQ==} + next-themes@0.4.6: + resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} peerDependencies: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - postcss@8.5.1: - resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + playwright-core@1.57.0: + resolution: {integrity: sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.57.0: + resolution: {integrity: sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==} + engines: {node: '>=18'} + hasBin: true + + postcss-loader@8.2.0: + resolution: {integrity: sha512-tHX+RkpsXVcc7st4dSdDGliI+r4aAQDuv+v3vFYHixb6YgjreG5AG4SEB0kDK8u2s6htqEEpKlkhSBUTvWKYnA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + postcss: ^7.0.0 || ^8.0.1 + webpack: ^5.0.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - react-dom@19.0.0: - resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} + preact@10.28.2: + resolution: {integrity: sha512-lbteaWGzGHdlIuiJ0l2Jq454m6kcpI1zNje6d8MlGAFlYvP2GO4ibnat7P74Esfz4sPTdM6UxtTwh/d3pwM9JA==} + + prettier@3.7.4: + resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==} + engines: {node: '>=14'} + hasBin: true + + react-dom@19.2.3: + resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==} + peerDependencies: + react: ^19.2.3 + + react-intersection-observer@10.0.0: + resolution: {integrity: sha512-JJRgcnFQoVXmbE5+GXr1OS1NDD1gHk0HyfpLcRf0575IbJz+io8yzs4mWVlfaqOQq1FiVjLvuYAdEEcrrCfveg==} peerDependencies: - react: ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + react-dom: + optional: true react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react-refresh@0.14.2: - resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + react-refresh@0.18.0: + resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} engines: {node: '>=0.10.0'} - react@19.0.0: - resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} - engines: {node: '>=0.10.0'} + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + react-remove-scroll@2.7.2: + resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - rollup@4.34.5: - resolution: {integrity: sha512-GyVCmpo9z/HYqFD8QWoBUnz1Q9xC22t8tPAZm/AvAcUg2U2/+DkboEvSioMwv042zE4I9N3FEhx7fiCT2YHzKQ==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} + react-scan@0.4.3: + resolution: {integrity: sha512-jhAQuQ1nja6HUYrSpbmNFHqZPsRCXk8Yqu0lHoRIw9eb8N96uTfXCpVyQhTTnJ/nWqnwuvxbpKVG/oWZT8+iTQ==} hasBin: true + peerDependencies: + '@remix-run/react': '>=1.0.0' + next: '>=13.0.0' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-router: ^5.0.0 || ^6.0.0 || ^7.0.0 + react-router-dom: ^5.0.0 || ^6.0.0 || ^7.0.0 + peerDependenciesMeta: + '@remix-run/react': + optional: true + next: + optional: true + react-router: + optional: true + react-router-dom: + optional: true + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react@19.2.3: + resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} + engines: {node: '>=0.10.0'} + + reduce-configs@1.1.1: + resolution: {integrity: sha512-EYtsVGAQarE8daT54cnaY1PIknF2VB78ug6Zre2rs36EsJfC40EG6hmTU2A2P1ZuXnKAt2KI0fzOGHcX7wzdPw==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} rtl-css-js@1.16.1: resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} - scheduler@0.25.0: - resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - sonner@1.7.4: - resolution: {integrity: sha512-DIS8z4PfJRbIyfVFDVnK9rO3eYDtse4Omcm6bt0oEr5/jtLgysmjuBl1frJ9E/EQZrFmKx2A8m/s5s9CRXIzhw==} + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + ses@1.14.0: + resolution: {integrity: sha512-T07hNgOfVRTLZGwSS50RnhqrG3foWP+rM+Q5Du4KUQyMLFI3A8YA4RKl0jjZzhihC1ZvDGrWi/JMn4vqbgr/Jg==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + sonner@2.0.7: + resolution: {integrity: sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==} peerDependencies: react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc @@ -1433,1703 +2342,2351 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + stylis@4.3.6: resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} - tabster@8.4.0: - resolution: {integrity: sha512-OMiLKtIBKrpuKLL06SzF/58fvyounm+BVGphSa5fbVW96J5MjQQirP8gkDL0whRPtkseswrbtDu6OnhVSIEF9A==} + tabster@8.7.0: + resolution: {integrity: sha512-AKYquti8AdWzuqJdQo4LUMQDZrHoYQy6V+8yUq2PmgLZV10EaB+8BD0nWOfC/3TBp4mPNg4fbHkz6SFtkr0PpA==} - tailwind-merge@3.0.1: - resolution: {integrity: sha512-AvzE8FmSoXC7nC+oU5GlQJbip2UO7tmOhOfQyOmPhrStOGXHU08j8mZEHZ4BmCqY5dWTCo4ClWkNyRNx1wpT0g==} + tailwind-merge@3.4.0: + resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} tailwindcss-animate@1.0.7: resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} peerDependencies: tailwindcss: '>=3.0.0 || insiders' - tailwindcss@4.0.4: - resolution: {integrity: sha512-/ezDLEkOLf1lXkr9F2iI5BHJbexJpty5zkV2B8bGHCqAdbc9vk85Jgdkq+ZOvNkNPa3yAaqJ8DjRt584Bc84kw==} + tailwindcss@4.1.18: + resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - typescript@5.7.3: - resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true - undici-types@6.20.0: - resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - update-browserslist-db@1.1.2: - resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} + unplugin@2.1.0: + resolution: {integrity: sha512-us4j03/499KhbGP8BU7Hrzrgseo+KdfJYWcbcajCOqsAyb8Gk0Yn2kiUIcZISYCb1JFaZfIuG3b42HmguVOKCQ==} + engines: {node: '>=18.12.0'} + + upath@2.0.1: + resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} + engines: {node: '>=4'} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' - use-disposable@1.0.4: - resolution: {integrity: sha512-j83t6AMLWUyb5zwlTDqf6dP9LezM9R0yTbI/b6olmdaGtCKQUe9pgJWV6dRaaQLcozypjIEp4EmZr2DkZGKLSg==} - peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.8.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' - - use-sync-external-store@1.4.0: - resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - vite@6.1.0: - resolution: {integrity: sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: '>=1.21.0' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: + '@types/react': optional: true + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yaml@2.7.0: - resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} - engines: {node: '>= 14'} - hasBin: true - snapshots: '@alloc/quick-lru@5.2.0': {} - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - - '@babel/code-frame@7.26.2': + '@babel/code-frame@7.27.1': dependencies: - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.26.5': {} + '@babel/compat-data@7.28.5': {} - '@babel/core@7.26.7': + '@babel/core@7.28.5': dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.5 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.7) - '@babel/helpers': 7.26.7 - '@babel/parser': 7.26.7 - '@babel/template': 7.25.9 - '@babel/traverse': 7.26.7 - '@babel/types': 7.26.7 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.0 + debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.26.5': + '@babel/generator@7.28.5': dependencies: - '@babel/parser': 7.26.7 - '@babel/types': 7.26.7 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/helper-compilation-targets@7.26.5': + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.5 + + '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.4 + '@babel/compat-data': 7.28.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.1 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-module-imports@7.25.9': + '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.5 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-member-expression-to-functions@7.28.5': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.28.5 + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.4': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + + '@babel/plugin-proposal-decorators@7.28.0(@babel/core@7.28.5)': dependencies: - '@babel/traverse': 7.26.7 - '@babel/types': 7.26.7 + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.28.5) transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.7)': + '@babel/plugin-syntax-decorators@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.7 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.7 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/helper-plugin-utils@7.26.5': {} + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color - '@babel/helper-string-parser@7.25.9': {} + '@babel/plugin-transform-typescript@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color - '@babel/helper-validator-identifier@7.25.9': {} + '@babel/preset-typescript@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + + '@babel/runtime@7.28.4': {} + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + + '@babel/traverse@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color - '@babel/helper-validator-option@7.25.9': {} + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 - '@babel/helpers@7.26.7': + '@clack/core@0.3.5': dependencies: - '@babel/template': 7.25.9 - '@babel/types': 7.26.7 + picocolors: 1.1.1 + sisteransi: 1.0.5 - '@babel/parser@7.26.7': + '@clack/prompts@0.8.2': dependencies: - '@babel/types': 7.26.7 + '@clack/core': 0.3.5 + picocolors: 1.1.1 + sisteransi: 1.0.5 + + '@ctrl/tinycolor@3.6.1': {} + + '@emnapi/core@1.8.1': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.8.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emotion/hash@0.9.2': {} + + '@endo/cache-map@1.1.0': {} + + '@endo/env-options@1.1.11': {} + + '@endo/immutable-arraybuffer@1.1.2': {} + + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/aix-ppc64@0.27.2': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.27.2': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-arm@0.27.2': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/android-x64@0.27.2': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.27.2': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.27.2': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.27.2': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.27.2': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.27.2': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + + '@esbuild/linux-arm@0.27.2': + optional: true - '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.7)': - dependencies: - '@babel/core': 7.26.7 - '@babel/helper-plugin-utils': 7.26.5 + '@esbuild/linux-ia32@0.25.12': + optional: true - '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.7)': - dependencies: - '@babel/core': 7.26.7 - '@babel/helper-plugin-utils': 7.26.5 + '@esbuild/linux-ia32@0.27.2': + optional: true - '@babel/runtime@7.26.7': - dependencies: - regenerator-runtime: 0.14.1 + '@esbuild/linux-loong64@0.25.12': + optional: true - '@babel/template@7.25.9': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.7 - '@babel/types': 7.26.7 + '@esbuild/linux-loong64@0.27.2': + optional: true - '@babel/traverse@7.26.7': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.5 - '@babel/parser': 7.26.7 - '@babel/template': 7.25.9 - '@babel/types': 7.26.7 - debug: 4.4.0 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color + '@esbuild/linux-mips64el@0.25.12': + optional: true - '@babel/types@7.26.7': - dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 + '@esbuild/linux-mips64el@0.27.2': + optional: true - '@emotion/hash@0.9.2': {} + '@esbuild/linux-ppc64@0.25.12': + optional: true - '@esbuild/aix-ppc64@0.24.2': + '@esbuild/linux-ppc64@0.27.2': optional: true - '@esbuild/android-arm64@0.24.2': + '@esbuild/linux-riscv64@0.25.12': optional: true - '@esbuild/android-arm@0.24.2': + '@esbuild/linux-riscv64@0.27.2': optional: true - '@esbuild/android-x64@0.24.2': + '@esbuild/linux-s390x@0.25.12': optional: true - '@esbuild/darwin-arm64@0.24.2': + '@esbuild/linux-s390x@0.27.2': optional: true - '@esbuild/darwin-x64@0.24.2': + '@esbuild/linux-x64@0.25.12': optional: true - '@esbuild/freebsd-arm64@0.24.2': + '@esbuild/linux-x64@0.27.2': optional: true - '@esbuild/freebsd-x64@0.24.2': + '@esbuild/netbsd-arm64@0.25.12': optional: true - '@esbuild/linux-arm64@0.24.2': + '@esbuild/netbsd-arm64@0.27.2': optional: true - '@esbuild/linux-arm@0.24.2': + '@esbuild/netbsd-x64@0.25.12': optional: true - '@esbuild/linux-ia32@0.24.2': + '@esbuild/netbsd-x64@0.27.2': optional: true - '@esbuild/linux-loong64@0.24.2': + '@esbuild/openbsd-arm64@0.25.12': optional: true - '@esbuild/linux-mips64el@0.24.2': + '@esbuild/openbsd-arm64@0.27.2': optional: true - '@esbuild/linux-ppc64@0.24.2': + '@esbuild/openbsd-x64@0.25.12': optional: true - '@esbuild/linux-riscv64@0.24.2': + '@esbuild/openbsd-x64@0.27.2': optional: true - '@esbuild/linux-s390x@0.24.2': + '@esbuild/openharmony-arm64@0.25.12': optional: true - '@esbuild/linux-x64@0.24.2': + '@esbuild/openharmony-arm64@0.27.2': optional: true - '@esbuild/netbsd-arm64@0.24.2': + '@esbuild/sunos-x64@0.25.12': optional: true - '@esbuild/netbsd-x64@0.24.2': + '@esbuild/sunos-x64@0.27.2': optional: true - '@esbuild/openbsd-arm64@0.24.2': + '@esbuild/win32-arm64@0.25.12': optional: true - '@esbuild/openbsd-x64@0.24.2': + '@esbuild/win32-arm64@0.27.2': optional: true - '@esbuild/sunos-x64@0.24.2': + '@esbuild/win32-ia32@0.25.12': optional: true - '@esbuild/win32-arm64@0.24.2': + '@esbuild/win32-ia32@0.27.2': optional: true - '@esbuild/win32-ia32@0.24.2': + '@esbuild/win32-x64@0.25.12': optional: true - '@esbuild/win32-x64@0.24.2': + '@esbuild/win32-x64@0.27.2': optional: true - '@floating-ui/core@1.6.9': + '@floating-ui/core@1.7.3': dependencies: - '@floating-ui/utils': 0.2.9 + '@floating-ui/utils': 0.2.10 - '@floating-ui/devtools@0.2.1(@floating-ui/dom@1.6.13)': + '@floating-ui/devtools@0.2.3(@floating-ui/dom@1.7.4)': dependencies: - '@floating-ui/dom': 1.6.13 + '@floating-ui/dom': 1.7.4 - '@floating-ui/dom@1.6.13': + '@floating-ui/dom@1.7.4': dependencies: - '@floating-ui/core': 1.6.9 - '@floating-ui/utils': 0.2.9 + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 - '@floating-ui/utils@0.2.9': {} + '@floating-ui/react-dom@2.1.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@floating-ui/dom': 1.7.4 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@floating-ui/utils@0.2.10': {} '@fluentui/keyboard-keys@9.0.8': dependencies: - '@swc/helpers': 0.5.15 - - '@fluentui/priority-overflow@9.1.14': - dependencies: - '@swc/helpers': 0.5.15 - - '@fluentui/react-accordion@9.5.14(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-aria': 9.13.14(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-motion': 9.6.7(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-motion-components-preview': 0.4.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@swc/helpers': 0.5.18 + + '@fluentui/priority-overflow@9.2.1': + dependencies: + '@swc/helpers': 0.5.18 + + '@fluentui/react-accordion@9.8.15(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': + dependencies: + '@fluentui/react-aria': 9.17.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-context-selector': 9.2.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-motion': 9.11.5(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-motion-components-preview': 0.14.2(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-alert@9.0.0-beta.124(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-avatar': 9.6.50(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-button': 9.3.102(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-alert@9.0.0-beta.131(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': + dependencies: + '@fluentui/react-avatar': 9.9.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-button': 9.7.1(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-aria@9.13.14(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@fluentui/react-aria@9.17.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - '@fluentui/react-avatar@9.6.50(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-badge': 9.2.50(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-popover': 9.9.32(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-tooltip': 9.5.5(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@fluentui/react-avatar@9.9.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': + dependencies: + '@fluentui/react-badge': 9.4.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-context-selector': 9.2.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-popover': 9.12.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-tooltip': 9.8.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-badge@9.2.50(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - '@fluentui/react-breadcrumb@9.0.52(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@fluentui/react-aria': 9.13.14(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-button': 9.3.102(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-link': 9.3.7(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - '@fluentui/react-button@9.3.102(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@fluentui/react-badge@9.4.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@fluentui/react-breadcrumb@9.3.14(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@fluentui/react-aria': 9.17.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-button': 9.7.1(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-link': 9.7.1(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@fluentui/react-button@9.7.1(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.13.14(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - '@fluentui/react-card@9.0.104(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@fluentui/react-aria': 9.17.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@fluentui/react-card@9.5.8(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-text': 9.4.32(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - '@fluentui/react-carousel@9.4.7(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-aria': 9.13.14(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-button': 9.3.102(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - embla-carousel: 8.5.2 - embla-carousel-autoplay: 8.5.2(embla-carousel@8.5.2) - embla-carousel-fade: 8.5.2(embla-carousel@8.5.2) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-text': 9.6.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@fluentui/react-carousel@9.9.0(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': + dependencies: + '@fluentui/react-aria': 9.17.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-button': 9.7.1(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-context-selector': 9.2.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-tooltip': 9.8.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + embla-carousel: 8.6.0 + embla-carousel-autoplay: 8.6.0(embla-carousel@8.6.0) + embla-carousel-fade: 8.6.0(embla-carousel@8.6.0) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + transitivePeerDependencies: + - scheduler + + '@fluentui/react-checkbox@9.5.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': + dependencies: + '@fluentui/react-field': 9.4.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-label': 9.3.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-checkbox@9.2.47(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-field': 9.1.86(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-label': 9.1.83(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-color-picker@9.2.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': + dependencies: + '@ctrl/tinycolor': 3.6.1 + '@fluentui/react-context-selector': 9.2.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-combobox@9.13.18(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': + '@fluentui/react-combobox@9.16.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.13.14(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-field': 9.1.86(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-portal': 9.4.42(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-positioning': 9.16.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-aria': 9.17.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-context-selector': 9.2.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-field': 9.4.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-portal': 9.8.9(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-positioning': 9.20.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-components@9.58.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-accordion': 9.5.14(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-alert': 9.0.0-beta.124(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-aria': 9.13.14(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-avatar': 9.6.50(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-badge': 9.2.50(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-breadcrumb': 9.0.52(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-button': 9.3.102(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-card': 9.0.104(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-carousel': 9.4.7(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-checkbox': 9.2.47(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-combobox': 9.13.18(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-dialog': 9.11.31(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-divider': 9.2.82(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-drawer': 9.6.11(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-field': 9.1.86(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-image': 9.1.80(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-infobutton': 9.0.0-beta.102(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-infolabel': 9.0.57(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-input': 9.4.99(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-label': 9.1.83(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-link': 9.3.7(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-list': 9.0.2(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-menu': 9.15.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-message-bar': 9.3.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-motion': 9.6.7(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-overflow': 9.2.8(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-persona': 9.2.109(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-popover': 9.9.32(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-portal': 9.4.42(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-positioning': 9.16.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-progress': 9.1.97(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-provider': 9.19.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-radio': 9.2.42(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-rating': 9.0.28(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-search': 9.0.29(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-select': 9.1.97(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-skeleton': 9.1.26(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-slider': 9.2.7(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-spinbutton': 9.2.98(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-spinner': 9.5.7(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-swatch-picker': 9.1.20(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-switch': 9.1.104(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-table': 9.15.29(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-tabs': 9.6.7(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-tag-picker': 9.4.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-tags': 9.3.30(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-teaching-popover': 9.2.4(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-text': 9.4.32(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-textarea': 9.3.98(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-toast': 9.3.65(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-toolbar': 9.2.18(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-tooltip': 9.5.5(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-tree': 9.9.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-virtualizer': 9.0.0-alpha.92(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-components@9.72.9(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': + dependencies: + '@fluentui/react-accordion': 9.8.15(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-alert': 9.0.0-beta.131(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-aria': 9.17.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-avatar': 9.9.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-badge': 9.4.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-breadcrumb': 9.3.14(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-button': 9.7.1(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-card': 9.5.8(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-carousel': 9.9.0(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-checkbox': 9.5.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-color-picker': 9.2.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-combobox': 9.16.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-dialog': 9.16.5(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-divider': 9.5.1(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-drawer': 9.11.1(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-field': 9.4.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-image': 9.3.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-infobutton': 9.0.0-beta.108(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-infolabel': 9.4.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-input': 9.7.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-label': 9.3.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-link': 9.7.1(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-list': 9.6.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-menu': 9.20.6(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-message-bar': 9.6.16(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-motion': 9.11.5(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-nav': 9.3.16(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-overflow': 9.6.6(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-persona': 9.5.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-popover': 9.12.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-portal': 9.8.9(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-positioning': 9.20.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-progress': 9.4.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-provider': 9.22.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-radio': 9.5.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-rating': 9.3.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-search': 9.3.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-select': 9.4.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-skeleton': 9.4.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-slider': 9.5.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-spinbutton': 9.5.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-spinner': 9.7.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-swatch-picker': 9.4.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-switch': 9.5.1(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-table': 9.19.6(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-tabs': 9.10.8(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-tag-picker': 9.7.14(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-tags': 9.7.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-teaching-popover': 9.6.14(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-text': 9.6.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-textarea': 9.6.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-toast': 9.7.10(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-toolbar': 9.6.14(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-tooltip': 9.8.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-tree': 9.15.8(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-virtualizer': 9.0.0-alpha.108(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-context-selector@9.1.72(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': + '@fluentui/react-context-selector@9.2.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': dependencies: - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - scheduler: 0.25.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + scheduler: 0.27.0 - '@fluentui/react-dialog@9.11.31(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': + '@fluentui/react-dialog@9.16.5(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.13.14(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-motion': 9.6.7(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-motion-components-preview': 0.4.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-portal': 9.4.42(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-aria': 9.17.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-context-selector': 9.2.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-motion': 9.11.5(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-motion-components-preview': 0.14.2(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-portal': 9.8.9(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-divider@9.2.82(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - '@fluentui/react-drawer@9.6.11(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-dialog': 9.11.31(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-motion': 9.6.7(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-portal': 9.4.42(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-divider@9.5.1(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@fluentui/react-drawer@9.11.1(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': + dependencies: + '@fluentui/react-dialog': 9.16.5(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-motion': 9.11.5(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-motion-components-preview': 0.14.2(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-portal': 9.8.9(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-field@9.1.86(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-label': 9.1.83(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-field@9.4.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': + dependencies: + '@fluentui/react-context-selector': 9.2.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-label': 9.3.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-icons@2.0.274(react@19.0.0)': + '@fluentui/react-icons@2.0.316(react@19.2.3)': dependencies: - '@griffel/react': 1.5.29(react@19.0.0) - react: 19.0.0 + '@griffel/react': 1.5.32(react@19.2.3) + react: 19.2.3 tslib: 2.8.1 - '@fluentui/react-image@9.1.80(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - '@fluentui/react-infobutton@9.0.0-beta.102(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-label': 9.1.83(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-popover': 9.9.32(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-image@9.3.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@fluentui/react-infobutton@9.0.0-beta.108(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': + dependencies: + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-label': 9.3.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-popover': 9.12.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-infolabel@9.0.57(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-label': 9.1.83(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-popover': 9.9.32(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-infolabel@9.4.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': + dependencies: + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-label': 9.3.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-popover': 9.12.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-input@9.4.99(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-field': 9.1.86(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-input@9.7.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': + dependencies: + '@fluentui/react-field': 9.4.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-jsx-runtime@9.0.50(@types/react@19.0.8)(react@19.0.0)': + '@fluentui/react-jsx-runtime@9.3.4(@types/react@19.2.8)(react@19.2.3)': dependencies: - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - react: 19.0.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + react: 19.2.3 react-is: 17.0.2 - '@fluentui/react-label@9.1.83(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@fluentui/react-label@9.3.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) - '@fluentui/react-link@9.3.7(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@fluentui/react-link@9.7.1(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - '@fluentui/react-list@9.0.2(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@fluentui/react-list@9.6.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-checkbox': 9.2.47(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-checkbox': 9.5.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-context-selector': 9.2.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-menu@9.15.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': + '@fluentui/react-menu@9.20.6(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.13.14(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-portal': 9.4.42(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-positioning': 9.16.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-aria': 9.17.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-context-selector': 9.2.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-portal': 9.8.9(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-positioning': 9.20.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-message-bar@9.3.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@fluentui/react-button': 9.3.102(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-link': 9.3.7(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-motion': 9.6.7(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-motion-components-preview': 0.4.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - '@fluentui/react-motion-components-preview@0.4.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@fluentui/react-motion': 9.6.7(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - '@fluentui/react-motion@9.6.7(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - react-is: 17.0.2 + '@fluentui/react-message-bar@9.6.16(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@fluentui/react-button': 9.7.1(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-link': 9.7.1(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-motion': 9.11.5(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-motion-components-preview': 0.14.2(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@fluentui/react-motion-components-preview@0.14.2(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@fluentui/react-motion': 9.11.5(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@fluentui/react-motion@9.11.5(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@fluentui/react-nav@9.3.16(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': + dependencies: + '@fluentui/react-aria': 9.17.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-button': 9.7.1(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-context-selector': 9.2.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-divider': 9.5.1(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-drawer': 9.11.1(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-motion': 9.11.5(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-motion-components-preview': 0.14.2(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-tooltip': 9.8.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + transitivePeerDependencies: + - scheduler - '@fluentui/react-overflow@9.2.8(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': - dependencies: - '@fluentui/priority-overflow': 9.1.14 - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-overflow@9.6.6(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': + dependencies: + '@fluentui/priority-overflow': 9.2.1 + '@fluentui/react-context-selector': 9.2.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-persona@9.2.109(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-avatar': 9.6.50(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-badge': 9.2.50(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-persona@9.5.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': + dependencies: + '@fluentui/react-avatar': 9.9.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-badge': 9.4.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-popover@9.9.32(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': + '@fluentui/react-popover@9.12.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.13.14(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-portal': 9.4.42(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-positioning': 9.16.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-aria': 9.17.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-context-selector': 9.2.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-portal': 9.8.9(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-positioning': 9.20.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-portal@9.4.42(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - use-disposable: 1.0.4(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - - '@fluentui/react-positioning@9.16.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@floating-ui/devtools': 0.2.1(@floating-ui/dom@1.6.13) - '@floating-ui/dom': 1.6.13 - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - '@fluentui/react-progress@9.1.97(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-field': 9.1.86(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-portal@9.8.9(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@fluentui/react-positioning@9.20.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@floating-ui/devtools': 0.2.3(@floating-ui/dom@1.7.4) + '@floating-ui/dom': 1.7.4 + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + use-sync-external-store: 1.6.0(react@19.2.3) + + '@fluentui/react-progress@9.4.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': + dependencies: + '@fluentui/react-field': 9.4.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-provider@9.19.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/core': 1.19.1 - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - '@fluentui/react-radio@9.2.42(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-field': 9.1.86(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-label': 9.1.83(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-provider@9.22.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/core': 1.19.2 + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@fluentui/react-radio@9.5.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': + dependencies: + '@fluentui/react-field': 9.4.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-label': 9.3.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-rating@9.0.28(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - '@fluentui/react-search@9.0.29(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-input': 9.4.99(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-rating@9.3.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@fluentui/react-search@9.3.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': + dependencies: + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-input': 9.7.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-select@9.1.97(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-field': 9.1.86(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-select@9.4.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': + dependencies: + '@fluentui/react-field': 9.4.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-shared-contexts@9.21.2(@types/react@19.0.8)(react@19.0.0)': - dependencies: - '@fluentui/react-theme': 9.1.24 - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - react: 19.0.0 - - '@fluentui/react-skeleton@9.1.26(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-field': 9.1.86(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-shared-contexts@9.26.0(@types/react@19.2.8)(react@19.2.3)': + dependencies: + '@fluentui/react-theme': 9.2.0 + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + react: 19.2.3 + + '@fluentui/react-skeleton@9.4.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': + dependencies: + '@fluentui/react-field': 9.4.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-slider@9.2.7(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-field': 9.1.86(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-slider@9.5.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': + dependencies: + '@fluentui/react-field': 9.4.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-spinbutton@9.2.98(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': + '@fluentui/react-spinbutton@9.5.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-field': 9.1.86(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-field': 9.4.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-spinner@9.5.7(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-label': 9.1.83(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - '@fluentui/react-swatch-picker@9.1.20(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-field': 9.1.86(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-spinner@9.7.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-label': 9.3.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@fluentui/react-swatch-picker@9.4.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': + dependencies: + '@fluentui/react-context-selector': 9.2.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-field': 9.4.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-switch@9.1.104(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-field': 9.1.86(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-label': 9.1.83(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-switch@9.5.1(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': + dependencies: + '@fluentui/react-field': 9.4.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-label': 9.3.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-table@9.15.29(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': + '@fluentui/react-table@9.19.6(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.13.14(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-avatar': 9.6.50(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-checkbox': 9.2.47(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-radio': 9.2.42(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-aria': 9.17.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-avatar': 9.9.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-checkbox': 9.5.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-context-selector': 9.2.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-radio': 9.5.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-tabs@9.6.7(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-tabs@9.10.8(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': + dependencies: + '@fluentui/react-context-selector': 9.2.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-tabster@9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@fluentui/react-tabster@9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) keyborg: 2.6.0 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - tabster: 8.4.0 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + tabster: 8.7.0 - '@fluentui/react-tag-picker@9.4.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': + '@fluentui/react-tag-picker@9.7.14(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.13.14(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-combobox': 9.13.18(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-field': 9.1.86(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-portal': 9.4.42(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-positioning': 9.16.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-tags': 9.3.30(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-aria': 9.17.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-combobox': 9.16.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-context-selector': 9.2.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-field': 9.4.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-portal': 9.8.9(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-positioning': 9.20.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-tags': 9.7.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-tags@9.3.30(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': + '@fluentui/react-tags@9.7.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.13.14(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-avatar': 9.6.50(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-aria': 9.17.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-avatar': 9.9.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-teaching-popover@9.2.4(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-aria': 9.13.14(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-button': 9.3.102(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-popover': 9.9.32(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - use-sync-external-store: 1.4.0(react@19.0.0) + '@fluentui/react-teaching-popover@9.6.14(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': + dependencies: + '@fluentui/react-aria': 9.17.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-button': 9.7.1(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-context-selector': 9.2.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-popover': 9.12.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + use-sync-external-store: 1.6.0(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-text@9.4.32(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - '@fluentui/react-textarea@9.3.98(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-field': 9.1.86(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-text@9.6.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@fluentui/react-textarea@9.6.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': + dependencies: + '@fluentui/react-field': 9.4.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-theme@9.1.24': + '@fluentui/react-theme@9.2.0': dependencies: - '@fluentui/tokens': 1.0.0-alpha.21 - '@swc/helpers': 0.5.15 + '@fluentui/tokens': 1.0.0-alpha.22 + '@swc/helpers': 0.5.18 - '@fluentui/react-toast@9.3.65(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@fluentui/react-toast@9.7.10(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.13.14(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-motion': 9.6.7(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-motion-components-preview': 0.4.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-portal': 9.4.42(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - '@fluentui/react-toolbar@9.2.18(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': - dependencies: - '@fluentui/react-button': 9.3.102(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-divider': 9.2.82(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-radio': 9.2.42(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-aria': 9.17.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-motion': 9.11.5(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-motion-components-preview': 0.14.2(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-portal': 9.8.9(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@fluentui/react-toolbar@9.6.14(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': + dependencies: + '@fluentui/react-button': 9.7.1(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-context-selector': 9.2.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-divider': 9.5.1(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-radio': 9.5.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-tooltip@9.5.5(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@fluentui/react-tooltip@9.8.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-portal': 9.4.42(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-positioning': 9.16.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - '@fluentui/react-tree@9.9.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0)': + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-portal': 9.8.9(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-positioning': 9.20.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@fluentui/react-tree@9.15.8(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-aria': 9.13.14(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-avatar': 9.6.50(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-button': 9.3.102(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-checkbox': 9.2.47(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-context-selector': 9.1.72(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-icons': 2.0.274(react@19.0.0) - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-motion': 9.6.7(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-motion-components-preview': 0.4.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-radio': 9.2.42(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(scheduler@0.25.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-tabster': 9.23.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@fluentui/react-theme': 9.1.24 - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-aria': 9.17.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-avatar': 9.9.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-button': 9.7.1(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-checkbox': 9.5.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-context-selector': 9.2.13(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-icons': 2.0.316(react@19.2.3) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-motion': 9.11.5(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-motion-components-preview': 0.14.2(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-radio': 9.5.12(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(scheduler@0.27.0) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-tabster': 9.26.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@fluentui/react-theme': 9.2.0 + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - scheduler - '@fluentui/react-utilities@9.18.20(@types/react@19.0.8)(react@19.0.0)': + '@fluentui/react-utilities@9.26.0(@types/react@19.2.8)(react@19.2.3)': dependencies: '@fluentui/keyboard-keys': 9.0.8 - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - react: 19.0.0 + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + react: 19.2.3 - '@fluentui/react-virtualizer@9.0.0-alpha.92(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@fluentui/react-virtualizer@9.0.0-alpha.108(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - '@fluentui/react-jsx-runtime': 9.0.50(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-shared-contexts': 9.21.2(@types/react@19.0.8)(react@19.0.0) - '@fluentui/react-utilities': 9.18.20(@types/react@19.0.8)(react@19.0.0) - '@griffel/react': 1.5.29(react@19.0.0) - '@swc/helpers': 0.5.15 - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@fluentui/react-jsx-runtime': 9.3.4(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-shared-contexts': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@fluentui/react-utilities': 9.26.0(@types/react@19.2.8)(react@19.2.3) + '@griffel/react': 1.5.32(react@19.2.3) + '@swc/helpers': 0.5.18 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) - '@fluentui/tokens@1.0.0-alpha.21': + '@fluentui/tokens@1.0.0-alpha.22': dependencies: - '@swc/helpers': 0.5.15 + '@swc/helpers': 0.5.18 - '@griffel/core@1.19.1': + '@griffel/core@1.19.2': dependencies: '@emotion/hash': 0.9.2 '@griffel/style-types': 1.3.0 - csstype: 3.1.3 + csstype: 3.2.3 rtl-css-js: 1.16.1 stylis: 4.3.6 tslib: 2.8.1 - '@griffel/react@1.5.29(react@19.0.0)': + '@griffel/react@1.5.32(react@19.2.3)': dependencies: - '@griffel/core': 1.19.1 - react: 19.0.0 + '@griffel/core': 1.19.2 + react: 19.2.3 tslib: 2.8.1 '@griffel/style-types@1.3.0': dependencies: - csstype: 3.1.3 + csstype: 3.2.3 - '@jridgewell/gen-mapping@0.3.8': + '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/set-array@1.2.1': {} + '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.25': + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@module-federation/error-codes@0.22.0': {} + + '@module-federation/runtime-core@0.22.0': + dependencies: + '@module-federation/error-codes': 0.22.0 + '@module-federation/sdk': 0.22.0 + + '@module-federation/runtime-tools@0.22.0': + dependencies: + '@module-federation/runtime': 0.22.0 + '@module-federation/webpack-bundler-runtime': 0.22.0 - '@radix-ui/react-compose-refs@1.1.1(@types/react@19.0.8)(react@19.0.0)': + '@module-federation/runtime@0.22.0': dependencies: - react: 19.0.0 + '@module-federation/error-codes': 0.22.0 + '@module-federation/runtime-core': 0.22.0 + '@module-federation/sdk': 0.22.0 + + '@module-federation/sdk@0.22.0': {} + + '@module-federation/webpack-bundler-runtime@0.22.0': + dependencies: + '@module-federation/runtime': 0.22.0 + '@module-federation/sdk': 0.22.0 + + '@napi-rs/wasm-runtime@1.0.7': + dependencies: + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@pivanov/utils@0.0.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@preact/signals-core@1.12.1': {} + + '@preact/signals@1.3.2(preact@10.28.2)': + dependencies: + '@preact/signals-core': 1.12.1 + preact: 10.28.2 + + '@radix-ui/number@1.1.1': {} + + '@radix-ui/primitive@1.1.3': {} + + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) optionalDependencies: - '@types/react': 19.0.8 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) - '@radix-ui/react-slot@1.1.2(@types/react@19.0.8)(react@19.0.0)': + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.8)(react@19.0.0) - react: 19.0.0 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.8)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) optionalDependencies: - '@types/react': 19.0.8 + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) - '@rollup/rollup-android-arm-eabi@4.34.5': - optional: true + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.8)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.8 - '@rollup/rollup-android-arm64@4.34.5': - optional: true + '@radix-ui/react-context@1.1.2(@types/react@19.2.8)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.8 - '@rollup/rollup-darwin-arm64@4.34.5': - optional: true + '@radix-ui/react-direction@1.1.1(@types/react@19.2.8)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.8 - '@rollup/rollup-darwin-x64@4.34.5': - optional: true + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.8)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) - '@rollup/rollup-freebsd-arm64@4.34.5': - optional: true + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.8)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.8 - '@rollup/rollup-freebsd-x64@4.34.5': - optional: true + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.8)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) - '@rollup/rollup-linux-arm-gnueabihf@4.34.5': - optional: true + '@radix-ui/react-id@1.1.1(@types/react@19.2.8)(react@19.2.3)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.8)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.8 + + '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.8)(react@19.2.3) + aria-hidden: 1.2.6 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + react-remove-scroll: 2.7.2(@types/react@19.2.8)(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@floating-ui/react-dom': 2.1.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/rect': 1.1.1 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) - '@rollup/rollup-linux-arm-musleabihf@4.34.5': - optional: true + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.8)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.8)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.8)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + + '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-slot': 1.2.4(@types/react@19.2.8)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + + '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + aria-hidden: 1.2.6 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + react-remove-scroll: 2.7.2(@types/react@19.2.8)(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + + '@radix-ui/react-separator@1.1.8(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + + '@radix-ui/react-slot@1.2.3(@types/react@19.2.8)(react@19.2.3)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.8)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.8 + + '@radix-ui/react-slot@1.2.4(@types/react@19.2.8)(react@19.2.3)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.8)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.8 + + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.8)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.8 + + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.8)(react@19.2.3)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.8)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.8 + + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.8)(react@19.2.3)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.8)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.8 + + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.8)(react@19.2.3)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.8)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.8 + + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.8)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.8 + + '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.8)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.8 + + '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.8)(react@19.2.3)': + dependencies: + '@radix-ui/rect': 1.1.1 + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.8 + + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.8)(react@19.2.3)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.8)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.8 + + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + + '@radix-ui/rect@1.1.1': {} - '@rollup/rollup-linux-arm64-gnu@4.34.5': + '@rollup/pluginutils@5.3.0': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + + '@rollup/rollup-linux-x64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-arm64-musl@4.34.5': + '@rsbuild/core@1.7.2': + dependencies: + '@rspack/core': 1.7.1(@swc/helpers@0.5.18) + '@rspack/lite-tapable': 1.1.0 + '@swc/helpers': 0.5.18 + core-js: 3.47.0 + jiti: 2.6.1 + + '@rsbuild/plugin-babel@1.0.6(@rsbuild/core@1.7.2)': + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.5) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.5) + '@babel/preset-typescript': 7.28.5(@babel/core@7.28.5) + '@rsbuild/core': 1.7.2 + '@types/babel__core': 7.20.5 + deepmerge: 4.3.1 + reduce-configs: 1.1.1 + upath: 2.0.1 + transitivePeerDependencies: + - supports-color + + '@rsbuild/plugin-react@1.4.2(@rsbuild/core@1.7.2)': + dependencies: + '@rsbuild/core': 1.7.2 + '@rspack/plugin-react-refresh': 1.6.0(react-refresh@0.18.0) + react-refresh: 0.18.0 + transitivePeerDependencies: + - webpack-hot-middleware + + '@rspack/binding-darwin-arm64@1.7.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.34.5': + '@rspack/binding-darwin-x64@1.7.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.34.5': + '@rspack/binding-linux-arm64-gnu@1.7.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.34.5': + '@rspack/binding-linux-arm64-musl@1.7.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.34.5': + '@rspack/binding-linux-x64-gnu@1.7.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.34.5': + '@rspack/binding-linux-x64-musl@1.7.1': optional: true - '@rollup/rollup-linux-x64-musl@4.34.5': + '@rspack/binding-wasm32-wasi@1.7.1': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 optional: true - '@rollup/rollup-win32-arm64-msvc@4.34.5': + '@rspack/binding-win32-arm64-msvc@1.7.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.34.5': + '@rspack/binding-win32-ia32-msvc@1.7.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.34.5': + '@rspack/binding-win32-x64-msvc@1.7.1': optional: true - '@swc/helpers@0.5.15': + '@rspack/binding@1.7.1': + optionalDependencies: + '@rspack/binding-darwin-arm64': 1.7.1 + '@rspack/binding-darwin-x64': 1.7.1 + '@rspack/binding-linux-arm64-gnu': 1.7.1 + '@rspack/binding-linux-arm64-musl': 1.7.1 + '@rspack/binding-linux-x64-gnu': 1.7.1 + '@rspack/binding-linux-x64-musl': 1.7.1 + '@rspack/binding-wasm32-wasi': 1.7.1 + '@rspack/binding-win32-arm64-msvc': 1.7.1 + '@rspack/binding-win32-ia32-msvc': 1.7.1 + '@rspack/binding-win32-x64-msvc': 1.7.1 + + '@rspack/core@1.7.1(@swc/helpers@0.5.18)': + dependencies: + '@module-federation/runtime-tools': 0.22.0 + '@rspack/binding': 1.7.1 + '@rspack/lite-tapable': 1.1.0 + optionalDependencies: + '@swc/helpers': 0.5.18 + + '@rspack/lite-tapable@1.1.0': {} + + '@rspack/plugin-react-refresh@1.6.0(react-refresh@0.18.0)': + dependencies: + error-stack-parser: 2.1.4 + html-entities: 2.6.0 + react-refresh: 0.18.0 + + '@swc/helpers@0.5.18': dependencies: tslib: 2.8.1 - '@tailwindcss/node@4.0.4': + '@tailwindcss/node@4.1.18': dependencies: - enhanced-resolve: 5.18.1 - jiti: 2.4.2 - tailwindcss: 4.0.4 + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.4 + jiti: 2.6.1 + lightningcss: 1.30.2 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.1.18 - '@tailwindcss/oxide-android-arm64@4.0.4': + '@tailwindcss/oxide-android-arm64@4.1.18': optional: true - '@tailwindcss/oxide-darwin-arm64@4.0.4': + '@tailwindcss/oxide-darwin-arm64@4.1.18': optional: true - '@tailwindcss/oxide-darwin-x64@4.0.4': + '@tailwindcss/oxide-darwin-x64@4.1.18': optional: true - '@tailwindcss/oxide-freebsd-x64@4.0.4': + '@tailwindcss/oxide-freebsd-x64@4.1.18': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.4': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.0.4': + '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.0.4': + '@tailwindcss/oxide-linux-arm64-musl@4.1.18': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.0.4': + '@tailwindcss/oxide-linux-x64-gnu@4.1.18': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.0.4': + '@tailwindcss/oxide-linux-x64-musl@4.1.18': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.0.4': + '@tailwindcss/oxide-wasm32-wasi@4.1.18': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.0.4': + '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': optional: true - '@tailwindcss/oxide@4.0.4': + '@tailwindcss/oxide-win32-x64-msvc@4.1.18': + optional: true + + '@tailwindcss/oxide@4.1.18': optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.0.4 - '@tailwindcss/oxide-darwin-arm64': 4.0.4 - '@tailwindcss/oxide-darwin-x64': 4.0.4 - '@tailwindcss/oxide-freebsd-x64': 4.0.4 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.0.4 - '@tailwindcss/oxide-linux-arm64-gnu': 4.0.4 - '@tailwindcss/oxide-linux-arm64-musl': 4.0.4 - '@tailwindcss/oxide-linux-x64-gnu': 4.0.4 - '@tailwindcss/oxide-linux-x64-musl': 4.0.4 - '@tailwindcss/oxide-win32-arm64-msvc': 4.0.4 - '@tailwindcss/oxide-win32-x64-msvc': 4.0.4 - - '@tailwindcss/postcss@4.0.4': + '@tailwindcss/oxide-android-arm64': 4.1.18 + '@tailwindcss/oxide-darwin-arm64': 4.1.18 + '@tailwindcss/oxide-darwin-x64': 4.1.18 + '@tailwindcss/oxide-freebsd-x64': 4.1.18 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.18 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.18 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.18 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.18 + '@tailwindcss/oxide-linux-x64-musl': 4.1.18 + '@tailwindcss/oxide-wasm32-wasi': 4.1.18 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 + + '@tailwindcss/postcss@4.1.18': dependencies: '@alloc/quick-lru': 5.2.0 - '@tailwindcss/node': 4.0.4 - '@tailwindcss/oxide': 4.0.4 - lightningcss: 1.29.1 - postcss: 8.5.1 - tailwindcss: 4.0.4 + '@tailwindcss/node': 4.1.18 + '@tailwindcss/oxide': 4.1.18 + postcss: 8.5.6 + tailwindcss: 4.1.18 - '@tauri-apps/api@2.2.0': {} + '@tauri-apps/api@2.9.1': {} + + '@tauri-apps/cli-darwin-arm64@2.9.6': + optional: true - '@tauri-apps/cli-darwin-arm64@2.2.7': + '@tauri-apps/cli-darwin-x64@2.9.6': optional: true - '@tauri-apps/cli-darwin-x64@2.2.7': + '@tauri-apps/cli-linux-arm-gnueabihf@2.9.6': optional: true - '@tauri-apps/cli-linux-arm-gnueabihf@2.2.7': + '@tauri-apps/cli-linux-arm64-gnu@2.9.6': optional: true - '@tauri-apps/cli-linux-arm64-gnu@2.2.7': + '@tauri-apps/cli-linux-arm64-musl@2.9.6': optional: true - '@tauri-apps/cli-linux-arm64-musl@2.2.7': + '@tauri-apps/cli-linux-riscv64-gnu@2.9.6': optional: true - '@tauri-apps/cli-linux-x64-gnu@2.2.7': + '@tauri-apps/cli-linux-x64-gnu@2.9.6': optional: true - '@tauri-apps/cli-linux-x64-musl@2.2.7': + '@tauri-apps/cli-linux-x64-musl@2.9.6': optional: true - '@tauri-apps/cli-win32-arm64-msvc@2.2.7': + '@tauri-apps/cli-win32-arm64-msvc@2.9.6': optional: true - '@tauri-apps/cli-win32-ia32-msvc@2.2.7': + '@tauri-apps/cli-win32-ia32-msvc@2.9.6': optional: true - '@tauri-apps/cli-win32-x64-msvc@2.2.7': + '@tauri-apps/cli-win32-x64-msvc@2.9.6': optional: true - '@tauri-apps/cli@2.2.7': + '@tauri-apps/cli@2.9.6': optionalDependencies: - '@tauri-apps/cli-darwin-arm64': 2.2.7 - '@tauri-apps/cli-darwin-x64': 2.2.7 - '@tauri-apps/cli-linux-arm-gnueabihf': 2.2.7 - '@tauri-apps/cli-linux-arm64-gnu': 2.2.7 - '@tauri-apps/cli-linux-arm64-musl': 2.2.7 - '@tauri-apps/cli-linux-x64-gnu': 2.2.7 - '@tauri-apps/cli-linux-x64-musl': 2.2.7 - '@tauri-apps/cli-win32-arm64-msvc': 2.2.7 - '@tauri-apps/cli-win32-ia32-msvc': 2.2.7 - '@tauri-apps/cli-win32-x64-msvc': 2.2.7 + '@tauri-apps/cli-darwin-arm64': 2.9.6 + '@tauri-apps/cli-darwin-x64': 2.9.6 + '@tauri-apps/cli-linux-arm-gnueabihf': 2.9.6 + '@tauri-apps/cli-linux-arm64-gnu': 2.9.6 + '@tauri-apps/cli-linux-arm64-musl': 2.9.6 + '@tauri-apps/cli-linux-riscv64-gnu': 2.9.6 + '@tauri-apps/cli-linux-x64-gnu': 2.9.6 + '@tauri-apps/cli-linux-x64-musl': 2.9.6 + '@tauri-apps/cli-win32-arm64-msvc': 2.9.6 + '@tauri-apps/cli-win32-ia32-msvc': 2.9.6 + '@tauri-apps/cli-win32-x64-msvc': 2.9.6 - '@tauri-apps/plugin-autostart@2.2.0': + '@tauri-apps/plugin-autostart@2.5.1': dependencies: - '@tauri-apps/api': 2.2.0 + '@tauri-apps/api': 2.9.1 - '@tauri-apps/plugin-deep-link@2.2.0': + '@tauri-apps/plugin-deep-link@2.4.6': dependencies: - '@tauri-apps/api': 2.2.0 + '@tauri-apps/api': 2.9.1 - '@tauri-apps/plugin-os@2.2.0': + '@tauri-apps/plugin-http@2.5.5': dependencies: - '@tauri-apps/api': 2.2.0 + '@tauri-apps/api': 2.9.1 - '@tauri-apps/plugin-updater@2.5.0': + '@tauri-apps/plugin-os@2.3.2': dependencies: - '@tauri-apps/api': 2.2.0 + '@tauri-apps/api': 2.9.1 + + '@tauri-apps/plugin-updater@2.9.0': + dependencies: + '@tauri-apps/api': 2.9.1 + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.26.7 - '@babel/types': 7.26.7 - '@types/babel__generator': 7.6.8 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.6 + '@types/babel__traverse': 7.28.0 - '@types/babel__generator@7.6.8': + '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.26.7 + '@babel/types': 7.28.5 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.26.7 - '@babel/types': 7.26.7 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 - '@types/babel__traverse@7.20.6': + '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.26.7 + '@babel/types': 7.28.5 - '@types/estree@1.0.6': {} + '@types/estree@1.0.8': {} - '@types/node@22.13.1': + '@types/node@20.19.28': dependencies: - undici-types: 6.20.0 + undici-types: 6.21.0 - '@types/react-dom@19.0.3(@types/react@19.0.8)': + '@types/node@25.0.6': dependencies: - '@types/react': 19.0.8 + undici-types: 7.16.0 - '@types/react@19.0.8': + '@types/react-dom@19.2.3(@types/react@19.2.8)': dependencies: - csstype: 3.1.3 + '@types/react': 19.2.8 - '@vitejs/plugin-react@4.3.4(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)(yaml@2.7.0))': + '@types/react-reconciler@0.28.9(@types/react@19.2.8)': dependencies: - '@babel/core': 7.26.7 - '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.7) - '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.7) - '@types/babel__core': 7.20.5 - react-refresh: 0.14.2 - vite: 6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)(yaml@2.7.0) + '@types/react': 19.2.8 + + '@types/react@19.2.8': + dependencies: + csstype: 3.2.3 + + acorn@8.15.0: + optional: true + + argparse@2.0.1: {} + + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + + babel-plugin-react-compiler@1.0.0: + dependencies: + '@babel/types': 7.28.5 + + baseline-browser-mapping@2.9.14: {} + + bippy@0.3.34(@types/react@19.2.8)(react@19.2.3): + dependencies: + '@types/react-reconciler': 0.28.9(@types/react@19.2.8) + react: 19.2.3 transitivePeerDependencies: - - supports-color + - '@types/react' - browserslist@4.24.4: + browserslist@4.28.1: dependencies: - caniuse-lite: 1.0.30001698 - electron-to-chromium: 1.5.96 - node-releases: 2.0.19 - update-browserslist-db: 1.1.2(browserslist@4.24.4) + baseline-browser-mapping: 2.9.14 + caniuse-lite: 1.0.30001763 + electron-to-chromium: 1.5.267 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) + + callsites@3.1.0: {} - caniuse-lite@1.0.30001698: {} + caniuse-lite@1.0.30001763: {} class-variance-authority@0.7.1: dependencies: @@ -3139,260 +4696,460 @@ snapshots: convert-source-map@2.0.0: {} - csstype@3.1.3: {} + core-js@3.47.0: {} + + cosmiconfig@9.0.0(typescript@5.9.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.9.3 + + csstype@3.2.3: {} - daisyui@5.0.0-beta.7: {} + daisyui@5.5.14: {} - debug@4.4.0: + debug@4.4.3: dependencies: ms: 2.1.3 - detect-libc@1.0.3: {} + deepmerge@4.3.1: {} + + detect-libc@2.1.2: {} + + detect-node-es@1.1.0: {} - electron-to-chromium@1.5.96: {} + electron-to-chromium@1.5.267: {} - embla-carousel-autoplay@8.5.2(embla-carousel@8.5.2): + embla-carousel-autoplay@8.6.0(embla-carousel@8.6.0): dependencies: - embla-carousel: 8.5.2 + embla-carousel: 8.6.0 - embla-carousel-fade@8.5.2(embla-carousel@8.5.2): + embla-carousel-fade@8.6.0(embla-carousel@8.6.0): dependencies: - embla-carousel: 8.5.2 + embla-carousel: 8.6.0 - embla-carousel@8.5.2: {} + embla-carousel@8.6.0: {} - enhanced-resolve@5.18.1: + enhanced-resolve@5.18.4: dependencies: graceful-fs: 4.2.11 - tapable: 2.2.1 + tapable: 2.3.0 + + env-paths@2.2.1: {} + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + error-stack-parser@2.1.4: + dependencies: + stackframe: 1.3.4 - esbuild@0.24.2: + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + esbuild@0.27.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.24.2 - '@esbuild/android-arm': 0.24.2 - '@esbuild/android-arm64': 0.24.2 - '@esbuild/android-x64': 0.24.2 - '@esbuild/darwin-arm64': 0.24.2 - '@esbuild/darwin-x64': 0.24.2 - '@esbuild/freebsd-arm64': 0.24.2 - '@esbuild/freebsd-x64': 0.24.2 - '@esbuild/linux-arm': 0.24.2 - '@esbuild/linux-arm64': 0.24.2 - '@esbuild/linux-ia32': 0.24.2 - '@esbuild/linux-loong64': 0.24.2 - '@esbuild/linux-mips64el': 0.24.2 - '@esbuild/linux-ppc64': 0.24.2 - '@esbuild/linux-riscv64': 0.24.2 - '@esbuild/linux-s390x': 0.24.2 - '@esbuild/linux-x64': 0.24.2 - '@esbuild/netbsd-arm64': 0.24.2 - '@esbuild/netbsd-x64': 0.24.2 - '@esbuild/openbsd-arm64': 0.24.2 - '@esbuild/openbsd-x64': 0.24.2 - '@esbuild/sunos-x64': 0.24.2 - '@esbuild/win32-arm64': 0.24.2 - '@esbuild/win32-ia32': 0.24.2 - '@esbuild/win32-x64': 0.24.2 + '@esbuild/aix-ppc64': 0.27.2 + '@esbuild/android-arm': 0.27.2 + '@esbuild/android-arm64': 0.27.2 + '@esbuild/android-x64': 0.27.2 + '@esbuild/darwin-arm64': 0.27.2 + '@esbuild/darwin-x64': 0.27.2 + '@esbuild/freebsd-arm64': 0.27.2 + '@esbuild/freebsd-x64': 0.27.2 + '@esbuild/linux-arm': 0.27.2 + '@esbuild/linux-arm64': 0.27.2 + '@esbuild/linux-ia32': 0.27.2 + '@esbuild/linux-loong64': 0.27.2 + '@esbuild/linux-mips64el': 0.27.2 + '@esbuild/linux-ppc64': 0.27.2 + '@esbuild/linux-riscv64': 0.27.2 + '@esbuild/linux-s390x': 0.27.2 + '@esbuild/linux-x64': 0.27.2 + '@esbuild/netbsd-arm64': 0.27.2 + '@esbuild/netbsd-x64': 0.27.2 + '@esbuild/openbsd-arm64': 0.27.2 + '@esbuild/openbsd-x64': 0.27.2 + '@esbuild/openharmony-arm64': 0.27.2 + '@esbuild/sunos-x64': 0.27.2 + '@esbuild/win32-arm64': 0.27.2 + '@esbuild/win32-ia32': 0.27.2 + '@esbuild/win32-x64': 0.27.2 escalade@3.2.0: {} + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true gensync@1.0.0-beta.2: {} - globals@11.12.0: {} + get-nonce@1.0.1: {} + + get-tsconfig@4.13.0: + dependencies: + resolve-pkg-maps: 1.0.0 graceful-fs@4.2.11: {} - jiti@2.4.2: {} + html-entities@2.6.0: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + is-arrayish@0.2.1: {} + + jiti@2.6.1: {} js-tokens@4.0.0: {} + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + jsesc@3.1.0: {} + json-parse-even-better-errors@2.3.1: {} + json5@2.2.3: {} keyborg@2.6.0: {} - lightningcss-darwin-arm64@1.29.1: + kleur@4.1.5: {} + + lightningcss-android-arm64@1.30.2: + optional: true + + lightningcss-darwin-arm64@1.30.2: optional: true - lightningcss-darwin-x64@1.29.1: + lightningcss-darwin-x64@1.30.2: optional: true - lightningcss-freebsd-x64@1.29.1: + lightningcss-freebsd-x64@1.30.2: optional: true - lightningcss-linux-arm-gnueabihf@1.29.1: + lightningcss-linux-arm-gnueabihf@1.30.2: optional: true - lightningcss-linux-arm64-gnu@1.29.1: + lightningcss-linux-arm64-gnu@1.30.2: optional: true - lightningcss-linux-arm64-musl@1.29.1: + lightningcss-linux-arm64-musl@1.30.2: optional: true - lightningcss-linux-x64-gnu@1.29.1: + lightningcss-linux-x64-gnu@1.30.2: optional: true - lightningcss-linux-x64-musl@1.29.1: + lightningcss-linux-x64-musl@1.30.2: optional: true - lightningcss-win32-arm64-msvc@1.29.1: + lightningcss-win32-arm64-msvc@1.30.2: optional: true - lightningcss-win32-x64-msvc@1.29.1: + lightningcss-win32-x64-msvc@1.30.2: optional: true - lightningcss@1.29.1: + lightningcss@1.30.2: dependencies: - detect-libc: 1.0.3 + detect-libc: 2.1.2 optionalDependencies: - lightningcss-darwin-arm64: 1.29.1 - lightningcss-darwin-x64: 1.29.1 - lightningcss-freebsd-x64: 1.29.1 - lightningcss-linux-arm-gnueabihf: 1.29.1 - lightningcss-linux-arm64-gnu: 1.29.1 - lightningcss-linux-arm64-musl: 1.29.1 - lightningcss-linux-x64-gnu: 1.29.1 - lightningcss-linux-x64-musl: 1.29.1 - lightningcss-win32-arm64-msvc: 1.29.1 - lightningcss-win32-x64-msvc: 1.29.1 + lightningcss-android-arm64: 1.30.2 + lightningcss-darwin-arm64: 1.30.2 + lightningcss-darwin-x64: 1.30.2 + lightningcss-freebsd-x64: 1.30.2 + lightningcss-linux-arm-gnueabihf: 1.30.2 + lightningcss-linux-arm64-gnu: 1.30.2 + lightningcss-linux-arm64-musl: 1.30.2 + lightningcss-linux-x64-gnu: 1.30.2 + lightningcss-linux-x64-musl: 1.30.2 + lightningcss-win32-arm64-msvc: 1.30.2 + lightningcss-win32-x64-msvc: 1.30.2 + + lines-and-columns@1.2.4: {} lru-cache@5.1.1: dependencies: yallist: 3.1.1 - lucide-react@0.474.0(react@19.0.0): + lucide-react@0.562.0(react@19.2.3): + dependencies: + react: 19.2.3 + + magic-string@0.30.21: dependencies: - react: 19.0.0 + '@jridgewell/sourcemap-codec': 1.5.5 + + mri@1.2.0: {} ms@2.1.3: {} - nanoid@3.3.8: {} + nanoid@3.3.11: {} + + next-themes@0.4.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + dependencies: + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + node-releases@2.0.27: {} - next-themes@0.4.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + parent-module@1.0.1: dependencies: - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + callsites: 3.1.0 - node-releases@2.0.19: {} + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 picocolors@1.1.1: {} - postcss@8.5.1: + picomatch@4.0.3: {} + + playwright-core@1.57.0: {} + + playwright@1.57.0: + dependencies: + playwright-core: 1.57.0 + optionalDependencies: + fsevents: 2.3.2 + + postcss-loader@8.2.0(@rspack/core@1.7.1(@swc/helpers@0.5.18))(postcss@8.5.6)(typescript@5.9.3): + dependencies: + cosmiconfig: 9.0.0(typescript@5.9.3) + jiti: 2.6.1 + postcss: 8.5.6 + semver: 7.7.3 + optionalDependencies: + '@rspack/core': 1.7.1(@swc/helpers@0.5.18) + transitivePeerDependencies: + - typescript + + postcss@8.5.6: dependencies: - nanoid: 3.3.8 + nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - react-dom@19.0.0(react@19.0.0): + preact@10.28.2: {} + + prettier@3.7.4: {} + + react-dom@19.2.3(react@19.2.3): + dependencies: + react: 19.2.3 + scheduler: 0.27.0 + + react-intersection-observer@10.0.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: - react: 19.0.0 - scheduler: 0.25.0 + react: 19.2.3 + optionalDependencies: + react-dom: 19.2.3(react@19.2.3) react-is@17.0.2: {} - react-refresh@0.14.2: {} + react-refresh@0.18.0: {} - react@19.0.0: {} + react-remove-scroll-bar@2.3.8(@types/react@19.2.8)(react@19.2.3): + dependencies: + react: 19.2.3 + react-style-singleton: 2.2.3(@types/react@19.2.8)(react@19.2.3) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.8 - regenerator-runtime@0.14.1: {} + react-remove-scroll@2.7.2(@types/react@19.2.8)(react@19.2.3): + dependencies: + react: 19.2.3 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.8)(react@19.2.3) + react-style-singleton: 2.2.3(@types/react@19.2.8)(react@19.2.3) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.2.8)(react@19.2.3) + use-sidecar: 1.1.3(@types/react@19.2.8)(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.8 + + react-scan@0.4.3(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + dependencies: + '@babel/core': 7.28.5 + '@babel/generator': 7.28.5 + '@babel/types': 7.28.5 + '@clack/core': 0.3.5 + '@clack/prompts': 0.8.2 + '@pivanov/utils': 0.0.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@preact/signals': 1.3.2(preact@10.28.2) + '@rollup/pluginutils': 5.3.0 + '@types/node': 20.19.28 + bippy: 0.3.34(@types/react@19.2.8)(react@19.2.3) + esbuild: 0.25.12 + estree-walker: 3.0.3 + kleur: 4.1.5 + mri: 1.2.0 + playwright: 1.57.0 + preact: 10.28.2 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + tsx: 4.21.0 + optionalDependencies: + unplugin: 2.1.0 + transitivePeerDependencies: + - '@types/react' + - rollup + - supports-color - rollup@4.34.5: + react-style-singleton@2.2.3(@types/react@19.2.8)(react@19.2.3): dependencies: - '@types/estree': 1.0.6 + get-nonce: 1.0.1 + react: 19.2.3 + tslib: 2.8.1 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.34.5 - '@rollup/rollup-android-arm64': 4.34.5 - '@rollup/rollup-darwin-arm64': 4.34.5 - '@rollup/rollup-darwin-x64': 4.34.5 - '@rollup/rollup-freebsd-arm64': 4.34.5 - '@rollup/rollup-freebsd-x64': 4.34.5 - '@rollup/rollup-linux-arm-gnueabihf': 4.34.5 - '@rollup/rollup-linux-arm-musleabihf': 4.34.5 - '@rollup/rollup-linux-arm64-gnu': 4.34.5 - '@rollup/rollup-linux-arm64-musl': 4.34.5 - '@rollup/rollup-linux-loongarch64-gnu': 4.34.5 - '@rollup/rollup-linux-powerpc64le-gnu': 4.34.5 - '@rollup/rollup-linux-riscv64-gnu': 4.34.5 - '@rollup/rollup-linux-s390x-gnu': 4.34.5 - '@rollup/rollup-linux-x64-gnu': 4.34.5 - '@rollup/rollup-linux-x64-musl': 4.34.5 - '@rollup/rollup-win32-arm64-msvc': 4.34.5 - '@rollup/rollup-win32-ia32-msvc': 4.34.5 - '@rollup/rollup-win32-x64-msvc': 4.34.5 - fsevents: 2.3.3 + '@types/react': 19.2.8 + + react@19.2.3: {} + + reduce-configs@1.1.1: {} + + resolve-from@4.0.0: {} + + resolve-pkg-maps@1.0.0: {} rtl-css-js@1.16.1: dependencies: - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.28.4 - scheduler@0.25.0: {} + scheduler@0.27.0: {} semver@6.3.1: {} - sonner@1.7.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + semver@7.7.3: {} + + ses@1.14.0: dependencies: - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@endo/cache-map': 1.1.0 + '@endo/env-options': 1.1.11 + '@endo/immutable-arraybuffer': 1.1.2 + + sisteransi@1.0.5: {} + + sonner@2.0.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + dependencies: + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) source-map-js@1.2.1: {} + stackframe@1.3.4: {} + stylis@4.3.6: {} - tabster@8.4.0: + tabster@8.7.0: dependencies: keyborg: 2.6.0 tslib: 2.8.1 + optionalDependencies: + '@rollup/rollup-linux-x64-gnu': 4.53.3 - tailwind-merge@3.0.1: {} + tailwind-merge@3.4.0: {} - tailwindcss-animate@1.0.7(tailwindcss@4.0.4): + tailwindcss-animate@1.0.7(tailwindcss@4.1.18): dependencies: - tailwindcss: 4.0.4 + tailwindcss: 4.1.18 - tailwindcss@4.0.4: {} + tailwindcss@4.1.18: {} - tapable@2.2.1: {} + tapable@2.3.0: {} tslib@2.8.1: {} - typescript@5.7.3: {} + tsx@4.21.0: + dependencies: + esbuild: 0.27.2 + get-tsconfig: 4.13.0 + optionalDependencies: + fsevents: 2.3.3 + + typescript@5.9.3: {} + + undici-types@6.21.0: {} - undici-types@6.20.0: {} + undici-types@7.16.0: {} - update-browserslist-db@1.1.2(browserslist@4.24.4): + unplugin@2.1.0: dependencies: - browserslist: 4.24.4 - escalade: 3.2.0 - picocolors: 1.1.1 + acorn: 8.15.0 + webpack-virtual-modules: 0.6.2 + optional: true + + upath@2.0.1: {} - use-disposable@1.0.4(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + update-browserslist-db@1.2.3(browserslist@4.28.1): dependencies: - '@types/react': 19.0.8 - '@types/react-dom': 19.0.3(@types/react@19.0.8) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 - use-sync-external-store@1.4.0(react@19.0.0): + use-callback-ref@1.3.3(@types/react@19.2.8)(react@19.2.3): dependencies: - react: 19.0.0 + react: 19.2.3 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.8 - vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)(yaml@2.7.0): + use-sidecar@1.1.3(@types/react@19.2.8)(react@19.2.3): dependencies: - esbuild: 0.24.2 - postcss: 8.5.1 - rollup: 4.34.5 + detect-node-es: 1.1.0 + react: 19.2.3 + tslib: 2.8.1 optionalDependencies: - '@types/node': 22.13.1 - fsevents: 2.3.3 - jiti: 2.4.2 - lightningcss: 1.29.1 - yaml: 2.7.0 + '@types/react': 19.2.8 - yallist@3.1.1: {} + use-sync-external-store@1.6.0(react@19.2.3): + dependencies: + react: 19.2.3 - yaml@2.7.0: + webpack-virtual-modules@0.6.2: optional: true + + yallist@3.1.1: {} diff --git a/readme/banner.png b/readme/banner.png new file mode 100644 index 0000000..1547164 Binary files /dev/null and b/readme/banner.png differ diff --git a/rsbuild.config.ts b/rsbuild.config.ts new file mode 100644 index 0000000..aa064a5 --- /dev/null +++ b/rsbuild.config.ts @@ -0,0 +1,51 @@ +import { defineConfig } from '@rsbuild/core'; + +import { pluginBabel } from '@rsbuild/plugin-babel'; +import { pluginReact } from "@rsbuild/plugin-react"; + +import path from "path" + +const host = process.env.TAURI_DEV_HOST; + +export default defineConfig({ + plugins: [ + pluginReact(), + pluginBabel({ + include: /\.(?:jsx|tsx)$/, + babelLoaderOptions(opts) { + opts.plugins?.unshift('babel-plugin-react-compiler'); + }, + }), + ], + html: { + template: './index.html', + }, + source: { + entry: { + index: './src/main.tsx', + }, + }, + dev: { + watchFiles: { + paths: ["./src/**/*"], + }, + }, + server: { + port: 1420, + strictPort: true, + host: host || undefined, + }, + resolve: { + alias: { + "@": path.resolve(__dirname, "./src"), + "@controls": path.resolve(__dirname, "./src/controls"), + }, + }, + tools: { + rspack: { + watchOptions: { + ignored: /^(?!.*\/src\/).*/ + } + } + } +}); \ No newline at end of file diff --git a/src-ahqstore-types/.gitignore b/src-ahqstore-types/.gitignore index 2b77276..1de5659 100644 --- a/src-ahqstore-types/.gitignore +++ b/src-ahqstore-types/.gitignore @@ -1,2 +1 @@ -target -pkg \ No newline at end of file +target \ No newline at end of file diff --git a/src-ahqstore-types/Cargo.lock b/src-ahqstore-types/Cargo.lock index 49306be..08c4018 100644 --- a/src-ahqstore-types/Cargo.lock +++ b/src-ahqstore-types/Cargo.lock @@ -3,62 +3,35 @@ version = 4 [[package]] -name = "addr2line" -version = "0.24.2" +name = "Inflector" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" [[package]] name = "ahqstore-types" -version = "3.10.4" +version = "3.20.0" dependencies = [ "anyhow", - "fuse-rust", - "kfghdfghdfkgh_js_macros", "reqwest", "serde", "serde-wasm-bindgen", "serde_json", - "tsify", - "wasm-bindgen", - "wasm-bindgen-futures", + "specta", + "tokio", ] [[package]] name = "anyhow" -version = "1.0.95" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "backtrace" -version = "0.3.74" +name = "atomic-waker" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets", -] +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "base64" @@ -67,68 +40,80 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] -name = "bumpalo" -version = "3.16.0" +name = "bitflags" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" [[package]] -name = "byteorder" -version = "1.5.0" +name = "bumpalo" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" [[package]] name = "bytes" -version = "1.9.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" [[package]] name = "cc" -version = "1.2.9" +version = "1.2.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8293772165d9345bdaaa39b45b2109591e63fe5e6fbc23c6ff930a048aa310b" +checksum = "cd4932aefd12402b36c60956a4fe0035421f544799057659ff86f923657aada3" dependencies = [ + "find-msvc-tools", "shlex", ] [[package]] -name = "cfg-if" -version = "1.0.0" +name = "cesu8" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" [[package]] -name = "cfg_aliases" -version = "0.2.1" +name = "cfg-if" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] -name = "crossbeam-deque" -version = "0.8.6" +name = "combine" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", + "bytes", + "memchr", ] [[package]] -name = "crossbeam-epoch" -version = "0.9.18" +name = "core-foundation" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" dependencies = [ - "crossbeam-utils", + "core-foundation-sys", + "libc", ] [[package]] -name = "crossbeam-utils" -version = "0.8.21" +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "ctor" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" +dependencies = [ + "quote", + "syn 1.0.109", +] [[package]] name = "displaydoc" @@ -138,14 +123,35 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", +] + +[[package]] +name = "document-features" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", ] [[package]] name = "either" -version = "1.13.0" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "find-msvc-tools" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "f449e6c6c08c865631d4890cfacf252b3d396c9bcc83adb6623cdb02a8336c41" [[package]] name = "fnv" @@ -155,23 +161,13 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] -[[package]] -name = "fuse-rust" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf29d70efdbafa7d2dc40083514b205c8d8885fba815778acc57100a9029200c" -dependencies = [ - "crossbeam-utils", - "rayon", -] - [[package]] name = "futures-channel" version = "0.3.31" @@ -187,6 +183,12 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + [[package]] name = "futures-task" version = "0.3.31" @@ -207,44 +209,47 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi", - "wasm-bindgen", ] [[package]] -name = "gimli" -version = "0.31.1" +name = "h2" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] [[package]] -name = "gloo-utils" -version = "0.1.7" +name = "hashbrown" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037fcb07216cb3a30f7292bd0176b050b7b9a052ba830ef7d5d65f6dc64ba58e" -dependencies = [ - "js-sys", - "serde", - "serde_json", - "wasm-bindgen", - "web-sys", -] +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" [[package]] name = "http" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ "bytes", - "fnv", "itoa", ] @@ -260,12 +265,12 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", - "futures-util", + "futures-core", "http", "http-body", "pin-project-lite", @@ -273,24 +278,27 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.5" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "hyper" -version = "1.5.2" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", + "futures-core", + "h2", "http", "http-body", "httparse", "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", @@ -298,11 +306,10 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.5" +version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "futures-util", "http", "hyper", "hyper-util", @@ -311,21 +318,25 @@ dependencies = [ "tokio", "tokio-rustls", "tower-service", - "webpki-roots", ] [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" dependencies = [ + "base64", "bytes", "futures-channel", + "futures-core", "futures-util", "http", "http-body", "hyper", + "ipnet", + "libc", + "percent-encoding", "pin-project-lite", "socket2", "tokio", @@ -335,21 +346,22 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ "displaydoc", "litemap", @@ -358,104 +370,66 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" dependencies = [ - "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" dependencies = [ - "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", + "icu_locale_core", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -464,336 +438,255 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", ] [[package]] -name = "ipnet" -version = "2.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" - -[[package]] -name = "itoa" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" - -[[package]] -name = "js-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "kfghdfghdfkgh_js_macros" -version = "1.0.0" +name = "indexmap" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf2945f2d6cd0b1388a8a878cf1212dc9df86899d6b80034d98421e692510b22" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" dependencies = [ - "quote", - "syn", + "equivalent", + "hashbrown", ] [[package]] -name = "libc" -version = "0.2.169" +name = "indoc" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306" [[package]] -name = "litemap" -version = "0.7.4" +name = "ipnet" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] -name = "log" -version = "0.4.22" +name = "iri-string" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +dependencies = [ + "memchr", + "serde", +] [[package]] -name = "memchr" -version = "2.7.4" +name = "itertools" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] [[package]] -name = "mime" -version = "0.3.17" +name = "itoa" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" [[package]] -name = "miniz_oxide" -version = "0.8.2" +name = "jni" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" dependencies = [ - "adler2", + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", + "windows-sys 0.45.0", ] [[package]] -name = "mio" -version = "1.0.3" +name = "jni-sys" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.52.0", -] +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] -name = "object" -version = "0.36.7" +name = "js-sys" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" dependencies = [ - "memchr", + "once_cell", + "wasm-bindgen", ] [[package]] -name = "once_cell" -version = "1.20.2" +name = "libc" +version = "0.2.180" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" [[package]] -name = "percent-encoding" -version = "2.3.1" +name = "litemap" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] -name = "pin-project-lite" -version = "0.2.16" +name = "litrs" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" [[package]] -name = "pin-utils" -version = "0.1.0" +name = "log" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] -name = "ppv-lite86" -version = "0.2.20" +name = "memchr" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" -dependencies = [ - "zerocopy", -] +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] -name = "proc-macro2" -version = "1.0.93" +name = "mio" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" dependencies = [ - "unicode-ident", + "libc", + "wasi", + "windows-sys 0.61.2", ] [[package]] -name = "quinn" -version = "0.11.6" +name = "once_cell" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" -dependencies = [ - "bytes", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls", - "socket2", - "thiserror", - "tokio", - "tracing", -] +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] -name = "quinn-proto" -version = "0.11.9" +name = "openssl-probe" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" -dependencies = [ - "bytes", - "getrandom", - "rand", - "ring", - "rustc-hash", - "rustls", - "rustls-pki-types", - "slab", - "thiserror", - "tinyvec", - "tracing", - "web-time", -] +checksum = "9f50d9b3dabb09ecd771ad0aa242ca6894994c130308ca3d7684634df8037391" [[package]] -name = "quinn-udp" -version = "0.5.9" +name = "paste" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2", - "tracing", - "windows-sys 0.59.0", -] +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] -name = "quote" -version = "1.0.38" +name = "percent-encoding" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" -dependencies = [ - "proc-macro2", -] +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] -name = "rand" -version = "0.8.5" +name = "pin-project-lite" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] -name = "rand_chacha" -version = "0.3.1" +name = "pin-utils" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] -name = "rand_core" -version = "0.6.4" +name = "potential_utf" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" dependencies = [ - "getrandom", + "zerovec", ] [[package]] -name = "rayon" -version = "1.10.0" +name = "proc-macro2" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" dependencies = [ - "either", - "rayon-core", + "unicode-ident", ] [[package]] -name = "rayon-core" -version = "1.12.1" +name = "quote" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" dependencies = [ - "crossbeam-deque", - "crossbeam-utils", + "proc-macro2", ] [[package]] name = "reqwest" -version = "0.12.12" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" +checksum = "04e9018c9d814e5f30cc16a0f03271aeab3571e609612d9fe78c1aa8d11c2f62" dependencies = [ "base64", "bytes", "futures-core", - "futures-util", + "h2", "http", "http-body", "http-body-util", "hyper", "hyper-rustls", "hyper-util", - "ipnet", "js-sys", "log", - "mime", - "once_cell", "percent-encoding", "pin-project-lite", - "quinn", "rustls", - "rustls-pemfile", "rustls-pki-types", + "rustls-platform-verifier", "serde", "serde_json", - "serde_urlencoded", "sync_wrapper", "tokio", "tokio-rustls", "tower", + "tower-http", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots", - "windows-registry", ] [[package]] name = "ring" -version = "0.17.8" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", "getrandom", "libc", - "spin", "untrusted", "windows-sys 0.52.0", ] -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hash" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" - [[package]] name = "rustls" -version = "0.23.21" +version = "0.23.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f287924602bf649d949c63dc8ac8b235fa5387d394020705b80c4eb597ce5b8" +checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" dependencies = [ "once_cell", - "ring", "rustls-pki-types", "rustls-webpki", "subtle", @@ -801,28 +694,58 @@ dependencies = [ ] [[package]] -name = "rustls-pemfile" -version = "2.2.0" +name = "rustls-native-certs" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" dependencies = [ + "openssl-probe", "rustls-pki-types", + "schannel", + "security-framework", ] [[package]] name = "rustls-pki-types" -version = "1.10.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" +checksum = "21e6f2ab2928ca4291b86736a8bd920a277a399bba1589409d72154ff87c1282" dependencies = [ - "web-time", + "zeroize", +] + +[[package]] +name = "rustls-platform-verifier" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" +dependencies = [ + "core-foundation", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.61.2", ] +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + [[package]] name = "rustls-webpki" -version = "0.102.8" +version = "0.103.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" dependencies = [ "ring", "rustls-pki-types", @@ -831,22 +754,58 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.19" +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 = "schannel" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "security-framework" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] [[package]] -name = "ryu" -version = "1.0.18" +name = "security-framework-sys" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +dependencies = [ + "core-foundation-sys", + "libc", +] [[package]] name = "serde" -version = "1.0.217" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ + "serde_core", "serde_derive", ] @@ -862,49 +821,36 @@ dependencies = [ ] [[package]] -name = "serde_derive" -version = "1.0.217" +name = "serde_core" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ - "proc-macro2", - "quote", - "syn", + "serde_derive", ] [[package]] -name = "serde_derive_internals" -version = "0.28.0" +name = "serde_derive" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e578a843d40b4189a4d66bba51d7684f57da5bd7c304c64e14bd63efbef49509" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] name = "serde_json" -version = "1.0.135" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b0d7ba2887406110130a978386c4e1befb98c674b4fba677954e4db976630d9" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ "itoa", "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", "serde", + "serde_core", + "zmij", ] [[package]] @@ -915,40 +861,62 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "slab" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" -version = "1.13.2" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.5.8" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.60.2", +] + +[[package]] +name = "specta" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2240c3aa020aa61d2c569087d213baafbb212f4ceb9de9dd162376ea6aa0fe3" +dependencies = [ + "ctor", + "document-features", + "indoc", + "once_cell", + "paste", + "serde", + "serde_json", + "specta-macros", + "thiserror", ] [[package]] -name = "spin" -version = "0.9.8" +name = "specta-macros" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "4605306321c356e03873b8ee71d7592a5e7c508add325c3ed0677c16fdf1bcfb" +dependencies = [ + "Inflector", + "itertools", + "proc-macro2", + "quote", + "syn 1.0.109", + "termcolor", +] [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "subtle" @@ -958,9 +926,20 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.96" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" dependencies = [ "proc-macro2", "quote", @@ -978,85 +957,91 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", ] [[package]] name = "thiserror" -version = "2.0.11" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.11" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" dependencies = [ "displaydoc", "zerovec", ] -[[package]] -name = "tinyvec" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" -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.43.0" +version = "1.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" dependencies = [ - "backtrace", "bytes", "libc", "mio", "pin-project-lite", "socket2", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-rustls" -version = "0.26.1" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ "rustls", "tokio", ] +[[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 = "tower" version = "0.5.2" @@ -1072,6 +1057,24 @@ dependencies = [ "tower-service", ] +[[package]] +name = "tower-http" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -1086,9 +1089,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "pin-project-lite", "tracing-core", @@ -1096,9 +1099,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", ] @@ -1109,36 +1112,11 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" -[[package]] -name = "tsify" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6b26cf145f2f3b9ff84e182c448eaf05468e247f148cf3d2a7d67d78ff023a0" -dependencies = [ - "gloo-utils", - "serde", - "serde_json", - "tsify-macros", - "wasm-bindgen", -] - -[[package]] -name = "tsify-macros" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a94b0f0954b3e59bfc2c246b4c8574390d94a4ad4ad246aaf2fb07d7dfd3b47" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals", - "syn", -] - [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "untrusted" @@ -1148,27 +1126,32 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.4" +version = "2.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +[[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" @@ -1180,41 +1163,28 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" dependencies = [ "cfg-if", "js-sys", @@ -1225,9 +1195,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1235,101 +1205,109 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" dependencies = [ + "bumpalo", "proc-macro2", "quote", - "syn", - "wasm-bindgen-backend", + "syn 2.0.114", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" dependencies = [ "js-sys", "wasm-bindgen", ] [[package]] -name = "web-time" -version = "1.1.0" +name = "webpki-root-certs" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +checksum = "36a29fc0408b113f68cf32637857ab740edfafdf460c326cd2afaa2d84cc05dc" dependencies = [ - "js-sys", - "wasm-bindgen", + "rustls-pki-types", ] [[package]] -name = "webpki-roots" -version = "0.26.7" +name = "winapi-util" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "rustls-pki-types", + "windows-sys 0.61.2", ] [[package]] -name = "windows-registry" -version = "0.2.0" +name = "windows-link" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ - "windows-result", - "windows-strings", - "windows-targets", + "windows-targets 0.42.2", ] [[package]] -name = "windows-result" -version = "0.2.0" +name = "windows-sys" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", ] [[package]] -name = "windows-strings" -version = "0.1.0" +name = "windows-sys" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-result", - "windows-targets", + "windows-targets 0.53.5", ] [[package]] name = "windows-sys" -version = "0.52.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-targets", + "windows-link", ] [[package]] -name = "windows-sys" -version = "0.59.0" +name = "windows-targets" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" dependencies = [ - "windows-targets", + "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]] @@ -1338,58 +1316,159 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "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-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.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_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[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_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[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_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + [[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_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[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_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[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_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[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_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[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" @@ -1397,24 +1476,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] -name = "write16" -version = "1.0.0" +name = "windows_x86_64_msvc" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ - "serde", "stable_deref_trait", "yoke-derive", "zerofrom", @@ -1422,69 +1500,59 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", "synstructure", ] -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "byteorder", - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "zerofrom" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] [[package]] name = "zerovec" -version = "0.10.4" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" dependencies = [ "yoke", "zerofrom", @@ -1493,11 +1561,17 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] + +[[package]] +name = "zmij" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fc5a66a20078bf1251bde995aa2fdcc4b800c70b5d92dd2c62abc5c60f679f8" diff --git a/src-ahqstore-types/Cargo.toml b/src-ahqstore-types/Cargo.toml index 07c5c6d..55653a7 100644 --- a/src-ahqstore-types/Cargo.toml +++ b/src-ahqstore-types/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ahqstore-types" description = "Standard types used by AHQ Store" -version = "3.10.4" +version = "3.20.0" edition = "2021" license-file = "../LICENSE.md" repository = "https://github.com/ahqstore/client" @@ -12,31 +12,23 @@ readme = "README.md" crate-type = ["cdylib", "rlib"] [dependencies] -reqwest = { version = "0.12", features = [ +reqwest = { version = "0.13", features = [ "json", - "rustls-tls", + "rustls-no-provider", + "http2", ], default-features = false, optional = true } serde = { version = "1", features = ["derive"] } serde-wasm-bindgen = { version = "0.6", optional = true } serde_json = "1" -tsify = { version = "0.4", optional = true } -wasm-bindgen = { version = "0.2", optional = true } -wasm-bindgen-futures = { version = "0.4", optional = true } -kfghdfghdfkgh_js_macros = { version = "1", optional = true } -fuse-rust = { version = "0.4", features = ["async"], optional = true } anyhow = "1" +tokio = { version = "1", features = ["rt", "sync"] } + +specta = { version = "1", features = ["export"], optional = true } [features] -default = ["internet", "search"] +default = ["internet"] internet = ["dep:reqwest"] -# Implements search traits -search = ["dep:fuse-rust"] apps_repo = [] -js = [ - "dep:wasm-bindgen", - "dep:wasm-bindgen-futures", - "dep:serde-wasm-bindgen", - "dep:tsify", - "dep:kfghdfghdfkgh_js_macros", -] all_platforms = [] + +export = ["dep:specta"] diff --git a/src-ahqstore-types/README.md b/src-ahqstore-types/README.md index bfdb9cf..cef5c15 100644 --- a/src-ahqstore-types/README.md +++ b/src-ahqstore-types/README.md @@ -1,7 +1,6 @@ -# ahqstore-types +# AHQ Store Types -Types used by AHQ Store app +This is an internal crate and does not follow **SemVer** and any release is likely +to break. -**NOTE:** This crate is used internally by AHQ Store Organisation projects for sharing the unified app schema and protocol signatures - -THIS CRATE DOES NOT FOLLOW SEMANTIC VERSIONING +> For internal use only diff --git a/src-ahqstore-types/js_macros/Cargo.lock b/src-ahqstore-types/js_macros/Cargo.lock index ad46a9b..fe62d6f 100644 --- a/src-ahqstore-types/js_macros/Cargo.lock +++ b/src-ahqstore-types/js_macros/Cargo.lock @@ -1,10 +1,10 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "kfghdfghdfkgh_js_macros" -version = "1.0.0" +version = "1.0.2" dependencies = [ "quote", "syn", @@ -12,27 +12,27 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.93" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.38" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] [[package]] name = "syn" -version = "2.0.96" +version = "2.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" dependencies = [ "proc-macro2", "quote", @@ -41,6 +41,6 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" diff --git a/src-ahqstore-types/js_macros/Cargo.toml b/src-ahqstore-types/js_macros/Cargo.toml index 5ec0076..adf5c6e 100644 --- a/src-ahqstore-types/js_macros/Cargo.toml +++ b/src-ahqstore-types/js_macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "kfghdfghdfkgh_js_macros" -version = "1.0.0" +version = "1.0.2" edition = "2021" description = "This is an internal crate" license = "MIT" diff --git a/src-ahqstore-types/js_macros/src/lib.rs b/src-ahqstore-types/js_macros/src/lib.rs index b325f05..118fbeb 100644 --- a/src-ahqstore-types/js_macros/src/lib.rs +++ b/src-ahqstore-types/js_macros/src/lib.rs @@ -4,6 +4,7 @@ use proc_macro::TokenStream; use quote::quote; use syn; + #[proc_macro_derive(TsifyAsync)] pub fn tsify_async_macro_derive(input: TokenStream) -> TokenStream { // Construct a representation of Rust code as a syntax tree @@ -16,12 +17,12 @@ pub fn tsify_async_macro_derive(input: TokenStream) -> TokenStream { fn impl_tsify_async_macro(ast: &syn::DeriveInput) -> TokenStream { let name = &ast.ident; - let gen = quote! { + let r#gen = quote! { impl From<#name> for JsValue { fn from(value: #name) -> Self { serde_wasm_bindgen::to_value(&value).unwrap() } } }; - gen.into() + r#gen.into() } \ No newline at end of file diff --git a/src-ahqstore-types/pkg/LICENSE.md b/src-ahqstore-types/pkg/LICENSE.md new file mode 100644 index 0000000..3fbc656 --- /dev/null +++ b/src-ahqstore-types/pkg/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 AHQ Softwares + +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-ahqstore-types/pkg/README.md b/src-ahqstore-types/pkg/README.md new file mode 100644 index 0000000..cef5c15 --- /dev/null +++ b/src-ahqstore-types/pkg/README.md @@ -0,0 +1,6 @@ +# AHQ Store Types + +This is an internal crate and does not follow **SemVer** and any release is likely +to break. + +> For internal use only diff --git a/src-ahqstore-types/pkg/ahqstore.types.d.ts b/src-ahqstore-types/pkg/ahqstore.types.d.ts new file mode 100644 index 0000000..d54b2a2 --- /dev/null +++ b/src-ahqstore-types/pkg/ahqstore.types.d.ts @@ -0,0 +1,100 @@ +// This file has been generated by Specta. DO NOT EDIT. + +export type Hero = { title: string; description: string; button: string; background: string; author: string; appId: string } + +export type DeveloperUser = { name: string; description: string; gh_username: string; icon_base64: string | null; ahq_official: boolean; email: string; support: AppSupport; apps: string[] } + +export type InstallerOptionsWindows = { assetId: number; exec: string | null; scope: WindowsInstallScope | null; installerArgs: string[] | null } + +export type Home = { splash: Splash | null; home: HomeMapData } + +export type Semi = { title: string; background: string; appId: string; color: string | null } + +export type SearchEntry = { name: string; title: string; id: string } + +/** + * 🔬 Under Development + * + * + */ +export type InstallerOptionsAndroid = { assetId: number; min_sdk: number; abi: AndroidAbi[] } + +export type InstallerFormat = "WindowsZip" | "WindowsInstallerMsi" | "WindowsInstallerExe" | "WindowsUWPMsix" | "WindowsAHQDB" | "LinuxAppImage" | "AndroidApkZip" + +/** + * Use the official ahqstore () cli\n🎯 Introduced in v1, Revamped in v2 + */ +export type AHQStoreApplication = { appId: string; appShortcutName: string; appDisplayName: string; authorId: string; releaseTagName: string; downloadUrls: { [key: number]: DownloadUrl }; install: InstallerOptions; displayImages: number[]; description: string; repo: AppRepo; usrVersion: string | null; version: number; site: string | null; source: string | null; license_or_tos: string | null; resources: { [key: number]: number[] } | null; verified: boolean } + +export type AppUpdateInstallStatus = { status: "Pending" } | { status: "Cancelled" } | { status: "Downloading"; progress: number } | { status: "Installing" } | { status: "Updating" } | { status: "Uninstalling" } | { status: "Done" } + +export type AppStatus = "Pending" | "Downloading" | "AVScanning" | "Installing" | "Uninstalling" | "InstallSuccessful" | "UninstallSuccessful" | "NotSuccessful" | "AVFlagged" + +export type SubHero = { title: string; background: string; appId: string; color: string | null } + +export type DevData = { name: string | null; id: string; github: string; avatar_url: string | null; verified?: boolean } + +/** + * PREFERENCES + */ +export type UpdateStrategy = "Never" | "CheckOnly" | "DownloadInstall_UnmeteredWifi" | "DownloadInstall_Wifi" | "DownloadInstall" + +/** + * **You should use cli** + * ```sh + * cargo install ahqstore_cli_rs + * ``` + * or visit app / api sub module + * + * This Module: + * This module lists the standard commands & types that AHQ Store sends to AHQ Store Service + */ +export type StatusUpdateData = { queue: { id: string; status: AppUpdateInstallStatus }; supportsUpdate: boolean } + +export type Commits = { ahqstore: string; alt: string } + +/** + * 🔬 Under Development + * + * + */ +export type AndroidAbi = "Aarch64" | "Armv7" | "X86" | "X64" + +export type QueuedApp = { id: string; status: AppUpdateInstallStatus } + +export type InstallerScheme = { PackageIdentifier: string; PackageVersion: string; Scope: string; Installers: Installer[] } + +export type GHRepoCommit = { sha: string } + +export type AppRepo = { author: string; repo: string } + +/** + * 🔬 Under Development + * + * + */ +export type InstallerOptionsLinux = { assetId: number } + +export type AppSupport = { discord: string | null; website: string | null; github: string | null } + +export type UpdateStatusReport = "Disabled" | "UpToDate" | "Checking" | "Updating" + +export type InstallerOptions = { win32: InstallerOptionsWindows | null; winarm: InstallerOptionsWindows | null; linux: InstallerOptionsLinux | null; linuxArm64: InstallerOptionsLinux | null; linuxArm7: InstallerOptionsLinux | null; android: InstallerOptionsAndroid | null } + +export type WindowsInstallScope = "User" | "Machine" + +/** + * This is exactly `Vec<(String, Vec)>` + */ +export type HomeMapData = { inner: ([string, string[]])[] } + +export type Prefs = { update: UpdateStrategy } + +export type DownloadUrl = { installerType: InstallerFormat; asset: string; url: string } + +export type Installer = { Architecture: string; InstallerType: string | null; InstallerLocale: string | null; InstallerUrl: string } + +export type WingetApplication = { PackageIdentifier: string; PackageVersion: string; Publisher: string | null; PublisherUrl: string | null; Copyright: string | null; ShortDescription: string | null; Description: string | null; ReleaseNotes: string | null; PackageName: string; PackageUrl: string | null; License: string | null; LicenseUrl: string | null } + +export type Splash = { hero: Hero; subhero: SubHero; third: Semi; fourth: Semi } + diff --git a/src-ahqstore-types/pkg/package.json b/src-ahqstore-types/pkg/package.json new file mode 100644 index 0000000..796efe9 --- /dev/null +++ b/src-ahqstore-types/pkg/package.json @@ -0,0 +1,16 @@ +{ + "name": "ahqstore-types", + "type": "module", + "description": "Standard types used by AHQ Store", + "version": "3.20.0", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/ahqstore/client" + }, + "files": [ + "ahqstore.types.d.ts" + ], + "homepage": "https://ahqstore.github.io/", + "types": "ahqstore.types.d.ts" +} diff --git a/src-ahqstore-types/publish.ps1 b/src-ahqstore-types/publish.ps1 new file mode 100644 index 0000000..8b39fd2 --- /dev/null +++ b/src-ahqstore-types/publish.ps1 @@ -0,0 +1,41 @@ +# Building +cargo test --features export + +# Packaging + +$cargotoml = Get-Content ./Cargo.toml -Raw + +# Request regexp +$cargotoml -match "version ?= ?(`"|')(?[0-9.]+)(`"|')" > $null + +# Query version +$version = $Matches.ver + + +# Query package.json +$data = Get-Content ./pkg/package.json | ConvertFrom-Json + +$data.version = $version + +# Convert back to json +$out = ConvertTo-Json $data -Depth 100 + +Set-Content "./pkg/package.json" -Value $out -Encoding utf8 + +$data.name = "@ahqstore/core-types" + +$out = ConvertTo-Json $data -Depth 100 + +Set-Content "./types/package.json" -Value $out -Encoding utf8 + +Copy-Item ./README.md ./pkg/README.MD +Copy-Item ./README.md ./types/README.MD + +# Publish +if ($env:NO_PUBLISH -ne "true") { + Set-Location pkg + npm publish --access public + Set-Location ../types + npm publish --access public + Set-Location .. +} \ No newline at end of file diff --git a/src-ahqstore-types/src/api/ahqstore.rs b/src-ahqstore-types/src/api/ahqstore.rs index 7d47c6e..c537e90 100644 --- a/src-ahqstore-types/src/api/ahqstore.rs +++ b/src-ahqstore-types/src/api/ahqstore.rs @@ -1,12 +1,14 @@ //! Declared URLS for: -//! AHQ Store Community Repository Parsable Urls (ahqstore/apps) +//! AHQ Store Community Repository Parsable Urls (ahqstore/repo_community) //! -//! Repository Mirror : +//! Repository : use std::sync::LazyLock; -pub static AHQSTORE_COMMIT_URL: &'static str = "https://api.github.com/repos/ahqstore/apps/commits"; -pub static AHQSTORE_BASE_URL: &'static str = "https://rawcdn.githack.com/ahqstore/apps/{COMMIT}"; +pub static AHQSTORE_COMMIT_URL: &'static str = + "https://api.github.com/repos/ahqstore/repo_community/commits"; +pub static AHQSTORE_BASE_URL: &'static str = + "https://cdn.jsdelivr.net/gh/ahqstore/repo_community@{COMMIT}"; pub static AHQSTORE_APP_URL: LazyLock = LazyLock::new(|| format!("{AHQSTORE_BASE_URL}/db/apps/{{APP_ID}}.json")); diff --git a/src-ahqstore-types/src/api/fdroid.rs b/src-ahqstore-types/src/api/fdroid.rs index 8b13789..d6b93b9 100644 --- a/src-ahqstore-types/src/api/fdroid.rs +++ b/src-ahqstore-types/src/api/fdroid.rs @@ -1 +1,31 @@ +//! Declared URLS for: +//! AHQ Store F-Droid Repo (f-droid mirror) +//! +//! Repository Mirror : +//! Thanks to F-Droid for providing the data +use std::sync::LazyLock; + +pub static FDROID_COMMIT_URL: &'static str = + "https://api.github.com/repos/ahqstore/repo_android/commits"; +pub static FDROID_BASE_URL: &'static str = + "https://cdn.jsdelivr.net/gh/ahqstore/repo_android@{COMMIT}"; + +pub static FDROID_APP_URL: LazyLock = + LazyLock::new(|| format!("{FDROID_BASE_URL}/db/apps/{{APP_ID}}.json")); +pub static FDROID_APP_ASSET_URL: LazyLock = + LazyLock::new(|| format!("{FDROID_BASE_URL}/db/res/{{APP_ID}}/{{ASSET}}")); + +pub static FDROID_TOTAL: LazyLock = LazyLock::new(|| format!("{FDROID_BASE_URL}/db/total")); +pub static FDROID_HOME: LazyLock = + LazyLock::new(|| format!("{FDROID_BASE_URL}/db/home.json")); + +pub static FDROID_SEARCH: LazyLock = + LazyLock::new(|| format!("{FDROID_BASE_URL}/db/search/{{ID}}.json")); +pub static FDROID_MAP: LazyLock = + LazyLock::new(|| format!("{FDROID_BASE_URL}/db/map/{{ID}}.json")); + +pub static FDROID_APPS_DEV: LazyLock = + LazyLock::new(|| format!("{FDROID_BASE_URL}/db/dev/{{ID}}")); +pub static FDROID_DEV_DATA: LazyLock = + LazyLock::new(|| format!("{FDROID_BASE_URL}/users/{{ID}}.json")); diff --git a/src-ahqstore-types/src/api/flatpak.rs b/src-ahqstore-types/src/api/flatpak.rs deleted file mode 100644 index 3d115b7..0000000 --- a/src-ahqstore-types/src/api/flatpak.rs +++ /dev/null @@ -1,186 +0,0 @@ -use std::collections::HashMap; - -use serde::{Deserialize, Serialize}; - -use crate::{ - AHQStoreApplication, AppRepo, DownloadUrl, InstallerFormat, InstallerOptions, - InstallerOptionsLinux, -}; - -use super::{SearchEntry, CLIENT}; - -pub static FH_BASE_URL: &'static str = "https://flathub.org/api/v2"; - -pub static SEARCH: &'static str = "https://flathub.org/api/v2/search?locale=en"; -pub static APP: &'static str = "https://flathub.org/api/v2/appstream/{{id}}"; -pub static SUMMARY_ARCHES: &'static str = "https://flathub.org/api/v2/summary/{{id}}"; - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct FlatpakApplication { - pub r#type: String, - pub description: String, - pub app_id: String, - pub name: String, - pub summary: String, - pub developer_name: String, - pub urls: Option, - pub project_license: Option, - pub icon: String, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct Urls { - pub homepage: Option, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct Summary { - pub arches: Vec, -} - -async fn get_ft_app(id: &str) -> Option { - CLIENT - .get(APP.replace("{{id}}", &id)) - .send() - .await - .ok()? - .json() - .await - .ok() -} - -pub async fn get_app(id: &str) -> Option { - let app_id = id.replacen("flatpak:", "", 1); - - let app = get_ft_app(&app_id).await?; - - let Summary { arches } = CLIENT - .get(SUMMARY_ARCHES.replace("{{id}}", &app_id)) - .send() - .await - .ok()? - .json() - .await - .ok()?; - - let mut linux: Option = None; - - #[allow(non_snake_case)] - let mut linuxArm64: Option = None; - - arches.into_iter().for_each(|s| { - if &s == "aarch64" { - linuxArm64 = InstallerOptionsLinux { assetId: 0 }.into(); - } else if &s == "x86_64" { - linux = InstallerOptionsLinux { assetId: 0 }.into(); - } - }); - - Some(AHQStoreApplication { - appDisplayName: app.name.clone(), - appId: format!("flatpak:{}", app.app_id), - appShortcutName: app.name, - authorId: format!("flathub"), - description: app.summary, - displayImages: vec![], - license_or_tos: app.project_license, - releaseTagName: format!("flathub"), - repo: AppRepo { - author: app.developer_name, - repo: "flathub".to_string(), - }, - site: app.urls.map_or_else(|| None, |x| x.homepage), - version: format!("flatpak:latest"), - source: Some(format!("Flatpak")), - install: InstallerOptions { - android: None, - linuxArm7: None, - win32: None, - winarm: None, - linux, - linuxArm64, - }, - downloadUrls: { - let mut map = HashMap::new(); - - map.insert( - 0, - DownloadUrl { - asset: "url".to_string(), - installerType: InstallerFormat::LinuxFlathubFlatpak, - url: "flatpak".into(), - }, - ); - - map - }, - resources: None, - verified: false - }) -} - -pub async fn get_app_asset(id: &str, _: T) -> Option> { - let id = id.replacen("flatpak:", "", 1); - let app = get_ft_app(&id).await?; - - CLIENT - .get(app.icon) - .send() - .await - .ok()? - .bytes() - .await - .ok()? - .to_vec() - .into() -} - -#[derive(Debug, Serialize, Deserialize)] -struct FlatpakSearchObject { - pub query: String, - pub filters: Vec<()>, -} - -#[derive(Debug, Serialize, Deserialize)] -struct FlatpakSearchReturnObject { - pub hits: Vec, -} - -#[derive(Debug, Serialize, Deserialize)] -struct FlatpakReturnedApplication { - pub name: String, - pub app_id: String, -} - -pub async fn search(query: &str) -> Option> { - use serde_json::to_string; - - let FlatpakSearchReturnObject { mut hits } = CLIENT - .post(SEARCH) - .body( - to_string(&FlatpakSearchObject { - query: query.to_string(), - filters: vec![], - }) - .ok()?, - ) - .send() - .await - .ok()? - .json::() - .await - .ok()?; - - hits.truncate(10); - - Some( - hits - .into_iter() - .map(|x| SearchEntry { - id: format!("flatpak:{}", x.app_id), - name: x.name.clone(), - title: x.name, - }) - .collect::>(), - ) -} diff --git a/src-ahqstore-types/src/api/internet.rs b/src-ahqstore-types/src/api/internet.rs index ccb59e5..382ffa1 100644 --- a/src-ahqstore-types/src/api/internet.rs +++ b/src-ahqstore-types/src/api/internet.rs @@ -3,9 +3,11 @@ //! Currently URL Declared AHQ Store Parsable Repos Officially Used are //! - 🛍️ AHQ Store Official Community Repository (AHQStore) //! - 🪟 Microsoft Winget Community Repository (WinGet) -//! - 🫓 Flathub Community Repository (FlatHub) +//! - 🫓 AHQ Store Linux AppImage Repository (AHQStore) //! - 📱 FDroid Android Community Repository (FDroid) +use std::env::consts::OS; + use crate::AHQStoreApplication; use super::{ @@ -13,35 +15,65 @@ use super::{ AHQSTORE_APPS_DEV, AHQSTORE_APP_ASSET_URL, AHQSTORE_APP_URL, AHQSTORE_DEV_DATA, AHQSTORE_HOME, AHQSTORE_MAP, AHQSTORE_SEARCH, AHQSTORE_TOTAL, }, - flatpak, + fdroid::{ + FDROID_APPS_DEV, FDROID_APP_ASSET_URL, FDROID_APP_URL, FDROID_DEV_DATA, FDROID_HOME, + FDROID_MAP, FDROID_SEARCH, FDROID_TOTAL, + }, + linux::{ + self, LINUX_APPS_DEV, LINUX_APP_ASSET_URL, LINUX_APP_URL, LINUX_DEV_DATA, LINUX_HOME, + LINUX_MAP, LINUX_SEARCH, LINUX_TOTAL, + }, methods::{self, OfficialManifestSource, Store}, winget::{ - WINGET_APPS_DEV, WINGET_APP_ASSET_URL, WINGET_APP_URL, WINGET_MAP, WINGET_SEARCH, WINGET_TOTAL, + WINGET_APPS_DEV, WINGET_APP_ASSET_URL, WINGET_APP_URL, WINGET_DEV_DATA, WINGET_HOME, + WINGET_MAP, WINGET_SEARCH, WINGET_TOTAL, }, - SearchEntry, + Home, SearchEntry, }; use anyhow::{anyhow, Context, Result}; use serde::{Deserialize, Serialize}; -#[derive(Debug, Serialize, Deserialize)] +#[cfg_attr(feature = "export", derive(specta::Type))] +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] pub struct Commits { pub ahqstore: String, - pub winget: String, + pub alt: String, } - pub async fn get_all_commits(token: Option) -> Result { let ahqstore = methods::get_commit(Store::AHQStore, token.as_ref()) .await .context("http")?; + + #[cfg(windows)] let winget = methods::get_commit(Store::WinGet, token.as_ref()) .await .context("http")?; - Ok(Commits { ahqstore, winget }) -} + #[cfg(target_os = "android")] + let fdroid = methods::get_commit(Store::FDroid, token.as_ref()) + .await + .context("http")?; + + #[cfg(target_os = "linux")] + let l = methods::get_commit(Store::FDroid, token.as_ref()) + .await + .context("http")?; + Ok(Commits { + ahqstore, + #[cfg(not(any(windows, target_os = "android", target_os = "linux")))] + alt: "".to_string(), + #[cfg(windows)] + alt: winget, + #[cfg(target_os = "android")] + alt: fdroid, + #[cfg(target_os = "linux")] + alt: l, + }) +} +#[allow(unreachable_patterns)] pub async fn get_total_maps_by_source( source: OfficialManifestSource, commit: &str, @@ -49,6 +81,8 @@ pub async fn get_total_maps_by_source( let total = match source { OfficialManifestSource::AHQStore => &*AHQSTORE_TOTAL, OfficialManifestSource::WinGet => &*WINGET_TOTAL, + OfficialManifestSource::FDroid => &*FDROID_TOTAL, + OfficialManifestSource::Linux => &*LINUX_TOTAL, _ => { return Err(anyhow!("source not supported")); } @@ -56,16 +90,21 @@ pub async fn get_total_maps_by_source( methods::get_total_maps(total, commit).await.context("") } +#[allow(unreachable_patterns)] +pub async fn get_home(source: OfficialManifestSource, commit: &str) -> Result { + let home = match source { + OfficialManifestSource::AHQStore => &*AHQSTORE_HOME, + OfficialManifestSource::WinGet => &*WINGET_HOME, + OfficialManifestSource::FDroid => &*FDROID_HOME, + OfficialManifestSource::Linux => &*LINUX_HOME, + _ => { + return Err(anyhow!("source not supported")); + } + }; -pub async fn get_home(ahqstore_repo_commit: &str) -> Result)>> { - let home = &*AHQSTORE_HOME; - - methods::get_home(home, ahqstore_repo_commit) - .await - .context("") + methods::get_home(home, commit).await.context("") } - pub async fn get_search_by_source( source: OfficialManifestSource, commit: &str, @@ -74,15 +113,13 @@ pub async fn get_search_by_source( let search = match source { OfficialManifestSource::AHQStore => &*AHQSTORE_SEARCH, OfficialManifestSource::WinGet => &*WINGET_SEARCH, - _ => { - return Err(anyhow!("")); - } + OfficialManifestSource::FDroid => &*FDROID_SEARCH, + OfficialManifestSource::Linux => &*LINUX_SEARCH, }; methods::get_search(search, commit, id).await.context("") } - pub async fn get_all_maps_by_source( source: OfficialManifestSource, commit: &str, @@ -90,9 +127,8 @@ pub async fn get_all_maps_by_source( let (total, map) = match source { OfficialManifestSource::AHQStore => (&*AHQSTORE_TOTAL, &*AHQSTORE_MAP), OfficialManifestSource::WinGet => (&*WINGET_TOTAL, &*WINGET_MAP), - _ => { - return Err(anyhow!("source not supported")); - } + OfficialManifestSource::FDroid => (&*FDROID_TOTAL, &*FDROID_MAP), + OfficialManifestSource::Linux => (&*LINUX_TOTAL, &*LINUX_MAP), }; let (total, map) = (total.as_str(), map.as_str()); @@ -100,34 +136,33 @@ pub async fn get_all_maps_by_source( methods::get_full_map(total, map, commit).await.context("") } - pub async fn get_all_search(commit: &Commits) -> Result> { let total = &*AHQSTORE_TOTAL; let search = &*AHQSTORE_SEARCH; - #[allow(unused_mut)] let mut result: Vec = methods::get_full_search(total, search, &commit.ahqstore) .await .context("")?; - #[cfg(any(feature = "all_platforms", windows))] - { - let total = &*WINGET_TOTAL; - let search = &*WINGET_SEARCH; + let (total, search) = match OS { + "windows" => (&*WINGET_TOTAL, &*WINGET_SEARCH), + "linux" => (&*LINUX_TOTAL, &*LINUX_SEARCH), + "android" => (&*FDROID_TOTAL, &*FDROID_SEARCH), + _ => unreachable!(), + }; - result.append( - &mut methods::get_full_search(total, search, &commit.winget) - .await - .context("")?, - ); - } + result.append( + &mut methods::get_full_search(total, search, &commit.alt) + .await + .context("")?, + ); Ok(result) } pub type RespMapData = super::MapData; - +#[allow(unreachable_patterns)] pub async fn get_map_by_source( source: OfficialManifestSource, commit: &str, @@ -136,6 +171,8 @@ pub async fn get_map_by_source( let map = match source { OfficialManifestSource::AHQStore => &*AHQSTORE_MAP, OfficialManifestSource::WinGet => &*WINGET_MAP, + OfficialManifestSource::FDroid => &*FDROID_MAP, + OfficialManifestSource::Linux => &*LINUX_MAP, _ => { return Err(anyhow!("source not supported")); } @@ -144,93 +181,76 @@ pub async fn get_map_by_source( methods::get_map(map, commit, id).await.context("") } - -pub async fn get_devs_apps( - commit: &Commits, - dev_id: &str, -) -> Result> { - match dev_id { - "flatpak" | "fdroid" => { - // Not worth it to make the api (yer) - return Ok(vec![]); - } - _ => {} - }; - - let (commit, apps_dev) = if dev_id.starts_with("winget_") { - (&commit.winget, &*WINGET_APPS_DEV) - } else { - (&commit.ahqstore, &*AHQSTORE_APPS_DEV) +pub async fn get_devs_apps(commit: &Commits, dev_id: &str) -> Result> { + let (commit, apps_dev) = match &dev_id[0..2] { + "a:" => (&commit.ahqstore, &*AHQSTORE_APPS_DEV), + e => ( + &commit.alt, + match e { + "w:" => &*WINGET_APPS_DEV, + "f:" => &*FDROID_APPS_DEV, + "l:" => &*LINUX_APPS_DEV, + _ => unreachable!(), + }, + ), }; - methods::get_devs_apps(apps_dev, commit, dev_id) + methods::get_devs_apps(apps_dev, commit, &dev_id[2..]) .await .context("") } - -pub async fn get_dev_data( - commit: &Commits, - id: &str, -) -> Result { - let dev_data = match id { - "winget" => { - return Ok(super::DevData { - name: "WinGet".into(), - id: "winget".into(), - github: "https://github.com/microsoft/winget-pkgs".into(), - avatar_url: "https://github.com/microsoft/winget-cli/blob/master/.github/images/WindowsPackageManager_Assets/ICO/PNG/_64.png?raw=true".into(), - }); - } - "flathub" => { - return Ok(super::DevData { - name: "FlatHub".into(), - id: "flathub".into(), - github: "https://github.com/flathub".into(), - avatar_url: "https://avatars.githubusercontent.com/u/27268838?s=200&v=4".into(), - }); - } - "fdroid" => { - return Ok(super::DevData { - name: "F-Droid".into(), - id: "fdroid".into(), - avatar_url: "https://avatars.githubusercontent.com/u/8239603?s=200&v=4".into(), - github: "https://github.com/f-droid".into(), - }) - } - _ => &*AHQSTORE_DEV_DATA, +pub async fn get_dev_data(commit: &Commits, id: &str) -> Result { + let (commit, dev_data) = match &id[0..2] { + "a:" => (&commit.ahqstore, &*AHQSTORE_DEV_DATA), + e => ( + &commit.alt, + match e { + "w:" => &*WINGET_DEV_DATA, + "f:" => &*FDROID_DEV_DATA, + "l:" => &*LINUX_DEV_DATA, + _ => unreachable!(), + }, + ), }; - methods::get_dev_data(dev_data, &commit.ahqstore, id) + methods::get_dev_data(dev_data, commit, &id[2..]) .await .context("") } pub async fn get_app_asset(commit: &Commits, app_id: &str, asset: &str) -> Option> { - if app_id.starts_with("flathub:") { - return flatpak::get_app_asset(app_id, asset).await; - } - - let (commit, app_asset_url) = if app_id.starts_with("winget_app_") { - (&commit.winget, &*WINGET_APP_ASSET_URL) - } else { - (&commit.ahqstore, &*AHQSTORE_APP_ASSET_URL) + let (commit, app_asset_url) = match &app_id[0..2] { + "a:" => (&commit.ahqstore, &*AHQSTORE_APP_ASSET_URL), + e => ( + &commit.alt, + match e { + "w:" => &*WINGET_APP_ASSET_URL, + "f:" => &*FDROID_APP_ASSET_URL, + "l:" => &*LINUX_APP_ASSET_URL, + _ => unreachable!(), + }, + ), }; - methods::get_app_asset(app_asset_url, commit, app_id, asset).await + methods::get_app_asset(app_asset_url, commit, &app_id[2..], asset).await } - pub async fn get_app(commit: &Commits, app_id: &str) -> Result { - if app_id.starts_with("flathub:") { - return flatpak::get_app(app_id).await.context(""); - } - - let (commit, app_url) = if app_id.starts_with("winget_app_") { - (&commit.winget, &*WINGET_APP_URL) - } else { - (&commit.ahqstore, &*AHQSTORE_APP_URL) + let (commit, app_asset_url) = match &app_id[0..2] { + "a:" => (&commit.ahqstore, &*AHQSTORE_APP_URL), + e => ( + &commit.alt, + match e { + "w:" => &*WINGET_APP_URL, + "f:" => &*FDROID_APP_URL, + "l:" => &*LINUX_APP_URL, + _ => unreachable!(), + }, + ), }; - methods::get_app(app_url, commit, app_id).await.context("") + methods::get_app(app_asset_url, commit, &app_id[2..]) + .await + .context("HTTP Error") } diff --git a/src-ahqstore-types/src/api/linux.rs b/src-ahqstore-types/src/api/linux.rs new file mode 100644 index 0000000..fd69cb8 --- /dev/null +++ b/src-ahqstore-types/src/api/linux.rs @@ -0,0 +1,30 @@ +//! Declared URLS for: +//! AHQ Store AppImage Repository (ahqstore/repo_linux) +//! +//! Repository Mirror : + +use std::sync::LazyLock; + +pub static LINUX_COMMIT_URL: &'static str = + "https://api.github.com/repos/ahqstore/repo_linux/commits"; +pub static LINUX_BASE_URL: &'static str = + "https://cdn.jsdelivr.net/gh/ahqstore/repo_linux@{COMMIT}"; + +pub static LINUX_APP_URL: LazyLock = + LazyLock::new(|| format!("{LINUX_BASE_URL}/db/apps/{{APP_ID}}.json")); +pub static LINUX_APP_ASSET_URL: LazyLock = + LazyLock::new(|| format!("{LINUX_BASE_URL}/db/res/{{APP_ID}}/{{ASSET}}")); + +pub static LINUX_TOTAL: LazyLock = LazyLock::new(|| format!("{LINUX_BASE_URL}/db/total")); +pub static LINUX_HOME: LazyLock = + LazyLock::new(|| format!("{LINUX_BASE_URL}/db/home.json")); + +pub static LINUX_SEARCH: LazyLock = + LazyLock::new(|| format!("{LINUX_BASE_URL}/db/search/{{ID}}.json")); +pub static LINUX_MAP: LazyLock = + LazyLock::new(|| format!("{LINUX_BASE_URL}/db/map/{{ID}}.json")); + +pub static LINUX_APPS_DEV: LazyLock = + LazyLock::new(|| format!("{LINUX_BASE_URL}/db/dev/{{ID}}")); +pub static LINUX_DEV_DATA: LazyLock = + LazyLock::new(|| format!("{LINUX_BASE_URL}/users/{{ID}}.json")); diff --git a/src-ahqstore-types/src/api/methods.rs b/src-ahqstore-types/src/api/methods.rs index 7180087..a1ddf60 100644 --- a/src-ahqstore-types/src/api/methods.rs +++ b/src-ahqstore-types/src/api/methods.rs @@ -6,29 +6,31 @@ use std::collections::HashMap; -#[cfg(feature = "js")] -use wasm_bindgen::prelude::wasm_bindgen; - use serde::{Deserialize, Serialize}; use crate::AHQStoreApplication; -use super::{ahqstore::AHQSTORE_COMMIT_URL, winget::WINGET_COMMIT_URL, RepoHomeData, CLIENT}; +use super::{ + ahqstore::AHQSTORE_COMMIT_URL, fdroid::FDROID_COMMIT_URL, linux::LINUX_COMMIT_URL, + winget::WINGET_COMMIT_URL, Home, CLIENT, +}; +#[cfg_attr(feature = "export", derive(specta::Type))] #[derive(Serialize, Deserialize)] -#[cfg_attr(feature = "js", wasm_bindgen(getter_with_clone))] + pub struct GHRepoCommit { pub sha: String, } pub enum OfficialManifestSource { + /// Official Community repository AHQStore, - #[doc = "Third Party Manifest Repo Adapted for use"] + /// Third Party Manifest Repo Adapted for use WinGet, - #[doc = "Third Party API Used"] - FlatHub, - #[doc = "Third Party API Used"] + /// Third Party Manifest Repo Adapted for use + Linux, + /// Third Party Manifest Repo Adapted for use FDroid, } @@ -36,10 +38,13 @@ pub type Store = OfficialManifestSource; pub type GHRepoCommits = Vec; +#[allow(unreachable_patterns)] pub async fn get_commit(store: OfficialManifestSource, token: Option<&String>) -> Option { let mut builder = CLIENT.get(match store { OfficialManifestSource::AHQStore => AHQSTORE_COMMIT_URL, OfficialManifestSource::WinGet => WINGET_COMMIT_URL, + OfficialManifestSource::FDroid => FDROID_COMMIT_URL, + OfficialManifestSource::Linux => LINUX_COMMIT_URL, _ => { return None; } @@ -67,33 +72,15 @@ pub async fn get_total_maps(total: &str, commit: &str) -> Option { .ok() } -pub async fn get_home(home: &str, commit: &str) -> Option)>> { - let home: RepoHomeData = CLIENT +pub async fn get_home(home: &str, commit: &str) -> Option { + CLIENT .get(home.replace("{COMMIT}", commit)) .send() .await .ok()? .json() .await - .ok()?; - - let mut resp_home = vec![]; - - for (title, data) in home { - let mut resp_data = vec![]; - - for item in data { - let id = item.get_id(); - - if let Some(id) = id { - resp_data.push(id); - } - } - - resp_home.push((title, resp_data)); - } - - Some(resp_home) + .ok() } pub async fn get_search(search: &str, commit: &str, id: &str) -> Option> { @@ -112,15 +99,13 @@ pub async fn get_search(search: &str, commit: &str, id: &str) -> Option Option { let total = get_total_maps(total, commit).await?; - let mut result = HashMap::new(); + let mut result = vec![]; let mut i = 1; while i <= total { - let map_result = get_map(map, commit, &i.to_string()).await?; + let map = get_map(map, commit, &i.to_string()).await?; - for (k, v) in map_result { - result.insert(k, v); - } + result.extend(map); i += 1; } @@ -140,7 +125,7 @@ pub async fn get_full_search( let mut i = 1; while i <= total { let mut search_result = get_search(search, commit, &i.to_string()).await?; - + result.append(&mut search_result); i += 1; } diff --git a/src-ahqstore-types/src/api/mod.rs b/src-ahqstore-types/src/api/mod.rs index 1146b27..190495f 100644 --- a/src-ahqstore-types/src/api/mod.rs +++ b/src-ahqstore-types/src/api/mod.rs @@ -1,15 +1,6 @@ -#[cfg(feature = "js")] -use wasm_bindgen::prelude::wasm_bindgen; - -#[cfg(feature = "js")] -use tsify::declare; - use serde::{Deserialize, Serialize}; use std::collections::HashMap; -#[cfg(feature = "search")] -use fuse_rust::{FuseProperty, Fuseable}; - #[cfg(feature = "internet")] pub mod internet; @@ -26,14 +17,11 @@ pub mod ahqstore; pub mod winget; #[cfg(feature = "internet")] -pub mod flatpak; +pub mod linux; #[cfg(feature = "internet")] pub mod fdroid; -#[cfg(all(feature = "internet", feature = "search"))] -pub mod search; - use reqwest::{Client, ClientBuilder}; use std::sync::LazyLock; @@ -44,82 +32,102 @@ pub static CLIENT: LazyLock = LazyLock::new(|| { .unwrap() }); -#[cfg_attr(feature = "js", declare)] -pub type MapData = HashMap; +pub type MapData = Vec; + +#[cfg_attr(feature = "export", derive(specta::Type))] +#[derive(Debug, Clone)] + +/// This is exactly `Vec<(String, Vec)>` +pub struct HomeMapData { + inner: Vec<(String, Vec)>, +} + +impl Serialize for HomeMapData { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + self.inner.serialize(serializer) + } +} -#[derive(Debug, Serialize, Deserialize, Clone)] -pub struct HomeItem { - pub ahqstore: Option, - pub winget: Option, - pub flatpak: Option, - pub fdroid: Option, +impl<'de> Deserialize<'de> for HomeMapData { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + let inner = Vec::deserialize(deserializer)?; + Ok(HomeMapData { inner }) + } } -impl HomeItem { - pub fn get_id(self) -> Option { - if let Some(x) = self.ahqstore { - return Some(x); - } +#[cfg_attr(feature = "export", derive(specta::Type))] +#[derive(Serialize, Deserialize, Debug, Clone)] - #[cfg(target_os = "windows")] - return self.winget; +pub struct Home { + pub splash: Option, + pub home: HomeMapData, +} - #[cfg(target_os = "linux")] - return self.flatpak; +#[cfg_attr(feature = "export", derive(specta::Type))] +#[derive(Serialize, Deserialize, Debug, Clone)] - #[cfg(target_os = "android")] - return self.fdroid; +pub struct Splash { + pub hero: Hero, + pub subhero: SubHero, + pub third: Semi, + pub fourth: Semi, +} - #[cfg(not(any(target_os = "windows", target_os = "linux", target_os = "android")))] - return None; - } +#[cfg_attr(feature = "export", derive(specta::Type))] +#[derive(Serialize, Deserialize, Debug, Clone)] +#[allow(non_snake_case)] +pub struct Hero { + pub title: String, + pub description: String, + pub button: String, + pub background: String, + pub author: String, + pub appId: String, } -pub type RepoHomeData = Vec<(String, Vec)>; -pub type HomeData = Vec<(String, Vec)>; +#[cfg_attr(feature = "export", derive(specta::Type))] +#[derive(Serialize, Deserialize, Debug, Clone)] +#[allow(non_snake_case)] +pub struct SubHero { + pub title: String, + pub background: String, + pub appId: String, + pub color: Option, +} +#[cfg_attr(feature = "export", derive(specta::Type))] +#[derive(Serialize, Deserialize, Debug, Clone)] +#[allow(non_snake_case)] +pub struct Semi { + pub title: String, + pub background: String, + pub appId: String, + pub color: Option, +} + +#[cfg_attr(feature = "export", derive(specta::Type))] #[derive(Serialize, Deserialize, Debug)] -#[cfg_attr(feature = "js", wasm_bindgen(getter_with_clone))] + pub struct SearchEntry { pub name: String, pub title: String, pub id: String, } -#[cfg(feature = "search")] -impl Fuseable for SearchEntry { - fn properties(&self) -> Vec { - vec![ - FuseProperty { - value: "id".into(), - weight: 0.34, - }, - FuseProperty { - value: "title".into(), - weight: 0.33, - }, - FuseProperty { - value: "name".into(), - weight: 0.33, - }, - ] - } - - fn lookup(&self, key: &str) -> Option<&str> { - match key { - "name" => Some(&self.name), - "title" => Some(&self.title), - "id" => Some(&self.id), - _ => None, - } - } -} - +#[cfg_attr(feature = "export", derive(specta::Type))] #[derive(Serialize, Deserialize, Debug)] -#[cfg_attr(feature = "js", wasm_bindgen(getter_with_clone))] + pub struct DevData { - pub name: String, + pub name: Option, pub id: String, pub github: String, - pub avatar_url: String, + pub avatar_url: Option, + #[serde(default)] + pub verified: bool, } diff --git a/src-ahqstore-types/src/api/search.rs b/src-ahqstore-types/src/api/search.rs deleted file mode 100644 index ee32913..0000000 --- a/src-ahqstore-types/src/api/search.rs +++ /dev/null @@ -1,130 +0,0 @@ -use super::{flatpak, get_all_commits, get_all_search, Commits, SearchEntry}; -use anyhow::{Context, Result}; -use fuse_rust::{Fuse, Fuseable}; -use serde::Serialize; -use std::{ - ptr::{addr_of, addr_of_mut}, - sync::LazyLock, - time::{SystemTime, UNIX_EPOCH}, -}; - -fn now() -> u64 { - SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap() - .as_secs() -} - -struct SCache { - e: Vec, - t: u64, -} - -static mut SEARCH: Option = None; -static FUSE: LazyLock = LazyLock::new(|| Fuse::default()); - -fn get_search_inner() -> Option<&'static Vec> { - let search = unsafe { - let addr = addr_of!(SEARCH); - let addr = &*addr; - - let addr = addr.as_ref(); - addr - }; - - let Some(x) = search else { - return None; - }; - - if x.t > now() { - return Some(&x.e); - } - - return None; -} - -#[derive(Debug)] -pub enum RespSearchEntry { - Static(&'static SearchEntry), - Owned(SearchEntry), - None, -} - -impl Fuseable for RespSearchEntry { - fn lookup(&self, key: &str) -> Option<&str> { - match self { - RespSearchEntry::Owned(x) => x.lookup(key), - RespSearchEntry::Static(x) => x.lookup(key), - RespSearchEntry::None => None - } - } - - fn properties(&self) -> Vec { - match self { - RespSearchEntry::Owned(x) => x.properties(), - RespSearchEntry::Static(x) => x.properties(), - RespSearchEntry::None => vec![], - } - } -} - -impl Serialize for RespSearchEntry { - fn serialize(&self, serializer: S) -> std::result::Result - where - S: serde::Serializer { - match self { - RespSearchEntry::Owned(x) => x.serialize(serializer), - RespSearchEntry::Static(x) => x.serialize(serializer), - RespSearchEntry::None => "".serialize(serializer) - } - } -} - - -pub async fn get_search(commit: Option<&Commits>, query: &str) -> Result> { - let search = get_search_inner(); - - let search = if search.is_none() { - let commit = if commit.is_none() { - &get_all_commits(None).await? - } else { - commit.unwrap() - }; - - let search = get_all_search(commit).await?; - - let addr = unsafe { &mut *addr_of_mut!(SEARCH) }; - *addr = Some(SCache { - e: search, - t: now() + 6 * 60, - }); - - get_search_inner().unwrap() - } else { - search.unwrap() - }; - - let mut res = vec![]; - - for val in FUSE.search_text_in_fuse_list(query, search) { - res.push(RespSearchEntry::Static(&search[val.index])); - } - - #[cfg(any(feature = "all_platforms", target_os = "linux"))] - for val in flatpak::search(query).await.context("")? { - res.push(RespSearchEntry::Owned(val)); - } - - let mut final_res = vec![]; - for val in FUSE.search_text_in_fuse_list(query, &res) { - let dummy = RespSearchEntry::None; - - let resp = std::mem::replace(&mut res[val.index], dummy); - - final_res.push(resp); - } - - drop(res); - - Ok(final_res) -} diff --git a/src-ahqstore-types/src/api/winget.rs b/src-ahqstore-types/src/api/winget.rs index dbfd03e..4f602a3 100644 --- a/src-ahqstore-types/src/api/winget.rs +++ b/src-ahqstore-types/src/api/winget.rs @@ -1,15 +1,15 @@ //! Declared URLS for: //! AHQ Store WinGet Repo Parsable Urls (microsoft/winget-pkgs mirror) //! -//! Repository Mirror : +//! Repository Mirror : //! Thanks to winget-pkgs@microsoft for providing the data use std::sync::LazyLock; pub static WINGET_COMMIT_URL: &'static str = - "https://api.github.com/repos/ahqstore/ahqstore-winget-pkgs/commits"; + "https://api.github.com/repos/ahqstore/repo_win32/commits"; pub static WINGET_BASE_URL: &'static str = - "https://rawcdn.githack.com/ahqstore/ahqstore-winget-pkgs/{COMMIT}"; + "https://cdn.jsdelivr.net/gh/ahqstore/repo_win32@{COMMIT}"; pub static WINGET_APP_URL: LazyLock = LazyLock::new(|| format!("{WINGET_BASE_URL}/db/apps/{{APP_ID}}.json")); @@ -17,6 +17,8 @@ pub static WINGET_APP_ASSET_URL: LazyLock = LazyLock::new(|| format!("{WINGET_BASE_URL}/db/res/{{APP_ID}}/{{ASSET}}")); pub static WINGET_TOTAL: LazyLock = LazyLock::new(|| format!("{WINGET_BASE_URL}/db/total")); +pub static WINGET_HOME: LazyLock = + LazyLock::new(|| format!("{WINGET_BASE_URL}/db/home.json")); pub static WINGET_SEARCH: LazyLock = LazyLock::new(|| format!("{WINGET_BASE_URL}/db/search/{{ID}}.json")); diff --git a/src-ahqstore-types/src/app/install.rs b/src-ahqstore-types/src/app/install.rs index f3e3012..1275f33 100644 --- a/src-ahqstore-types/src/app/install.rs +++ b/src-ahqstore-types/src/app/install.rs @@ -1,52 +1,70 @@ -#[cfg(feature = "js")] -use wasm_bindgen::prelude::wasm_bindgen; - use std::env::consts::{ARCH, OS}; use serde::{Deserialize, Serialize}; #[allow(non_snake_case)] +#[cfg_attr(feature = "export", derive(specta::Type))] #[derive(Serialize, Deserialize, Debug, Clone)] -#[cfg_attr(feature = "js", wasm_bindgen(getter_with_clone))] + pub struct InstallerOptions { - #[doc = "🎯 Introduced in v1\n\n"] + /// 🎯 Introduced in v1 +/// +/// pub win32: Option, - #[doc = "🎯 Introduced in v2\n\n"] + /// 🎯 Introduced in v2 +/// +/// pub winarm: Option, - #[doc = "🎯 Introduced in v1\n\n"] + /// 🎯 Introduced in v1 +/// +/// pub linux: Option, - #[doc = "🎯 Introduced in v2\n\n"] + /// 🎯 Introduced in v2 +/// +/// pub linuxArm64: Option, - #[doc = "🎯 Introduced in v2\n\n"] + /// 🎯 Introduced in v2 +/// +/// pub linuxArm7: Option, - #[doc = "🔬 Planned\n🎯 Introduced in v2\n\n"] + /// 🔬 Planned\n🎯 Introduced in v2 +/// +/// pub android: Option, } #[allow(non_snake_case)] +#[cfg_attr(feature = "export", derive(specta::Type))] #[derive(Serialize, Deserialize, Debug, Clone)] -#[cfg_attr(feature = "js", wasm_bindgen)] + pub enum WindowsInstallScope { User, - Machine + Machine, } #[allow(non_snake_case)] +#[cfg_attr(feature = "export", derive(specta::Type))] #[derive(Serialize, Deserialize, Debug, Clone)] -#[cfg_attr(feature = "js", wasm_bindgen(getter_with_clone))] + pub struct InstallerOptionsWindows { - #[doc = "🎯 Introduced in v2\n\n"] + /// 🎯 Introduced in v2 +/// +/// pub assetId: u8, /// The exe to link as a shortcut[^1] /// /// [^1]: Only if you choose WindowsZip pub exec: Option, - #[doc = "🎯 Introduced in v2.5\n\n"] + /// 🎯 Introduced in v1 +/// +/// /// The scope of the installer[^1] /// /// [^1]: Applicable for WindowsInstallerExe or WindowsZip only, WindowsInstallerMsi is treated as Machine pub scope: Option, - #[doc = "🎯 Stable as of v2.5\n\n"] + /// 🎯 Stable as of v3 +/// +/// /// Args to pass to the custom exe installer[^1] /// /// [^1]: Only if you choose WindowsInstallerExe @@ -54,20 +72,67 @@ pub struct InstallerOptionsWindows { } #[allow(non_snake_case)] +#[cfg_attr(feature = "export", derive(specta::Type))] #[derive(Serialize, Deserialize, Debug, Clone)] -#[doc = "🔬 Planned\n\n"] -#[cfg_attr(feature = "js", wasm_bindgen(getter_with_clone))] +/// 🔬 Under Development +/// +/// + +pub enum AndroidAbi { + Aarch64, + Armv7, + X86, + X64, +} + +impl AndroidAbi { + fn normalize(&self) -> &'static str { + match self { + &Self::Aarch64 => "android-aarch64", + &Self::Armv7 => "android-armv7", + &Self::X86 => "android-x86", + &Self::X64 => "android-x86_64", + } + } +} + +fn android_abi() -> &'static str { + match ARCH { + "x86" => "android-x86", + "x86_64" => "android-x86_64", + "arm" => "android-armv7", + "aarch64" => "android-aarch64", + _ => "none", + } +} + +#[allow(non_snake_case)] +#[cfg_attr(feature = "export", derive(specta::Type))] +#[derive(Serialize, Deserialize, Debug, Clone)] +/// 🔬 Under Development +/// +/// + pub struct InstallerOptionsAndroid { - #[doc = "🎯 Introduced in v2\n\n"] + /// 🎯 Introduced in v2 +/// +/// pub assetId: u8, + pub min_sdk: u32, + pub abi: Vec, } #[allow(non_snake_case)] +#[cfg_attr(feature = "export", derive(specta::Type))] #[derive(Serialize, Deserialize, Debug, Clone)] -#[doc = "🔬 Under Development\n\n"] -#[cfg_attr(feature = "js", wasm_bindgen(getter_with_clone))] +/// 🔬 Under Development +/// +/// + pub struct InstallerOptionsLinux { - #[doc = "🎯 Introduced in v2\n\n"] + /// 🎯 Introduced in v2 +/// +/// pub assetId: u8, } @@ -80,7 +145,7 @@ macro_rules! push_install_arch { } impl InstallerOptions { - #[doc = "🎯 Introduced in v2"] + /// 🎯 Introduced in v2 pub fn list_os_arch(&self) -> Vec<&'static str> { let mut arch = vec![]; @@ -101,22 +166,40 @@ impl InstallerOptions { push_install_arch!(arch -> self.linux, "linux-x86_64"); push_install_arch!(arch -> self.linuxArm64, "linux-aarch64"); push_install_arch!(arch -> self.linuxArm7, "linux-arm"); - push_install_arch!(arch -> self.android, "android"); + + if let Some(x) = &self.android { + x.abi.iter().for_each(|x| arch.push(x.normalize())); + } arch } - #[doc = "🎯 Introduced in v2"] + /// 🎯 Introduced in v2 pub fn is_supported(&self) -> bool { let os = self.list_os_arch(); if OS == "android" { - return os.contains(&"android"); + return os.contains(&android_abi()); } os.contains(&format!("{}-{}", OS, ARCH).as_str()) } - #[doc = "🎯 Introduced in v2"] + /// 🎯 Introduced in v3 + pub fn is_supported_android(&self, sdk: u32) -> bool { + let os = self.list_os_arch(); + + let Some(x) = &self.android else { + return false; + }; + + if OS == "android" { + return os.contains(&android_abi()) && x.min_sdk == sdk; + } + + false + } + + /// 🎯 Introduced in v2 pub fn has_platform(&self) -> bool { self.is_supported() } diff --git a/src-ahqstore-types/src/app/mod.rs b/src-ahqstore-types/src/app/mod.rs index 2a7786e..938e03a 100644 --- a/src-ahqstore-types/src/app/mod.rs +++ b/src-ahqstore-types/src/app/mod.rs @@ -1,27 +1,24 @@ use serde::{Deserialize, Serialize}; use serde_json::to_string; -use std::{collections::HashMap, env::consts::ARCH}; +use std::{ + collections::HashMap, + env::consts::ARCH, + time::{SystemTime, UNIX_EPOCH}, +}; pub mod install; mod other_fields; -#[cfg(feature = "js")] -use tsify::*; - -#[cfg(feature = "js")] -use wasm_bindgen::JsValue; - -#[cfg(feature = "js")] -use kfghdfghdfkgh_js_macros::TsifyAsync; - pub use install::*; pub use other_fields::*; +use crate::api::Commits; + #[allow(non_snake_case)] +#[cfg_attr(feature = "export", derive(specta::Type))] #[derive(Serialize, Deserialize, Debug, Clone)] -#[doc = "Use the official ahqstore () cli\n🎯 Introduced in v1, Revamped in v2"] -#[cfg_attr(feature = "js", derive(Tsify, TsifyAsync))] -#[cfg_attr(feature = "js", tsify(into_wasm_abi, from_wasm_abi))] +/// Use the official ahqstore () cli\n🎯 Introduced in v1, Revamped in v2 + pub struct AHQStoreApplication { /// The ID of the application pub appId: String, @@ -50,11 +47,15 @@ pub struct AHQStoreApplication { /// App description pub description: String, - /// Your Github Repo associated + /// The Github Repo associated pub repo: AppRepo, - /// Will be generated by the cli, it is the unique-version-hash of your app - pub version: String, + /// A version provided by the user, like AHQ Store CLI + pub usrVersion: Option, + + /// Will be automatically overriden + #[cfg_attr(feature = "export", specta(type = u32))] + pub version: u64, /// The Site to your app pub site: Option, @@ -67,7 +68,7 @@ pub struct AHQStoreApplication { /// License type or Terms of Service Page pub license_or_tos: Option, - /// These Resources will be passed to the installer, the size of all the `Vec` must not be more than 5 * 1024 * 1024 * 1024 bytes (~5MB) + /// These Resources will be passed to the installer, the size of all the `Vec` must not be more than 5 * 1024 * 1024 bytes (~5MiB) pub resources: Option>>, /// This is set to true when the app is verified by the AHQ Store Team @@ -78,20 +79,37 @@ impl AHQStoreApplication { pub const RESOURCE_ID_ICON: u8 = 0; pub const RESOURCE_IMAGE: fn(u8) -> u8 = |x| x + 1; + pub const AHQSTORE_OFFICIAL_AUTHOR_ID: &str = "1"; + #[cfg(feature = "apps_repo")] pub fn validate(&self) -> Result { let mut result = String::new(); result.push_str(&self.validate_resource()); - if self.appId.starts_with("flatpak") - || self.appId.starts_with("fdroid") - || self.appId.starts_with("winget") + if let Some(ver) = &self.usrVersion { + if !ver.is_ascii() { + result.push_str("❌ Version of not plain ascii\n"); + } + + if !ver.chars().all(|x| x.is_alphanumeric()) { + result.push_str("❌ Version is not alphanumeric\n"); + } + + if ver.len() > 12 { + result.push_str("❌ Version is longer than 12 characters\n"); + } + } + + if self.appId.starts_with("l:") + || self.appId.starts_with("f:") + || self.appId.starts_with("w:") + || !self.appId.chars().all(|x| x.is_alphanumeric()) { - result.push_str("❌ AppId must not start with flatpak, fdroid or winget\n"); + result.push_str("❌ AppId must not start with l:, f:, w: and must be alphanumeric\n"); } - if &self.authorId != "1" { + if &self.authorId != Self::AHQSTORE_OFFICIAL_AUTHOR_ID { if &self.releaseTagName == "latest" { result.push_str("❌ ReleaseTagName can't be latest\n"); } @@ -121,8 +139,8 @@ impl AHQStoreApplication { let mut resp = String::new(); - if total > 5 * 1024 * 1024 * 1024 { - resp.push_str("❌ Total size of all resources combined must not be more than 5MB\n"); + if total > 5 * 1024 * 1024 { + resp.push_str("❌ Total size of all resources combined must not be more than 5MiB\n"); } else if self.displayImages.len() > 6 { resp.push_str( "❌ A maximum of 6 images (1 icon + 5 display images) can be set in displayImages\n", @@ -139,24 +157,19 @@ impl AHQStoreApplication { resp.push_str("✅ Resources are valid\n"); } - for (_, v) in self.downloadUrls.iter() { - match v.installerType { - InstallerFormat::LinuxFlathubFlatpak => { - resp.push_str("❌ LinuxFlathubFlatpak is not allowed in ahq store repository, you must use LinuxFlatpak\n"); - } - _ => {} - } - } - resp } pub fn export(&self) -> (String, Vec<(u8, Vec)>) { let mut obj = self.clone(); obj.verified = false; + obj.version = SystemTime::now() + .duration_since(UNIX_EPOCH) + .expect("Time is somehow running in reverse") + .as_secs(); for val in obj.downloadUrls.values_mut() { - if &obj.authorId == "1" && &val.asset == "url" { + if &obj.authorId == Self::AHQSTORE_OFFICIAL_AUTHOR_ID && &val.asset == "url" { continue; } @@ -185,7 +198,7 @@ impl AHQStoreApplication { self.install.has_platform() } - #[doc = "🎯 Introduced in v3"] + /// 🎯 Introduced in v3 pub fn get_win_options(&self) -> Option<&InstallerOptionsWindows> { let get_w32 = || { let Some(x) = &self.install.win32 else { @@ -209,7 +222,7 @@ impl AHQStoreApplication { Some(win32) } - #[doc = "🎯 Introduced in v2"] + /// 🎯 Introduced in v2 pub fn get_win_download(&self) -> Option<&DownloadUrl> { let win32 = self.get_win_options()?; let url = self.downloadUrls.get(&win32.assetId)?; @@ -218,35 +231,37 @@ impl AHQStoreApplication { InstallerFormat::WindowsZip | InstallerFormat::WindowsInstallerExe | InstallerFormat::WindowsInstallerMsi + | InstallerFormat::WindowsAHQDB | InstallerFormat::WindowsUWPMsix => Some(&url), _ => None, } } - #[doc = "🎯 Introduced in v2"] + /// 🎯 Introduced in v2 /// Just a clone of get_win_download for backwards compatibility pub fn get_win32_download(&self) -> Option<&DownloadUrl> { self.get_win_download() } - #[doc = "🎯 Introduced in v2"] + /// 🎯 Introduced in v2 pub fn get_win_extension(&self) -> Option<&'static str> { match self.get_win_download()?.installerType { InstallerFormat::WindowsZip => Some(".zip"), InstallerFormat::WindowsInstallerExe => Some(".exe"), InstallerFormat::WindowsInstallerMsi => Some(".msi"), + InstallerFormat::WindowsAHQDB => Some(".ahqdb"), InstallerFormat::WindowsUWPMsix => Some(".msix"), _ => None, } } - #[doc = "🎯 Introduced in v2"] + /// 🎯 Introduced in v2 /// Just a clone of get_win_extention for backwards compatibility pub fn get_win32_extension(&self) -> Option<&'static str> { self.get_win_extension() } - #[doc = "🎯 Introduced in v3"] + /// 🎯 Introduced in v3 pub fn get_linux_options(&self) -> Option<&InstallerOptionsLinux> { match ARCH { "x86_64" => self.install.linux.as_ref(), @@ -258,7 +273,7 @@ impl AHQStoreApplication { } } - #[doc = "🎯 Introduced in v2"] + /// 🎯 Introduced in v2 pub fn get_linux_download(&self) -> Option<&DownloadUrl> { let linux = self.get_linux_options()?; @@ -266,23 +281,24 @@ impl AHQStoreApplication { match &url.installerType { InstallerFormat::LinuxAppImage => Some(&url), - InstallerFormat::LinuxFlatpak => Some(&url), - InstallerFormat::LinuxFlathubFlatpak => Some(&url), _ => None, } } - #[doc = "🎯 Introduced in v2"] + /// 🎯 Introduced in v2 pub fn get_linux_extension(&self) -> Option<&'static str> { match self.get_linux_download()?.installerType { InstallerFormat::LinuxAppImage => Some(".AppImage"), - InstallerFormat::LinuxFlatpak => Some(".flatpak"), - InstallerFormat::LinuxFlathubFlatpak => Some(""), _ => None, } } - #[doc = "🎯 Introduced in v2"] + /// 🎯 Introduced in v3 + pub fn is_supported_android(&self, sdk: u32) -> bool { + self.install.is_supported_android(sdk) + } + + /// 🎯 Introduced in v2 pub fn get_android_download(&self) -> Option<&DownloadUrl> { let Some(android) = &self.install.android else { return None; @@ -296,7 +312,7 @@ impl AHQStoreApplication { } } - #[doc = "🎯 Introduced in v2"] + /// 🎯 Introduced in v2 pub fn get_android_extension(&self) -> Option<&'static str> { match self.get_android_download()?.installerType { InstallerFormat::AndroidApkZip => Some(".apk"), @@ -305,12 +321,21 @@ impl AHQStoreApplication { } #[cfg(feature = "internet")] - #[doc = "🎯 Introduced in v3"] + /// 🎯 Introduced in v3 + #[deprecated(since = "3.14.3", note = "Use `get_resource` instead")] pub async fn get_resource(&self, resource: u8) -> Option> { - use crate::internet::{get_all_commits, get_app_asset}; + use crate::api::internet::{get_all_commits, get_app_asset}; let commit = get_all_commits(None).await.ok()?; get_app_asset(&commit, &self.appId, &resource.to_string()).await } + + #[cfg(feature = "internet")] + /// 🎯 Introduced in v3.14.3 + pub async fn get_resource_commit(&self, commit: &Commits, resource: u8) -> Option> { + use crate::{api::internet::get_all_commits, get_app_asset}; + + get_app_asset(&commit, &self.appId, &resource.to_string()).await + } } diff --git a/src-ahqstore-types/src/app/other_fields.rs b/src-ahqstore-types/src/app/other_fields.rs index 8f386bb..38e417f 100644 --- a/src-ahqstore-types/src/app/other_fields.rs +++ b/src-ahqstore-types/src/app/other_fields.rs @@ -1,13 +1,11 @@ -#[cfg(feature = "js")] -use wasm_bindgen::prelude::wasm_bindgen; - use std::fmt::Display; use serde::{Deserialize, Serialize}; #[allow(non_snake_case)] +#[cfg_attr(feature = "export", derive(specta::Type))] #[derive(Serialize, Deserialize, Debug, Clone)] -#[cfg_attr(feature = "js", wasm_bindgen(getter_with_clone))] + pub struct DownloadUrl { pub installerType: InstallerFormat, pub asset: String, @@ -16,31 +14,41 @@ pub struct DownloadUrl { pub url: String, } +#[cfg_attr(feature = "export", derive(specta::Type))] #[derive(Serialize, Deserialize, Debug, Clone)] -#[cfg_attr(feature = "js", wasm_bindgen)] + pub enum InstallerFormat { - #[doc = "🎯 Stable as of v1"] + /// 🎯 Stable as of v1 WindowsZip, - #[doc = "🎯 Stable as of v2\n\n"] + /// 🎯 Stable as of v2 + /// + /// WindowsInstallerMsi, - #[doc = "🎯 Stable after v2\n\n"] + /// 🎯 Stable after v2 + /// + /// WindowsInstallerExe, - #[doc = "🔬 Planned as of v3\n\n"] + /// 🔬 Planned in AHQ Store NEO + /// + /// WindowsUWPMsix, - #[doc = "🎯 Stable as of v2\n\n"] - LinuxAppImage, + /// 🔬 Planned in AHQ Store NEO + /// + /// + WindowsAHQDB, - #[doc = "🔬 Planned\n\n"] - LinuxFlatpak, - - #[doc = "🔬 Planned\nNot allowed to use in AHQ Store repo\n\n"] - LinuxFlathubFlatpak, + /// 🎯 Stable as of v2 + /// + /// + LinuxAppImage, - #[doc = "🔬 Planned\n\n"] + /// 🔬 Planned in AHQ Store NEO + /// + /// AndroidApkZip, } @@ -53,19 +61,18 @@ impl Display for InstallerFormat { InstallerFormat::WindowsZip => "Windows Zip", InstallerFormat::WindowsInstallerExe => "Windows Installer Exe", InstallerFormat::WindowsInstallerMsi => "Windows Installer Msi", + InstallerFormat::WindowsAHQDB => "Windows AHQDB Installer", InstallerFormat::WindowsUWPMsix => "UWP Windows Msix Package", InstallerFormat::LinuxAppImage => "Linux App Image", - InstallerFormat::LinuxFlatpak => "Linux Flatpak", - InstallerFormat::LinuxFlathubFlatpak => - "Linux Flatpak (Flathub, not allowed in ahq store repo)", InstallerFormat::AndroidApkZip => "Universal Android Apk Zip Package", } ) } } +#[cfg_attr(feature = "export", derive(specta::Type))] #[derive(Serialize, Deserialize, Debug, Clone)] -#[cfg_attr(feature = "js", wasm_bindgen(getter_with_clone))] + pub struct AppRepo { /// author must be your GitHub username or username of an org where you're a "visible" member pub author: String, diff --git a/src-ahqstore-types/src/data/mod.rs b/src-ahqstore-types/src/data/mod.rs index 06b8381..2942ef9 100644 --- a/src-ahqstore-types/src/data/mod.rs +++ b/src-ahqstore-types/src/data/mod.rs @@ -1,5 +1,6 @@ use serde::{Deserialize, Serialize}; +#[cfg_attr(feature = "export", derive(specta::Type))] #[derive(Serialize, Deserialize, Debug)] pub struct DeveloperUser { /// The Name of the Developer @@ -22,13 +23,16 @@ pub struct DeveloperUser { /// The public email of the user email: String, - #[doc = "🔬 v2 Schema\n\n"] + /// 🔬 v2 Schema + /// + /// support: AppSupport, /// The list of apps published by the user apps: Vec, } +#[cfg_attr(feature = "export", derive(specta::Type))] #[derive(Serialize, Deserialize, Debug)] pub struct AppSupport { /// We recommend you set a discord server diff --git a/src-ahqstore-types/src/lib.rs b/src-ahqstore-types/src/lib.rs index ef3a9ae..f32c896 100644 --- a/src-ahqstore-types/src/lib.rs +++ b/src-ahqstore-types/src/lib.rs @@ -1,26 +1,30 @@ -#![allow(dead_code, unused_imports, non_local_definitions, reason = "Conditional compilation")] +#![allow( + dead_code, + unused_imports, + non_local_definitions, + reason = "Conditional compilation" +)] + +//! **You should use cli** +//! ```sh +//! cargo install ahqstore_cli_rs +//! ``` +//! or visit app / api sub module +//! +//! This Module: +//! - This module lists the standard commands & types that AHQ Store sends to AHQ Store Service +//! - Defines schemas for the AHQ Store File Formats use serde::{Deserialize, Serialize}; use serde_json::{from_str, to_string, to_string_pretty}; -use std::fs::read; +use std::{borrow::Cow, fs::read, sync::Arc}; +use tokio::task::JoinHandle; -#[cfg(feature = "js")] -use kfghdfghdfkgh_js_macros::TsifyAsync; -#[cfg(feature = "js")] -use tsify::*; -#[cfg(feature = "js")] -use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; - -#[cfg_attr(feature = "js", declare)] pub type AppId = String; -#[cfg_attr(feature = "js", declare)] pub type Str = String; -#[cfg_attr(feature = "js", declare)] pub type AppData = (String, String); -#[cfg_attr(feature = "js", declare)] pub type RefId = u64; -#[cfg_attr(feature = "js", declare)] pub type Success = bool; pub mod app; @@ -34,252 +38,116 @@ pub use data::*; pub mod winget; -/// **You should use cli** -/// ```sh -/// cargo install ahqstore_cli_rs -/// ``` -/// or visit app / api sub module -/// -/// This Module: -/// This module lists the standard commands & types that AHQ Store sends to AHQ Store Service - -#[derive(Serialize, Deserialize, Debug)] -#[cfg_attr(feature = "js", wasm_bindgen(getter_with_clone))] -pub struct Commit { - pub sha: String, -} - -#[derive(Serialize, Deserialize, Debug)] -#[cfg_attr(feature = "js", wasm_bindgen)] -pub struct Prefs { - pub launch_app: bool, - pub install_apps: bool, - pub auto_update_apps: bool, -} - -#[cfg_attr(feature = "js", wasm_bindgen)] -impl Prefs { - pub fn get(path: &str) -> Option> { - read(&path).ok() - } - - pub fn str_to(s: &str) -> Option { - from_str(s).ok() - } - - pub fn convert(&self) -> Option { - to_string(self).ok() - } - - pub fn default() -> Prefs { - Prefs { - launch_app: true, - install_apps: true, - auto_update_apps: true, - } - } -} - -#[derive(Serialize, Deserialize, Debug)] -#[cfg_attr(feature = "js", derive(Tsify, TsifyAsync))] -#[cfg_attr(feature = "js", tsify(into_wasm_abi, from_wasm_abi))] -pub enum Package { - LeadLang, - DevCamp, -} - -#[derive(Serialize, Deserialize, Debug)] -#[cfg_attr(feature = "js", derive(Tsify, TsifyAsync))] -#[cfg_attr(feature = "js", tsify(into_wasm_abi, from_wasm_abi))] -pub enum Command { - GetSha(RefId), - - GetApp(RefId, AppId), - InstallApp(RefId, AppId), - UninstallApp(RefId, AppId), - - ListApps(RefId), - GetLibrary(RefId), - - RunUpdate(RefId), - UpdateStatus(RefId), - - GetPrefs(RefId), - SetPrefs(RefId, Prefs), - - AddPkg(RefId, Package), - - ExecutableRunStatus(RefId, Success) -} - -impl Command { - pub fn try_from>(value: T) -> Option { - serde_json::from_str(value.as_ref()).ok() - } -} - -#[cfg_attr(feature = "js", wasm_bindgen)] -impl Command { - pub fn try_from_js(value: String) -> Option { - serde_json::from_str(&value).ok() - } -} - -#[derive(Serialize, Deserialize, Debug)] -#[cfg_attr(feature = "js", derive(Tsify, TsifyAsync))] -#[cfg_attr(feature = "js", tsify(into_wasm_abi, from_wasm_abi))] -pub enum Reason { - UnknownData(RefId), - - Unauthenticated, -} - -#[derive(Serialize, Deserialize, Debug)] -#[cfg_attr(feature = "js", derive(Tsify, TsifyAsync))] -#[cfg_attr(feature = "js", tsify(into_wasm_abi, from_wasm_abi))] -pub enum ErrorType { - GetAppFailed(RefId, AppId), - AppPlatformNoSupport(RefId, AppId), - AVBlockedApp(RefId, AppId), - PrefsError(RefId), - PkgError(RefId), - GetSHAFailed(RefId), +#[cfg_attr(feature = "export", derive(specta::Type))] +#[derive(Debug, Serialize)] +pub struct StatusUpdateData { + pub queue: Box<[QueuedAppData]>, + #[serde(rename = "supportsUpdate")] + pub disable_update: bool, + #[serde(rename = "queueOverflow")] + pub overflow: bool, } -#[derive(Debug, Serialize, Deserialize, Clone)] -#[cfg_attr(feature = "js", derive(Tsify, TsifyAsync))] -#[cfg_attr(feature = "js", tsify(into_wasm_abi, from_wasm_abi))] -pub struct Library { - pub app_id: String, - pub status: AppStatus, - pub is_update: bool, - pub to: ToDo, - pub progress: f64, - pub max: u64, - pub app: Option, - pub user: String -} - -#[derive(Debug, Serialize, Deserialize, Clone)] -#[cfg_attr(feature = "js", derive(Tsify, TsifyAsync))] -#[cfg_attr(feature = "js", tsify(into_wasm_abi, from_wasm_abi))] -pub enum ToDo { +#[cfg_attr(feature = "export", derive(specta::Type))] +#[derive(Debug, Serialize, Clone)] +pub enum AppActionIntent { Install, Uninstall, + Update, } -#[derive(Debug, Deserialize, Clone)] -#[cfg_attr(feature = "js", derive(Tsify, TsifyAsync))] -#[cfg_attr(feature = "js", tsify(into_wasm_abi, from_wasm_abi))] -pub enum AppStatus { - Pending, - Downloading, - AVScanning, - Installing, - Uninstalling, - InstallSuccessful, - UninstallSuccessful, - NotSuccessful, - AVFlagged, -} - -impl Serialize for AppStatus { - fn serialize(&self, serializer: S) -> Result - where - S: serde::Serializer, - { - serializer.serialize_str(match self { - AppStatus::Pending => "Pending...", - AppStatus::Downloading => "Downloading...", - AppStatus::Installing => "Installing...", - AppStatus::Uninstalling => "Uninstalling...", - AppStatus::InstallSuccessful => "Installed", - AppStatus::UninstallSuccessful => "Uninstalled", - AppStatus::NotSuccessful => "Error!", - AppStatus::AVScanning => "Scanning for Viruses!", - AppStatus::AVFlagged => "Flagged as Malicious!", - }) - } -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -#[cfg_attr(feature = "js", derive(Tsify, TsifyAsync))] -#[cfg_attr(feature = "js", tsify(into_wasm_abi, from_wasm_abi))] -pub enum UpdateStatusReport { - Disabled, - UpToDate, - Checking, - Updating, +#[cfg_attr(feature = "export", derive(specta::Type))] +#[derive(Debug, Serialize, Clone)] +pub struct QueuedAppData { + pub id: Arc, + pub transaction: u64, + pub status: AppUpdateInstallStatus, + pub intent: AppActionIntent, } -impl Clone for Commits { - fn clone(&self) -> Self { +impl QueuedAppData { + pub fn from(data: &QueuedApp) -> Self { Self { - ahqstore: self.ahqstore.clone(), - winget: self.winget.clone(), + id: data.id.clone(), + transaction: data.transaction, + intent: data.intent.clone(), + status: data.status.clone(), } } } -impl From<&Commits> for Commits { - fn from(value: &Commits) -> Self { - value.clone() - } +#[derive(Debug, Serialize)] +pub struct QueuedApp { + pub id: Arc, + pub transaction: u64, + pub status: AppUpdateInstallStatus, + pub intent: AppActionIntent, + #[serde(skip)] + pub task: Option>, } -#[derive(Serialize, Deserialize, Debug)] -#[cfg_attr(feature = "js", derive(Tsify, TsifyAsync))] -#[cfg_attr(feature = "js", tsify(into_wasm_abi, from_wasm_abi))] -pub enum ResponseToSend { - Ready, - - Error(ErrorType), - - SHAId(RefId, Commits), - - Disconnect(Reason), - - AppData(RefId, AppId, AHQStoreApplication), - AppDataUrl(RefId, AppId, String), - - ListApps(RefId, Vec), - Library(RefId, Vec), - - UpdateStatus(RefId, UpdateStatusReport), - - Acknowledged(RefId), - - Prefs(RefId, Prefs), - PrefsSet(RefId), - - DownloadPkgProg(RefId, [u64; 2]), - InstallPkg(RefId), - InstalledPkg(RefId), - - TerminateBlock(RefId), - RunExecutable(RefId, String) -} - -#[cfg_attr(feature = "js", wasm_bindgen)] -impl ResponseToSend { - pub fn as_msg(msg: ResponseToSend) -> Vec { - to_string_pretty(&msg) - .unwrap_or("ERRR".to_string()) - .into_bytes() - } -} - -pub type Response = ResponseToSend; - -#[derive(Serialize, Deserialize, Debug)] -pub struct AuthPing { - pub process: usize, -} - -impl AuthPing { - pub fn from>(value: T) -> Option { - let string = value.as_ref(); - - serde_json::from_str(string).ok() +#[cfg_attr(feature = "export", derive(specta::Type))] +#[derive(Debug, Serialize, Clone)] +#[serde(tag = "status")] +pub enum AppUpdateInstallStatus { + /// { "status": "Pending" } + Pending, + /// { "status": "PendingUserAction" } + PendingUserAction, + /// { "status": "Cancelled" } + Cancelled { + #[serde(skip)] + // Shows for 5seconds + time: u64, + }, + /// { "status": "Downloading", "progress": 100.0 } + Downloading { progress: f64 }, + /// { "status": "AVSCanning" } + AVScanning, + /// { "status": "PendingInstall" } + PendingInstall, + /// { "status": "Installing", "progress": null } + /// + /// OR + /// + /// { "status": "Installing", "progress": 30.0 } + Installing { progress: Option }, + /// { "status": "MoreDwnlNeeded" } + MoreDwnlNeeded { + // Total progress + progress: f64, + current: usize, + items: usize, + }, + /// { "status": "CopyingFiles", "percentage": 67, "total": 100 } + CopyingFiles { percentage: f64, total: usize }, + /// { "status": "Finalizing" } + Finalizing, + /// { "status": "Updating" } + Updating, + /// { "status": "Uninstalling" } + Uninstalling, + /// { "status": "Successful" } + Successful { + #[serde(skip)] + // This is a time delta used by us to auto prune >2s entries + time: u64, + }, + /// { "status": "Error", "err": "ERROR DESC" } + Error { + err: Cow<'static, str>, + #[serde(skip)] + // >10s time delta + time: u64, + }, +} + +#[cfg(test)] +mod tests { + #[test] + #[cfg(feature = "export")] + fn export() { + _ = specta::export::ts("./pkg/ahqstore.types.d.ts").unwrap(); + _ = specta::export::ts("./types/ahqstore.types.d.ts").unwrap(); } } diff --git a/src-ahqstore-types/src/winget/mod.rs b/src-ahqstore-types/src/winget/mod.rs index ffa9ad4..3d9965f 100644 --- a/src-ahqstore-types/src/winget/mod.rs +++ b/src-ahqstore-types/src/winget/mod.rs @@ -2,6 +2,7 @@ use serde::{Deserialize, Serialize}; +#[cfg_attr(feature = "export", derive(specta::Type))] #[derive(Debug, Deserialize, Serialize)] pub struct Installer { pub Architecture: String, @@ -10,6 +11,7 @@ pub struct Installer { pub InstallerUrl: String, } +#[cfg_attr(feature = "export", derive(specta::Type))] #[derive(Debug, Deserialize, Serialize)] pub struct InstallerScheme { pub PackageIdentifier: String, @@ -18,6 +20,7 @@ pub struct InstallerScheme { pub Installers: Vec, } +#[cfg_attr(feature = "export", derive(specta::Type))] #[derive(Debug, Deserialize, Serialize)] pub struct WingetApplication { pub PackageIdentifier: String, diff --git a/src-ahqstore-types/types/LICENSE.md b/src-ahqstore-types/types/LICENSE.md new file mode 100644 index 0000000..3fbc656 --- /dev/null +++ b/src-ahqstore-types/types/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 AHQ Softwares + +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-ahqstore-types/types/README.md b/src-ahqstore-types/types/README.md new file mode 100644 index 0000000..cef5c15 --- /dev/null +++ b/src-ahqstore-types/types/README.md @@ -0,0 +1,6 @@ +# AHQ Store Types + +This is an internal crate and does not follow **SemVer** and any release is likely +to break. + +> For internal use only diff --git a/src-ahqstore-types/types/ahqstore.types.d.ts b/src-ahqstore-types/types/ahqstore.types.d.ts new file mode 100644 index 0000000..d54b2a2 --- /dev/null +++ b/src-ahqstore-types/types/ahqstore.types.d.ts @@ -0,0 +1,100 @@ +// This file has been generated by Specta. DO NOT EDIT. + +export type Hero = { title: string; description: string; button: string; background: string; author: string; appId: string } + +export type DeveloperUser = { name: string; description: string; gh_username: string; icon_base64: string | null; ahq_official: boolean; email: string; support: AppSupport; apps: string[] } + +export type InstallerOptionsWindows = { assetId: number; exec: string | null; scope: WindowsInstallScope | null; installerArgs: string[] | null } + +export type Home = { splash: Splash | null; home: HomeMapData } + +export type Semi = { title: string; background: string; appId: string; color: string | null } + +export type SearchEntry = { name: string; title: string; id: string } + +/** + * 🔬 Under Development + * + * + */ +export type InstallerOptionsAndroid = { assetId: number; min_sdk: number; abi: AndroidAbi[] } + +export type InstallerFormat = "WindowsZip" | "WindowsInstallerMsi" | "WindowsInstallerExe" | "WindowsUWPMsix" | "WindowsAHQDB" | "LinuxAppImage" | "AndroidApkZip" + +/** + * Use the official ahqstore () cli\n🎯 Introduced in v1, Revamped in v2 + */ +export type AHQStoreApplication = { appId: string; appShortcutName: string; appDisplayName: string; authorId: string; releaseTagName: string; downloadUrls: { [key: number]: DownloadUrl }; install: InstallerOptions; displayImages: number[]; description: string; repo: AppRepo; usrVersion: string | null; version: number; site: string | null; source: string | null; license_or_tos: string | null; resources: { [key: number]: number[] } | null; verified: boolean } + +export type AppUpdateInstallStatus = { status: "Pending" } | { status: "Cancelled" } | { status: "Downloading"; progress: number } | { status: "Installing" } | { status: "Updating" } | { status: "Uninstalling" } | { status: "Done" } + +export type AppStatus = "Pending" | "Downloading" | "AVScanning" | "Installing" | "Uninstalling" | "InstallSuccessful" | "UninstallSuccessful" | "NotSuccessful" | "AVFlagged" + +export type SubHero = { title: string; background: string; appId: string; color: string | null } + +export type DevData = { name: string | null; id: string; github: string; avatar_url: string | null; verified?: boolean } + +/** + * PREFERENCES + */ +export type UpdateStrategy = "Never" | "CheckOnly" | "DownloadInstall_UnmeteredWifi" | "DownloadInstall_Wifi" | "DownloadInstall" + +/** + * **You should use cli** + * ```sh + * cargo install ahqstore_cli_rs + * ``` + * or visit app / api sub module + * + * This Module: + * This module lists the standard commands & types that AHQ Store sends to AHQ Store Service + */ +export type StatusUpdateData = { queue: { id: string; status: AppUpdateInstallStatus }; supportsUpdate: boolean } + +export type Commits = { ahqstore: string; alt: string } + +/** + * 🔬 Under Development + * + * + */ +export type AndroidAbi = "Aarch64" | "Armv7" | "X86" | "X64" + +export type QueuedApp = { id: string; status: AppUpdateInstallStatus } + +export type InstallerScheme = { PackageIdentifier: string; PackageVersion: string; Scope: string; Installers: Installer[] } + +export type GHRepoCommit = { sha: string } + +export type AppRepo = { author: string; repo: string } + +/** + * 🔬 Under Development + * + * + */ +export type InstallerOptionsLinux = { assetId: number } + +export type AppSupport = { discord: string | null; website: string | null; github: string | null } + +export type UpdateStatusReport = "Disabled" | "UpToDate" | "Checking" | "Updating" + +export type InstallerOptions = { win32: InstallerOptionsWindows | null; winarm: InstallerOptionsWindows | null; linux: InstallerOptionsLinux | null; linuxArm64: InstallerOptionsLinux | null; linuxArm7: InstallerOptionsLinux | null; android: InstallerOptionsAndroid | null } + +export type WindowsInstallScope = "User" | "Machine" + +/** + * This is exactly `Vec<(String, Vec)>` + */ +export type HomeMapData = { inner: ([string, string[]])[] } + +export type Prefs = { update: UpdateStrategy } + +export type DownloadUrl = { installerType: InstallerFormat; asset: string; url: string } + +export type Installer = { Architecture: string; InstallerType: string | null; InstallerLocale: string | null; InstallerUrl: string } + +export type WingetApplication = { PackageIdentifier: string; PackageVersion: string; Publisher: string | null; PublisherUrl: string | null; Copyright: string | null; ShortDescription: string | null; Description: string | null; ReleaseNotes: string | null; PackageName: string; PackageUrl: string | null; License: string | null; LicenseUrl: string | null } + +export type Splash = { hero: Hero; subhero: SubHero; third: Semi; fourth: Semi } + diff --git a/src-ahqstore-types/types/package.json b/src-ahqstore-types/types/package.json new file mode 100644 index 0000000..8a1ba53 --- /dev/null +++ b/src-ahqstore-types/types/package.json @@ -0,0 +1,16 @@ +{ + "name": "@ahqstore/core-types", + "type": "module", + "description": "Standard types used by AHQ Store", + "version": "3.20.0", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/ahqstore/client" + }, + "files": [ + "ahqstore.types.d.ts" + ], + "homepage": "https://ahqstore.github.io/", + "types": "ahqstore.types.d.ts" +} diff --git a/src-daemon/.cargo/config.toml b/src-daemon/.cargo/config.toml new file mode 100644 index 0000000..9350d17 --- /dev/null +++ b/src-daemon/.cargo/config.toml @@ -0,0 +1,2 @@ +[alias] +signed = ["build", "--release", "&&", "run", "--bin", "sign"] diff --git a/src-daemon/.gitignore b/src-daemon/.gitignore new file mode 100644 index 0000000..374fa09 --- /dev/null +++ b/src-daemon/.gitignore @@ -0,0 +1,2 @@ +target +hidden \ No newline at end of file diff --git a/src-daemon/Cargo.lock b/src-daemon/Cargo.lock new file mode 100644 index 0000000..82a92b4 --- /dev/null +++ b/src-daemon/Cargo.lock @@ -0,0 +1,1084 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +dependencies = [ + "derive_arbitrary", +] + +[[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 = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "bytes" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" + +[[package]] +name = "bzip2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a53fac24f34a81bc9954b5d6cfce0c21e18ec6959f44f56e8e90e4bb7c346c" +dependencies = [ + "libbz2-rs-sys", +] + +[[package]] +name = "cc" +version = "1.2.49" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90583009037521a116abf44494efecd645ba48b6622457080f080b85544e2215" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[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 = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "deflate64" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26bf8fc351c5ed29b5c2f0cbbac1b209b74f60ecd62e675a998df72c49af5204" + +[[package]] +name = "deranged" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derive_arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "elevateinstall" +version = "0.1.0" +dependencies = [ + "tauri-winres", + "windortortent", +] + +[[package]] +name = "embed-resource" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 0.9.8", + "vswhom", + "winreg", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "find-msvc-tools" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" + +[[package]] +name = "flate2" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" +dependencies = [ + "crc32fast", + "libz-rs-sys", + "miniz_oxide", +] + +[[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.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "indexmap" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom", + "libc", +] + +[[package]] +name = "libbz2-rs-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4a545a15244c7d945065b5d392b2d2d7f21526fba56ce51467b06ed445e8f7" + +[[package]] +name = "libc" +version = "0.2.178" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" + +[[package]] +name = "liblzma" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73c36d08cad03a3fbe2c4e7bb3a9e84c57e4ee4135ed0b065cade3d98480c648" +dependencies = [ + "liblzma-sys", +] + +[[package]] +name = "liblzma-sys" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01b9596486f6d60c3bbe644c0e1be1aa6ccc472ad630fe8927b456973d7cb736" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "libz-rs-sys" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15413ef615ad868d4d65dce091cb233b229419c7c0c4bcaa746c0901c49ff39c" +dependencies = [ + "zlib-rs", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[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.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest", + "hmac", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppmd-rust" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d558c559f0450f16f2a27a1f017ef38468c1090c9ce63c8e51366232d53717b4" + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +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 = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + +[[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-xml-rs" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2215ce3e6a77550b80a1c37251b7d294febaf42e36e21b7b411e0bf54d540d" +dependencies = [ + "log", + "serde", + "thiserror", + "xml", +] + +[[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", +] + +[[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.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" +dependencies = [ + "serde_core", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +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 = "signal-hook-registry" +version = "1.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" +dependencies = [ + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tauri-winres" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1087b111fe2b005e42dbdc1990fc18593234238d47453b0c99b7de1c9ab2c1e0" +dependencies = [ + "dunce", + "embed-resource", + "toml 0.9.8", +] + +[[package]] +name = "thiserror" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "time" +version = "0.3.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde", + "time-core", +] + +[[package]] +name = "time-core" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" + +[[package]] +name = "tokio" +version = "1.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "signal-hook-registry", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_edit", +] + +[[package]] +name = "toml" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned 1.0.3", + "toml_datetime 0.7.3", + "toml_parser", + "toml_writer", + "winnow", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_write", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +dependencies = [ + "winnow", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "toml_writer" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[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 = "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.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "windortortent" +version = "0.0.1" +source = "git+https://github.com/ahqstore/windortortent#81733966250c239bc5d63555092d6919bebb3e6c" +dependencies = [ + "serde", + "serde-xml-rs", + "tokio", + "toml 0.8.23", + "windows", + "windows-core", + "windows-future", + "zip", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core", + "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", +] + +[[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", + "windows-strings", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core", + "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", +] + +[[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", +] + +[[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", + "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-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-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[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.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[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_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.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[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.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[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.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[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.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +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.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "xml" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2df5825faced2427b2da74d9100f1e2e93c533fff063506a81ede1cf517b2e7e" + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zip" +version = "4.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa8cd6af31c3b31c6631b8f483848b91589021b28fffe50adada48d4f4d2ed1" +dependencies = [ + "aes", + "arbitrary", + "bzip2", + "constant_time_eq", + "crc32fast", + "deflate64", + "flate2", + "getrandom", + "hmac", + "indexmap", + "liblzma", + "memchr", + "pbkdf2", + "ppmd-rust", + "sha1", + "time", + "zeroize", + "zopfli", + "zstd", +] + +[[package]] +name = "zlib-rs" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51f936044d677be1a1168fae1d03b583a285a5dd9d8cbf7b24c23aa1fc775235" + +[[package]] +name = "zopfli" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" +dependencies = [ + "bumpalo", + "crc32fast", + "log", + "simd-adler32", +] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/src-daemon/Cargo.toml b/src-daemon/Cargo.toml new file mode 100644 index 0000000..3efc71b --- /dev/null +++ b/src-daemon/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "elevateinstall" +description = "Elevates installation of AHQ Store Applications" +version = "0.1.0" +edition = "2024" + +[[bin]] +name = "elevate" +src = "./src/main.rs" + +[[bin]] +name = "sign" +src = "./src/sign.rs" + +[dependencies] +windortortent = { git = "https://github.com/ahqstore/windortortent", version = "0.0.1" } + +[build-dependencies] +tauri-winres = "0.3.3" diff --git a/src-daemon/build.rs b/src-daemon/build.rs new file mode 100644 index 0000000..cf561c0 --- /dev/null +++ b/src-daemon/build.rs @@ -0,0 +1,14 @@ + + +fn main() { + if cfg!(target_os = "windows") { + let mut res = tauri_winres::WindowsResource::new(); + res.set_icon("icon.ico") + .set("ProductName", "AHQ Store Elevation Agent") + .set("LegalCopyright", "Copyright © 2025 AHQ Softwares") + .set("OriginalFilename", "AHQ Store Elevation Agent") + .set("Comments", "AHQ Store Elevation Agent") + .set_manifest_file("manifest.xml"); + res.compile().unwrap(); + } +} \ No newline at end of file diff --git a/src-daemon/icon.ico b/src-daemon/icon.ico new file mode 100644 index 0000000..475d456 Binary files /dev/null and b/src-daemon/icon.ico differ diff --git a/src-daemon/manifest.xml b/src-daemon/manifest.xml new file mode 100644 index 0000000..d5db776 --- /dev/null +++ b/src-daemon/manifest.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src-daemon/src/main.rs b/src-daemon/src/main.rs new file mode 100644 index 0000000..80a1832 --- /dev/null +++ b/src-daemon/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/src-daemon/src/sign.rs b/src-daemon/src/sign.rs new file mode 100644 index 0000000..4febff9 --- /dev/null +++ b/src-daemon/src/sign.rs @@ -0,0 +1,3 @@ +fn main() { + +} \ No newline at end of file diff --git a/src-daemon/thumb b/src-daemon/thumb new file mode 100644 index 0000000..df7f2b0 --- /dev/null +++ b/src-daemon/thumb @@ -0,0 +1 @@ +CA84BF615130CDDF1905BB4389715462807FF8BD \ No newline at end of file diff --git a/src-setup/.gitignore b/src-deployment/.gitignore similarity index 100% rename from src-setup/.gitignore rename to src-deployment/.gitignore diff --git a/src-deployment/Cargo.lock b/src-deployment/Cargo.lock new file mode 100644 index 0000000..351ab6a --- /dev/null +++ b/src-deployment/Cargo.lock @@ -0,0 +1,895 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +dependencies = [ + "derive_arbitrary", +] + +[[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 = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "bytes" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" + +[[package]] +name = "bzip2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a53fac24f34a81bc9954b5d6cfce0c21e18ec6959f44f56e8e90e4bb7c346c" +dependencies = [ + "libbz2-rs-sys", +] + +[[package]] +name = "cc" +version = "1.2.49" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90583009037521a116abf44494efecd645ba48b6622457080f080b85544e2215" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[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 = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "deflate64" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26bf8fc351c5ed29b5c2f0cbbac1b209b74f60ecd62e675a998df72c49af5204" + +[[package]] +name = "deranged" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derive_arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "find-msvc-tools" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" + +[[package]] +name = "flate2" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" +dependencies = [ + "crc32fast", + "libz-rs-sys", + "miniz_oxide", +] + +[[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.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "indexmap" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom", + "libc", +] + +[[package]] +name = "libbz2-rs-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4a545a15244c7d945065b5d392b2d2d7f21526fba56ce51467b06ed445e8f7" + +[[package]] +name = "libc" +version = "0.2.178" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" + +[[package]] +name = "liblzma" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73c36d08cad03a3fbe2c4e7bb3a9e84c57e4ee4135ed0b065cade3d98480c648" +dependencies = [ + "liblzma-sys", +] + +[[package]] +name = "liblzma-sys" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01b9596486f6d60c3bbe644c0e1be1aa6ccc472ad630fe8927b456973d7cb736" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "libz-rs-sys" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15413ef615ad868d4d65dce091cb233b229419c7c0c4bcaa746c0901c49ff39c" +dependencies = [ + "zlib-rs", +] + +[[package]] +name = "lixploy" +version = "0.0.3" +source = "git+https://github.com/ahqstore/lixploy#e89b7ba93f68865d460f55e2c7b2ad0b7c079ebc" +dependencies = [ + "tokio", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[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.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +dependencies = [ + "libc", + "wasi", + "windows-sys", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest", + "hmac", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppmd-rust" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d558c559f0450f16f2a27a1f017ef38468c1090c9ce63c8e51366232d53717b4" + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +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 = "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-xml-rs" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2215ce3e6a77550b80a1c37251b7d294febaf42e36e21b7b411e0bf54d540d" +dependencies = [ + "log", + "serde", + "thiserror", + "xml", +] + +[[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", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +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 = "signal-hook-registry" +version = "1.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" +dependencies = [ + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + +[[package]] +name = "src-deployment" +version = "0.1.0" +dependencies = [ + "lixploy", + "windortortent", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "time" +version = "0.3.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde", + "time-core", +] + +[[package]] +name = "time-core" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" + +[[package]] +name = "tokio" +version = "1.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "signal-hook-registry", + "tokio-macros", + "windows-sys", +] + +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "toml_write", + "winnow", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[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.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "windortortent" +version = "0.0.1" +source = "git+https://github.com/ahqstore/windortortent#81733966250c239bc5d63555092d6919bebb3e6c" +dependencies = [ + "serde", + "serde-xml-rs", + "tokio", + "toml", + "windows", + "windows-core", + "windows-future", + "zip", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core", + "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", +] + +[[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", + "windows-strings", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core", + "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", +] + +[[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", +] + +[[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", + "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-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-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-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 = "winnow" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "xml" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2df5825faced2427b2da74d9100f1e2e93c533fff063506a81ede1cf517b2e7e" + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zip" +version = "4.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa8cd6af31c3b31c6631b8f483848b91589021b28fffe50adada48d4f4d2ed1" +dependencies = [ + "aes", + "arbitrary", + "bzip2", + "constant_time_eq", + "crc32fast", + "deflate64", + "flate2", + "getrandom", + "hmac", + "indexmap", + "liblzma", + "memchr", + "pbkdf2", + "ppmd-rust", + "sha1", + "time", + "zeroize", + "zopfli", + "zstd", +] + +[[package]] +name = "zlib-rs" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51f936044d677be1a1168fae1d03b583a285a5dd9d8cbf7b24c23aa1fc775235" + +[[package]] +name = "zopfli" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" +dependencies = [ + "bumpalo", + "crc32fast", + "log", + "simd-adler32", +] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/src-deployment/Cargo.toml b/src-deployment/Cargo.toml new file mode 100644 index 0000000..dba7b7b --- /dev/null +++ b/src-deployment/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "src-deployment" +version = "0.1.0" +edition = "2024" + +[target.'cfg(windows)'.dependencies] +lixploy = { git = "https://github.com/ahqstore/lixploy", version = "0.0.3" } + +[target.'cfg(target_os = "linux")'.dependencies] +windortortent = { git = "https://github.com/ahqstore/windortortent", version = "0.0.1" } diff --git a/src-deployment/src/lib.rs b/src-deployment/src/lib.rs new file mode 100644 index 0000000..78ba4fe --- /dev/null +++ b/src-deployment/src/lib.rs @@ -0,0 +1,14 @@ +pub fn add(left: u64, right: u64) -> u64 { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/src-plugin/.gitignore b/src-plugin/.gitignore index 50d8e32..0a84da3 100644 --- a/src-plugin/.gitignore +++ b/src-plugin/.gitignore @@ -15,3 +15,4 @@ node_modules/ dist-js dist +.gradle \ No newline at end of file diff --git a/src-plugin/Cargo.toml b/src-plugin/Cargo.toml index f6eec01..38cc6d2 100644 --- a/src-plugin/Cargo.toml +++ b/src-plugin/Cargo.toml @@ -3,7 +3,7 @@ name = "tauri-plugin-ahqstore" version = "1.0.0" authors = ["AHQ"] edition = "2021" -rust-version = "1.77.2" +rust-version = "1.82" exclude = ["/examples", "/dist-js", "/guest-js", "/node_modules"] links = "tauri-plugin-ahqstore" @@ -15,9 +15,23 @@ ahqstore-types = { path = "../src-ahqstore-types" } anyhow = "1" ahqstore_gh_hash = "1" open = "5" +serde_json = "1" +chacha20poly1305 = { version = "0.10", features = ["heapless"] } +lazy_static = "1" +reqwest = { version = "0.13", default-features = false, features = ["rustls"] } +tokio = { version = "1", features = ["time", "macros", "sync", "fs"] } +futures = "0.3" +tantivy = "0.25" + +ts-rs = "11" [target.'cfg(windows)'.dependencies] -msi = "0.8" +windows = { version = "0.62", features = [ + "Networking_Connectivity", + "Win32_Security", +] } +msi = "0.9" +win32_notif = "0.10" [target.'cfg(target_os = "linux")'.dependencies] lixploy = { git = "https://github.com/ahqstore/lixploy" } diff --git a/src-plugin/android/.gitignore b/src-plugin/android/.gitignore index c0f21ec..1c0ffb3 100644 --- a/src-plugin/android/.gitignore +++ b/src-plugin/android/.gitignore @@ -1,2 +1,4 @@ /build /.tauri + +.gradle \ No newline at end of file diff --git a/src-plugin/android/.gradle/8.5/checksums/checksums.lock b/src-plugin/android/.gradle/8.5/checksums/checksums.lock deleted file mode 100644 index 52ac17f..0000000 Binary files a/src-plugin/android/.gradle/8.5/checksums/checksums.lock and /dev/null differ diff --git a/src-plugin/android/.gradle/8.5/checksums/md5-checksums.bin b/src-plugin/android/.gradle/8.5/checksums/md5-checksums.bin deleted file mode 100644 index 4dcb5a8..0000000 Binary files a/src-plugin/android/.gradle/8.5/checksums/md5-checksums.bin and /dev/null differ diff --git a/src-plugin/android/.gradle/8.5/checksums/sha1-checksums.bin b/src-plugin/android/.gradle/8.5/checksums/sha1-checksums.bin deleted file mode 100644 index 408fc96..0000000 Binary files a/src-plugin/android/.gradle/8.5/checksums/sha1-checksums.bin and /dev/null differ diff --git a/src-plugin/android/.gradle/8.5/dependencies-accessors/dependencies-accessors.lock b/src-plugin/android/.gradle/8.5/dependencies-accessors/dependencies-accessors.lock deleted file mode 100644 index ddfd2ec..0000000 Binary files a/src-plugin/android/.gradle/8.5/dependencies-accessors/dependencies-accessors.lock and /dev/null differ diff --git a/src-plugin/android/.gradle/8.5/executionHistory/executionHistory.bin b/src-plugin/android/.gradle/8.5/executionHistory/executionHistory.bin deleted file mode 100644 index d2845c7..0000000 Binary files a/src-plugin/android/.gradle/8.5/executionHistory/executionHistory.bin and /dev/null differ diff --git a/src-plugin/android/.gradle/8.5/executionHistory/executionHistory.lock b/src-plugin/android/.gradle/8.5/executionHistory/executionHistory.lock deleted file mode 100644 index 5a38754..0000000 Binary files a/src-plugin/android/.gradle/8.5/executionHistory/executionHistory.lock and /dev/null differ diff --git a/src-plugin/android/.gradle/8.5/fileChanges/last-build.bin b/src-plugin/android/.gradle/8.5/fileChanges/last-build.bin deleted file mode 100644 index f76dd23..0000000 Binary files a/src-plugin/android/.gradle/8.5/fileChanges/last-build.bin and /dev/null differ diff --git a/src-plugin/android/.gradle/8.5/fileHashes/fileHashes.bin b/src-plugin/android/.gradle/8.5/fileHashes/fileHashes.bin deleted file mode 100644 index c1e4e0a..0000000 Binary files a/src-plugin/android/.gradle/8.5/fileHashes/fileHashes.bin and /dev/null differ diff --git a/src-plugin/android/.gradle/8.5/fileHashes/fileHashes.lock b/src-plugin/android/.gradle/8.5/fileHashes/fileHashes.lock deleted file mode 100644 index e56540e..0000000 Binary files a/src-plugin/android/.gradle/8.5/fileHashes/fileHashes.lock and /dev/null differ diff --git a/src-plugin/android/.gradle/8.5/fileHashes/resourceHashesCache.bin b/src-plugin/android/.gradle/8.5/fileHashes/resourceHashesCache.bin deleted file mode 100644 index a174d0c..0000000 Binary files a/src-plugin/android/.gradle/8.5/fileHashes/resourceHashesCache.bin and /dev/null differ diff --git a/src-plugin/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/src-plugin/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock deleted file mode 100644 index 38ae83c..0000000 Binary files a/src-plugin/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock and /dev/null differ diff --git a/src-plugin/android/.gradle/buildOutputCleanup/cache.properties b/src-plugin/android/.gradle/buildOutputCleanup/cache.properties deleted file mode 100644 index 90b6451..0000000 --- a/src-plugin/android/.gradle/buildOutputCleanup/cache.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Thu Feb 06 22:56:48 IST 2025 -gradle.version=8.5 diff --git a/src-plugin/android/.gradle/buildOutputCleanup/outputFiles.bin b/src-plugin/android/.gradle/buildOutputCleanup/outputFiles.bin deleted file mode 100644 index 6cc050b..0000000 Binary files a/src-plugin/android/.gradle/buildOutputCleanup/outputFiles.bin and /dev/null differ diff --git a/src-plugin/android/.gradle/config.properties b/src-plugin/android/.gradle/config.properties deleted file mode 100644 index db3aa78..0000000 --- a/src-plugin/android/.gradle/config.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Thu Feb 06 22:55:49 IST 2025 -java.home=I\:\\androidstudio\\jbr diff --git a/src-plugin/android/.gradle/file-system.probe b/src-plugin/android/.gradle/file-system.probe deleted file mode 100644 index 2927067..0000000 Binary files a/src-plugin/android/.gradle/file-system.probe and /dev/null differ diff --git a/src-plugin/android/Commit.kt b/src-plugin/android/Commit.kt new file mode 100644 index 0000000..ba2dff2 --- /dev/null +++ b/src-plugin/android/Commit.kt @@ -0,0 +1,5 @@ +package com.plugin.ahqstore.api + +class Commit { + +} \ No newline at end of file diff --git a/src-plugin/android/build.gradle.kts b/src-plugin/android/build.gradle.kts index a3546aa..e391a84 100644 --- a/src-plugin/android/build.gradle.kts +++ b/src-plugin/android/build.gradle.kts @@ -1,14 +1,16 @@ plugins { id("com.android.library") id("org.jetbrains.kotlin.android") + id("org.jetbrains.kotlin.plugin.compose") version "2.2.10" + kotlin("plugin.serialization") version "2.2.20" } android { namespace = "com.plugin.ahqstore" - compileSdk = 35 + compileSdk = 36 defaultConfig { - minSdk = 21 + minSdk = 26 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") @@ -30,19 +32,46 @@ android { kotlinOptions { jvmTarget = "1.8" } + + buildFeatures { + compose = true + } + + composeOptions { + kotlinCompilerExtensionVersion = "1.5.15" + } } dependencies { - val ackpineVersion = "0.10.1" + val ktor_version = "3.3.0" + val ackpineVersion = "0.15.3" implementation("ru.solrudev.ackpine:ackpine-core:$ackpineVersion") implementation("ru.solrudev.ackpine:ackpine-ktx:$ackpineVersion") - implementation("androidx.core:core-ktx:1.15.0") - implementation("androidx.appcompat:appcompat:1.7.0") + implementation("androidx.core:core-ktx:1.17.0") + implementation("androidx.appcompat:appcompat:1.7.1") + implementation("androidx.work:work-runtime-ktx:2.10.3") + implementation("androidx.datastore:datastore-preferences:1.1.7") + + implementation("io.ktor:ktor-client-core:${ktor_version}") + implementation("io.ktor:ktor-client-cio:${ktor_version}") + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.9.0") + + // Get Full Compose + implementation("androidx.compose.material3:material3") + + // For AppWidgets support + implementation("androidx.glance:glance-appwidget:1.1.1") + // For interop APIs with Material 3 + implementation("androidx.glance:glance-material3:1.1.1") + + implementation("androidx.compose.ui:ui-tooling:1.9.0") + debugImplementation("androidx.compose.ui:ui-tooling:1.9.0") + implementation("com.google.android.material:material:1.12.0") testImplementation("junit:junit:4.13.2") - androidTestImplementation("androidx.test.ext:junit:1.2.1") - androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1") + androidTestImplementation("androidx.test.ext:junit:1.3.0") + androidTestImplementation("androidx.test.espresso:espresso-core:3.7.0") implementation(project(":tauri-android")) } diff --git a/src-plugin/android/gradle.properties b/src-plugin/android/gradle.properties new file mode 100644 index 0000000..930c4ed --- /dev/null +++ b/src-plugin/android/gradle.properties @@ -0,0 +1,15 @@ +## For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# Default value: -Xmx1024m -XX:MaxPermSize=256m +# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +# +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. For more details, visit +# https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects +# org.gradle.parallel=true +#Sat Aug 30 11:59:28 IST 2025 +android.enableJetifier=true +android.useAndroidX=true diff --git a/src-plugin/android/gradle/wrapper/gradle-wrapper.properties b/src-plugin/android/gradle/wrapper/gradle-wrapper.properties index 1af9e09..b51db4f 100644 --- a/src-plugin/android/gradle/wrapper/gradle-wrapper.properties +++ b/src-plugin/android/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,8 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists +android.useAndroidX=true \ No newline at end of file diff --git a/src-plugin/android/local.properties b/src-plugin/android/local.properties index 3194071..fd08c83 100644 --- a/src-plugin/android/local.properties +++ b/src-plugin/android/local.properties @@ -4,5 +4,5 @@ # Location of the SDK. This is only used by Gradle. # For customization when using a Version Control System, please read the # header note. -#Thu Feb 06 22:55:49 IST 2025 -sdk.dir=I\:\\android +#Sat Aug 30 10:46:28 IST 2025 +sdk.dir=I\:\\sdk_android diff --git a/src-plugin/android/settings.gradle b/src-plugin/android/settings.gradle index d7782a4..a543323 100644 --- a/src-plugin/android/settings.gradle +++ b/src-plugin/android/settings.gradle @@ -8,10 +8,10 @@ pluginManagement { eachPlugin { switch (requested.id.id) { case "com.android.library": - useVersion("8.0.2") + useVersion("8.12.0") break case "org.jetbrains.kotlin.android": - useVersion("1.8.20") + useVersion("2.2.10") break } } diff --git a/src-plugin/android/src/main/AndroidManifest.xml b/src-plugin/android/src/main/AndroidManifest.xml index aa8c63f..3e23add 100644 --- a/src-plugin/android/src/main/AndroidManifest.xml +++ b/src-plugin/android/src/main/AndroidManifest.xml @@ -1,4 +1,23 @@ + + + + + + + + + + + + + + + diff --git a/src-plugin/android/src/main/java/AHQStorePlugin.kt b/src-plugin/android/src/main/java/AHQStorePlugin.kt index f2dd294..4f1b2d3 100644 --- a/src-plugin/android/src/main/java/AHQStorePlugin.kt +++ b/src-plugin/android/src/main/java/AHQStorePlugin.kt @@ -1,7 +1,26 @@ package com.plugin.ahqstore +import android.Manifest +import android.annotation.SuppressLint import android.app.Activity +import android.content.Intent +import android.content.pm.PackageInfo +import android.content.pm.PackageManager +import android.net.Uri +import android.os.Build +import android.provider.Settings +import android.util.Log +import android.view.Window +import android.view.WindowInsets import android.webkit.WebView +import androidx.activity.OnBackPressedCallback +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.FileProvider +import androidx.work.Constraints +import androidx.work.ExistingPeriodicWorkPolicy +import androidx.work.NetworkType +import androidx.work.PeriodicWorkRequestBuilder +import androidx.work.WorkManager import app.tauri.annotation.Command import app.tauri.annotation.InvokeArg @@ -9,6 +28,18 @@ import app.tauri.annotation.TauriPlugin import app.tauri.plugin.JSObject import app.tauri.plugin.Plugin import app.tauri.plugin.Invoke +import app.tauri.plugin.JSArray +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.cancel +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +import java.io.File +import java.util.Vector +import java.util.concurrent.TimeUnit @InvokeArg class ShowCodeRequest { @@ -20,29 +51,374 @@ class ZoomRequest { var zoom: Float = 100.0F } +@InvokeArg +class Data { + var data: String = "" +} + +suspend fun windowInset(web: WebView, window: Window) { + val rootView = window.decorView + + var top: Int + var bottom: Int + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + top = rootView.rootWindowInsets.getInsets(WindowInsets.Type.statusBars()).top + bottom = rootView.rootWindowInsets.getInsets(WindowInsets.Type.navigationBars()).bottom + } else { + val insets = rootView.rootWindowInsets + + top = insets.systemWindowInsetTop + bottom = insets.systemWindowInsetBottom + } + + withContext(Dispatchers.Main) { + web.evaluateJavascript( + """ + window.topMargin = $top; + window.bottomMargin = $bottom; + """.trimIndent() + ) { + + } + } +} + @TauriPlugin class AHQStorePlugin(private val activity: Activity): Plugin(activity) { - private var webview: WebView? = null + private var webView: WebView? = null + + private val scope = CoroutineScope(Dispatchers.Default + SupervisorJob()) + + private val updatePref = UpdatePreferencesState(activity) + private val updateWorkerState = UpdateWorkerStore(activity) + private val installHelper = InstallerHelper(activity) + private val com = CommitInfo(activity) + + override fun load(webView: WebView) { + this.webView = webView + + val callback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + webView.evaluateJavascript(""" + window.backPressed() + """.trimIndent()) { + + } + } + } + + (activity as AppCompatActivity).onBackPressedDispatcher.addCallback(callback) + + scope.launch { + while (true) { + windowInset(webView, activity.window) + delay(1500) + } + } + + Log.w("Enqueued", "Periodic Work Running") + + if (!activity.shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + activity.requestPermissions(arrayOf(Manifest.permission.POST_NOTIFICATIONS), 0) + } + } + + val manager = WorkManager.getInstance(activity.baseContext!!) + + val constraints = Constraints( + requiresBatteryNotLow = true, + requiredNetworkType = NetworkType.CONNECTED + ) + + val periodicWork = PeriodicWorkRequestBuilder( + 15, + TimeUnit.MINUTES + ) + .setConstraints(constraints) + .build() + + manager.enqueueUniquePeriodicWork( + "updater", + ExistingPeriodicWorkPolicy.UPDATE, + periodicWork + ) + + Log.w("Enqueued", "Periodic Work Registered") + + this.dataSync() + } + + @Command + fun close(i: Invoke) { + activity.finish() + + i.resolve() + } + + @Command + fun getCommit(invoke: Invoke) { + val ctx = this.activity.baseContext!! + + scope.launch { + invoke.resolve(com.getCommit()) + } + } + + @Command + fun updateCommit(invoke: Invoke) { + val ctx = this.activity.baseContext!! + + scope.launch { + invoke.resolve(com.fetchUpdateCommit()) + } + } + + @Command + fun unload(invoke: Invoke) { + Log.d("AHQStorePlugin", "Tauri @Command unload called. Cancelling pluginScope.") + try { + scope.cancel("Plugin is shutting down") // CRITICAL: Cancel the scope + // Clear references to help garbage collection + webView = null + } catch (e: Exception) { + Log.e("AHQStorePlugin", "Error during plugin unload/cancellation: ${e.message}", e) + } finally { + invoke.resolve() // Always resolve the invoke + } + } + + private fun dataSync() { + scope.launch { + updatePref.listenableAppsToUpdate().collect { data -> + val ret = JSObject() + + ret.put("update", data) + + trigger("updateStat", ret) + } + } + + scope.launch { + updateWorkerState.listenableIsBusy().collect { data -> + val ret = JSObject() + + ret.put("update", data) + trigger("workerCurrentStat", ret) + } + } + } + + @SuppressLint("QueryPermissionsNeeded") + private fun loadAHQStoreApps(): Vector { + val packageManager = activity.baseContext.packageManager + + val packages: Vector = Vector() + + for (application in packageManager.getInstalledPackages(0)) { + val name = application!!.packageName + if (isAHQStorePackage(name)) { + packages.add(application) + } + } + + return packages + } - override fun load(webView: WebView) { - webview = webView + @Command + fun install(invoke: Invoke) { + scope.launch { + installInner(invoke) } + } + + @Command + fun update(invoke: Invoke) { + scope.launch { + val path = invoke.parseArgs(Data::class.java).data + + val apk = File(path) - @Command - fun showCode(invoke: Invoke) { - val args = invoke.parseArgs(ShowCodeRequest::class.java) + val pkgMan = activity.packageManager + + if (!pkgMan.canRequestPackageInstalls()) { + activity.startActivity( + Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES) + .setData(Uri.parse(String.format("package:%s", activity.baseContext.packageName))) + ) + } val ret = JSObject() + + ret.put("success", false) + if (apk.exists()) { + try { + val apkUri: Uri = FileProvider.getUriForFile( + activity.baseContext, + activity.applicationContext.packageName + ".fileprovider", + apk + ) + + val archive = pkgMan.getPackageArchiveInfo(apk.path, 0)!! + + println("Got apk Uri") + + ret.put("success", installHelper.update(archive.packageName, apkUri)) + } catch (e: Throwable) { + println("Error $e") + ret.put("msg", e.message) + } + } else { + ret.put("success", false) + ret.put("msg", "The app path was not found!") + } invoke.resolve(ret) } + } + + @Command + fun getUpdatePref(invoke: Invoke) { + scope.launch { + val ret = JSObject() + ret.put("pref", updatePref.getAutoUpdatePreference()) - @Command - fun zoom(invoke: Invoke) { - val args = invoke.parseArgs(ZoomRequest::class.java) + invoke.resolve(ret) + } + } + + @Command + fun setUpdatePref(invoke: Invoke) { + scope.launch { + val toSet = invoke.parseArgs(String::class.java) + + val toSetFinal = fromString(toSet) + + updatePref.setAutoUpdatePreference(toSetFinal) - webview!!.zoomBy(args.zoom) - val ret = JSObject() + invoke.resolve(ret) } + } + + + @Command + fun uninstall(invoke: Invoke) { + scope.launch { + uninstallInner(invoke) + } + } + + @Command + fun getAndroidBuild(invoke: Invoke) { + val ret = JSObject() + ret.put("sdk", Build.VERSION.SDK_INT) + ret.put("release", Build.VERSION.RELEASE) + + invoke.resolve(ret) + } + + private fun isAHQStorePackage(pkg: String): Boolean { + val packageManager = activity.packageManager + + val source = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + packageManager.getInstallSourceInfo(pkg).initiatingPackageName + } else { + packageManager.getInstallerPackageName(pkg) + } + + return source == activity.applicationInfo.packageName + } + + @Command + fun isAHQStorePackage(invoke: Invoke) { + isAHQStorePackage(invoke.parseArgs(String::class.java)) + } + + @Command + fun listInstalled(invoke: Invoke) { + val pm = activity.packageManager + val ret = JSObject() + val pkgs = JSArray() + + for (pkg in pm.getInstalledPackages(PackageManager.GET_META_DATA)) { + val pkg = pkg!! + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + pm.getInstallSourceInfo(pkg.packageName).installingPackageName + } + if (pkg.applicationInfo != null) { + pkgs.put(pkg) + } + } + + ret.put("apps", pkgs) + + invoke.resolve(ret) + } + + @Command + fun showCode(invoke: Invoke) { + val args = invoke.parseArgs(ShowCodeRequest::class.java) + + invoke.resolve() + } + + @Command + fun zoom(invoke: Invoke) { + val args = invoke.parseArgs(ZoomRequest::class.java) + + val currentZoom = webView!!.scale + webView!!.zoomBy(args.zoom / currentZoom) + + invoke.resolve() + } + + private suspend fun installInner(invoke: Invoke) { + val path = invoke.parseArgs(Data::class.java).data + + val apk = File(path) + + val pkgMan = activity.packageManager + + if (!pkgMan.canRequestPackageInstalls()) { + activity.startActivity( + Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES) + .setData(Uri.parse(String.format("package:%s", activity.baseContext.packageName))) + ) + } + + val ret = JSObject() + + ret.put("success", false) + if (apk.exists()) { + try { + val apkUri: Uri = FileProvider.getUriForFile( + activity.baseContext, + activity.applicationContext.packageName + ".fileprovider", + apk + ) + + println("Got apk Uri") + + ret.put("success", installHelper.install(apkUri)) + } catch (e: Throwable) { + println("Error $e") + ret.put("msg", e.message) + } + } else { + ret.put("success", false) + ret.put("msg", "The app path was not found!") + } + invoke.resolve(ret) + } + + + private suspend fun uninstallInner(invoke: Invoke) { + val packageString = invoke.parseArgs(Data::class.java).data + val resp = JSObject() + + resp.put("success", installHelper.uninstall(packageString)) + invoke.resolve(resp) + } } diff --git a/src-plugin/android/src/main/java/BackgroundUpdateWorker.kt b/src-plugin/android/src/main/java/BackgroundUpdateWorker.kt new file mode 100644 index 0000000..55fda71 --- /dev/null +++ b/src-plugin/android/src/main/java/BackgroundUpdateWorker.kt @@ -0,0 +1,122 @@ +package com.plugin.ahqstore + +import LibraryWidget +import android.app.NotificationChannel +import android.app.NotificationManager +import android.content.Context +import android.util.Log +import androidx.core.app.NotificationCompat +import androidx.core.content.ContextCompat +import androidx.glance.appwidget.updateAll +import androidx.work.CoroutineWorker +import androidx.work.ForegroundInfo +import androidx.work.WorkerParameters +import kotlinx.coroutines.delay +import kotlin.time.Duration + +private const val notificationChannelId = "UpdateNotifications" + +class BackgroundUpdateWorker(ctx: Context, params: WorkerParameters): CoroutineWorker(ctx, params) { + private fun createNotificationChannel() + { + + val notificationChannel = NotificationChannel( + notificationChannelId, + "Update Notifications", + NotificationManager.IMPORTANCE_DEFAULT, + ) + + val notificationManager: NotificationManager? = + ContextCompat.getSystemService( + applicationContext, + NotificationManager::class.java) + + notificationManager?.createNotificationChannel( + notificationChannel + ) + } + + + override suspend fun doWork(): Result { + val store = UpdateWorkerStore(this.applicationContext) + val commit = CommitInfo(this.applicationContext) + + createNotificationChannel() + + try { + // Fetch & Updates Commit Information + commit.fetchUpdateCommit() + + val available = check(this.applicationContext, store, false) + + if (available) { + setForeground(startForeground()) + + runUpdate() + + LibraryWidget().updateAll(this.applicationContext) + + delay(Duration.parse("15m")) + } + + return Result.success() + } catch (_: Exception) { + // If coroutine shuts down due to 10mins reached + store.stop(); + return Result.failure(); + } + } + + private fun startForeground(): ForegroundInfo { + val ctx = this.applicationContext + + val notify = NotificationCompat.Builder(ctx, notificationChannelId) + .setContentTitle("Updating") + .setSmallIcon(R.drawable.favicon) + .setOngoing(true) + .setTicker("Updating") + .setOnlyAlertOnce(true) + .setContentText("Installing 20/30 applications") + .build() + + return ForegroundInfo(8, notify) + } +} + +suspend fun check(ctx: Context, store: UpdateWorkerStore, runForced: Boolean): Boolean { + val pref = UpdatePreferencesState(ctx) + + val updating = runForced || pref.shallUpdateCheck() + Log.i("WORK", "Updating: $updating") + if (!updating) { + return false; + } + + store.start() + + // Work + + val notif = NotificationCompat.Builder(ctx, notificationChannelId) + .setContentTitle("Updates") + .setContentText("We have updated!!") + .setSmallIcon( + R.drawable.favicon, + ) + .build() + + Log.i("Enqueued", "Sent notification") + ContextCompat.getSystemService( + ctx, + NotificationManager::class.java + )?.notify(1, notif) + + store.stop() + + val updateAvailable = true + + return updateAvailable +} + +suspend fun runUpdate() { + +} \ No newline at end of file diff --git a/src-plugin/android/src/main/java/InstallerHelper.kt b/src-plugin/android/src/main/java/InstallerHelper.kt new file mode 100644 index 0000000..2c6721e --- /dev/null +++ b/src-plugin/android/src/main/java/InstallerHelper.kt @@ -0,0 +1,103 @@ +package com.plugin.ahqstore + +import android.annotation.SuppressLint +import android.content.Context +import android.net.Uri +import android.os.Build +import androidx.annotation.ChecksSdkIntAtLeast +import androidx.annotation.RequiresApi +import ru.solrudev.ackpine.installer.PackageInstaller +import ru.solrudev.ackpine.installer.createSession +import ru.solrudev.ackpine.installer.parameters.InstallMode +import ru.solrudev.ackpine.installer.parameters.InstallerType +import ru.solrudev.ackpine.session.Session +import ru.solrudev.ackpine.session.await +import ru.solrudev.ackpine.session.parameters.Confirmation +import ru.solrudev.ackpine.uninstaller.PackageUninstaller +import ru.solrudev.ackpine.uninstaller.createSession + +class InstallerHelper(ctx: Context) { + private val installer = PackageInstaller.getInstance(ctx); + private val uninstaller = PackageUninstaller.getInstance(ctx) + + suspend fun install(apk: Uri): Boolean { + val out = installer.createSession(apk) { + confirmation=Confirmation.IMMEDIATE + installerType=InstallerType.SESSION_BASED + requireUserAction=true + }.await() + + return when(out) { + Session.State.Succeeded -> true + else -> false + } + } + + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.S) + fun canSilentUpdate(): Boolean { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.S + } + + suspend fun selfUpdate(apk: Uri): Boolean { + val out = installer.createSession(apk) { + confirmation = Confirmation.IMMEDIATE + installerType = InstallerType.SESSION_BASED + installMode = InstallMode.InheritExisting(packageName = "com.ahqstore.app", dontKillApp = false) + requireUserAction = true + }.await() + + return when (out) { + Session.State.Succeeded -> true + else -> false + } + } + + @SuppressLint("NewApi") + suspend fun update(pkg: String, apk: Uri): Boolean { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + updateSilent(pkg, apk) + } else { + updateBelow31(pkg, apk) + } + } + + private suspend fun updateBelow31(pkg: String, apk: Uri): Boolean { + val out = installer.createSession(apk) { + confirmation = Confirmation.IMMEDIATE + installerType = InstallerType.SESSION_BASED + installMode = InstallMode.InheritExisting(packageName = pkg, dontKillApp = true) + requireUserAction = true + }.await() + + return when (out) { + Session.State.Succeeded -> true + else -> false + } + } + + @RequiresApi(31) + suspend fun updateSilent(pkg: String, apk: Uri): Boolean { + val out = installer.createSession(apk) { + confirmation = Confirmation.IMMEDIATE + installerType = InstallerType.SESSION_BASED + installMode = InstallMode.InheritExisting(packageName = pkg, dontKillApp = true) + requireUserAction = false + }.await() + + return when (out) { + Session.State.Succeeded -> true + else -> false + } + } + + suspend fun uninstall(pkg: String): Boolean { + val out = uninstaller.createSession(pkg) { + confirmation=Confirmation.IMMEDIATE + }.await() + + return when(out) { + Session.State.Succeeded -> true + else -> false + } + } +} \ No newline at end of file diff --git a/src-plugin/android/src/main/java/LibraryWidget.kt b/src-plugin/android/src/main/java/LibraryWidget.kt new file mode 100644 index 0000000..74b608a --- /dev/null +++ b/src-plugin/android/src/main/java/LibraryWidget.kt @@ -0,0 +1,42 @@ +import android.content.Context +import androidx.glance.GlanceId +import androidx.glance.GlanceModifier +import androidx.glance.GlanceTheme +import androidx.glance.appwidget.GlanceAppWidget +import androidx.glance.appwidget.provideContent +import androidx.glance.text.Text +import androidx.compose.runtime.Composable +import androidx.glance.appwidget.lazy.LazyColumn +import androidx.glance.layout.Column +import androidx.glance.layout.fillMaxWidth + +class LibraryWidget: GlanceAppWidget() { + override suspend fun provideGlance(context: Context, id: GlanceId) { + provideContent { + LibraryWidgetContent() + } + } +} + +@Composable +fun LibraryWidgetContent() { + GlanceTheme { + Column { + LazyColumn(modifier = GlanceModifier.fillMaxWidth()) { + item { + Text("First") + } + } + } + } +} + +//class AddButtonAction : ActionCallback { +// override suspend fun onAction( +// context: Context, +// glanceId: GlanceId, +// parameters: ActionParameters +// ) { +// // Handle your FAB click action here +// } +//} \ No newline at end of file diff --git a/src-plugin/android/src/main/java/UpdatePreferencesState.kt b/src-plugin/android/src/main/java/UpdatePreferencesState.kt new file mode 100644 index 0000000..2cdb3b7 --- /dev/null +++ b/src-plugin/android/src/main/java/UpdatePreferencesState.kt @@ -0,0 +1,151 @@ +package com.plugin.ahqstore + +import android.content.Context +import android.net.ConnectivityManager +import android.net.NetworkCapabilities +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.core.stringPreferencesKey +import androidx.datastore.preferences.preferencesDataStore +import app.tauri.annotation.InvokeArg +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.map + +val Context.updateState: DataStore by preferencesDataStore(name = "updateprefs") + +val AutoUpdatePrefs = stringPreferencesKey("AUTOUPDATE") +val AppsToUpdateList = stringPreferencesKey("AppsToUpdate") + +@InvokeArg +enum class AutoUpdatePreference { + Never, + CheckOnly, + UpdateDuringUnmeteredWifi, + UpdateDuringMeteredWifi, + Always +} + +fun toString(pref: AutoUpdatePreference): String { + return when (pref) { + AutoUpdatePreference.Never -> "Skip" + AutoUpdatePreference.CheckOnly -> "Notify" + AutoUpdatePreference.UpdateDuringUnmeteredWifi -> "UpdateOverWifiNonMetered" + AutoUpdatePreference.UpdateDuringMeteredWifi -> "UpdateOverWifiMetered" + AutoUpdatePreference.Always -> "UpdateOverMobileData" + } +} + +fun fromString(value: String): AutoUpdatePreference { + return when (value) { + "Skip" -> AutoUpdatePreference.Never + "Notify" -> AutoUpdatePreference.CheckOnly + "UpdateOverWifiNonMetered" -> AutoUpdatePreference.UpdateDuringUnmeteredWifi + "UpdateOverWifiMetered" -> AutoUpdatePreference.UpdateDuringMeteredWifi + "UpdateOverMobileData" -> AutoUpdatePreference.Always + else -> AutoUpdatePreference.Never + } +} + +class UpdatePreferencesState() { + private lateinit var ctx: Context; + + constructor(ctx: Context) : this() { + this.ctx = ctx + } + + suspend fun getAutoUpdatePreference(): AutoUpdatePreference { + return this.ctx.updateState.data.map { data -> + val ret = fromString(data[AutoUpdatePrefs] ?: "Notify") + + return@map ret; + }.first() + } + + fun listenableAppsToUpdate(): Flow> { + return this.ctx.updateState.data.map { data -> + val ret = data[AppsToUpdateList] ?: "" + + return@map ret.split(",") + } + } + + suspend fun shallUpdateCheck(): Boolean { + return when (this.getAutoUpdatePreference()) { + AutoUpdatePreference.Never -> false + else -> isConnectedToInternet() + } + } + + suspend fun shallUpdate(): Boolean { + if (!isConnectedToInternet()) { + return false + } + + return when (this.getAutoUpdatePreference()) { + AutoUpdatePreference.Never -> false + AutoUpdatePreference.CheckOnly -> false + AutoUpdatePreference.UpdateDuringUnmeteredWifi -> isWifi() && !isWifiMetered() + AutoUpdatePreference.UpdateDuringMeteredWifi -> isWifi() + AutoUpdatePreference.Always -> isWifi() || isCellular() + } + } + + private fun isWifi(): Boolean { + try { + val man = this.ctx.getSystemService(ConnectivityManager::class.java)!! + + val network = man.activeNetwork + val capability = man.getNetworkCapabilities(network) + + return capability!!.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) + } catch (e: Exception) { + return false; + } + } + + private fun getActiveNetworkCapabilities() : NetworkCapabilities? { + val man = this.ctx.getSystemService(ConnectivityManager::class.java) + + val network = man.activeNetwork + val capability = man.getNetworkCapabilities(network) + + return capability + } + + fun isConnectedToInternet(): Boolean { + val capability = getActiveNetworkCapabilities() + + return capability?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) == true + } + + + fun isCellular(): Boolean { + try { + val capability = getActiveNetworkCapabilities() + + return capability!!.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) + } catch (e: Exception) { + return false; + } + } + + fun isWifiMetered(): Boolean { + try { + val capability = getActiveNetworkCapabilities() + + return !(capability?.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED) ?: true) + } catch (e: Exception) { + return false; + } + } + + suspend fun setAutoUpdatePreference(pref: AutoUpdatePreference) { + this.ctx.updateState.edit { data -> + val ret = toString(pref) + + data[AutoUpdatePrefs] = ret; + } + } +} \ No newline at end of file diff --git a/src-plugin/android/src/main/java/UpdateWorkerStore.kt b/src-plugin/android/src/main/java/UpdateWorkerStore.kt new file mode 100644 index 0000000..5ad0a7f --- /dev/null +++ b/src-plugin/android/src/main/java/UpdateWorkerStore.kt @@ -0,0 +1,42 @@ +package com.plugin.ahqstore + +import android.content.Context +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.booleanPreferencesKey +import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.preferencesDataStore +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map + +val Context.dataStore: DataStore by preferencesDataStore(name = "updatestats") + +val BusyStateKey = booleanPreferencesKey("BUSY") + +class UpdateWorkerStore() { + private lateinit var ctx: Context; + + constructor(ctx: Context) : this() { + this.ctx = ctx + } + + fun listenableIsBusy(): Flow { + return this.ctx.dataStore.data.map { data -> + val ret = data[BusyStateKey] ?: false + + return@map ret + } + } + + suspend fun start() { + this.ctx.dataStore.edit { data -> + data[BusyStateKey] = true + } + } + + suspend fun stop() { + this.ctx.dataStore.edit { data -> + data[BusyStateKey] = false + } + } +} \ No newline at end of file diff --git a/src-plugin/android/src/main/java/api/AppFetch.kt b/src-plugin/android/src/main/java/api/AppFetch.kt new file mode 100644 index 0000000..da01980 --- /dev/null +++ b/src-plugin/android/src/main/java/api/AppFetch.kt @@ -0,0 +1,4 @@ +package api + +class AppFetch { +} \ No newline at end of file diff --git a/src-plugin/android/src/main/java/api/CommitInfo.kt b/src-plugin/android/src/main/java/api/CommitInfo.kt new file mode 100644 index 0000000..c51fa6a --- /dev/null +++ b/src-plugin/android/src/main/java/api/CommitInfo.kt @@ -0,0 +1,132 @@ +package com.plugin.ahqstore + +import android.content.Context +import android.util.Log +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.core.longPreferencesKey +import androidx.datastore.preferences.core.stringPreferencesKey +import androidx.datastore.preferences.preferencesDataStore +import app.tauri.plugin.JSObject +import io.ktor.client.HttpClient +import io.ktor.client.call.body +import io.ktor.client.engine.cio.CIO +import io.ktor.client.plugins.UserAgent +import io.ktor.client.request.get +import kotlinx.coroutines.flow.firstOrNull +import kotlinx.coroutines.flow.last +import kotlinx.coroutines.flow.lastOrNull +import kotlinx.coroutines.flow.map +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json + +val Context.commitStore: DataStore by preferencesDataStore(name = "commitStore") + +val MainCommitKey = stringPreferencesKey("main") +val AltCommitKey = stringPreferencesKey("alt") +val ExpiresTime = longPreferencesKey("expires") + +@Serializable +data class ReleaseData(val sha: String) + +typealias ReleaseDataList = List + +data class Commit(val ahqstore: String, val alt: String) + +class CommitInfo() { + val json = Json { + ignoreUnknownKeys = true + } + val expiresInMillis = 1000 * 60 * 15 // 15 mins + + private lateinit var ctx: Context + private val client = HttpClient(CIO) { + install(UserAgent) { + agent = "AHQ Store Installer" + } + } + + constructor(ctx: Context) : this() { + this.ctx = ctx + } + + suspend fun fetchUpdateCommitKt() : Commit { + Log.i("COM", "Sending get commit") + + val aBody = client.get("https://api.github.com/repos/ahqstore/repo_community/commits") + .body() + + val ahqstore = json.decodeFromString(aBody)[0].sha + + val altBody = client.get("https://api.github.com/repos/ahqstore/repo_android/commits") + .body() + + val alt = json.decodeFromString(altBody)[0].sha + + ctx.commitStore.edit { d -> + d[MainCommitKey] = ahqstore + d[AltCommitKey] = alt + d[ExpiresTime] = System.currentTimeMillis() + expiresInMillis + } + + return Commit(ahqstore, alt) + } + + suspend fun fetchUpdateCommit() : JSObject { + val (ahqstore, alt) = fetchUpdateCommitKt() + + val obj = JSObject() + + obj.put("ahqstore", ahqstore) + obj.put("alt", alt) + + return obj + } + + suspend fun getCommit() : JSObject { + Log.i("COM", "Requesting state") + + var commit = ctx.commitStore.data.firstOrNull() + + val expires = commit?.get(ExpiresTime) ?: 0 + val now = System.currentTimeMillis() + + if (commit == null || now >= expires) { + Log.d("COM", "Fetching") + return fetchUpdateCommit() + } + + val ahqstore = commit[MainCommitKey] ?: "" + val alt = commit[AltCommitKey] ?: "" + + val ret = JSObject() + + ret.put("ahqstore", ahqstore) + ret.put("alt", alt) + + return ret + } + + suspend fun getCommitKt() : Commit { + var commit = ctx.commitStore.data.map { data -> + val ahqstore = data[MainCommitKey] ?: "" + val alt = data[AltCommitKey] ?: "" + val expires = data[ExpiresTime] ?: 0 + + val now = System.currentTimeMillis() + + if (now >= expires) { + return@map null + } + + return@map Commit(ahqstore, alt) + }.firstOrNull() + + if (commit == null) { + commit = fetchUpdateCommitKt() + } + + return commit + } +} \ No newline at end of file diff --git a/src-plugin/android/src/main/java/com/plugin/ahqstore/Library.kt b/src-plugin/android/src/main/java/com/plugin/ahqstore/Library.kt new file mode 100644 index 0000000..1387b36 --- /dev/null +++ b/src-plugin/android/src/main/java/com/plugin/ahqstore/Library.kt @@ -0,0 +1,20 @@ +package com.plugin.ahqstore + +import android.content.Context +import android.content.Intent +import LibraryWidget +import androidx.glance.appwidget.GlanceAppWidget +import androidx.glance.appwidget.GlanceAppWidgetReceiver + +class Library: GlanceAppWidgetReceiver() { + override val glanceAppWidget: GlanceAppWidget + get() = LibraryWidget() + + override fun onReceive(context: Context, intent: Intent) { + super.onReceive(context, intent) + + if (intent.action == "ACTION_UPDATE_WIDGET") { + + } + } +} \ No newline at end of file diff --git a/src-plugin/android/src/main/res/drawable/favicon.webp b/src-plugin/android/src/main/res/drawable/favicon.webp new file mode 100644 index 0000000..19364bb Binary files /dev/null and b/src-plugin/android/src/main/res/drawable/favicon.webp differ diff --git a/src-plugin/android/src/main/res/drawable/update.xml b/src-plugin/android/src/main/res/drawable/update.xml new file mode 100644 index 0000000..72b030c --- /dev/null +++ b/src-plugin/android/src/main/res/drawable/update.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src-plugin/android/src/main/res/values/strings.xml b/src-plugin/android/src/main/res/values/strings.xml new file mode 100644 index 0000000..fef56ae --- /dev/null +++ b/src-plugin/android/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + + App Updates Tracker + \ No newline at end of file diff --git a/src-plugin/android/src/main/res/xml/library_widget.xml b/src-plugin/android/src/main/res/xml/library_widget.xml new file mode 100644 index 0000000..1805a7c --- /dev/null +++ b/src-plugin/android/src/main/res/xml/library_widget.xml @@ -0,0 +1,13 @@ + + \ No newline at end of file diff --git a/src-plugin/build.rs b/src-plugin/build.rs index 25989e3..b2270a9 100644 --- a/src-plugin/build.rs +++ b/src-plugin/build.rs @@ -10,6 +10,7 @@ const COMMANDS: &[&str] = &[ "rem_code", "hash_username", "refresh_commit", + "get_commit", "get_all_search", "get_home", "get_app", @@ -17,7 +18,10 @@ const COMMANDS: &[&str] = &[ "get_app_asset", "get_devs_apps", "get_arch", - "set_scale" + "set_scale", + "encrypt", + "decrypt", + "download", ]; fn main() { diff --git a/src-plugin/guest-js/index.ts b/src-plugin/guest-js/index.ts index 2f7a056..5852f35 100644 --- a/src-plugin/guest-js/index.ts +++ b/src-plugin/guest-js/index.ts @@ -1,56 +1,139 @@ -import { invoke } from '@tauri-apps/api/core' -import { AHQStoreApplication, type SearchEntry } from "ahqstore-types" +import { Channel, invoke } from '@tauri-apps/api/core' +import type { AHQStoreApplication, DevData } from "ahqstore-types" + +interface Commits { + ahqstore: string, + alt: string, +} + +export type DownloadEvent = { + event: "started"; + data: { + length: number + } +} | { + event: "progress"; + data: { + progress: number; + } +} | { + event: "finished"; + data: {} +}; export async function getWindows(): Promise { - return await invoke('plugin:ahqstore|getWindows', {}) + return await invoke('plugin:ahqstore|get_windows', {}) .catch((_) => ""); } export async function getLinuxDistro(): Promise { - return await invoke('plugin:ahqstore|getLinuxDistro', {}) + return await invoke('plugin:ahqstore|get_linux_distro', {}) .catch((_) => ""); } export async function isWindows11(): Promise { - return await invoke('plugin:ahqstore|isWindows11', {}) + return await invoke('plugin:ahqstore|is_windows_11', {}) .catch((_) => false); } +/** + * + * @param appId Your Application ID + * @param progressUpdate + * @returns A channel to cancel the download + */ +export async function downloadApp( + appId: string, + progressUpdate: (event: DownloadEvent) => void +): Promise> { + + const channel = new Channel(); + + channel.onmessage = (resp) => progressUpdate(resp); + + return invoke>("plugin:ahqstore|download", { + appId, + prog: channel, + }); +} + +export const encrypt = async (payload: string) => invoke("plugin:ahqstore|encrypt", { payload }); +export const decrypt = async (encrypted: number[]) => invoke("plugin:ahqstore|decrypt", { encrypted }); + export async function open(url: string) { return await invoke('plugin:ahqstore|open', { url }); } export async function setProgress(state: number, c?: number, t?: number) { - return await invoke("plugin:ahqstore|setProgress", { state, c, t }); + return await invoke("plugin:ahqstore|set_progress", { state, c, t }); } export async function isDev() { - return await invoke("plugin:ahqstore|isDevelopment"); + return await invoke("plugin:ahqstore|is_sevelopment"); } export async function showCode(code: string) { - return await invoke("plugin:ahqstore|showCode", { code }); + return await invoke("plugin:ahqstore|show_code", { code }); } export async function removeCode() { - return await invoke("plugin:ahqstore|remCode", {}); + return await invoke("plugin:ahqstore|rem_code", {}); } export async function hashUsername(username: string) { - return await invoke("plugin:ahqstore|hashUsername", { username }); + return await invoke("plugin:ahqstore|hash_username", { username }); } export async function setScale(scale: number) { - return await invoke("plugin:ahqstore|setScale", { scale }); + return await invoke("plugin:ahqstore|set_scale", { scale }); } export async function refreshCommit() { - return await invoke("plugin:ahqstore|refreshCommit"); + return await invoke("plugin:ahqstore|refresh_commit"); } +export const getCommit = async () => await invoke("plugin:ahqstore|get_commit"); + export const search = async (query: string) => { - return await invoke("plugin:getAllSearch", { query }); + return await invoke("plugin:ahqstore|get_all_search", { query }); } -export const getHome = async () => await invoke<[string, string[]][]>("plugin:getHome"); -export const getApp = async (app: string) => await invoke("plugin:getApp", { app }); \ No newline at end of file +export interface Home { + splash?: { + hero: { + title: string, + description: string, + button: string, + background: string, + author: string, + appId: string, + }, + subhero: { + title: string, + background: string, + appId: string, + color?: string + }, + third: { + title: string, + background: string, + appId: string, + color?: string + }, + fourth: { + title: string, + background: string, + appId: string, + color?: string + } + }, + home: [string, string[]][] +} + +export const getHome = async () => await invoke("plugin:ahqstore|get_home"); +export const getApp = async (app: string) => await invoke("plugin:ahqstore|get_app", { app }); +export const getDevData = async (dev: string) => invoke("plugin:ahqstore|get_dev_data", { dev }); +export const getAppAsset = async (app: string, asset: string) => invoke("plugin:ahqstore|get_app_asset", { app, asset }); +export const getDevsApps = async (dev: string) => invoke("plugin:ahqstore|get_devs_apps", { dev }); + +export const getArch = async () => invoke<"x86" | "x86_64" | "aarch64" | "arm">("plugin:ahqstore|get_arch"); \ No newline at end of file diff --git a/src-plugin/package.json b/src-plugin/package.json index 9288490..82d8daf 100644 --- a/src-plugin/package.json +++ b/src-plugin/package.json @@ -22,13 +22,13 @@ "pretest": "pnpm build" }, "dependencies": { - "@tauri-apps/api": "^2.2.0", + "@tauri-apps/api": "^2.6.0", "ahqstore-types": "link:..\\src-ahqstore-types\\pkg" }, "devDependencies": { - "@rollup/plugin-typescript": "^12.1.2", - "rollup": "^4.34.4", + "@rollup/plugin-typescript": "^12.1.4", + "rollup": "^4.45.0", "tslib": "^2.8.1", - "typescript": "^5.7.3" + "typescript": "^5.8.3" } } diff --git a/src-plugin/permissions/autogenerated/commands/all.toml b/src-plugin/permissions/autogenerated/commands/all.toml index 9c33cf6..1fa43f9 100644 --- a/src-plugin/permissions/autogenerated/commands/all.toml +++ b/src-plugin/permissions/autogenerated/commands/all.toml @@ -15,6 +15,7 @@ commands.allow = [ "rem_code", "hash_username", "refresh_commit", + "get_commit", "get_all_search", "get_home", "get_app", @@ -23,4 +24,7 @@ commands.allow = [ "get_devs_apps", "get_arch", "set_scale", + "encrypt", + "decrypt", + "download" ] diff --git a/src-plugin/permissions/autogenerated/commands/decrypt.toml b/src-plugin/permissions/autogenerated/commands/decrypt.toml new file mode 100644 index 0000000..f6e1b77 --- /dev/null +++ b/src-plugin/permissions/autogenerated/commands/decrypt.toml @@ -0,0 +1,13 @@ +# Automatically generated - DO NOT EDIT! + +"$schema" = "../../schemas/schema.json" + +[[permission]] +identifier = "allow-decrypt" +description = "Enables the decrypt command without any pre-configured scope." +commands.allow = ["decrypt"] + +[[permission]] +identifier = "deny-decrypt" +description = "Denies the decrypt command without any pre-configured scope." +commands.deny = ["decrypt"] diff --git a/src-plugin/permissions/autogenerated/commands/download.toml b/src-plugin/permissions/autogenerated/commands/download.toml new file mode 100644 index 0000000..896b30c --- /dev/null +++ b/src-plugin/permissions/autogenerated/commands/download.toml @@ -0,0 +1,13 @@ +# Automatically generated - DO NOT EDIT! + +"$schema" = "../../schemas/schema.json" + +[[permission]] +identifier = "allow-download" +description = "Enables the download command without any pre-configured scope." +commands.allow = ["download"] + +[[permission]] +identifier = "deny-download" +description = "Denies the download command without any pre-configured scope." +commands.deny = ["download"] diff --git a/src-plugin/permissions/autogenerated/commands/encrypt.toml b/src-plugin/permissions/autogenerated/commands/encrypt.toml new file mode 100644 index 0000000..94e9e57 --- /dev/null +++ b/src-plugin/permissions/autogenerated/commands/encrypt.toml @@ -0,0 +1,13 @@ +# Automatically generated - DO NOT EDIT! + +"$schema" = "../../schemas/schema.json" + +[[permission]] +identifier = "allow-encrypt" +description = "Enables the encrypt command without any pre-configured scope." +commands.allow = ["encrypt"] + +[[permission]] +identifier = "deny-encrypt" +description = "Denies the encrypt command without any pre-configured scope." +commands.deny = ["encrypt"] diff --git a/src-plugin/permissions/autogenerated/commands/get_commit.toml b/src-plugin/permissions/autogenerated/commands/get_commit.toml new file mode 100644 index 0000000..2db132e --- /dev/null +++ b/src-plugin/permissions/autogenerated/commands/get_commit.toml @@ -0,0 +1,13 @@ +# Automatically generated - DO NOT EDIT! + +"$schema" = "../../schemas/schema.json" + +[[permission]] +identifier = "allow-get-commit" +description = "Enables the get_commit command without any pre-configured scope." +commands.allow = ["get_commit"] + +[[permission]] +identifier = "deny-get-commit" +description = "Denies the get_commit command without any pre-configured scope." +commands.deny = ["get_commit"] diff --git a/src-plugin/permissions/autogenerated/reference.md b/src-plugin/permissions/autogenerated/reference.md index 65a3313..41cf5a2 100644 --- a/src-plugin/permissions/autogenerated/reference.md +++ b/src-plugin/permissions/autogenerated/reference.md @@ -2,6 +2,8 @@ Default permissions for the plugin +#### This default permission set includes the following: + - `allow-ping` ## Permission Table @@ -29,6 +31,84 @@ Enables all the commands +`ahqstore:allow-decrypt` + + + + +Enables the decrypt command without any pre-configured scope. + + + + + + + +`ahqstore:deny-decrypt` + + + + +Denies the decrypt command without any pre-configured scope. + + + + + + + +`ahqstore:allow-download` + + + + +Enables the download command without any pre-configured scope. + + + + + + + +`ahqstore:deny-download` + + + + +Denies the download command without any pre-configured scope. + + + + + + + +`ahqstore:allow-encrypt` + + + + +Enables the encrypt command without any pre-configured scope. + + + + + + + +`ahqstore:deny-encrypt` + + + + +Denies the encrypt command without any pre-configured scope. + + + + + + + `ahqstore:allow-get-all-search` @@ -133,6 +213,32 @@ Denies the get_arch command without any pre-configured scope. +`ahqstore:allow-get-commit` + + + + +Enables the get_commit command without any pre-configured scope. + + + + + + + +`ahqstore:deny-get-commit` + + + + +Denies the get_commit command without any pre-configured scope. + + + + + + + `ahqstore:allow-get-dev-data` diff --git a/src-plugin/permissions/schemas/schema.json b/src-plugin/permissions/schemas/schema.json index ea38313..3338bb8 100644 --- a/src-plugin/permissions/schemas/schema.json +++ b/src-plugin/permissions/schemas/schema.json @@ -49,7 +49,7 @@ "minimum": 1.0 }, "description": { - "description": "Human-readable description of what the permission does. Tauri convention is to use

headings in markdown content for Tauri documentation generation purposes.", + "description": "Human-readable description of what the permission does. Tauri convention is to use `

` headings in markdown content for Tauri documentation generation purposes.", "type": [ "string", "null" @@ -111,7 +111,7 @@ "type": "string" }, "description": { - "description": "Human-readable description of what the permission does. Tauri internal convention is to use

headings in markdown content for Tauri documentation generation purposes.", + "description": "Human-readable description of what the permission does. Tauri internal convention is to use `

` headings in markdown content for Tauri documentation generation purposes.", "type": [ "string", "null" @@ -297,202 +297,290 @@ { "description": "Enables all the commands", "type": "string", - "const": "allow-all" + "const": "allow-all", + "markdownDescription": "Enables all the commands" + }, + { + "description": "Enables the decrypt command without any pre-configured scope.", + "type": "string", + "const": "allow-decrypt", + "markdownDescription": "Enables the decrypt command without any pre-configured scope." + }, + { + "description": "Denies the decrypt command without any pre-configured scope.", + "type": "string", + "const": "deny-decrypt", + "markdownDescription": "Denies the decrypt command without any pre-configured scope." + }, + { + "description": "Enables the download command without any pre-configured scope.", + "type": "string", + "const": "allow-download", + "markdownDescription": "Enables the download command without any pre-configured scope." + }, + { + "description": "Denies the download command without any pre-configured scope.", + "type": "string", + "const": "deny-download", + "markdownDescription": "Denies the download command without any pre-configured scope." + }, + { + "description": "Enables the encrypt command without any pre-configured scope.", + "type": "string", + "const": "allow-encrypt", + "markdownDescription": "Enables the encrypt command without any pre-configured scope." + }, + { + "description": "Denies the encrypt command without any pre-configured scope.", + "type": "string", + "const": "deny-encrypt", + "markdownDescription": "Denies the encrypt command without any pre-configured scope." }, { "description": "Enables the get_all_search command without any pre-configured scope.", "type": "string", - "const": "allow-get-all-search" + "const": "allow-get-all-search", + "markdownDescription": "Enables the get_all_search command without any pre-configured scope." }, { "description": "Denies the get_all_search command without any pre-configured scope.", "type": "string", - "const": "deny-get-all-search" + "const": "deny-get-all-search", + "markdownDescription": "Denies the get_all_search command without any pre-configured scope." }, { "description": "Enables the get_app command without any pre-configured scope.", "type": "string", - "const": "allow-get-app" + "const": "allow-get-app", + "markdownDescription": "Enables the get_app command without any pre-configured scope." }, { "description": "Denies the get_app command without any pre-configured scope.", "type": "string", - "const": "deny-get-app" + "const": "deny-get-app", + "markdownDescription": "Denies the get_app command without any pre-configured scope." }, { "description": "Enables the get_app_asset command without any pre-configured scope.", "type": "string", - "const": "allow-get-app-asset" + "const": "allow-get-app-asset", + "markdownDescription": "Enables the get_app_asset command without any pre-configured scope." }, { "description": "Denies the get_app_asset command without any pre-configured scope.", "type": "string", - "const": "deny-get-app-asset" + "const": "deny-get-app-asset", + "markdownDescription": "Denies the get_app_asset command without any pre-configured scope." }, { "description": "Enables the get_arch command without any pre-configured scope.", "type": "string", - "const": "allow-get-arch" + "const": "allow-get-arch", + "markdownDescription": "Enables the get_arch command without any pre-configured scope." }, { "description": "Denies the get_arch command without any pre-configured scope.", "type": "string", - "const": "deny-get-arch" + "const": "deny-get-arch", + "markdownDescription": "Denies the get_arch command without any pre-configured scope." + }, + { + "description": "Enables the get_commit command without any pre-configured scope.", + "type": "string", + "const": "allow-get-commit", + "markdownDescription": "Enables the get_commit command without any pre-configured scope." + }, + { + "description": "Denies the get_commit command without any pre-configured scope.", + "type": "string", + "const": "deny-get-commit", + "markdownDescription": "Denies the get_commit command without any pre-configured scope." }, { "description": "Enables the get_dev_data command without any pre-configured scope.", "type": "string", - "const": "allow-get-dev-data" + "const": "allow-get-dev-data", + "markdownDescription": "Enables the get_dev_data command without any pre-configured scope." }, { "description": "Denies the get_dev_data command without any pre-configured scope.", "type": "string", - "const": "deny-get-dev-data" + "const": "deny-get-dev-data", + "markdownDescription": "Denies the get_dev_data command without any pre-configured scope." }, { "description": "Enables the get_devs_apps command without any pre-configured scope.", "type": "string", - "const": "allow-get-devs-apps" + "const": "allow-get-devs-apps", + "markdownDescription": "Enables the get_devs_apps command without any pre-configured scope." }, { "description": "Denies the get_devs_apps command without any pre-configured scope.", "type": "string", - "const": "deny-get-devs-apps" + "const": "deny-get-devs-apps", + "markdownDescription": "Denies the get_devs_apps command without any pre-configured scope." }, { "description": "Enables the get_home command without any pre-configured scope.", "type": "string", - "const": "allow-get-home" + "const": "allow-get-home", + "markdownDescription": "Enables the get_home command without any pre-configured scope." }, { "description": "Denies the get_home command without any pre-configured scope.", "type": "string", - "const": "deny-get-home" + "const": "deny-get-home", + "markdownDescription": "Denies the get_home command without any pre-configured scope." }, { "description": "Enables the get_linux_distro command without any pre-configured scope.", "type": "string", - "const": "allow-get-linux-distro" + "const": "allow-get-linux-distro", + "markdownDescription": "Enables the get_linux_distro command without any pre-configured scope." }, { "description": "Denies the get_linux_distro command without any pre-configured scope.", "type": "string", - "const": "deny-get-linux-distro" + "const": "deny-get-linux-distro", + "markdownDescription": "Denies the get_linux_distro command without any pre-configured scope." }, { "description": "Enables the get_windows command without any pre-configured scope.", "type": "string", - "const": "allow-get-windows" + "const": "allow-get-windows", + "markdownDescription": "Enables the get_windows command without any pre-configured scope." }, { "description": "Denies the get_windows command without any pre-configured scope.", "type": "string", - "const": "deny-get-windows" + "const": "deny-get-windows", + "markdownDescription": "Denies the get_windows command without any pre-configured scope." }, { "description": "Enables the hash_username command without any pre-configured scope.", "type": "string", - "const": "allow-hash-username" + "const": "allow-hash-username", + "markdownDescription": "Enables the hash_username command without any pre-configured scope." }, { "description": "Denies the hash_username command without any pre-configured scope.", "type": "string", - "const": "deny-hash-username" + "const": "deny-hash-username", + "markdownDescription": "Denies the hash_username command without any pre-configured scope." }, { "description": "Enables the is_development command without any pre-configured scope.", "type": "string", - "const": "allow-is-development" + "const": "allow-is-development", + "markdownDescription": "Enables the is_development command without any pre-configured scope." }, { "description": "Denies the is_development command without any pre-configured scope.", "type": "string", - "const": "deny-is-development" + "const": "deny-is-development", + "markdownDescription": "Denies the is_development command without any pre-configured scope." }, { "description": "Enables the is_windows_11 command without any pre-configured scope.", "type": "string", - "const": "allow-is-windows-11" + "const": "allow-is-windows-11", + "markdownDescription": "Enables the is_windows_11 command without any pre-configured scope." }, { "description": "Denies the is_windows_11 command without any pre-configured scope.", "type": "string", - "const": "deny-is-windows-11" + "const": "deny-is-windows-11", + "markdownDescription": "Denies the is_windows_11 command without any pre-configured scope." }, { "description": "Enables the open command without any pre-configured scope.", "type": "string", - "const": "allow-open" + "const": "allow-open", + "markdownDescription": "Enables the open command without any pre-configured scope." }, { "description": "Denies the open command without any pre-configured scope.", "type": "string", - "const": "deny-open" + "const": "deny-open", + "markdownDescription": "Denies the open command without any pre-configured scope." }, { "description": "Enables the refresh_commit command without any pre-configured scope.", "type": "string", - "const": "allow-refresh-commit" + "const": "allow-refresh-commit", + "markdownDescription": "Enables the refresh_commit command without any pre-configured scope." }, { "description": "Denies the refresh_commit command without any pre-configured scope.", "type": "string", - "const": "deny-refresh-commit" + "const": "deny-refresh-commit", + "markdownDescription": "Denies the refresh_commit command without any pre-configured scope." }, { "description": "Enables the rem_code command without any pre-configured scope.", "type": "string", - "const": "allow-rem-code" + "const": "allow-rem-code", + "markdownDescription": "Enables the rem_code command without any pre-configured scope." }, { "description": "Denies the rem_code command without any pre-configured scope.", "type": "string", - "const": "deny-rem-code" + "const": "deny-rem-code", + "markdownDescription": "Denies the rem_code command without any pre-configured scope." }, { "description": "Enables the set_progress command without any pre-configured scope.", "type": "string", - "const": "allow-set-progress" + "const": "allow-set-progress", + "markdownDescription": "Enables the set_progress command without any pre-configured scope." }, { "description": "Denies the set_progress command without any pre-configured scope.", "type": "string", - "const": "deny-set-progress" + "const": "deny-set-progress", + "markdownDescription": "Denies the set_progress command without any pre-configured scope." }, { "description": "Enables the set_scale command without any pre-configured scope.", "type": "string", - "const": "allow-set-scale" + "const": "allow-set-scale", + "markdownDescription": "Enables the set_scale command without any pre-configured scope." }, { "description": "Denies the set_scale command without any pre-configured scope.", "type": "string", - "const": "deny-set-scale" + "const": "deny-set-scale", + "markdownDescription": "Denies the set_scale command without any pre-configured scope." }, { "description": "Enables the show_code command without any pre-configured scope.", "type": "string", - "const": "allow-show-code" + "const": "allow-show-code", + "markdownDescription": "Enables the show_code command without any pre-configured scope." }, { "description": "Denies the show_code command without any pre-configured scope.", "type": "string", - "const": "deny-show-code" + "const": "deny-show-code", + "markdownDescription": "Denies the show_code command without any pre-configured scope." }, { "description": "Enables the to_hash_uid command without any pre-configured scope.", "type": "string", - "const": "allow-to-hash-uid" + "const": "allow-to-hash-uid", + "markdownDescription": "Enables the to_hash_uid command without any pre-configured scope." }, { "description": "Denies the to_hash_uid command without any pre-configured scope.", "type": "string", - "const": "deny-to-hash-uid" + "const": "deny-to-hash-uid", + "markdownDescription": "Denies the to_hash_uid command without any pre-configured scope." }, { - "description": "Default permissions for the plugin", + "description": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-ping`", "type": "string", - "const": "default" + "const": "default", + "markdownDescription": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-ping`" } ] } diff --git a/src-plugin/pnpm-lock.yaml b/src-plugin/pnpm-lock.yaml index aa508e5..354e176 100644 --- a/src-plugin/pnpm-lock.yaml +++ b/src-plugin/pnpm-lock.yaml @@ -9,29 +9,29 @@ importers: .: dependencies: '@tauri-apps/api': - specifier: ^2.2.0 - version: 2.2.0 + specifier: ^2.6.0 + version: 2.6.0 ahqstore-types: specifier: link:..\src-ahqstore-types\pkg version: link:../src-ahqstore-types/pkg devDependencies: '@rollup/plugin-typescript': - specifier: ^12.1.2 - version: 12.1.2(rollup@4.34.4)(tslib@2.8.1)(typescript@5.7.3) + specifier: ^12.1.4 + version: 12.1.4(rollup@4.45.0)(tslib@2.8.1)(typescript@5.8.3) rollup: - specifier: ^4.34.4 - version: 4.34.4 + specifier: ^4.45.0 + version: 4.45.0 tslib: specifier: ^2.8.1 version: 2.8.1 typescript: - specifier: ^5.7.3 - version: 5.7.3 + specifier: ^5.8.3 + version: 5.8.3 packages: - '@rollup/plugin-typescript@12.1.2': - resolution: {integrity: sha512-cdtSp154H5sv637uMr1a8OTWB0L1SWDSm1rDGiyfcGcvQ6cuTs4MDk2BVEBGysUWago4OJN4EQZqOTl/QY3Jgg==} + '@rollup/plugin-typescript@12.1.4': + resolution: {integrity: sha512-s5Hx+EtN60LMlDBvl5f04bEiFZmAepk27Q+mr85L/00zPDn1jtzlTV6FWn81MaIwqfWzKxmOJrBWHU6vtQyedQ==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^2.14.0||^3.0.0||^4.0.0 @@ -43,8 +43,8 @@ packages: tslib: optional: true - '@rollup/pluginutils@5.1.4': - resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + '@rollup/pluginutils@5.2.0': + resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -52,106 +52,111 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.34.4': - resolution: {integrity: sha512-gGi5adZWvjtJU7Axs//CWaQbQd/vGy8KGcnEaCWiyCqxWYDxwIlAHFuSe6Guoxtd0SRvSfVTDMPd5H+4KE2kKA==} + '@rollup/rollup-android-arm-eabi@4.45.0': + resolution: {integrity: sha512-2o/FgACbji4tW1dzXOqAV15Eu7DdgbKsF2QKcxfG4xbh5iwU7yr5RRP5/U+0asQliSYv5M4o7BevlGIoSL0LXg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.34.4': - resolution: {integrity: sha512-1aRlh1gqtF7vNPMnlf1vJKk72Yshw5zknR/ZAVh7zycRAGF2XBMVDAHmFQz/Zws5k++nux3LOq/Ejj1WrDR6xg==} + '@rollup/rollup-android-arm64@4.45.0': + resolution: {integrity: sha512-PSZ0SvMOjEAxwZeTx32eI/j5xSYtDCRxGu5k9zvzoY77xUNssZM+WV6HYBLROpY5CkXsbQjvz40fBb7WPwDqtQ==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.34.4': - resolution: {integrity: sha512-drHl+4qhFj+PV/jrQ78p9ch6A0MfNVZScl/nBps5a7u01aGf/GuBRrHnRegA9bP222CBDfjYbFdjkIJ/FurvSQ==} + '@rollup/rollup-darwin-arm64@4.45.0': + resolution: {integrity: sha512-BA4yPIPssPB2aRAWzmqzQ3y2/KotkLyZukVB7j3psK/U3nVJdceo6qr9pLM2xN6iRP/wKfxEbOb1yrlZH6sYZg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.34.4': - resolution: {integrity: sha512-hQqq/8QALU6t1+fbNmm6dwYsa0PDD4L5r3TpHx9dNl+aSEMnIksHZkSO3AVH+hBMvZhpumIGrTFj8XCOGuIXjw==} + '@rollup/rollup-darwin-x64@4.45.0': + resolution: {integrity: sha512-Pr2o0lvTwsiG4HCr43Zy9xXrHspyMvsvEw4FwKYqhli4FuLE5FjcZzuQ4cfPe0iUFCvSQG6lACI0xj74FDZKRA==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.34.4': - resolution: {integrity: sha512-/L0LixBmbefkec1JTeAQJP0ETzGjFtNml2gpQXA8rpLo7Md+iXQzo9kwEgzyat5Q+OG/C//2B9Fx52UxsOXbzw==} + '@rollup/rollup-freebsd-arm64@4.45.0': + resolution: {integrity: sha512-lYE8LkE5h4a/+6VnnLiL14zWMPnx6wNbDG23GcYFpRW1V9hYWHAw9lBZ6ZUIrOaoK7NliF1sdwYGiVmziUF4vA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.34.4': - resolution: {integrity: sha512-6Rk3PLRK+b8L/M6m/x6Mfj60LhAUcLJ34oPaxufA+CfqkUrDoUPQYFdRrhqyOvtOKXLJZJwxlOLbQjNYQcRQfw==} + '@rollup/rollup-freebsd-x64@4.45.0': + resolution: {integrity: sha512-PVQWZK9sbzpvqC9Q0GlehNNSVHR+4m7+wET+7FgSnKG3ci5nAMgGmr9mGBXzAuE5SvguCKJ6mHL6vq1JaJ/gvw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.34.4': - resolution: {integrity: sha512-kmT3x0IPRuXY/tNoABp2nDvI9EvdiS2JZsd4I9yOcLCCViKsP0gB38mVHOhluzx+SSVnM1KNn9k6osyXZhLoCA==} + '@rollup/rollup-linux-arm-gnueabihf@4.45.0': + resolution: {integrity: sha512-hLrmRl53prCcD+YXTfNvXd776HTxNh8wPAMllusQ+amcQmtgo3V5i/nkhPN6FakW+QVLoUUr2AsbtIRPFU3xIA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.34.4': - resolution: {integrity: sha512-3iSA9tx+4PZcJH/Wnwsvx/BY4qHpit/u2YoZoXugWVfc36/4mRkgGEoRbRV7nzNBSCOgbWMeuQ27IQWgJ7tRzw==} + '@rollup/rollup-linux-arm-musleabihf@4.45.0': + resolution: {integrity: sha512-XBKGSYcrkdiRRjl+8XvrUR3AosXU0NvF7VuqMsm7s5nRy+nt58ZMB19Jdp1RdqewLcaYnpk8zeVs/4MlLZEJxw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.34.4': - resolution: {integrity: sha512-7CwSJW+sEhM9sESEk+pEREF2JL0BmyCro8UyTq0Kyh0nu1v0QPNY3yfLPFKChzVoUmaKj8zbdgBxUhBRR+xGxg==} + '@rollup/rollup-linux-arm64-gnu@4.45.0': + resolution: {integrity: sha512-fRvZZPUiBz7NztBE/2QnCS5AtqLVhXmUOPj9IHlfGEXkapgImf4W9+FSkL8cWqoAjozyUzqFmSc4zh2ooaeF6g==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.34.4': - resolution: {integrity: sha512-GZdafB41/4s12j8Ss2izofjeFXRAAM7sHCb+S4JsI9vaONX/zQ8cXd87B9MRU/igGAJkKvmFmJJBeeT9jJ5Cbw==} + '@rollup/rollup-linux-arm64-musl@4.45.0': + resolution: {integrity: sha512-Btv2WRZOcUGi8XU80XwIvzTg4U6+l6D0V6sZTrZx214nrwxw5nAi8hysaXj/mctyClWgesyuxbeLylCBNauimg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.34.4': - resolution: {integrity: sha512-uuphLuw1X6ur11675c2twC6YxbzyLSpWggvdawTUamlsoUv81aAXRMPBC1uvQllnBGls0Qt5Siw8reSIBnbdqQ==} + '@rollup/rollup-linux-loongarch64-gnu@4.45.0': + resolution: {integrity: sha512-Li0emNnwtUZdLwHjQPBxn4VWztcrw/h7mgLyHiEI5Z0MhpeFGlzaiBHpSNVOMB/xucjXTTcO+dhv469Djr16KA==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.34.4': - resolution: {integrity: sha512-KvLEw1os2gSmD6k6QPCQMm2T9P2GYvsMZMRpMz78QpSoEevHbV/KOUbI/46/JRalhtSAYZBYLAnT9YE4i/l4vg==} + '@rollup/rollup-linux-powerpc64le-gnu@4.45.0': + resolution: {integrity: sha512-sB8+pfkYx2kvpDCfd63d5ScYT0Fz1LO6jIb2zLZvmK9ob2D8DeVqrmBDE0iDK8KlBVmsTNzrjr3G1xV4eUZhSw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.34.4': - resolution: {integrity: sha512-wcpCLHGM9yv+3Dql/CI4zrY2mpQ4WFergD3c9cpRowltEh5I84pRT/EuHZsG0In4eBPPYthXnuR++HrFkeqwkA==} + '@rollup/rollup-linux-riscv64-gnu@4.45.0': + resolution: {integrity: sha512-5GQ6PFhh7E6jQm70p1aW05G2cap5zMOvO0se5JMecHeAdj5ZhWEHbJ4hiKpfi1nnnEdTauDXxPgXae/mqjow9w==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.34.4': - resolution: {integrity: sha512-nLbfQp2lbJYU8obhRQusXKbuiqm4jSJteLwfjnunDT5ugBKdxqw1X9KWwk8xp1OMC6P5d0WbzxzhWoznuVK6XA==} + '@rollup/rollup-linux-riscv64-musl@4.45.0': + resolution: {integrity: sha512-N/euLsBd1rekWcuduakTo/dJw6U6sBP3eUq+RXM9RNfPuWTvG2w/WObDkIvJ2KChy6oxZmOSC08Ak2OJA0UiAA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.45.0': + resolution: {integrity: sha512-2l9sA7d7QdikL0xQwNMO3xURBUNEWyHVHfAsHsUdq+E/pgLTUcCE+gih5PCdmyHmfTDeXUWVhqL0WZzg0nua3g==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.34.4': - resolution: {integrity: sha512-JGejzEfVzqc/XNiCKZj14eb6s5w8DdWlnQ5tWUbs99kkdvfq9btxxVX97AaxiUX7xJTKFA0LwoS0KU8C2faZRg==} + '@rollup/rollup-linux-x64-gnu@4.45.0': + resolution: {integrity: sha512-XZdD3fEEQcwG2KrJDdEQu7NrHonPxxaV0/w2HpvINBdcqebz1aL+0vM2WFJq4DeiAVT6F5SUQas65HY5JDqoPw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.34.4': - resolution: {integrity: sha512-/iFIbhzeyZZy49ozAWJ1ZR2KW6ZdYUbQXLT4O5n1cRZRoTpwExnHLjlurDXXPKEGxiAg0ujaR9JDYKljpr2fDg==} + '@rollup/rollup-linux-x64-musl@4.45.0': + resolution: {integrity: sha512-7ayfgvtmmWgKWBkCGg5+xTQ0r5V1owVm67zTrsEY1008L5ro7mCyGYORomARt/OquB9KY7LpxVBZes+oSniAAQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.34.4': - resolution: {integrity: sha512-qORc3UzoD5UUTneiP2Afg5n5Ti1GAW9Gp5vHPxzvAFFA3FBaum9WqGvYXGf+c7beFdOKNos31/41PRMUwh1tpA==} + '@rollup/rollup-win32-arm64-msvc@4.45.0': + resolution: {integrity: sha512-B+IJgcBnE2bm93jEW5kHisqvPITs4ddLOROAcOc/diBgrEiQJJ6Qcjby75rFSmH5eMGrqJryUgJDhrfj942apQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.34.4': - resolution: {integrity: sha512-5g7E2PHNK2uvoD5bASBD9aelm44nf1w4I5FEI7MPHLWcCSrR8JragXZWgKPXk5i2FU3JFfa6CGZLw2RrGBHs2Q==} + '@rollup/rollup-win32-ia32-msvc@4.45.0': + resolution: {integrity: sha512-+CXwwG66g0/FpWOnP/v1HnrGVSOygK/osUbu3wPRy8ECXjoYKjRAyfxYpDQOfghC5qPJYLPH0oN4MCOjwgdMug==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.34.4': - resolution: {integrity: sha512-p0scwGkR4kZ242xLPBuhSckrJ734frz6v9xZzD+kHVYRAkSUmdSLCIJRfql6H5//aF8Q10K+i7q8DiPfZp0b7A==} + '@rollup/rollup-win32-x64-msvc@4.45.0': + resolution: {integrity: sha512-SRf1cytG7wqcHVLrBc9VtPK4pU5wxiB/lNIkNmW2ApKXIg+RpqwHfsaEK+e7eH4A1BpI6BX/aBWXxZCIrJg3uA==} cpu: [x64] os: [win32] - '@tauri-apps/api@2.2.0': - resolution: {integrity: sha512-R8epOeZl1eJEl603aUMIGb4RXlhPjpgxbGVEaqY+0G5JG9vzV/clNlzTeqc+NLYXVqXcn8mb4c5b9pJIUDEyAg==} + '@tauri-apps/api@2.6.0': + resolution: {integrity: sha512-hRNcdercfgpzgFrMXWwNDBN0B7vNzOzRepy6ZAmhxi5mDLVPNrTpo9MGg2tN/F7JRugj4d2aF7E1rtPXAHaetg==} - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -184,8 +189,8 @@ packages: engines: {node: '>= 0.4'} hasBin: true - rollup@4.34.4: - resolution: {integrity: sha512-spF66xoyD7rz3o08sHP7wogp1gZ6itSq22SGa/IZTcUDXDlOyrShwMwkVSB+BUxFRZZCUYqdb3KWDEOMVQZxuw==} + rollup@4.45.0: + resolution: {integrity: sha512-WLjEcJRIo7i3WDDgOIJqVI2d+lAC3EwvOGy+Xfq6hs+GQuAA4Di/H72xmXkOhrIWFg2PFYSKZYfH0f4vfKXN4A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -196,90 +201,93 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - typescript@5.7.3: - resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} hasBin: true snapshots: - '@rollup/plugin-typescript@12.1.2(rollup@4.34.4)(tslib@2.8.1)(typescript@5.7.3)': + '@rollup/plugin-typescript@12.1.4(rollup@4.45.0)(tslib@2.8.1)(typescript@5.8.3)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.34.4) + '@rollup/pluginutils': 5.2.0(rollup@4.45.0) resolve: 1.22.10 - typescript: 5.7.3 + typescript: 5.8.3 optionalDependencies: - rollup: 4.34.4 + rollup: 4.45.0 tslib: 2.8.1 - '@rollup/pluginutils@5.1.4(rollup@4.34.4)': + '@rollup/pluginutils@5.2.0(rollup@4.45.0)': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.34.4 + rollup: 4.45.0 + + '@rollup/rollup-android-arm-eabi@4.45.0': + optional: true - '@rollup/rollup-android-arm-eabi@4.34.4': + '@rollup/rollup-android-arm64@4.45.0': optional: true - '@rollup/rollup-android-arm64@4.34.4': + '@rollup/rollup-darwin-arm64@4.45.0': optional: true - '@rollup/rollup-darwin-arm64@4.34.4': + '@rollup/rollup-darwin-x64@4.45.0': optional: true - '@rollup/rollup-darwin-x64@4.34.4': + '@rollup/rollup-freebsd-arm64@4.45.0': optional: true - '@rollup/rollup-freebsd-arm64@4.34.4': + '@rollup/rollup-freebsd-x64@4.45.0': optional: true - '@rollup/rollup-freebsd-x64@4.34.4': + '@rollup/rollup-linux-arm-gnueabihf@4.45.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.34.4': + '@rollup/rollup-linux-arm-musleabihf@4.45.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.34.4': + '@rollup/rollup-linux-arm64-gnu@4.45.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.34.4': + '@rollup/rollup-linux-arm64-musl@4.45.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.34.4': + '@rollup/rollup-linux-loongarch64-gnu@4.45.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.34.4': + '@rollup/rollup-linux-powerpc64le-gnu@4.45.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.34.4': + '@rollup/rollup-linux-riscv64-gnu@4.45.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.34.4': + '@rollup/rollup-linux-riscv64-musl@4.45.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.34.4': + '@rollup/rollup-linux-s390x-gnu@4.45.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.34.4': + '@rollup/rollup-linux-x64-gnu@4.45.0': optional: true - '@rollup/rollup-linux-x64-musl@4.34.4': + '@rollup/rollup-linux-x64-musl@4.45.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.34.4': + '@rollup/rollup-win32-arm64-msvc@4.45.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.34.4': + '@rollup/rollup-win32-ia32-msvc@4.45.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.34.4': + '@rollup/rollup-win32-x64-msvc@4.45.0': optional: true - '@tauri-apps/api@2.2.0': {} + '@tauri-apps/api@2.6.0': {} - '@types/estree@1.0.6': {} + '@types/estree@1.0.8': {} estree-walker@2.0.2: {} @@ -306,33 +314,34 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - rollup@4.34.4: + rollup@4.45.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.34.4 - '@rollup/rollup-android-arm64': 4.34.4 - '@rollup/rollup-darwin-arm64': 4.34.4 - '@rollup/rollup-darwin-x64': 4.34.4 - '@rollup/rollup-freebsd-arm64': 4.34.4 - '@rollup/rollup-freebsd-x64': 4.34.4 - '@rollup/rollup-linux-arm-gnueabihf': 4.34.4 - '@rollup/rollup-linux-arm-musleabihf': 4.34.4 - '@rollup/rollup-linux-arm64-gnu': 4.34.4 - '@rollup/rollup-linux-arm64-musl': 4.34.4 - '@rollup/rollup-linux-loongarch64-gnu': 4.34.4 - '@rollup/rollup-linux-powerpc64le-gnu': 4.34.4 - '@rollup/rollup-linux-riscv64-gnu': 4.34.4 - '@rollup/rollup-linux-s390x-gnu': 4.34.4 - '@rollup/rollup-linux-x64-gnu': 4.34.4 - '@rollup/rollup-linux-x64-musl': 4.34.4 - '@rollup/rollup-win32-arm64-msvc': 4.34.4 - '@rollup/rollup-win32-ia32-msvc': 4.34.4 - '@rollup/rollup-win32-x64-msvc': 4.34.4 + '@rollup/rollup-android-arm-eabi': 4.45.0 + '@rollup/rollup-android-arm64': 4.45.0 + '@rollup/rollup-darwin-arm64': 4.45.0 + '@rollup/rollup-darwin-x64': 4.45.0 + '@rollup/rollup-freebsd-arm64': 4.45.0 + '@rollup/rollup-freebsd-x64': 4.45.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.45.0 + '@rollup/rollup-linux-arm-musleabihf': 4.45.0 + '@rollup/rollup-linux-arm64-gnu': 4.45.0 + '@rollup/rollup-linux-arm64-musl': 4.45.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.45.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.45.0 + '@rollup/rollup-linux-riscv64-gnu': 4.45.0 + '@rollup/rollup-linux-riscv64-musl': 4.45.0 + '@rollup/rollup-linux-s390x-gnu': 4.45.0 + '@rollup/rollup-linux-x64-gnu': 4.45.0 + '@rollup/rollup-linux-x64-musl': 4.45.0 + '@rollup/rollup-win32-arm64-msvc': 4.45.0 + '@rollup/rollup-win32-ia32-msvc': 4.45.0 + '@rollup/rollup-win32-x64-msvc': 4.45.0 fsevents: 2.3.3 supports-preserve-symlinks-flag@1.0.0: {} tslib@2.8.1: {} - typescript@5.7.3: {} + typescript@5.8.3: {} diff --git a/src-plugin/sart.rs b/src-plugin/sart.rs new file mode 100644 index 0000000..6c5bf87 --- /dev/null +++ b/src-plugin/sart.rs @@ -0,0 +1,5343 @@ +#![feature(prelude_import)] +#[macro_use] +extern crate std; +#[prelude_import] +use std::prelude::rust_2021::*; +use tauri::{ + plugin::{Builder, TauriPlugin}, + Manager, Runtime, +}; +pub use models::*; +mod structs { + #![allow(unused)] + use std::{sync::Arc, time::{SystemTime, UNIX_EPOCH}}; + use ahqstore_types::{get_all_commits, Commits}; + use serde::{de::DeserializeOwned, Deserialize, Serialize}; + use tauri::{ + async_runtime::{self, spawn, RwLock}, + plugin::PluginApi, AppHandle, Runtime, + }; + use tokio::sync::Mutex; + use crate::{ + models::*, + structs::{ + daemon::{initialize, IPCSend}, + search::search_daemon, + }, + }; + pub(crate) mod daemon { + use std::{ + sync::{Arc, LazyLock, OnceLock}, + thread, + }; + use ahqstore_types::{Commits, StatusUpdateData}; + use serde::{Deserialize, Serialize}; + use tauri::{AppHandle, Runtime}; + use tokio::{ + runtime::Builder, + sync::{ + broadcast::{channel, Receiver, Sender as S2}, + mpsc::{unbounded_channel, UnboundedSender as S1}, + RwLock, + }, + }; + pub enum SendRequest { + CheckForUpdate, + PerformTransaction { transaction: u64 }, + PerformAllTransactions, + CancelTransaction { transaction: u64 }, + InstallUSERAPP { app_id: String }, + RemoveUSERAPP { app_id: String }, + } + pub type IPCSend = S1; + pub type Broadcast = S2>; + pub static BOXED_TX_REF: OnceLock = OnceLock::new(); + mod desktop { + use std::{mem::replace, sync::Arc, time::{Duration, SystemTime, UNIX_EPOCH}}; + use ahqstore_types::{ + AppActionIntent, AppUpdateInstallStatus, Commits, QueuedApp, + QueuedAppData, StatusUpdateData, + }; + use tauri::Runtime; + use tokio::{ + spawn, + sync::{broadcast::Sender, mpsc::UnboundedReceiver, Notify, RwLock}, + task::JoinHandle, time::{interval, sleep, MissedTickBehavior}, + }; + use crate::structs::{ + daemon::SendRequest, platform, search::CommitSearchIndex, Ahqstore, + }; + const TEN_MINS: u64 = 10 * 60 * 1000; + pub mod lock { + use tokio::sync::Mutex; + pub static INSTALLLOCK: Mutex<()> = Mutex::const_new(()); + pub fn is_installing() -> bool { + INSTALLLOCK.try_lock().is_err() + } + } + pub async fn daemon( + ahqstore: &Ahqstore, + commits: Arc>, + tx: Sender>, + mut rx: UnboundedReceiver, + ) { + let mut user_initiated = false; + let mut queue: Vec = Vec::with_capacity(50); + let mut intl = interval(Duration::from_mins(10)); + intl.tick().await; + intl.set_missed_tick_behavior(MissedTickBehavior::Burst); + let mut notify = Notify::new(); + let mut changed = false; + let mut transaction = 0; + loop { + let now = SystemTime::now() + .duration_since(UNIX_EPOCH) + .expect("Time is running in reverse") + .as_secs(); + { + #[doc(hidden)] + mod __tokio_select_util { + pub(super) enum Out<_0, _1, _2, _3> { + _0(_0), + _1(_1), + _2(_2), + _3(_3), + Disabled, + } + pub(super) type Mask = u8; + } + use ::tokio::macros::support::Future; + use ::tokio::macros::support::Pin; + use ::tokio::macros::support::Poll::{Ready, Pending}; + const BRANCHES: u32 = 4; + let mut disabled: __tokio_select_util::Mask = Default::default(); + if !true { + let mask: __tokio_select_util::Mask = 1 << 0; + disabled |= mask; + } + if !true { + let mask: __tokio_select_util::Mask = 1 << 1; + disabled |= mask; + } + if !true { + let mask: __tokio_select_util::Mask = 1 << 2; + disabled |= mask; + } + if !true { + let mask: __tokio_select_util::Mask = 1 << 3; + disabled |= mask; + } + let mut output = { + let futures_init = ( + sleep(Duration::from_millis(100)), + intl.tick(), + notify.notified(), + rx.recv(), + ); + let mut futures = ( + ::tokio::macros::support::IntoFuture::into_future( + futures_init.0, + ), + ::tokio::macros::support::IntoFuture::into_future( + futures_init.1, + ), + ::tokio::macros::support::IntoFuture::into_future( + futures_init.2, + ), + ::tokio::macros::support::IntoFuture::into_future( + futures_init.3, + ), + ); + let mut futures = &mut futures; + ::tokio::macros::support::poll_fn(|cx| { + match ::tokio::macros::support::poll_budget_available(cx) { + ::core::task::Poll::Ready(t) => t, + ::core::task::Poll::Pending => { + return ::core::task::Poll::Pending; + } + }; + let mut is_pending = false; + let start = { + ::tokio::macros::support::thread_rng_n(BRANCHES) + }; + for i in 0..BRANCHES { + let branch; + #[allow(clippy::modulo_one)] + { + branch = (start + i) % BRANCHES; + } + match branch { + #[allow(unreachable_code)] + 0 => { + let mask = 1 << branch; + if disabled & mask == mask { + continue; + } + let (fut, ..) = &mut *futures; + let mut fut = unsafe { Pin::new_unchecked(fut) }; + let out = match Future::poll(fut, cx) { + Ready(out) => out, + Pending => { + is_pending = true; + continue; + } + }; + disabled |= mask; + #[allow(unused_variables)] #[allow(unused_mut)] + match &out { + _ => {} + _ => continue, + } + return Ready(__tokio_select_util::Out::_0(out)); + } + #[allow(unreachable_code)] + 1 => { + let mask = 1 << branch; + if disabled & mask == mask { + continue; + } + let (_, fut, ..) = &mut *futures; + let mut fut = unsafe { Pin::new_unchecked(fut) }; + let out = match Future::poll(fut, cx) { + Ready(out) => out, + Pending => { + is_pending = true; + continue; + } + }; + disabled |= mask; + #[allow(unused_variables)] #[allow(unused_mut)] + match &out { + _ => {} + _ => continue, + } + return Ready(__tokio_select_util::Out::_1(out)); + } + #[allow(unreachable_code)] + 2 => { + let mask = 1 << branch; + if disabled & mask == mask { + continue; + } + let (_, _, fut, ..) = &mut *futures; + let mut fut = unsafe { Pin::new_unchecked(fut) }; + let out = match Future::poll(fut, cx) { + Ready(out) => out, + Pending => { + is_pending = true; + continue; + } + }; + disabled |= mask; + #[allow(unused_variables)] #[allow(unused_mut)] + match &out { + _ => {} + _ => continue, + } + return Ready(__tokio_select_util::Out::_2(out)); + } + #[allow(unreachable_code)] + 3 => { + let mask = 1 << branch; + if disabled & mask == mask { + continue; + } + let (_, _, _, fut, ..) = &mut *futures; + let mut fut = unsafe { Pin::new_unchecked(fut) }; + let out = match Future::poll(fut, cx) { + Ready(out) => out, + Pending => { + is_pending = true; + continue; + } + }; + disabled |= mask; + #[allow(unused_variables)] #[allow(unused_mut)] + match &out { + Some(msg) => {} + _ => continue, + } + return Ready(__tokio_select_util::Out::_3(out)); + } + _ => { + ::core::panicking::panic_fmt( + format_args!( + "internal error: entered unreachable code: {0}", + format_args!( + "reaching this means there probably is an off by one bug", + ), + ), + ); + } + } + } + if is_pending { + Pending + } else { + Ready(__tokio_select_util::Out::Disabled) + } + }) + .await + }; + match output { + __tokio_select_util::Out::_0(_) => { + let old = queue.len(); + queue + .retain(|x| match &x.status { + AppUpdateInstallStatus::Successful { time } => { + now < (*time + 2) + } + AppUpdateInstallStatus::Cancelled { time } => { + now < (*time + 5) + } + AppUpdateInstallStatus::Error { time, .. } => { + now < (*time + 10) + } + _ => true, + }); + changed = old != queue.len(); + } + __tokio_select_util::Out::_1(_) => { + notify.notify_one(); + } + __tokio_select_util::Out::_2(_) => { + changed = true; + } + __tokio_select_util::Out::_3(Some(msg)) => { + handle_msg( + ahqstore, + &mut user_initiated, + ¬ify, + msg, + &mut queue, + &mut transaction, + now, + ) + .await; + while let Ok(extra_msg) = rx.try_recv() { + handle_msg( + ahqstore, + &mut user_initiated, + ¬ify, + extra_msg, + &mut queue, + &mut transaction, + now, + ) + .await; + } + changed = true; + } + __tokio_select_util::Out::Disabled => { + ::core::panicking::panic_fmt( + format_args!( + "all branches are disabled and there is no else branch", + ), + ); + } + _ => { + ::core::panicking::panic_fmt( + format_args!( + "internal error: entered unreachable code: {0}", + format_args!("failed to match bind"), + ), + ); + } + } + } + if changed { + let queue_data = queue + .iter() + .map(QueuedAppData::from) + .collect::>(); + _ = tx + .send( + Arc::new(StatusUpdateData { + disable_update: false, + overflow: queue.len() >= 100, + queue: queue_data, + }), + ); + changed = false; + } + } + } + #[inline(always)] + async fn handle_msg( + ahqstore: &Ahqstore, + user_initiated: &mut bool, + notify: &Notify, + msg: SendRequest, + queue: &mut Vec, + transaction: &mut u64, + now: u64, + ) { + *transaction += 1; + if queue.len() < 100 { + match msg { + SendRequest::CheckForUpdate => { + if ahqstore.can_update_commit().await { + *user_initiated = true; + notify.notify_one(); + } + } + SendRequest::CancelTransaction { transaction } => { + if let Some(x) = queue + .iter_mut() + .find(|x| x.transaction == transaction) + { + match x.status { + AppUpdateInstallStatus::Pending + | AppUpdateInstallStatus::PendingUserAction + | AppUpdateInstallStatus::Downloading { .. } + | AppUpdateInstallStatus::AVScanning => { + x.status = AppUpdateInstallStatus::Cancelled { + time: now, + }; + if let Some(data) = x.task.take() { + data.abort(); + } + } + _ => {} + } + } + } + SendRequest::PerformTransaction { transaction } => { + if let Some(x) = queue + .iter_mut() + .find(|x| x.transaction == transaction) + { + x.status = AppUpdateInstallStatus::Pending; + x.task = Some(spawn(async {})); + } + } + SendRequest::PerformAllTransactions => { + queue + .iter_mut() + .for_each(|x| { + if let AppUpdateInstallStatus::PendingUserAction = &x.status + { + x.status = AppUpdateInstallStatus::Pending; + x.task = Some(spawn(async {})); + } + }); + } + SendRequest::InstallUSERAPP { app_id } => { + let app_id: Arc = Arc::from(app_id); + queue + .push(QueuedApp { + status: AppUpdateInstallStatus::Pending, + intent: AppActionIntent::Install, + transaction: *transaction, + id: app_id, + task: Some(spawn(async {})), + }); + } + SendRequest::RemoveUSERAPP { app_id } => { + let app_id: Arc = Arc::from(app_id); + queue + .push(QueuedApp { + status: AppUpdateInstallStatus::Pending, + intent: AppActionIntent::Uninstall, + transaction: *transaction, + id: app_id, + task: Some(spawn(async {})), + }); + } + } + } + } + } + pub use desktop::*; + use crate::{structs::search::CommitSearchIndex, AhqstoreExt}; + pub fn get_daemon_listener() -> Receiver> { + BOXED_TX_REF.get().expect("Cannot error out").subscribe() + } + pub fn initialize( + hwnd: AppHandle, + commits: Arc>, + ) -> IPCSend { + let (ipc_send, rx) = unbounded_channel(); + let (tx, _) = channel(100); + BOXED_TX_REF.set(tx.clone()).expect("No error, don't worry"); + thread::spawn(move || { + Builder::new_current_thread() + .enable_all() + .build() + .expect("Unable to create thread") + .block_on(async move { + let astore = hwnd.ahqstore(); + daemon(astore, commits, tx, rx).await; + }); + }); + ipc_send + } + } + pub(crate) mod platform { + use std::{fs, thread}; + use ahqstore_types::internet; + use anyhow::{Context, Error as AnyError}; + use tauri::{command, ipc::Channel, AppHandle}; + use tokio::sync::oneshot; + pub mod common { + use std::{fs, path::PathBuf}; + use tauri::{AppHandle, Manager, Runtime}; + use anyhow::Result; + pub mod desktop { + use futures::future::join_all; + use serde::{Deserialize, Serialize}; + use tokio::fs; + use crate::structs::platform::os::install::{ + AHQSTORE_USER_DIR, AHQSTORE_GLOBAL_DIR, + }; + pub async fn list_user_apps() -> Option> { + let dir = &AHQSTORE_USER_DIR.as_str(); + _inner_list_apps(dir, true).await + } + pub async fn list_global_apps() -> Option> { + let dir = &AHQSTORE_GLOBAL_DIR.as_str(); + _inner_list_apps(dir, false).await + } + #[serde(tag = "event", content = "data")] + pub enum AppListing { + Full { app_id: String }, + Unknown { app_id: String }, + } + #[automatically_derived] + impl ::core::fmt::Debug for AppListing { + #[inline] + fn fmt( + &self, + f: &mut ::core::fmt::Formatter, + ) -> ::core::fmt::Result { + match self { + AppListing::Full { app_id: __self_0 } => { + ::core::fmt::Formatter::debug_struct_field1_finish( + f, + "Full", + "app_id", + &__self_0, + ) + } + AppListing::Unknown { app_id: __self_0 } => { + ::core::fmt::Formatter::debug_struct_field1_finish( + f, + "Unknown", + "app_id", + &__self_0, + ) + } + } + } + } + #[doc(hidden)] + #[allow( + non_upper_case_globals, + unused_attributes, + unused_qualifications, + clippy::absolute_paths, + )] + const _: () = { + #[allow(unused_extern_crates, clippy::useless_attribute)] + extern crate serde as _serde; + #[automatically_derived] + impl _serde::Serialize for AppListing { + fn serialize<__S>( + &self, + __serializer: __S, + ) -> _serde::__private228::Result<__S::Ok, __S::Error> + where + __S: _serde::Serializer, + { + match *self { + AppListing::Full { ref app_id } => { + #[doc(hidden)] + struct __AdjacentlyTagged<'__a> { + data: (&'__a String,), + phantom: _serde::__private228::PhantomData, + } + #[automatically_derived] + impl<'__a> _serde::Serialize for __AdjacentlyTagged<'__a> { + fn serialize<__S>( + &self, + __serializer: __S, + ) -> _serde::__private228::Result<__S::Ok, __S::Error> + where + __S: _serde::Serializer, + { + #[allow(unused_variables)] + let (app_id,) = self.data; + let mut __serde_state = _serde::Serializer::serialize_struct( + __serializer, + "Full", + 0 + 1, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __serde_state, + "app_id", + app_id, + )?; + _serde::ser::SerializeStruct::end(__serde_state) + } + } + let mut __struct = _serde::Serializer::serialize_struct( + __serializer, + "AppListing", + 2, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __struct, + "event", + &_serde::__private228::ser::AdjacentlyTaggedEnumVariant { + enum_name: "AppListing", + variant_index: 0u32, + variant_name: "Full", + }, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __struct, + "data", + &__AdjacentlyTagged { + data: (app_id,), + phantom: _serde::__private228::PhantomData::, + }, + )?; + _serde::ser::SerializeStruct::end(__struct) + } + AppListing::Unknown { ref app_id } => { + #[doc(hidden)] + struct __AdjacentlyTagged<'__a> { + data: (&'__a String,), + phantom: _serde::__private228::PhantomData, + } + #[automatically_derived] + impl<'__a> _serde::Serialize for __AdjacentlyTagged<'__a> { + fn serialize<__S>( + &self, + __serializer: __S, + ) -> _serde::__private228::Result<__S::Ok, __S::Error> + where + __S: _serde::Serializer, + { + #[allow(unused_variables)] + let (app_id,) = self.data; + let mut __serde_state = _serde::Serializer::serialize_struct( + __serializer, + "Unknown", + 0 + 1, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __serde_state, + "app_id", + app_id, + )?; + _serde::ser::SerializeStruct::end(__serde_state) + } + } + let mut __struct = _serde::Serializer::serialize_struct( + __serializer, + "AppListing", + 2, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __struct, + "event", + &_serde::__private228::ser::AdjacentlyTaggedEnumVariant { + enum_name: "AppListing", + variant_index: 1u32, + variant_name: "Unknown", + }, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __struct, + "data", + &__AdjacentlyTagged { + data: (app_id,), + phantom: _serde::__private228::PhantomData::, + }, + )?; + _serde::ser::SerializeStruct::end(__struct) + } + } + } + } + }; + #[doc(hidden)] + #[allow( + non_upper_case_globals, + unused_attributes, + unused_qualifications, + clippy::absolute_paths, + )] + const _: () = { + #[allow(unused_extern_crates, clippy::useless_attribute)] + extern crate serde as _serde; + #[automatically_derived] + impl<'de> _serde::Deserialize<'de> for AppListing { + fn deserialize<__D>( + __deserializer: __D, + ) -> _serde::__private228::Result + where + __D: _serde::Deserializer<'de>, + { + #[allow(non_camel_case_types)] + #[doc(hidden)] + enum __Field { + __field0, + __field1, + } + #[doc(hidden)] + struct __FieldVisitor; + #[automatically_derived] + impl<'de> _serde::de::Visitor<'de> for __FieldVisitor { + type Value = __Field; + fn expecting( + &self, + __formatter: &mut _serde::__private228::Formatter, + ) -> _serde::__private228::fmt::Result { + _serde::__private228::Formatter::write_str( + __formatter, + "variant identifier", + ) + } + fn visit_u64<__E>( + self, + __value: u64, + ) -> _serde::__private228::Result + where + __E: _serde::de::Error, + { + match __value { + 0u64 => _serde::__private228::Ok(__Field::__field0), + 1u64 => _serde::__private228::Ok(__Field::__field1), + _ => { + _serde::__private228::Err( + _serde::de::Error::invalid_value( + _serde::de::Unexpected::Unsigned(__value), + &"variant index 0 <= i < 2", + ), + ) + } + } + } + fn visit_str<__E>( + self, + __value: &str, + ) -> _serde::__private228::Result + where + __E: _serde::de::Error, + { + match __value { + "Full" => _serde::__private228::Ok(__Field::__field0), + "Unknown" => _serde::__private228::Ok(__Field::__field1), + _ => { + _serde::__private228::Err( + _serde::de::Error::unknown_variant(__value, VARIANTS), + ) + } + } + } + fn visit_bytes<__E>( + self, + __value: &[u8], + ) -> _serde::__private228::Result + where + __E: _serde::de::Error, + { + match __value { + b"Full" => _serde::__private228::Ok(__Field::__field0), + b"Unknown" => _serde::__private228::Ok(__Field::__field1), + _ => { + let __value = &_serde::__private228::from_utf8_lossy( + __value, + ); + _serde::__private228::Err( + _serde::de::Error::unknown_variant(__value, VARIANTS), + ) + } + } + } + } + #[automatically_derived] + impl<'de> _serde::Deserialize<'de> for __Field { + #[inline] + fn deserialize<__D>( + __deserializer: __D, + ) -> _serde::__private228::Result + where + __D: _serde::Deserializer<'de>, + { + _serde::Deserializer::deserialize_identifier( + __deserializer, + __FieldVisitor, + ) + } + } + #[doc(hidden)] + const VARIANTS: &'static [&'static str] = &[ + "Full", + "Unknown", + ]; + #[doc(hidden)] + struct __Seed<'de> { + variant: __Field, + marker: _serde::__private228::PhantomData, + lifetime: _serde::__private228::PhantomData<&'de ()>, + } + #[automatically_derived] + impl<'de> _serde::de::DeserializeSeed<'de> for __Seed<'de> { + type Value = AppListing; + fn deserialize<__D>( + self, + __deserializer: __D, + ) -> _serde::__private228::Result + where + __D: _serde::Deserializer<'de>, + { + match self.variant { + __Field::__field0 => { + #[allow(non_camel_case_types)] + #[doc(hidden)] + enum __Field { + __field0, + __ignore, + } + #[doc(hidden)] + struct __FieldVisitor; + #[automatically_derived] + impl<'de> _serde::de::Visitor<'de> for __FieldVisitor { + type Value = __Field; + fn expecting( + &self, + __formatter: &mut _serde::__private228::Formatter, + ) -> _serde::__private228::fmt::Result { + _serde::__private228::Formatter::write_str( + __formatter, + "field identifier", + ) + } + fn visit_u64<__E>( + self, + __value: u64, + ) -> _serde::__private228::Result + where + __E: _serde::de::Error, + { + match __value { + 0u64 => _serde::__private228::Ok(__Field::__field0), + _ => _serde::__private228::Ok(__Field::__ignore), + } + } + fn visit_str<__E>( + self, + __value: &str, + ) -> _serde::__private228::Result + where + __E: _serde::de::Error, + { + match __value { + "app_id" => _serde::__private228::Ok(__Field::__field0), + _ => _serde::__private228::Ok(__Field::__ignore), + } + } + fn visit_bytes<__E>( + self, + __value: &[u8], + ) -> _serde::__private228::Result + where + __E: _serde::de::Error, + { + match __value { + b"app_id" => _serde::__private228::Ok(__Field::__field0), + _ => _serde::__private228::Ok(__Field::__ignore), + } + } + } + #[automatically_derived] + impl<'de> _serde::Deserialize<'de> for __Field { + #[inline] + fn deserialize<__D>( + __deserializer: __D, + ) -> _serde::__private228::Result + where + __D: _serde::Deserializer<'de>, + { + _serde::Deserializer::deserialize_identifier( + __deserializer, + __FieldVisitor, + ) + } + } + #[doc(hidden)] + struct __Visitor<'de> { + marker: _serde::__private228::PhantomData, + lifetime: _serde::__private228::PhantomData<&'de ()>, + } + #[automatically_derived] + impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> { + type Value = AppListing; + fn expecting( + &self, + __formatter: &mut _serde::__private228::Formatter, + ) -> _serde::__private228::fmt::Result { + _serde::__private228::Formatter::write_str( + __formatter, + "struct variant AppListing::Full", + ) + } + #[inline] + fn visit_map<__A>( + self, + mut __map: __A, + ) -> _serde::__private228::Result + where + __A: _serde::de::MapAccess<'de>, + { + let mut __field0: _serde::__private228::Option = _serde::__private228::None; + while let _serde::__private228::Some(__key) = _serde::de::MapAccess::next_key::< + __Field, + >(&mut __map)? { + match __key { + __Field::__field0 => { + if _serde::__private228::Option::is_some(&__field0) { + return _serde::__private228::Err( + <__A::Error as _serde::de::Error>::duplicate_field("app_id"), + ); + } + __field0 = _serde::__private228::Some( + _serde::de::MapAccess::next_value::(&mut __map)?, + ); + } + _ => { + let _ = _serde::de::MapAccess::next_value::< + _serde::de::IgnoredAny, + >(&mut __map)?; + } + } + } + let __field0 = match __field0 { + _serde::__private228::Some(__field0) => __field0, + _serde::__private228::None => { + _serde::__private228::de::missing_field("app_id")? + } + }; + _serde::__private228::Ok(AppListing::Full { + app_id: __field0, + }) + } + } + #[doc(hidden)] + const FIELDS: &'static [&'static str] = &["app_id"]; + _serde::Deserializer::deserialize_any( + __deserializer, + __Visitor { + marker: _serde::__private228::PhantomData::, + lifetime: _serde::__private228::PhantomData, + }, + ) + } + __Field::__field1 => { + #[allow(non_camel_case_types)] + #[doc(hidden)] + enum __Field { + __field0, + __ignore, + } + #[doc(hidden)] + struct __FieldVisitor; + #[automatically_derived] + impl<'de> _serde::de::Visitor<'de> for __FieldVisitor { + type Value = __Field; + fn expecting( + &self, + __formatter: &mut _serde::__private228::Formatter, + ) -> _serde::__private228::fmt::Result { + _serde::__private228::Formatter::write_str( + __formatter, + "field identifier", + ) + } + fn visit_u64<__E>( + self, + __value: u64, + ) -> _serde::__private228::Result + where + __E: _serde::de::Error, + { + match __value { + 0u64 => _serde::__private228::Ok(__Field::__field0), + _ => _serde::__private228::Ok(__Field::__ignore), + } + } + fn visit_str<__E>( + self, + __value: &str, + ) -> _serde::__private228::Result + where + __E: _serde::de::Error, + { + match __value { + "app_id" => _serde::__private228::Ok(__Field::__field0), + _ => _serde::__private228::Ok(__Field::__ignore), + } + } + fn visit_bytes<__E>( + self, + __value: &[u8], + ) -> _serde::__private228::Result + where + __E: _serde::de::Error, + { + match __value { + b"app_id" => _serde::__private228::Ok(__Field::__field0), + _ => _serde::__private228::Ok(__Field::__ignore), + } + } + } + #[automatically_derived] + impl<'de> _serde::Deserialize<'de> for __Field { + #[inline] + fn deserialize<__D>( + __deserializer: __D, + ) -> _serde::__private228::Result + where + __D: _serde::Deserializer<'de>, + { + _serde::Deserializer::deserialize_identifier( + __deserializer, + __FieldVisitor, + ) + } + } + #[doc(hidden)] + struct __Visitor<'de> { + marker: _serde::__private228::PhantomData, + lifetime: _serde::__private228::PhantomData<&'de ()>, + } + #[automatically_derived] + impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> { + type Value = AppListing; + fn expecting( + &self, + __formatter: &mut _serde::__private228::Formatter, + ) -> _serde::__private228::fmt::Result { + _serde::__private228::Formatter::write_str( + __formatter, + "struct variant AppListing::Unknown", + ) + } + #[inline] + fn visit_map<__A>( + self, + mut __map: __A, + ) -> _serde::__private228::Result + where + __A: _serde::de::MapAccess<'de>, + { + let mut __field0: _serde::__private228::Option = _serde::__private228::None; + while let _serde::__private228::Some(__key) = _serde::de::MapAccess::next_key::< + __Field, + >(&mut __map)? { + match __key { + __Field::__field0 => { + if _serde::__private228::Option::is_some(&__field0) { + return _serde::__private228::Err( + <__A::Error as _serde::de::Error>::duplicate_field("app_id"), + ); + } + __field0 = _serde::__private228::Some( + _serde::de::MapAccess::next_value::(&mut __map)?, + ); + } + _ => { + let _ = _serde::de::MapAccess::next_value::< + _serde::de::IgnoredAny, + >(&mut __map)?; + } + } + } + let __field0 = match __field0 { + _serde::__private228::Some(__field0) => __field0, + _serde::__private228::None => { + _serde::__private228::de::missing_field("app_id")? + } + }; + _serde::__private228::Ok(AppListing::Unknown { + app_id: __field0, + }) + } + } + #[doc(hidden)] + const FIELDS: &'static [&'static str] = &["app_id"]; + _serde::Deserializer::deserialize_any( + __deserializer, + __Visitor { + marker: _serde::__private228::PhantomData::, + lifetime: _serde::__private228::PhantomData, + }, + ) + } + } + } + } + #[doc(hidden)] + struct __Visitor<'de> { + marker: _serde::__private228::PhantomData, + lifetime: _serde::__private228::PhantomData<&'de ()>, + } + #[automatically_derived] + impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> { + type Value = AppListing; + fn expecting( + &self, + __formatter: &mut _serde::__private228::Formatter, + ) -> _serde::__private228::fmt::Result { + _serde::__private228::Formatter::write_str( + __formatter, + "adjacently tagged enum AppListing", + ) + } + fn visit_map<__A>( + self, + mut __map: __A, + ) -> _serde::__private228::Result + where + __A: _serde::de::MapAccess<'de>, + { + match { + let mut __rk: _serde::__private228::Option< + _serde::__private228::de::TagOrContentField, + > = _serde::__private228::None; + while let _serde::__private228::Some(__k) = _serde::de::MapAccess::next_key_seed( + &mut __map, + _serde::__private228::de::TagContentOtherFieldVisitor { + tag: "event", + content: "data", + }, + )? { + match __k { + _serde::__private228::de::TagContentOtherField::Other => { + let _ = _serde::de::MapAccess::next_value::< + _serde::de::IgnoredAny, + >(&mut __map)?; + continue; + } + _serde::__private228::de::TagContentOtherField::Tag => { + __rk = _serde::__private228::Some( + _serde::__private228::de::TagOrContentField::Tag, + ); + break; + } + _serde::__private228::de::TagContentOtherField::Content => { + __rk = _serde::__private228::Some( + _serde::__private228::de::TagOrContentField::Content, + ); + break; + } + } + } + __rk + } { + _serde::__private228::Some( + _serde::__private228::de::TagOrContentField::Tag, + ) => { + let __field = _serde::de::MapAccess::next_value_seed( + &mut __map, + _serde::__private228::de::AdjacentlyTaggedEnumVariantSeed::< + __Field, + > { + enum_name: "AppListing", + variants: VARIANTS, + fields_enum: _serde::__private228::PhantomData, + }, + )?; + match { + let mut __rk: _serde::__private228::Option< + _serde::__private228::de::TagOrContentField, + > = _serde::__private228::None; + while let _serde::__private228::Some(__k) = _serde::de::MapAccess::next_key_seed( + &mut __map, + _serde::__private228::de::TagContentOtherFieldVisitor { + tag: "event", + content: "data", + }, + )? { + match __k { + _serde::__private228::de::TagContentOtherField::Other => { + let _ = _serde::de::MapAccess::next_value::< + _serde::de::IgnoredAny, + >(&mut __map)?; + continue; + } + _serde::__private228::de::TagContentOtherField::Tag => { + __rk = _serde::__private228::Some( + _serde::__private228::de::TagOrContentField::Tag, + ); + break; + } + _serde::__private228::de::TagContentOtherField::Content => { + __rk = _serde::__private228::Some( + _serde::__private228::de::TagOrContentField::Content, + ); + break; + } + } + } + __rk + } { + _serde::__private228::Some( + _serde::__private228::de::TagOrContentField::Tag, + ) => { + _serde::__private228::Err( + <__A::Error as _serde::de::Error>::duplicate_field("event"), + ) + } + _serde::__private228::Some( + _serde::__private228::de::TagOrContentField::Content, + ) => { + let __ret = _serde::de::MapAccess::next_value_seed( + &mut __map, + __Seed { + variant: __field, + marker: _serde::__private228::PhantomData, + lifetime: _serde::__private228::PhantomData, + }, + )?; + match { + let mut __rk: _serde::__private228::Option< + _serde::__private228::de::TagOrContentField, + > = _serde::__private228::None; + while let _serde::__private228::Some(__k) = _serde::de::MapAccess::next_key_seed( + &mut __map, + _serde::__private228::de::TagContentOtherFieldVisitor { + tag: "event", + content: "data", + }, + )? { + match __k { + _serde::__private228::de::TagContentOtherField::Other => { + let _ = _serde::de::MapAccess::next_value::< + _serde::de::IgnoredAny, + >(&mut __map)?; + continue; + } + _serde::__private228::de::TagContentOtherField::Tag => { + __rk = _serde::__private228::Some( + _serde::__private228::de::TagOrContentField::Tag, + ); + break; + } + _serde::__private228::de::TagContentOtherField::Content => { + __rk = _serde::__private228::Some( + _serde::__private228::de::TagOrContentField::Content, + ); + break; + } + } + } + __rk + } { + _serde::__private228::Some( + _serde::__private228::de::TagOrContentField::Tag, + ) => { + _serde::__private228::Err( + <__A::Error as _serde::de::Error>::duplicate_field("event"), + ) + } + _serde::__private228::Some( + _serde::__private228::de::TagOrContentField::Content, + ) => { + _serde::__private228::Err( + <__A::Error as _serde::de::Error>::duplicate_field("data"), + ) + } + _serde::__private228::None => { + _serde::__private228::Ok(__ret) + } + } + } + _serde::__private228::None => { + _serde::__private228::Err( + <__A::Error as _serde::de::Error>::missing_field("data"), + ) + } + } + } + _serde::__private228::Some( + _serde::__private228::de::TagOrContentField::Content, + ) => { + let __content = _serde::de::MapAccess::next_value_seed( + &mut __map, + _serde::__private228::de::ContentVisitor::new(), + )?; + match { + let mut __rk: _serde::__private228::Option< + _serde::__private228::de::TagOrContentField, + > = _serde::__private228::None; + while let _serde::__private228::Some(__k) = _serde::de::MapAccess::next_key_seed( + &mut __map, + _serde::__private228::de::TagContentOtherFieldVisitor { + tag: "event", + content: "data", + }, + )? { + match __k { + _serde::__private228::de::TagContentOtherField::Other => { + let _ = _serde::de::MapAccess::next_value::< + _serde::de::IgnoredAny, + >(&mut __map)?; + continue; + } + _serde::__private228::de::TagContentOtherField::Tag => { + __rk = _serde::__private228::Some( + _serde::__private228::de::TagOrContentField::Tag, + ); + break; + } + _serde::__private228::de::TagContentOtherField::Content => { + __rk = _serde::__private228::Some( + _serde::__private228::de::TagOrContentField::Content, + ); + break; + } + } + } + __rk + } { + _serde::__private228::Some( + _serde::__private228::de::TagOrContentField::Tag, + ) => { + let __seed = __Seed { + variant: _serde::de::MapAccess::next_value_seed( + &mut __map, + _serde::__private228::de::AdjacentlyTaggedEnumVariantSeed::< + __Field, + > { + enum_name: "AppListing", + variants: VARIANTS, + fields_enum: _serde::__private228::PhantomData, + }, + )?, + marker: _serde::__private228::PhantomData, + lifetime: _serde::__private228::PhantomData, + }; + let __deserializer = _serde::__private228::de::ContentDeserializer::< + __A::Error, + >::new(__content); + let __ret = _serde::de::DeserializeSeed::deserialize( + __seed, + __deserializer, + )?; + match { + let mut __rk: _serde::__private228::Option< + _serde::__private228::de::TagOrContentField, + > = _serde::__private228::None; + while let _serde::__private228::Some(__k) = _serde::de::MapAccess::next_key_seed( + &mut __map, + _serde::__private228::de::TagContentOtherFieldVisitor { + tag: "event", + content: "data", + }, + )? { + match __k { + _serde::__private228::de::TagContentOtherField::Other => { + let _ = _serde::de::MapAccess::next_value::< + _serde::de::IgnoredAny, + >(&mut __map)?; + continue; + } + _serde::__private228::de::TagContentOtherField::Tag => { + __rk = _serde::__private228::Some( + _serde::__private228::de::TagOrContentField::Tag, + ); + break; + } + _serde::__private228::de::TagContentOtherField::Content => { + __rk = _serde::__private228::Some( + _serde::__private228::de::TagOrContentField::Content, + ); + break; + } + } + } + __rk + } { + _serde::__private228::Some( + _serde::__private228::de::TagOrContentField::Tag, + ) => { + _serde::__private228::Err( + <__A::Error as _serde::de::Error>::duplicate_field("event"), + ) + } + _serde::__private228::Some( + _serde::__private228::de::TagOrContentField::Content, + ) => { + _serde::__private228::Err( + <__A::Error as _serde::de::Error>::duplicate_field("data"), + ) + } + _serde::__private228::None => { + _serde::__private228::Ok(__ret) + } + } + } + _serde::__private228::Some( + _serde::__private228::de::TagOrContentField::Content, + ) => { + _serde::__private228::Err( + <__A::Error as _serde::de::Error>::duplicate_field("data"), + ) + } + _serde::__private228::None => { + _serde::__private228::Err( + <__A::Error as _serde::de::Error>::missing_field("event"), + ) + } + } + } + _serde::__private228::None => { + _serde::__private228::Err( + <__A::Error as _serde::de::Error>::missing_field("event"), + ) + } + } + } + fn visit_seq<__A>( + self, + mut __seq: __A, + ) -> _serde::__private228::Result + where + __A: _serde::de::SeqAccess<'de>, + { + match _serde::de::SeqAccess::next_element(&mut __seq)? { + _serde::__private228::Some(__variant) => { + match _serde::de::SeqAccess::next_element_seed( + &mut __seq, + __Seed { + variant: __variant, + marker: _serde::__private228::PhantomData, + lifetime: _serde::__private228::PhantomData, + }, + )? { + _serde::__private228::Some(__ret) => { + _serde::__private228::Ok(__ret) + } + _serde::__private228::None => { + _serde::__private228::Err( + _serde::de::Error::invalid_length(1, &self), + ) + } + } + } + _serde::__private228::None => { + _serde::__private228::Err( + _serde::de::Error::invalid_length(0, &self), + ) + } + } + } + } + #[doc(hidden)] + const FIELDS: &'static [&'static str] = &["event", "data"]; + _serde::Deserializer::deserialize_struct( + __deserializer, + "AppListing", + FIELDS, + __Visitor { + marker: _serde::__private228::PhantomData::, + lifetime: _serde::__private228::PhantomData, + }, + ) + } + } + }; + pub async fn _inner_list_apps( + dir: &str, + create_if_needed: bool, + ) -> Option> { + if fs::read_dir(&dir).await.is_err() { + fs::create_dir_all(&dir).await.ok()?; + } + let mut tasks = ::alloc::vec::Vec::new(); + let mut dir = fs::read_dir(&dir).await.ok()?; + while let Some(entry) = dir.next_entry().await.ok()? { + tasks.push(async move { Result::<(), String>::Ok(()) }); + } + let val = join_all(tasks).await; + Some( + val + .into_iter() + .map(|x| match x { + Ok(()) => { + AppListing::Full { + app_id: "()".into(), + } + } + Err(app_id) => AppListing::Unknown { app_id }, + }) + .collect::>(), + ) + } + } + pub enum ConnectionType { + Disconnected, + Metered, + Unmetered, + } + pub fn downloads(handle: &AppHandle) -> Result { + let mut dir = handle.path().app_cache_dir()?; + dir.push("data"); + _ = fs::create_dir_all(&dir); + Ok(dir) + } + pub fn dwnl_tmp(handle: &AppHandle) -> Result { + let mut dir = handle.path().app_cache_dir()?; + dir.push("tmp"); + _ = fs::create_dir_all(&dir); + Ok(dir) + } + pub fn clear_dwnl(handle: &AppHandle) { + if let Some(dwn) = downloads(handle).ok() { + _ = fs::remove_dir_all(&dwn); + } + if let Some(tmp) = dwnl_tmp(handle).ok() { + _ = fs::remove_dir_all(&tmp); + } + } + } + pub mod downloader { + use std::{ + io::SeekFrom, sync::{Arc, LazyLock}, + time::Duration, + }; + use reqwest::{Client, ClientBuilder, StatusCode}; + use tauri::async_runtime::{self, JoinHandle}; + use tokio::{ + fs::{create_dir_all, remove_dir_all, remove_file, File, OpenOptions}, + io::{AsyncReadExt, AsyncSeekExt, AsyncWriteExt}, + sync::mpsc::{channel, error::TryRecvError, Sender}, + time::sleep, + }; + static CLIENT: LazyLock = LazyLock::new(|| { + ClientBuilder::new() + .user_agent( + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36", + ) + .build() + .unwrap() + }); + pub async fn download (), T: FnOnce(u64) -> ()>( + url: &str, + out_file: &str, + out_dir: &str, + temp_dir: &str, + turbo: bool, + mut len_fn: T, + mut log: F, + ) -> Option<()> { + let _ = remove_dir_all(out_dir).await; + create_dir_all(out_dir).await.ok()?; + let _ = remove_dir_all(temp_dir).await; + create_dir_all(temp_dir).await.ok()?; + let ranged = turbo && supports_ranged(url).await; + log(0.0); + let size = get_size(url).await; + if ranged && size.is_some() { + dwn_ranged( + size, + url, + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{0}/{1}", out_dir, out_file), + ) + }), + temp_dir, + len_fn, + log, + ) + .await?; + } else { + let mut file = File::create( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{0}/{1}", out_dir, out_file), + ) + }), + ) + .await + .ok()?; + let mut resp = CLIENT.get(url).send().await.ok()?; + let len = resp.content_length().unwrap_or(1); + len_fn(len); + let mut curr = 0u64; + let mut least = 0.0; + while let Some(x) = resp.chunk().await.ok()? { + curr += x.len() as u64; + file.write_all(&x).await.ok()?; + let perc = (curr as f64 * 100.0) / (len as f64); + if perc > (least + 0.5) || perc == 100.0 { + log(perc); + least = perc; + } + } + file.flush().await.ok()?; + drop(file); + } + Some(()) + } + async fn dwn_ranged (), T: FnOnce(u64) -> ()>( + size: Option, + url: &str, + out: String, + temp: &str, + mut len: T, + mut log: F, + ) -> Option<()> { + let mut file = File::create(&out).await.ok()?; + let url = Arc::new(url.to_string()); + let temp = Arc::new(temp.to_string()); + let size = size?; + let mut done = 0u64; + len(size); + let (tx, mut rx) = channel::(20); + let mut pool = ::alloc::vec::Vec::new(); + for (start, end) in divide_into_ranges(size) { + let tx = tx.clone(); + let url = url.clone(); + let temp = temp.clone(); + pool.push( + async_runtime::spawn(async move { + download_range(&url, tx, start, end, &temp).await + }), + ); + sleep(Duration::from_micros(50)).await; + } + let mut last_prog: f64 = 0.0; + log(0.0); + loop { + while let Ok(x) = rx.try_recv() { + done += x; + } + match rx.try_recv() { + Err(e) => { + match e { + TryRecvError::Empty => {} + TryRecvError::Disconnected => { + break; + } + } + } + Ok(x) => { + done += x; + } + } + let prog = (done as f64 * 100.0) / size as f64; + if prog != (last_prog + 0.5) || prog == 100.0 { + last_prog = prog; + log(prog); + } + if pool + .iter() + .all(|x| match x { + JoinHandle::Tokio(x) => x.is_finished(), + }) + { + break; + } + sleep(Duration::from_millis(100)).await; + } + log(100.0); + for data in pool { + let (path, mut data) = data.await.ok()??; + data.seek(SeekFrom::Start(0)).await.ok()?; + let mut buf = [0; 4096]; + loop { + let size = data.read(&mut buf).await.ok()?; + if size == 0 { + break; + } + file.write(&buf[0..size]).await.ok()?; + } + drop(data); + remove_file(path).await.ok()?; + } + drop(file); + Some(()) + } + async fn download_range( + url: &str, + tx: Sender, + start: u64, + end: u64, + temp: &str, + ) -> Option<(String, File)> { + let mut resp = CLIENT + .get(url) + .header( + "Range", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("bytes={0}-{1}", start, end), + ) + }), + ) + .send() + .await + .ok()?; + let file = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{0}/{1}_to_{2}", temp, start, end), + ) + }); + let mut buf = OpenOptions::new(); + buf.create_new(true).read(true).write(true).truncate(true); + buf.share_mode(0); + let mut buf = buf.open(&file).await.ok()?; + while let Some(chunk) = resp.chunk().await.ok()? { + let _ = tx.send(chunk.len() as u64).await; + buf.write_all(&chunk).await.ok()?; + } + Some((file, buf)) + } + fn divide_into_ranges(total_size: u64) -> Vec<(u64, u64)> { + let mut total = total_size / 1024 * 1024; + if total > 100 { + total = 100; + } + let chunk_size = total_size / total; + let mut ranges = Vec::new(); + for i in 0..total { + let start = i * chunk_size; + let end = if i == (total - 1) { + total_size - 1 + } else { + start + chunk_size - 1 + }; + ranges.push((start, end)); + } + ranges + } + pub async fn get_size(url: &str) -> Option { + let resp = CLIENT.head(url).send().await.ok()?; + let headers = resp.headers(); + headers + .get("content-length") + .map_or(headers.get("Content-Length"), |x| Some(x)) + .map_or(None, |x| x.to_str().ok()?.parse().ok()) + } + async fn supports_ranged(url: &str) -> bool { + let res = CLIENT.get(url).header("Range", "bytes=0-0").send().await; + if let Ok(res) = res { + return res.status() == StatusCode::PARTIAL_CONTENT; + } + false + } + } + pub mod windows { + use tauri::AppHandle; + use ahqstore_types::{AHQStoreApplication, DownloadUrl}; + pub mod notify { + use std::{sync::LazyLock, thread::sleep, time::Duration}; + use win32_notif::{ + ManageNotification, NotificationActivatedEventHandler, + NotificationBuilder, NotificationDataSet, ToastsNotifier, + notification::{ + AdaptiveText, Scenario, + actions::{ActionButton, action::ActivationType}, + audio::{Audio, Src}, + group::{Group, SubGroup}, + visual::{ + image::{AdaptiveImageAlign, ImageCrop}, + progress::ProgressValue, text::HintStyle, *, + }, + }, + }; + pub static NOTIF: LazyLock = LazyLock::new(|| { + ToastsNotifier::new("Microsoft.Windows.Explorer") + .expect("Unexpected error while trying to create notifier") + }); + pub(crate) fn send_update(total: u16) { + let updated = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{0} apps will be updated", total), + ) + }); + let notif = NotificationBuilder::new() + .with_scenario(Scenario::Reminder) + .audio(Audio::new(Src::Reminder, false, false)) + .visual( + Text::create(0, "Updates Available") + .with_style(HintStyle::Title), + ) + .visual( + Text::create( + 0, + "Application updates are available, would you like to update?", + ) + .with_style(HintStyle::Subtitle), + ) + .visual( + Group::new() + .with_subgroup( + SubGroup::new() + .with_visual( + Text::create(0, &updated).with_style(HintStyle::Base), + ) + .with_visual( + Text::create(0, "Only unattended updates will be processed") + .with_style(HintStyle::CaptionSubtle), + ), + ), + ) + .action(ActionButton::create("Yes").with_id("update")) + .action(ActionButton::create("No").with_id("no")) + .on_activated( + NotificationActivatedEventHandler::new(|_a, b| { + let notif = b.unwrap(); + if ¬if.button_id.unwrap_or_default() == "update" { + { + ::core::panicking::panic_fmt(format_args!("Called update")); + }; + } + Ok(()) + }), + ) + .with_use_button_style(true) + .build(0, &NOTIF, "2", "1") + .unwrap(); + _ = notif.set_expires_on_reboot(true); + notif.show().unwrap(); + } + pub(crate) fn app_id_updating(src: &str, app_id: &str, status: &str) { + let notif = NotificationBuilder::new() + .with_scenario(Scenario::Default) + .audio(Audio::new(Src::IM, false, false)) + .visual( + Text::create_binded(0, "title").with_style(HintStyle::Title), + ) + .visual( + Text::create_binded(0, "body").with_style(HintStyle::Body), + ) + .visual( + Image::create(1, src) + .with_align(AdaptiveImageAlign::Default) + .with_crop(ImageCrop::Circle) + .with_placement(Placement::AppLogoOverride), + ) + .visual( + Progress::create( + AdaptiveText::BindTo("txt"), + ProgressValue::BindTo("prog"), + ) + .with_override_value(AdaptiveText::BindTo("txxt")), + ) + .value("title", status) + .value("body", "Please wait while we update it for you") + .value("txt", "Downloading") + .value("prog", "indeterminate") + .value("txxt", "Starting up...") + .with_use_button_style(true) + .build(0, &NOTIF, app_id, "update") + .unwrap(); + _ = notif.set_expires_on_reboot(true); + notif.show().unwrap(); + } + pub(crate) fn updates_pending(apps: u16) { + let pending = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{0} apps have updates pending", apps), + ) + }); + let notif = NotificationBuilder::new() + .with_scenario(Scenario::Reminder) + .audio(Audio::new(Src::Reminder, false, false)) + .visual( + Text::create(0, "Updates Pending") + .with_style(HintStyle::Title), + ) + .visual( + Text::create( + 0, + "A few updates are pending that require your attention.", + ) + .with_style(HintStyle::Subtitle), + ) + .visual( + Group::new() + .with_subgroup( + SubGroup::new() + .with_visual( + Text::create(0, "{x}").with_style(HintStyle::Base), + ) + .with_visual( + Text::create(0, "These require your action to update") + .with_style(HintStyle::CaptionSubtle), + ), + ), + ) + .value("x", &pending) + .action( + ActionButton::create("Launch store") + .with_activation_type(ActivationType::Protocol) + .with_id("launch"), + ) + .on_activated( + NotificationActivatedEventHandler::new(|_a, b| { + let notif = b.unwrap(); + { + ::std::io::_print(format_args!("{0:#?}\n", notif)); + }; + Ok(()) + }), + ) + .with_use_button_style(true) + .build(0, &NOTIF, "2", "1") + .unwrap(); + _ = notif.set_expires_on_reboot(true); + notif.show().unwrap(); + } + } + pub mod install { + use std::sync::LazyLock; + use std::env; + use tauri::fs; + pub(crate) static AHQSTORE_GLOBAL_DIR: LazyLock = LazyLock::new(|| + { + let root = env::var("SYSTEMDRIVE").expect("Impossible error"); + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "{0}\\ProgramData\\AHQ Store Applications", + root, + ), + ) + }) + }); + pub(crate) static AHQSTORE_USER_DIR: LazyLock = LazyLock::new(|| { + let useroot = env::var("USERPROFILE").expect("Impossible error"); + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("{0}\\ahqstore", useroot)) + }) + }); + } + pub mod network { + use windows::Networking::Connectivity::{ + NetworkConnectivityLevel, NetworkCostType, NetworkInformation, + }; + use crate::structs::platform::common::ConnectionType; + pub fn get_network() -> Option { + let info = NetworkInformation::GetInternetConnectionProfile().ok()?; + let cost = info.GetConnectionCost().ok()?.NetworkCostType().ok()?; + let netlevel = info.GetNetworkConnectivityLevel().ok()?.0; + let conn = NetworkConnectivityLevel::InternetAccess.0 == netlevel; + if !conn { + return Some(ConnectionType::Disconnected); + } + let unmetered = cost.0 == NetworkCostType::Unrestricted.0; + if unmetered { + Some(ConnectionType::Unmetered) + } else { + Some(ConnectionType::Metered) + } + } + } + pub fn is_supported( + _: &AppHandle, + app: &AHQStoreApplication, + ) -> crate::Result { + Ok(app.is_supported()) + } + pub fn get_download( + app: &AHQStoreApplication, + ) -> (Option<&DownloadUrl>, Option<&'static str>) { + (app.get_win_download(), app.get_win_extension()) + } + } + pub use windows as os; + use crate::{ + structs::platform::common::{clear_dwnl, downloads, dwnl_tmp}, + AhqstoreExt, DownloadEvent, Error, InstallStat, Result, + }; + #[allow( + unreachable_code, + clippy::diverging_sub_expression, + clippy::used_underscore_binding + )] + const _: () = if false { + #[diagnostic::on_unimplemented( + message = "async commands that contain references as inputs must return a `Result`" + )] + trait AsyncCommandMustReturnResult {} + impl AsyncCommandMustReturnResult for ::std::result::Result {} + let _check: Result> = ::core::panicking::panic( + "internal error: entered unreachable code", + ); + let _: &dyn AsyncCommandMustReturnResult = &_check; + }; + pub async fn download( + handle: AppHandle, + app_id: &str, + prog: Channel, + ) -> Result> { + let commit = &handle.ahqstore().commits.read().await.commit; + let app = internet::get_app(commit, app_id).await?; + let hwnd = handle.clone(); + let stat = tokio::spawn(async move { + if !os::is_supported(&hwnd, &app)? { + return Err(Error::UnsupportedPlatform); + } + let (Some(url), Some(extension)) = os::get_download(&app) else { + return Err(Error::AHQStore(AnyError::msg("Could not get data"))); + }; + let turbo = false; + let dwnl = downloads(&hwnd)?; + let dir_tmp = dwnl_tmp(&hwnd)?; + downloader::download( + &url.url, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{0}{1}", &app.appId, extension), + ) + }), + { dwnl.to_str().context("Invalid String")? }, + { dir_tmp.to_str().context("Invalid String")? }, + turbo, + |length| { + prog.send(DownloadEvent::Started { length }); + }, + |progress| { + prog.send(DownloadEvent::Progress { + progress, + }); + }, + ) + .await + .context("Unable to download")?; + prog.send(DownloadEvent::Finished {}); + Ok(()) + }); + let app_id = app_id.to_string(); + let handle = handle.clone(); + let handler = Channel::new(move |body| { + if !stat.is_finished() { + stat.abort(); + { + clear_dwnl(&handle); + } + Ok(()) + } else { + Err( + tauri::Error::Anyhow( + AnyError::msg("The download task is already complete"), + ), + ) + } + }); + Ok(handler) + } + #[allow(unused_imports)] + pub use __cmd__download; + } + pub(crate) mod search { + use std::{ + num::NonZero, sync::Arc, thread::available_parallelism, time::Duration, + }; + use ahqstore_types::{Commits, SearchEntry}; + use tantivy::{ + collector::TopDocs, + query::{BooleanQuery, BoostQuery, FuzzyTermQuery, Query, QueryParser}, + schema::{Field, Schema, Value, FAST, STRING, TEXT}, + Index, IndexReader, ReloadPolicy, TantivyDocument, Term, + }; + use tauri::{async_runtime::spawn_blocking, AppHandle, Manager, Runtime}; + use tokio::{fs, sync::RwLock, time::sleep}; + use ahqstore_types::internet::get_all_search; + pub struct CommitSearchIndex { + pub commit: Commits, + pub last_updated_secs: u64, + pub meta: Option, + } + pub struct SearchMeta { + pub reader: IndexReader, + pub name_txt: Field, + pub title_txt: Field, + pub id: Field, + } + impl CommitSearchIndex { + pub fn search(&self, query: &str) -> Result, ()> { + let Some(meta) = &self.meta else { + return Err(()); + }; + let searcher = meta.reader.searcher(); + let name_query = BoostQuery::new( + Box::new( + BooleanQuery::intersection( + query + .split_whitespace() + .into_iter() + .map(|x| { + let x = Term::from_field_text(meta.name_txt, x); + Box::new(FuzzyTermQuery::new(x, 1, true)) + as Box + }) + .collect::>>() as _, + ), + ), + 1.5, + ); + let title_query = BooleanQuery::intersection( + query + .split_whitespace() + .into_iter() + .map(|x| { + let x = Term::from_field_text(meta.title_txt, x); + Box::new(FuzzyTermQuery::new(x, 1, true)) + as Box + }) + .collect::>>(), + ); + let query = BooleanQuery::union( + <[_]>::into_vec( + ::alloc::boxed::box_new([ + Box::new(name_query), + Box::new(title_query), + ]), + ), + ); + let Ok(mut search) = searcher.search(&query, &TopDocs::with_limit(500)) + else { + { + ::std::io::_print(format_args!("ERRORED OUT SEARCH\n")); + }; + return Err(()); + }; + let results: Vec = search + .into_iter() + .map(|(_, b)| { + searcher + .segment_reader(b.segment_ord) + .fast_fields() + .str("id") + .ok() + .flatten() + .and_then(|x| { + let mut out = [None; 1]; + x.ords().first_vals(&[b.doc_id], &mut out); + let out = out[0]?; + let mut data = String::default(); + x.ord_to_str(out, &mut data).ok()?; + Some(data) + }) + }) + .flatten() + .collect(); + Ok(results) + } + } + pub async fn search_daemon( + hwnd: AppHandle, + lck: Arc>, + ) { + let mut initial = lck.read().await.commit.clone(); + let mut builder = Schema::builder(); + let name_txt = builder.add_text_field("name", TEXT); + let title_txt = builder.add_text_field("title", TEXT); + let id = builder.add_text_field("id", STRING | FAST); + let schema = builder.build(); + let index = { + let mut cache = hwnd + .path() + .app_cache_dir() + .expect("Cannot fetch cache dir, exiting"); + cache.push("searchdb"); + _ = fs::create_dir_all(&cache).await; + { + cache.push("commit.lck"); + let data = fs::read_to_string(&cache).await.unwrap_or_default(); + if &data + != &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("{0:?}", initial)) + }) + { + initial.ahqstore = Default::default(); + initial.alt = Default::default(); + } + cache.pop(); + } + cache.push("index"); + if cache.exists() && &initial.ahqstore != "" { + Index::open_in_dir(&cache).expect("Unable to create db, exiting") + } else { + _ = fs::remove_dir_all(&cache).await; + _ = fs::create_dir_all(&cache).await; + Index::create_in_dir(&cache, schema) + .expect("Unable to create db, exiting") + } + }; + let index = Arc::new(index); + { + let mut data = lck.write().await; + data.meta = Some(SearchMeta { + id, + name_txt, + reader: index + .reader_builder() + .reload_policy(ReloadPolicy::OnCommitWithDelay) + .num_warming_threads( + available_parallelism() + .unwrap_or(unsafe { NonZero::new_unchecked(4usize) }) + .get() + .clamp(2, 4), + ) + .try_into() + .expect("Unable to construct reader"), + title_txt, + }); + drop(data); + } + loop { + let mut to_update; + { + let commit_lck = lck.read().await; + let commit = &commit_lck.commit; + if &initial == commit { + sleep(Duration::from_secs(30)).await; + continue; + } + to_update = commit.clone(); + drop(commit_lck); + } + if let Ok(searches) = get_all_search(&to_update).await { + { + ::std::io::_print(format_args!("[INFO] Parsing search map\n")); + }; + let idx_c = index.clone(); + if let Ok(Ok(_)) = spawn_blocking(move || build_search( + idx_c.as_ref(), + name_txt, + title_txt, + id, + searches, + )) + .await + { + let mut wrlck = lck.write().await; + if &wrlck.commit == &to_update { + initial = to_update; + let mut cache = hwnd + .path() + .app_cache_dir() + .expect("Cannot fetch cache dir, exiting"); + cache.push("searchdb"); + cache.push("commit.lck"); + _ = fs::write( + cache, + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("{0:?}", initial)) + }), + ) + .await; + } + } + } + sleep(Duration::from_secs(30)).await; + } + } + fn build_search( + index: &Index, + name_txt: Field, + title_txt: Field, + id: Field, + data: Vec, + ) -> tantivy::Result<()> { + let mut index_writer = index + .writer( + data + .len() + .saturating_mul(128) + .clamp(15 * 1024 * 1024, 100 * 1024 * 1024), + )?; + index_writer.delete_all_documents()?; + for item in data { + index_writer + .add_document({ + let mut document = ::tantivy::TantivyDocument::default(); + document.add_field_value(name_txt, &item.name); + document.add_field_value(title_txt, &item.title); + document.add_field_value(id, &item.id); + document + })?; + } + index_writer.commit()?; + index_writer.wait_merging_threads()?; + Ok(()) + } + } + use search::CommitSearchIndex; + fn now() -> u64 { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .expect("Time is going in reverse") + .as_secs() + } + pub fn init( + app: &AppHandle, + _api: PluginApi, + ) -> crate::Result> { + let commits = Arc::new( + RwLock::new( + async_runtime::block_on(async { + Ok::< + CommitSearchIndex, + anyhow::Error, + >(CommitSearchIndex { + commit: get_all_commits(None).await?, + last_updated_secs: now(), + meta: None, + }) + })?, + ), + ); + let prefs = Preferences::init(app)?; + Ok(Ahqstore { + handle: app.clone(), + commits, + send_to_ipc: Mutex::new(None), + preferences: Arc::new(RwLock::new(prefs)), + }) + } + pub enum AutoUpdate { + Never, + CheckOnly, + UpdateDuringUnmeteredWifi, + UpdateDuringMeteredWifi, + Always, + } + #[automatically_derived] + impl ::core::fmt::Debug for AutoUpdate { + #[inline] + fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + ::core::fmt::Formatter::write_str( + f, + match self { + AutoUpdate::Never => "Never", + AutoUpdate::CheckOnly => "CheckOnly", + AutoUpdate::UpdateDuringUnmeteredWifi => "UpdateDuringUnmeteredWifi", + AutoUpdate::UpdateDuringMeteredWifi => "UpdateDuringMeteredWifi", + AutoUpdate::Always => "Always", + }, + ) + } + } + #[doc(hidden)] + #[allow( + non_upper_case_globals, + unused_attributes, + unused_qualifications, + clippy::absolute_paths, + )] + const _: () = { + #[allow(unused_extern_crates, clippy::useless_attribute)] + extern crate serde as _serde; + #[automatically_derived] + impl _serde::Serialize for AutoUpdate { + fn serialize<__S>( + &self, + __serializer: __S, + ) -> _serde::__private228::Result<__S::Ok, __S::Error> + where + __S: _serde::Serializer, + { + match *self { + AutoUpdate::Never => { + _serde::Serializer::serialize_unit_variant( + __serializer, + "AutoUpdate", + 0u32, + "Never", + ) + } + AutoUpdate::CheckOnly => { + _serde::Serializer::serialize_unit_variant( + __serializer, + "AutoUpdate", + 1u32, + "CheckOnly", + ) + } + AutoUpdate::UpdateDuringUnmeteredWifi => { + _serde::Serializer::serialize_unit_variant( + __serializer, + "AutoUpdate", + 2u32, + "UpdateDuringUnmeteredWifi", + ) + } + AutoUpdate::UpdateDuringMeteredWifi => { + _serde::Serializer::serialize_unit_variant( + __serializer, + "AutoUpdate", + 3u32, + "UpdateDuringMeteredWifi", + ) + } + AutoUpdate::Always => { + _serde::Serializer::serialize_unit_variant( + __serializer, + "AutoUpdate", + 4u32, + "Always", + ) + } + } + } + } + }; + #[doc(hidden)] + #[allow( + non_upper_case_globals, + unused_attributes, + unused_qualifications, + clippy::absolute_paths, + )] + const _: () = { + #[allow(unused_extern_crates, clippy::useless_attribute)] + extern crate serde as _serde; + #[automatically_derived] + impl<'de> _serde::Deserialize<'de> for AutoUpdate { + fn deserialize<__D>( + __deserializer: __D, + ) -> _serde::__private228::Result + where + __D: _serde::Deserializer<'de>, + { + #[allow(non_camel_case_types)] + #[doc(hidden)] + enum __Field { + __field0, + __field1, + __field2, + __field3, + __field4, + } + #[doc(hidden)] + struct __FieldVisitor; + #[automatically_derived] + impl<'de> _serde::de::Visitor<'de> for __FieldVisitor { + type Value = __Field; + fn expecting( + &self, + __formatter: &mut _serde::__private228::Formatter, + ) -> _serde::__private228::fmt::Result { + _serde::__private228::Formatter::write_str( + __formatter, + "variant identifier", + ) + } + fn visit_u64<__E>( + self, + __value: u64, + ) -> _serde::__private228::Result + where + __E: _serde::de::Error, + { + match __value { + 0u64 => _serde::__private228::Ok(__Field::__field0), + 1u64 => _serde::__private228::Ok(__Field::__field1), + 2u64 => _serde::__private228::Ok(__Field::__field2), + 3u64 => _serde::__private228::Ok(__Field::__field3), + 4u64 => _serde::__private228::Ok(__Field::__field4), + _ => { + _serde::__private228::Err( + _serde::de::Error::invalid_value( + _serde::de::Unexpected::Unsigned(__value), + &"variant index 0 <= i < 5", + ), + ) + } + } + } + fn visit_str<__E>( + self, + __value: &str, + ) -> _serde::__private228::Result + where + __E: _serde::de::Error, + { + match __value { + "Never" => _serde::__private228::Ok(__Field::__field0), + "CheckOnly" => _serde::__private228::Ok(__Field::__field1), + "UpdateDuringUnmeteredWifi" => { + _serde::__private228::Ok(__Field::__field2) + } + "UpdateDuringMeteredWifi" => { + _serde::__private228::Ok(__Field::__field3) + } + "Always" => _serde::__private228::Ok(__Field::__field4), + _ => { + _serde::__private228::Err( + _serde::de::Error::unknown_variant(__value, VARIANTS), + ) + } + } + } + fn visit_bytes<__E>( + self, + __value: &[u8], + ) -> _serde::__private228::Result + where + __E: _serde::de::Error, + { + match __value { + b"Never" => _serde::__private228::Ok(__Field::__field0), + b"CheckOnly" => _serde::__private228::Ok(__Field::__field1), + b"UpdateDuringUnmeteredWifi" => { + _serde::__private228::Ok(__Field::__field2) + } + b"UpdateDuringMeteredWifi" => { + _serde::__private228::Ok(__Field::__field3) + } + b"Always" => _serde::__private228::Ok(__Field::__field4), + _ => { + let __value = &_serde::__private228::from_utf8_lossy( + __value, + ); + _serde::__private228::Err( + _serde::de::Error::unknown_variant(__value, VARIANTS), + ) + } + } + } + } + #[automatically_derived] + impl<'de> _serde::Deserialize<'de> for __Field { + #[inline] + fn deserialize<__D>( + __deserializer: __D, + ) -> _serde::__private228::Result + where + __D: _serde::Deserializer<'de>, + { + _serde::Deserializer::deserialize_identifier( + __deserializer, + __FieldVisitor, + ) + } + } + #[doc(hidden)] + struct __Visitor<'de> { + marker: _serde::__private228::PhantomData, + lifetime: _serde::__private228::PhantomData<&'de ()>, + } + #[automatically_derived] + impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> { + type Value = AutoUpdate; + fn expecting( + &self, + __formatter: &mut _serde::__private228::Formatter, + ) -> _serde::__private228::fmt::Result { + _serde::__private228::Formatter::write_str( + __formatter, + "enum AutoUpdate", + ) + } + fn visit_enum<__A>( + self, + __data: __A, + ) -> _serde::__private228::Result + where + __A: _serde::de::EnumAccess<'de>, + { + match _serde::de::EnumAccess::variant(__data)? { + (__Field::__field0, __variant) => { + _serde::de::VariantAccess::unit_variant(__variant)?; + _serde::__private228::Ok(AutoUpdate::Never) + } + (__Field::__field1, __variant) => { + _serde::de::VariantAccess::unit_variant(__variant)?; + _serde::__private228::Ok(AutoUpdate::CheckOnly) + } + (__Field::__field2, __variant) => { + _serde::de::VariantAccess::unit_variant(__variant)?; + _serde::__private228::Ok( + AutoUpdate::UpdateDuringUnmeteredWifi, + ) + } + (__Field::__field3, __variant) => { + _serde::de::VariantAccess::unit_variant(__variant)?; + _serde::__private228::Ok( + AutoUpdate::UpdateDuringMeteredWifi, + ) + } + (__Field::__field4, __variant) => { + _serde::de::VariantAccess::unit_variant(__variant)?; + _serde::__private228::Ok(AutoUpdate::Always) + } + } + } + } + #[doc(hidden)] + const VARIANTS: &'static [&'static str] = &[ + "Never", + "CheckOnly", + "UpdateDuringUnmeteredWifi", + "UpdateDuringMeteredWifi", + "Always", + ]; + _serde::Deserializer::deserialize_enum( + __deserializer, + "AutoUpdate", + VARIANTS, + __Visitor { + marker: _serde::__private228::PhantomData::, + lifetime: _serde::__private228::PhantomData, + }, + ) + } + } + }; + pub struct Preferences { + #[serde(rename = "autoUpdate")] + pub auto_update: AutoUpdate, + } + #[automatically_derived] + impl ::core::fmt::Debug for Preferences { + #[inline] + fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + ::core::fmt::Formatter::debug_struct_field1_finish( + f, + "Preferences", + "auto_update", + &&self.auto_update, + ) + } + } + #[doc(hidden)] + #[allow( + non_upper_case_globals, + unused_attributes, + unused_qualifications, + clippy::absolute_paths, + )] + const _: () = { + #[allow(unused_extern_crates, clippy::useless_attribute)] + extern crate serde as _serde; + #[automatically_derived] + impl _serde::Serialize for Preferences { + fn serialize<__S>( + &self, + __serializer: __S, + ) -> _serde::__private228::Result<__S::Ok, __S::Error> + where + __S: _serde::Serializer, + { + let mut __serde_state = _serde::Serializer::serialize_struct( + __serializer, + "Preferences", + false as usize + 1, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __serde_state, + "autoUpdate", + &self.auto_update, + )?; + _serde::ser::SerializeStruct::end(__serde_state) + } + } + }; + #[doc(hidden)] + #[allow( + non_upper_case_globals, + unused_attributes, + unused_qualifications, + clippy::absolute_paths, + )] + const _: () = { + #[allow(unused_extern_crates, clippy::useless_attribute)] + extern crate serde as _serde; + #[automatically_derived] + impl<'de> _serde::Deserialize<'de> for Preferences { + fn deserialize<__D>( + __deserializer: __D, + ) -> _serde::__private228::Result + where + __D: _serde::Deserializer<'de>, + { + #[allow(non_camel_case_types)] + #[doc(hidden)] + enum __Field { + __field0, + __ignore, + } + #[doc(hidden)] + struct __FieldVisitor; + #[automatically_derived] + impl<'de> _serde::de::Visitor<'de> for __FieldVisitor { + type Value = __Field; + fn expecting( + &self, + __formatter: &mut _serde::__private228::Formatter, + ) -> _serde::__private228::fmt::Result { + _serde::__private228::Formatter::write_str( + __formatter, + "field identifier", + ) + } + fn visit_u64<__E>( + self, + __value: u64, + ) -> _serde::__private228::Result + where + __E: _serde::de::Error, + { + match __value { + 0u64 => _serde::__private228::Ok(__Field::__field0), + _ => _serde::__private228::Ok(__Field::__ignore), + } + } + fn visit_str<__E>( + self, + __value: &str, + ) -> _serde::__private228::Result + where + __E: _serde::de::Error, + { + match __value { + "autoUpdate" => _serde::__private228::Ok(__Field::__field0), + _ => _serde::__private228::Ok(__Field::__ignore), + } + } + fn visit_bytes<__E>( + self, + __value: &[u8], + ) -> _serde::__private228::Result + where + __E: _serde::de::Error, + { + match __value { + b"autoUpdate" => _serde::__private228::Ok(__Field::__field0), + _ => _serde::__private228::Ok(__Field::__ignore), + } + } + } + #[automatically_derived] + impl<'de> _serde::Deserialize<'de> for __Field { + #[inline] + fn deserialize<__D>( + __deserializer: __D, + ) -> _serde::__private228::Result + where + __D: _serde::Deserializer<'de>, + { + _serde::Deserializer::deserialize_identifier( + __deserializer, + __FieldVisitor, + ) + } + } + #[doc(hidden)] + struct __Visitor<'de> { + marker: _serde::__private228::PhantomData, + lifetime: _serde::__private228::PhantomData<&'de ()>, + } + #[automatically_derived] + impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> { + type Value = Preferences; + fn expecting( + &self, + __formatter: &mut _serde::__private228::Formatter, + ) -> _serde::__private228::fmt::Result { + _serde::__private228::Formatter::write_str( + __formatter, + "struct Preferences", + ) + } + #[inline] + fn visit_seq<__A>( + self, + mut __seq: __A, + ) -> _serde::__private228::Result + where + __A: _serde::de::SeqAccess<'de>, + { + let __field0 = match _serde::de::SeqAccess::next_element::< + AutoUpdate, + >(&mut __seq)? { + _serde::__private228::Some(__value) => __value, + _serde::__private228::None => { + return _serde::__private228::Err( + _serde::de::Error::invalid_length( + 0usize, + &"struct Preferences with 1 element", + ), + ); + } + }; + _serde::__private228::Ok(Preferences { + auto_update: __field0, + }) + } + #[inline] + fn visit_map<__A>( + self, + mut __map: __A, + ) -> _serde::__private228::Result + where + __A: _serde::de::MapAccess<'de>, + { + let mut __field0: _serde::__private228::Option = _serde::__private228::None; + while let _serde::__private228::Some(__key) = _serde::de::MapAccess::next_key::< + __Field, + >(&mut __map)? { + match __key { + __Field::__field0 => { + if _serde::__private228::Option::is_some(&__field0) { + return _serde::__private228::Err( + <__A::Error as _serde::de::Error>::duplicate_field( + "autoUpdate", + ), + ); + } + __field0 = _serde::__private228::Some( + _serde::de::MapAccess::next_value::(&mut __map)?, + ); + } + _ => { + let _ = _serde::de::MapAccess::next_value::< + _serde::de::IgnoredAny, + >(&mut __map)?; + } + } + } + let __field0 = match __field0 { + _serde::__private228::Some(__field0) => __field0, + _serde::__private228::None => { + _serde::__private228::de::missing_field("autoUpdate")? + } + }; + _serde::__private228::Ok(Preferences { + auto_update: __field0, + }) + } + } + #[doc(hidden)] + const FIELDS: &'static [&'static str] = &["autoUpdate"]; + _serde::Deserializer::deserialize_struct( + __deserializer, + "Preferences", + FIELDS, + __Visitor { + marker: _serde::__private228::PhantomData::, + lifetime: _serde::__private228::PhantomData, + }, + ) + } + } + }; + impl Preferences { + pub fn init(h: &AppHandle) -> crate::Result { + use std::fs::read_to_string; + use tauri::Manager; + let mut set_path = h.path().app_local_data_dir()?; + set_path.push("config.json"); + return Ok( + serde_json::from_str(&read_to_string(&set_path).unwrap_or_default()) + .unwrap_or(Self { + auto_update: AutoUpdate::CheckOnly, + }), + ); + } + } + /// Access to the ahqstore APIs. + pub struct Ahqstore { + pub(crate) handle: AppHandle, + pub preferences: Arc>, + pub commits: Arc>, + pub send_to_ipc: Mutex>, + } + impl Ahqstore { + pub fn init(&self, hwnd: AppHandle) { + let mut lock = self.send_to_ipc.blocking_lock(); + let hwnd2 = hwnd.clone(); + if lock.is_none() { + *lock = Some(initialize(hwnd, self.commits.clone())); + } + let lck = self.commits.clone(); + spawn(async move { + search_daemon(hwnd2, lck).await; + }); + } + pub async fn can_update_commit(&self) -> bool { + let exp = self.commits.read().await.last_updated_secs; + (exp + 60) < now() + } + pub async fn refresh(&self) -> crate::Result<()> { + if !self.can_update_commit().await { + use crate::Error; + return Err(Error::CannotUpdate); + } + let mut lock = self.commits.write().await; + *lock = CommitSearchIndex { + commit: get_all_commits(None).await?, + last_updated_secs: now(), + meta: None, + }; + Ok(()) + } + } +} +mod commands { + #![allow(unused)] + use std::path::PathBuf; + use std::time::SystemTime; + use ahqstore_types::methods::OfficialManifestSource; + use ahqstore_types::{AHQStoreApplication, Commits, DevData, Home}; + use anyhow::Context; + use tauri::ipc::{IpcResponse, Response}; + use tauri::{command, AppHandle, Manager, Runtime}; + use crate::models::*; + use crate::AhqstoreExt; + use ahqstore_types::internet; + use tauri::{ + window::{ProgressBarState, ProgressBarStatus}, + WebviewWindowBuilder, + }; + use crate::error::Result; + use open as open_2; + mod download { + use std::sync::Arc; + use tauri::{ipc::Channel, AppHandle, Manager}; + use crate::{ + structs::platform::downloader::{self, get_size}, + DownloadEvent, Result, + }; + use anyhow::Context; + } + mod encrypt { + use crate::error::Result; + use anyhow::Context; + use chacha20poly1305::{ + aead::{generic_array::GenericArray, Aead, KeyInit}, + ChaCha20Poly1305, + }; + use lazy_static::lazy_static; + #[allow(missing_copy_implementations)] + #[allow(non_camel_case_types)] + #[allow(dead_code)] + struct CRYPTER { + __private_field: (), + } + #[doc(hidden)] + #[allow(non_upper_case_globals)] + static CRYPTER: CRYPTER = CRYPTER { __private_field: () }; + impl ::lazy_static::__Deref for CRYPTER { + type Target = ChaCha20Poly1305; + fn deref(&self) -> &ChaCha20Poly1305 { + #[inline(always)] + fn __static_ref_initialize() -> ChaCha20Poly1305 { + { + let key = GenericArray::from_slice( + "$2b$10$hjtT7QV7UJcmMP6SLJGJVumGb".as_bytes(), + ); + ChaCha20Poly1305::new(&key) + } + } + #[inline(always)] + fn __stability() -> &'static ChaCha20Poly1305 { + static LAZY: ::lazy_static::lazy::Lazy = ::lazy_static::lazy::Lazy::INIT; + LAZY.get(__static_ref_initialize) + } + __stability() + } + } + impl ::lazy_static::LazyStatic for CRYPTER { + fn initialize(lazy: &Self) { + let _ = &**lazy; + } + } + static SALT: [u8; 16] = [ + 0x14, 0x4b, 0x3d, 0x69, 0x1a, 0x7b, 0x4e, 0xcf, 0x39, 0xcf, 0x73, 0x5c, 0x7f, + 0xa7, 0xa7, 0x9c, + ]; + use serde_json::to_string; + pub fn encrypt(payload: String) -> Result> { + let nonce = GenericArray::from_slice(b"SSSSSSSSSSSS"); + Ok( + CRYPTER + .encrypt(nonce, payload.as_bytes()) + .ok() + .context("Cannot encrypt")?, + ) + } + #[allow(unused_imports)] + pub use __cmd__encrypt; + pub fn decrypt(encrypted: Vec) -> Result { + let nonce = GenericArray::from_slice(b"SSSSSSSSSSSS"); + let decrypted = CRYPTER + .decrypt(nonce, &*encrypted) + .ok() + .context("Cannot decrypt")?; + Ok(String::from_utf8(decrypted)?) + } + #[allow(unused_imports)] + pub use __cmd__decrypt; + } + pub use download::*; + pub use encrypt::*; + pub(crate) async fn get_commit(app: tauri::AppHandle) -> Response { + Response::new( + serde_json::to_string(&app.ahqstore().commits.read().await.commit) + .unwrap() + .into_bytes(), + ) + } + #[allow(unused_imports)] + pub(crate) use __cmd__get_commit; + pub(crate) async fn set_scale(window: tauri::WebviewWindow, scale: f64) { + let _ = window.set_zoom(scale); + } + #[allow(unused_imports)] + pub(crate) use __cmd__set_scale; + pub async fn to_hash_uid(id: String) -> String { + ahqstore_gh_hash::compute(id) + } + #[allow(unused_imports)] + pub use __cmd__to_hash_uid; + pub(crate) async fn refresh_commit(app: AppHandle) { + app.ahqstore().refresh().await; + } + #[allow(unused_imports)] + pub(crate) use __cmd__refresh_commit; + #[allow( + unreachable_code, + clippy::diverging_sub_expression, + clippy::used_underscore_binding + )] + const _: () = if false { + #[diagnostic::on_unimplemented( + message = "async commands that contain references as inputs must return a `Result`" + )] + trait AsyncCommandMustReturnResult {} + impl AsyncCommandMustReturnResult for ::std::result::Result {} + let _check: Result> = ::core::panicking::panic( + "internal error: entered unreachable code", + ); + let _: &dyn AsyncCommandMustReturnResult = &_check; + }; + pub(crate) async fn get_all_search( + app: AppHandle, + query: &str, + ) -> Result> { + Ok( + app + .ahqstore() + .commits + .read() + .await + .search(query) + .map_err(|_| crate::Error::SearchError)?, + ) + } + #[allow(unused_imports)] + pub(crate) use __cmd__get_all_search; + pub(crate) async fn get_home(app: AppHandle) -> Result { + Ok( + internet::get_home( + (|| { + return OfficialManifestSource::WinGet; + })(), + &app.ahqstore().commits.read().await.commit.alt, + ) + .await?, + ) + } + #[allow(unused_imports)] + pub(crate) use __cmd__get_home; + #[allow( + unreachable_code, + clippy::diverging_sub_expression, + clippy::used_underscore_binding + )] + const _: () = if false { + #[diagnostic::on_unimplemented( + message = "async commands that contain references as inputs must return a `Result`" + )] + trait AsyncCommandMustReturnResult {} + impl AsyncCommandMustReturnResult for ::std::result::Result {} + let _check: Result = ::core::panicking::panic( + "internal error: entered unreachable code", + ); + let _: &dyn AsyncCommandMustReturnResult = &_check; + }; + pub(crate) async fn get_app( + appl: AppHandle, + app: &str, + ) -> Result { + Ok(internet::get_app(&appl.ahqstore().commits.read().await.commit, app).await?) + } + #[allow(unused_imports)] + pub(crate) use __cmd__get_app; + #[allow( + unreachable_code, + clippy::diverging_sub_expression, + clippy::used_underscore_binding + )] + const _: () = if false { + #[diagnostic::on_unimplemented( + message = "async commands that contain references as inputs must return a `Result`" + )] + trait AsyncCommandMustReturnResult {} + impl AsyncCommandMustReturnResult for ::std::result::Result {} + let _check: Result = ::core::panicking::panic( + "internal error: entered unreachable code", + ); + let _: &dyn AsyncCommandMustReturnResult = &_check; + }; + pub(crate) async fn get_app_asset( + appl: AppHandle, + app: &str, + asset: &str, + ) -> Result { + let bytes = internet::get_app_asset( + &appl.ahqstore().commits.read().await.commit, + app, + asset, + ) + .await + .context("")?; + Ok(Response::new(bytes)) + } + #[allow(unused_imports)] + pub(crate) use __cmd__get_app_asset; + #[allow( + unreachable_code, + clippy::diverging_sub_expression, + clippy::used_underscore_binding + )] + const _: () = if false { + #[diagnostic::on_unimplemented( + message = "async commands that contain references as inputs must return a `Result`" + )] + trait AsyncCommandMustReturnResult {} + impl AsyncCommandMustReturnResult for ::std::result::Result {} + let _check: Result = ::core::panicking::panic( + "internal error: entered unreachable code", + ); + let _: &dyn AsyncCommandMustReturnResult = &_check; + }; + pub(crate) async fn get_dev_data(app: AppHandle, dev: &str) -> Result { + Ok( + internet::get_dev_data(&app.ahqstore().commits.read().await.commit, dev) + .await?, + ) + } + #[allow(unused_imports)] + pub(crate) use __cmd__get_dev_data; + #[allow( + unreachable_code, + clippy::diverging_sub_expression, + clippy::used_underscore_binding + )] + const _: () = if false { + #[diagnostic::on_unimplemented( + message = "async commands that contain references as inputs must return a `Result`" + )] + trait AsyncCommandMustReturnResult {} + impl AsyncCommandMustReturnResult for ::std::result::Result {} + let _check: Result> = ::core::panicking::panic( + "internal error: entered unreachable code", + ); + let _: &dyn AsyncCommandMustReturnResult = &_check; + }; + pub(crate) async fn get_devs_apps(app: AppHandle, dev: &str) -> Result> { + Ok( + internet::get_devs_apps(&app.ahqstore().commits.read().await.commit, dev) + .await?, + ) + } + #[allow(unused_imports)] + pub(crate) use __cmd__get_devs_apps; + pub(crate) fn hash_username(username: String) -> String { + ahqstore_gh_hash::compute(username.as_str()) + } + #[allow(unused_imports)] + pub(crate) use __cmd__hash_username; + pub(crate) fn show_code(app: AppHandle, code: String) { + WebviewWindowBuilder::new( + &app, + "code", + tauri::WebviewUrl::App( + PathBuf::from( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("/{0}", code)) + }), + ), + ), + ) + .skip_taskbar(true) + .title("Login to GitHub") + .inner_size(400.0, 150.0) + .max_inner_size(400.0, 150.0) + .min_inner_size(400.0, 150.0) + .decorations(false) + .always_on_top(true) + .fullscreen(false) + .content_protected(true) + .maximizable(false) + .minimizable(false) + .closable(true) + .focused(true) + .build(); + } + #[allow(unused_imports)] + pub(crate) use __cmd__show_code; + pub(crate) fn rem_code(app: tauri::AppHandle) { + app.get_webview_window("code").unwrap().destroy().unwrap() + } + #[allow(unused_imports)] + pub(crate) use __cmd__rem_code; + pub(crate) fn is_development() -> bool { + true || "1.0.0".contains("-alpha") + } + #[allow(unused_imports)] + pub(crate) use __cmd__is_development; + pub(crate) fn open(url: String) -> Option<()> { + match open_2::that(url) { + Ok(_) => Some(()), + _ => None, + } + } + #[allow(unused_imports)] + pub(crate) use __cmd__open; + pub(crate) async fn now() -> u64 { + use std::time::UNIX_EPOCH; + SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs() + } + pub(crate) fn set_progress( + window: tauri::WebviewWindow, + state: i32, + c: Option, + t: Option, + ) { + let progress = match (c, t) { + (Some(c), Some(t)) => Some((c * 100) / t), + _ => None, + }; + let _ = window + .set_progress_bar(ProgressBarState { + progress, + status: Some( + match state { + 1 => ProgressBarStatus::Indeterminate, + 2 => ProgressBarStatus::Normal, + 4 => ProgressBarStatus::Error, + 8 => ProgressBarStatus::Paused, + _ => ProgressBarStatus::None, + }, + ), + }); + } + #[allow(unused_imports)] + pub(crate) use __cmd__set_progress; + pub(crate) fn get_linux_distro() -> Option { + return None; + } + #[allow(unused_imports)] + pub(crate) use __cmd__get_linux_distro; + pub(crate) fn get_windows() -> &'static str { + return { if is_windows_11() { "11" } else { "10" } }; + } + #[allow(unused_imports)] + pub(crate) use __cmd__get_windows; + pub(crate) fn get_arch() -> &'static str { + std::env::consts::ARCH + } + #[allow(unused_imports)] + pub(crate) use __cmd__get_arch; + pub(crate) fn is_windows_11() -> bool { + use std::os::windows::process::CommandExt; + use std::process::{Command, Stdio}; + let version = Command::new("cmd") + .creation_flags(0x08000000) + .args(["/c", "ver"]) + .stdout(Stdio::piped()) + .spawn() + .unwrap() + .wait_with_output() + .unwrap() + .stdout; + let string = String::from_utf8(version).unwrap(); + let splitted = string + .replace("\n", "") + .replace("Microsoft Windows [", "") + .replace("]", ""); + let version: Vec<&str> = splitted.split(".").collect(); + let version: usize = version[2].parse().unwrap_or(0); + version >= 22000 + } + #[allow(unused_imports)] + pub(crate) use __cmd__is_windows_11; +} +use commands::*; +use crate::structs::platform::*; +mod error { + use std::string::FromUtf8Error; + use serde::{ser::Serializer, Serialize}; + pub type Result = std::result::Result; + pub enum Error { + #[error("The platform is not supported")] + UnsupportedPlatform, + #[error("There was an error while performing search")] + SearchError, + #[error("You cannot safely update commits")] + CannotUpdate, + #[error(transparent)] + Tauri(#[from] tauri::Error), + #[error(transparent)] + Io(#[from] std::io::Error), + #[error(transparent)] + String(#[from] FromUtf8Error), + #[error(transparent)] + AHQStore(#[from] anyhow::Error), + } + #[automatically_derived] + impl ::core::fmt::Debug for Error { + #[inline] + fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + match self { + Error::UnsupportedPlatform => { + ::core::fmt::Formatter::write_str(f, "UnsupportedPlatform") + } + Error::SearchError => ::core::fmt::Formatter::write_str(f, "SearchError"), + Error::CannotUpdate => { + ::core::fmt::Formatter::write_str(f, "CannotUpdate") + } + Error::Tauri(__self_0) => { + ::core::fmt::Formatter::debug_tuple_field1_finish( + f, + "Tauri", + &__self_0, + ) + } + Error::Io(__self_0) => { + ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Io", &__self_0) + } + Error::String(__self_0) => { + ::core::fmt::Formatter::debug_tuple_field1_finish( + f, + "String", + &__self_0, + ) + } + Error::AHQStore(__self_0) => { + ::core::fmt::Formatter::debug_tuple_field1_finish( + f, + "AHQStore", + &__self_0, + ) + } + } + } + } + #[allow(unused_qualifications)] + #[automatically_derived] + impl ::thiserror::__private17::Error for Error { + fn source( + &self, + ) -> ::core::option::Option<&(dyn ::thiserror::__private17::Error + 'static)> { + use ::thiserror::__private17::AsDynError as _; + #[allow(deprecated)] + match self { + Error::UnsupportedPlatform { .. } => ::core::option::Option::None, + Error::SearchError { .. } => ::core::option::Option::None, + Error::CannotUpdate { .. } => ::core::option::Option::None, + Error::Tauri { 0: transparent } => { + ::thiserror::__private17::Error::source(transparent.as_dyn_error()) + } + Error::Io { 0: transparent } => { + ::thiserror::__private17::Error::source(transparent.as_dyn_error()) + } + Error::String { 0: transparent } => { + ::thiserror::__private17::Error::source(transparent.as_dyn_error()) + } + Error::AHQStore { 0: transparent } => { + ::thiserror::__private17::Error::source(transparent.as_dyn_error()) + } + } + } + } + #[allow(unused_qualifications)] + #[automatically_derived] + impl ::core::fmt::Display for Error { + fn fmt(&self, __formatter: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + #[allow(unused_variables, deprecated, clippy::used_underscore_binding)] + match self { + Error::UnsupportedPlatform {} => { + __formatter.write_str("The platform is not supported") + } + Error::SearchError {} => { + __formatter.write_str("There was an error while performing search") + } + Error::CannotUpdate {} => { + __formatter.write_str("You cannot safely update commits") + } + Error::Tauri(_0) => ::core::fmt::Display::fmt(_0, __formatter), + Error::Io(_0) => ::core::fmt::Display::fmt(_0, __formatter), + Error::String(_0) => ::core::fmt::Display::fmt(_0, __formatter), + Error::AHQStore(_0) => ::core::fmt::Display::fmt(_0, __formatter), + } + } + } + #[allow( + deprecated, + unused_qualifications, + clippy::elidable_lifetime_names, + clippy::needless_lifetimes, + )] + #[automatically_derived] + impl ::core::convert::From for Error { + fn from(source: tauri::Error) -> Self { + Error::Tauri { 0: source } + } + } + #[allow( + deprecated, + unused_qualifications, + clippy::elidable_lifetime_names, + clippy::needless_lifetimes, + )] + #[automatically_derived] + impl ::core::convert::From for Error { + fn from(source: std::io::Error) -> Self { + Error::Io { 0: source } + } + } + #[allow( + deprecated, + unused_qualifications, + clippy::elidable_lifetime_names, + clippy::needless_lifetimes, + )] + #[automatically_derived] + impl ::core::convert::From for Error { + fn from(source: FromUtf8Error) -> Self { + Error::String { 0: source } + } + } + #[allow( + deprecated, + unused_qualifications, + clippy::elidable_lifetime_names, + clippy::needless_lifetimes, + )] + #[automatically_derived] + impl ::core::convert::From for Error { + fn from(source: anyhow::Error) -> Self { + Error::AHQStore { 0: source } + } + } + impl Serialize for Error { + fn serialize(&self, serializer: S) -> std::result::Result + where + S: Serializer, + { + serializer.serialize_str(self.to_string().as_ref()) + } + } +} +mod models { + use serde::{Deserialize, Serialize}; + #[serde(rename_all = "camelCase")] + pub struct AndroidBuildOutput { + pub sdk: u32, + pub release: String, + } + #[automatically_derived] + impl ::core::fmt::Debug for AndroidBuildOutput { + #[inline] + fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + ::core::fmt::Formatter::debug_struct_field2_finish( + f, + "AndroidBuildOutput", + "sdk", + &self.sdk, + "release", + &&self.release, + ) + } + } + #[doc(hidden)] + #[allow( + non_upper_case_globals, + unused_attributes, + unused_qualifications, + clippy::absolute_paths, + )] + const _: () = { + #[allow(unused_extern_crates, clippy::useless_attribute)] + extern crate serde as _serde; + #[automatically_derived] + impl<'de> _serde::Deserialize<'de> for AndroidBuildOutput { + fn deserialize<__D>( + __deserializer: __D, + ) -> _serde::__private228::Result + where + __D: _serde::Deserializer<'de>, + { + #[allow(non_camel_case_types)] + #[doc(hidden)] + enum __Field { + __field0, + __field1, + __ignore, + } + #[doc(hidden)] + struct __FieldVisitor; + #[automatically_derived] + impl<'de> _serde::de::Visitor<'de> for __FieldVisitor { + type Value = __Field; + fn expecting( + &self, + __formatter: &mut _serde::__private228::Formatter, + ) -> _serde::__private228::fmt::Result { + _serde::__private228::Formatter::write_str( + __formatter, + "field identifier", + ) + } + fn visit_u64<__E>( + self, + __value: u64, + ) -> _serde::__private228::Result + where + __E: _serde::de::Error, + { + match __value { + 0u64 => _serde::__private228::Ok(__Field::__field0), + 1u64 => _serde::__private228::Ok(__Field::__field1), + _ => _serde::__private228::Ok(__Field::__ignore), + } + } + fn visit_str<__E>( + self, + __value: &str, + ) -> _serde::__private228::Result + where + __E: _serde::de::Error, + { + match __value { + "sdk" => _serde::__private228::Ok(__Field::__field0), + "release" => _serde::__private228::Ok(__Field::__field1), + _ => _serde::__private228::Ok(__Field::__ignore), + } + } + fn visit_bytes<__E>( + self, + __value: &[u8], + ) -> _serde::__private228::Result + where + __E: _serde::de::Error, + { + match __value { + b"sdk" => _serde::__private228::Ok(__Field::__field0), + b"release" => _serde::__private228::Ok(__Field::__field1), + _ => _serde::__private228::Ok(__Field::__ignore), + } + } + } + #[automatically_derived] + impl<'de> _serde::Deserialize<'de> for __Field { + #[inline] + fn deserialize<__D>( + __deserializer: __D, + ) -> _serde::__private228::Result + where + __D: _serde::Deserializer<'de>, + { + _serde::Deserializer::deserialize_identifier( + __deserializer, + __FieldVisitor, + ) + } + } + #[doc(hidden)] + struct __Visitor<'de> { + marker: _serde::__private228::PhantomData, + lifetime: _serde::__private228::PhantomData<&'de ()>, + } + #[automatically_derived] + impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> { + type Value = AndroidBuildOutput; + fn expecting( + &self, + __formatter: &mut _serde::__private228::Formatter, + ) -> _serde::__private228::fmt::Result { + _serde::__private228::Formatter::write_str( + __formatter, + "struct AndroidBuildOutput", + ) + } + #[inline] + fn visit_seq<__A>( + self, + mut __seq: __A, + ) -> _serde::__private228::Result + where + __A: _serde::de::SeqAccess<'de>, + { + let __field0 = match _serde::de::SeqAccess::next_element::< + u32, + >(&mut __seq)? { + _serde::__private228::Some(__value) => __value, + _serde::__private228::None => { + return _serde::__private228::Err( + _serde::de::Error::invalid_length( + 0usize, + &"struct AndroidBuildOutput with 2 elements", + ), + ); + } + }; + let __field1 = match _serde::de::SeqAccess::next_element::< + String, + >(&mut __seq)? { + _serde::__private228::Some(__value) => __value, + _serde::__private228::None => { + return _serde::__private228::Err( + _serde::de::Error::invalid_length( + 1usize, + &"struct AndroidBuildOutput with 2 elements", + ), + ); + } + }; + _serde::__private228::Ok(AndroidBuildOutput { + sdk: __field0, + release: __field1, + }) + } + #[inline] + fn visit_map<__A>( + self, + mut __map: __A, + ) -> _serde::__private228::Result + where + __A: _serde::de::MapAccess<'de>, + { + let mut __field0: _serde::__private228::Option = _serde::__private228::None; + let mut __field1: _serde::__private228::Option = _serde::__private228::None; + while let _serde::__private228::Some(__key) = _serde::de::MapAccess::next_key::< + __Field, + >(&mut __map)? { + match __key { + __Field::__field0 => { + if _serde::__private228::Option::is_some(&__field0) { + return _serde::__private228::Err( + <__A::Error as _serde::de::Error>::duplicate_field("sdk"), + ); + } + __field0 = _serde::__private228::Some( + _serde::de::MapAccess::next_value::(&mut __map)?, + ); + } + __Field::__field1 => { + if _serde::__private228::Option::is_some(&__field1) { + return _serde::__private228::Err( + <__A::Error as _serde::de::Error>::duplicate_field( + "release", + ), + ); + } + __field1 = _serde::__private228::Some( + _serde::de::MapAccess::next_value::(&mut __map)?, + ); + } + _ => { + let _ = _serde::de::MapAccess::next_value::< + _serde::de::IgnoredAny, + >(&mut __map)?; + } + } + } + let __field0 = match __field0 { + _serde::__private228::Some(__field0) => __field0, + _serde::__private228::None => { + _serde::__private228::de::missing_field("sdk")? + } + }; + let __field1 = match __field1 { + _serde::__private228::Some(__field1) => __field1, + _serde::__private228::None => { + _serde::__private228::de::missing_field("release")? + } + }; + _serde::__private228::Ok(AndroidBuildOutput { + sdk: __field0, + release: __field1, + }) + } + } + #[doc(hidden)] + const FIELDS: &'static [&'static str] = &["sdk", "release"]; + _serde::Deserializer::deserialize_struct( + __deserializer, + "AndroidBuildOutput", + FIELDS, + __Visitor { + marker: _serde::__private228::PhantomData::, + lifetime: _serde::__private228::PhantomData, + }, + ) + } + } + }; + #[doc(hidden)] + #[allow( + non_upper_case_globals, + unused_attributes, + unused_qualifications, + clippy::absolute_paths, + )] + const _: () = { + #[allow(unused_extern_crates, clippy::useless_attribute)] + extern crate serde as _serde; + #[automatically_derived] + impl _serde::Serialize for AndroidBuildOutput { + fn serialize<__S>( + &self, + __serializer: __S, + ) -> _serde::__private228::Result<__S::Ok, __S::Error> + where + __S: _serde::Serializer, + { + let mut __serde_state = _serde::Serializer::serialize_struct( + __serializer, + "AndroidBuildOutput", + false as usize + 1 + 1, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __serde_state, + "sdk", + &self.sdk, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __serde_state, + "release", + &self.release, + )?; + _serde::ser::SerializeStruct::end(__serde_state) + } + } + }; + #[serde(rename_all = "camelCase")] + pub struct ShowCodeRequest { + pub value: String, + } + #[automatically_derived] + impl ::core::fmt::Debug for ShowCodeRequest { + #[inline] + fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + ::core::fmt::Formatter::debug_struct_field1_finish( + f, + "ShowCodeRequest", + "value", + &&self.value, + ) + } + } + #[doc(hidden)] + #[allow( + non_upper_case_globals, + unused_attributes, + unused_qualifications, + clippy::absolute_paths, + )] + const _: () = { + #[allow(unused_extern_crates, clippy::useless_attribute)] + extern crate serde as _serde; + #[automatically_derived] + impl<'de> _serde::Deserialize<'de> for ShowCodeRequest { + fn deserialize<__D>( + __deserializer: __D, + ) -> _serde::__private228::Result + where + __D: _serde::Deserializer<'de>, + { + #[allow(non_camel_case_types)] + #[doc(hidden)] + enum __Field { + __field0, + __ignore, + } + #[doc(hidden)] + struct __FieldVisitor; + #[automatically_derived] + impl<'de> _serde::de::Visitor<'de> for __FieldVisitor { + type Value = __Field; + fn expecting( + &self, + __formatter: &mut _serde::__private228::Formatter, + ) -> _serde::__private228::fmt::Result { + _serde::__private228::Formatter::write_str( + __formatter, + "field identifier", + ) + } + fn visit_u64<__E>( + self, + __value: u64, + ) -> _serde::__private228::Result + where + __E: _serde::de::Error, + { + match __value { + 0u64 => _serde::__private228::Ok(__Field::__field0), + _ => _serde::__private228::Ok(__Field::__ignore), + } + } + fn visit_str<__E>( + self, + __value: &str, + ) -> _serde::__private228::Result + where + __E: _serde::de::Error, + { + match __value { + "value" => _serde::__private228::Ok(__Field::__field0), + _ => _serde::__private228::Ok(__Field::__ignore), + } + } + fn visit_bytes<__E>( + self, + __value: &[u8], + ) -> _serde::__private228::Result + where + __E: _serde::de::Error, + { + match __value { + b"value" => _serde::__private228::Ok(__Field::__field0), + _ => _serde::__private228::Ok(__Field::__ignore), + } + } + } + #[automatically_derived] + impl<'de> _serde::Deserialize<'de> for __Field { + #[inline] + fn deserialize<__D>( + __deserializer: __D, + ) -> _serde::__private228::Result + where + __D: _serde::Deserializer<'de>, + { + _serde::Deserializer::deserialize_identifier( + __deserializer, + __FieldVisitor, + ) + } + } + #[doc(hidden)] + struct __Visitor<'de> { + marker: _serde::__private228::PhantomData, + lifetime: _serde::__private228::PhantomData<&'de ()>, + } + #[automatically_derived] + impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> { + type Value = ShowCodeRequest; + fn expecting( + &self, + __formatter: &mut _serde::__private228::Formatter, + ) -> _serde::__private228::fmt::Result { + _serde::__private228::Formatter::write_str( + __formatter, + "struct ShowCodeRequest", + ) + } + #[inline] + fn visit_seq<__A>( + self, + mut __seq: __A, + ) -> _serde::__private228::Result + where + __A: _serde::de::SeqAccess<'de>, + { + let __field0 = match _serde::de::SeqAccess::next_element::< + String, + >(&mut __seq)? { + _serde::__private228::Some(__value) => __value, + _serde::__private228::None => { + return _serde::__private228::Err( + _serde::de::Error::invalid_length( + 0usize, + &"struct ShowCodeRequest with 1 element", + ), + ); + } + }; + _serde::__private228::Ok(ShowCodeRequest { value: __field0 }) + } + #[inline] + fn visit_map<__A>( + self, + mut __map: __A, + ) -> _serde::__private228::Result + where + __A: _serde::de::MapAccess<'de>, + { + let mut __field0: _serde::__private228::Option = _serde::__private228::None; + while let _serde::__private228::Some(__key) = _serde::de::MapAccess::next_key::< + __Field, + >(&mut __map)? { + match __key { + __Field::__field0 => { + if _serde::__private228::Option::is_some(&__field0) { + return _serde::__private228::Err( + <__A::Error as _serde::de::Error>::duplicate_field("value"), + ); + } + __field0 = _serde::__private228::Some( + _serde::de::MapAccess::next_value::(&mut __map)?, + ); + } + _ => { + let _ = _serde::de::MapAccess::next_value::< + _serde::de::IgnoredAny, + >(&mut __map)?; + } + } + } + let __field0 = match __field0 { + _serde::__private228::Some(__field0) => __field0, + _serde::__private228::None => { + _serde::__private228::de::missing_field("value")? + } + }; + _serde::__private228::Ok(ShowCodeRequest { value: __field0 }) + } + } + #[doc(hidden)] + const FIELDS: &'static [&'static str] = &["value"]; + _serde::Deserializer::deserialize_struct( + __deserializer, + "ShowCodeRequest", + FIELDS, + __Visitor { + marker: _serde::__private228::PhantomData::, + lifetime: _serde::__private228::PhantomData, + }, + ) + } + } + }; + #[doc(hidden)] + #[allow( + non_upper_case_globals, + unused_attributes, + unused_qualifications, + clippy::absolute_paths, + )] + const _: () = { + #[allow(unused_extern_crates, clippy::useless_attribute)] + extern crate serde as _serde; + #[automatically_derived] + impl _serde::Serialize for ShowCodeRequest { + fn serialize<__S>( + &self, + __serializer: __S, + ) -> _serde::__private228::Result<__S::Ok, __S::Error> + where + __S: _serde::Serializer, + { + let mut __serde_state = _serde::Serializer::serialize_struct( + __serializer, + "ShowCodeRequest", + false as usize + 1, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __serde_state, + "value", + &self.value, + )?; + _serde::ser::SerializeStruct::end(__serde_state) + } + } + }; + #[serde(rename_all = "camelCase")] + pub struct ZoomRequest { + pub zoom: f32, + } + #[automatically_derived] + impl ::core::fmt::Debug for ZoomRequest { + #[inline] + fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + ::core::fmt::Formatter::debug_struct_field1_finish( + f, + "ZoomRequest", + "zoom", + &&self.zoom, + ) + } + } + #[doc(hidden)] + #[allow( + non_upper_case_globals, + unused_attributes, + unused_qualifications, + clippy::absolute_paths, + )] + const _: () = { + #[allow(unused_extern_crates, clippy::useless_attribute)] + extern crate serde as _serde; + #[automatically_derived] + impl<'de> _serde::Deserialize<'de> for ZoomRequest { + fn deserialize<__D>( + __deserializer: __D, + ) -> _serde::__private228::Result + where + __D: _serde::Deserializer<'de>, + { + #[allow(non_camel_case_types)] + #[doc(hidden)] + enum __Field { + __field0, + __ignore, + } + #[doc(hidden)] + struct __FieldVisitor; + #[automatically_derived] + impl<'de> _serde::de::Visitor<'de> for __FieldVisitor { + type Value = __Field; + fn expecting( + &self, + __formatter: &mut _serde::__private228::Formatter, + ) -> _serde::__private228::fmt::Result { + _serde::__private228::Formatter::write_str( + __formatter, + "field identifier", + ) + } + fn visit_u64<__E>( + self, + __value: u64, + ) -> _serde::__private228::Result + where + __E: _serde::de::Error, + { + match __value { + 0u64 => _serde::__private228::Ok(__Field::__field0), + _ => _serde::__private228::Ok(__Field::__ignore), + } + } + fn visit_str<__E>( + self, + __value: &str, + ) -> _serde::__private228::Result + where + __E: _serde::de::Error, + { + match __value { + "zoom" => _serde::__private228::Ok(__Field::__field0), + _ => _serde::__private228::Ok(__Field::__ignore), + } + } + fn visit_bytes<__E>( + self, + __value: &[u8], + ) -> _serde::__private228::Result + where + __E: _serde::de::Error, + { + match __value { + b"zoom" => _serde::__private228::Ok(__Field::__field0), + _ => _serde::__private228::Ok(__Field::__ignore), + } + } + } + #[automatically_derived] + impl<'de> _serde::Deserialize<'de> for __Field { + #[inline] + fn deserialize<__D>( + __deserializer: __D, + ) -> _serde::__private228::Result + where + __D: _serde::Deserializer<'de>, + { + _serde::Deserializer::deserialize_identifier( + __deserializer, + __FieldVisitor, + ) + } + } + #[doc(hidden)] + struct __Visitor<'de> { + marker: _serde::__private228::PhantomData, + lifetime: _serde::__private228::PhantomData<&'de ()>, + } + #[automatically_derived] + impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> { + type Value = ZoomRequest; + fn expecting( + &self, + __formatter: &mut _serde::__private228::Formatter, + ) -> _serde::__private228::fmt::Result { + _serde::__private228::Formatter::write_str( + __formatter, + "struct ZoomRequest", + ) + } + #[inline] + fn visit_seq<__A>( + self, + mut __seq: __A, + ) -> _serde::__private228::Result + where + __A: _serde::de::SeqAccess<'de>, + { + let __field0 = match _serde::de::SeqAccess::next_element::< + f32, + >(&mut __seq)? { + _serde::__private228::Some(__value) => __value, + _serde::__private228::None => { + return _serde::__private228::Err( + _serde::de::Error::invalid_length( + 0usize, + &"struct ZoomRequest with 1 element", + ), + ); + } + }; + _serde::__private228::Ok(ZoomRequest { zoom: __field0 }) + } + #[inline] + fn visit_map<__A>( + self, + mut __map: __A, + ) -> _serde::__private228::Result + where + __A: _serde::de::MapAccess<'de>, + { + let mut __field0: _serde::__private228::Option = _serde::__private228::None; + while let _serde::__private228::Some(__key) = _serde::de::MapAccess::next_key::< + __Field, + >(&mut __map)? { + match __key { + __Field::__field0 => { + if _serde::__private228::Option::is_some(&__field0) { + return _serde::__private228::Err( + <__A::Error as _serde::de::Error>::duplicate_field("zoom"), + ); + } + __field0 = _serde::__private228::Some( + _serde::de::MapAccess::next_value::(&mut __map)?, + ); + } + _ => { + let _ = _serde::de::MapAccess::next_value::< + _serde::de::IgnoredAny, + >(&mut __map)?; + } + } + } + let __field0 = match __field0 { + _serde::__private228::Some(__field0) => __field0, + _serde::__private228::None => { + _serde::__private228::de::missing_field("zoom")? + } + }; + _serde::__private228::Ok(ZoomRequest { zoom: __field0 }) + } + } + #[doc(hidden)] + const FIELDS: &'static [&'static str] = &["zoom"]; + _serde::Deserializer::deserialize_struct( + __deserializer, + "ZoomRequest", + FIELDS, + __Visitor { + marker: _serde::__private228::PhantomData::, + lifetime: _serde::__private228::PhantomData, + }, + ) + } + } + }; + #[doc(hidden)] + #[allow( + non_upper_case_globals, + unused_attributes, + unused_qualifications, + clippy::absolute_paths, + )] + const _: () = { + #[allow(unused_extern_crates, clippy::useless_attribute)] + extern crate serde as _serde; + #[automatically_derived] + impl _serde::Serialize for ZoomRequest { + fn serialize<__S>( + &self, + __serializer: __S, + ) -> _serde::__private228::Result<__S::Ok, __S::Error> + where + __S: _serde::Serializer, + { + let mut __serde_state = _serde::Serializer::serialize_struct( + __serializer, + "ZoomRequest", + false as usize + 1, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __serde_state, + "zoom", + &self.zoom, + )?; + _serde::ser::SerializeStruct::end(__serde_state) + } + } + }; + #[serde(rename_all = "camelCase", tag = "event", content = "data")] + pub enum DownloadEvent { + #[serde(rename_all = "camelCase")] + Started { length: u64 }, + #[serde(rename_all = "camelCase")] + Progress { progress: f64 }, + #[serde(rename_all = "camelCase")] + Finished {}, + } + #[automatically_derived] + impl ::core::clone::Clone for DownloadEvent { + #[inline] + fn clone(&self) -> DownloadEvent { + match self { + DownloadEvent::Started { length: __self_0 } => { + DownloadEvent::Started { + length: ::core::clone::Clone::clone(__self_0), + } + } + DownloadEvent::Progress { progress: __self_0 } => { + DownloadEvent::Progress { + progress: ::core::clone::Clone::clone(__self_0), + } + } + DownloadEvent::Finished {} => DownloadEvent::Finished {}, + } + } + } + #[doc(hidden)] + #[allow( + non_upper_case_globals, + unused_attributes, + unused_qualifications, + clippy::absolute_paths, + )] + const _: () = { + #[allow(unused_extern_crates, clippy::useless_attribute)] + extern crate serde as _serde; + #[automatically_derived] + impl _serde::Serialize for DownloadEvent { + fn serialize<__S>( + &self, + __serializer: __S, + ) -> _serde::__private228::Result<__S::Ok, __S::Error> + where + __S: _serde::Serializer, + { + match *self { + DownloadEvent::Started { ref length } => { + #[doc(hidden)] + struct __AdjacentlyTagged<'__a> { + data: (&'__a u64,), + phantom: _serde::__private228::PhantomData, + } + #[automatically_derived] + impl<'__a> _serde::Serialize for __AdjacentlyTagged<'__a> { + fn serialize<__S>( + &self, + __serializer: __S, + ) -> _serde::__private228::Result<__S::Ok, __S::Error> + where + __S: _serde::Serializer, + { + #[allow(unused_variables)] + let (length,) = self.data; + let mut __serde_state = _serde::Serializer::serialize_struct( + __serializer, + "started", + 0 + 1, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __serde_state, + "length", + length, + )?; + _serde::ser::SerializeStruct::end(__serde_state) + } + } + let mut __struct = _serde::Serializer::serialize_struct( + __serializer, + "DownloadEvent", + 2, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __struct, + "event", + &_serde::__private228::ser::AdjacentlyTaggedEnumVariant { + enum_name: "DownloadEvent", + variant_index: 0u32, + variant_name: "started", + }, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __struct, + "data", + &__AdjacentlyTagged { + data: (length,), + phantom: _serde::__private228::PhantomData::, + }, + )?; + _serde::ser::SerializeStruct::end(__struct) + } + DownloadEvent::Progress { ref progress } => { + #[doc(hidden)] + struct __AdjacentlyTagged<'__a> { + data: (&'__a f64,), + phantom: _serde::__private228::PhantomData, + } + #[automatically_derived] + impl<'__a> _serde::Serialize for __AdjacentlyTagged<'__a> { + fn serialize<__S>( + &self, + __serializer: __S, + ) -> _serde::__private228::Result<__S::Ok, __S::Error> + where + __S: _serde::Serializer, + { + #[allow(unused_variables)] + let (progress,) = self.data; + let mut __serde_state = _serde::Serializer::serialize_struct( + __serializer, + "progress", + 0 + 1, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __serde_state, + "progress", + progress, + )?; + _serde::ser::SerializeStruct::end(__serde_state) + } + } + let mut __struct = _serde::Serializer::serialize_struct( + __serializer, + "DownloadEvent", + 2, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __struct, + "event", + &_serde::__private228::ser::AdjacentlyTaggedEnumVariant { + enum_name: "DownloadEvent", + variant_index: 1u32, + variant_name: "progress", + }, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __struct, + "data", + &__AdjacentlyTagged { + data: (progress,), + phantom: _serde::__private228::PhantomData::, + }, + )?; + _serde::ser::SerializeStruct::end(__struct) + } + DownloadEvent::Finished {} => { + #[doc(hidden)] + struct __AdjacentlyTagged { + data: (), + phantom: _serde::__private228::PhantomData, + } + #[automatically_derived] + impl _serde::Serialize for __AdjacentlyTagged { + fn serialize<__S>( + &self, + __serializer: __S, + ) -> _serde::__private228::Result<__S::Ok, __S::Error> + where + __S: _serde::Serializer, + { + #[allow(unused_variables)] + let () = self.data; + let __serde_state = _serde::Serializer::serialize_struct( + __serializer, + "finished", + 0, + )?; + _serde::ser::SerializeStruct::end(__serde_state) + } + } + let mut __struct = _serde::Serializer::serialize_struct( + __serializer, + "DownloadEvent", + 2, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __struct, + "event", + &_serde::__private228::ser::AdjacentlyTaggedEnumVariant { + enum_name: "DownloadEvent", + variant_index: 2u32, + variant_name: "finished", + }, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __struct, + "data", + &__AdjacentlyTagged { + data: (), + phantom: _serde::__private228::PhantomData::, + }, + )?; + _serde::ser::SerializeStruct::end(__struct) + } + } + } + } + }; + #[serde(rename_all = "camelCase", tag = "event", content = "data")] + pub enum AppInstallStatus { + Downloading(DownloadEvent), + AVScanning, + Installing, + AppInstallStat(InstallStat), + } + #[automatically_derived] + impl ::core::clone::Clone for AppInstallStatus { + #[inline] + fn clone(&self) -> AppInstallStatus { + match self { + AppInstallStatus::Downloading(__self_0) => { + AppInstallStatus::Downloading(::core::clone::Clone::clone(__self_0)) + } + AppInstallStatus::AVScanning => AppInstallStatus::AVScanning, + AppInstallStatus::Installing => AppInstallStatus::Installing, + AppInstallStatus::AppInstallStat(__self_0) => { + AppInstallStatus::AppInstallStat( + ::core::clone::Clone::clone(__self_0), + ) + } + } + } + } + #[doc(hidden)] + #[allow( + non_upper_case_globals, + unused_attributes, + unused_qualifications, + clippy::absolute_paths, + )] + const _: () = { + #[allow(unused_extern_crates, clippy::useless_attribute)] + extern crate serde as _serde; + #[automatically_derived] + impl _serde::Serialize for AppInstallStatus { + fn serialize<__S>( + &self, + __serializer: __S, + ) -> _serde::__private228::Result<__S::Ok, __S::Error> + where + __S: _serde::Serializer, + { + match *self { + AppInstallStatus::Downloading(ref __field0) => { + let mut __struct = _serde::Serializer::serialize_struct( + __serializer, + "AppInstallStatus", + 2, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __struct, + "event", + &_serde::__private228::ser::AdjacentlyTaggedEnumVariant { + enum_name: "AppInstallStatus", + variant_index: 0u32, + variant_name: "downloading", + }, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __struct, + "data", + __field0, + )?; + _serde::ser::SerializeStruct::end(__struct) + } + AppInstallStatus::AVScanning => { + let mut __struct = _serde::Serializer::serialize_struct( + __serializer, + "AppInstallStatus", + 1, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __struct, + "event", + &_serde::__private228::ser::AdjacentlyTaggedEnumVariant { + enum_name: "AppInstallStatus", + variant_index: 1u32, + variant_name: "aVScanning", + }, + )?; + _serde::ser::SerializeStruct::end(__struct) + } + AppInstallStatus::Installing => { + let mut __struct = _serde::Serializer::serialize_struct( + __serializer, + "AppInstallStatus", + 1, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __struct, + "event", + &_serde::__private228::ser::AdjacentlyTaggedEnumVariant { + enum_name: "AppInstallStatus", + variant_index: 2u32, + variant_name: "installing", + }, + )?; + _serde::ser::SerializeStruct::end(__struct) + } + AppInstallStatus::AppInstallStat(ref __field0) => { + let mut __struct = _serde::Serializer::serialize_struct( + __serializer, + "AppInstallStatus", + 2, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __struct, + "event", + &_serde::__private228::ser::AdjacentlyTaggedEnumVariant { + enum_name: "AppInstallStatus", + variant_index: 3u32, + variant_name: "appInstallStat", + }, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __struct, + "data", + __field0, + )?; + _serde::ser::SerializeStruct::end(__struct) + } + } + } + } + }; + #[serde(rename_all = "camelCase", tag = "event", content = "data")] + pub enum InstallStat { + AVFailed, + Installed, + InstallFailed, + } + #[automatically_derived] + impl ::core::clone::Clone for InstallStat { + #[inline] + fn clone(&self) -> InstallStat { + match self { + InstallStat::AVFailed => InstallStat::AVFailed, + InstallStat::Installed => InstallStat::Installed, + InstallStat::InstallFailed => InstallStat::InstallFailed, + } + } + } + #[doc(hidden)] + #[allow( + non_upper_case_globals, + unused_attributes, + unused_qualifications, + clippy::absolute_paths, + )] + const _: () = { + #[allow(unused_extern_crates, clippy::useless_attribute)] + extern crate serde as _serde; + #[automatically_derived] + impl _serde::Serialize for InstallStat { + fn serialize<__S>( + &self, + __serializer: __S, + ) -> _serde::__private228::Result<__S::Ok, __S::Error> + where + __S: _serde::Serializer, + { + match *self { + InstallStat::AVFailed => { + let mut __struct = _serde::Serializer::serialize_struct( + __serializer, + "InstallStat", + 1, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __struct, + "event", + &_serde::__private228::ser::AdjacentlyTaggedEnumVariant { + enum_name: "InstallStat", + variant_index: 0u32, + variant_name: "aVFailed", + }, + )?; + _serde::ser::SerializeStruct::end(__struct) + } + InstallStat::Installed => { + let mut __struct = _serde::Serializer::serialize_struct( + __serializer, + "InstallStat", + 1, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __struct, + "event", + &_serde::__private228::ser::AdjacentlyTaggedEnumVariant { + enum_name: "InstallStat", + variant_index: 1u32, + variant_name: "installed", + }, + )?; + _serde::ser::SerializeStruct::end(__struct) + } + InstallStat::InstallFailed => { + let mut __struct = _serde::Serializer::serialize_struct( + __serializer, + "InstallStat", + 1, + )?; + _serde::ser::SerializeStruct::serialize_field( + &mut __struct, + "event", + &_serde::__private228::ser::AdjacentlyTaggedEnumVariant { + enum_name: "InstallStat", + variant_index: 2u32, + variant_name: "installFailed", + }, + )?; + _serde::ser::SerializeStruct::end(__struct) + } + } + } + } + }; +} +pub use error::{Error, Result}; +use structs::Ahqstore; +/// Extensions to [`tauri::App`], [`tauri::AppHandle`] and [`tauri::Window`] to access the ahqstore APIs. +pub trait AhqstoreExt { + fn ahqstore(&self) -> &Ahqstore; +} +impl> crate::AhqstoreExt for T { + fn ahqstore(&self) -> &Ahqstore { + self.state::>().inner() + } +} +/// Initializes the plugin. +pub fn init() -> TauriPlugin { + Builder::new("ahqstore") + .invoke_handler(move |__tauri_invoke__| { + let __tauri_cmd__ = __tauri_invoke__.message.command(); + match __tauri_cmd__ { + "get_windows" => { + ({ + move || { + #[allow(unused_imports)] + use ::tauri::ipc::private::*; + #[allow(unused_variables)] + let ::tauri::ipc::Invoke { + message: __tauri_message__, + resolver: __tauri_resolver__, + acl: __tauri_acl__, + } = __tauri_invoke__; + __tauri_resolver__ + .respond_async_serialized(async move { + let result = get_windows(); + let kind = (&result).async_kind(); + kind.future(result).await + }); + return true; + } + })() + } + "get_linux_distro" => { + ({ + move || { + #[allow(unused_imports)] + use ::tauri::ipc::private::*; + #[allow(unused_variables)] + let ::tauri::ipc::Invoke { + message: __tauri_message__, + resolver: __tauri_resolver__, + acl: __tauri_acl__, + } = __tauri_invoke__; + __tauri_resolver__ + .respond_async_serialized(async move { + let result = get_linux_distro(); + let kind = (&result).async_kind(); + kind.future(result).await + }); + return true; + } + })() + } + "is_windows_11" => { + ({ + move || { + #[allow(unused_imports)] + use ::tauri::ipc::private::*; + #[allow(unused_variables)] + let ::tauri::ipc::Invoke { + message: __tauri_message__, + resolver: __tauri_resolver__, + acl: __tauri_acl__, + } = __tauri_invoke__; + __tauri_resolver__ + .respond_async_serialized(async move { + let result = is_windows_11(); + let kind = (&result).async_kind(); + kind.future(result).await + }); + return true; + } + })() + } + "download" => { + ({ + move || { + #[allow(unused_imports)] + use ::tauri::ipc::private::*; + #[allow(unused_variables)] + let ::tauri::ipc::Invoke { + message: __tauri_message__, + resolver: __tauri_resolver__, + acl: __tauri_acl__, + } = __tauri_invoke__; + __tauri_resolver__ + .respond_async_serialized(async move { + let result = download( + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "download", + key: "handle", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "download", + key: "appId", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "download", + key: "prog", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ); + let kind = (&result).async_kind(); + kind.future(result).await + }); + return true; + } + })() + } + "encrypt" => { + ({ + move || { + #[allow(unused_imports)] + use ::tauri::ipc::private::*; + #[allow(unused_variables)] + let ::tauri::ipc::Invoke { + message: __tauri_message__, + resolver: __tauri_resolver__, + acl: __tauri_acl__, + } = __tauri_invoke__; + __tauri_resolver__ + .respond_async_serialized(async move { + let result = encrypt( + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "encrypt", + key: "payload", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ); + let kind = (&result).async_kind(); + kind.future(result).await + }); + return true; + } + })() + } + "decrypt" => { + ({ + move || { + #[allow(unused_imports)] + use ::tauri::ipc::private::*; + #[allow(unused_variables)] + let ::tauri::ipc::Invoke { + message: __tauri_message__, + resolver: __tauri_resolver__, + acl: __tauri_acl__, + } = __tauri_invoke__; + __tauri_resolver__ + .respond_async_serialized(async move { + let result = decrypt( + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "decrypt", + key: "encrypted", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ); + let kind = (&result).async_kind(); + kind.future(result).await + }); + return true; + } + })() + } + "open" => { + ({ + move || { + #[allow(unused_imports)] + use ::tauri::ipc::private::*; + #[allow(unused_variables)] + let ::tauri::ipc::Invoke { + message: __tauri_message__, + resolver: __tauri_resolver__, + acl: __tauri_acl__, + } = __tauri_invoke__; + __tauri_resolver__ + .respond_async_serialized(async move { + let result = open( + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "open", + key: "url", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ); + let kind = (&result).async_kind(); + kind.future(result).await + }); + return true; + } + })() + } + "set_progress" => { + ({ + move || { + #[allow(unused_imports)] + use ::tauri::ipc::private::*; + #[allow(unused_variables)] + let ::tauri::ipc::Invoke { + message: __tauri_message__, + resolver: __tauri_resolver__, + acl: __tauri_acl__, + } = __tauri_invoke__; + __tauri_resolver__ + .respond_async_serialized(async move { + let result = set_progress( + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "set_progress", + key: "window", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "set_progress", + key: "state", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "set_progress", + key: "c", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "set_progress", + key: "t", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ); + let kind = (&result).async_kind(); + kind.future(result).await + }); + return true; + } + })() + } + "is_development" => { + ({ + move || { + #[allow(unused_imports)] + use ::tauri::ipc::private::*; + #[allow(unused_variables)] + let ::tauri::ipc::Invoke { + message: __tauri_message__, + resolver: __tauri_resolver__, + acl: __tauri_acl__, + } = __tauri_invoke__; + __tauri_resolver__ + .respond_async_serialized(async move { + let result = is_development(); + let kind = (&result).async_kind(); + kind.future(result).await + }); + return true; + } + })() + } + "show_code" => { + ({ + move || { + #[allow(unused_imports)] + use ::tauri::ipc::private::*; + #[allow(unused_variables)] + let ::tauri::ipc::Invoke { + message: __tauri_message__, + resolver: __tauri_resolver__, + acl: __tauri_acl__, + } = __tauri_invoke__; + __tauri_resolver__ + .respond_async_serialized(async move { + let result = show_code( + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "show_code", + key: "app", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "show_code", + key: "code", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ); + let kind = (&result).async_kind(); + kind.future(result).await + }); + return true; + } + })() + } + "rem_code" => { + ({ + move || { + #[allow(unused_imports)] + use ::tauri::ipc::private::*; + #[allow(unused_variables)] + let ::tauri::ipc::Invoke { + message: __tauri_message__, + resolver: __tauri_resolver__, + acl: __tauri_acl__, + } = __tauri_invoke__; + __tauri_resolver__ + .respond_async_serialized(async move { + let result = rem_code( + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "rem_code", + key: "app", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ); + let kind = (&result).async_kind(); + kind.future(result).await + }); + return true; + } + })() + } + "hash_username" => { + ({ + move || { + #[allow(unused_imports)] + use ::tauri::ipc::private::*; + #[allow(unused_variables)] + let ::tauri::ipc::Invoke { + message: __tauri_message__, + resolver: __tauri_resolver__, + acl: __tauri_acl__, + } = __tauri_invoke__; + __tauri_resolver__ + .respond_async_serialized(async move { + let result = hash_username( + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "hash_username", + key: "username", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ); + let kind = (&result).async_kind(); + kind.future(result).await + }); + return true; + } + })() + } + "set_scale" => { + ({ + move || { + #[allow(unused_imports)] + use ::tauri::ipc::private::*; + #[allow(unused_variables)] + let ::tauri::ipc::Invoke { + message: __tauri_message__, + resolver: __tauri_resolver__, + acl: __tauri_acl__, + } = __tauri_invoke__; + __tauri_resolver__ + .respond_async_serialized(async move { + let result = set_scale( + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "set_scale", + key: "window", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "set_scale", + key: "scale", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ); + let kind = (&result).async_kind(); + kind.future(result).await + }); + return true; + } + })() + } + "refresh_commit" => { + ({ + move || { + #[allow(unused_imports)] + use ::tauri::ipc::private::*; + #[allow(unused_variables)] + let ::tauri::ipc::Invoke { + message: __tauri_message__, + resolver: __tauri_resolver__, + acl: __tauri_acl__, + } = __tauri_invoke__; + __tauri_resolver__ + .respond_async_serialized(async move { + let result = refresh_commit( + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "refresh_commit", + key: "app", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ); + let kind = (&result).async_kind(); + kind.future(result).await + }); + return true; + } + })() + } + "get_commit" => { + ({ + move || { + #[allow(unused_imports)] + use ::tauri::ipc::private::*; + #[allow(unused_variables)] + let ::tauri::ipc::Invoke { + message: __tauri_message__, + resolver: __tauri_resolver__, + acl: __tauri_acl__, + } = __tauri_invoke__; + __tauri_resolver__ + .respond_async_serialized(async move { + let result = get_commit( + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "get_commit", + key: "app", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ); + let kind = (&result).async_kind(); + kind.future(result).await + }); + return true; + } + })() + } + "get_all_search" => { + ({ + move || { + #[allow(unused_imports)] + use ::tauri::ipc::private::*; + #[allow(unused_variables)] + let ::tauri::ipc::Invoke { + message: __tauri_message__, + resolver: __tauri_resolver__, + acl: __tauri_acl__, + } = __tauri_invoke__; + __tauri_resolver__ + .respond_async_serialized(async move { + let result = get_all_search( + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "get_all_search", + key: "app", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "get_all_search", + key: "query", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ); + let kind = (&result).async_kind(); + kind.future(result).await + }); + return true; + } + })() + } + "get_home" => { + ({ + move || { + #[allow(unused_imports)] + use ::tauri::ipc::private::*; + #[allow(unused_variables)] + let ::tauri::ipc::Invoke { + message: __tauri_message__, + resolver: __tauri_resolver__, + acl: __tauri_acl__, + } = __tauri_invoke__; + __tauri_resolver__ + .respond_async_serialized(async move { + let result = get_home( + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "get_home", + key: "app", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ); + let kind = (&result).async_kind(); + kind.future(result).await + }); + return true; + } + })() + } + "get_app" => { + ({ + move || { + #[allow(unused_imports)] + use ::tauri::ipc::private::*; + #[allow(unused_variables)] + let ::tauri::ipc::Invoke { + message: __tauri_message__, + resolver: __tauri_resolver__, + acl: __tauri_acl__, + } = __tauri_invoke__; + __tauri_resolver__ + .respond_async_serialized(async move { + let result = get_app( + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "get_app", + key: "appl", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "get_app", + key: "app", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ); + let kind = (&result).async_kind(); + kind.future(result).await + }); + return true; + } + })() + } + "get_dev_data" => { + ({ + move || { + #[allow(unused_imports)] + use ::tauri::ipc::private::*; + #[allow(unused_variables)] + let ::tauri::ipc::Invoke { + message: __tauri_message__, + resolver: __tauri_resolver__, + acl: __tauri_acl__, + } = __tauri_invoke__; + __tauri_resolver__ + .respond_async_serialized(async move { + let result = get_dev_data( + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "get_dev_data", + key: "app", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "get_dev_data", + key: "dev", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ); + let kind = (&result).async_kind(); + kind.future(result).await + }); + return true; + } + })() + } + "get_app_asset" => { + ({ + move || { + #[allow(unused_imports)] + use ::tauri::ipc::private::*; + #[allow(unused_variables)] + let ::tauri::ipc::Invoke { + message: __tauri_message__, + resolver: __tauri_resolver__, + acl: __tauri_acl__, + } = __tauri_invoke__; + __tauri_resolver__ + .respond_async_serialized(async move { + let result = get_app_asset( + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "get_app_asset", + key: "appl", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "get_app_asset", + key: "app", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "get_app_asset", + key: "asset", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ); + let kind = (&result).async_kind(); + kind.future(result).await + }); + return true; + } + })() + } + "get_devs_apps" => { + ({ + move || { + #[allow(unused_imports)] + use ::tauri::ipc::private::*; + #[allow(unused_variables)] + let ::tauri::ipc::Invoke { + message: __tauri_message__, + resolver: __tauri_resolver__, + acl: __tauri_acl__, + } = __tauri_invoke__; + __tauri_resolver__ + .respond_async_serialized(async move { + let result = get_devs_apps( + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "get_devs_apps", + key: "app", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ::tauri::ipc::CommandArg::from_command(::tauri::ipc::CommandItem { + plugin: ::core::option::Option::Some("ahqstore"), + name: "get_devs_apps", + key: "dev", + message: &__tauri_message__, + acl: &__tauri_acl__, + })?, + ); + let kind = (&result).async_kind(); + kind.future(result).await + }); + return true; + } + })() + } + "get_arch" => { + ({ + move || { + #[allow(unused_imports)] + use ::tauri::ipc::private::*; + #[allow(unused_variables)] + let ::tauri::ipc::Invoke { + message: __tauri_message__, + resolver: __tauri_resolver__, + acl: __tauri_acl__, + } = __tauri_invoke__; + __tauri_resolver__ + .respond_async_serialized(async move { + let result = get_arch(); + let kind = (&result).async_kind(); + kind.future(result).await + }); + return true; + } + })() + } + _ => { + return false; + } + } + }) + .setup(|app, api| { + let ahqstore = structs::init(app, api)?; + app.manage(ahqstore); + app.ahqstore().init(app.clone()); + Ok(()) + }) + .build() +} diff --git a/src-plugin/src/commands/download.rs b/src-plugin/src/commands/download.rs new file mode 100644 index 0000000..0799823 --- /dev/null +++ b/src-plugin/src/commands/download.rs @@ -0,0 +1,10 @@ +use std::sync::Arc; + +use tauri::{ipc::Channel, AppHandle, Manager}; + +use crate::{ + structs::platform::downloader::{self, get_size}, + DownloadEvent, Result, +}; + +use anyhow::Context; diff --git a/src-plugin/src/commands/encrypt.rs b/src-plugin/src/commands/encrypt.rs new file mode 100644 index 0000000..4397de9 --- /dev/null +++ b/src-plugin/src/commands/encrypt.rs @@ -0,0 +1,46 @@ +use crate::error::Result; +use anyhow::Context; +use chacha20poly1305::{ + aead::{generic_array::GenericArray, Aead, KeyInit}, + ChaCha20Poly1305, +}; +use lazy_static::lazy_static; + +lazy_static! { + static ref CRYPTER: ChaCha20Poly1305 = { + let key = GenericArray::from_slice( + include!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/encrypt")).as_bytes(), + ); + ChaCha20Poly1305::new(&key) + }; +} + +static SALT: [u8; 16] = [ + 0x14, 0x4b, 0x3d, 0x69, 0x1a, 0x7b, 0x4e, 0xcf, 0x39, 0xcf, 0x73, 0x5c, 0x7f, 0xa7, 0xa7, 0x9c, +]; + +use serde_json::to_string; + +#[tauri::command(async)] +pub fn encrypt(payload: String) -> Result> { + let nonce = GenericArray::from_slice(b"SSSSSSSSSSSS"); + + Ok( + CRYPTER + .encrypt(nonce, payload.as_bytes()) + .ok() + .context("Cannot encrypt")?, + ) +} + +#[tauri::command(async)] +pub fn decrypt(encrypted: Vec) -> Result { + let nonce = GenericArray::from_slice(b"SSSSSSSSSSSS"); + + let decrypted = CRYPTER + .decrypt(nonce, &*encrypted) + .ok() + .context("Cannot decrypt")?; + + Ok(String::from_utf8(decrypted)?) +} diff --git a/src-plugin/src/commands.rs b/src-plugin/src/commands/mod.rs similarity index 62% rename from src-plugin/src/commands.rs rename to src-plugin/src/commands/mod.rs index fd6bc3e..65cd890 100644 --- a/src-plugin/src/commands.rs +++ b/src-plugin/src/commands/mod.rs @@ -3,39 +3,51 @@ use std::path::PathBuf; use std::time::SystemTime; -use ahqstore_types::{AHQStoreApplication, DevData, Commits}; +use ahqstore_types::methods::OfficialManifestSource; +use ahqstore_types::{AHQStoreApplication, Commits, DevData, Home}; use anyhow::Context; -use tauri::ipc::Response; +use tauri::ipc::{IpcResponse, Response}; use tauri::{command, AppHandle, Manager, Runtime}; use crate::models::*; use crate::AhqstoreExt; -use ahqstore_types::{ - internet, - search, - search::RespSearchEntry -}; +use ahqstore_types::internet; #[cfg(desktop)] use tauri::{ - WebviewWindowBuilder, - window::{ProgressBarState, ProgressBarStatus} + window::{ProgressBarState, ProgressBarStatus}, + WebviewWindowBuilder, }; use crate::error::Result; use open as open_2; +mod download; +mod encrypt; + +pub use download::*; +pub use encrypt::*; + +#[command(async)] +pub(crate) async fn get_commit(app: tauri::AppHandle) -> Response { + Response::new( + serde_json::to_string(&app.ahqstore().commits.read().await.commit) + .unwrap() + .into_bytes(), + ) +} + #[command(async)] pub(crate) async fn set_scale(window: tauri::WebviewWindow, scale: f64) { #[cfg(desktop)] let _ = window.set_zoom(scale); #[cfg(mobile)] - let _ = window.app_handle().ahqstore().zoom(scale as f32); + let _ = window.app_handle().ahqstore().zoom(scale as f32).await; } #[tauri::command] @@ -49,35 +61,60 @@ pub(crate) async fn refresh_commit(app: AppHandle) { } #[command(async)] -pub(crate) async fn get_all_search(app: AppHandle, query: &str) -> Result> { - Ok(search::get_search(Some(&*app.ahqstore().commits.lock().await), query).await?) +pub(crate) async fn get_all_search(app: AppHandle, query: &str) -> Result> { + Ok( + app + .ahqstore() + .commits + .read() + .await + .search(query) + .map_err(|_| crate::Error::SearchError)?, + ) } #[command(async)] -pub(crate) async fn get_home(app: AppHandle) -> Result)>> { - Ok(internet::get_home(&*app.ahqstore().commits.lock().await.ahqstore).await?) +pub(crate) async fn get_home(app: AppHandle) -> Result { + Ok( + internet::get_home( + (|| { + #[cfg(windows)] + return OfficialManifestSource::WinGet; + + #[cfg(target_os = "linux")] + return OfficialManifestSource::Linux; + + #[cfg(mobile)] + return OfficialManifestSource::FDroid; + })(), + &app.ahqstore().commits.read().await.commit.alt, + ) + .await?, + ) } #[command(async)] pub(crate) async fn get_app(appl: AppHandle, app: &str) -> Result { - Ok(internet::get_app(&*appl.ahqstore().commits.lock().await, app).await?) + Ok(internet::get_app(&appl.ahqstore().commits.read().await.commit, app).await?) } #[command(async)] pub(crate) async fn get_app_asset(appl: AppHandle, app: &str, asset: &str) -> Result { - let bytes = internet::get_app_asset(&*appl.ahqstore().commits.lock().await, app, asset).await.context("")?; + let bytes = internet::get_app_asset(&appl.ahqstore().commits.read().await.commit, app, asset) + .await + .context("")?; Ok(Response::new(bytes)) } #[command(async)] pub(crate) async fn get_dev_data(app: AppHandle, dev: &str) -> Result { - Ok(internet::get_dev_data(&*app.ahqstore().commits.lock().await, dev).await?) + Ok(internet::get_dev_data(&app.ahqstore().commits.read().await.commit, dev).await?) } #[command(async)] pub(crate) async fn get_devs_apps(app: AppHandle, dev: &str) -> Result> { - Ok(internet::get_devs_apps(&*app.ahqstore().commits.lock().await, dev).await?) + Ok(internet::get_devs_apps(&app.ahqstore().commits.read().await.commit, dev).await?) } #[command(async)] @@ -87,28 +124,32 @@ pub(crate) fn hash_username(username: String) -> String { #[command(async)] #[cfg(mobile)] -pub(crate) fn show_code(app: AppHandle, code: String) { - app.ahqstore().show_code(code); +pub(crate) async fn show_code(app: AppHandle, code: String) { + app.ahqstore().show_code(code).await; } #[command(async)] #[cfg(desktop)] pub(crate) fn show_code(app: AppHandle, code: String) { - WebviewWindowBuilder::new(&app, "code", tauri::WebviewUrl::App(PathBuf::from(&format!("/{code}")))) - .skip_taskbar(true) - .title("Login to GitHub") - .inner_size(400.0, 150.0) - .max_inner_size(400.0, 150.0) - .min_inner_size(400.0, 150.0) - .decorations(false) - .always_on_top(true) - .fullscreen(false) - .content_protected(true) - .maximizable(false) - .minimizable(false) - .closable(true) - .focused(true) - .build(); + WebviewWindowBuilder::new( + &app, + "code", + tauri::WebviewUrl::App(PathBuf::from(&format!("/{code}"))), + ) + .skip_taskbar(true) + .title("Login to GitHub") + .inner_size(400.0, 150.0) + .max_inner_size(400.0, 150.0) + .min_inner_size(400.0, 150.0) + .decorations(false) + .always_on_top(true) + .fullscreen(false) + .content_protected(true) + .maximizable(false) + .minimizable(false) + .closable(true) + .focused(true) + .build(); } #[command(async)] @@ -118,10 +159,7 @@ pub(crate) fn rem_code() {} #[command(async)] #[cfg(desktop)] pub(crate) fn rem_code(app: tauri::AppHandle) { - app.get_webview_window("code") - .unwrap() - .destroy() - .unwrap() + app.get_webview_window("code").unwrap().destroy().unwrap() } #[command(async)] @@ -148,7 +186,7 @@ pub(crate) async fn now() -> u64 { #[command(async)] #[cfg(mobile)] -pub(crate) fn set_progress(_: i32,_: Option,_: Option,) {} +pub(crate) fn set_progress(_: i32, _: Option, _: Option) {} #[command(async)] #[cfg(desktop)] @@ -208,8 +246,8 @@ pub(crate) fn get_arch() -> &'static str { #[cfg(windows)] #[command(async)] pub(crate) fn is_windows_11() -> bool { - use std::process::{Command, Stdio}; use std::os::windows::process::CommandExt; + use std::process::{Command, Stdio}; let version = Command::new("cmd") .creation_flags(0x08000000) diff --git a/src-plugin/src/encrypt b/src-plugin/src/encrypt new file mode 100644 index 0000000..c46628b --- /dev/null +++ b/src-plugin/src/encrypt @@ -0,0 +1 @@ +"$2b$10$hjtT7QV7UJcmMP6SLJGJVumGb" \ No newline at end of file diff --git a/src-plugin/src/error.rs b/src-plugin/src/error.rs index f153726..20ee74e 100644 --- a/src-plugin/src/error.rs +++ b/src-plugin/src/error.rs @@ -1,15 +1,32 @@ +use std::string::FromUtf8Error; + use serde::{ser::Serializer, Serialize}; pub type Result = std::result::Result; #[derive(Debug, thiserror::Error)] pub enum Error { + #[error("The platform is not supported")] + UnsupportedPlatform, + + #[error("There was an error while performing search")] + SearchError, + + #[error("You cannot safely update commits")] + CannotUpdate, + + #[error(transparent)] + Tauri(#[from] tauri::Error), + #[error(transparent)] Io(#[from] std::io::Error), + #[error(transparent)] + String(#[from] FromUtf8Error), + #[error(transparent)] AHQStore(#[from] anyhow::Error), - + #[cfg(mobile)] #[error(transparent)] PluginInvoke(#[from] tauri::plugin::mobile::PluginInvokeError), diff --git a/src-plugin/src/lib.rs b/src-plugin/src/lib.rs index 835ef37..83c8574 100644 --- a/src-plugin/src/lib.rs +++ b/src-plugin/src/lib.rs @@ -9,6 +9,8 @@ mod structs; mod commands; use commands::*; +// Another set of commands +use crate::structs::platform::*; mod error; mod models; @@ -36,18 +38,20 @@ pub fn init() -> TauriPlugin { get_windows, #[cfg(desktop)] get_linux_distro, - #[cfg(windows)] is_windows_11, - // to_hash_uid, + download, + encrypt, + decrypt, open, set_progress, is_development, show_code, rem_code, hash_username, + set_scale, refresh_commit, - + get_commit, get_all_search, get_home, get_app, @@ -58,10 +62,13 @@ pub fn init() -> TauriPlugin { ]) .setup(|app, api| { let ahqstore = structs::init(app, api)?; - + app.manage(ahqstore); - + + app.ahqstore() + .init(app.clone()); + Ok(()) }) .build() -} +} \ No newline at end of file diff --git a/src-plugin/src/models.rs b/src-plugin/src/models.rs index 3c4fa73..2211147 100644 --- a/src-plugin/src/models.rs +++ b/src-plugin/src/models.rs @@ -1,5 +1,12 @@ use serde::{Deserialize, Serialize}; +#[derive(Debug, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct AndroidBuildOutput { + pub sdk: u32, + pub release: String, +} + #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct ShowCodeRequest { @@ -14,20 +21,28 @@ pub struct ZoomRequest { #[derive(Clone, Serialize)] #[serde(rename_all = "camelCase", tag = "event", content = "data")] -enum DownloadEvent<'a> { +pub enum DownloadEvent { #[serde(rename_all = "camelCase")] - Started { - url: &'a str, - download_id: usize, - content_length: usize, - }, + Started { length: u64 }, #[serde(rename_all = "camelCase")] - Progress { - download_id: usize, - chunk_length: usize, - }, + Progress { progress: f64 }, #[serde(rename_all = "camelCase")] - Finished { - download_id: usize, - }, -} \ No newline at end of file + Finished {}, +} + +#[derive(Clone, Serialize)] +#[serde(rename_all = "camelCase", tag = "event", content = "data")] +pub enum AppInstallStatus { + Downloading(DownloadEvent), + AVScanning, + Installing, + AppInstallStat(InstallStat), +} + +#[derive(Clone, Serialize)] +#[serde(rename_all = "camelCase", tag = "event", content = "data")] +pub enum InstallStat { + AVFailed, + Installed, + InstallFailed, +} diff --git a/src-plugin/src/structs/daemon/android/mod.rs b/src-plugin/src/structs/daemon/android/mod.rs new file mode 100644 index 0000000..65be5a0 --- /dev/null +++ b/src-plugin/src/structs/daemon/android/mod.rs @@ -0,0 +1,25 @@ +use std::{sync::Arc, time::Duration}; + +use ahqstore_types::Commits; +use tauri::Runtime; +use tokio::{ + sync::{broadcast::Sender, mpsc::UnboundedReceiver, RwLock}, + time::sleep, +}; + +use crate::structs::{ + daemon::{SendRequest, StatusUpdateData}, + Ahqstore, +}; + +// It'll just be an api mapper +pub async fn daemon( + _: &Ahqstore, + _: Arc>, + tx: Sender>, + rx: UnboundedReceiver, +) { + loop { + sleep(Duration::from_millis(100)).await; + } +} diff --git a/src-plugin/src/structs/daemon/desktop/lock.rs b/src-plugin/src/structs/daemon/desktop/lock.rs new file mode 100644 index 0000000..3435307 --- /dev/null +++ b/src-plugin/src/structs/daemon/desktop/lock.rs @@ -0,0 +1,7 @@ +use tokio::sync::Mutex; + +pub static INSTALLLOCK: Mutex<()> = Mutex::const_new(()); + +pub fn is_installing() -> bool { + INSTALLLOCK.try_lock().is_err() +} diff --git a/src-plugin/src/structs/daemon/desktop/mod.rs b/src-plugin/src/structs/daemon/desktop/mod.rs new file mode 100644 index 0000000..5e747f4 --- /dev/null +++ b/src-plugin/src/structs/daemon/desktop/mod.rs @@ -0,0 +1,189 @@ +use std::{ + mem::replace, + sync::Arc, + time::{Duration, SystemTime, UNIX_EPOCH}, +}; + +use ahqstore_types::{ + AppActionIntent, AppUpdateInstallStatus, Commits, QueuedApp, QueuedAppData, StatusUpdateData, +}; +use tauri::Runtime; +use tokio::{ + spawn, + sync::{broadcast::Sender, mpsc::UnboundedReceiver, Notify, RwLock}, + task::JoinHandle, + time::{interval, sleep, MissedTickBehavior}, +}; + +use crate::structs::{daemon::SendRequest, platform, search::CommitSearchIndex, Ahqstore}; + +const TEN_MINS: u64 = 10 * 60 * 1000; + +pub mod lock; + +pub async fn daemon( + ahqstore: &Ahqstore, + commits: Arc>, + tx: Sender>, + mut rx: UnboundedReceiver, +) { + let mut user_initiated = false; + + // Queues + let mut queue: Vec = Vec::with_capacity(50); + + // Timers + let mut intl = interval(Duration::from_mins(10)); + intl.tick().await; + + intl.set_missed_tick_behavior(MissedTickBehavior::Burst); + + let mut notify = Notify::new(); + + // States + let mut changed = false; + let mut transaction = 0; + + // Main Loop + loop { + let now = SystemTime::now() + .duration_since(UNIX_EPOCH) + .expect("Time is running in reverse") + .as_secs(); + + tokio::select! { + // Queue Pruning + _ = sleep(Duration::from_millis(100)) => { + let old = queue.len(); + queue.retain(|x| match &x.status { + AppUpdateInstallStatus::Successful { time } => now < (*time + 2), + AppUpdateInstallStatus::Cancelled { time } => now < (*time + 5), + AppUpdateInstallStatus::Error { time, .. } => now < (*time + 10), + _ => true, + }); + changed = old != queue.len(); + } + + // Sending update inteval tick + // + // Updating ticking + _ = intl.tick() => { + notify.notify_one(); + } + + // Run Update + _ = notify.notified() => { + // TODO + changed = true; + } + + // Handle user commands + Some(msg) = rx.recv() => { + handle_msg(ahqstore, &mut user_initiated, ¬ify, msg, &mut queue, &mut transaction, now).await; + + while let Ok(extra_msg) = rx.try_recv() { + handle_msg(ahqstore, &mut user_initiated, ¬ify, extra_msg, &mut queue, &mut transaction, now).await; + } + + changed = true; + } + } + + if changed { + let queue_data = queue.iter().map(QueuedAppData::from).collect::>(); + _ = tx.send(Arc::new(StatusUpdateData { + disable_update: false, + overflow: queue.len() >= 100, + queue: queue_data, + })); + + changed = false; + } + } +} + +#[inline(always)] +async fn handle_msg( + ahqstore: &Ahqstore, + user_initiated: &mut bool, + notify: &Notify, + msg: SendRequest, + queue: &mut Vec, + transaction: &mut u64, + now: u64, +) { + *transaction += 1; + + if queue.len() < 100 { + match msg { + SendRequest::CheckForUpdate => { + if ahqstore.can_update_commit().await { + *user_initiated = true; + notify.notify_one(); + } + } + + SendRequest::CancelTransaction { transaction } => { + if let Some(x) = queue.iter_mut().find(|x| x.transaction == transaction) { + match x.status { + AppUpdateInstallStatus::Pending + | AppUpdateInstallStatus::PendingUserAction + | AppUpdateInstallStatus::Downloading { .. } + | AppUpdateInstallStatus::AVScanning => { + x.status = AppUpdateInstallStatus::Cancelled { time: now }; + + if let Some(data) = x.task.take() { + data.abort(); + } + + // Run cleanup + } + // Ignore whatever its requested + _ => {} + } + } + } + + SendRequest::PerformTransaction { transaction } => { + if let Some(x) = queue.iter_mut().find(|x| x.transaction == transaction) { + x.status = AppUpdateInstallStatus::Pending; + + x.task = Some(spawn(async {})); + } + } + + SendRequest::PerformAllTransactions => { + queue.iter_mut().for_each(|x| { + if let AppUpdateInstallStatus::PendingUserAction = &x.status { + x.status = AppUpdateInstallStatus::Pending; + + // Now spawn the task + x.task = Some(spawn(async {})); + } + }); + } + + SendRequest::InstallUSERAPP { app_id } => { + let app_id: Arc = Arc::from(app_id); + queue.push(QueuedApp { + status: AppUpdateInstallStatus::Pending, + intent: AppActionIntent::Install, + transaction: *transaction, + id: app_id, + task: Some(spawn(async {})), + }); + } + + SendRequest::RemoveUSERAPP { app_id } => { + let app_id: Arc = Arc::from(app_id); + queue.push(QueuedApp { + status: AppUpdateInstallStatus::Pending, + intent: AppActionIntent::Uninstall, + transaction: *transaction, + id: app_id, + task: Some(spawn(async {})), + }); + } + } + } +} diff --git a/src-plugin/src/structs/daemon/mod.rs b/src-plugin/src/structs/daemon/mod.rs new file mode 100644 index 0000000..8368d6d --- /dev/null +++ b/src-plugin/src/structs/daemon/mod.rs @@ -0,0 +1,74 @@ +use std::{ + sync::{Arc, LazyLock, OnceLock}, + thread, +}; + +use ahqstore_types::{Commits, StatusUpdateData}; +use serde::{Deserialize, Serialize}; +use tauri::{AppHandle, Runtime}; +use tokio::{ + runtime::Builder, + sync::{ + broadcast::{channel, Receiver, Sender as S2}, + mpsc::{unbounded_channel, UnboundedSender as S1}, + RwLock, + }, +}; + +pub enum SendRequest { + CheckForUpdate, + PerformTransaction { transaction: u64 }, + PerformAllTransactions, + CancelTransaction { transaction: u64 }, + InstallUSERAPP { app_id: String }, + RemoveUSERAPP { app_id: String }, +} + +pub type IPCSend = S1; +pub type Broadcast = S2>; + +pub static BOXED_TX_REF: OnceLock = OnceLock::new(); + +#[cfg(desktop)] +mod desktop; + +#[cfg(desktop)] +pub use desktop::*; + +#[cfg(mobile)] +mod android; + +#[cfg(mobile)] +pub use android::*; + +use crate::{structs::search::CommitSearchIndex, AhqstoreExt}; + +pub fn get_daemon_listener() -> Receiver> { + BOXED_TX_REF.get().expect("Cannot error out").subscribe() +} + +// Initializes update-installer-worker +// This is responsible for handling app installs, updates +pub fn initialize( + hwnd: AppHandle, + commits: Arc>, +) -> IPCSend { + let (ipc_send, rx) = unbounded_channel(); + let (tx, _) = channel(100); + + BOXED_TX_REF.set(tx.clone()).expect("No error, don't worry"); + + thread::spawn(move || { + Builder::new_current_thread() + .enable_all() + .build() + .expect("Unable to create thread") + .block_on(async move { + let astore = hwnd.ahqstore(); + + daemon(astore, commits, tx, rx).await; + }); + }); + + ipc_send +} diff --git a/src-plugin/src/structs/mod.rs b/src-plugin/src/structs/mod.rs index 30fa49f..20cef69 100644 --- a/src-plugin/src/structs/mod.rs +++ b/src-plugin/src/structs/mod.rs @@ -1,64 +1,218 @@ #![allow(unused)] +use std::{ + sync::Arc, + time::{SystemTime, UNIX_EPOCH}, +}; + use ahqstore_types::{get_all_commits, Commits}; -use serde::de::DeserializeOwned; -use tauri::{async_runtime::{self, Mutex}, plugin::PluginApi, AppHandle, Runtime}; +use serde::{de::DeserializeOwned, Deserialize, Serialize}; +use tauri::{ + async_runtime::{self, spawn, RwLock}, + plugin::PluginApi, + AppHandle, Runtime, +}; #[cfg(mobile)] use tauri::plugin::PluginHandle; +use tokio::sync::Mutex; + +use crate::{ + models::*, + structs::{ + daemon::{initialize, IPCSend}, + search::search_daemon, + }, +}; -use crate::models::*; +pub(crate) mod daemon; +pub(crate) mod platform; +pub(crate) mod search; -mod platform; +use search::CommitSearchIndex; + +fn now() -> u64 { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .expect("Time is going in reverse") + .as_secs() +} pub fn init( app: &AppHandle, _api: PluginApi, ) -> crate::Result> { - let commits = Mutex::new(async_runtime::block_on(async { - get_all_commits(None).await - })?); + #[cfg(desktop)] + let commits = Arc::new(RwLock::new(async_runtime::block_on(async { + Ok::(CommitSearchIndex { + commit: get_all_commits(None).await?, + last_updated_secs: now(), + meta: None, + }) + })?)); + + #[cfg(mobile)] + let mobile = _api.register_android_plugin("com.plugin.ahqstore", "AHQStorePlugin")?; + + #[cfg(mobile)] + let commits = Arc::new(RwLock::new( + mobile + .run_mobile_plugin::("getCommit", ()) + .map_err(Into::::into)?, + )); + + #[cfg(mobile)] + let prefs = Preferences::init(app, &mobile)?; + + #[cfg(desktop)] + let prefs = Preferences::init(app)?; Ok(Ahqstore { #[cfg(desktop)] - handle: app.clone(), + handle: app.clone(), #[cfg(mobile)] - handle: _api.register_android_plugin("com.plugin.ahqstore", "AHQStorePlugin")?, - commits + handle: mobile, + commits, + send_to_ipc: Mutex::new(None), + preferences: Arc::new(RwLock::new(prefs)), }) } +#[derive(Debug, Serialize, Deserialize)] +pub enum AutoUpdate { + Never, + CheckOnly, + UpdateDuringUnmeteredWifi, + UpdateDuringMeteredWifi, + Always, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct Preferences { + #[serde(rename = "autoUpdate")] + pub auto_update: AutoUpdate, +} + +impl Preferences { + #[cfg(mobile)] + pub fn init(h: &AppHandle, m: &PluginHandle) -> crate::Result { + // Only a polyfill + return Ok(Self { + auto_update: AutoUpdate::CheckOnly, + }); + } + + #[cfg(desktop)] + pub fn init(h: &AppHandle) -> crate::Result { + use std::fs::read_to_string; + use tauri::Manager; + + let mut set_path = h.path().app_local_data_dir()?; + + set_path.push("config.json"); + + return Ok( + serde_json::from_str(&read_to_string(&set_path).unwrap_or_default()).unwrap_or(Self { + auto_update: AutoUpdate::CheckOnly, + }), + ); + } +} + /// Access to the ahqstore APIs. pub struct Ahqstore { #[cfg(desktop)] pub(crate) handle: AppHandle, #[cfg(mobile)] pub(crate) handle: PluginHandle, - pub commits: Mutex + pub preferences: Arc>, + pub commits: Arc>, + pub send_to_ipc: Mutex>, } impl Ahqstore { + pub fn init(&self, hwnd: AppHandle) { + let mut lock = self.send_to_ipc.blocking_lock(); + + let hwnd2 = hwnd.clone(); + + if lock.is_none() { + *lock = Some(initialize(hwnd, self.commits.clone())); + } + + let lck = self.commits.clone(); + + spawn(async move { + search_daemon(hwnd2, lck).await; + }); + } + + pub async fn can_update_commit(&self) -> bool { + let exp = self.commits.read().await.last_updated_secs; + + (exp + 60) < now() + } + + #[cfg(desktop)] + pub async fn refresh(&self) -> crate::Result<()> { + if !self.can_update_commit().await { + use crate::Error; + + return Err(Error::CannotUpdate); + } + + let mut lock = self.commits.write().await; + + *lock = CommitSearchIndex { + commit: get_all_commits(None).await?, + last_updated_secs: now(), + meta: None, + }; + + Ok(()) + } + + #[cfg(mobile)] pub async fn refresh(&self) -> crate::Result<()> { - let mut lock = self.commits.lock().await; - - *lock = async_runtime::block_on(async { - get_all_commits(None).await - })?; + let mut lock = self.commits.write().await; + + *lock = self.refresh_commit_android().await?; Ok(()) } #[cfg(mobile)] - pub fn show_code(&self, code: String) -> crate::Result<()> { - self.handle.run_mobile_plugin("showCode", ShowCodeRequest { - value: code - }).map_err(Into::into) + pub async fn refresh_commit_android(&self) -> crate::Result { + self + .handle + .run_mobile_plugin_async("updateCommit", ()) + .await + .map_err(Into::into) + } + + #[cfg(mobile)] + pub fn android_build(&self) -> crate::Result { + self + .handle + .run_mobile_plugin("getAndroidBuild", ()) + .map_err(Into::into) + } + + #[cfg(mobile)] + pub async fn show_code(&self, code: String) -> crate::Result<()> { + self + .handle + .run_mobile_plugin_async("showCode", ShowCodeRequest { value: code }) + .await + .map_err(Into::into) } #[cfg(mobile)] - pub fn zoom(&self, zoom: f32) -> crate::Result<()> { - self.handle.run_mobile_plugin("showCode", ZoomRequest { - zoom: zoom * 100.0 - }).map_err(Into::into) + pub async fn zoom(&self, zoom: f32) -> crate::Result<()> { + self + .handle + .run_mobile_plugin_async("zoom", ZoomRequest { zoom: zoom * 100.0 }) + .await + .map_err(Into::into) } } diff --git a/src-plugin/src/structs/platform/android/mod.rs b/src-plugin/src/structs/platform/android/mod.rs index e69de29..fb318a6 100644 --- a/src-plugin/src/structs/platform/android/mod.rs +++ b/src-plugin/src/structs/platform/android/mod.rs @@ -0,0 +1,13 @@ +use tauri::AppHandle; +use crate::AhqstoreExt; +use ahqstore_types::{AHQStoreApplication, DownloadUrl}; + +pub fn is_supported(handle: &AppHandle, app: &AHQStoreApplication) -> crate::Result { + let sdk = handle.ahqstore().android_build()?.sdk; + + Ok(app.is_supported_android(sdk)) +} + +pub fn get_download(app: &AHQStoreApplication) -> (Option<&DownloadUrl>, Option<&'static str>) { + (app.get_android_download(), app.get_android_extension()) +} \ No newline at end of file diff --git a/src-plugin/src/structs/platform/common/desktop.rs b/src-plugin/src/structs/platform/common/desktop.rs new file mode 100644 index 0000000..d28b963 --- /dev/null +++ b/src-plugin/src/structs/platform/common/desktop.rs @@ -0,0 +1,65 @@ +use futures::future::join_all; +use serde::{Deserialize, Serialize}; +use tokio::fs; + +use crate::structs::platform::os::install::{AHQSTORE_USER_DIR, AHQSTORE_GLOBAL_DIR}; + +pub async fn list_user_apps() -> Option> { + let dir = &AHQSTORE_USER_DIR.as_str(); + + _inner_list_apps(dir, true).await +} + +pub async fn list_global_apps() -> Option> { + let dir = &AHQSTORE_GLOBAL_DIR.as_str(); + + _inner_list_apps(dir, false).await +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(tag = "event", content = "data")] +pub enum AppListing { + Full { + app_id: String + }, + Unknown { + app_id: String + } +} + +pub async fn _inner_list_apps(dir: &str, create_if_needed: bool) -> Option> { + // Check if it exists + if fs::read_dir(&dir) + .await + .is_err() { + fs::create_dir_all(&dir).await.ok()?; + } + + let mut tasks = vec![]; + + let mut dir =fs::read_dir(&dir) + .await + .ok()?; + + while let Some(entry) = dir.next_entry().await.ok()? { + // Fetching & Parsing + tasks.push(async move { + // TODO: Implement + + Result::<(), String>::Ok(()) + }); + } + + let val = join_all(tasks).await; + + Some( + val + .into_iter() + // Guaranteed unwrap + .map(|x| match x { + Ok(()) => AppListing::Full { app_id: "()".into() }, + Err(app_id) => AppListing::Unknown { app_id } + }) + .collect::>() + ) +} \ No newline at end of file diff --git a/src-plugin/src/structs/platform/common/mod.rs b/src-plugin/src/structs/platform/common/mod.rs new file mode 100644 index 0000000..e23adc6 --- /dev/null +++ b/src-plugin/src/structs/platform/common/mod.rs @@ -0,0 +1,43 @@ +use std::{fs, path::PathBuf}; +use tauri::{AppHandle, Manager, Runtime}; + +use anyhow::Result; + +#[cfg(desktop)] +pub mod desktop; + +pub enum ConnectionType { + Disconnected, + Metered, + Unmetered +} + +pub fn downloads(handle: &AppHandle) -> Result { + let mut dir = handle.path().app_cache_dir()?; + + dir.push("data"); + + _ = fs::create_dir_all(&dir); + + Ok(dir) +} + +pub fn dwnl_tmp(handle: &AppHandle) -> Result { + let mut dir = handle.path().app_cache_dir()?; + + dir.push("tmp"); + + _ = fs::create_dir_all(&dir); + + Ok(dir) +} + +pub fn clear_dwnl(handle: &AppHandle) { + if let Some(dwn) = downloads(handle).ok() { + _ = fs::remove_dir_all(&dwn); + } + + if let Some(tmp) = dwnl_tmp(handle).ok() { + _ = fs::remove_dir_all(&tmp); + } +} \ No newline at end of file diff --git a/src-plugin/src/structs/platform/downloader.rs b/src-plugin/src/structs/platform/downloader.rs index e69de29..72d55e6 100644 --- a/src-plugin/src/structs/platform/downloader.rs +++ b/src-plugin/src/structs/platform/downloader.rs @@ -0,0 +1,259 @@ +use std::{ + io::SeekFrom, + sync::{Arc, LazyLock}, + time::Duration, +}; + +use reqwest::{Client, ClientBuilder, StatusCode}; +use tauri::async_runtime::{self, JoinHandle}; +use tokio::{ + fs::{create_dir_all, remove_dir_all, remove_file, File, OpenOptions}, + io::{AsyncReadExt, AsyncSeekExt, AsyncWriteExt}, + sync::mpsc::{channel, error::TryRecvError, Sender}, + time::sleep, +}; + +static CLIENT: LazyLock = LazyLock::new(|| { + ClientBuilder::new() + .user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36") + .build() + .unwrap() +}); + +pub async fn download (), T: FnOnce(u64) -> ()>( + url: &str, + out_file: &str, + out_dir: &str, + temp_dir: &str, + turbo: bool, + mut len_fn: T, + mut log: F, +) -> Option<()> { + let _ = remove_dir_all(out_dir).await; + create_dir_all(out_dir).await.ok()?; + + let _ = remove_dir_all(temp_dir).await; + create_dir_all(temp_dir).await.ok()?; + + let ranged = turbo && supports_ranged(url).await; + + log(0.0); + + let size = get_size(url).await; + + if ranged && size.is_some() { + dwn_ranged(size, url, format!("{out_dir}/{out_file}"), temp_dir, len_fn, log).await?; + } else { + let mut file = File::create(format!("{out_dir}/{out_file}")).await.ok()?; + + let mut resp = CLIENT.get(url).send().await.ok()?; + + let len = resp.content_length().unwrap_or(1); + + len_fn(len); + + let mut curr = 0u64; + + let mut least = 0.0; + + while let Some(x) = resp.chunk().await.ok()? { + curr += x.len() as u64; + file.write_all(&x).await.ok()?; + + let perc = (curr as f64 * 100.0) / (len as f64); + + if perc > (least + 0.5) || perc == 100.0 { + log(perc); + least = perc; + } + } + file.flush().await.ok()?; // Ensure the file is fully written before closing + + drop(file); + } + + Some(()) +} + +async fn dwn_ranged (), T: FnOnce(u64) -> ()>( + size: Option, + url: &str, + out: String, + temp: &str, + mut len: T, + mut log: F, +) -> Option<()> { + let mut file = File::create(&out).await.ok()?; + + let url = Arc::new(url.to_string()); + let temp = Arc::new(temp.to_string()); + + let size = size?; + let mut done = 0u64; + + len(size); + + let (tx, mut rx) = channel::(20); + + let mut pool = vec![]; + + for (start, end) in divide_into_ranges(size) { + let tx = tx.clone(); + + let url = url.clone(); + let temp = temp.clone(); + + pool.push(async_runtime::spawn(async move { + download_range(&url, tx, start, end, &temp).await + })); + + sleep(Duration::from_micros(50)).await; + } + + let mut last_prog: f64 = 0.0; + + log(0.0); + + loop { + while let Ok(x) = rx.try_recv() { + done += x; + } + + match rx.try_recv() { + Err(e) => match e { + TryRecvError::Empty => {} + TryRecvError::Disconnected => { + break; + } + }, + Ok(x) => { + done += x; + } + } + + let prog = (done as f64 * 100.0) / size as f64; + + if prog != (last_prog + 0.5) || prog == 100.0 { + last_prog = prog; + log(prog); + } + + if pool.iter().all(|x| match x { + JoinHandle::Tokio(x) => x.is_finished(), + }) { + break; + } + + sleep(Duration::from_millis(100)).await; + } + + log(100.0); + + for data in pool { + let (path, mut data) = data.await.ok()??; + data.seek(SeekFrom::Start(0)).await.ok()?; + + let mut buf = [0; 4096]; + + loop { + let size = data.read(&mut buf).await.ok()?; + + if size == 0 { + break; + } + + file.write(&buf[0..size]).await.ok()?; + } + + drop(data); + remove_file(path).await.ok()?; + } + + drop(file); + + Some(()) +} + +async fn download_range( + url: &str, + tx: Sender, + start: u64, + end: u64, + temp: &str, +) -> Option<(String, File)> { + let mut resp = CLIENT + .get(url) + .header("Range", format!("bytes={}-{}", start, end)) + .send() + .await + .ok()?; + + let file = format!("{temp}/{start}_to_{end}"); + + let mut buf = OpenOptions::new(); + + buf.create_new(true).read(true).write(true).truncate(true); + + #[cfg(windows)] + buf.share_mode(0); + + let mut buf = buf.open(&file).await.ok()?; + + while let Some(chunk) = resp.chunk().await.ok()? { + let _ = tx.send(chunk.len() as u64).await; + buf.write_all(&chunk).await.ok()?; + } + + Some((file, buf)) +} + +fn divide_into_ranges(total_size: u64) -> Vec<(u64, u64)> { + let mut total = total_size / 1024 * 1024; + + if total > 100 { + total = 100; + } + + let chunk_size = total_size / total; + let mut ranges = Vec::new(); + + for i in 0..total { + let start = i * chunk_size; + + let end = if i == (total - 1) { + total_size - 1 // Ensure the last chunk goes to the end + } else { + start + chunk_size - 1 + }; + + ranges.push((start, end)); + } + + ranges +} + +pub async fn get_size(url: &str) -> Option { + let resp = CLIENT.head(url).send().await.ok()?; + + let headers = resp.headers(); + + headers + .get("content-length") + .map_or(headers.get("Content-Length"), |x| Some(x)) + .map_or(None, |x| x.to_str().ok()?.parse().ok()) +} + +async fn supports_ranged(url: &str) -> bool { + let res = CLIENT + .get(url) + .header("Range", "bytes=0-0") + .send() + .await; + + + if let Ok(res) = res { + return res.status() == StatusCode::PARTIAL_CONTENT + } + + false +} diff --git a/src-plugin/src/structs/platform/linux/install.rs b/src-plugin/src/structs/platform/linux/install.rs new file mode 100644 index 0000000..80f187d --- /dev/null +++ b/src-plugin/src/structs/platform/linux/install.rs @@ -0,0 +1,13 @@ +use std::sync::LazyLock; +use std::env; + +pub(crate) static AHQSTORE_GLOBAL_DIR: LazyLock = LazyLock::new(|| { + format!("/ahqstore") +}); + +pub(crate) static AHQSTORE_USER_DIR: LazyLock = LazyLock::new(|| { + let useroot = env::var("HOME") + .expect("Impossible error"); + + format!(r"{useroot}/ahqstore") +}); diff --git a/src-plugin/src/structs/platform/linux/mod.rs b/src-plugin/src/structs/platform/linux/mod.rs index e69de29..296f15e 100644 --- a/src-plugin/src/structs/platform/linux/mod.rs +++ b/src-plugin/src/structs/platform/linux/mod.rs @@ -0,0 +1,15 @@ +use tauri::AppHandle; + +use ahqstore_types::{AHQStoreApplication, DownloadUrl}; + +pub mod install; +pub mod network; +pub mod notify; + +pub fn is_supported(_: &AppHandle, app: &AHQStoreApplication) -> crate::Result { + Ok(app.is_supported()) +} + +pub fn get_download(app: &AHQStoreApplication) -> (Option<&DownloadUrl>, Option<&'static str>) { + (app.get_linux_download(), app.get_linux_extension()) +} \ No newline at end of file diff --git a/src-plugin/src/structs/platform/linux/network.rs b/src-plugin/src/structs/platform/linux/network.rs new file mode 100644 index 0000000..03fbd29 --- /dev/null +++ b/src-plugin/src/structs/platform/linux/network.rs @@ -0,0 +1,5 @@ +use crate::structs::platform::common::ConnectionType; + +pub fn get_network() -> Option { + return Some(ConnectionType::Unmetered) +} \ No newline at end of file diff --git a/src-plugin/src/structs/platform/linux/notify.rs b/src-plugin/src/structs/platform/linux/notify.rs new file mode 100644 index 0000000..91af0df --- /dev/null +++ b/src-plugin/src/structs/platform/linux/notify.rs @@ -0,0 +1,5 @@ +pub(crate) fn send_update(_total: u16) {} + +pub(crate) fn app_id_updating(_src: &str, _app_id: &str, _status: &str) {} + +pub(crate) fn updates_pending(_apps: u16) {} diff --git a/src-plugin/src/structs/platform/mod.rs b/src-plugin/src/structs/platform/mod.rs index 0a779a1..6fd6568 100644 --- a/src-plugin/src/structs/platform/mod.rs +++ b/src-plugin/src/structs/platform/mod.rs @@ -1,17 +1,24 @@ +use std::{fs, thread}; + use ahqstore_types::internet; -use tauri::{command, AppHandle, Runtime}; +use anyhow::{Context, Error as AnyError}; +use tauri::{command, ipc::Channel, AppHandle}; +use tokio::sync::oneshot; + +pub mod common; +pub mod downloader; macro_rules! import { ($($x:tt)*) => { - mod $($x)*; - use $($x)* as module; + pub mod $($x)*; + pub use $($x)* as os; }; } macro_rules! get_commit { ($x:ident) => { - &*$x.ahqstore().commits.lock().await - } + &$x.ahqstore().commits.read().await.commit + }; } #[cfg(target_os = "linux")] @@ -23,14 +30,82 @@ import! { windows } #[cfg(mobile)] import! { android } -use module::*; +macro_rules! err { + ($x:expr) => { + Err(Error::AHQStore(AnyError::msg($x))) + }; +} -use crate::{AhqstoreExt, Result}; +use crate::{ + structs::platform::common::{clear_dwnl, downloads, dwnl_tmp}, + AhqstoreExt, DownloadEvent, Error, InstallStat, Result, +}; #[command] -pub async fn install(app: AppHandle, app_id: String) -> Result<()> { - let commit = get_commit!(app); +pub async fn download( + handle: AppHandle, + app_id: &str, + prog: Channel, +) -> Result> { + let commit = get_commit!(handle); + + let app = internet::get_app(commit, app_id).await?; + + let hwnd = handle.clone(); + let stat = tokio::spawn(async move { + if !os::is_supported(&hwnd, &app)? { + return Err(Error::UnsupportedPlatform); + } + + let (Some(url), Some(extension)) = os::get_download(&app) else { + return err!("Could not get data"); + }; + + let turbo = cfg!(mobile); - let app = internet::get_app(commit, &app_id).await?; - Ok(()) -} \ No newline at end of file + let dwnl = downloads(&hwnd)?; + let dir_tmp = dwnl_tmp(&hwnd)?; + + downloader::download( + &url.url, + &format!("{}{}", &app.appId, extension), + { dwnl.to_str().context("Invalid String")? }, + { dir_tmp.to_str().context("Invalid String")? }, + turbo, + |length| { + prog.send(DownloadEvent::Started { length }); + }, + |progress| { + prog.send(DownloadEvent::Progress { progress }); + }, + ) + .await + .context("Unable to download")?; + + prog.send(DownloadEvent::Finished {}); + + Ok(()) + }); + + let app_id = app_id.to_string(); + + let handle = handle.clone(); + let handler = Channel::new(move |body| { + if !stat.is_finished() { + stat.abort(); + + // Cleaning logic + { + clear_dwnl(&handle); + } + + Ok(()) + } else { + Err(tauri::Error::Anyhow(AnyError::msg( + "The download task is already complete", + ))) + } + }); + + Ok(handler) +} diff --git a/src-plugin/src/structs/platform/windows/install.rs b/src-plugin/src/structs/platform/windows/install.rs new file mode 100644 index 0000000..d3ff3a0 --- /dev/null +++ b/src-plugin/src/structs/platform/windows/install.rs @@ -0,0 +1,51 @@ +use std::sync::LazyLock; +use std::env; + +use tauri::fs; +// use windows::{Win32::Security::{PSID, CheckTokenMembership, CreateWellKnownSid, WinBuiltinAdministratorsSid}, core::BOOL}; + +// TODO Probably in future +// pub fn is_admin() -> Option { +// let mut resp = BOOL::from(false); + +// unsafe { +// let mut size = size_of::() as u32; + +// // Getting size +// _ = CreateWellKnownSid( +// WinBuiltinAdministratorsSid, +// None, +// None, +// &mut size +// ); + +// let mut psid = vec![0u8; size as usize]; + +// let psid_ptr = PSID(psid.as_mut_ptr() as *mut _); + +// CreateWellKnownSid( +// WinBuiltinAdministratorsSid, +// None, +// Some(psid_ptr), +// &mut size +// ).ok()?; + +// CheckTokenMembership(None, psid_ptr, &mut resp).ok()?; +// }; + +// Some(resp.as_bool()) +// } + +pub(crate) static AHQSTORE_GLOBAL_DIR: LazyLock = LazyLock::new(|| { + let root = env::var("SYSTEMDRIVE") + .expect("Impossible error"); + + format!(r"{root}\ProgramData\AHQ Store Applications") +}); + +pub(crate) static AHQSTORE_USER_DIR: LazyLock = LazyLock::new(|| { + let useroot = env::var("USERPROFILE") + .expect("Impossible error"); + + format!(r"{useroot}\ahqstore") +}); diff --git a/src-plugin/src/structs/platform/windows/mod.rs b/src-plugin/src/structs/platform/windows/mod.rs index e69de29..aab96f5 100644 --- a/src-plugin/src/structs/platform/windows/mod.rs +++ b/src-plugin/src/structs/platform/windows/mod.rs @@ -0,0 +1,15 @@ +use tauri::AppHandle; + +use ahqstore_types::{AHQStoreApplication, DownloadUrl}; + +pub mod notify; +pub mod install; +pub mod network; + +pub fn is_supported(_: &AppHandle, app: &AHQStoreApplication) -> crate::Result { + Ok(app.is_supported()) +} + +pub fn get_download(app: &AHQStoreApplication) -> (Option<&DownloadUrl>, Option<&'static str>) { + (app.get_win_download(), app.get_win_extension()) +} \ No newline at end of file diff --git a/src-plugin/src/structs/platform/windows/network.rs b/src-plugin/src/structs/platform/windows/network.rs new file mode 100644 index 0000000..53467d3 --- /dev/null +++ b/src-plugin/src/structs/platform/windows/network.rs @@ -0,0 +1,24 @@ +use windows::Networking::Connectivity::{NetworkConnectivityLevel, NetworkCostType, NetworkInformation}; + +use crate::structs::platform::common::ConnectionType; + +pub fn get_network() -> Option { + let info = NetworkInformation::GetInternetConnectionProfile().ok()?; + + let cost = info.GetConnectionCost().ok()?.NetworkCostType().ok()?; + let netlevel = info.GetNetworkConnectivityLevel().ok()?.0; + + let conn = NetworkConnectivityLevel::InternetAccess.0 == netlevel; + + if !conn { + return Some(ConnectionType::Disconnected); + } + + let unmetered = cost.0 == NetworkCostType::Unrestricted.0; + + if unmetered { + Some(ConnectionType::Unmetered) + } else { + Some(ConnectionType::Metered) + } +} \ No newline at end of file diff --git a/src-plugin/src/structs/platform/windows/notify.rs b/src-plugin/src/structs/platform/windows/notify.rs new file mode 100644 index 0000000..8d4285f --- /dev/null +++ b/src-plugin/src/structs/platform/windows/notify.rs @@ -0,0 +1,142 @@ +use std::{sync::LazyLock, thread::sleep, time::Duration}; + +use win32_notif::{ + ManageNotification, NotificationActivatedEventHandler, NotificationBuilder, NotificationDataSet, ToastsNotifier, notification::{ + AdaptiveText, Scenario, actions::{ActionButton, action::ActivationType}, audio::{Audio, Src}, group::{Group, SubGroup}, visual::{image::{AdaptiveImageAlign, ImageCrop}, progress::ProgressValue, text::HintStyle, *} + } +}; + +pub static NOTIF: LazyLock = LazyLock::new(|| { + ToastsNotifier::new("Microsoft.Windows.Explorer").expect("Unexpected error while trying to create notifier") +}); + +pub(crate) fn send_update(total: u16) { + let updated = format!("{total} apps will be updated"); + + let notif = NotificationBuilder::new() + .with_scenario(Scenario::Reminder) + .audio(Audio::new(Src::Reminder, false, false)) + .visual(Text::create(0, "Updates Available").with_style(HintStyle::Title)) + .visual( + Text::create( + 0, + "Application updates are available, would you like to update?", + ) + .with_style(HintStyle::Subtitle), + ) + .visual( + Group::new() + .with_subgroup( + SubGroup::new() + .with_visual( + Text::create(0, &updated) + .with_style(HintStyle::Base) + ) + .with_visual( + Text::create(0, "Only unattended updates will be processed") + .with_style(HintStyle::CaptionSubtle) + ) + ) + ) + .action(ActionButton::create("Yes").with_id("update")) + .action(ActionButton::create("No").with_id("no")) + .on_activated( + NotificationActivatedEventHandler::new(|_a, b| { + let notif = b.unwrap(); + + if ¬if.button_id.unwrap_or_default() == "update" { + panic!("Called update"); + } + + Ok(()) + }) + ) + .with_use_button_style(true) + .build(0, &NOTIF, "2", "1") + .unwrap(); + + _ = notif.set_expires_on_reboot(true); + + notif.show() + .unwrap(); +} + +pub(crate) fn app_id_updating(src: &str, app_id: &str, status: &str) { + let notif = NotificationBuilder::new() + .with_scenario(Scenario::Default) + .audio(Audio::new(Src::IM, false, false)) + .visual(Text::create_binded(0, "title").with_style(HintStyle::Title)) + .visual(Text::create_binded(0, "body").with_style(HintStyle::Body)) + .visual( + Image::create(1, src) + .with_align(AdaptiveImageAlign::Default) + .with_crop(ImageCrop::Circle) + .with_placement(Placement::AppLogoOverride) + ) + .visual( + Progress::create(AdaptiveText::BindTo("txt"), ProgressValue::BindTo("prog")) + .with_override_value(AdaptiveText::BindTo("txxt")), + ) + .value("title", status) + .value("body", "Please wait while we update it for you") + .value("txt", "Downloading") + .value("prog", "indeterminate") + .value("txxt", "Starting up...") + .with_use_button_style(true) + .build(0, &NOTIF, app_id, "update") + .unwrap(); + + _ = notif.set_expires_on_reboot(true); + + notif.show() + .unwrap(); +} + +pub(crate) fn updates_pending(apps: u16) { + let pending = format!("{apps} apps have updates pending"); + + let notif = NotificationBuilder::new() + .with_scenario(Scenario::Reminder) + .audio(Audio::new(Src::Reminder, false, false)) + .visual(Text::create(0, "Updates Pending").with_style(HintStyle::Title)) + .visual( + Text::create( + 0, + "A few updates are pending that require your attention.", + ) + .with_style(HintStyle::Subtitle), + ) + .visual( + Group::new() + .with_subgroup( + SubGroup::new() + .with_visual( + Text::create(0, "{x}") + .with_style(HintStyle::Base) + ) + .with_visual( + Text::create(0, "These require your action to update") + .with_style(HintStyle::CaptionSubtle) + ) + ) + ) + .value("x", &pending) + .action(ActionButton::create("Launch store").with_activation_type(ActivationType::Protocol).with_id("launch")) + .on_activated( + NotificationActivatedEventHandler::new(|_a, b| { + let notif = b.unwrap(); + + println!("{notif:#?}"); + + Ok(()) + }) + ) + .with_use_button_style(true) + .build(0, &NOTIF, "2", "1") + .unwrap(); + + _ = notif.set_expires_on_reboot(true); + + notif.show() + .unwrap(); +} diff --git a/src-plugin/src/structs/search/mod.rs b/src-plugin/src/structs/search/mod.rs new file mode 100644 index 0000000..60fe621 --- /dev/null +++ b/src-plugin/src/structs/search/mod.rs @@ -0,0 +1,245 @@ +use std::{num::NonZero, sync::Arc, thread::available_parallelism, time::Duration}; + +use ahqstore_types::{Commits, SearchEntry}; +use tantivy::{ + collector::TopDocs, + query::{BooleanQuery, BoostQuery, FuzzyTermQuery, Query, QueryParser}, + schema::{Field, Schema, Value, FAST, STRING, TEXT}, + Index, IndexReader, ReloadPolicy, TantivyDocument, Term, +}; +use tauri::{async_runtime::spawn_blocking, AppHandle, Manager, Runtime}; +use tokio::{fs, sync::RwLock, time::sleep}; + +use ahqstore_types::internet::get_all_search; + +pub struct CommitSearchIndex { + pub commit: Commits, + pub last_updated_secs: u64, + pub meta: Option, +} + +pub struct SearchMeta { + pub reader: IndexReader, + pub name_txt: Field, + pub title_txt: Field, + pub id: Field, +} + +impl CommitSearchIndex { + pub fn search(&self, query: &str) -> Result, ()> { + let Some(meta) = &self.meta else { + return Err(()); + }; + + let searcher = meta.reader.searcher(); + + let name_query = BoostQuery::new( + Box::new(BooleanQuery::intersection( + query + .split_whitespace() + .into_iter() + .map(|x| { + let x = Term::from_field_text(meta.name_txt, x); + + Box::new(FuzzyTermQuery::new(x, 1, true)) as Box + }) + .collect::>>() as _, + )), + 1.5, + ); + + let title_query = BooleanQuery::intersection( + query + .split_whitespace() + .into_iter() + .map(|x| { + let x = Term::from_field_text(meta.title_txt, x); + + Box::new(FuzzyTermQuery::new(x, 1, true)) as Box + }) + .collect::>>(), + ); + + let query = BooleanQuery::union(vec![Box::new(name_query), Box::new(title_query)]); + + let Ok(mut search) = searcher.search(&query, &TopDocs::with_limit(500)) else { + println!("ERRORED OUT SEARCH"); + return Err(()); + }; + + let results: Vec = search + .into_iter() + .map(|(_, b)| { + searcher + .segment_reader(b.segment_ord) + .fast_fields() + .str("id") + .ok() + .flatten() + .and_then(|x| { + let mut out = [None; 1]; + x.ords().first_vals(&[b.doc_id], &mut out); + + let out = out[0]?; + + let mut data = String::default(); + + x.ord_to_str(out, &mut data).ok()?; + + Some(data) + }) + }) + // Flatten to auto ignore None values + .flatten() + .collect(); + + Ok(results) + } +} + +pub async fn search_daemon(hwnd: AppHandle, lck: Arc>) { + let mut initial = lck.read().await.commit.clone(); + + let mut builder = Schema::builder(); + let name_txt = builder.add_text_field("name", TEXT); + let title_txt = builder.add_text_field("title", TEXT); + let id = builder.add_text_field("id", STRING | FAST); + let schema = builder.build(); + + let index = { + let mut cache = hwnd + .path() + .app_cache_dir() + .expect("Cannot fetch cache dir, exiting"); + cache.push("searchdb"); + + _ = fs::create_dir_all(&cache).await; + + { + cache.push("commit.lck"); + let data = fs::read_to_string(&cache).await.unwrap_or_default(); + + if &data != &format!("{initial:?}") { + // Load from disk + initial.ahqstore = Default::default(); + initial.alt = Default::default(); + } + cache.pop(); + } + + cache.push("index"); + + if cache.exists() && &initial.ahqstore != "" { + Index::open_in_dir(&cache).expect("Unable to create db, exiting") + } else { + _ = fs::remove_dir_all(&cache).await; + _ = fs::create_dir_all(&cache).await; + + Index::create_in_dir(&cache, schema).expect("Unable to create db, exiting") + } + }; + + let index = Arc::new(index); + + { + let mut data = lck.write().await; + + data.meta = Some(SearchMeta { + id, + name_txt, + reader: index + .reader_builder() + .reload_policy(ReloadPolicy::OnCommitWithDelay) + .num_warming_threads( + available_parallelism() + .unwrap_or(unsafe { NonZero::new_unchecked(4usize) }) + .get() + .clamp(2, 4), + ) + .try_into() + .expect("Unable to construct reader"), + title_txt, + }); + + drop(data); + } + + loop { + let mut to_update; + + // Checking phase + { + let commit_lck = lck.read().await; + let commit = &commit_lck.commit; + + if &initial == commit { + sleep(Duration::from_secs(30)).await; + continue; + } + + to_update = commit.clone(); + drop(commit_lck); + } + + // Building phase + if let Ok(searches) = get_all_search(&to_update).await { + println!("[INFO] Parsing search map"); + + let idx_c = index.clone(); + // Fetching phase + if let Ok(Ok(_)) = + spawn_blocking(move || build_search(idx_c.as_ref(), name_txt, title_txt, id, searches)) + .await + { + let mut wrlck = lck.write().await; + + if &wrlck.commit == &to_update { + initial = to_update; + + let mut cache = hwnd + .path() + .app_cache_dir() + .expect("Cannot fetch cache dir, exiting"); + cache.push("searchdb"); + cache.push("commit.lck"); + + _ = fs::write(cache, format!("{initial:?}")).await; + } + } + } + + sleep(Duration::from_secs(30)).await; + } +} + +fn build_search( + index: &Index, + name_txt: Field, + title_txt: Field, + id: Field, + data: Vec, +) -> tantivy::Result<()> { + let mut index_writer = index.writer( + data + .len() + // Let's assume each entry takes approx 128-bytes, plenty + .saturating_mul(128) + .clamp(15 * 1024 * 1024, 100 * 1024 * 1024), + )?; + + // Clean up all documents as currently delta updates is not done + index_writer.delete_all_documents()?; + + for item in data { + index_writer.add_document(tantivy::doc!( + name_txt => item.name, + title_txt => item.title, + id => item.id + ))?; + } + + index_writer.commit()?; + index_writer.wait_merging_threads()?; + + Ok(()) +} diff --git a/src-setup/.cargo/config.toml b/src-setup/.cargo/config.toml deleted file mode 100644 index 2fb7792..0000000 --- a/src-setup/.cargo/config.toml +++ /dev/null @@ -1,9 +0,0 @@ - -[target.'cfg(windows)'] -rustflags = ["-C", "target-feature=+crt-static", "-Z", "threads=2"] - -[target.aarch64-unknown-linux-gnu] -linker = "aarch64-linux-gnu-gcc" - -[build] -rustflags = ["-Z", "threads=2"] diff --git a/src-setup/Cargo.lock b/src-setup/Cargo.lock deleted file mode 100644 index 8ba6e96..0000000 --- a/src-setup/Cargo.lock +++ /dev/null @@ -1,6504 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "ab_glyph" -version = "0.2.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3672c180e71eeaaac3a541fbbc5f5ad4def8b747c595ad30d674e43049f7b0" -dependencies = [ - "ab_glyph_rasterizer", - "owned_ttf_parser", -] - -[[package]] -name = "ab_glyph_rasterizer" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" - -[[package]] -name = "accesskit" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3d3b8f9bae46a948369bc4a03e815d4ed6d616bd00de4051133a5019dc31c5a" - -[[package]] -name = "accesskit_atspi_common" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c5dd55e6e94949498698daf4d48fb5659e824d7abec0d394089656ceaf99d4f" -dependencies = [ - "accesskit", - "accesskit_consumer", - "atspi-common", - "serde", - "thiserror 1.0.69", - "zvariant 4.2.0", -] - -[[package]] -name = "accesskit_consumer" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f47983a1084940ba9a39c077a8c63e55c619388be5476ac04c804cfbd1e63459" -dependencies = [ - "accesskit", - "hashbrown 0.15.2", - "immutable-chunkmap", -] - -[[package]] -name = "accesskit_macos" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7329821f3bd1101e03a7d2e03bd339e3ac0dc64c70b4c9f9ae1949e3ba8dece1" -dependencies = [ - "accesskit", - "accesskit_consumer", - "hashbrown 0.15.2", - "objc2 0.5.2", - "objc2-app-kit", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "accesskit_unix" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcee751cc20d88678c33edaf9c07e8b693cd02819fe89053776f5313492273f5" -dependencies = [ - "accesskit", - "accesskit_atspi_common", - "async-channel", - "async-executor", - "async-task", - "atspi", - "futures-lite", - "futures-util", - "serde", - "zbus 4.4.0", -] - -[[package]] -name = "accesskit_windows" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24fcd5d23d70670992b823e735e859374d694a3d12bfd8dd32bd3bd8bedb5d81" -dependencies = [ - "accesskit", - "accesskit_consumer", - "hashbrown 0.15.2", - "paste", - "static_assertions", - "windows 0.58.0", - "windows-core 0.58.0", -] - -[[package]] -name = "accesskit_winit" -version = "0.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6a48dad5530b6deb9fc7a52cc6c3bf72cdd9eb8157ac9d32d69f2427a5e879" -dependencies = [ - "accesskit", - "accesskit_macos", - "accesskit_unix", - "accesskit_windows", - "raw-window-handle", - "winit", -] - -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "getrandom 0.2.15", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "ahqstore_setup_amd64" -version = "2.1.0" -dependencies = [ - "check_elevation", - "dirs", - "i-slint-backend-winit", - "lazy_static", - "notify-rust", - "open", - "openssl", - "openssl-sys", - "reqwest", - "serde", - "slint", - "slint-build", - "tauri-winres", - "tokio", - "winreg 0.55.0", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "android-activity" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" -dependencies = [ - "android-properties", - "bitflags 2.8.0", - "cc", - "cesu8", - "jni", - "jni-sys", - "libc", - "log", - "ndk", - "ndk-context", - "ndk-sys", - "num_enum", - "thiserror 1.0.69", -] - -[[package]] -name = "android-properties" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[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 = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "as-raw-xcb-connection" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" - -[[package]] -name = "ashpd" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d43c03d9e36dd40cab48435be0b09646da362c278223ca535493877b2c1dee9" -dependencies = [ - "async-fs", - "async-net", - "enumflags2", - "futures-channel", - "futures-util", - "rand", - "serde", - "serde_repr", - "url", - "zbus 4.4.0", -] - -[[package]] -name = "async-broadcast" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" -dependencies = [ - "event-listener", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-channel" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" -dependencies = [ - "concurrent-queue", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-executor" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" -dependencies = [ - "async-task", - "concurrent-queue", - "fastrand", - "futures-lite", - "slab", -] - -[[package]] -name = "async-fs" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" -dependencies = [ - "async-lock", - "blocking", - "futures-lite", -] - -[[package]] -name = "async-io" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" -dependencies = [ - "async-lock", - "cfg-if", - "concurrent-queue", - "futures-io", - "futures-lite", - "parking", - "polling", - "rustix", - "slab", - "tracing", - "windows-sys 0.59.0", -] - -[[package]] -name = "async-lock" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" -dependencies = [ - "event-listener", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-net" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" -dependencies = [ - "async-io", - "blocking", - "futures-lite", -] - -[[package]] -name = "async-process" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" -dependencies = [ - "async-channel", - "async-io", - "async-lock", - "async-signal", - "async-task", - "blocking", - "cfg-if", - "event-listener", - "futures-lite", - "rustix", - "tracing", -] - -[[package]] -name = "async-recursion" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "async-signal" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" -dependencies = [ - "async-io", - "async-lock", - "atomic-waker", - "cfg-if", - "futures-core", - "futures-io", - "rustix", - "signal-hook-registry", - "slab", - "windows-sys 0.59.0", -] - -[[package]] -name = "async-task" -version = "4.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" - -[[package]] -name = "async-trait" -version = "0.1.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "atspi" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be534b16650e35237bb1ed189ba2aab86ce65e88cc84c66f4935ba38575cecbf" -dependencies = [ - "atspi-common", - "atspi-connection", - "atspi-proxies", -] - -[[package]] -name = "atspi-common" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1909ed2dc01d0a17505d89311d192518507e8a056a48148e3598fef5e7bb6ba7" -dependencies = [ - "enumflags2", - "serde", - "static_assertions", - "zbus 4.4.0", - "zbus-lockstep", - "zbus-lockstep-macros", - "zbus_names 3.0.0", - "zvariant 4.2.0", -] - -[[package]] -name = "atspi-connection" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "430c5960624a4baaa511c9c0fcc2218e3b58f5dbcc47e6190cafee344b873333" -dependencies = [ - "atspi-common", - "atspi-proxies", - "futures-lite", - "zbus 4.4.0", -] - -[[package]] -name = "atspi-proxies" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e6c5de3e524cf967569722446bcd458d5032348554d9a17d7d72b041ab7496" -dependencies = [ - "atspi-common", - "serde", - "zbus 4.4.0", - "zvariant 4.2.0", -] - -[[package]] -name = "auto_enums" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c170965892137a3a9aeb000b4524aa3cc022a310e709d848b6e1cdce4ab4781" -dependencies = [ - "derive_utils", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "backtrace" -version = "0.3.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", -] - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "bindgen" -version = "0.69.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" -dependencies = [ - "bitflags 2.8.0", - "cexpr", - "clang-sys", - "itertools 0.12.1", - "lazy_static", - "lazycell", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash 1.1.0", - "shlex", - "syn", - "which", -] - -[[package]] -name = "bit_field" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" - -[[package]] -name = "block" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" - -[[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.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" -dependencies = [ - "objc2 0.5.2", -] - -[[package]] -name = "blocking" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" -dependencies = [ - "async-channel", - "async-task", - "futures-io", - "futures-lite", - "piper", -] - -[[package]] -name = "borsh" -version = "1.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5430e3be710b68d984d1391c854eb431a9d548640711faa54eecb1df93db91cc" -dependencies = [ - "cfg_aliases", -] - -[[package]] -name = "bumpalo" -version = "3.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" - -[[package]] -name = "by_address" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" - -[[package]] -name = "bytemuck" -version = "1.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "byteorder-lite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" - -[[package]] -name = "bytes" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" - -[[package]] -name = "calloop" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" -dependencies = [ - "bitflags 2.8.0", - "log", - "polling", - "rustix", - "slab", - "thiserror 1.0.69", -] - -[[package]] -name = "calloop" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10929724661d1c43856fd87c7a127ae944ec55579134fb485e4136fb6a46fdcb" -dependencies = [ - "bitflags 2.8.0", - "polling", - "rustix", - "slab", - "tracing", -] - -[[package]] -name = "calloop-wayland-source" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" -dependencies = [ - "calloop 0.13.0", - "rustix", - "wayland-backend", - "wayland-client", -] - -[[package]] -name = "cc" -version = "1.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "755717a7de9ec452bf7f3f1a3099085deabd7f2962b861dae91ecd7a365903d2" -dependencies = [ - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - -[[package]] -name = "cgl" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" -dependencies = [ - "libc", -] - -[[package]] -name = "check_elevation" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34f7310b71e7b968cdadd13480b9e4f2def9f173f67fd7317e8eddb8d7a4ba00" -dependencies = [ - "windows 0.51.1", -] - -[[package]] -name = "chrono" -version = "0.4.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "wasm-bindgen", - "windows-targets 0.52.6", -] - -[[package]] -name = "clang-sys" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "clipboard-win" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fdf5e01086b6be750428ba4a40619f847eb2e95756eee84b18e06e5f0b50342" -dependencies = [ - "lazy-bytes-cast", - "winapi", -] - -[[package]] -name = "clru" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbd0f76e066e64fdc5631e3bb46381254deab9ef1158292f27c8c57e3bf3fe59" - -[[package]] -name = "codemap" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e769b5c8c8283982a987c6e948e540254f1058d5a74b8794914d4ef5fc2a24" - -[[package]] -name = "codemap-diagnostic" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc20770be05b566a963bf91505e60412c4a2d016d1ef95c5512823bb085a8122" -dependencies = [ - "codemap", - "termcolor", -] - -[[package]] -name = "color_quant" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" - -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "const-field-offset" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fcde4ca1211b5a94b573083c472ee19e86b19a441913f66e1cc5c41daf0255" -dependencies = [ - "const-field-offset-macro", - "field-offset", -] - -[[package]] -name = "const-field-offset-macro" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5387f5bbc9e9e6c96436ea125afa12614cebf8ac67f49abc08c1e7a891466c90" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "copypasta" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb85422867ca93da58b7f95fb5c0c10f6183ed6e1ef8841568968a896d3a858" -dependencies = [ - "clipboard-win", - "objc", - "objc-foundation", - "objc_id", - "smithay-clipboard", - "x11-clipboard", -] - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" -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.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "core-graphics-types 0.1.3", - "foreign-types 0.5.0", - "libc", -] - -[[package]] -name = "core-graphics" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" -dependencies = [ - "bitflags 2.8.0", - "core-foundation 0.10.0", - "core-graphics-types 0.2.0", - "foreign-types 0.5.0", - "libc", -] - -[[package]] -name = "core-graphics-types" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "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.8.0", - "core-foundation 0.10.0", - "libc", -] - -[[package]] -name = "core-text" -version = "20.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9d2790b5c08465d49f8dc05c8bcae9fea467855947db39b0f8145c091aaced5" -dependencies = [ - "core-foundation 0.9.4", - "core-graphics 0.23.2", - "foreign-types 0.5.0", - "libc", -] - -[[package]] -name = "core_maths" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30" -dependencies = [ - "libm", -] - -[[package]] -name = "countme" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7704b5fdd17b18ae31c4c1da5a2e0305a2bf17b5249300a9ee9ed7b72114c636" - -[[package]] -name = "cpp" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bcac3d8234c1fb813358e83d1bb6b0290a3d2b3b5efc6b88bfeaf9d8eec17" -dependencies = [ - "cpp_macros", -] - -[[package]] -name = "cpp_build" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27f8638c97fbd79cc6fc80b616e0e74b49bac21014faed590bbc89b7e2676c90" -dependencies = [ - "cc", - "cpp_common", - "lazy_static", - "proc-macro2", - "regex", - "syn", - "unicode-xid", -] - -[[package]] -name = "cpp_common" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25fcfea2ee05889597d35e986c2ad0169694320ae5cc8f6d2640a4bb8a884560" -dependencies = [ - "lazy_static", - "proc-macro2", - "syn", -] - -[[package]] -name = "cpp_macros" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d156158fe86e274820f5a53bc9edb0885a6e7113909497aa8d883b69dd171871" -dependencies = [ - "aho-corasick", - "byteorder", - "cpp_common", - "lazy_static", - "proc-macro2", - "quote", - "syn", -] - -[[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.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "critical-section" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" - -[[package]] -name = "crossbeam-deque" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -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 = "crunchy" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "ctor-lite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f791803201ab277ace03903de1594460708d2d54df6053f2d9e82f592b19e3b" - -[[package]] -name = "cursor-icon" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" - -[[package]] -name = "data-url" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a" - -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", -] - -[[package]] -name = "derive_more" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" -dependencies = [ - "derive_more-impl", -] - -[[package]] -name = "derive_more-impl" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "unicode-xid", -] - -[[package]] -name = "derive_utils" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccfae181bab5ab6c5478b2ccb69e4c68a02f8c3ec72f6616bfec9dbc599d2ee0" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[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-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - -[[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 0.5.0", - "windows-sys 0.59.0", -] - -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users 0.4.6", - "winapi", -] - -[[package]] -name = "dispatch" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "dlib" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" -dependencies = [ - "libloading", -] - -[[package]] -name = "downcast-rs" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" - -[[package]] -name = "dpi" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" - -[[package]] -name = "drm" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80bc8c5c6c2941f70a55c15f8d9f00f9710ebda3ffda98075f996a0e6c92756f" -dependencies = [ - "bitflags 2.8.0", - "bytemuck", - "drm-ffi", - "drm-fourcc", - "libc", - "rustix", -] - -[[package]] -name = "drm-ffi" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8e41459d99a9b529845f6d2c909eb9adf3b6d2f82635ae40be8de0601726e8b" -dependencies = [ - "drm-sys", - "rustix", -] - -[[package]] -name = "drm-fourcc" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aafbcdb8afc29c1a7ee5fbe53b5d62f4565b35a042a662ca9fecd0b54dae6f4" - -[[package]] -name = "drm-sys" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bafb66c8dbc944d69e15cfcc661df7e703beffbaec8bd63151368b06c5f9858c" -dependencies = [ - "libc", - "linux-raw-sys 0.6.5", -] - -[[package]] -name = "dwrote" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70182709525a3632b2ba96b6569225467b18ecb4a77f46d255f713a6bebf05fd" -dependencies = [ - "lazy_static", - "libc", - "serde", - "serde_derive", - "winapi", - "wio", -] - -[[package]] -name = "either" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" - -[[package]] -name = "embed-resource" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4762ce03154ba57ebaeee60cc631901ceae4f18219cbb874e464347471594742" -dependencies = [ - "cc", - "memchr", - "rustc_version", - "toml", - "vswhom", - "winreg 0.52.0", -] - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "endi" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" - -[[package]] -name = "enumflags2" -version = "0.7.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147" -dependencies = [ - "enumflags2_derive", - "serde", -] - -[[package]] -name = "enumflags2_derive" -version = "0.7.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "euclid" -version = "0.22.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" -dependencies = [ - "num-traits", -] - -[[package]] -name = "event-listener" -version = "5.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" -dependencies = [ - "event-listener", - "pin-project-lite", -] - -[[package]] -name = "exr" -version = "1.73.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" -dependencies = [ - "bit_field", - "half", - "lebe", - "miniz_oxide", - "rayon-core", - "smallvec", - "zune-inflate", -] - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "fdeflate" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "femtovg" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36d63bc3ab69493186eefc2568dddc21d2fe5f3c552edc64def6c42297ec9bbd" -dependencies = [ - "bitflags 2.8.0", - "bytemuck", - "fnv", - "glow 0.15.0", - "image 0.25.5", - "imgref", - "log", - "lru", - "rgb", - "rustybuzz 0.20.1", - "slotmap", - "unicode-bidi", - "unicode-segmentation", - "wasm-bindgen", - "web-sys", -] - -[[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 = "filetime" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" -dependencies = [ - "cfg-if", - "libc", - "libredox", - "windows-sys 0.59.0", -] - -[[package]] -name = "flate2" -version = "1.0.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "float-cmp" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" - -[[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.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" - -[[package]] -name = "fontconfig-parser" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fcfcd44ca6e90c921fee9fa665d530b21ef1327a4c1a6c5250ea44b776ada7" -dependencies = [ - "roxmltree", -] - -[[package]] -name = "fontdb" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3a6f9af55fb97ad673fb7a69533eb2f967648a06fa21f8c9bb2cd6d33975716" -dependencies = [ - "fontconfig-parser", - "log", - "memmap2", - "slotmap", - "tinyvec", - "ttf-parser 0.24.1", -] - -[[package]] -name = "fontdue" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efe23d02309319171d00d794c9ff48d4f903c0e481375b1b04b017470838af04" -dependencies = [ - "hashbrown 0.14.5", - "rayon", - "ttf-parser 0.21.1", -] - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared 0.1.1", -] - -[[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 0.3.1", -] - -[[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", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-lite" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "parking", - "pin-project-lite", -] - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "gbm" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa9a106f044fbd21edf2d8cc57300df1e60630e46ed4bebd59cdcbb23cfad1ce" -dependencies = [ - "bitflags 2.8.0", - "drm", - "drm-fourcc", - "gbm-sys", - "libc", -] - -[[package]] -name = "gbm-sys" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9cc2f64de9fa707b5c6b2d2f10d7a7e49e845018a9f5685891eb40d3bab2538" -dependencies = [ - "libc", -] - -[[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 = "gethostname" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" -dependencies = [ - "libc", - "windows-targets 0.48.5", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.13.3+wasi-0.2.2", - "windows-targets 0.52.6", -] - -[[package]] -name = "gif" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" -dependencies = [ - "color_quant", - "weezl", -] - -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - -[[package]] -name = "gl_generator" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" -dependencies = [ - "khronos_api", - "log", - "xml-rs", -] - -[[package]] -name = "glob" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" - -[[package]] -name = "glow" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc464ab121b1" -dependencies = [ - "js-sys", - "slotmap", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "glow" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33cd8ff5e02c1a5463ec10a846c8f3166a3ae0382ec33de6a327ea6dd61c41d" -dependencies = [ - "js-sys", - "slotmap", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "glutin" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03642b8b0cce622392deb0ee3e88511f75df2daac806102597905c3ea1974848" -dependencies = [ - "bitflags 2.8.0", - "cfg_aliases", - "cgl", - "core-foundation 0.9.4", - "dispatch", - "glutin_egl_sys", - "glutin_glx_sys", - "glutin_wgl_sys", - "libloading", - "objc2 0.5.2", - "objc2-app-kit", - "objc2-foundation 0.2.2", - "once_cell", - "raw-window-handle", - "wayland-sys", - "windows-sys 0.52.0", - "x11-dl", -] - -[[package]] -name = "glutin-winit" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85edca7075f8fc728f28cb8fbb111a96c3b89e930574369e3e9c27eb75d3788f" -dependencies = [ - "cfg_aliases", - "glutin", - "raw-window-handle", - "winit", -] - -[[package]] -name = "glutin_egl_sys" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c4680ba6195f424febdc3ba46e7a42a0e58743f2edb115297b86d7f8ecc02d2" -dependencies = [ - "gl_generator", - "windows-sys 0.52.0", -] - -[[package]] -name = "glutin_glx_sys" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7bb2938045a88b612499fbcba375a77198e01306f52272e692f8c1f3751185" -dependencies = [ - "gl_generator", - "x11-dl", -] - -[[package]] -name = "glutin_wgl_sys" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" -dependencies = [ - "gl_generator", -] - -[[package]] -name = "h2" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "half" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" -dependencies = [ - "cfg-if", - "crunchy", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", - "rayon", -] - -[[package]] -name = "hashbrown" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" -dependencies = [ - "foldhash", -] - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hermit-abi" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "home" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "http" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" -dependencies = [ - "bytes", - "fnv", - "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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" -dependencies = [ - "bytes", - "futures-util", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" - -[[package]] -name = "hyper" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" -dependencies = [ - "futures-util", - "http", - "hyper", - "hyper-util", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", - "webpki-roots", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "i-slint-backend-linuxkms" -version = "1.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07313f9ccdb4aeae3ad1151252010f73fc69227bb49b942a8b54d17045511f69" -dependencies = [ - "bytemuck", - "calloop 0.14.2", - "drm", - "gbm", - "glutin", - "i-slint-common", - "i-slint-core", - "i-slint-renderer-femtovg", - "input", - "memmap2", - "nix", - "raw-window-handle", - "xkbcommon", -] - -[[package]] -name = "i-slint-backend-qt" -version = "1.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7782e1fcbb38101a8946bacaa01ea5fa33418cc6f526ee4a0995ad63d0138310" -dependencies = [ - "const-field-offset", - "cpp", - "cpp_build", - "i-slint-common", - "i-slint-core", - "i-slint-core-macros", - "lyon_path", - "once_cell", - "pin-project", - "pin-weak", - "qttypes", - "vtable", -] - -[[package]] -name = "i-slint-backend-selector" -version = "1.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fddbdc93945bf53133d81672b0941d6faa08871f2cce0aea8c10c0bdb9f270" -dependencies = [ - "cfg-if", - "i-slint-backend-linuxkms", - "i-slint-backend-qt", - "i-slint-backend-winit", - "i-slint-common", - "i-slint-core", - "i-slint-core-macros", -] - -[[package]] -name = "i-slint-backend-winit" -version = "1.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4820ff87c95cea7a857f51e13b3491f0022a2a84c124b55e391212f1126bbe95" -dependencies = [ - "accesskit", - "accesskit_winit", - "ashpd", - "bytemuck", - "cfg-if", - "cfg_aliases", - "copypasta", - "derive_more", - "futures", - "glutin", - "glutin-winit", - "i-slint-common", - "i-slint-core", - "i-slint-core-macros", - "i-slint-renderer-femtovg", - "i-slint-renderer-skia", - "imgref", - "lyon_path", - "objc2-app-kit", - "once_cell", - "pin-weak", - "raw-window-handle", - "rgb", - "scoped-tls-hkt", - "scopeguard", - "softbuffer", - "vtable", - "wasm-bindgen", - "web-sys", - "winit", -] - -[[package]] -name = "i-slint-common" -version = "1.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed17428b2512e02b47fb374afa390e183ece31dcab195a1d6336a064a5e241f7" -dependencies = [ - "cfg-if", - "derive_more", - "fontdb", - "libloading", - "ttf-parser 0.25.1", -] - -[[package]] -name = "i-slint-compiler" -version = "1.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9eb838e86650652ff6d2aa6f05469fc4d6382539700ca340b4e206b13a04666" -dependencies = [ - "by_address", - "codemap", - "codemap-diagnostic", - "derive_more", - "fontdue", - "i-slint-common", - "image 0.24.9", - "itertools 0.13.0", - "linked_hash_set", - "lyon_extra", - "lyon_path", - "num_enum", - "once_cell", - "polib", - "proc-macro2", - "quote", - "rayon", - "resvg", - "rowan", - "smol_str 0.3.2", - "strum", - "url", -] - -[[package]] -name = "i-slint-core" -version = "1.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78e779ce58e0fe3977c028e2460e4aaecd65d32bc579d728e89ed3d2d5114e55" -dependencies = [ - "auto_enums", - "bitflags 2.8.0", - "bytemuck", - "cfg-if", - "chrono", - "clru", - "const-field-offset", - "derive_more", - "euclid", - "fontdue", - "i-slint-common", - "i-slint-core-macros", - "image 0.24.9", - "integer-sqrt", - "lyon_algorithms", - "lyon_extra", - "lyon_geom", - "lyon_path", - "num-traits", - "once_cell", - "pin-project", - "pin-weak", - "portable-atomic", - "raw-window-handle", - "resvg", - "rgb", - "rustybuzz 0.20.1", - "scoped-tls-hkt", - "scopeguard", - "slab", - "static_assertions", - "strum", - "sys-locale", - "unicode-linebreak", - "unicode-script", - "unicode-segmentation", - "vtable", - "wasm-bindgen", - "web-sys", - "web-time", -] - -[[package]] -name = "i-slint-core-macros" -version = "1.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ec8e1d457e06e12a5fd23a5e841c994b2ce48cecdaee872c008239380189b15" -dependencies = [ - "quote", - "serde_json", - "syn", -] - -[[package]] -name = "i-slint-renderer-femtovg" -version = "1.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c44ea56368277c89359348fb0765b1ad071bfe98543165d501ad7a619e6e43ba" -dependencies = [ - "cfg-if", - "const-field-offset", - "core-foundation 0.9.4", - "core-text", - "derive_more", - "dwrote", - "femtovg", - "glow 0.15.0", - "i-slint-common", - "i-slint-core", - "i-slint-core-macros", - "imgref", - "lyon_path", - "once_cell", - "pin-weak", - "rgb", - "scoped-tls-hkt", - "ttf-parser 0.25.1", - "unicode-script", - "unicode-segmentation", - "wasm-bindgen", - "web-sys", - "winapi", -] - -[[package]] -name = "i-slint-renderer-skia" -version = "1.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a3c8e632e7ea37b37872533f4504663e1e814de2d7d918f4f833dec69e6279" -dependencies = [ - "bytemuck", - "cfg-if", - "cfg_aliases", - "const-field-offset", - "derive_more", - "glow 0.13.1", - "glutin", - "i-slint-common", - "i-slint-core", - "i-slint-core-macros", - "lyon_path", - "objc2 0.5.2", - "objc2-app-kit", - "objc2-foundation 0.2.2", - "objc2-metal 0.2.2", - "objc2-quartz-core 0.2.2", - "once_cell", - "pin-weak", - "raw-window-handle", - "raw-window-metal", - "scoped-tls-hkt", - "skia-safe", - "softbuffer", - "unicode-segmentation", - "vtable", - "windows 0.58.0", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core 0.52.0", -] - -[[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 = "icu_collections" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locid" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - -[[package]] -name = "icu_normalizer" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" - -[[package]] -name = "icu_properties" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locid_transform", - "icu_properties_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" - -[[package]] -name = "icu_provider" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "idna" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "image" -version = "0.24.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" -dependencies = [ - "bytemuck", - "byteorder", - "color_quant", - "exr", - "gif", - "jpeg-decoder", - "num-traits", - "png", - "qoi", - "tiff", -] - -[[package]] -name = "image" -version = "0.25.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" -dependencies = [ - "bytemuck", - "byteorder-lite", - "num-traits", -] - -[[package]] -name = "imagesize" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" - -[[package]] -name = "imgref" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" - -[[package]] -name = "immutable-chunkmap" -version = "2.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f97096f508d54f8f8ab8957862eee2ccd628847b6217af1a335e1c44dee578" -dependencies = [ - "arrayvec", -] - -[[package]] -name = "indexmap" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" -dependencies = [ - "equivalent", - "hashbrown 0.15.2", -] - -[[package]] -name = "input" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbdc09524a91f9cacd26f16734ff63d7dc650daffadd2b6f84d17a285bd875a9" -dependencies = [ - "bitflags 2.8.0", - "input-sys", - "libc", - "log", - "udev", -] - -[[package]] -name = "input-sys" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd4f5b4d1c00331c5245163aacfe5f20be75b564c7112d45893d4ae038119eb0" - -[[package]] -name = "integer-sqrt" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" -dependencies = [ - "num-traits", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi 0.3.9", - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "is-docker" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" -dependencies = [ - "once_cell", -] - -[[package]] -name = "is-wsl" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" -dependencies = [ - "is-docker", - "once_cell", -] - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" - -[[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", - "log", - "thiserror 1.0.69", - "walkdir", - "windows-sys 0.45.0", -] - -[[package]] -name = "jni-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" - -[[package]] -name = "jobserver" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" -dependencies = [ - "libc", -] - -[[package]] -name = "jpeg-decoder" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" -dependencies = [ - "rayon", -] - -[[package]] -name = "js-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "khronos_api" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" - -[[package]] -name = "kurbo" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89234b2cc610a7dd927ebde6b41dd1a5d4214cffaef4cf1fb2195d592f92518f" -dependencies = [ - "arrayvec", - "smallvec", -] - -[[package]] -name = "lazy-bytes-cast" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10257499f089cd156ad82d0a9cd57d9501fa2c989068992a97eb3c27836f206b" - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "lebe" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" - -[[package]] -name = "libc" -version = "0.2.169" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" - -[[package]] -name = "libloading" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" -dependencies = [ - "cfg-if", - "windows-targets 0.52.6", -] - -[[package]] -name = "libm" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" - -[[package]] -name = "libredox" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" -dependencies = [ - "bitflags 2.8.0", - "libc", - "redox_syscall 0.5.8", -] - -[[package]] -name = "libudev-sys" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324" -dependencies = [ - "libc", - "pkg-config", -] - -[[package]] -name = "linereader" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d921fea6860357575519aca014c6e22470585accdd543b370c404a8a72d0dd1d" -dependencies = [ - "memchr", -] - -[[package]] -name = "linked-hash-map" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" - -[[package]] -name = "linked_hash_set" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bae85b5be22d9843c80e5fc80e9b64c8a3b1f98f867c709956eca3efff4e92e2" -dependencies = [ - "linked-hash-map", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - -[[package]] -name = "linux-raw-sys" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a385b1be4e5c3e362ad2ffa73c392e53f031eaa5b7d648e64cd87f27f6063d7" - -[[package]] -name = "litemap" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" - -[[package]] -name = "log" -version = "0.4.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" - -[[package]] -name = "lru" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" - -[[package]] -name = "lyon_algorithms" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f13c9be19d257c7d37e70608ed858e8eab4b2afcea2e3c9a622e892acbf43c08" -dependencies = [ - "lyon_path", - "num-traits", -] - -[[package]] -name = "lyon_extra" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ca94c7bf1e2557c2798989c43416822c12fc5dcc5e17cc3307ef0e71894a955" -dependencies = [ - "lyon_path", - "thiserror 1.0.69", -] - -[[package]] -name = "lyon_geom" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8af69edc087272df438b3ee436c4bb6d7c04aa8af665cfd398feae627dbd8570" -dependencies = [ - "arrayvec", - "euclid", - "num-traits", -] - -[[package]] -name = "lyon_path" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e0b8aec2f58586f6eef237985b9a9b7cb3a3aff4417c575075cf95bf925252e" -dependencies = [ - "lyon_geom", - "num-traits", -] - -[[package]] -name = "mac-notification-sys" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce8f34f3717aa37177e723df6c1fc5fb02b2a1087374ea3fe0ea42316dc8f91" -dependencies = [ - "cc", - "dirs-next", - "objc-foundation", - "objc_id", - "time", -] - -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -dependencies = [ - "libc", -] - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "memmap2" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" -dependencies = [ - "libc", -] - -[[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 = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" -dependencies = [ - "adler2", - "simd-adler32", -] - -[[package]] -name = "mio" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" -dependencies = [ - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", -] - -[[package]] -name = "native-tls" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dab59f8e050d5df8e4dd87d9206fb6f65a483e20ac9fda365ade4fab353196c" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "ndk" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" -dependencies = [ - "bitflags 2.8.0", - "jni-sys", - "log", - "ndk-sys", - "num_enum", - "raw-window-handle", - "thiserror 1.0.69", -] - -[[package]] -name = "ndk-context" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" - -[[package]] -name = "ndk-sys" -version = "0.6.0+11769913" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" -dependencies = [ - "jni-sys", -] - -[[package]] -name = "nix" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" -dependencies = [ - "bitflags 2.8.0", - "cfg-if", - "cfg_aliases", - "libc", - "memoffset", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "notify-rust" -version = "4.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96ae13fb6065b0865d2310dfa55ce319245052ed95fbbe2bc87c99962c58d73f" -dependencies = [ - "log", - "mac-notification-sys", - "serde", - "tauri-winrt-notification", - "zbus 5.4.0", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_enum" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" -dependencies = [ - "num_enum_derive", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", -] - -[[package]] -name = "objc-foundation" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" -dependencies = [ - "block", - "objc", - "objc_id", -] - -[[package]] -name = "objc-sys" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" - -[[package]] -name = "objc2" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" -dependencies = [ - "objc-sys", - "objc2-encode", -] - -[[package]] -name = "objc2" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3531f65190d9cff863b77a99857e74c314dd16bf56c538c4b57c7cbc3f3a6e59" -dependencies = [ - "objc2-encode", -] - -[[package]] -name = "objc2-app-kit" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" -dependencies = [ - "bitflags 2.8.0", - "block2", - "libc", - "objc2 0.5.2", - "objc2-core-data", - "objc2-core-image", - "objc2-foundation 0.2.2", - "objc2-quartz-core 0.2.2", -] - -[[package]] -name = "objc2-cloud-kit" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" -dependencies = [ - "bitflags 2.8.0", - "block2", - "objc2 0.5.2", - "objc2-core-location", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-contacts" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" -dependencies = [ - "block2", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-core-data" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" -dependencies = [ - "bitflags 2.8.0", - "block2", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-core-foundation" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daeaf60f25471d26948a1c2f840e3f7d86f4109e3af4e8e4b5cd70c39690d925" -dependencies = [ - "bitflags 2.8.0", - "objc2 0.6.0", -] - -[[package]] -name = "objc2-core-image" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" -dependencies = [ - "block2", - "objc2 0.5.2", - "objc2-foundation 0.2.2", - "objc2-metal 0.2.2", -] - -[[package]] -name = "objc2-core-location" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" -dependencies = [ - "block2", - "objc2 0.5.2", - "objc2-contacts", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-encode" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" - -[[package]] -name = "objc2-foundation" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" -dependencies = [ - "bitflags 2.8.0", - "block2", - "dispatch", - "libc", - "objc2 0.5.2", -] - -[[package]] -name = "objc2-foundation" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a21c6c9014b82c39515db5b396f91645182611c97d24637cf56ac01e5f8d998" -dependencies = [ - "bitflags 2.8.0", - "objc2 0.6.0", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-link-presentation" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" -dependencies = [ - "block2", - "objc2 0.5.2", - "objc2-app-kit", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-metal" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" -dependencies = [ - "bitflags 2.8.0", - "block2", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-metal" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01c41bc8b0e50ea7a5304a56f25e0066f526e99641b46fd7b9ad4421dd35bff6" -dependencies = [ - "bitflags 2.8.0", - "objc2 0.6.0", - "objc2-foundation 0.3.0", -] - -[[package]] -name = "objc2-quartz-core" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" -dependencies = [ - "bitflags 2.8.0", - "block2", - "objc2 0.5.2", - "objc2-foundation 0.2.2", - "objc2-metal 0.2.2", -] - -[[package]] -name = "objc2-quartz-core" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb3794501bb1bee12f08dcad8c61f2a5875791ad1c6f47faa71a0f033f20071" -dependencies = [ - "bitflags 2.8.0", - "objc2 0.6.0", - "objc2-core-foundation", - "objc2-foundation 0.3.0", - "objc2-metal 0.3.0", -] - -[[package]] -name = "objc2-symbols" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" -dependencies = [ - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-ui-kit" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" -dependencies = [ - "bitflags 2.8.0", - "block2", - "objc2 0.5.2", - "objc2-cloud-kit", - "objc2-core-data", - "objc2-core-image", - "objc2-core-location", - "objc2-foundation 0.2.2", - "objc2-link-presentation", - "objc2-quartz-core 0.2.2", - "objc2-symbols", - "objc2-uniform-type-identifiers", - "objc2-user-notifications", -] - -[[package]] -name = "objc2-uniform-type-identifiers" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" -dependencies = [ - "block2", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-user-notifications" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" -dependencies = [ - "bitflags 2.8.0", - "block2", - "objc2 0.5.2", - "objc2-core-location", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc_id" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" -dependencies = [ - "objc", -] - -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" -dependencies = [ - "critical-section", - "portable-atomic", -] - -[[package]] -name = "open" -version = "5.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2483562e62ea94312f3576a7aca397306df7990b8d89033e18766744377ef95" -dependencies = [ - "is-wsl", - "libc", - "pathdiff", -] - -[[package]] -name = "openssl" -version = "0.10.70" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61cfb4e166a8bb8c9b55c500bc2308550148ece889be90f609377e58140f42c6" -dependencies = [ - "bitflags 2.8.0", - "cfg-if", - "foreign-types 0.3.2", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-src" -version = "300.4.1+3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faa4eac4138c62414b5622d1b31c5c304f34b406b013c079c2bbc652fdd6678c" -dependencies = [ - "cc", -] - -[[package]] -name = "openssl-sys" -version = "0.9.105" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b22d5b84be05a8d6947c7cb71f7c849aa0f112acd4bf51c2a7c1c988ac0a9dc" -dependencies = [ - "cc", - "libc", - "openssl-src", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "orbclient" -version = "0.3.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" -dependencies = [ - "libredox", -] - -[[package]] -name = "ordered-stream" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" -dependencies = [ - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "owned_ttf_parser" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" -dependencies = [ - "ttf-parser 0.25.1", -] - -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pathdiff" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pico-args" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" - -[[package]] -name = "pin-project" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pin-weak" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b330c9d1b92dfe68442ca20b009c717d5f0b1e3cf4965e62f704c3c6e95a1305" - -[[package]] -name = "piper" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" -dependencies = [ - "atomic-waker", - "fastrand", - "futures-io", -] - -[[package]] -name = "pkg-config" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" - -[[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 = "polib" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b393b155cf9be86249cba1b56cc81be0e6212c66d94ac0d76d37a1761f3bb1b" -dependencies = [ - "linereader", -] - -[[package]] -name = "polling" -version = "3.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" -dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi 0.4.0", - "pin-project-lite", - "rustix", - "tracing", - "windows-sys 0.59.0", -] - -[[package]] -name = "portable-atomic" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" -dependencies = [ - "critical-section", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "prettyplease" -version = "0.2.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" -dependencies = [ - "proc-macro2", - "syn", -] - -[[package]] -name = "proc-macro-crate" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" -dependencies = [ - "toml_edit", -] - -[[package]] -name = "proc-macro2" -version = "1.0.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "qoi" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "qttypes" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7edf5b38c97ad8900ad2a8418ee44b4adceaa866a4a3405e2f1c909871d7ebd" -dependencies = [ - "cpp", - "cpp_build", - "semver", -] - -[[package]] -name = "quick-xml" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "quick-xml" -version = "0.31.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" -dependencies = [ - "memchr", -] - -[[package]] -name = "quick-xml" -version = "0.37.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "165859e9e55f79d67b96c5d96f4e88b6f2695a1972849c15a6a3f5c59fc2c003" -dependencies = [ - "memchr", -] - -[[package]] -name = "quinn" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" -dependencies = [ - "bytes", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash 2.1.1", - "rustls", - "socket2", - "thiserror 2.0.11", - "tokio", - "tracing", -] - -[[package]] -name = "quinn-proto" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" -dependencies = [ - "bytes", - "getrandom 0.2.15", - "rand", - "ring", - "rustc-hash 2.1.1", - "rustls", - "rustls-pki-types", - "slab", - "thiserror 2.0.11", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2", - "tracing", - "windows-sys 0.59.0", -] - -[[package]] -name = "quote" -version = "1.0.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.15", -] - -[[package]] -name = "raw-window-handle" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" - -[[package]] -name = "raw-window-metal" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40d213455a5f1dc59214213c7330e074ddf8114c9a42411eb890c767357ce135" -dependencies = [ - "objc2 0.6.0", - "objc2-core-foundation", - "objc2-foundation 0.3.0", - "objc2-quartz-core 0.3.0", -] - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" -dependencies = [ - "bitflags 2.8.0", -] - -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom 0.2.15", - "libredox", - "thiserror 1.0.69", -] - -[[package]] -name = "redox_users" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" -dependencies = [ - "getrandom 0.2.15", - "libredox", - "thiserror 2.0.11", -] - -[[package]] -name = "regex" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "reqwest" -version = "0.12.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" -dependencies = [ - "base64", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-tls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls", - "rustls-pemfile", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "system-configuration", - "tokio", - "tokio-native-tls", - "tokio-rustls", - "tower", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots", - "windows-registry", -] - -[[package]] -name = "resvg" -version = "0.44.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a325d5e8d1cebddd070b13f44cec8071594ab67d1012797c121f27a669b7958" -dependencies = [ - "log", - "pico-args", - "rgb", - "svgtypes", - "tiny-skia", - "usvg", -] - -[[package]] -name = "rgb" -version = "0.8.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "ring" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.15", - "libc", - "spin", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rowan" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "417a3a9f582e349834051b8a10c8d71ca88da4211e4093528e36b9845f6b5f21" -dependencies = [ - "countme", - "hashbrown 0.14.5", - "rustc-hash 1.1.0", - "text-size", -] - -[[package]] -name = "roxmltree" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc-hash" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags 2.8.0", - "errno", - "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustls" -version = "0.23.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb9263ab4eb695e42321db096e3b8fbd715a59b154d5c88d82db2175b681ba7" -dependencies = [ - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" -dependencies = [ - "web-time", -] - -[[package]] -name = "rustls-webpki" -version = "0.102.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" - -[[package]] -name = "rustybuzz" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c85d1ccd519e61834798eb52c4e886e8c2d7d698dd3d6ce0b1b47eb8557f1181" -dependencies = [ - "bitflags 2.8.0", - "bytemuck", - "core_maths", - "log", - "smallvec", - "ttf-parser 0.24.1", - "unicode-bidi-mirroring 0.3.0", - "unicode-ccc 0.3.0", - "unicode-properties", - "unicode-script", -] - -[[package]] -name = "rustybuzz" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702" -dependencies = [ - "bitflags 2.8.0", - "bytemuck", - "core_maths", - "log", - "smallvec", - "ttf-parser 0.25.1", - "unicode-bidi-mirroring 0.4.0", - "unicode-ccc 0.4.0", - "unicode-properties", - "unicode-script", -] - -[[package]] -name = "ryu" -version = "1.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" - -[[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 = "schannel" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - -[[package]] -name = "scoped-tls-hkt" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9603871ffe5df3ac39cb624790c296dbd47a400d202f56bf3e414045099524d" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sctk-adwaita" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" -dependencies = [ - "ab_glyph", - "log", - "memmap2", - "smithay-client-toolkit", - "tiny-skia", -] - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.8.0", - "core-foundation 0.9.4", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" - -[[package]] -name = "serde" -version = "1.0.217" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.217" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.138" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_repr" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_spanned" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -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 = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - -[[package]] -name = "simd-adler32" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" - -[[package]] -name = "simplecss" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9c6883ca9c3c7c90e888de77b7a5c849c779d25d74a1269b0218b14e8b136c" -dependencies = [ - "log", -] - -[[package]] -name = "siphasher" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" - -[[package]] -name = "skia-bindings" -version = "0.78.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29880a81b088de322e9c5306236c70761a61b5fa4df3c15c93bad3ce890ce34c" -dependencies = [ - "bindgen", - "cc", - "flate2", - "heck", - "lazy_static", - "regex", - "serde_json", - "tar", - "toml", -] - -[[package]] -name = "skia-safe" -version = "0.78.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f15700ac678c06649077495acbba07e7ae01e5ca46b7dc18213f2c3477ada71" -dependencies = [ - "bitflags 2.8.0", - "lazy_static", - "skia-bindings", - "windows 0.58.0", -] - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "slint" -version = "1.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efa626dc7a30a6685e00a5aae5b3c3927a36fae133313127b4e6eeb4cbb01f89" -dependencies = [ - "const-field-offset", - "i-slint-backend-qt", - "i-slint-backend-selector", - "i-slint-core", - "i-slint-core-macros", - "i-slint-renderer-femtovg", - "num-traits", - "once_cell", - "pin-weak", - "slint-macros", - "vtable", -] - -[[package]] -name = "slint-build" -version = "1.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5622b9842b52881c1f60b2c97dae0865867f403ca0037b086bdaeec7e90e5ae2" -dependencies = [ - "derive_more", - "i-slint-compiler", - "i-slint-core-macros", - "spin_on", - "toml_edit", -] - -[[package]] -name = "slint-macros" -version = "1.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cec1ff842824b5b236d6728bc3d5ca75737470dba646bb7600e3996f6ef95f9c" -dependencies = [ - "i-slint-compiler", - "proc-macro2", - "quote", - "spin_on", -] - -[[package]] -name = "slotmap" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" -dependencies = [ - "version_check", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "smithay-client-toolkit" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" -dependencies = [ - "bitflags 2.8.0", - "calloop 0.13.0", - "calloop-wayland-source", - "cursor-icon", - "libc", - "log", - "memmap2", - "rustix", - "thiserror 1.0.69", - "wayland-backend", - "wayland-client", - "wayland-csd-frame", - "wayland-cursor", - "wayland-protocols", - "wayland-protocols-wlr", - "wayland-scanner", - "xkeysym", -] - -[[package]] -name = "smithay-clipboard" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc8216eec463674a0e90f29e0ae41a4db573ec5b56b1c6c1c71615d249b6d846" -dependencies = [ - "libc", - "smithay-client-toolkit", - "wayland-backend", -] - -[[package]] -name = "smol_str" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" -dependencies = [ - "serde", -] - -[[package]] -name = "smol_str" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9676b89cd56310a87b93dec47b11af744f34d5fc9f367b829474eec0a891350d" -dependencies = [ - "borsh", - "serde", -] - -[[package]] -name = "socket2" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "softbuffer" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18051cdd562e792cad055119e0cdb2cfc137e44e3987532e0f9659a77931bb08" -dependencies = [ - "as-raw-xcb-connection", - "bytemuck", - "cfg_aliases", - "core-graphics 0.24.0", - "fastrand", - "foreign-types 0.5.0", - "js-sys", - "log", - "memmap2", - "objc2 0.5.2", - "objc2-foundation 0.2.2", - "objc2-quartz-core 0.2.2", - "raw-window-handle", - "redox_syscall 0.5.8", - "rustix", - "tiny-xlib", - "wasm-bindgen", - "wayland-backend", - "wayland-client", - "wayland-sys", - "web-sys", - "windows-sys 0.59.0", - "x11rb", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "spin_on" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "076e103ed41b9864aa838287efe5f4e3a7a0362dd00671ae62a212e5e4612da2" -dependencies = [ - "pin-utils", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "strict-num" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" -dependencies = [ - "float-cmp", -] - -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "svgtypes" -version = "0.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" -dependencies = [ - "kurbo", - "siphasher", -] - -[[package]] -name = "syn" -version = "2.0.98" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" -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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "sys-locale" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" -dependencies = [ - "libc", -] - -[[package]] -name = "system-configuration" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" -dependencies = [ - "bitflags 2.8.0", - "core-foundation 0.9.4", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "tar" -version = "0.4.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6" -dependencies = [ - "filetime", - "libc", - "xattr", -] - -[[package]] -name = "tauri-winres" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56eaa45f707bedf34d19312c26d350bc0f3c59a47e58e8adbeecdc850d2c13a0" -dependencies = [ - "embed-resource", - "toml", -] - -[[package]] -name = "tauri-winrt-notification" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f89f5fb70d6f62381f5d9b2ba9008196150b40b75f3068eb24faeddf1c686871" -dependencies = [ - "quick-xml 0.31.0", - "windows 0.56.0", - "windows-version", -] - -[[package]] -name = "tempfile" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" -dependencies = [ - "cfg-if", - "fastrand", - "getrandom 0.3.1", - "once_cell", - "rustix", - "windows-sys 0.59.0", -] - -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "text-size" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f18aa187839b2bdb1ad2fa35ead8c4c2976b64e4363c386d45ac0f7ee85c9233" - -[[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.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" -dependencies = [ - "thiserror-impl 2.0.11", -] - -[[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", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tiff" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" -dependencies = [ - "flate2", - "jpeg-decoder", - "weezl", -] - -[[package]] -name = "time" -version = "0.3.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" -dependencies = [ - "deranged", - "num-conv", - "powerfmt", - "serde", - "time-core", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "tiny-skia" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" -dependencies = [ - "arrayref", - "arrayvec", - "bytemuck", - "cfg-if", - "log", - "png", - "tiny-skia-path", -] - -[[package]] -name = "tiny-skia-path" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" -dependencies = [ - "arrayref", - "bytemuck", - "strict-num", -] - -[[package]] -name = "tiny-xlib" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0324504befd01cab6e0c994f34b2ffa257849ee019d3fb3b64fb2c858887d89e" -dependencies = [ - "as-raw-xcb-connection", - "ctor-lite", - "libloading", - "pkg-config", - "tracing", -] - -[[package]] -name = "tinystr" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinyvec" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" -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.43.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "pin-project-lite", - "socket2", - "windows-sys 0.52.0", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.22.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02a8b472d1a3d7c18e2d61a489aee3453fd9031c33e4f55bd533f4a7adca1bee" -dependencies = [ - "indexmap", - "serde", - "serde_spanned", - "toml_datetime", - "winnow", -] - -[[package]] -name = "tower" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", -] - -[[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.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tracing-core" -version = "0.1.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" -dependencies = [ - "once_cell", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "ttf-parser" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c591d83f69777866b9126b24c6dd9a18351f177e49d625920d19f989fd31cf8" - -[[package]] -name = "ttf-parser" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be21190ff5d38e8b4a2d3b6a3ae57f612cc39c96e83cedeaf7abc338a8bac4a" -dependencies = [ - "core_maths", -] - -[[package]] -name = "ttf-parser" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" -dependencies = [ - "core_maths", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "udev" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af4e37e9ea4401fc841ff54b9ddfc9be1079b1e89434c1a6a865dd68980f7e9f" -dependencies = [ - "io-lifetimes", - "libc", - "libudev-sys", - "pkg-config", -] - -[[package]] -name = "uds_windows" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" -dependencies = [ - "memoffset", - "tempfile", - "winapi", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" - -[[package]] -name = "unicode-bidi-mirroring" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64af057ad7466495ca113126be61838d8af947f41d93a949980b2389a118082f" - -[[package]] -name = "unicode-bidi-mirroring" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfa6e8c60bb66d49db113e0125ee8711b7647b5579dc7f5f19c42357ed039fe" - -[[package]] -name = "unicode-ccc" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "260bc6647b3893a9a90668360803a15f96b85a5257b1c3a0c3daf6ae2496de42" - -[[package]] -name = "unicode-ccc" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce61d488bcdc9bc8b5d1772c404828b17fc481c0a582b5581e95fb233aef503e" - -[[package]] -name = "unicode-ident" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" - -[[package]] -name = "unicode-linebreak" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" - -[[package]] -name = "unicode-properties" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" - -[[package]] -name = "unicode-script" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb421b350c9aff471779e262955939f565ec18b86c15364e6bdf0d662ca7c1f" - -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - -[[package]] -name = "unicode-vo" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "usvg" -version = "0.44.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7447e703d7223b067607655e625e0dbca80822880248937da65966194c4864e6" -dependencies = [ - "base64", - "data-url", - "flate2", - "fontdb", - "imagesize", - "kurbo", - "log", - "pico-args", - "roxmltree", - "rustybuzz 0.18.0", - "simplecss", - "siphasher", - "strict-num", - "svgtypes", - "tiny-skia-path", - "unicode-bidi", - "unicode-script", - "unicode-vo", - "xmlwriter", -] - -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3b17ae1f6c8a2b28506cd96d412eebf83b4a0ff2cbefeeb952f2f9dfa44ba18" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "vtable" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20b14a049c8d5d1ff811a00f65ac1454335487ed769a943c7bad89ead3573335" -dependencies = [ - "const-field-offset", - "portable-atomic", - "stable_deref_trait", - "vtable-macro", -] - -[[package]] -name = "vtable-macro" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8502f961cf2f1359fed21a70f67c831ccb3ab9e4c0b4dd3ad40387fbe8875db" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[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.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasi" -version = "0.13.3+wasi-0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" -dependencies = [ - "wit-bindgen-rt", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wayland-backend" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7208998eaa3870dad37ec8836979581506e0c5c64c20c9e79e9d2a10d6f47bf" -dependencies = [ - "cc", - "downcast-rs", - "rustix", - "scoped-tls", - "smallvec", - "wayland-sys", -] - -[[package]] -name = "wayland-client" -version = "0.31.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2120de3d33638aaef5b9f4472bff75f07c56379cf76ea320bd3a3d65ecaf73f" -dependencies = [ - "bitflags 2.8.0", - "rustix", - "wayland-backend", - "wayland-scanner", -] - -[[package]] -name = "wayland-csd-frame" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" -dependencies = [ - "bitflags 2.8.0", - "cursor-icon", - "wayland-backend", -] - -[[package]] -name = "wayland-cursor" -version = "0.31.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a93029cbb6650748881a00e4922b076092a6a08c11e7fbdb923f064b23968c5d" -dependencies = [ - "rustix", - "wayland-client", - "xcursor", -] - -[[package]] -name = "wayland-protocols" -version = "0.32.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0781cf46869b37e36928f7b432273c0995aa8aed9552c556fb18754420541efc" -dependencies = [ - "bitflags 2.8.0", - "wayland-backend", - "wayland-client", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols-plasma" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ccaacc76703fefd6763022ac565b590fcade92202492381c95b2edfdf7d46b3" -dependencies = [ - "bitflags 2.8.0", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols-wlr" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248a02e6f595aad796561fa82d25601bd2c8c3b145b1c7453fc8f94c1a58f8b2" -dependencies = [ - "bitflags 2.8.0", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-scanner", -] - -[[package]] -name = "wayland-scanner" -version = "0.31.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484" -dependencies = [ - "proc-macro2", - "quick-xml 0.37.2", - "quote", -] - -[[package]] -name = "wayland-sys" -version = "0.31.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbcebb399c77d5aa9fa5db874806ee7b4eba4e73650948e8f93963f128896615" -dependencies = [ - "dlib", - "log", - "once_cell", - "pkg-config", -] - -[[package]] -name = "web-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.26.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "weezl" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" - -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix", -] - -[[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.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" -dependencies = [ - "windows-sys 0.59.0", -] - -[[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 = "windows" -version = "0.51.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9" -dependencies = [ - "windows-core 0.51.1", - "windows-targets 0.48.5", -] - -[[package]] -name = "windows" -version = "0.56.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1de69df01bdf1ead2f4ac895dc77c9351aefff65b2f3db429a343f9cbf05e132" -dependencies = [ - "windows-core 0.56.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" -dependencies = [ - "windows-core 0.58.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.51.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.56.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4698e52ed2d08f8658ab0c39512a7c00ee5fe2688c65f8c0a4f06750d729f2a6" -dependencies = [ - "windows-implement 0.56.0", - "windows-interface 0.56.0", - "windows-result 0.1.2", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" -dependencies = [ - "windows-implement 0.58.0", - "windows-interface 0.58.0", - "windows-result 0.2.0", - "windows-strings", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-implement" -version = "0.56.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "windows-implement" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "windows-interface" -version = "0.56.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "windows-interface" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "windows-registry" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" -dependencies = [ - "windows-result 0.2.0", - "windows-strings", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-result" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-result" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-strings" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" -dependencies = [ - "windows-result 0.2.0", - "windows-targets 0.52.6", -] - -[[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.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[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-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.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[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 0.52.6", - "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-targets" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" -dependencies = [ - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", -] - -[[package]] -name = "windows-version" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c12476c23a74725c539b24eae8bfc0dac4029c39cdb561d9f23616accd4ae26d" -dependencies = [ - "windows-targets 0.53.0", -] - -[[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.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[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_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" - -[[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.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" - -[[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.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[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_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" - -[[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_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" - -[[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.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" - -[[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.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[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_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" - -[[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.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[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_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" - -[[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.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" - -[[package]] -name = "winit" -version = "0.30.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a809eacf18c8eca8b6635091543f02a5a06ddf3dad846398795460e6e0ae3cc0" -dependencies = [ - "ahash", - "android-activity", - "atomic-waker", - "bitflags 2.8.0", - "block2", - "bytemuck", - "calloop 0.13.0", - "cfg_aliases", - "concurrent-queue", - "core-foundation 0.9.4", - "core-graphics 0.23.2", - "cursor-icon", - "dpi", - "js-sys", - "libc", - "memmap2", - "ndk", - "objc2 0.5.2", - "objc2-app-kit", - "objc2-foundation 0.2.2", - "objc2-ui-kit", - "orbclient", - "percent-encoding", - "pin-project", - "raw-window-handle", - "redox_syscall 0.4.1", - "rustix", - "sctk-adwaita", - "smithay-client-toolkit", - "smol_str 0.2.2", - "tracing", - "unicode-segmentation", - "wasm-bindgen", - "wasm-bindgen-futures", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-protocols-plasma", - "web-sys", - "web-time", - "windows-sys 0.52.0", - "x11-dl", - "x11rb", - "xkbcommon-dl", -] - -[[package]] -name = "winnow" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86e376c75f4f43f44db463cf729e0d3acbf954d13e22c51e26e4c264b4ab545f" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[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 = "wio" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5" -dependencies = [ - "winapi", -] - -[[package]] -name = "wit-bindgen-rt" -version = "0.33.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" -dependencies = [ - "bitflags 2.8.0", -] - -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - -[[package]] -name = "writeable" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" - -[[package]] -name = "x11-clipboard" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "662d74b3d77e396b8e5beb00b9cad6a9eccf40b2ef68cc858784b14c41d535a3" -dependencies = [ - "libc", - "x11rb", -] - -[[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 = "x11rb" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" -dependencies = [ - "as-raw-xcb-connection", - "gethostname", - "libc", - "libloading", - "once_cell", - "rustix", - "x11rb-protocol", -] - -[[package]] -name = "x11rb-protocol" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" - -[[package]] -name = "xattr" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e105d177a3871454f754b33bb0ee637ecaaac997446375fd3e5d43a2ed00c909" -dependencies = [ - "libc", - "linux-raw-sys 0.4.15", - "rustix", -] - -[[package]] -name = "xcursor" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef33da6b1660b4ddbfb3aef0ade110c8b8a781a3b6382fa5f2b5b040fd55f61" - -[[package]] -name = "xdg-home" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "xkbcommon" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d66ca9352cbd4eecbbc40871d8a11b4ac8107cfc528a6e14d7c19c69d0e1ac9" -dependencies = [ - "libc", - "memmap2", - "xkeysym", -] - -[[package]] -name = "xkbcommon-dl" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" -dependencies = [ - "bitflags 2.8.0", - "dlib", - "log", - "once_cell", - "xkeysym", -] - -[[package]] -name = "xkeysym" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" - -[[package]] -name = "xml-rs" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" - -[[package]] -name = "xmlwriter" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" - -[[package]] -name = "yoke" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - -[[package]] -name = "zbus" -version = "4.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" -dependencies = [ - "async-broadcast", - "async-executor", - "async-fs", - "async-io", - "async-lock", - "async-process", - "async-recursion", - "async-task", - "async-trait", - "blocking", - "enumflags2", - "event-listener", - "futures-core", - "futures-sink", - "futures-util", - "hex", - "nix", - "ordered-stream", - "rand", - "serde", - "serde_repr", - "sha1", - "static_assertions", - "tracing", - "uds_windows", - "windows-sys 0.52.0", - "xdg-home", - "zbus_macros 4.4.0", - "zbus_names 3.0.0", - "zvariant 4.2.0", -] - -[[package]] -name = "zbus" -version = "5.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbddd8b6cb25d5d8ec1b23277b45299a98bfb220f1761ca11e186d5c702507f8" -dependencies = [ - "async-broadcast", - "async-executor", - "async-fs", - "async-io", - "async-lock", - "async-process", - "async-recursion", - "async-task", - "async-trait", - "blocking", - "enumflags2", - "event-listener", - "futures-core", - "futures-util", - "hex", - "nix", - "ordered-stream", - "serde", - "serde_repr", - "static_assertions", - "tracing", - "uds_windows", - "windows-sys 0.59.0", - "winnow", - "xdg-home", - "zbus_macros 5.4.0", - "zbus_names 4.2.0", - "zvariant 5.4.0", -] - -[[package]] -name = "zbus-lockstep" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca2c5dceb099bddaade154055c926bb8ae507a18756ba1d8963fd7b51d8ed1d" -dependencies = [ - "zbus_xml", - "zvariant 4.2.0", -] - -[[package]] -name = "zbus-lockstep-macros" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "709ab20fc57cb22af85be7b360239563209258430bccf38d8b979c5a2ae3ecce" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "zbus-lockstep", - "zbus_xml", - "zvariant 4.2.0", -] - -[[package]] -name = "zbus_macros" -version = "4.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", - "zvariant_utils 2.1.0", -] - -[[package]] -name = "zbus_macros" -version = "5.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac404d48b4e9cf193c8b49589f3280ceca5ff63519e7e64f55b4cf9c47ce146" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", - "zbus_names 4.2.0", - "zvariant 5.4.0", - "zvariant_utils 3.2.0", -] - -[[package]] -name = "zbus_names" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" -dependencies = [ - "serde", - "static_assertions", - "zvariant 4.2.0", -] - -[[package]] -name = "zbus_names" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" -dependencies = [ - "serde", - "static_assertions", - "winnow", - "zvariant 5.4.0", -] - -[[package]] -name = "zbus_xml" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3f374552b954f6abb4bd6ce979e6c9b38fb9d0cd7cc68a7d796e70c9f3a233" -dependencies = [ - "quick-xml 0.30.0", - "serde", - "static_assertions", - "zbus_names 3.0.0", - "zvariant 4.2.0", -] - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "byteorder", - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zerofrom" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" - -[[package]] -name = "zerovec" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zune-inflate" -version = "0.2.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "zvariant" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" -dependencies = [ - "endi", - "enumflags2", - "serde", - "static_assertions", - "url", - "zvariant_derive 4.2.0", -] - -[[package]] -name = "zvariant" -version = "5.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2df9ee044893fcffbdc25de30546edef3e32341466811ca18421e3cd6c5a3ac" -dependencies = [ - "endi", - "enumflags2", - "serde", - "static_assertions", - "winnow", - "zvariant_derive 5.4.0", - "zvariant_utils 3.2.0", -] - -[[package]] -name = "zvariant_derive" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", - "zvariant_utils 2.1.0", -] - -[[package]] -name = "zvariant_derive" -version = "5.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74170caa85b8b84cc4935f2d56a57c7a15ea6185ccdd7eadb57e6edd90f94b2f" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", - "zvariant_utils 3.2.0", -] - -[[package]] -name = "zvariant_utils" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zvariant_utils" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34" -dependencies = [ - "proc-macro2", - "quote", - "serde", - "static_assertions", - "syn", - "winnow", -] diff --git a/src-setup/Cargo.toml b/src-setup/Cargo.toml deleted file mode 100644 index 0a204b4..0000000 --- a/src-setup/Cargo.toml +++ /dev/null @@ -1,46 +0,0 @@ -[package] -name = "ahqstore_setup_amd64" -version = "2.1.0" -edition = "2021" -repository = "https://github.com/ahqstore/client" -homepage = "https://ahqstore.github.io/" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -dirs = "6" -i-slint-backend-winit = "1.9" -lazy_static = "1" -open = "5" -reqwest = { version = "0.12.5", features = ["json", "rustls-tls"] } -serde = { version = "1.0.206", features = ["derive"] } -slint = "1" -tokio = { version = "1", features = ["rt"] } - -[target.'cfg(unix)'.dependencies] -notify-rust = "4" - -[target.'cfg(all(unix, any(target_arch = "aarch64", target_arch = "arm")))'.dependencies] -openssl = { version = "*", features = ["vendored"] } -openssl-sys = { version = "*", features = ["vendored"] } - -[target.'cfg(windows)'.dependencies] -check_elevation = "0.2.4" -winreg = "0.55" - -[target.'cfg(windows)'.build-dependencies] -tauri-winres = "0.3" - -[build-dependencies] -slint-build = "1" - -[profile.release] -panic = "abort" -codegen-units = 1 -lto = true -opt-level = "s" -strip = true - -[package.metadata.tauri-winres] -LegalCopyright = "© AHQ Softwares | Non Profit Organization" -OriginalFilename = "ahqstore_setup_amd64.exe" diff --git a/src-setup/build.rs b/src-setup/build.rs deleted file mode 100644 index 1a4f848..0000000 --- a/src-setup/build.rs +++ /dev/null @@ -1,10 +0,0 @@ -fn main() { - slint_build::compile("ui/index.slint").unwrap(); - - #[cfg(windows)] - { - let mut res = tauri_winres::WindowsResource::new(); - res.set_icon("icon.ico"); - res.compile().unwrap(); - } -} diff --git a/src-setup/icon.ico b/src-setup/icon.ico deleted file mode 100644 index e0ed222..0000000 Binary files a/src-setup/icon.ico and /dev/null differ diff --git a/src-setup/rust-toolchain.toml b/src-setup/rust-toolchain.toml deleted file mode 100644 index a25e7e0..0000000 --- a/src-setup/rust-toolchain.toml +++ /dev/null @@ -1,3 +0,0 @@ -[toolchain] -channel = "nightly" - diff --git a/src-setup/rustfmt.toml b/src-setup/rustfmt.toml deleted file mode 100644 index b196eaa..0000000 --- a/src-setup/rustfmt.toml +++ /dev/null @@ -1 +0,0 @@ -tab_spaces = 2 diff --git a/src-setup/src/center.rs b/src-setup/src/center.rs deleted file mode 100644 index 3157a90..0000000 --- a/src-setup/src/center.rs +++ /dev/null @@ -1,48 +0,0 @@ -// Thanks @prof79 -// -// Code Snippet from: -// -// https://github.com/prof79/slint-center-window/blob/main/src/winit_helper.rs - -use i_slint_backend_winit::winit::dpi::PhysicalPosition; -use i_slint_backend_winit::winit::monitor::MonitorHandle; -use i_slint_backend_winit::winit::window::Window; -use i_slint_backend_winit::WinitWindowAccessor; - -pub fn hide(window: &slint::Window) { - if window.has_winit_window() { - window.with_winit_window(|window| { - window.set_visible(false); - }); - } -} - -pub fn center_window(window: &slint::Window) { - if window.has_winit_window() { - window.with_winit_window(|window: &Window| { - match window.current_monitor() { - Some(monitor) => set_centered(window, &monitor), - None => (), - }; - - None as Option<()> - }); - } -} - -fn set_centered(window: &Window, monitor: &MonitorHandle) { - let window_size = window.outer_size(); - - let monitor_size = monitor.size(); - let monitor_position = monitor.position(); - - let mut monitor_window_position = PhysicalPosition { x: 0, y: 0 }; - - monitor_window_position.x = (monitor_position.x as f32 + (monitor_size.width as f32 * 0.5) - - (window_size.width as f32 * 0.5)) as i32; - - monitor_window_position.y = (monitor_position.y as f32 + (monitor_size.height as f32 * 0.5) - - (window_size.height as f32 * 0.5)) as i32; - - window.set_outer_position(monitor_window_position); -} diff --git a/src-setup/src/elevate.rs b/src-setup/src/elevate.rs deleted file mode 100644 index f3c420b..0000000 --- a/src-setup/src/elevate.rs +++ /dev/null @@ -1,69 +0,0 @@ -#[cfg(windows)] -use std::{ - env::current_exe, - process::{self, Command}, -}; - -#[cfg(windows)] -use check_elevation::is_elevated; -#[cfg(windows)] -use std::os::windows::process::CommandExt; - -use crate::InstallMode; - -#[cfg(windows)] -fn place_bin_in_temp() -> String { - let mut temp_file = std::env::temp_dir(); - - std::fs::create_dir_all(&temp_file).unwrap(); - - temp_file.push("uninstall.exe"); - - let exe = current_exe().unwrap(); - let exe = exe.to_string_lossy(); - let exe = exe.to_string(); - - std::fs::copy(&exe, &temp_file).unwrap(); - - temp_file.to_string_lossy().to_string() -} - -#[cfg(not(windows))] -pub fn relaunch_if_needed(_: &InstallMode) {} - -#[cfg(windows)] -pub fn relaunch_if_needed(update: &InstallMode) { - let exe = current_exe().unwrap(); - let exe = exe.to_string_lossy(); - - let (wait, exe): (bool, String) = - if matches!(update, &InstallMode::Uninstall) && !exe.ends_with("uninstall.exe") { - (false, place_bin_in_temp()) - } else { - (true, format!("{exe}")) - }; - - if !is_elevated().unwrap_or(false) { - let mut cmd = Command::new("powershell"); - let cmd = cmd.creation_flags(0x08000000); - let cmd = cmd.args(["start-process", "-FilePath"]); - let cmd = cmd.arg(format!("\"{exe}\"")); - - if wait { - cmd.arg("-wait"); - } - - if matches!(update, &InstallMode::Install) { - cmd.arg("-args 'update'"); - } else if matches!(update, &InstallMode::InstallPR) { - cmd.arg("-args 'update-pr'"); - } else if matches!(update, &InstallMode::Uninstall) { - cmd.arg("-args 'uninstall'"); - } - cmd.arg("-verb runas"); - - cmd.spawn().unwrap().wait().unwrap(); - - process::exit(0); - } -} diff --git a/src-setup/src/install/deb.rs b/src-setup/src/install/deb.rs deleted file mode 100644 index b90df98..0000000 --- a/src-setup/src/install/deb.rs +++ /dev/null @@ -1,65 +0,0 @@ -use crate::utils::get_service_dir; -use std::{ - io::Write, - process::{Child, Command, Stdio}, -}; - -pub fn get_sudo() -> Child { - println!("Running pxexec"); - let child = Command::new("pkexec") - .args(["sudo", "-i"]) - .stdin(Stdio::piped()) - .spawn() - .unwrap(); - - child -} - -pub fn install_deb(child: &mut Child, path: &str) { - let stdin = child.stdin.as_mut(); - let stdin = stdin.unwrap(); - - let data = format!("sudo apt install {:?}\n", &path); - - let _ = stdin.write_all(data.as_bytes()); - let _ = stdin.flush(); -} - -pub fn install_daemon(child: &mut Child, service: String) { - let stdin = child.stdin.as_mut(); - let stdin = stdin.unwrap(); - - let perma_service = get_service_dir(); - - let data = format!( - "cp {} {}\nrm {}\nchmod -R u+rwx /ahqstore\n", - &service, &perma_service, &service - ); - let _ = stdin.write_all(data.as_bytes()); - - let file = format!( - r"[Unit] -Description=AHQ Store Service - -[Service] -User=root -WorkingDirectory=/ahqstore -ExecStart=/ahqstore/service -Restart=always - -[Install] -WantedBy=multi-user.target" - ); - - let data = format!("echo {file:?} > /etc/systemd/system/ahqstore.service\nsystemctl daemon-reload\nsystemctl enable ahqstore.service\nsystemctl start ahqstore.service\n"); - let _ = stdin.write_all(data.as_bytes()); -} - -pub fn exit(mut child: Child) { - let stdin = child.stdin.as_mut(); - let stdin = stdin.unwrap(); - let _ = stdin.write_all(b"exit\n"); - let _ = stdin.flush(); - - let _ = child.wait(); -} diff --git a/src-setup/src/install/download.rs b/src-setup/src/install/download.rs deleted file mode 100644 index 213353e..0000000 --- a/src-setup/src/install/download.rs +++ /dev/null @@ -1,30 +0,0 @@ -use std::{fs, io::Write}; - -use reqwest::Client; - -pub async fn download(client: &mut Client, url: &str, path: &str, mut call: T) { - let _ = fs::remove_file(&path); - - println!("Path: {}", &path); - let mut response = client.get(url).send().await.unwrap(); - - let mut c = 0; - let t = (response.content_length().unwrap_or(10000)) as u64; - - let mut file = vec![]; - - let mut last = 0u64; - - while let Some(chunk) = response.chunk().await.unwrap() { - c += chunk.len(); - - if last != (c as u64 * 100) / t { - last = (c as u64 * 100) / t; - call(last as f32 / 100.0); - } - - file.write_all(&chunk.to_vec()).unwrap(); - } - - fs::write(path, file).unwrap(); -} diff --git a/src-setup/src/install/fetch.rs b/src-setup/src/install/fetch.rs deleted file mode 100644 index 9e3c596..0000000 --- a/src-setup/src/install/fetch.rs +++ /dev/null @@ -1,104 +0,0 @@ -use crate::InstallMode; -use reqwest::{Client, ClientBuilder}; -use serde::{Deserialize, Serialize}; -use std::env::consts::ARCH; - -#[derive(Serialize, Deserialize)] -struct Release { - pub prerelease: bool, - pub tag_name: String, - pub assets: Vec, -} - -#[derive(Serialize, Deserialize)] -struct Asset { - pub name: String, - pub browser_download_url: String, -} - -#[derive(Default, Debug)] -pub struct ReleaseData { - pub msi: String, - pub service: String, - pub linux_daemon: String, - pub deb: String, - pub windows_user_runner: String, -} - -macro_rules! arch { - ($x:expr, $y:expr) => { - (ARCH == "x86_64" && $x) || (ARCH == "aarch64" && $y) - }; -} - -pub async fn fetch(install: &InstallMode) -> (Client, ReleaseData) { - let client: Client = ClientBuilder::new() - .user_agent("AHQ Store / Installer") - .build() - .unwrap(); - - let pre = matches!(install, &InstallMode::InstallPR); - - let url = if pre { - "https://api.github.com/repos/ahqsoftwares/tauri-ahq-store/releases" - } else { - "https://api.github.com/repos/ahqsoftwares/tauri-ahq-store/releases/latest" - }; - - let release = { - if pre { - let release = client - .get(url) - .send() - .await - .unwrap() - .json::>() - .await - .unwrap(); - - release.into_iter().find(|x| x.prerelease).unwrap() - } else { - client - .get(url) - .send() - .await - .unwrap() - .json::() - .await - .unwrap() - } - }; - - let mut data = ReleaseData::default(); - - release.assets.into_iter().for_each(|x| { - if arch!( - x.name.ends_with("x64_en-US.msi"), - x.name.ends_with("arm64_en-US.msi") - ) { - data.msi = x.browser_download_url; - } else if arch!( - x.name.ends_with("amd64.deb"), - x.name.ends_with("unsupported.deb") - ) { - data.deb = x.browser_download_url; - } else if arch!( - &x.name == "ahqstore_service_amd64.exe", - &x.name == "ahqstore_service_arm64.exe" - ) { - data.service = x.browser_download_url; - } else if arch!( - &x.name == "ahqstore_service_amd64", - &x.name == "unsupported_ahqstore_service_arm64" - ) { - data.linux_daemon = x.browser_download_url; - } else if arch!( - &x.name == "ahqstore_user_daemon_amd64.exe", - &x.name == "ahqstore_user_daemon_arm64.exe" - ) { - data.windows_user_runner = x.browser_download_url; - } - }); - - (client, data) -} diff --git a/src-setup/src/install/mod.rs b/src-setup/src/install/mod.rs deleted file mode 100644 index cd4f564..0000000 --- a/src-setup/src/install/mod.rs +++ /dev/null @@ -1,196 +0,0 @@ -#[cfg(unix)] -use notify_rust::Notification; -use slint::SharedString; -use std::{fs, thread, time::Duration}; - -use self::fetch::fetch; -use self::fetch::ReleaseData; -use crate::{utils::get_install, AppWindow, InstallMode}; -use reqwest::Client; - -mod download; -mod fetch; - -#[cfg(not(windows))] -mod deb; -#[cfg(windows)] -mod msi; -#[cfg(windows)] -pub mod regedit; - -use download::download; - -static mut WIN: Option = None; - -pub fn start_install(win: AppWindow, install: InstallMode) { - unsafe { WIN = Some(win) }; - - thread::spawn(move || { - let win = unsafe { std::mem::replace(&mut WIN, None).unwrap() }; - - win.set_msg(SharedString::from("Getting files ready...")); - - thread::sleep(Duration::from_secs(3)); - - let mut runtime = tokio::runtime::Builder::new_current_thread(); - let runtime = runtime.enable_all().build().unwrap(); - - runtime.block_on(async { - let (mut client, files) = fetch(&install).await; - - println!("{:?}", &files); - - plt_install(&win, &mut client, &files).await; - }); - }); -} - -#[cfg(not(windows))] -async fn plt_install(win: &AppWindow, client: &mut Client, files: &ReleaseData) { - use std::process; - - use crate::{ - install::deb::{exit, get_sudo, install_daemon, install_deb}, - utils::{get_service_dir, get_temp_service_dir}, - }; - - if &files.deb == "" { - Notification::new() - .summary("Uh Oh!") - .body("We were unable to find the linux build files, try toggling the Pre-Release Option") - .show() - .unwrap(); - - win.set_counter(-1.0); - win.set_msg("Install".into()); - return; - } - - win.set_msg("Downloading...".into()); - - let installer = get_install(); - let temp_service = get_temp_service_dir(); - - let _ = fs::remove_file(&installer); - - download(client, &files.deb, &installer, |perc| { - win.set_counter(perc); - }) - .await; - - thread::sleep(Duration::from_secs(1)); - win.set_counter(0.0); - thread::sleep(Duration::from_secs(3)); - - download(client, &files.linux_daemon, &temp_service, |perc| { - win.set_counter(perc); - }) - .await; - - thread::sleep(Duration::from_secs(2)); - win.set_indet(true); - - win.set_msg("Installing...".into()); - - let mut sudo = get_sudo(); - install_deb(&mut sudo, &installer); - install_daemon(&mut sudo, temp_service); - exit(sudo); - - thread::sleep(Duration::from_secs(1)); - - let _ = fs::remove_file(&installer); - win.set_msg("Installed 🎉".into()); - win.set_indet(false); - - thread::sleep(Duration::from_secs(5)); - process::exit(0); -} - -#[cfg(windows)] -async fn plt_install(win: &AppWindow, client: &mut Client, files: &ReleaseData) { - use std::{env::current_exe, process}; - - use crate::{ - install::msi::{install_msi, install_service}, - utils::{get_daemon, get_service_dir, kill_daemon, run_daemon}, - }; - - win.set_msg("Downloading...".into()); - - let installer = get_install(); - let service = get_service_dir(); - let daemon = get_daemon(); - - let _ = fs::remove_file(&installer); - - download(client, &files.msi, &installer, |perc| { - win.set_counter(perc); - }) - .await; - - thread::sleep(Duration::from_secs(1)); - - win.set_counter(0.0); - - thread::sleep(Duration::from_secs(3)); - - download(client, &files.service, &service, |perc| { - win.set_counter(perc); - }) - .await; - - win.set_counter(1.0); - - thread::sleep(Duration::from_millis(100)); - - win.set_counter(0.0); - - thread::sleep(Duration::from_millis(100)); - - kill_daemon(); - - if &files.windows_user_runner != "" { - download(client, &files.windows_user_runner, daemon, |perc| { - win.set_counter(perc); - }) - .await; - - win.set_counter(1.0); - - thread::sleep(Duration::from_millis(100)); - } - - win.set_indet(true); - - win.set_msg("Installing...".into()); - - regedit::create_association(); - - thread::sleep(Duration::from_secs(2)); - - install_msi(&installer); - - run_daemon(daemon); - - regedit::custom_uninstall(); - - thread::sleep(Duration::from_secs(3)); - - install_service(&service); - - thread::sleep(Duration::from_secs(1)); - - let _ = fs::remove_file(&installer); - - let _ = fs::write( - r"C:\Program Files\AHQ Store\uninstall.exe", - fs::read(current_exe().unwrap()).unwrap(), - ); - - win.set_msg("Installed 🎉".into()); - win.set_indet(false); - - thread::sleep(Duration::from_secs(5)); - process::exit(0); -} diff --git a/src-setup/src/install/msi.rs b/src-setup/src/install/msi.rs deleted file mode 100644 index bfa8ac7..0000000 --- a/src-setup/src/install/msi.rs +++ /dev/null @@ -1,44 +0,0 @@ -use std::os::windows::process::CommandExt; -use std::process::Command; - -pub fn install_msi(path: &str) { - Command::new("powershell") - .args([ - "start-process", - "-FilePath", - &format!("\"{}\"", &path), - "-Wait", - "-ArgumentList", - "/quiet, /passive, /norestart", - ]) - .creation_flags(0x08000000) - .spawn() - .unwrap() - .wait() - .unwrap(); -} - -pub fn install_service(path: &str) { - Command::new("sc.exe") - .creation_flags(0x08000000) - .args([ - "create", - "AHQ Store Service", - "start=", - "auto", - "binpath=", - path, - ]) - .spawn() - .unwrap() - .wait() - .unwrap(); - - Command::new("sc.exe") - .creation_flags(0x08000000) - .args(["start", "AHQ Store Service"]) - .spawn() - .unwrap() - .wait() - .unwrap(); -} diff --git a/src-setup/src/install/regedit.rs b/src-setup/src/install/regedit.rs deleted file mode 100644 index 088a8f1..0000000 --- a/src-setup/src/install/regedit.rs +++ /dev/null @@ -1,102 +0,0 @@ -use winreg::enums::*; -use winreg::RegKey; - -#[cfg(windows)] -pub fn create_association() -> Option<()> { - let root = RegKey::predef(HKEY_CLASSES_ROOT); - - let (key, _) = root.create_subkey("ahqstore").ok()?; - key.set_value("", &"AHQ Store").ok()?; - - let (icon, _) = key.create_subkey("DefaultIcon").ok()?; - icon - .set_value("", &r"C:\Program Files\AHQ Store\ahq-store-app.exe,0") - .ok()?; - - let (shell, _) = key.create_subkey("shell").ok()?; - let (shell, _) = shell.create_subkey("open").ok()?; - let (shell, _) = shell.create_subkey("command").ok()?; - shell - .set_value( - "", - &r#""C:\Program Files\AHQ Store\ahq-store-app.exe" protocol %1"#, - ) - .ok()?; - - Some(()) -} - -#[cfg(windows)] -pub fn custom_uninstall() -> Option<()> { - use std::fs; - - let root = RegKey::predef(HKEY_LOCAL_MACHINE); - - let key = root.open_subkey("SOFTWARE").ok()?; - let key = key.open_subkey("Microsoft").ok()?; - let key = key.open_subkey("Windows").ok()?; - let key = key.open_subkey("CurrentVersion").ok()?; - let key = key - .open_subkey_with_flags("Uninstall", KEY_ALL_ACCESS) - .ok()?; - - let mut uninstall_str = String::default(); - - let unst = r#""C:\Program Files\AHQ Store\uninstall.exe" uninstall"#; - - key.enum_keys().for_each(|x| { - if let Ok(x) = x { - let debug_data = &x; - - if let Ok(key) = key.open_subkey_with_flags(&x, KEY_ALL_ACCESS) { - let name = key.get_value::("DisplayName"); - let uninstall = key.get_value::("UninstallString"); - - if let (Ok(x), Ok(y)) = (name, uninstall) { - if &x == "AHQ Store" { - println!("id {debug_data} Name {x}"); - key - .set_value( - "DisplayIcon", - &r"C:\Program Files\AHQ Store\ahq-store-app.exe,0", - ) - .unwrap(); - key.set_value("WindowsInstaller", &0u32).unwrap(); - key.set_value("UninstallString", &unst).unwrap(); - - if &y != unst { - uninstall_str = y; - } else { - uninstall_str = format!("{}", debug_data); - } - } - } - } - } - }); - - let uninstall_str = uninstall_str.to_lowercase(); - let uninstall_str = uninstall_str.replace("msiexec.exe /x", ""); - - fs::write(r"C:\Program Files\AHQ Store\unst", uninstall_str).ok() -} - -pub fn rem_reg(path: &str) -> Option<()> { - let root = RegKey::predef(HKEY_LOCAL_MACHINE); - - let key = root.open_subkey("SOFTWARE").ok()?; - let key = key.open_subkey("Microsoft").ok()?; - let key = key.open_subkey("Windows").ok()?; - let key = key.open_subkey("CurrentVersion").ok()?; - let key = key - .open_subkey_with_flags("Uninstall", KEY_ALL_ACCESS) - .ok()?; - - /// DANGER: NO NOT REMOVE - /// IF PATH == "", IT"LL BREAK THE SYSTEM - if path != "" && path.len() > 10 { - key.delete_subkey_all(path.to_uppercase()).ok() - } else { - None - } -} diff --git a/src-setup/src/main.rs b/src-setup/src/main.rs deleted file mode 100644 index 8610c19..0000000 --- a/src-setup/src/main.rs +++ /dev/null @@ -1,114 +0,0 @@ -#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] -#![allow(static_mut_refs, unused, dead_code)] - -slint::include_modules!(); - -use slint::{run_event_loop, CloseRequestResponse, ComponentHandle, SharedString}; -use std::{env::args, sync::Arc, thread, time::Duration}; - -mod center; -mod elevate; -mod install; - -mod uninstall; - -pub mod utils; - -#[derive(Debug, Clone, Copy)] -pub enum InstallMode { - None, - Uninstall, - Install, - InstallPR, -} - -fn main() -> Result<(), slint::PlatformError> { - let arg = args().collect::>(); - - let update = if arg.len() > 1 { - if &arg[1] == "uninstall" { - InstallMode::Uninstall - } else if &arg[1] == "update" { - InstallMode::Install - } else { - InstallMode::InstallPR - } - } else { - InstallMode::None - }; - - elevate::relaunch_if_needed(&update); - - let shall_we_update = !matches!(update, InstallMode::None); - - let splash = Splash::new().unwrap(); - center::center_window(splash.window()); - splash.show(); - - let splash_hwnd = splash.as_weak(); - - let ui = AppWindow::new()?; - center::center_window(ui.window()); - - let ui_hwnd = ui.as_weak(); - ui.window().hide(); - - std::thread::spawn(move || { - thread::sleep(Duration::from_secs( - if shall_we_update { - 1 - } else { - 5 - } - )); - splash_hwnd.upgrade_in_event_loop(|s| { - center::hide(s.window()); - }); - ui_hwnd.upgrade_in_event_loop(|f| { - f.show(); - }); - }); - - if !matches!(update, InstallMode::None) && !matches!(update, InstallMode::Uninstall) { - ui.set_counter(0.0); - ui.set_msg(SharedString::from("Updating...")); - ui.set_preview(matches!(update, InstallMode::InstallPR)); - - install::start_install(ui.clone_strong(), update); - } else if matches!(update, InstallMode::Uninstall) { - ui.set_uninstall(true); - ui.set_counter(0.0); - ui.set_msg(SharedString::from("Uninstalling...")); - ui.set_preview(false); - - uninstall::uninstall(ui.clone_strong()); - } - - ui.on_tos(|| { - let _ = open::that("https://ahqstore.github.io/tos"); - }); - ui.on_site(|| { - let _ = open::that("https://ahqstore.github.io"); - }); - ui.on_start_install({ - let ui_handle = ui.as_weak(); - move || { - let handle = ui_handle.unwrap(); - handle.set_counter(0.0); - let install_mode = if handle.get_preview() { - InstallMode::InstallPR - } else { - InstallMode::Install - }; - - install::start_install(handle, install_mode); - } - }); - - ui.window().on_close_requested(move || { - splash.hide(); - CloseRequestResponse::HideWindow - }); - - run_event_loop() -} diff --git a/src-setup/src/uninstall/mod.rs b/src-setup/src/uninstall/mod.rs deleted file mode 100644 index 478cca0..0000000 --- a/src-setup/src/uninstall/mod.rs +++ /dev/null @@ -1,67 +0,0 @@ -use slint::SharedString; -use std::{ - fs, mem, - process::{self, Command}, - thread, - time::Duration, -}; - -#[cfg(windows)] -use super::install::regedit::rem_reg; -#[cfg(windows)] -use crate::{install::regedit, AppWindow}; - -#[cfg(windows)] -use std::os::windows::process::CommandExt; - -#[cfg(windows)] -static mut WIN: Option = None; - -#[cfg(not(windows))] -pub fn uninstall(_: T) {} - -#[cfg(windows)] -pub fn uninstall(win: AppWindow) { - use crate::utils; - - unsafe { - WIN = Some(win); - }; - - thread::spawn(move || { - let win = unsafe { mem::replace(&mut WIN, None).unwrap() }; - - win.set_msg(SharedString::from("Getting files ready...")); - - thread::sleep(Duration::from_secs(3)); - - win.set_msg(SharedString::from("Uninstalling...")); - - let id = fs::read_to_string(r"C:\Program Files\AHQ Store\unst").unwrap(); - - let success = Command::new("msiexec.exe") - .arg("/qb+") - .arg(format!("/x{}", &id)) - .spawn() - .unwrap() - .wait() - .unwrap() - .success(); - - utils::kill_daemon(); - - fs::remove_dir_all(r"C:\Program Files\AHQ Store"); - let rem = fs::remove_file( - r"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\ahqstore_user_daemon.exe", - ); - println!("Err {:?}", rem.err()); - - println!("Success: {success}"); - regedit::rem_reg(&id); - - win.set_msg("Uninstalled 🎉".into()); - - thread::sleep(Duration::from_secs(5)); - process::exit(0); - }); -} diff --git a/src-setup/src/utils/mod.rs b/src-setup/src/utils/mod.rs deleted file mode 100644 index 449ce39..0000000 --- a/src-setup/src/utils/mod.rs +++ /dev/null @@ -1,117 +0,0 @@ -#[cfg(windows)] -use std::{os::windows::process::CommandExt, process::Command}; - -use dirs::home_dir; -use lazy_static::lazy_static; - -#[cfg(windows)] -lazy_static! { - pub static ref ROOT_DIR: String = std::env::var("SystemDrive").unwrap(); - pub static ref AHQSTORE_ROOT: String = format!( - "{}{}ProgramData{}AHQ Store Applications", - &*ROOT_DIR, &SEP, &SEP - ); -} - -#[cfg(unix)] -lazy_static! { - pub static ref ROOT_DIR: String = "/".into(); - pub static ref AHQSTORE_ROOT: String = "/ahqstore".into(); -} - -#[cfg(windows)] -static SEP: &'static str = "\\"; - -#[cfg(unix)] -static SEP: &'static str = "/"; - -lazy_static! { - pub static ref PROGRAMS: String = format!("{}{}Programs", &*AHQSTORE_ROOT, &SEP,); - pub static ref UPDATERS: String = format!("{}{}Updaters", &*AHQSTORE_ROOT, &SEP); - pub static ref INSTALLERS: String = format!("{}{}Installers", &*AHQSTORE_ROOT, &SEP); -} - -#[cfg(windows)] -pub fn get_daemon() -> &'static str { - r"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\ahqstore_user_daemon.exe" -} - -#[cfg(windows)] -pub fn kill_daemon() { - let _ = Command::new("taskkill.exe") - .arg("/F") - .arg("/IM") - .arg("ahqstore_user_daemon.exe") - .creation_flags(0x08000000) - .spawn() - .unwrap() - .wait() - .unwrap(); -} - -#[cfg(windows)] -pub fn run_daemon(path: &str) { - let _ = Command::new("powershell.exe") - .args(["start-process", "-FilePath"]) - .arg(format!("\"{}\"", &path)) - .creation_flags(0x08000000) - .spawn() - .unwrap() - .wait() - .unwrap(); -} - -pub fn get_install() -> String { - let mut path = home_dir().unwrap(); - #[cfg(windows)] - path.push("ahqstore.msi"); - - #[cfg(not(windows))] - path.push("ahqstore.deb"); - - path.to_str().unwrap().to_string() -} - -#[cfg(not(windows))] -pub fn get_temp_service_dir() -> String { - let mut path = home_dir().unwrap(); - - path.push("ahqstore_service"); - - path.to_str().unwrap().to_string() -} - -pub fn get_service_dir() -> String { - use std::fs; - #[cfg(windows)] - { - use std::{os::windows::process::CommandExt, process::Command}; - - Command::new("sc.exe") - .creation_flags(0x08000000) - .args(["stop", "AHQ Store Service"]) - .spawn() - .unwrap() - .wait() - .unwrap(); - - Command::new("sc.exe") - .creation_flags(0x08000000) - .args(["delete", "AHQ Store Service"]) - .spawn() - .unwrap() - .wait() - .unwrap(); - } - - let _ = fs::create_dir_all(&*AHQSTORE_ROOT); - let _ = fs::create_dir_all(&*PROGRAMS); - let _ = fs::create_dir_all(&*UPDATERS); - let _ = fs::create_dir_all(&*INSTALLERS); - - #[cfg(windows)] - return format!("{}\\ahqstore_service.exe", &*AHQSTORE_ROOT); - - #[cfg(unix)] - return format!("{}/ahqstore_service", &*AHQSTORE_ROOT); -} diff --git a/src-setup/ui/ahq.png b/src-setup/ui/ahq.png deleted file mode 100644 index dcdcfda..0000000 Binary files a/src-setup/ui/ahq.png and /dev/null differ diff --git a/src-setup/ui/ahq1.png b/src-setup/ui/ahq1.png deleted file mode 100644 index a485175..0000000 Binary files a/src-setup/ui/ahq1.png and /dev/null differ diff --git a/src-setup/ui/appWindow.slint b/src-setup/ui/appWindow.slint deleted file mode 100644 index 92c0ee6..0000000 --- a/src-setup/ui/appWindow.slint +++ /dev/null @@ -1,170 +0,0 @@ -import { Button, VerticalBox, HorizontalBox, ProgressIndicator, CheckBox, Palette, GridBox, ListView } from "std-widgets.slint"; - -export component AppWindow inherits Window { - max-height: 500px; - min-height: 500px; - min-width: 350px; - max-width: 350px; - icon: @image-url("logo.png"); - title: "AHQ Store Setup"; - in-out property counter: -1.0; - in-out property step: ""; - in-out property msg: "Installing..."; - in-out property preview: false; - in-out property indet: false; - in-out property uninstall: false; - callback start-install(); - callback tos(); - callback site(); - popup := PopupWindow { - height: 200px; - max-height: 200px; - min-height: 200px; - width: 300px; - min-width: 300px; - max-width: 300px; - x: 25px; - y: 150px; - Rectangle { - background: Palette.alternate-background; - drop-shadow-blur: 10.0px; - border-radius: 20px; - border-color: Palette.border; - border-width: 1px; - VerticalBox { - Text { - horizontal-alignment: TextHorizontalAlignment.center; - text: "Credits"; - font-size: 25px; - } - - ListView { - for data in [ - " • CD Icon by icons8.com", - " • Store app by AHQ & Org", - " • Made with slint" - ]: Text { - text: data; - font-size: 15px; - } - } - } - } - } - - VerticalBox { - height: 500px; - max-height: 500px; - min-height: 500px; - width: 400px; - min-width: 400px; - max-width: 400px; - padding-top: 25px; - padding-bottom: 50px; - padding-left: 5px; - padding-right: 5px; - HorizontalBox { - alignment: LayoutAlignment.center; - Image { - width: 75px; - height: 75px; - source: @image-url("icon.png"); - } - } - - Text { - horizontal-alignment: TextHorizontalAlignment.center; - font-size: 30px; - font-weight: 100; - text: "AHQ Store"; - } - - VerticalBox { - alignment: LayoutAlignment.stretch; - HorizontalBox { - alignment: LayoutAlignment.center; - CheckBox { - checked: uninstall ? true : root.preview; - text: uninstall ? "Uninstall" : "Install Prerelease"; - enabled: counter == -1.0; - toggled => { - root.preview = !root.preview; - } - } - } - - HorizontalBox { - alignment: LayoutAlignment.center; - Text { - height: 50px; - font-size: 20px; - text: root.step; - } - } - - HorizontalBox { - alignment: LayoutAlignment.center; - ProgressIndicator { - width: 300px; - height: 2px; - progress: !root.indet ? root.counter : -1.0; - indeterminate: root.indet; - } - } - - HorizontalBox { - alignment: LayoutAlignment.center; - Button { - height: 30px; - width: 240px; - primary: true; - text: counter == -1.0 ? "Install" : root.msg; - enabled: counter == -1.0; - clicked => { - root.start-install(); - } - } - } - - VerticalBox { - alignment: LayoutAlignment.center; - HorizontalBox { - alignment: LayoutAlignment.center; - Button { - height: 30px; - width: 75px; - text: "Credits"; - clicked => { - popup.show(); - } - } - - Button { - height: 30px; - width: 75px; - text: "TOS"; - clicked => { - root.tos(); - } - } - - Button { - height: 30px; - width: 75px; - text: "Website"; - clicked => { - root.site(); - } - } - } - - HorizontalBox { - alignment: LayoutAlignment.center; - Text { - text: uninstall ? "Please wait while we uninstall" : "By installing, you agree to our terms of service"; - } - } - } - } - } -} diff --git a/src-setup/ui/index.slint b/src-setup/ui/index.slint deleted file mode 100644 index 5c153c8..0000000 --- a/src-setup/ui/index.slint +++ /dev/null @@ -1,7 +0,0 @@ -import { AppWindow } from "appWindow.slint"; -import { Splash } from "splash.slint"; - -export { - AppWindow, - Splash -} \ No newline at end of file diff --git a/src-setup/ui/logo.png b/src-setup/ui/logo.png deleted file mode 100644 index 77f2804..0000000 Binary files a/src-setup/ui/logo.png and /dev/null differ diff --git a/src-setup/ui/splash.slint b/src-setup/ui/splash.slint deleted file mode 100644 index ce42d5e..0000000 --- a/src-setup/ui/splash.slint +++ /dev/null @@ -1,77 +0,0 @@ - -import { AboutSlint, VerticalBox, HorizontalBox, ProgressIndicator, GridBox, GroupBox, Palette } from "std-widgets.slint"; - - -export component Splash inherits Window { - always-on-top: true; - max-height: 375px; - min-height: 375px; - min-width: 600px; - max-width: 600px; - no-frame: true; - background: transparent; - icon: @image-url("logo.png"); - - VerticalBox { - alignment: LayoutAlignment.start; - Rectangle { - background: Palette.background; - border-radius: 10px; - VerticalBox { - alignment: LayoutAlignment.center; - - HorizontalBox { - alignment: LayoutAlignment.center; - Image { - accessible-role: AccessibleRole.none; - height: 100px; - horizontal-alignment: ImageHorizontalAlignment.center; - image-fit: ImageFit.contain; - image-rendering: ImageRendering.pixelated; - source: @image-url("icon.png"); - vertical-tiling: ImageTiling.none; - vertical-alignment: ImageVerticalAlignment.center; - width: 100px; - } - - VerticalBox { - alignment: center; - Text { - text: "AHQ Store"; - font-size: 60px; - } - } - } - - spacing: 35px; - - VerticalBox { - Text { - text: "Brought to you by"; - horizontal-alignment: TextHorizontalAlignment.center; - } - - HorizontalBox { - alignment: LayoutAlignment.center; - Image { - accessible-role: AccessibleRole.none; - height: 30px; - width: 30px; - - horizontal-alignment: ImageHorizontalAlignment.center; - image-fit: ImageFit.contain; - source: Palette.color-scheme == ColorScheme.dark ? @image-url("ahq.png") : @image-url("ahq1.png"); - vertical-tiling: ImageTiling.none; - vertical-alignment: ImageVerticalAlignment.center; - } - - Text { - text: "AHQ Softwares"; - font-size: 23px; - } - } - } - } - } - } -} diff --git a/src-tauri/.cargo/config.toml b/src-tauri/.cargo/config.toml index 38bd089..81b00ec 100644 --- a/src-tauri/.cargo/config.toml +++ b/src-tauri/.cargo/config.toml @@ -1,2 +1,5 @@ -[build] -rustflags = [] +[target.x86_64-pc-windows-msvc] +rustflags = ["-C", "target-feature=+crt-static"] + +[target.aarch64-pc-windows-msvc] +rustflags = ["-C", "target-feature=+crt-static"] diff --git a/src-tauri/.vscode/settings.json b/src-tauri/.vscode/settings.json new file mode 100644 index 0000000..165b420 --- /dev/null +++ b/src-tauri/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "rust-analyzer.checkOnSave": true +} diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 6a8475a..a066abe 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -3,25 +3,38 @@ version = 4 [[package]] -name = "addr2line" -version = "0.24.2" +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aead" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" dependencies = [ - "gimli", + "crypto-common", + "generic-array", + "heapless", ] [[package]] -name = "adler2" -version = "2.0.0" +name = "aes" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] @@ -30,6 +43,7 @@ dependencies = [ name = "ahqstore-new" version = "0.1.0" dependencies = [ + "percent-encoding", "serde", "serde_json", "tauri", @@ -37,21 +51,24 @@ dependencies = [ "tauri-plugin-ahqstore", "tauri-plugin-autostart", "tauri-plugin-deep-link", + "tauri-plugin-http", "tauri-plugin-os", "tauri-plugin-single-instance", "tauri-plugin-updater", - "windows", + "tauri-plugin-window-state", + "windows 0.62.2", + "zip 7.0.0", ] [[package]] name = "ahqstore-types" -version = "3.10.4" +version = "3.18.3" dependencies = [ "anyhow", - "fuse-rust", - "reqwest", + "reqwest 0.13.1", "serde", "serde_json", + "tokio", ] [[package]] @@ -79,10 +96,10 @@ dependencies = [ ] [[package]] -name = "android-tzdata" -version = "0.1.1" +name = "allocator-api2" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "android_system_properties" @@ -95,19 +112,28 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.95" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" dependencies = [ "derive_arbitrary", ] +[[package]] +name = "arc-swap" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d03449bb8ca2cc2ef70869af31463d1ae5ccc8fa3e334b307203fbf815207e" +dependencies = [ + "rustversion", +] + [[package]] name = "async-broadcast" version = "0.7.2" @@ -122,9 +148,9 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" dependencies = [ "concurrent-queue", "event-listener-strategy", @@ -134,35 +160,25 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.13.1" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" dependencies = [ "async-task", "concurrent-queue", "fastrand", "futures-lite", + "pin-project-lite", "slab", ] -[[package]] -name = "async-fs" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" -dependencies = [ - "async-lock", - "blocking", - "futures-lite", -] - [[package]] name = "async-io" -version = "2.4.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" dependencies = [ - "async-lock", + "autocfg", "cfg-if", "concurrent-queue", "futures-io", @@ -171,15 +187,14 @@ dependencies = [ "polling", "rustix", "slab", - "tracing", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "async-lock" -version = "3.4.0" +version = "3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" dependencies = [ "event-listener", "event-listener-strategy", @@ -188,9 +203,9 @@ dependencies = [ [[package]] name = "async-process" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" dependencies = [ "async-channel", "async-io", @@ -202,7 +217,6 @@ dependencies = [ "event-listener", "futures-lite", "rustix", - "tracing", ] [[package]] @@ -213,14 +227,14 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] name = "async-signal" -version = "0.2.10" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" dependencies = [ "async-io", "async-lock", @@ -231,7 +245,7 @@ dependencies = [ "rustix", "signal-hook-registry", "slab", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -242,13 +256,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.86" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -274,6 +288,15 @@ dependencies = [ "system-deps", ] +[[package]] +name = "atomic-polyfill" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -293,23 +316,30 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] -name = "backtrace" -version = "0.3.74" +name = "aws-lc-rs" +version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "6a88aab2464f1f25453baa7a07c84c5b7684e274054ba06817f382357f77a288" dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45afffdee1e7c9126814751f88dddc747f41d91da16c9551a0f1e8a11e788a1" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", ] [[package]] @@ -324,6 +354,19 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "bcrypt" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abaf6da45c74385272ddf00e1ac074c7d8a6c1a1dda376902bd6a427522a8b2c" +dependencies = [ + "base64 0.22.1", + "blowfish", + "getrandom 0.3.4", + "subtle", + "zeroize", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -332,18 +375,21 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.8.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" dependencies = [ - "serde", + "serde_core", ] [[package]] -name = "block" -version = "0.1.6" +name = "bitpacking" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" +checksum = "4c1d3e2bfd8d06048a179f7b17afc3188effa10385e7b00dc65af6aae732ea92" +dependencies = [ + "crunchy", +] [[package]] name = "block-buffer" @@ -355,51 +401,67 @@ dependencies = [ ] [[package]] -name = "block-sys" -version = "0.2.1" +name = "block2" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae85a0696e7ea3b835a453750bf002770776609115e6d25c6d2ff28a8200f7e7" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" dependencies = [ - "objc-sys", + "objc2", ] [[package]] -name = "block2" -version = "0.4.0" +name = "blocking" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e58aa60e59d8dbfcc36138f5f18be5f24394d33b38b24f7fd0b1caa33095f22f" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" dependencies = [ - "block-sys", - "objc2", + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", ] [[package]] -name = "block2" -version = "0.5.1" +name = "blowfish" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +checksum = "e412e2cd0f2b2d93e02543ceae7917b3c70331573df19ee046bcbc35e45e87d7" dependencies = [ - "objc2", + "byteorder", + "cipher", ] [[package]] -name = "blocking" -version = "1.6.1" +name = "bon" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +checksum = "ebeb9aaf9329dff6ceb65c689ca3db33dbf15f324909c60e4e5eef5701ce31b1" dependencies = [ - "async-channel", - "async-task", - "futures-io", - "futures-lite", - "piper", + "bon-macros", + "rustversion", +] + +[[package]] +name = "bon-macros" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77e9d642a7e3a318e37c2c9427b5a6a48aa1ad55dcd986f3034ab2239045a645" +dependencies = [ + "darling", + "ident_case", + "prettyplease", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.111", ] [[package]] name = "brotli" -version = "7.0.0" +version = "8.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -408,9 +470,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "4.0.2" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -418,15 +480,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.17.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytemuck" -version = "1.21.0" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" [[package]] name = "byteorder" @@ -442,20 +504,29 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" dependencies = [ "serde", ] +[[package]] +name = "bzip2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a53fac24f34a81bc9954b5d6cfce0c21e18ec6959f44f56e8e90e4bb7c346c" +dependencies = [ + "libbz2-rs-sys", +] + [[package]] name = "cairo-rs" version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.10.0", "cairo-sys-rs", "glib", "libc", @@ -476,11 +547,11 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.9" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -494,37 +565,46 @@ dependencies = [ [[package]] name = "cargo_metadata" -version = "0.19.1" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8769706aad5d996120af43197bf46ef6ad0fda35216b4505f926a365a232d924" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" dependencies = [ "camino", "cargo-platform", "semver", "serde", "serde_json", - "thiserror 2.0.11", + "thiserror 2.0.17", ] [[package]] name = "cargo_toml" -version = "0.21.0" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fbd1fe9db3ebf71b89060adaf7b0504c2d6a425cf061313099547e382c2e472" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" dependencies = [ "serde", - "toml 0.8.20", + "toml 0.9.8", ] [[package]] name = "cc" -version = "1.2.12" +version = "1.2.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "755717a7de9ec452bf7f3f1a3099085deabd7f2962b861dae91ecd7a365903d2" +checksum = "90583009037521a116abf44494efecd645ba48b6622457080f080b85544e2215" dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", "shlex", ] +[[package]] +name = "census" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f4c707c6a209cbe82d10abd08e1ea8995e9ea937d2550646e02798948992be0" + [[package]] name = "cesu8" version = "1.1.0" @@ -544,12 +624,12 @@ dependencies = [ [[package]] name = "cfb" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a4f8e55be323b378facfcf1f06aa97f6ec17cf4ac84fb17325093aaf62da41" +checksum = "fceeaae6b0f119d358a295d2f052917ca7c9e7ba5e38a37561ccaa93258b314e" dependencies = [ - "byteorder", "fnv", + "icu_casemap", "uuid", ] @@ -565,9 +645,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" @@ -575,47 +655,60 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chacha20" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "chacha20poly1305" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" +dependencies = [ + "aead", + "chacha20", + "cipher", + "poly1305", + "zeroize", +] + [[package]] name = "chrono" -version = "0.4.39" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ - "android-tzdata", "iana-time-zone", "num-traits", "serde", - "windows-targets 0.52.6", + "windows-link 0.2.1", ] [[package]] -name = "cocoa" -version = "0.26.0" +name = "cipher" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79398230a6e2c08f5c9760610eb6924b52aa9e7950a619602baba59dcbbdbb2" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ - "bitflags 2.8.0", - "block", - "cocoa-foundation", - "core-foundation", - "core-graphics", - "foreign-types", - "libc", - "objc", + "crypto-common", + "inout", + "zeroize", ] [[package]] -name = "cocoa-foundation" -version = "0.2.0" +name = "cmake" +version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14045fb83be07b5acf1c0884b2180461635b433455fa35d1cd6f17f1450679d" +checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" dependencies = [ - "bitflags 2.8.0", - "block", - "core-foundation", - "core-graphics-types", - "libc", - "objc", + "cc", ] [[package]] @@ -652,11 +745,17 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "once_cell", "tiny-keccak", ] +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + [[package]] name = "convert_case" version = "0.4.0" @@ -669,15 +768,62 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" dependencies = [ + "percent-encoding", "time", "version_check", ] +[[package]] +name = "cookie_store" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eac901828f88a5241ee0600950ab981148a18f2f756900ffba1b125ca6a3ef9" +dependencies = [ + "cookie", + "document-features", + "idna", + "log", + "publicsuffix", + "serde", + "serde_derive", + "serde_json", + "time", + "url", +] + +[[package]] +name = "cookie_store" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fc4bff745c9b4c7fb1e97b25d13153da2bc7796260141df62378998d070207f" +dependencies = [ + "cookie", + "document-features", + "idna", + "log", + "publicsuffix", + "serde", + "serde_derive", + "serde_json", + "time", + "url", +] + [[package]] name = "core-foundation" -version = "0.10.0" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" dependencies = [ "core-foundation-sys", "libc", @@ -695,8 +841,8 @@ version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" dependencies = [ - "bitflags 2.8.0", - "core-foundation", + "bitflags 2.10.0", + "core-foundation 0.10.1", "core-graphics-types", "foreign-types", "libc", @@ -708,8 +854,8 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 2.8.0", - "core-foundation", + "bitflags 2.10.0", + "core-foundation 0.10.1", "libc", ] @@ -722,20 +868,41 @@ dependencies = [ "libc", ] +[[package]] +name = "crc" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + [[package]] name = "crossbeam-channel" -version = "0.5.14" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ "crossbeam-utils", ] @@ -767,31 +934,32 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", + "rand_core 0.6.4", "typenum", ] [[package]] name = "cssparser" -version = "0.27.2" +version = "0.29.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" +checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" dependencies = [ "cssparser-macros", "dtoa-short", - "itoa 0.4.8", + "itoa", "matches", - "phf 0.8.0", + "phf 0.10.1", "proc-macro2", "quote", "smallvec", @@ -805,7 +973,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -815,14 +983,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" dependencies = [ "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] name = "darling" -version = "0.20.10" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" dependencies = [ "darling_core", "darling_macro", @@ -830,61 +998,73 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.10" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] name = "darling_macro" -version = "0.20.10" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core", "quote", - "syn 2.0.98", + "syn 2.0.111", ] +[[package]] +name = "data-url" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" + +[[package]] +name = "deflate64" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26bf8fc351c5ed29b5c2f0cbbac1b209b74f60ecd62e675a998df72c49af5204" + [[package]] name = "deranged" -version = "0.3.11" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" dependencies = [ "powerfmt", - "serde", + "serde_core", ] [[package]] name = "derive_arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] name = "derive_more" -version = "0.99.19" +version = "0.99.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da29a38df43d6f156149c9b43ded5e018ddff2a855cf2cfd62e8cd7d079c69f" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" dependencies = [ "convert_case", "proc-macro2", "quote", "rustc_version", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -895,6 +1075,7 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", + "subtle", ] [[package]] @@ -906,15 +1087,6 @@ dependencies = [ "dirs-sys 0.3.7", ] -[[package]] -name = "dirs" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" -dependencies = [ - "dirs-sys 0.4.1", -] - [[package]] name = "dirs" version = "6.0.0" @@ -937,33 +1109,31 @@ dependencies = [ [[package]] name = "dirs-sys" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" dependencies = [ "libc", "option-ext", - "redox_users 0.4.6", - "windows-sys 0.48.0", + "redox_users 0.5.2", + "windows-sys 0.61.2", ] [[package]] -name = "dirs-sys" -version = "0.5.0" +name = "dispatch" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" -dependencies = [ - "libc", - "option-ext", - "redox_users 0.5.0", - "windows-sys 0.59.0", -] +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" [[package]] -name = "dispatch" -version = "0.2.0" +name = "dispatch2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.10.0", + "objc2", +] [[package]] name = "displaydoc" @@ -973,14 +1143,14 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] name = "dlopen2" -version = "0.7.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1297103d2bbaea85724fcee6294c2d50b1081f9ad47d0f6f6f61eda65315a6" +checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" dependencies = [ "dlopen2_derive", "libc", @@ -990,13 +1160,13 @@ dependencies = [ [[package]] name = "dlopen2_derive" -version = "0.4.0" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" +checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -1008,20 +1178,35 @@ dependencies = [ "const-random", ] +[[package]] +name = "document-features" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] + +[[package]] +name = "downcast-rs" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "117240f60069e65410b3ae1bb213295bd828f707b5bec6596a1afc8793ce0cbc" + [[package]] name = "dpi" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" dependencies = [ "serde", ] [[package]] name = "dtoa" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" +checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04" [[package]] name = "dtoa-short" @@ -1040,28 +1225,28 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "dyn-clone" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feeef44e73baff3a26d371801df019877a9866a8c493d315ab00177843314f35" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "either" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "embed-resource" -version = "2.5.1" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b68b6f9f63a0b6a38bc447d4ce84e2b388f3ec95c99c641c8ff0dd3ef89a6379" +checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e" dependencies = [ "cc", "memchr", "rustc_version", - "toml 0.8.20", + "toml 0.9.8", "vswhom", - "winreg 0.52.0", + "winreg 0.55.0", ] [[package]] @@ -1081,15 +1266,15 @@ dependencies = [ [[package]] name = "endi" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" [[package]] name = "enumflags2" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" dependencies = [ "enumflags2_derive", "serde", @@ -1097,46 +1282,47 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "erased-serde" -version = "0.4.5" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d" +checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" dependencies = [ "serde", + "serde_core", "typeid", ] [[package]] name = "errno" -version = "0.3.10" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "event-listener" -version = "5.4.0" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" dependencies = [ "concurrent-queue", "parking", @@ -1145,14 +1331,20 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ "event-listener", "pin-project-lite", ] +[[package]] +name = "fastdivide" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afc2bd4d5a73106dd53d10d73d3401c2f32730ba2c0b93ddb888a8983680471" + [[package]] name = "fastrand" version = "2.3.0" @@ -1180,23 +1372,30 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.25" +version = "0.2.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" dependencies = [ "cfg-if", "libc", "libredox", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" + [[package]] name = "flate2" -version = "1.0.35" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" dependencies = [ "crc32fast", + "libz-rs-sys", "miniz_oxide", ] @@ -1206,6 +1405,12 @@ 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 = "foreign-types" version = "0.5.0" @@ -1224,7 +1429,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -1235,23 +1440,29 @@ checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] [[package]] -name = "fuse-rust" -version = "0.4.0" +name = "fs4" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf29d70efdbafa7d2dc40083514b205c8d8885fba815778acc57100a9029200c" +checksum = "8640e34b88f7652208ce9e88b1a37a2ae95227d84abec377ccd3c5cfeb141ed4" dependencies = [ - "crossbeam-utils", - "rayon", + "rustix", + "windows-sys 0.59.0", ] +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + [[package]] name = "futf" version = "0.1.5" @@ -1262,6 +1473,21 @@ dependencies = [ "new_debug_unreachable", ] +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.31" @@ -1269,6 +1495,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", + "futures-sink", ] [[package]] @@ -1296,9 +1523,9 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" dependencies = [ "fastrand", "futures-core", @@ -1315,7 +1542,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -1336,6 +1563,7 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ + "futures-channel", "futures-core", "futures-io", "futures-macro", @@ -1467,12 +1695,12 @@ dependencies = [ [[package]] name = "gethostname" -version = "0.5.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc3655aa6818d65bc620d6911f05aa7b6aeb596291e1e9f79e52df85583d1e30" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" dependencies = [ "rustix", - "windows-targets 0.52.6", + "windows-link 0.2.1", ] [[package]] @@ -1488,35 +1716,31 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", + "js-sys", "libc", - "wasi 0.13.3+wasi-0.2.2", - "windows-targets 0.52.6", + "r-efi", + "wasip2", + "wasm-bindgen", ] -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - [[package]] name = "gio" version = "0.18.4" @@ -1555,7 +1779,7 @@ version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.10.0", "futures-channel", "futures-core", "futures-executor", @@ -1579,11 +1803,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" dependencies = [ "heck 0.4.1", - "proc-macro-crate 2.0.0", + "proc-macro-crate 2.0.2", "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -1598,9 +1822,9 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "gobject-sys" @@ -1662,7 +1886,35 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", +] + +[[package]] +name = "h2" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap 2.12.1", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", ] [[package]] @@ -1679,9 +1931,33 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "heapless" +version = "0.7.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +dependencies = [ + "atomic-polyfill", + "hash32", + "rustc_version", + "spin", + "stable_deref_trait", +] [[package]] name = "heck" @@ -1697,9 +1973,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.4.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hex" @@ -1707,29 +1983,41 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + [[package]] name = "html5ever" -version = "0.26.0" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7" +checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" dependencies = [ "log", "mac", "markup5ever", - "proc-macro2", - "quote", - "syn 1.0.109", + "match_token", ] +[[package]] +name = "htmlescape" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9025058dae765dee5070ec375f591e2ba14638c63feff74f13805a72e523163" + [[package]] name = "http" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ "bytes", - "fnv", - "itoa 1.0.14", + "itoa", ] [[package]] @@ -1744,12 +2032,12 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", - "futures-util", + "futures-core", "http", "http-body", "pin-project-lite", @@ -1757,24 +2045,27 @@ dependencies = [ [[package]] name = "httparse" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "hyper" -version = "1.6.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", + "futures-core", + "h2", "http", "http-body", "httparse", - "itoa 1.0.14", + "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", @@ -1782,11 +2073,10 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.5" +version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "futures-util", "http", "hyper", "hyper-util", @@ -1800,35 +2090,52 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" dependencies = [ + "base64 0.22.1", "bytes", "futures-channel", + "futures-core", "futures-util", "http", "http-body", "hyper", + "ipnet", + "libc", + "percent-encoding", "pin-project-lite", "socket2", + "system-configuration", "tokio", "tower-service", "tracing", + "windows-registry 0.6.1", +] + +[[package]] +name = "hyperloglogplus" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "621debdf94dcac33e50475fdd76d34d5ea9c0362a834b9db08c3024696c1fbe3" +dependencies = [ + "serde", ] [[package]] name = "iana-time-zone" -version = "0.1.61" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", - "windows-core 0.52.0", + "windows-core 0.62.2", ] [[package]] @@ -1842,24 +2149,36 @@ dependencies = [ [[package]] name = "ico" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3804960be0bb5e4edb1e1ad67afd321a9ecfd875c3e65c099468fd2717d7cae" +checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98" dependencies = [ "byteorder", - "png", + "png 0.17.16", ] [[package]] -name = "icrate" -version = "0.1.2" +name = "icu_casemap" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb69199826926eb864697bddd27f73d9fddcffc004f5733131e15b465e30642" +checksum = "9ff0c8ae9f8d31b12e27fc385ff9ab1f3cd9b17417c665c49e4ec958c37da75f" dependencies = [ - "block2 0.4.0", - "objc2", + "displaydoc", + "icu_casemap_data", + "icu_collections 1.5.0", + "icu_locid", + "icu_properties 1.5.1", + "icu_provider 1.5.0", + "writeable 0.5.5", + "zerovec 0.10.4", ] +[[package]] +name = "icu_casemap_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02bd9f6276270c85a5cd54611adbbf94e993ec464a2a86a452a6c565b7ded5d9" + [[package]] name = "icu_collections" version = "1.5.0" @@ -1867,9 +2186,35 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" dependencies = [ "displaydoc", - "yoke", + "yoke 0.7.5", + "zerofrom", + "zerovec 0.10.4", +] + +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke 0.8.1", "zerofrom", - "zerovec", + "zerovec 0.11.5", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap 0.8.1", + "tinystr 0.8.2", + "writeable 0.6.2", + "zerovec 0.11.5", ] [[package]] @@ -1879,10 +2224,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" dependencies = [ "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", + "litemap 0.7.5", + "tinystr 0.7.6", + "writeable 0.5.5", + "zerovec 0.10.4", ] [[package]] @@ -1894,40 +2239,36 @@ dependencies = [ "displaydoc", "icu_locid", "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", + "icu_provider 1.5.0", + "tinystr 0.7.6", + "zerovec 0.10.4", ] [[package]] name = "icu_locid_transform_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" dependencies = [ - "displaydoc", - "icu_collections", + "icu_collections 2.1.1", "icu_normalizer_data", - "icu_properties", - "icu_provider", + "icu_properties 2.1.2", + "icu_provider 2.1.1", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec", + "zerovec 0.11.5", ] [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" @@ -1936,19 +2277,39 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" dependencies = [ "displaydoc", - "icu_collections", + "icu_collections 1.5.0", "icu_locid_transform", - "icu_properties_data", - "icu_provider", - "tinystr", - "zerovec", + "icu_properties_data 1.5.1", + "icu_provider 1.5.0", + "tinystr 0.7.6", + "zerovec 0.10.4", +] + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections 2.1.1", + "icu_locale_core", + "icu_properties_data 2.1.2", + "icu_provider 2.1.1", + "zerotrie", + "zerovec 0.11.5", ] [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" + +[[package]] +name = "icu_properties_data" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" [[package]] name = "icu_provider" @@ -1960,11 +2321,26 @@ dependencies = [ "icu_locid", "icu_provider_macros", "stable_deref_trait", - "tinystr", - "writeable", - "yoke", + "tinystr 0.7.6", + "writeable 0.5.5", + "yoke 0.7.5", + "zerofrom", + "zerovec 0.10.4", +] + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable 0.6.2", + "yoke 0.8.1", "zerofrom", - "zerovec", + "zerotrie", + "zerovec 0.11.5", ] [[package]] @@ -1975,7 +2351,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -1986,9 +2362,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -1997,24 +2373,25 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", - "icu_properties", + "icu_properties 2.1.2", ] [[package]] name = "image" -version = "0.25.5" +version = "0.25.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" +checksum = "e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a" dependencies = [ "bytemuck", "byteorder-lite", + "moxcms", "num-traits", - "png", + "png 0.18.0", ] [[package]] @@ -2030,30 +2407,50 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.1" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.16.1", "serde", + "serde_core", ] [[package]] name = "infer" -version = "0.16.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc150e5ce2330295b8616ce0e3f53250e53af31759a9dbedad1621ba29151847" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" dependencies = [ "cfb 0.7.3", ] +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + [[package]] name = "ipnet" version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +[[package]] +name = "iri-string" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "is-docker" version = "0.2.0" @@ -2074,16 +2471,19 @@ dependencies = [ ] [[package]] -name = "itoa" -version = "0.4.8" +name = "itertools" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "javascriptcore-rs" @@ -2130,11 +2530,21 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" dependencies = [ "once_cell", "wasm-bindgen", @@ -2168,21 +2578,20 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.10.0", "serde", "unicode-segmentation", ] [[package]] name = "kuchikiki" -version = "0.8.2" +version = "0.8.8-speedreader" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e4755b7b995046f510a7520c42b2fed58b77bd94d5a87a8eb43d2fd126da8" +checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" dependencies = [ "cssparser", "html5ever", - "indexmap 1.9.3", - "matches", + "indexmap 2.12.1", "selectors", ] @@ -2192,6 +2601,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "levenshtein_automata" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c2cdeb66e45e9f36bfad5bbdb4d2384e70936afbee843c6f6543f0c551ebb25" + [[package]] name = "libappindicator" version = "0.9.0" @@ -2216,11 +2631,17 @@ dependencies = [ "once_cell", ] +[[package]] +name = "libbz2-rs-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4a545a15244c7d945065b5d392b2d2d7f21526fba56ce51467b06ed445e8f7" + [[package]] name = "libc" -version = "0.2.169" +version = "0.2.178" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" [[package]] name = "libloading" @@ -2232,93 +2653,170 @@ dependencies = [ "winapi", ] +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + [[package]] name = "libredox" -version = "0.1.3" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.10.0", "libc", "redox_syscall", ] +[[package]] +name = "libz-rs-sys" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15413ef615ad868d4d65dce091cb233b229419c7c0c4bcaa746c0901c49ff39c" +dependencies = [ + "zlib-rs", +] + [[package]] name = "linux-raw-sys" -version = "0.4.15" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" -version = "0.7.4" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "litrs" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" [[package]] name = "lixploy" -version = "0.0.1" -source = "git+https://github.com/ahqstore/lixploy#4bcca7b5cbcfba9cdf21fc5558a9fff6d63c54f8" +version = "0.0.3" +source = "git+https://github.com/ahqstore/lixploy#e89b7ba93f68865d460f55e2c7b2ad0b7c079ebc" dependencies = [ "tokio", ] [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.25" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] -name = "mac" -version = "0.1.1" +name = "lru" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "lz4_flex" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08ab2867e3eeeca90e844d1940eab391c9dc5228783db2ed999acbc0a9ed375a" [[package]] -name = "malloc_buf" -version = "0.0.6" +name = "lzma-rust2" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +checksum = "48172246aa7c3ea28e423295dd1ca2589a24617cc4e588bb8cfe177cb2c54d95" dependencies = [ - "libc", + "crc", + "sha2", ] +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + [[package]] name = "markup5ever" -version = "0.11.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016" +checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18" dependencies = [ "log", - "phf 0.10.1", - "phf_codegen 0.10.0", + "phf 0.11.3", + "phf_codegen 0.11.3", "string_cache", "string_cache_codegen", "tendril", ] +[[package]] +name = "match_token" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + [[package]] name = "matches" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" +[[package]] +name = "measure_time" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51c55d61e72fc3ab704396c5fa16f4c184db37978ae4e94ca8959693a235fc0e" +dependencies = [ + "log", +] + [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "memmap2" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" +dependencies = [ + "libc", +] [[package]] name = "memoffset" @@ -2335,17 +2833,23 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "minisign-verify" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6367d84fb54d4242af283086402907277715b8fe46976963af5ebf173f8efba3" +checksum = "e856fdd13623a2f5f2f54676a4ee49502a96a80ef4a62bcedd23d52427c44d43" [[package]] name = "miniz_oxide" -version = "0.8.3" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", "simd-adler32", @@ -2353,32 +2857,42 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.3" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.61.2", +] + +[[package]] +name = "moxcms" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac9557c559cd6fc9867e122e20d2cbefc9ca29d80d027a8e39310920ed2f0a97" +dependencies = [ + "num-traits", + "pxfm", ] [[package]] name = "msi" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a2332f87a064dea9cce571408c879e0da8dc193b3af06a2b3b2604ee4182a32" +checksum = "df4363351b7618eec3f62cda6a5b47af98bc79574d1df562c9f21d8d633b99d0" dependencies = [ "byteorder", - "cfb 0.10.0", + "cfb 0.11.0", "encoding_rs", "uuid", ] [[package]] name = "muda" -version = "0.15.3" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdae9c00e61cc0579bcac625e8ad22104c60548a025bfc972dc83868a28e1484" +checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" dependencies = [ "crossbeam-channel", "dpi", @@ -2386,21 +2900,28 @@ dependencies = [ "keyboard-types", "objc2", "objc2-app-kit", + "objc2-core-foundation", "objc2-foundation", "once_cell", - "png", + "png 0.17.16", "serde", - "thiserror 1.0.69", - "windows-sys 0.59.0", + "thiserror 2.0.17", + "windows-sys 0.60.2", ] +[[package]] +name = "murmurhash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2195bf6aa996a481483b29d62a7663eed3fe39600c460e323f8ff41e90bdd89b" + [[package]] name = "ndk" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.10.0", "jni-sys", "log", "ndk-sys", @@ -2432,11 +2953,11 @@ checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] name = "nix" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.10.0", "cfg-if", "cfg_aliases", "libc", @@ -2449,6 +2970,16 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "num-conv" version = "0.1.0" @@ -2462,182 +2993,209 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", ] [[package]] name = "num_enum" -version = "0.7.3" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" dependencies = [ "num_enum_derive", + "rustversion", ] [[package]] name = "num_enum_derive" -version = "0.7.3" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" dependencies = [ - "proc-macro-crate 3.2.0", + "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.98", -] - -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", -] - -[[package]] -name = "objc-sys" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" -dependencies = [ - "cc", + "syn 2.0.111", ] [[package]] name = "objc2" -version = "0.5.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" dependencies = [ - "objc-sys", "objc2-encode", + "objc2-exception-helper", ] [[package]] name = "objc2-app-kit" -version = "0.2.2" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ - "bitflags 2.8.0", - "block2 0.5.1", + "bitflags 2.10.0", + "block2", "libc", "objc2", + "objc2-cloud-kit", "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", "objc2-core-image", + "objc2-core-text", + "objc2-core-video", "objc2-foundation", "objc2-quartz-core", ] [[package]] name = "objc2-cloud-kit" -version = "0.2.2" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" dependencies = [ - "bitflags 2.8.0", - "block2 0.5.1", + "bitflags 2.10.0", "objc2", - "objc2-core-location", "objc2-foundation", ] [[package]] -name = "objc2-contacts" -version = "0.2.2" +name = "objc2-core-data" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" dependencies = [ - "block2 0.5.1", + "bitflags 2.10.0", "objc2", "objc2-foundation", ] [[package]] -name = "objc2-core-data" -version = "0.2.2" +name = "objc2-core-foundation" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.8.0", - "block2 0.5.1", + "bitflags 2.10.0", + "dispatch2", "objc2", - "objc2-foundation", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.10.0", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", ] [[package]] name = "objc2-core-image" -version = "0.2.2" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" dependencies = [ - "block2 0.5.1", "objc2", "objc2-foundation", - "objc2-metal", ] [[package]] name = "objc2-core-location" -version = "0.2.2" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" dependencies = [ - "block2 0.5.1", "objc2", - "objc2-contacts", "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.10.0", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-core-video" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" +dependencies = [ + "bitflags 2.10.0", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-io-surface", +] + [[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.2.2" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.8.0", - "block2 0.5.1", + "bitflags 2.10.0", + "block2", "libc", "objc2", + "objc2-core-foundation", ] [[package]] -name = "objc2-link-presentation" -version = "0.2.2" +name = "objc2-io-surface" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" dependencies = [ - "block2 0.5.1", + "bitflags 2.10.0", "objc2", - "objc2-app-kit", - "objc2-foundation", + "objc2-core-foundation", ] [[package]] -name = "objc2-metal" -version = "0.2.2" +name = "objc2-javascript-core" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +checksum = "2a1e6550c4caed348956ce3370c9ffeca70bb1dbed4fa96112e7c6170e074586" dependencies = [ - "bitflags 2.8.0", - "block2 0.5.1", "objc2", - "objc2-foundation", + "objc2-core-foundation", ] [[package]] name = "objc2-osa-kit" -version = "0.2.2" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6788b04a18ea31e3dc3ab256b8546639e5bbae07c1a0dc4ea8615252bc6aee9a" +checksum = "f112d1746737b0da274ef79a23aac283376f335f4095a083a267a082f21db0c0" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.10.0", "objc2", "objc2-app-kit", "objc2-foundation", @@ -2645,111 +3203,109 @@ dependencies = [ [[package]] name = "objc2-quartz-core" -version = "0.2.2" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" dependencies = [ - "bitflags 2.8.0", - "block2 0.5.1", + "bitflags 2.10.0", "objc2", + "objc2-core-foundation", "objc2-foundation", - "objc2-metal", ] [[package]] -name = "objc2-symbols" -version = "0.2.2" +name = "objc2-security" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" dependencies = [ + "bitflags 2.10.0", "objc2", - "objc2-foundation", + "objc2-core-foundation", ] [[package]] name = "objc2-ui-kit" -version = "0.2.2" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" dependencies = [ - "bitflags 2.8.0", - "block2 0.5.1", + "bitflags 2.10.0", + "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-link-presentation", "objc2-quartz-core", - "objc2-symbols", - "objc2-uniform-type-identifiers", "objc2-user-notifications", ] -[[package]] -name = "objc2-uniform-type-identifiers" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" -dependencies = [ - "block2 0.5.1", - "objc2", - "objc2-foundation", -] - [[package]] name = "objc2-user-notifications" -version = "0.2.2" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" dependencies = [ - "bitflags 2.8.0", - "block2 0.5.1", "objc2", - "objc2-core-location", "objc2-foundation", ] [[package]] name = "objc2-web-kit" -version = "0.2.2" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68bc69301064cebefc6c4c90ce9cba69225239e4b8ff99d445a2b5563797da65" +checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" dependencies = [ - "bitflags 2.8.0", - "block2 0.5.1", + "bitflags 2.10.0", + "block2", "objc2", "objc2-app-kit", + "objc2-core-foundation", "objc2-foundation", + "objc2-javascript-core", + "objc2-security", ] [[package]] -name = "object" -version = "0.36.7" +name = "once_cell" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] -name = "once_cell" -version = "1.20.3" +name = "oneshot" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ce411919553d3f9fa53a0880544cda985a112117a0444d5ff1e870a893d6ea" + +[[package]] +name = "opaque-debug" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "open" -version = "5.3.2" +version = "5.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2483562e62ea94312f3576a7aca397306df7990b8d89033e18766744377ef95" +checksum = "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513d40024bc" dependencies = [ "is-wsl", "libc", "pathdiff", ] +[[package]] +name = "openssl-probe" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f50d9b3dabb09ecd771ad0aa242ca6894994c130308ca3d7684634df8037391" + [[package]] name = "option-ext" version = "0.2.0" @@ -2778,27 +3334,41 @@ dependencies = [ [[package]] name = "os_info" -version = "3.9.2" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e6520c8cc998c5741ee68ec1dc369fc47e5f0ea5320018ecf2a1ccd6328f48b" +checksum = "e4022a17595a00d6a369236fdae483f0de7f0a339960a53118b818238e132224" dependencies = [ + "android_system_properties", "log", + "nix", + "objc2", + "objc2-foundation", + "objc2-ui-kit", "serde", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] name = "osakit" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35366a452fce3f8947eb2f33226a133aaf0cacedef2af67ade348d58be7f85d0" +checksum = "732c71caeaa72c065bb69d7ea08717bd3f4863a4f451402fc9513e29dbd5261b" dependencies = [ - "icrate", + "objc2", "objc2-foundation", "objc2-osa-kit", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror 2.0.17", +] + +[[package]] +name = "ownedbytes" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fbd56f7631767e61784dc43f8580f403f4475bd4aaa4da003e6295e1bab4a7e" +dependencies = [ + "stable_deref_trait", ] [[package]] @@ -2834,9 +3404,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -2844,15 +3414,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-link 0.2.1", ] [[package]] @@ -2861,11 +3431,21 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest", + "hmac", +] + [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "phf" @@ -2873,9 +3453,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" dependencies = [ - "phf_macros 0.8.0", "phf_shared 0.8.0", - "proc-macro-hack", ] [[package]] @@ -2884,7 +3462,9 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" dependencies = [ + "phf_macros 0.10.0", "phf_shared 0.10.0", + "proc-macro-hack", ] [[package]] @@ -2909,12 +3489,12 @@ dependencies = [ [[package]] name = "phf_codegen" -version = "0.10.0" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", + "phf_generator 0.11.3", + "phf_shared 0.11.3", ] [[package]] @@ -2949,12 +3529,12 @@ dependencies = [ [[package]] name = "phf_macros" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" dependencies = [ - "phf_generator 0.8.0", - "phf_shared 0.8.0", + "phf_generator 0.10.0", + "phf_shared 0.10.0", "proc-macro-hack", "proc-macro2", "quote", @@ -2971,7 +3551,7 @@ dependencies = [ "phf_shared 0.11.3", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -3026,18 +3606,18 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "plist" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" +checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" dependencies = [ "base64 0.22.1", - "indexmap 2.7.1", + "indexmap 2.12.1", "quick-xml", "serde", "time", @@ -3056,19 +3636,51 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "png" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0" +dependencies = [ + "bitflags 2.10.0", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + [[package]] name = "polling" -version = "3.7.4" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" dependencies = [ "cfg-if", "concurrent-queue", "hermit-abi", "pin-project-lite", "rustix", - "tracing", - "windows-sys 0.59.0", + "windows-sys 0.61.2", +] + +[[package]] +name = "poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +dependencies = [ + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec 0.11.5", ] [[package]] @@ -3077,11 +3689,17 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +[[package]] +name = "ppmd-rust" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d558c559f0450f16f2a27a1f017ef38468c1090c9ce63c8e51366232d53717b4" + [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ "zerocopy", ] @@ -3092,6 +3710,16 @@ 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.111", +] + [[package]] name = "proc-macro-crate" version = "1.3.1" @@ -3104,20 +3732,21 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "2.0.0" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" dependencies = [ - "toml_edit 0.20.7", + "toml_datetime 0.6.3", + "toml_edit 0.20.2", ] [[package]] name = "proc-macro-crate" -version = "3.2.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "toml_edit 0.22.23", + "toml_edit 0.23.9", ] [[package]] @@ -3152,55 +3781,84 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.93" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] +[[package]] +name = "psl-types" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" + +[[package]] +name = "publicsuffix" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42ea446cab60335f76979ec15e12619a2165b5ae2c12166bef27d283a9fadf" +dependencies = [ + "idna", + "psl-types", +] + +[[package]] +name = "pxfm" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7186d3822593aa4393561d186d1393b3923e9d6163d3fbfd6e825e3e6cf3e6a8" +dependencies = [ + "num-traits", +] + [[package]] name = "quick-xml" -version = "0.32.0" +version = "0.38.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d3a6e5838b60e0e8fa7a43f22ade549a37d61f8bdbe636d0d7816191de969c2" +checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" dependencies = [ "memchr", ] [[package]] name = "quinn" -version = "0.11.6" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" dependencies = [ "bytes", + "cfg_aliases", "pin-project-lite", "quinn-proto", "quinn-udp", "rustc-hash", "rustls", "socket2", - "thiserror 2.0.11", + "thiserror 2.0.17", "tokio", "tracing", + "web-time", ] [[package]] name = "quinn-proto" -version = "0.11.9" +version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ + "aws-lc-rs", "bytes", - "getrandom 0.2.15", - "rand 0.8.5", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.2", "ring", "rustc-hash", "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.11", + "thiserror 2.0.17", "tinyvec", "tracing", "web-time", @@ -3208,27 +3866,33 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.9" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" dependencies = [ "cfg_aliases", "libc", "once_cell", "socket2", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "quote" -version = "1.0.38" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" 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 = "rand" version = "0.7.3" @@ -3254,6 +3918,16 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", +] + [[package]] name = "rand_chacha" version = "0.2.2" @@ -3274,6 +3948,16 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + [[package]] name = "rand_core" version = "0.5.1" @@ -3289,7 +3973,26 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_distr" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" +dependencies = [ + "num-traits", + "rand 0.8.5", ] [[package]] @@ -3318,9 +4021,9 @@ checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" [[package]] name = "rayon" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" dependencies = [ "either", "rayon-core", @@ -3328,9 +4031,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -3338,11 +4041,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.8" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.10.0", ] [[package]] @@ -3351,27 +4054,47 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "libredox", "thiserror 1.0.69", ] [[package]] name = "redox_users" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "libredox", - "thiserror 2.0.11", + "thiserror 2.0.17", +] + +[[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.111", ] [[package]] name = "regex" -version = "1.11.1" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", @@ -3381,9 +4104,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", @@ -3392,36 +4115,37 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "reqwest" -version = "0.12.12" +version = "0.12.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" +checksum = "3b4c14b2d9afca6a60277086b0cc6a6ae0b568f6f7916c943a8cdc79f8be240f" dependencies = [ "base64 0.22.1", "bytes", + "cookie", + "cookie_store 0.22.0", + "encoding_rs", "futures-core", "futures-util", + "h2", "http", "http-body", "http-body-util", "hyper", "hyper-rustls", "hyper-util", - "ipnet", "js-sys", "log", "mime", - "once_cell", "percent-encoding", "pin-project-lite", "quinn", "rustls", - "rustls-pemfile", "rustls-pki-types", "serde", "serde_json", @@ -3431,6 +4155,7 @@ dependencies = [ "tokio-rustls", "tokio-util", "tower", + "tower-http", "tower-service", "url", "wasm-bindgen", @@ -3438,40 +4163,79 @@ dependencies = [ "wasm-streams", "web-sys", "webpki-roots", - "windows-registry 0.2.0", +] + +[[package]] +name = "reqwest" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04e9018c9d814e5f30cc16a0f03271aeab3571e609612d9fe78c1aa8d11c2f62" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "rustls-platform-verifier", + "serde", + "serde_json", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", ] [[package]] name = "ring" -version = "0.17.8" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.15", + "getrandom 0.2.16", "libc", - "spin", "untrusted", "windows-sys 0.52.0", ] [[package]] name = "rust-ini" -version = "0.21.1" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e310ef0e1b6eeb79169a1171daf9abcb87a2e17c03bee2c4bb100b55c75409f" +checksum = "796e8d2b6696392a43bea58116b667fb4c29727dc5abd27d6acf338bb4f688c7" dependencies = [ "cfg-if", "ordered-multimap", - "trim-in-place", ] [[package]] -name = "rustc-demangle" -version = "0.1.24" +name = "rust-stemmers" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "e46a2036019fdb888131db7a4c847a1063a7493f971ed94ea82c67eada63ca54" +dependencies = [ + "serde", + "serde_derive", +] [[package]] name = "rustc-hash" @@ -3490,23 +4254,24 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.44" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.10.0", "errno", "libc", "linux-raw-sys", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "rustls" -version = "0.23.22" +version = "0.23.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb9263ab4eb695e42321db096e3b8fbd715a59b154d5c88d82db2175b681ba7" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" dependencies = [ + "aws-lc-rs", "once_cell", "ring", "rustls-pki-types", @@ -3516,29 +4281,61 @@ dependencies = [ ] [[package]] -name = "rustls-pemfile" -version = "2.2.0" +name = "rustls-native-certs" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" dependencies = [ + "openssl-probe", "rustls-pki-types", + "schannel", + "security-framework", ] [[package]] name = "rustls-pki-types" -version = "1.11.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" +checksum = "708c0f9d5f54ba0272468c1d306a52c495b31fa155e91bc25371e6df7996908c" dependencies = [ "web-time", + "zeroize", ] +[[package]] +name = "rustls-platform-verifier" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" +dependencies = [ + "core-foundation 0.10.1", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + [[package]] name = "rustls-webpki" -version = "0.102.8" +version = "0.103.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" dependencies = [ + "aws-lc-rs", "ring", "rustls-pki-types", "untrusted", @@ -3546,15 +4343,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.19" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "same-file" @@ -3565,11 +4362,20 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "schemars" -version = "0.8.21" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" dependencies = [ "dyn-clone", "indexmap 1.9.3", @@ -3580,16 +4386,40 @@ dependencies = [ "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.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + [[package]] name = "schemars_derive" -version = "0.8.21" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -3598,64 +4428,97 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "security-framework" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +dependencies = [ + "bitflags 2.10.0", + "core-foundation 0.10.1", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "selectors" -version = "0.22.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" +checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" dependencies = [ "bitflags 1.3.2", "cssparser", "derive_more", "fxhash", "log", - "matches", "phf 0.8.0", "phf_codegen 0.8.0", "precomputed-hash", "servo_arc", "smallvec", - "thin-slice", ] [[package]] name = "semver" -version = "1.0.25" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" dependencies = [ "serde", + "serde_core", ] [[package]] name = "serde" -version = "1.0.217" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ + "serde_core", "serde_derive", ] [[package]] name = "serde-untagged" -version = "0.1.6" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2676ba99bd82f75cae5cbd2c8eda6fa0b8760f18978ea840e980dd5567b5c5b6" +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.217" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -3666,41 +4529,51 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] name = "serde_json" -version = "1.0.138" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ - "itoa 1.0.14", + "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] name = "serde_repr" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] name = "serde_spanned" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" +dependencies = [ + "serde_core", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -3708,24 +4581,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.14", + "itoa", "ryu", "serde", ] [[package]] name = "serde_with" -version = "3.12.0" +version = "3.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" +checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.7.1", - "serde", - "serde_derive", + "indexmap 2.12.1", + "schemars 0.9.0", + "schemars 1.1.0", + "serde_core", "serde_json", "serde_with_macros", "time", @@ -3733,21 +4607,21 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.12.0" +version = "3.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" +checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] name = "serialize-to-javascript" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" dependencies = [ "serde", "serde_json", @@ -3756,30 +4630,41 @@ dependencies = [ [[package]] name = "serialize-to-javascript-impl" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.111", ] [[package]] name = "servo_arc" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" +checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741" dependencies = [ "nodrop", "stable_deref_trait", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -3788,9 +4673,9 @@ dependencies = [ [[package]] name = "sha256" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18278f6a914fa3070aa316493f7d2ddfb9ac86ebc06fa3b83bffda487e9065b0" +checksum = "f880fc8562bdeb709793f00eb42a2ad0e672c4f883bbe59122b926eca935c8f6" dependencies = [ "async-trait", "bytes", @@ -3807,18 +4692,18 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" dependencies = [ "libc", ] [[package]] name = "simd-adler32" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" [[package]] name = "siphasher" @@ -3833,50 +4718,56 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] -name = "slab" -version = "0.4.9" +name = "sketches-ddsketch" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +checksum = "c1e9a774a6c28142ac54bb25d25562e6bcf957493a184f15ad4eebccb23e410a" dependencies = [ - "autocfg", + "serde", ] +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + [[package]] name = "smallvec" -version = "1.13.2" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.5.8" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.60.2", ] [[package]] name = "softbuffer" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18051cdd562e792cad055119e0cdb2cfc137e44e3987532e0f9659a77931bb08" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" dependencies = [ "bytemuck", - "cfg_aliases", - "core-graphics", - "foreign-types", "js-sys", - "log", + "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.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -3910,12 +4801,15 @@ name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "static_assertions" @@ -3925,9 +4819,9 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "string_cache" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938d512196766101d333398efde81bc1f37b00cb42c2f8350e5df639f040bbbe" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" dependencies = [ "new_debug_unreachable", "parking_lot", @@ -3938,9 +4832,9 @@ dependencies = [ [[package]] name = "string_cache_codegen" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "244292f3441c89febe5b5bdfbb6863aeaf4f64da810ea3050fd927b27b8d92ce" +checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" dependencies = [ "phf_generator 0.11.3", "phf_shared 0.11.3", @@ -3984,9 +4878,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.98" +version = "2.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" dependencies = [ "proc-macro2", "quote", @@ -4004,13 +4898,13 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] @@ -4022,6 +4916,27 @@ dependencies = [ "libc", ] +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.10.0", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "system-deps" version = "6.2.2" @@ -4031,19 +4946,165 @@ dependencies = [ "cfg-expr", "heck 0.5.0", "pkg-config", - "toml 0.8.20", + "toml 0.8.2", "version-compare", ] +[[package]] +name = "tantivy" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502915c7381c5cb2d2781503962610cb880ad8f1a0ca95df1bae645d5ebf2545" +dependencies = [ + "aho-corasick", + "arc-swap", + "base64 0.22.1", + "bitpacking", + "bon", + "byteorder", + "census", + "crc32fast", + "crossbeam-channel", + "downcast-rs", + "fastdivide", + "fnv", + "fs4", + "htmlescape", + "hyperloglogplus", + "itertools", + "levenshtein_automata", + "log", + "lru", + "lz4_flex", + "measure_time", + "memmap2", + "once_cell", + "oneshot", + "rayon", + "regex", + "rust-stemmers", + "rustc-hash", + "serde", + "serde_json", + "sketches-ddsketch", + "smallvec", + "tantivy-bitpacker", + "tantivy-columnar", + "tantivy-common", + "tantivy-fst", + "tantivy-query-grammar", + "tantivy-stacker", + "tantivy-tokenizer-api", + "tempfile", + "thiserror 2.0.17", + "time", + "uuid", + "winapi", +] + +[[package]] +name = "tantivy-bitpacker" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3b04eed5108d8283607da6710fe17a7663523440eaf7ea5a1a440d19a1448b6" +dependencies = [ + "bitpacking", +] + +[[package]] +name = "tantivy-columnar" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b628488ae936c83e92b5c4056833054ca56f76c0e616aee8339e24ac89119cd" +dependencies = [ + "downcast-rs", + "fastdivide", + "itertools", + "serde", + "tantivy-bitpacker", + "tantivy-common", + "tantivy-sstable", + "tantivy-stacker", +] + +[[package]] +name = "tantivy-common" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f880aa7cab0c063a47b62596d10991cdd0b6e0e0575d9c5eeb298b307a25de55" +dependencies = [ + "async-trait", + "byteorder", + "ownedbytes", + "serde", + "time", +] + +[[package]] +name = "tantivy-fst" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d60769b80ad7953d8a7b2c70cdfe722bbcdcac6bccc8ac934c40c034d866fc18" +dependencies = [ + "byteorder", + "regex-syntax", + "utf8-ranges", +] + +[[package]] +name = "tantivy-query-grammar" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "768fccdc84d60d86235d42d7e4c33acf43c418258ff5952abf07bd7837fcd26b" +dependencies = [ + "nom", + "serde", + "serde_json", +] + +[[package]] +name = "tantivy-sstable" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8292095d1a8a2c2b36380ec455f910ab52dde516af36321af332c93f20ab7d5" +dependencies = [ + "futures-util", + "itertools", + "tantivy-bitpacker", + "tantivy-common", + "tantivy-fst", + "zstd", +] + +[[package]] +name = "tantivy-stacker" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d38a379411169f0b3002c9cba61cdfe315f757e9d4f239c00c282497a0749d" +dependencies = [ + "murmurhash32", + "rand_distr", + "tantivy-common", +] + +[[package]] +name = "tantivy-tokenizer-api" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23024f6aeb25ceb1a0e27740c84bdb0fae52626737b7e9a9de6ad5aa25c7b038" +dependencies = [ + "serde", +] + [[package]] name = "tao" -version = "0.31.1" +version = "0.34.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3731d04d4ac210cd5f344087733943b9bfb1a32654387dad4d1c70de21aee2c9" +checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" dependencies = [ - "bitflags 2.8.0", - "cocoa", - "core-foundation", + "bitflags 2.10.0", + "block2", + "core-foundation 0.10.1", "core-graphics", "crossbeam-channel", "dispatch", @@ -4059,7 +5120,9 @@ dependencies = [ "ndk", "ndk-context", "ndk-sys", - "objc", + "objc2", + "objc2-app-kit", + "objc2-foundation", "once_cell", "parking_lot", "raw-window-handle", @@ -4067,8 +5130,8 @@ dependencies = [ "tao-macros", "unicode-segmentation", "url", - "windows", - "windows-core 0.58.0", + "windows 0.61.3", + "windows-core 0.61.2", "windows-version", "x11-dl", ] @@ -4081,14 +5144,14 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] name = "tar" -version = "0.4.43" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6" +checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" dependencies = [ "filetime", "libc", @@ -4103,17 +5166,17 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.2.5" +version = "2.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58a998b6be84104ca05c7e9a21f2180ddec020c8b84ea59a8fc8530a2a19588d" +checksum = "8a3868da5508446a7cd08956d523ac3edf0a8bc20bf7e4038f9a95c2800d2033" dependencies = [ "anyhow", "bytes", + "cookie", "dirs 6.0.0", "dunce", "embed_plist", - "futures-util", - "getrandom 0.2.15", + "getrandom 0.3.4", "glob", "gtk", "heck 0.5.0", @@ -4127,10 +5190,12 @@ dependencies = [ "objc2", "objc2-app-kit", "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", "percent-encoding", "plist", "raw-window-handle", - "reqwest", + "reqwest 0.12.26", "serde", "serde_json", "serde_repr", @@ -4141,60 +5206,59 @@ dependencies = [ "tauri-runtime", "tauri-runtime-wry", "tauri-utils", - "thiserror 2.0.11", + "thiserror 2.0.17", "tokio", "tray-icon", "url", - "urlpattern", "webkit2gtk", "webview2-com", "window-vibrancy", - "windows", + "windows 0.61.3", ] [[package]] name = "tauri-build" -version = "2.0.5" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e950124f6779c6cf98e3260c7a6c8488a74aa6350dd54c6950fdaa349bca2df" +checksum = "17fcb8819fd16463512a12f531d44826ce566f486d7ccd211c9c8cebdaec4e08" dependencies = [ "anyhow", "cargo_toml", - "dirs 5.0.1", + "dirs 6.0.0", "glob", "heck 0.5.0", "json-patch", - "schemars", + "schemars 0.8.22", "semver", "serde", "serde_json", "tauri-utils", "tauri-winres", - "toml 0.8.20", + "toml 0.9.8", "walkdir", ] [[package]] name = "tauri-codegen" -version = "2.0.4" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f77894f9ddb5cb6c04fcfe8c8869ebe0aded4dabf19917118d48be4a95599ab5" +checksum = "9fa9844cefcf99554a16e0a278156ae73b0d8680bbc0e2ad1e4287aadd8489cf" dependencies = [ "base64 0.22.1", "brotli", "ico", "json-patch", "plist", - "png", + "png 0.17.16", "proc-macro2", "quote", "semver", "serde", "serde_json", "sha2", - "syn 2.0.98", + "syn 2.0.111", "tauri-utils", - "thiserror 2.0.11", + "thiserror 2.0.17", "time", "url", "uuid", @@ -4203,32 +5267,32 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.0.4" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3240a5caed760a532e8f687be6f05b2c7d11a1d791fb53ccc08cfeb3e5308736" +checksum = "3764a12f886d8245e66b7ee9b43ccc47883399be2019a61d80cf0f4117446fde" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", "tauri-codegen", "tauri-utils", ] [[package]] name = "tauri-plugin" -version = "2.0.4" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5841b9a0200e954ef7457f8d327091424328891e267a97b641dc246cc54d0dec" +checksum = "0e1d0a4860b7ff570c891e1d2a586bf1ede205ff858fbc305e0b5ae5d14c1377" dependencies = [ "anyhow", "glob", "plist", - "schemars", + "schemars 0.8.22", "serde", "serde_json", "tauri-utils", - "toml 0.8.20", + "toml 0.9.8", "walkdir", ] @@ -4239,55 +5303,112 @@ dependencies = [ "ahqstore-types", "ahqstore_gh_hash", "anyhow", + "bcrypt", + "chacha20poly1305", + "futures", + "lazy_static", "lixploy", "msi", "open", + "reqwest 0.13.1", "serde", + "serde_json", + "tantivy", "tauri", "tauri-plugin", - "thiserror 2.0.11", + "thiserror 2.0.17", + "tokio", "whatadistro", + "win32_notif", + "windows 0.62.2", ] [[package]] name = "tauri-plugin-autostart" -version = "2.2.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c13f843e5e5df3eed270fc42b02923cc1a6b5c7e56b0f3ac1d858ab2c8b5fb" +checksum = "459383cebc193cdd03d1ba4acc40f2c408a7abce419d64bdcd2d745bc2886f70" dependencies = [ "auto-launch", "serde", "serde_json", "tauri", "tauri-plugin", - "thiserror 2.0.11", + "thiserror 2.0.17", ] [[package]] name = "tauri-plugin-deep-link" -version = "2.2.0" +version = "2.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35d51ffd286073414d26353bcfc9e83e3cd63f96fa7f7a912f92f2118e5de5a6" +checksum = "6e82759f7c7d51de3cbde51c04b3f2332de52436ed84541182cd8944b04e9e73" dependencies = [ "dunce", + "plist", "rust-ini", "serde", "serde_json", "tauri", "tauri-plugin", "tauri-utils", - "thiserror 2.0.11", + "thiserror 2.0.17", "tracing", "url", - "windows-registry 0.3.0", - "windows-result", + "windows-registry 0.5.3", + "windows-result 0.3.4", +] + +[[package]] +name = "tauri-plugin-fs" +version = "2.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47df422695255ecbe7bac7012440eddaeefd026656171eac9559f5243d3230d9" +dependencies = [ + "anyhow", + "dunce", + "glob", + "percent-encoding", + "schemars 0.8.22", + "serde", + "serde_json", + "serde_repr", + "tauri", + "tauri-plugin", + "tauri-utils", + "thiserror 2.0.17", + "toml 0.9.8", + "url", +] + +[[package]] +name = "tauri-plugin-http" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00685aceab12643cf024f712ab0448ba8fcadf86f2391d49d2e5aa732aacc70" +dependencies = [ + "bytes", + "cookie_store 0.21.1", + "data-url", + "http", + "regex", + "reqwest 0.12.26", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "tauri-plugin-fs", + "thiserror 2.0.17", + "tokio", + "url", + "urlpattern", ] [[package]] name = "tauri-plugin-os" -version = "2.2.0" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dda2d571a9baf0664c1f2088db227e3072f9028602fafa885deade7547c3b738" +checksum = "d8f08346c8deb39e96f86973da0e2d76cbb933d7ac9b750f6dc4daf955a6f997" dependencies = [ "gethostname", "log", @@ -4298,29 +5419,30 @@ dependencies = [ "sys-locale", "tauri", "tauri-plugin", - "thiserror 2.0.11", + "thiserror 2.0.17", ] [[package]] name = "tauri-plugin-single-instance" -version = "2.2.1" +version = "2.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c387d4d96690131dc46d1d2827df5c222b896a2bfeb15a16267229a55c50b5" +checksum = "dd707f8c86b4e3004e2c141fa24351f1909ba40ce1b8437e30d5ed5277dd3710" dependencies = [ "serde", "serde_json", "tauri", - "thiserror 2.0.11", + "tauri-plugin-deep-link", + "thiserror 2.0.17", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.60.2", "zbus", ] [[package]] name = "tauri-plugin-updater" -version = "2.5.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebf3da08c36fb03c98c76e5563d4e74d9a590df0f40978cbe07f39cb52833f7c" +checksum = "27cbc31740f4d507712550694749572ec0e43bdd66992db7599b89fbfd6b167b" dependencies = [ "base64 0.22.1", "dirs 6.0.0", @@ -4328,10 +5450,11 @@ dependencies = [ "futures-util", "http", "infer", + "log", "minisign-verify", "osakit", "percent-encoding", - "reqwest", + "reqwest 0.12.26", "semver", "serde", "serde_json", @@ -4339,38 +5462,59 @@ dependencies = [ "tauri", "tauri-plugin", "tempfile", - "thiserror 2.0.11", + "thiserror 2.0.17", "time", "tokio", "url", - "windows-sys 0.59.0", - "zip", + "windows-sys 0.60.2", + "zip 4.6.1", +] + +[[package]] +name = "tauri-plugin-window-state" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73736611e14142408d15353e21e3cca2f12a3cfb523ad0ce85999b6d2ef1a704" +dependencies = [ + "bitflags 2.10.0", + "log", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.17", ] [[package]] name = "tauri-runtime" -version = "2.3.0" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2274ef891ccc0a8d318deffa9d70053f947664d12d58b9c0d1ae5e89237e01f7" +checksum = "87f766fe9f3d1efc4b59b17e7a891ad5ed195fa8d23582abb02e6c9a01137892" dependencies = [ + "cookie", "dpi", "gtk", "http", "jni", + "objc2", + "objc2-ui-kit", + "objc2-web-kit", "raw-window-handle", "serde", "serde_json", "tauri-utils", - "thiserror 2.0.11", + "thiserror 2.0.17", "url", - "windows", + "webkit2gtk", + "webview2-com", + "windows 0.61.3", ] [[package]] name = "tauri-runtime-wry" -version = "2.3.0" +version = "2.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3707b40711d3b9f6519150869e358ffbde7c57567fb9b5a8b51150606939b2a0" +checksum = "187a3f26f681bdf028f796ccf57cf478c1ee422c50128e5a0a6ebeb3f5910065" dependencies = [ "gtk", "http", @@ -4379,6 +5523,7 @@ dependencies = [ "objc2", "objc2-app-kit", "objc2-foundation", + "once_cell", "percent-encoding", "raw-window-handle", "softbuffer", @@ -4388,16 +5533,17 @@ dependencies = [ "url", "webkit2gtk", "webview2-com", - "windows", + "windows 0.61.3", "wry", ] [[package]] name = "tauri-utils" -version = "2.1.1" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96fb10e7cc97456b2d5b9c03e335b5de5da982039a303a20d10006885e4523a0" +checksum = "76a423c51176eb3616ee9b516a9fa67fed5f0e78baaba680e44eb5dd2cc37490" dependencies = [ + "anyhow", "brotli", "cargo_metadata", "ctor", @@ -4414,15 +5560,15 @@ dependencies = [ "proc-macro2", "quote", "regex", - "schemars", + "schemars 0.8.22", "semver", "serde", "serde-untagged", "serde_json", "serde_with", "swift-rs", - "thiserror 2.0.11", - "toml 0.8.20", + "thiserror 2.0.17", + "toml 0.9.8", "url", "urlpattern", "uuid", @@ -4431,26 +5577,26 @@ dependencies = [ [[package]] name = "tauri-winres" -version = "0.1.1" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5993dc129e544393574288923d1ec447c857f3f644187f4fbf7d9a875fbfc4fb" +checksum = "1087b111fe2b005e42dbdc1990fc18593234238d47453b0c99b7de1c9ab2c1e0" dependencies = [ + "dunce", "embed-resource", - "toml 0.7.8", + "toml 0.9.8", ] [[package]] name = "tempfile" -version = "3.16.0" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ - "cfg-if", "fastrand", - "getrandom 0.3.1", + "getrandom 0.3.4", "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -4464,12 +5610,6 @@ dependencies = [ "utf-8", ] -[[package]] -name = "thin-slice" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" - [[package]] name = "thiserror" version = "1.0.69" @@ -4481,11 +5621,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.11" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.11", + "thiserror-impl 2.0.17", ] [[package]] @@ -4496,28 +5636,28 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] name = "thiserror-impl" -version = "2.0.11" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] name = "time" -version = "0.3.37" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", - "itoa 1.0.14", + "itoa", "num-conv", "powerfmt", "serde", @@ -4527,15 +5667,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.2" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.19" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ "num-conv", "time-core", @@ -4557,14 +5697,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" dependencies = [ "displaydoc", - "zerovec", + "zerovec 0.10.4", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec 0.11.5", ] [[package]] name = "tinyvec" -version = "1.8.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -4577,25 +5727,36 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.43.0" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "backtrace", "bytes", "libc", "mio", "pin-project-lite", "signal-hook-registry", "socket2", - "windows-sys 0.52.0", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] name = "tokio-rustls" -version = "0.26.1" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ "rustls", "tokio", @@ -4603,9 +5764,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.13" +version = "0.7.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" dependencies = [ "bytes", "futures-core", @@ -4616,74 +5777,100 @@ dependencies = [ [[package]] name = "toml" -version = "0.7.8" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" dependencies = [ "serde", - "serde_spanned", - "toml_datetime", - "toml_edit 0.19.15", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "toml_edit 0.20.2", ] [[package]] name = "toml" -version = "0.8.20" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit 0.22.23", + "indexmap 2.12.1", + "serde_core", + "serde_spanned 1.0.3", + "toml_datetime 0.7.3", + "toml_parser", + "toml_writer", + "winnow 0.7.14", ] [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" dependencies = [ "serde", ] [[package]] -name = "toml_edit" -version = "0.19.15" -source = "registry+https://github.com/rust-lang/crates.io-index" +name = "toml_datetime" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +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.7.1", - "serde", - "serde_spanned", - "toml_datetime", + "indexmap 2.12.1", + "toml_datetime 0.6.3", "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.20.7" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" dependencies = [ - "indexmap 2.7.1", - "toml_datetime", + "indexmap 2.12.1", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.22.23" +version = "0.23.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02a8b472d1a3d7c18e2d61a489aee3453fd9031c33e4f55bd533f4a7adca1bee" +checksum = "5d7cbc3b4b49633d57a0509303158ca50de80ae32c265093b24c414705807832" dependencies = [ - "indexmap 2.7.1", - "serde", - "serde_spanned", - "toml_datetime", - "winnow 0.7.1", + "indexmap 2.12.1", + "toml_datetime 0.7.3", + "toml_parser", + "winnow 0.7.14", ] +[[package]] +name = "toml_parser" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +dependencies = [ + "winnow 0.7.14", +] + +[[package]] +name = "toml_writer" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" + [[package]] name = "tower" version = "0.5.2" @@ -4699,6 +5886,24 @@ dependencies = [ "tower-service", ] +[[package]] +name = "tower-http" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "bitflags 2.10.0", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -4713,9 +5918,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" dependencies = [ "pin-project-lite", "tracing-attributes", @@ -4724,51 +5929,46 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" dependencies = [ "once_cell", ] [[package]] name = "tray-icon" -version = "0.19.2" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d48a05076dd272615d03033bf04f480199f7d1b66a8ac64d75c625fc4a70c06b" +checksum = "e3d5572781bee8e3f994d7467084e1b1fd7a93ce66bd480f8156ba89dee55a2b" dependencies = [ - "core-graphics", "crossbeam-channel", - "dirs 5.0.1", + "dirs 6.0.0", "libappindicator", "muda", "objc2", "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", "objc2-foundation", "once_cell", - "png", + "png 0.17.16", "serde", - "thiserror 1.0.69", - "windows-sys 0.59.0", + "thiserror 2.0.17", + "windows-sys 0.60.2", ] -[[package]] -name = "trim-in-place" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "343e926fc669bc8cde4fa3129ab681c63671bae288b1f1081ceee6d9d37904fc" - [[package]] name = "try-lock" version = "0.2.5" @@ -4777,15 +5977,15 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typeid" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e13db2e0ccd5e14a544e8a246ba2312cd25223f616442d7f2cb0e3db614236e" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" -version = "1.17.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "uds_windows" @@ -4841,9 +6041,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-segmentation" @@ -4851,6 +6051,16 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + [[package]] name = "untrusted" version = "0.9.0" @@ -4859,9 +6069,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.4" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", @@ -4888,10 +6098,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] -name = "utf16_iter" +name = "utf8-ranges" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" +checksum = "7fcfc827f90e53a02eaef5e535ee14266c1d569214c6aa70133a624d8a3164ba" [[package]] name = "utf8_iter" @@ -4901,19 +6111,21 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.13.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced87ca4be083373936a67f8de945faa23b6b42384bd5b64434850802c6dccd0" +checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" dependencies = [ - "getrandom 0.3.1", - "serde", + "getrandom 0.3.4", + "js-sys", + "serde_core", + "wasm-bindgen", ] [[package]] name = "version-compare" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" [[package]] name = "version_check" @@ -4933,9 +6145,9 @@ dependencies = [ [[package]] name = "vswhom-sys" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3b17ae1f6c8a2b28506cd96d412eebf83b4a0ff2cbefeeb952f2f9dfa44ba18" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" dependencies = [ "cc", "libc", @@ -4968,50 +6180,37 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "wasi" -version = "0.13.3+wasi-0.2.2" +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.98", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" dependencies = [ "cfg-if", "js-sys", @@ -5022,9 +6221,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5032,22 +6231,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" dependencies = [ + "bumpalo", "proc-macro2", "quote", - "syn 2.0.98", - "wasm-bindgen-backend", + "syn 2.0.111", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" dependencies = [ "unicode-ident", ] @@ -5067,9 +6266,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" dependencies = [ "js-sys", "wasm-bindgen", @@ -5129,25 +6328,34 @@ dependencies = [ "system-deps", ] +[[package]] +name = "webpki-root-certs" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36a29fc0408b113f68cf32637857ab740edfafdf460c326cd2afaa2d84cc05dc" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "webpki-roots" -version = "0.26.8" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" +checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" dependencies = [ "rustls-pki-types", ] [[package]] name = "webview2-com" -version = "0.34.0" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "823e7ebcfaea51e78f72c87fc3b65a1e602c321f407a0b36dbb327d7bb7cd921" +checksum = "d4ba622a989277ef3886dd5afb3e280e3dd6d974b766118950a08f8f678ad6a4" dependencies = [ "webview2-com-macros", "webview2-com-sys", - "windows", - "windows-core 0.58.0", + "windows 0.61.3", + "windows-core 0.61.2", "windows-implement", "windows-interface", ] @@ -5160,18 +6368,18 @@ checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] name = "webview2-com-sys" -version = "0.34.0" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a82bce72db6e5ee83c68b5de1e2cd6ea195b9fbff91cb37df5884cbe3222df4" +checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c" dependencies = [ - "thiserror 1.0.69", - "windows", - "windows-core 0.58.0", + "thiserror 2.0.17", + "windows 0.61.3", + "windows-core 0.61.2", ] [[package]] @@ -5180,6 +6388,18 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c97ebad4f59809511083f2161587445631bff21bb78d9e046b9ca5b2d05d913" +[[package]] +name = "win32_notif" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f31132e833bee191ad53cc2c49a416a9ea78cda20e1fae0ba0b605fae0047e" +dependencies = [ + "quick-xml", + "windows 0.62.2", + "windows-core 0.62.2", + "windows-registry 0.6.1", +] + [[package]] name = "winapi" version = "0.3.9" @@ -5198,11 +6418,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -5213,12 +6433,13 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "window-vibrancy" -version = "0.5.2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ea403deff7b51fff19e261330f71608ff2cdef5721d72b64180bb95be7c4150" +checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" dependencies = [ "objc2", "objc2-app-kit", + "objc2-core-foundation", "objc2-foundation", "raw-window-handle", "windows-sys 0.59.0", @@ -5227,124 +6448,214 @@ dependencies = [ [[package]] name = "windows" -version = "0.58.0" +version = "0.61.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" dependencies = [ - "windows-core 0.58.0", - "windows-targets 0.52.6", + "windows-collections 0.2.0", + "windows-core 0.61.2", + "windows-future 0.2.1", + "windows-link 0.1.3", + "windows-numerics 0.2.0", +] + +[[package]] +name = "windows" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +dependencies = [ + "windows-collections 0.3.2", + "windows-core 0.62.2", + "windows-future 0.3.2", + "windows-numerics 0.3.1", +] + +[[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-collections" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" +dependencies = [ + "windows-core 0.62.2", ] [[package]] name = "windows-core" -version = "0.52.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ - "windows-targets 0.52.6", + "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.58.0" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", - "windows-result", - "windows-strings 0.1.0", - "windows-targets 0.52.6", + "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 0.1.0", +] + +[[package]] +name = "windows-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +dependencies = [ + "windows-core 0.62.2", + "windows-link 0.2.1", + "windows-threading 0.2.1", ] [[package]] name = "windows-implement" -version = "0.58.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] name = "windows-interface" -version = "0.58.0" +version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] -name = "windows-registry" +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 = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" dependencies = [ - "windows-result", - "windows-strings 0.1.0", - "windows-targets 0.52.6", + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-numerics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" +dependencies = [ + "windows-core 0.62.2", + "windows-link 0.2.1", ] [[package]] name = "windows-registry" -version = "0.3.0" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bafa604f2104cf5ae2cc2db1dee84b7e6a5d11b05f737b60def0ffdc398cbc0a" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" dependencies = [ - "windows-result", - "windows-strings 0.2.0", - "windows-targets 0.52.6", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" +dependencies = [ + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", ] [[package]] name = "windows-result" -version = "0.2.0" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ - "windows-targets 0.52.6", + "windows-link 0.1.3", ] [[package]] -name = "windows-strings" -version = "0.1.0" +name = "windows-result" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-result", - "windows-targets 0.52.6", + "windows-link 0.2.1", ] [[package]] name = "windows-strings" -version = "0.2.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978d65aedf914c664c510d9de43c8fd85ca745eaff1ed53edf409b479e441663" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ - "windows-targets 0.52.6", + "windows-link 0.1.3", ] [[package]] -name = "windows-sys" -version = "0.45.0" +name = "windows-strings" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ - "windows-targets 0.42.2", + "windows-link 0.2.1", ] [[package]] name = "windows-sys" -version = "0.48.0" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ - "windows-targets 0.48.5", + "windows-targets 0.42.2", ] [[package]] @@ -5365,6 +6676,24 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[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" @@ -5380,21 +6709,6 @@ dependencies = [ "windows_x86_64_msvc 0.42.2", ] -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - [[package]] name = "windows-targets" version = "0.52.6" @@ -5413,40 +6727,53 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.0" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] -name = "windows-version" -version = "0.1.2" +name = "windows-threading" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c12476c23a74725c539b24eae8bfc0dac4029c39cdb561d9f23616accd4ae26d" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" dependencies = [ - "windows-targets 0.53.0", + "windows-link 0.1.3", ] [[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" +name = "windows-threading" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" +dependencies = [ + "windows-link 0.2.1", +] + +[[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.48.5" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" [[package]] name = "windows_aarch64_gnullvm" @@ -5456,9 +6783,9 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" @@ -5466,12 +6793,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" @@ -5480,9 +6801,9 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] name = "windows_i686_gnu" @@ -5490,12 +6811,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -5504,9 +6819,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" [[package]] name = "windows_i686_gnullvm" @@ -5516,9 +6831,9 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" @@ -5526,12 +6841,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - [[package]] name = "windows_i686_msvc" version = "0.52.6" @@ -5540,9 +6849,9 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" @@ -5550,12 +6859,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" @@ -5564,9 +6867,9 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" @@ -5574,12 +6877,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" @@ -5588,9 +6885,9 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" @@ -5598,12 +6895,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -5612,9 +6903,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" @@ -5627,9 +6918,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.1" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86e376c75f4f43f44db463cf729e0d3acbf954d13e22c51e26e4c264b4ab545f" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" dependencies = [ "memchr", ] @@ -5645,45 +6936,43 @@ dependencies = [ [[package]] name = "winreg" -version = "0.52.0" +version = "0.55.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" dependencies = [ "cfg-if", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] -name = "wit-bindgen-rt" -version = "0.33.0" +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" -dependencies = [ - "bitflags 2.8.0", -] +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] -name = "write16" -version = "1.0.0" +name = "writeable" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "wry" -version = "0.48.1" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2e33c08b174442ff80d5c791020696f9f8b4e4a87b8cfc7494aad6167ec44e1" +checksum = "728b7d4c8ec8d81cab295e0b5b8a4c263c0d41a785fb8f8c4df284e5411140a2" dependencies = [ "base64 0.22.1", - "block2 0.5.1", + "block2", "cookie", "crossbeam-channel", + "dirs 6.0.0", "dpi", "dunce", "gdkx11", @@ -5697,6 +6986,7 @@ dependencies = [ "ndk", "objc2", "objc2-app-kit", + "objc2-core-foundation", "objc2-foundation", "objc2-ui-kit", "objc2-web-kit", @@ -5706,13 +6996,13 @@ dependencies = [ "sha2", "soup3", "tao-macros", - "thiserror 2.0.11", + "thiserror 2.0.17", "url", "webkit2gtk", "webkit2gtk-sys", "webview2-com", - "windows", - "windows-core 0.58.0", + "windows 0.61.3", + "windows-core 0.61.2", "windows-version", "x11-dl", ] @@ -5740,34 +7030,34 @@ dependencies = [ [[package]] name = "xattr" -version = "1.4.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e105d177a3871454f754b33bb0ee637ecaaac997446375fd3e5d43a2ed00c909" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" dependencies = [ "libc", - "linux-raw-sys", "rustix", ] [[package]] -name = "xdg-home" -version = "1.3.0" +name = "yoke" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" dependencies = [ - "libc", - "windows-sys 0.59.0", + "serde", + "stable_deref_trait", + "yoke-derive 0.7.5", + "zerofrom", ] [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ - "serde", "stable_deref_trait", - "yoke-derive", + "yoke-derive 0.8.1", "zerofrom", ] @@ -5779,19 +7069,30 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", + "synstructure", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", "synstructure", ] [[package]] name = "zbus" -version = "5.4.0" +version = "5.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbddd8b6cb25d5d8ec1b23277b45299a98bfb220f1761ca11e186d5c702507f8" +checksum = "b622b18155f7a93d1cd2dc8c01d2d6a44e08fb9ebb7b3f9e6ed101488bad6c91" dependencies = [ "async-broadcast", "async-executor", - "async-fs", "async-io", "async-lock", "async-process", @@ -5802,18 +7103,17 @@ dependencies = [ "enumflags2", "event-listener", "futures-core", - "futures-util", + "futures-lite", "hex", "nix", "ordered-stream", "serde", "serde_repr", - "static_assertions", "tracing", "uds_windows", - "windows-sys 0.59.0", - "winnow 0.7.1", - "xdg-home", + "uuid", + "windows-sys 0.61.2", + "winnow 0.7.14", "zbus_macros", "zbus_names", "zvariant", @@ -5821,14 +7121,14 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.4.0" +version = "5.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac404d48b4e9cf193c8b49589f3280ceca5ff63519e7e64f55b4cf9c47ce146" +checksum = "1cdb94821ca8a87ca9c298b5d1cbd80e2a8b67115d99f6e4551ac49e42b6a314" dependencies = [ - "proc-macro-crate 3.2.0", + "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", "zbus_names", "zvariant", "zvariant_utils", @@ -5842,57 +7142,81 @@ checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" dependencies = [ "serde", "static_assertions", - "winnow 0.7.1", + "winnow 0.7.14", "zvariant", ] [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" dependencies = [ - "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", ] [[package]] name = "zerofrom" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke 0.8.1", + "zerofrom", +] [[package]] name = "zerovec" @@ -5900,9 +7224,20 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" dependencies = [ - "yoke", + "yoke 0.7.5", + "zerofrom", + "zerovec-derive 0.10.3", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke 0.8.1", "zerofrom", - "zerovec-derive", + "zerovec-derive 0.11.2", ] [[package]] @@ -5913,62 +7248,142 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] name = "zip" -version = "2.2.2" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae9c1ea7b3a5e1f4b922ff856a129881167511563dc219869afe3787fc0c1a45" +checksum = "caa8cd6af31c3b31c6631b8f483848b91589021b28fffe50adada48d4f4d2ed1" dependencies = [ "arbitrary", "crc32fast", - "crossbeam-utils", - "displaydoc", - "indexmap 2.7.1", + "indexmap 2.12.1", "memchr", - "thiserror 2.0.11", +] + +[[package]] +name = "zip" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdd8a47718a4ee5fe78e07667cd36f3de80e7c2bfe727c7074245ffc7303c037" +dependencies = [ + "aes", + "arbitrary", + "bzip2", + "constant_time_eq", + "crc32fast", + "deflate64", + "flate2", + "generic-array", + "getrandom 0.3.4", + "hmac", + "indexmap 2.12.1", + "lzma-rust2", + "memchr", + "pbkdf2", + "ppmd-rust", + "sha1", + "time", + "zeroize", + "zopfli", + "zstd", +] + +[[package]] +name = "zlib-rs" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51f936044d677be1a1168fae1d03b583a285a5dd9d8cbf7b24c23aa1fc775235" + +[[package]] +name = "zopfli" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" +dependencies = [ + "bumpalo", + "crc32fast", + "log", + "simd-adler32", +] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", ] [[package]] name = "zvariant" -version = "5.4.0" +version = "5.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2df9ee044893fcffbdc25de30546edef3e32341466811ca18421e3cd6c5a3ac" +checksum = "2be61892e4f2b1772727be11630a62664a1826b62efa43a6fe7449521cb8744c" dependencies = [ "endi", "enumflags2", "serde", - "static_assertions", - "winnow 0.7.1", + "winnow 0.7.14", "zvariant_derive", "zvariant_utils", ] [[package]] name = "zvariant_derive" -version = "5.4.0" +version = "5.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74170caa85b8b84cc4935f2d56a57c7a15ea6185ccdd7eadb57e6edd90f94b2f" +checksum = "da58575a1b2b20766513b1ec59d8e2e68db2745379f961f86650655e862d2006" dependencies = [ - "proc-macro-crate 3.2.0", + "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.111", "zvariant_utils", ] [[package]] name = "zvariant_utils" -version = "3.2.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34" +checksum = "c6949d142f89f6916deca2232cf26a8afacf2b9fdc35ce766105e104478be599" dependencies = [ "proc-macro2", "quote", "serde", - "static_assertions", - "syn 2.0.98", - "winnow 0.7.1", + "syn 2.0.111", + "winnow 0.7.14", ] diff --git a/src-tauri/Cargo.patch.toml b/src-tauri/Cargo.patch.toml deleted file mode 100644 index 508ba9e..0000000 --- a/src-tauri/Cargo.patch.toml +++ /dev/null @@ -1,25 +0,0 @@ -[package] -name = "ahqstore-new" -version = "0.1.0" -description = "The Open Sourced App Store" -authors = ["AHQ Softwares"] -edition = "2021" - -[lib] -name = "ahqstore_new_lib" -crate-type = ["staticlib", "cdylib", "rlib"] - -[build-dependencies] -tauri-build = { version = "2", features = [] } - -[dependencies] -tauri = { version = "2", features = ["tray-icon", "image-png"] } -serde = { version = "1", features = ["derive"] } -serde_json = "1" - -tauri-plugin-ahqstore = { path = "../src-plugin" } -tauri-plugin-deep-link = "2" -tauri-plugin-os = "2" - -[patch.crates-io] -wry = { git = "https://github.com/ahqsoftwares/wry.git", branch = "patch-2" } diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 1968a54..9ab41c9 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -2,7 +2,7 @@ name = "ahqstore-new" version = "0.1.0" description = "The Open Sourced App Store" -authors = ["AHQ Softwares"] +authors = ["AHQ Softwares "] edition = "2021" [lib] @@ -17,14 +17,23 @@ tauri = { version = "2", features = ["tray-icon", "image-png"] } serde = { version = "1", features = ["derive"] } serde_json = "1" +percent-encoding = "2" + tauri-plugin-ahqstore = { path = "../src-plugin" } tauri-plugin-deep-link = "2" tauri-plugin-os = "2" +tauri-plugin-http = "2" [target.'cfg(windows)'.dependencies] -windows = { version = "=0.58", features = ["Win32_Graphics_Dwm"] } +windows = { version = "=0.62", features = [ + "Win32_Graphics_Dwm", + "Win32_System_Registry", +] } [target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies] tauri-plugin-autostart = "2" -tauri-plugin-single-instance = "2" +tauri-plugin-single-instance = { version = "2", features = ["deep-link"] } tauri-plugin-updater = "2" +tauri-plugin-window-state = "2" + +zip = "7" diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json index a9c16dd..ac84181 100644 --- a/src-tauri/capabilities/default.json +++ b/src-tauri/capabilities/default.json @@ -3,5 +3,22 @@ "identifier": "default", "description": "Capability for the main window", "windows": ["main"], - "permissions": ["core:default", "ahqstore:allow-all"] + "permissions": [ + "core:default", + "ahqstore:allow-all", + { + "identifier": "http:default", + "allow": [ + { + "url": "https://*" + }, + { + "url": "https://**" + }, + { + "url": "https://**/*" + } + ] + } + ] } diff --git a/src-tauri/capabilities/desktop.json b/src-tauri/capabilities/desktop.json index 50da809..b104839 100644 --- a/src-tauri/capabilities/desktop.json +++ b/src-tauri/capabilities/desktop.json @@ -2,7 +2,7 @@ "$schema": "../gen/schemas/desktop-schema.json", "identifier": "desktop-capability", "platforms": ["macOS", "windows", "linux"], - "windows": ["main"], + "windows": ["main", "code"], "permissions": [ "updater:default", "core:window:allow-start-dragging", @@ -13,6 +13,9 @@ "core:window:allow-toggle-maximize", "core:window:allow-close", "core:window:allow-is-closable", + "core:event:allow-emit", + "deep-link:default", + "deep-link:allow-get-current", "autostart:allow-enable", "autostart:allow-disable", "autostart:allow-is-enabled", diff --git a/src-tauri/capabilities/plugin.json b/src-tauri/capabilities/plugin.json new file mode 100644 index 0000000..f299fa7 --- /dev/null +++ b/src-tauri/capabilities/plugin.json @@ -0,0 +1,24 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "desktop-plugin", + "description": "Permissions for AHQ Store Desktop Plugins", + "platforms": ["macOS", "windows", "linux"], + "windows": ["plugin-*", "settings-plugin-*"], + "permissions": [ + { + "identifier": "http:default", + "allow": [ + { + "url": "https://*" + }, + { + "url": "https://**" + }, + { + "url": "https://**/*" + } + ] + }, + "ahqstore:allow-get-commit" + ] +} diff --git a/src-tauri/gen/android/app/build.gradle.kts b/src-tauri/gen/android/app/build.gradle.kts index 141d175..7cac131 100644 --- a/src-tauri/gen/android/app/build.gradle.kts +++ b/src-tauri/gen/android/app/build.gradle.kts @@ -5,6 +5,7 @@ plugins { id("com.android.application") id("org.jetbrains.kotlin.android") id("rust") + id("org.jetbrains.kotlin.plugin.compose") version "2.2.10" } val tauriProperties = Properties().apply { @@ -15,13 +16,13 @@ val tauriProperties = Properties().apply { } android { - compileSdk = 35 + compileSdk = 36 namespace = "com.ahqstore.app" defaultConfig { manifestPlaceholders["usesCleartextTraffic"] = "false" applicationId = "com.ahqstore.app" minSdk = 26 - targetSdk = 35 + targetSdk = 36 versionCode = tauriProperties.getProperty("tauri.android.versionCode", "1").toInt() versionName = tauriProperties.getProperty("tauri.android.versionName", "1.0") } @@ -69,7 +70,13 @@ android { jvmTarget = "1.8" } buildFeatures { - buildConfig = true + buildConfig = true + viewBinding = true + compose = true + } + + composeOptions { + kotlinCompilerExtensionVersion = "1.5.15" } } @@ -78,12 +85,30 @@ rust { } dependencies { - implementation("androidx.webkit:webkit:1.12.1") - implementation("androidx.appcompat:appcompat:1.7.0") + val composeBom = platform("androidx.compose:compose-bom:2025.05.00") + implementation(composeBom) + + implementation("androidx.work:work-runtime-ktx:2.10.3") + implementation("androidx.webkit:webkit:1.14.0") + + // Get Full Compose + implementation("androidx.compose.material3:material3") + + // For AppWidgets support + implementation("androidx.glance:glance-appwidget:1.1.1") + // For interop APIs with Material 3 + implementation("androidx.glance:glance-material3:1.1.1") + + implementation("androidx.compose.ui:ui") + implementation("androidx.compose.ui:ui-tooling-preview") + + implementation("androidx.appcompat:appcompat:1.7.1") implementation("com.google.android.material:material:1.12.0") testImplementation("junit:junit:4.13.2") - androidTestImplementation("androidx.test.ext:junit:1.2.1") - androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1") + + debugImplementation("androidx.compose.ui:ui-tooling") + androidTestImplementation("androidx.test.ext:junit:1.3.0") + androidTestImplementation("androidx.test.espresso:espresso-core:3.7.0") } apply(from = "tauri.build.gradle.kts") \ No newline at end of file diff --git a/src-tauri/gen/android/app/proguard-rules.pro b/src-tauri/gen/android/app/proguard-rules.pro index 481bb43..0cc8840 100644 --- a/src-tauri/gen/android/app/proguard-rules.pro +++ b/src-tauri/gen/android/app/proguard-rules.pro @@ -18,4 +18,7 @@ # If you keep the line number information, uncomment this to # hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file +#-renamesourcefileattribute SourceFile + +-keep class androidx.** { *; } +-keep interface androidx.** { *; } \ No newline at end of file diff --git a/src-tauri/gen/android/app/src/main/AndroidManifest.xml b/src-tauri/gen/android/app/src/main/AndroidManifest.xml index d971ba5..199903f 100644 --- a/src-tauri/gen/android/app/src/main/AndroidManifest.xml +++ b/src-tauri/gen/android/app/src/main/AndroidManifest.xml @@ -1,50 +1,62 @@ - - - - + - - + + + + - - - - - - - - - - - - - - - - - - - - + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src-tauri/gen/android/app/src/main/ic_launcher-playstore.png b/src-tauri/gen/android/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..d8e32ad Binary files /dev/null and b/src-tauri/gen/android/app/src/main/ic_launcher-playstore.png differ diff --git a/src-tauri/gen/android/app/src/main/java/com/ahqstore/app/MainActivity.kt b/src-tauri/gen/android/app/src/main/java/com/ahqstore/app/MainActivity.kt index 28ad372..b147c00 100644 --- a/src-tauri/gen/android/app/src/main/java/com/ahqstore/app/MainActivity.kt +++ b/src-tauri/gen/android/app/src/main/java/com/ahqstore/app/MainActivity.kt @@ -1,3 +1,11 @@ package com.ahqstore.app -class MainActivity : TauriActivity() \ No newline at end of file +import android.os.Bundle +import androidx.activity.enableEdgeToEdge + +class MainActivity : TauriActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + enableEdgeToEdge() + super.onCreate(savedInstanceState) + } +} \ No newline at end of file diff --git a/src-tauri/gen/android/app/src/main/res/drawable-nodpi/example_appwidget_preview.png b/src-tauri/gen/android/app/src/main/res/drawable-nodpi/example_appwidget_preview.png new file mode 100644 index 0000000..894b069 Binary files /dev/null and b/src-tauri/gen/android/app/src/main/res/drawable-nodpi/example_appwidget_preview.png differ diff --git a/src-tauri/gen/android/app/src/main/res/drawable-v21/app_widget_background.xml b/src-tauri/gen/android/app/src/main/res/drawable-v21/app_widget_background.xml new file mode 100644 index 0000000..1f771c2 --- /dev/null +++ b/src-tauri/gen/android/app/src/main/res/drawable-v21/app_widget_background.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/src-tauri/gen/android/app/src/main/res/drawable-v21/app_widget_inner_view_background.xml b/src-tauri/gen/android/app/src/main/res/drawable-v21/app_widget_inner_view_background.xml new file mode 100644 index 0000000..a00df42 --- /dev/null +++ b/src-tauri/gen/android/app/src/main/res/drawable-v21/app_widget_inner_view_background.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/src-tauri/gen/android/app/src/main/res/drawable-v31/app_widget_background.xml b/src-tauri/gen/android/app/src/main/res/drawable-v31/app_widget_background.xml new file mode 100644 index 0000000..df1daab --- /dev/null +++ b/src-tauri/gen/android/app/src/main/res/drawable-v31/app_widget_background.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/src-tauri/gen/android/app/src/main/res/drawable-v31/app_widget_inner_view_background.xml b/src-tauri/gen/android/app/src/main/res/drawable-v31/app_widget_inner_view_background.xml new file mode 100644 index 0000000..fc8bb8b --- /dev/null +++ b/src-tauri/gen/android/app/src/main/res/drawable-v31/app_widget_inner_view_background.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/src-tauri/gen/android/app/src/main/res/drawable/ic_launcher_background.xml b/src-tauri/gen/android/app/src/main/res/drawable/ic_launcher_background.xml index 07d5da9..87bd624 100644 --- a/src-tauri/gen/android/app/src/main/res/drawable/ic_launcher_background.xml +++ b/src-tauri/gen/android/app/src/main/res/drawable/ic_launcher_background.xml @@ -1,170 +1,22 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:viewportWidth="1064" + android:viewportHeight="1064"> + + + + + + + + + diff --git a/src-tauri/gen/android/app/src/main/res/layout/activity_main.xml b/src-tauri/gen/android/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index 4fc2444..0000000 --- a/src-tauri/gen/android/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/src-tauri/gen/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..c4a603d --- /dev/null +++ b/src-tauri/gen/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/src-tauri/gen/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..c4a603d --- /dev/null +++ b/src-tauri/gen/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 076626d..0000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000..1510b47 Binary files /dev/null and b/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png deleted file mode 100644 index 86f34fa..0000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp b/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..6dea0a1 Binary files /dev/null and b/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 076626d..0000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000..4dcd757 Binary files /dev/null and b/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 49e2fe9..0000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000..d4024b5 Binary files /dev/null and b/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png deleted file mode 100644 index c9b993c..0000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..d3512f1 Binary files /dev/null and b/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index 49e2fe9..0000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 0000000..2729155 Binary files /dev/null and b/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 2a3c218..0000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000..3c12002 Binary files /dev/null and b/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png deleted file mode 100644 index 051d5ee..0000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp b/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..9052110 Binary files /dev/null and b/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index 2a3c218..0000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..7b2cd97 Binary files /dev/null and b/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index a2c1dd2..0000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 0000000..6b08e8b Binary files /dev/null and b/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 0dd0a1e..0000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..21bf8cf Binary files /dev/null and b/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index a2c1dd2..0000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..53732f3 Binary files /dev/null and b/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 488ae9a..0000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 0000000..acd14d9 Binary files /dev/null and b/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png deleted file mode 100644 index b60058d..0000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..75e5988 Binary files /dev/null and b/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index 488ae9a..0000000 Binary files a/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..e3ad9f4 Binary files /dev/null and b/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ diff --git a/src-tauri/gen/android/app/src/main/res/values-night-v31/themes.xml b/src-tauri/gen/android/app/src/main/res/values-night-v31/themes.xml new file mode 100644 index 0000000..6e265ee --- /dev/null +++ b/src-tauri/gen/android/app/src/main/res/values-night-v31/themes.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/src-tauri/gen/android/app/src/main/res/values-night/themes.xml b/src-tauri/gen/android/app/src/main/res/values-night/themes.xml deleted file mode 100644 index 6995e46..0000000 --- a/src-tauri/gen/android/app/src/main/res/values-night/themes.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - diff --git a/src-tauri/gen/android/app/src/main/res/values-v21/styles.xml b/src-tauri/gen/android/app/src/main/res/values-v21/styles.xml new file mode 100644 index 0000000..0b35f7d --- /dev/null +++ b/src-tauri/gen/android/app/src/main/res/values-v21/styles.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/src-tauri/gen/android/app/src/main/res/values-v31/styles.xml b/src-tauri/gen/android/app/src/main/res/values-v31/styles.xml new file mode 100644 index 0000000..7407060 --- /dev/null +++ b/src-tauri/gen/android/app/src/main/res/values-v31/styles.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/src-tauri/gen/android/app/src/main/res/values-v31/themes.xml b/src-tauri/gen/android/app/src/main/res/values-v31/themes.xml new file mode 100644 index 0000000..36f9858 --- /dev/null +++ b/src-tauri/gen/android/app/src/main/res/values-v31/themes.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/src-tauri/gen/android/app/src/main/res/values/attrs.xml b/src-tauri/gen/android/app/src/main/res/values/attrs.xml new file mode 100644 index 0000000..7781ac8 --- /dev/null +++ b/src-tauri/gen/android/app/src/main/res/values/attrs.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src-tauri/gen/android/app/src/main/res/values/colors.xml b/src-tauri/gen/android/app/src/main/res/values/colors.xml index f8c6127..03875ad 100644 --- a/src-tauri/gen/android/app/src/main/res/values/colors.xml +++ b/src-tauri/gen/android/app/src/main/res/values/colors.xml @@ -7,4 +7,8 @@ #FF018786 #FF000000 #FFFFFFFF + #FFE1F5FE + #FF81D4FA + #FF039BE5 + #FF01579B \ No newline at end of file diff --git a/src-tauri/gen/android/app/src/main/res/values/dimens.xml b/src-tauri/gen/android/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..4db8c59 --- /dev/null +++ b/src-tauri/gen/android/app/src/main/res/values/dimens.xml @@ -0,0 +1,10 @@ + + + + + 0dp + + \ No newline at end of file diff --git a/src-tauri/gen/android/app/src/main/res/values/strings.xml b/src-tauri/gen/android/app/src/main/res/values/strings.xml index bcc2c6c..d953906 100644 --- a/src-tauri/gen/android/app/src/main/res/values/strings.xml +++ b/src-tauri/gen/android/app/src/main/res/values/strings.xml @@ -1,4 +1,13 @@ - AHQ Store NEO - AHQ Store NEO + AHQ Store + AHQ Store + + Updates + + Configure + + Checks if updates are available + Logo + You are up to date! + Add widget \ No newline at end of file diff --git a/src-tauri/gen/android/app/src/main/res/values/styles.xml b/src-tauri/gen/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..1488b62 --- /dev/null +++ b/src-tauri/gen/android/app/src/main/res/values/styles.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/src-tauri/gen/android/app/src/main/res/values/themes.xml b/src-tauri/gen/android/app/src/main/res/values/themes.xml index 6995e46..ae10772 100644 --- a/src-tauri/gen/android/app/src/main/res/values/themes.xml +++ b/src-tauri/gen/android/app/src/main/res/values/themes.xml @@ -1,6 +1,19 @@ - + + diff --git a/src-tauri/gen/android/build.gradle.kts b/src-tauri/gen/android/build.gradle.kts index c5ef452..551c260 100644 --- a/src-tauri/gen/android/build.gradle.kts +++ b/src-tauri/gen/android/build.gradle.kts @@ -4,8 +4,8 @@ buildscript { mavenCentral() } dependencies { - classpath("com.android.tools.build:gradle:8.5.1") - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.25") + classpath("com.android.tools.build:gradle:8.12.2") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.10") } } diff --git a/src-tauri/gen/android/buildSrc/build.gradle.kts b/src-tauri/gen/android/buildSrc/build.gradle.kts index 39e90b0..e11d066 100644 --- a/src-tauri/gen/android/buildSrc/build.gradle.kts +++ b/src-tauri/gen/android/buildSrc/build.gradle.kts @@ -18,6 +18,6 @@ repositories { dependencies { compileOnly(gradleApi()) - implementation("com.android.tools.build:gradle:8.5.1") + implementation("com.android.tools.build:gradle:8.12.2") } diff --git a/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.properties b/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.properties index 173bdbd..fe17162 100644 --- a/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.properties +++ b/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Tue May 10 19:22:52 CST 2022 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/src-tauri/plugin-script/.gitignore b/src-tauri/plugin-script/.gitignore new file mode 100644 index 0000000..b6444c9 --- /dev/null +++ b/src-tauri/plugin-script/.gitignore @@ -0,0 +1,2 @@ +docs +node_modules \ No newline at end of file diff --git a/src-tauri/plugin-script/package.json b/src-tauri/plugin-script/package.json new file mode 100644 index 0000000..842e09c --- /dev/null +++ b/src-tauri/plugin-script/package.json @@ -0,0 +1,23 @@ +{ + "name": "plugin-script", + "version": "1.0.1", + "description": "A script used by AHQ Store internal plugins", + "type": "module", + "scripts": { + "build": "esbuild src/script.ts --format=iife --bundle --outfile=dist/bundle.js --minify --legal-comments=inline", + "dev": "esbuild src/script.ts --format=iife --bundle --outfile=dist/bundle.js --watch --legal-comments=inline", + "build:types": "tsc", + "dev:types": "tsc --watch" + }, + "keywords": [], + "author": "A. Chakraborty (@ahqsoftwares) ", + "license": "MIT", + "packageManager": "pnpm@10.17.0", + "devDependencies": { + "esbuild": "^0.25.10", + "typescript": "^5.9.2" + }, + "dependencies": { + "@tauri-apps/api": "^2.8.0" + } +} diff --git a/src-tauri/plugin-script/pnpm-lock.yaml b/src-tauri/plugin-script/pnpm-lock.yaml new file mode 100644 index 0000000..006034a --- /dev/null +++ b/src-tauri/plugin-script/pnpm-lock.yaml @@ -0,0 +1,491 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@tauri-apps/api': + specifier: ^2.8.0 + version: 2.8.0 + devDependencies: + esbuild: + specifier: ^0.25.10 + version: 0.25.10 + typescript: + specifier: ^5.9.2 + version: 5.9.2 + + types: + devDependencies: + typedoc: + specifier: ^0.28.13 + version: 0.28.13(typescript@5.9.2) + typedoc-plugin-markdown: + specifier: ^4.9.0 + version: 4.9.0(typedoc@0.28.13(typescript@5.9.2)) + typedoc-vitepress-theme: + specifier: ^1.1.2 + version: 1.1.2(typedoc-plugin-markdown@4.9.0(typedoc@0.28.13(typescript@5.9.2))) + typescript: + specifier: ^5.9.2 + version: 5.9.2 + +packages: + + '@esbuild/aix-ppc64@0.25.10': + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.10': + resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.10': + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.10': + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.10': + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.10': + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.10': + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.10': + resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.10': + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.10': + resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.10': + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.10': + resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.10': + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.10': + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.10': + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.10': + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.10': + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.10': + resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.10': + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.10': + resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.10': + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.10': + resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.10': + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.10': + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.10': + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.10': + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@gerrit0/mini-shiki@3.13.0': + resolution: {integrity: sha512-mCrNvZNYNrwKer5PWLF6cOc0OEe2eKzgy976x+IT2tynwJYl+7UpHTSeXQJGijgTcoOf+f359L946unWlYRnsg==} + + '@shikijs/engine-oniguruma@3.13.0': + resolution: {integrity: sha512-O42rBGr4UDSlhT2ZFMxqM7QzIU+IcpoTMzb3W7AlziI1ZF7R8eS2M0yt5Ry35nnnTX/LTLXFPUjRFCIW+Operg==} + + '@shikijs/langs@3.13.0': + resolution: {integrity: sha512-672c3WAETDYHwrRP0yLy3W1QYB89Hbpj+pO4KhxK6FzIrDI2FoEXNiNCut6BQmEApYLfuYfpgOZaqbY+E9b8wQ==} + + '@shikijs/themes@3.13.0': + resolution: {integrity: sha512-Vxw1Nm1/Od8jyA7QuAenaV78BG2nSr3/gCGdBkLpfLscddCkzkL36Q5b67SrLLfvAJTOUzW39x4FHVCFriPVgg==} + + '@shikijs/types@3.13.0': + resolution: {integrity: sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@tauri-apps/api@2.8.0': + resolution: {integrity: sha512-ga7zdhbS2GXOMTIZRT0mYjKJtR9fivsXzsyq5U3vjDL0s6DTMwYRm0UHNjzTY5dh4+LSC68Sm/7WEiimbQNYlw==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + esbuild@0.25.10: + resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} + engines: {node: '>=18'} + hasBin: true + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + typedoc-plugin-markdown@4.9.0: + resolution: {integrity: sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==} + engines: {node: '>= 18'} + peerDependencies: + typedoc: 0.28.x + + typedoc-vitepress-theme@1.1.2: + resolution: {integrity: sha512-hQvCZRr5uKDqY1bRuY1+eNTNn6d4TE4OP5pnw65Y7WGgajkJW9X1/lVJK2UJpcwCmwkdjw1QIO49H9JQlxWhhw==} + peerDependencies: + typedoc-plugin-markdown: '>=4.4.0' + + typedoc@0.28.13: + resolution: {integrity: sha512-dNWY8msnYB2a+7Audha+aTF1Pu3euiE7ySp53w8kEsXoYw7dMouV5A1UsTUY345aB152RHnmRMDiovuBi7BD+w==} + engines: {node: '>= 18', pnpm: '>= 10'} + hasBin: true + peerDependencies: + typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x + + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} + hasBin: true + +snapshots: + + '@esbuild/aix-ppc64@0.25.10': + optional: true + + '@esbuild/android-arm64@0.25.10': + optional: true + + '@esbuild/android-arm@0.25.10': + optional: true + + '@esbuild/android-x64@0.25.10': + optional: true + + '@esbuild/darwin-arm64@0.25.10': + optional: true + + '@esbuild/darwin-x64@0.25.10': + optional: true + + '@esbuild/freebsd-arm64@0.25.10': + optional: true + + '@esbuild/freebsd-x64@0.25.10': + optional: true + + '@esbuild/linux-arm64@0.25.10': + optional: true + + '@esbuild/linux-arm@0.25.10': + optional: true + + '@esbuild/linux-ia32@0.25.10': + optional: true + + '@esbuild/linux-loong64@0.25.10': + optional: true + + '@esbuild/linux-mips64el@0.25.10': + optional: true + + '@esbuild/linux-ppc64@0.25.10': + optional: true + + '@esbuild/linux-riscv64@0.25.10': + optional: true + + '@esbuild/linux-s390x@0.25.10': + optional: true + + '@esbuild/linux-x64@0.25.10': + optional: true + + '@esbuild/netbsd-arm64@0.25.10': + optional: true + + '@esbuild/netbsd-x64@0.25.10': + optional: true + + '@esbuild/openbsd-arm64@0.25.10': + optional: true + + '@esbuild/openbsd-x64@0.25.10': + optional: true + + '@esbuild/openharmony-arm64@0.25.10': + optional: true + + '@esbuild/sunos-x64@0.25.10': + optional: true + + '@esbuild/win32-arm64@0.25.10': + optional: true + + '@esbuild/win32-ia32@0.25.10': + optional: true + + '@esbuild/win32-x64@0.25.10': + optional: true + + '@gerrit0/mini-shiki@3.13.0': + dependencies: + '@shikijs/engine-oniguruma': 3.13.0 + '@shikijs/langs': 3.13.0 + '@shikijs/themes': 3.13.0 + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/engine-oniguruma@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + + '@shikijs/themes@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + + '@shikijs/types@3.13.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@tauri-apps/api@2.8.0': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/unist@3.0.3': {} + + argparse@2.0.1: {} + + balanced-match@1.0.2: {} + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + entities@4.5.0: {} + + esbuild@0.25.10: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.10 + '@esbuild/android-arm': 0.25.10 + '@esbuild/android-arm64': 0.25.10 + '@esbuild/android-x64': 0.25.10 + '@esbuild/darwin-arm64': 0.25.10 + '@esbuild/darwin-x64': 0.25.10 + '@esbuild/freebsd-arm64': 0.25.10 + '@esbuild/freebsd-x64': 0.25.10 + '@esbuild/linux-arm': 0.25.10 + '@esbuild/linux-arm64': 0.25.10 + '@esbuild/linux-ia32': 0.25.10 + '@esbuild/linux-loong64': 0.25.10 + '@esbuild/linux-mips64el': 0.25.10 + '@esbuild/linux-ppc64': 0.25.10 + '@esbuild/linux-riscv64': 0.25.10 + '@esbuild/linux-s390x': 0.25.10 + '@esbuild/linux-x64': 0.25.10 + '@esbuild/netbsd-arm64': 0.25.10 + '@esbuild/netbsd-x64': 0.25.10 + '@esbuild/openbsd-arm64': 0.25.10 + '@esbuild/openbsd-x64': 0.25.10 + '@esbuild/openharmony-arm64': 0.25.10 + '@esbuild/sunos-x64': 0.25.10 + '@esbuild/win32-arm64': 0.25.10 + '@esbuild/win32-ia32': 0.25.10 + '@esbuild/win32-x64': 0.25.10 + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + lunr@2.3.9: {} + + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + mdurl@2.0.0: {} + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + punycode.js@2.3.1: {} + + typedoc-plugin-markdown@4.9.0(typedoc@0.28.13(typescript@5.9.2)): + dependencies: + typedoc: 0.28.13(typescript@5.9.2) + + typedoc-vitepress-theme@1.1.2(typedoc-plugin-markdown@4.9.0(typedoc@0.28.13(typescript@5.9.2))): + dependencies: + typedoc-plugin-markdown: 4.9.0(typedoc@0.28.13(typescript@5.9.2)) + + typedoc@0.28.13(typescript@5.9.2): + dependencies: + '@gerrit0/mini-shiki': 3.13.0 + lunr: 2.3.9 + markdown-it: 14.1.0 + minimatch: 9.0.5 + typescript: 5.9.2 + yaml: 2.8.1 + + typescript@5.9.2: {} + + uc.micro@2.1.0: {} + + yaml@2.8.1: {} diff --git a/src-tauri/plugin-script/pnpm-workspace.yaml b/src-tauri/plugin-script/pnpm-workspace.yaml new file mode 100644 index 0000000..efc037a --- /dev/null +++ b/src-tauri/plugin-script/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +onlyBuiltDependencies: + - esbuild diff --git a/src-tauri/plugin-script/src/ahqstore.ts b/src-tauri/plugin-script/src/ahqstore.ts new file mode 100644 index 0000000..836c68f --- /dev/null +++ b/src-tauri/plugin-script/src/ahqstore.ts @@ -0,0 +1,37 @@ +import { invoke } from "@tauri-apps/api/core"; + +export interface Commits { + ahqstore: string, + alt: string, +} + +export class AHQStore { + constructor() { + console.log("AHQStore instance created!"); + } + + /** + * Gets the version of the current AHQ Store Runtime + * @returns {string} + */ + getVersion(): string { + return "1.0.0"; + } + + /** + * Returns the `sha` that the current AHQ Store session is using + * + * ## NOTE + * This version might change after a while so call it and immediately + * use it + * + * Do not store it since it might get outdated + * + * @returns {Promise} + */ + async getCurrentAHQStoreCommit(): Promise { + const data = await invoke("plugin:ahqstore|get_commit") + + return JSON.parse((new TextDecoder()).decode(data)); + } +} diff --git a/src-tauri/plugin-script/src/script.ts b/src-tauri/plugin-script/src/script.ts new file mode 100644 index 0000000..529343e --- /dev/null +++ b/src-tauri/plugin-script/src/script.ts @@ -0,0 +1,6 @@ +import { AHQStore } from "./ahqstore.js"; +import "./types" + +if (typeof window !== 'undefined') { + window.AHQStore = new AHQStore(); +} \ No newline at end of file diff --git a/src-tauri/plugin-script/src/types.ts b/src-tauri/plugin-script/src/types.ts new file mode 100644 index 0000000..e249bb3 --- /dev/null +++ b/src-tauri/plugin-script/src/types.ts @@ -0,0 +1,8 @@ +import { AHQStore } from "./ahqstore.js"; + +declare global { + interface Window { + AHQStore: AHQStore; + } +} + diff --git a/src-tauri/plugin-script/tsconfig.json b/src-tauri/plugin-script/tsconfig.json new file mode 100644 index 0000000..1afff83 --- /dev/null +++ b/src-tauri/plugin-script/tsconfig.json @@ -0,0 +1,46 @@ +{ + // Visit https://aka.ms/tsconfig to read more about this file + "compilerOptions": { + // File Layout + "outFile": "./types/exports.d.ts", + + // Environment Settings + // See also https://aka.ms/tsconfig/module + "module": "nodenext", + "target": "esnext", + "types": [], + // For nodejs: + // "lib": ["esnext"], + // "types": ["node"], + // and npm install -D @types/node + + // Other Outputs + "sourceMap": false, + "declaration": true, + "declarationMap": false, + "emitDeclarationOnly": true, + "alwaysStrict": true, + "allowJs": true, + + // Stricter Typechecking Options + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true, + + // Style Options + // "noImplicitReturns": true, + // "noImplicitOverride": true, + // "noUnusedLocals": true, + // "noUnusedParameters": true, + // "noFallthroughCasesInSwitch": true, + // "noPropertyAccessFromIndexSignature": true, + + // Recommended Options + "strict": true, + "jsx": "react-jsx", + "noUncheckedSideEffectImports": true, + "moduleDetection": "force", + "skipLibCheck": true + }, + "include": ["./src/types.ts"], + "exclude": ["./dist/**/*"] +} diff --git a/src-tauri/plugin-script/types/.gitignore b/src-tauri/plugin-script/types/.gitignore new file mode 100644 index 0000000..b6444c9 --- /dev/null +++ b/src-tauri/plugin-script/types/.gitignore @@ -0,0 +1,2 @@ +docs +node_modules \ No newline at end of file diff --git a/src-tauri/plugin-script/types/README.md b/src-tauri/plugin-script/types/README.md new file mode 100644 index 0000000..ed375b9 --- /dev/null +++ b/src-tauri/plugin-script/types/README.md @@ -0,0 +1,23 @@ +# AHQ Store Environment Types Package + +This package provides a **type declaration file** for **AHQ Store Plugin** authors, enabling full IDE support for the global classes and types available in the AHQ Store's runtime environment. + +This typeset is intended for use in the JavaScript and TypeScript code that is embedded within your `pluginUI.html` and `settings.html` files. + +## What is injected? + +The runtime used by AHQ Store Plugin pages have a injected script that adds a new class to the +**Window** object. We call this `AHQStore` class. + +You can use the `AHQStore` like this + +```ts +import type { AHQStore } from "ahqstore"; + +const ahqstore: AHQStore = window.AHQStore; +``` + +> NOTE +> +> the package `ahqstore` is a ghost module and does not exist in runtime. Hence you must +> use `import type` and not `import` diff --git a/src-tauri/plugin-script/types/ahqstore.js b/src-tauri/plugin-script/types/ahqstore.js new file mode 100644 index 0000000..a763402 --- /dev/null +++ b/src-tauri/plugin-script/types/ahqstore.js @@ -0,0 +1,5 @@ +function AHQStore() { + Object.assign(this, window.AHQStore); +} + +export { AHQStore }; diff --git a/src-tauri/plugin-script/types/exports.d.ts b/src-tauri/plugin-script/types/exports.d.ts new file mode 100644 index 0000000..0f6a9e3 --- /dev/null +++ b/src-tauri/plugin-script/types/exports.d.ts @@ -0,0 +1,30 @@ +declare module "ahqstore" { + export class AHQStore { + constructor(); + /** + * Gets the version of the current AHQ Store Runtime + * @returns {string} + */ + getVersion(): string; + /** + * Returns the `sha` that the current AHQ Store session is using + * + * ## NOTE + * This version might change after a while so call it and immediately + * use it + * + * Do not store it since it might get outdated + * + * @returns {Promise} + */ + getCurrentAHQStoreCommit(): Promise; + } +} +declare module "types" { + import { AHQStore } from "ahqstore"; + global { + interface Window { + AHQStore: AHQStore; + } + } +} diff --git a/src-tauri/plugin-script/types/icon.png b/src-tauri/plugin-script/types/icon.png new file mode 100644 index 0000000..cae0abb Binary files /dev/null and b/src-tauri/plugin-script/types/icon.png differ diff --git a/src-tauri/plugin-script/types/package.json b/src-tauri/plugin-script/types/package.json new file mode 100644 index 0000000..d320bac --- /dev/null +++ b/src-tauri/plugin-script/types/package.json @@ -0,0 +1,35 @@ +{ + "name": "@ahqstore/env-types", + "version": "0.0.1", + "description": "Types to declare extended js runtime types for ahq store plugin configuration pages", + "keywords": [ + "types", + "ahqstore", + "environment", + "plugin" + ], + "homepage": "https://github.com/ahqstore/client#readme", + "bugs": { + "url": "https://github.com/ahqstore/client/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ahqstore/client.git" + }, + "license": "MIT", + "author": "A. Chakraborty (@ahqsoftwares)", + "types": "./exports.d.ts", + "scripts": { + "build:docs:legacy": "typedoc --options typedoc-legacy.json --out legacy", + "build:docs": "typedoc" + }, + "exports": { + "ahqstore": "./ahqstore.js" + }, + "devDependencies": { + "typedoc": "^0.28.13", + "typedoc-plugin-markdown": "^4.9.0", + "typedoc-vitepress-theme": "^1.1.2", + "typescript": "^5.9.2" + } +} diff --git a/src-tauri/plugin-script/types/tsconfig.json b/src-tauri/plugin-script/types/tsconfig.json new file mode 100644 index 0000000..8b59196 --- /dev/null +++ b/src-tauri/plugin-script/types/tsconfig.json @@ -0,0 +1,45 @@ +{ + // Visit https://aka.ms/tsconfig to read more about this file + "compilerOptions": { + // File Layout + // "rootDir": "./src", + // "outDir": "./dist", + + // Environment Settings + // See also https://aka.ms/tsconfig/module + "module": "nodenext", + "target": "esnext", + "types": [], + // For nodejs: + // "lib": ["esnext"], + // "types": ["node"], + // and npm install -D @types/node + + // Other Outputs + "sourceMap": true, + "declaration": true, + "declarationMap": true, + + // Stricter Typechecking Options + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true, + + // Style Options + // "noImplicitReturns": true, + // "noImplicitOverride": true, + // "noUnusedLocals": true, + // "noUnusedParameters": true, + // "noFallthroughCasesInSwitch": true, + // "noPropertyAccessFromIndexSignature": true, + + // Recommended Options + "strict": true, + "jsx": "react-jsx", + "verbatimModuleSyntax": true, + "isolatedModules": true, + "noUncheckedSideEffectImports": true, + "moduleDetection": "force", + "skipLibCheck": true + }, + "include": ["./exports.d.ts"] +} diff --git a/src-tauri/plugin-script/types/typedoc-legacy.json b/src-tauri/plugin-script/types/typedoc-legacy.json new file mode 100644 index 0000000..5f72c38 --- /dev/null +++ b/src-tauri/plugin-script/types/typedoc-legacy.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://typedoc.org/schema.json", + "lang": "en", + "entryPoints": ["./exports.d.ts"], + "includeHierarchySummary": true, + "includeVersion": true, + "externalSymbolLinkMappings": { + "typescript": { + "fetch": "https://developer.mozilla.org/en-US/docs/Web/API/fetch" + } + }, + "searchInComments": true, + "githubPages": true, + "gitRemote": "origin", + "favicon": "./icon.png", + "navigationLinks": { + "GitHub": "https://github.com/ahqstore" + } +} diff --git a/src-tauri/plugin-script/types/typedoc.json b/src-tauri/plugin-script/types/typedoc.json new file mode 100644 index 0000000..fabd5d7 --- /dev/null +++ b/src-tauri/plugin-script/types/typedoc.json @@ -0,0 +1,20 @@ +{ + "entryPoints": ["./exports.d.ts"], + "theme": "default", + "searchInComments": true, + "githubPages": true, + "gitRemote": "origin", + "favicon": "./icon.png", + "navigationLinks": { + "GitHub": "https://github.com/ahqstore" + }, + "out": "./docs/@ahqstore/env-types", + "plugin": ["typedoc-plugin-markdown", "typedoc-vitepress-theme"], + "docsRoot": "./docs", + "sidebar": { + "autoConfiguration": true, + "format": "vitepress", + "pretty": false, + "collapsed": true + } +} diff --git a/src-tauri/src/desktop/daemon.rs b/src-tauri/src/desktop/daemon.rs new file mode 100644 index 0000000..94df9f3 --- /dev/null +++ b/src-tauri/src/desktop/daemon.rs @@ -0,0 +1,10 @@ +use std::sync::mpsc::Receiver; +use tauri::AppHandle; + +use super::internal_show_window; + +pub fn run_daemon(app: AppHandle, rx: Receiver<()>) { + for _ in rx.iter() { + internal_show_window(&app); + } +} diff --git a/src-tauri/src/desktop/mod.rs b/src-tauri/src/desktop/mod.rs index 3cf1adc..a8936dc 100644 --- a/src-tauri/src/desktop/mod.rs +++ b/src-tauri/src/desktop/mod.rs @@ -4,84 +4,82 @@ use tauri::menu::Menu; use tauri::menu::MenuItem; use tauri::menu::PredefinedMenuItem; use tauri::tray::TrayIconBuilder; -use tauri::tray::TrayIconEvent; -use tauri::{App, Emitter}; +use tauri::tray::{MouseButton, TrayIconEvent}; + +use tauri::App; use tauri::{Listener, Manager}; use tauri_plugin_autostart::MacosLauncher; use tauri_plugin_updater::UpdaterExt; -#[cfg(windows)] -use windows::Win32::Graphics::Dwm::{DwmSetWindowAttribute, DWMWINDOWATTRIBUTE}; +use crate::SHOULD_EXIT; +use std::sync::mpsc::{channel, Sender}; +use std::sync::Mutex; +use std::thread; -pub fn setup(app: &mut App) -> tauri::Result<()> { - #[cfg(windows)] - { - let hwnd = app.get_webview_window("main").expect("Impossible error").hwnd().unwrap(); - - unsafe { - //2: Mica, 3: Acrylic, 4: Mica Alt - let attr = 2; - let _ = DwmSetWindowAttribute( - hwnd, - DWMWINDOWATTRIBUTE(38), - &attr as *const _ as _, - std::mem::size_of_val(&attr) as u32, - ); - } - } +use super::create_window; +pub static TX: Mutex>> = Mutex::new(None); + +mod daemon; + +pub fn setup(app: &mut App) -> tauri::Result<()> { let handle = app.handle(); + println!("Autostart"); handle.plugin(tauri_plugin_autostart::init( MacosLauncher::LaunchAgent, Some(vec!["--hidden"]), ))?; + println!("Updater"); handle.plugin(tauri_plugin_updater::Builder::new().build())?; - handle.plugin(tauri_plugin_single_instance::init(|app, _, _| { - let _ = app.get_webview_window("main").expect("Impossible").show(); - }))?; - let handle = app.handle().clone(); + println!("Checking for update"); tauri::async_runtime::spawn(async move { - if let Err(_) = update(handle).await { + if let Err(_) = update(&handle).await { println!("Couldn't check update"); } }); + let handle = app.handle().clone(); + + // Show everytime + app.listen("loaded", move |_| { + let _ = handle + .get_webview_window("main") + .expect("Impossible") + .show(); + }); + + println!("Creating Window"); if !should_be_hidden() { - let handle = app.handle().clone(); - - app.listen("loaded", move |_| { - let _ = handle - .get_webview_window("main") - .expect("Impossible") - .show(); - }); + create_window(&mut app.handle().clone()); } - #[cfg(any(target_os = "linux", all(debug_assertions, windows)))] + println!("Deep Linking"); + #[cfg(any(target_os = "linux", windows))] { use tauri_plugin_deep_link::DeepLinkExt; - app.deep_link().register_all().expect("Unable to register"); + if app.deep_link().register_all().is_err() { + println!("[ERR] Could not register DEEP Link"); + } } + println!("Building Tray Icon"); TrayIconBuilder::with_id("main") .tooltip("AHQ Store is running") .icon(Image::from_bytes(include_bytes!("../../icons/icon.png"))?) .show_menu_on_left_click(false) - .on_tray_icon_event(move |app, event| match event { - TrayIconEvent::Click { .. } => { - let _ = app - .app_handle() - .get_webview_window("main") - .expect("Impossible") - .show(); + .on_tray_icon_event(move |_, event| match event { + TrayIconEvent::Click { button, .. } => { + if let MouseButton::Left = button { + show_window(); + } } _ => {} }) @@ -115,16 +113,20 @@ pub fn setup(app: &mut App) -> tauri::Result<()> { match id.as_str() { "quit" => { - app.exit(0); + app.exit(SHOULD_EXIT); } "check" => { - let _ = app - .get_webview_window("main") - .expect("Impossible") - .emit("update", ""); + let handle = app.clone(); + + println!("Checking for update"); + tauri::async_runtime::spawn(async move { + if let Err(_) = update(&handle).await { + println!("Couldn't check update"); + } + }); } "show" => { - let _ = app.get_webview_window("main").expect("Impossible").show(); + show_window(); } _ => {} } @@ -132,9 +134,55 @@ pub fn setup(app: &mut App) -> tauri::Result<()> { .build(app) .expect("Failed to build tray icon"); + let (tx, rx) = channel::<()>(); + + let handle = app.handle().clone(); + + // Set STARTED as the last step + thread::spawn(move || { + match TX.lock() { + Ok(mut x) => *x = Some(tx), + Err(mut x) => { + **x.get_mut() = Some(tx); + } + } + + daemon::run_daemon(handle, rx); + }); + Ok(()) } +pub(crate) fn show_window() { + match TX.lock() { + Ok(x) => { + if let Some(x) = x.as_ref() { + _ = x.send(()); + } + } + Err(x) => { + if let Some(x) = &**x.get_ref() { + _ = x.send(()); + } + } + } +} + +pub(crate) fn internal_show_window(app: &tauri::AppHandle) { + if let Some(x) = app.get_webview_window("main") { + _ = x.show(); + _ = x.set_focus(); + } else { + create_window(app); + } +} + +// pub(crate) fn remove_window(app: &tauri::AppHandle) { +// if let Some(x) = app.get_webview_window("main") { +// _ = x.close(); +// } +// } + fn should_be_hidden() -> bool { if let Some(args) = std::env::args().last() { if args == "--hidden" { @@ -145,7 +193,7 @@ fn should_be_hidden() -> bool { false } -async fn update(app: tauri::AppHandle) -> tauri_plugin_updater::Result<()> { +async fn update(app: &tauri::AppHandle) -> tauri_plugin_updater::Result<()> { if let Some(update) = app.updater()?.check().await? { let mut downloaded = 0; diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 995f4d2..d5f8785 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1,25 +1,353 @@ +use std::sync::LazyLock; +use tauri::async_runtime::Mutex; +use tauri::webview::{WebviewWindow, WebviewWindowBuilder}; +use tauri::{Emitter, EventTarget}; + +#[cfg(desktop)] +use tauri::utils::config::WindowEffectsConfig; +#[cfg(desktop)] +use tauri::window::Effect; + +use tauri::Manager; + #[cfg(desktop)] mod desktop; -// Learn more about Tauri commands at https://tauri.app/develop/calling-rust/ -#[tauri::command] -fn greet(name: &str) -> String { - format!("Hello, {}! You've been greeted from Rust!", name) +#[cfg(desktop)] +mod plugin; + +pub static SHOULD_EXIT: i32 = 20; + +#[cfg(windows)] +fn get_accent() -> Option { + use windows::core::w; + use windows::Win32::System::Registry::{RegGetValueW, HKEY_CURRENT_USER, RRF_RT_REG_DWORD}; + + unsafe { + let mut color = [0u8; 4]; + let mut pcbdata: u32 = 4; + + RegGetValueW( + HKEY_CURRENT_USER, + w!(r"Software\Microsoft\Windows\DWM"), + w!("AccentColor"), + RRF_RT_REG_DWORD, + None, + Some(&mut color as *mut _ as _), + Some(&mut pcbdata as *mut u32), + ) + .ok() + .ok()?; + + println!("[INFO] Color: {color:?}"); + + let [r, g, b, _] = color; + + Some(format!("window.accent = \"rgb({r},{g},{b})\"")) + } } #[cfg_attr(mobile, tauri::mobile_entry_point)] +#[allow(dead_code, unused)] pub fn run() { - tauri::Builder::default() + #[cfg(windows)] + let accent: &'static str = get_accent() + .unwrap_or("window.accent = \"rgb(53,126,199)\"".into()) + .leak(); + + #[cfg(not(windows))] + let accent = "window.accent = \"rgb(53,126,199)\""; + + let app = tauri::Builder::default() + .on_page_load(move |c, _| c.eval(accent).expect("Unable to evaluate script")); + + #[cfg(desktop)] + let app = app.plugin(tauri_plugin_single_instance::init(|_, _, _| { + std::thread::spawn(move || { + use crate::desktop::show_window; + + // Lazy Working function + show_window(); + }); + })); + + let app = app + .plugin(tauri_plugin_http::init()) .plugin(tauri_plugin_os::init()) - .plugin(tauri_plugin_deep_link::init()) .plugin(tauri_plugin_ahqstore::init()) + .plugin(tauri_plugin_deep_link::init()) .setup(|app| { + #[cfg(desktop)] + println!("[INFO] Running Desktop Setup"); #[cfg(desktop)] desktop::setup(app)?; + #[cfg(desktop)] + app + .handle() + .plugin(tauri_plugin_window_state::Builder::default().build())?; + + #[cfg(mobile)] + create_window(app); + + println!("[INFO] Running"); Ok(()) }) - .invoke_handler(tauri::generate_handler![greet]) - .run(tauri::generate_context!()) + .register_uri_scheme_protocol("ahqstoreplugin", |_ctx, request| { + use tauri::http::Response; + + let _hwnd = _ctx.app_handle(); + + let uri = request.uri(); + + let path = uri.path(); + let path = percent_encoding::percent_decode_str(path).decode_utf8_lossy(); + let path: &str = path.as_ref(); + + let _pt1 = path.get(1..=5).unwrap_or(""); + let _plugin_id = path.get(6..).unwrap_or(""); + + let mut html = "".to_string(); + + #[cfg(desktop)] + match _pt1 { + "conf/" => { + html = plugin::get_html(_hwnd, _plugin_id, true); + } + "view/" => { + html = plugin::get_html(_hwnd, _plugin_id, false); + } + perm => { + if _ctx.webview_label() == "main" { + match perm { + "meta/" => { + html = plugin::get_meta(_hwnd, _plugin_id); + } + "stat/" => { + let (id, state) = _plugin_id.split_once("}::{").unwrap_or(("", "")); + + html = plugin::get_state(_hwnd, id, state); + } + "sett/" => { + let (id, state) = _plugin_id.split_once("}::{").unwrap_or(("", "")); + + let data: Vec = request.body().clone(); + let data = String::from_utf8(data).unwrap(); + + plugin::set_state(_hwnd, id, state, data); + + html = "OK".into(); + } + "asst/" => { + // Trusted process + let (id, path) = _plugin_id.split_once("}::{").unwrap_or(("", "")); + + #[cfg(debug_assertions)] + println!("[INFO] Getting {path} (parsed {_plugin_id:?})"); + + html = plugin::get_script(_hwnd, id, path); + } + "plug/" => { + html = plugin::get_plugin_names(_hwnd); + } + "inst/" => { + let (id, path) = _plugin_id.split_once("}::{").unwrap_or(("", "")); + + #[cfg(debug_assertions)] + println!("[INFO] Installing {path} (parsed {_plugin_id:?})"); + + if let Some(_) = plugin::install_plugin(_hwnd, id, path) { + html = "OK".to_string(); + } else { + html = "NOK".to_string(); + } + } + _ => {} + } + } + } + } + + if &html == "" { + Response::builder() + .status(404) + .header("Access-Control-Allow-Origin", "*") + .body("Not Found".to_string().into_bytes()) + .unwrap() + } else { + Response::builder() + .status(200) + .header("Content-Type", "text/html") + .header("Access-Control-Allow-Origin", "*") + .body(html.into_bytes()) + .unwrap() + } + }) + .invoke_handler(tauri::generate_handler![get_state, set_state, open_plugin]) + .build(tauri::generate_context!()) .expect("error while running tauri application"); + + app.run(|_handle, event| match event { + tauri::RunEvent::ExitRequested { api, code, .. } => + { + #[cfg(desktop)] + if code.unwrap_or(0) != SHOULD_EXIT { + api.prevent_exit(); + } + } + _ => {} + }); +} + +static PLOCK: LazyLock> = LazyLock::new(|| Mutex::new(())); + +fn get_plugin_name(input: &str) -> &str { + if let Some(rest) = input.strip_prefix("settings-plugin-") { + rest + } else if let Some(rest) = input.strip_prefix("plugin-") { + rest + } else { + "None" + } +} + +fn is_alphanumeric(s: &str) -> bool { + s.chars().all(|c| c.is_ascii_alphanumeric()) +} + +#[tauri::command] +async fn get_state(app: WebviewWindow, state: String) -> String { + if app.label() == "main" { + return "".into(); + } + if !is_alphanumeric(&state) { + return "".into(); + } + + let plugin = get_plugin_name(app.label()); + + #[cfg(desktop)] + return plugin::get_state(app.app_handle(), plugin, &state); + + #[cfg(not(desktop))] + return "".into(); +} + +#[tauri::command] +async fn set_state(app: WebviewWindow, state: String, data: String) { + if app.label() == "main" { + return; + } + if !is_alphanumeric(&state) { + return; + } + + let plugin = get_plugin_name(app.label()); + + #[cfg(desktop)] + { + _ = app.emit_to(EventTarget::webview_window("main"), "state-update", plugin); + } + + #[cfg(desktop)] + plugin::set_state(app.app_handle(), plugin, &state, data); +} + +#[tauri::command] +async fn open_plugin(app: WebviewWindow, plugin: String, title: String, settings: bool) { + let lock = PLOCK.lock().await; + + if app.label() != "main" { + return; + } + + #[cfg(desktop)] + { + use tauri::Url; + + #[cfg(not(debug_assertions))] + let init_script = include_str!("../plugin-script/dist/bundle.js"); + + #[cfg(debug_assertions)] + let init_script = { + use std::fs; + + fs::read_to_string(env!("PLUGIN_SCRIPT_PATH")).unwrap() + }; + + let label = if settings { + format!("settings-plugin-{plugin}") + } else { + format!("plugin-{plugin}") + }; + + let url = if settings { + format!("conf/{plugin}") + } else { + format!("view/{plugin}") + }; + + // Ignore errors + _ = WebviewWindowBuilder::new( + &app, + label, + (||{ + #[cfg(windows)] + return tauri::WebviewUrl::CustomProtocol(Url::parse( + format!("http://ahqstoreplugin.localhost/{url}").as_str() + ).unwrap()); + + #[cfg(not(windows))] + return tauri::WebviewUrl::CustomProtocol(Url::parse( + format!("ahqstoreplugin://{url}").as_str() + ).unwrap()); + })() + ) + .initialization_script(init_script) + .min_inner_size(348.0, 700.0) + .inner_size(1024.0, 760.0) + .resizable(true) + .title(title) + .additional_browser_args("--disable-features=msWebOOUI,msPdfOOUI,msSmartScreenProtection --autoplay-policy=no-user-gesture-required") + .build(); + } + + drop(lock); +} + +pub(crate) fn create_window, R: tauri::Runtime>(app: &T) { + if app.get_webview_window("main").is_some() { + return; + } + + let builder = WebviewWindowBuilder::new(app, "main", { + #[cfg(not(debug_assertions))] + let url = tauri::WebviewUrl::App("/".into()); + + #[cfg(debug_assertions)] + let url = tauri::WebviewUrl::External(app.config().build.dev_url.as_ref().unwrap().clone()); + + url + }); + + #[cfg(desktop)] + let builder = builder.center() + .min_inner_size(348.0, 700.0) + .inner_size(1024.0, 760.0) + .resizable(true) + .decorations(false) + .visible(false) + .prevent_overflow() + .title("AHQ Store Neo") + .effects( + WindowEffectsConfig { + effects: vec![Effect::Mica], + state: None, + radius: None, + color: None, + } + ) + .additional_browser_args("--disable-features=msWebOOUI,msPdfOOUI,msSmartScreenProtection --autoplay-policy=no-user-gesture-required"); + + builder.transparent(true).build().unwrap(); } diff --git a/src-tauri/src/plugin/mod.rs b/src-tauri/src/plugin/mod.rs new file mode 100644 index 0000000..7fbddb7 --- /dev/null +++ b/src-tauri/src/plugin/mod.rs @@ -0,0 +1,119 @@ +use std::fs::{self, File}; + +use tauri::{AppHandle, Manager}; +use zip::ZipArchive; + +pub fn get_html(hwnd: &AppHandle, plugin: &str, settings: bool) -> String { + let resolver = hwnd.path(); + + let mut dir = resolver.app_local_data_dir().unwrap(); + + dir.push("plugins"); + _ = fs::create_dir_all(&dir); + + dir.push(plugin); + + if settings { + dir.push("settings.html"); + } else { + dir.push("pluginUI.html"); + } + + fs::read_to_string(&dir).unwrap_or_default() +} + +pub fn get_meta(hwnd: &AppHandle, plugin: &str) -> String { + let resolver = hwnd.path(); + + let mut dir = resolver.app_local_data_dir().unwrap(); + + dir.push("plugins"); + _ = fs::create_dir_all(&dir); + + dir.push(plugin); + + dir.push("metadata.json"); + + fs::read_to_string(&dir).unwrap_or_default() +} + +pub fn get_script(hwnd: &AppHandle, plugin: &str, script: &str) -> String { + let resolver = hwnd.path(); + + let mut dir = resolver.app_local_data_dir().unwrap(); + + dir.push("plugins"); + _ = fs::create_dir_all(&dir); + + dir.push(plugin); + + dir.push(script); + + let path = dir.canonicalize().unwrap_or_default(); + + fs::read_to_string(&path).unwrap_or_default() +} + +pub fn get_plugin_names(hwnd: &AppHandle) -> String { + let resolver = hwnd.path(); + + let mut dir = resolver.app_local_data_dir().unwrap(); + + dir.push("plugins"); + _ = fs::create_dir_all(&dir); + + let vect = fs::read_dir(&dir) + .unwrap() + .into_iter() + .map(|x| x.unwrap().file_name()) + .map(|x| x.into_string().unwrap()) + .collect::>(); + + serde_json::to_string(&vect).unwrap_or_default() +} + +pub fn get_state(hwnd: &AppHandle, plugin: &str, state_name: &str) -> String { + let resolver = hwnd.path(); + + let mut dir = resolver.app_local_data_dir().unwrap(); + + dir.push("plugins"); + dir.push(plugin); + dir.push("state"); + _ = fs::create_dir_all(&dir); + + dir.push(state_name); + + fs::read_to_string(&dir).unwrap_or_default() +} + +pub fn set_state(hwnd: &AppHandle, plugin: &str, state_name: &str, state_data: String) { + let resolver = hwnd.path(); + + let mut dir = resolver.app_local_data_dir().unwrap(); + + dir.push("plugins"); + dir.push(plugin); + dir.push("state"); + _ = fs::create_dir_all(&dir); + + dir.push(state_name); + + _ = fs::write(&dir, &state_data); +} + +pub fn install_plugin(hwnd: &AppHandle, plugin: &str, path: &str) -> Option<()> { + let resolver = hwnd.path(); + + let mut dir = resolver.app_local_data_dir().unwrap(); + + dir.push("plugins"); + dir.push(plugin); + + _ = fs::create_dir_all(&dir); + + ZipArchive::new(File::open(path).ok()?) + .ok()? + .extract(&dir) + .ok() +} \ No newline at end of file diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 924e547..fd3095d 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -10,23 +10,9 @@ "frontendDist": "../dist" }, "app": { - "windows": [ - { - "center": true, - "height": 760, - "resizable": true, - "title": "AHQ Store Neo", - "label": "main", - "width": 1200, - "minHeight": 700, - "minWidth": 348, - "visible": false, - "decorations": false, - "transparent": true - } - ], + "windows": [], "security": { - "csp": null + "csp": "connect-src 'self' http://ipc.localhost ipc:;" } }, "plugins": { @@ -37,7 +23,7 @@ ] }, "deep-link": { - "mobile": [{ "host": "ahqstore.github.io", "pathPrefix": ["/view"] }], + "mobile": [{ "scheme": ["ahqstore"], "appLink": false }], "desktop": { "schemes": ["ahqstore"] } @@ -46,7 +32,7 @@ "bundle": { "createUpdaterArtifacts": true, "active": true, - "targets": ["appimage", "deb", "msi", "rpm"], + "targets": ["deb", "msi", "rpm"], "icon": [ "icons/32x32.png", "icons/128x128.png", @@ -54,6 +40,7 @@ "icons/icon.icns", "icons/icon.ico" ], + "publisher": "AHQ Softwares", "fileAssociations": [ { "ext": ["ahqstore", "astore", "astorepkg"], @@ -62,6 +49,20 @@ "name": "AHQ Store Package", "role": "Editor" } - ] + ], + "windows": { + "allowDowngrades": true, + "certificateThumbprint": "8B85C3AE8D2243C2B62D53D14479A99D413F52A7", + "digestAlgorithm": "sha256", + "nsis": null, + "signCommand": null, + "timestampUrl": "http://timestamp.comodoca.com", + "tsp": false, + "webviewInstallMode": { + "silent": true, + "type": "downloadBootstrapper" + }, + "wix": null + } } } diff --git a/src-tauri/windows.json b/src-tauri/windows.json new file mode 100644 index 0000000..338f4bb --- /dev/null +++ b/src-tauri/windows.json @@ -0,0 +1,17 @@ +{ + "center": true, + "height": 760, + "resizable": true, + "title": "AHQ Store Neo", + "label": "main", + "width": 1200, + "minHeight": 700, + "minWidth": 348, + "visible": false, + "decorations": false, + "transparent": true, + "windowEffects": { + "effects": ["mica"] + }, + "additionalBrowserArgs": "--disable-features=msWebOOUI,msPdfOOUI,msSmartScreenProtection --autoplay-policy=no-user-gesture-required" +} diff --git a/src/App.css b/src/App.css index f7f82e6..1d61de8 100644 --- a/src/App.css +++ b/src/App.css @@ -1,14 +1,17 @@ @import "tailwindcss"; +@custom-variant dark (&:where(.dark, .dark *)); -@custom-variant dark (&:is(.dark *)); - -@variant dark (&:is(.dark *)); +@variant dark (&:where(.dark, .dark *)); @plugin "tailwindcss-animate"; @plugin "daisyui"; +/* Views */ +@import "./views/view.css"; -:root { +/* Components */ +@import "./components/category.css"; +:root { --background: hsl(0 0% 100%); --foreground: hsl(0 0% 3.9%); @@ -58,10 +61,11 @@ --chart-5: hsl(27 87% 67%); --radius: 0.6rem; + + scrollbar-color: unset !important; } .dark { - --background: hsl(0 0% 3.9%); --foreground: hsl(0 0% 98%); @@ -112,7 +116,6 @@ } @theme inline { - --color-background: var(--background); --color-foreground: var(--foreground); @@ -171,14 +174,19 @@ } @layer base { + * { + @apply border-border outline-ring/50; + } - html, body { - @apply bg-transparent; + @apply bg-background text-foreground; } +} - .fxugw4r { - @apply bg-inherit; +@layer base { + html, + body { + background: transparent !important; } .not-win body { @@ -191,6 +199,97 @@ .fui-FluentProvider, .content { - @apply h-full w-full flex flex-col; + @apply h-full w-full flex flex-col bg-transparent; + } + + /* Update the switch color */ + .ffp7eso, + .rsji9ng:enabled:checked ~ .fui-Switch__indicator { + background-color: color-mix( + in srgb, + var(--win32-accent) 60%, + var(--color-neutral) 10% + ) !important; + } + + .ffp7eso:hover { + background-color: color-mix( + in srgb, + var(--win32-accent) 40%, + white 100% + ) !important; + } + + /* Toast */ + [data-sonner-toast][data-styled="true"] { + @apply bg-[--colorNeutralBackground1]!; + } + + /* Modal UI */ + .r1u3t6p6 { + @apply bg-[--colorNeutralBackground1]/90!; } -} \ No newline at end of file + + .dark { + .ffp7eso, + .rsji9ng:enabled:checked ~ .fui-Switch__indicator { + background-color: color-mix( + in srgb, + var(--win32-accent) 90%, + white 75% + ) !important; + } + + .ffp7eso:hover { + background-color: color-mix( + in srgb, + var(--win32-accent) 50%, + white 80% + ) !important; + } + } +} + +html:not(.not-win) { + body, + #root, + .fxugw4r { + background: transparent !important; + } +} + +.stylish { + @apply shadow-lg; + background: color-mix( + in srgb, + transparent 5%, + var(--color-neutral-content) 5% + ) !important; +} + +.animate * { + @apply transition-all; +} + +.readd { + h1 { + @apply text-lg underline; + } + + span { + @apply ml-2; + } + + span::before { + content: "• "; + } +} + +.readd > div { + @apply flex flex-col gap-2; +} + +::-webkit-scrollbar { + display: none !important; + size: 0px !important; +} diff --git a/src/App.tsx b/src/App.tsx index 4e54b06..a846d2e 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,25 +1,217 @@ +import { Dialog, DialogSurface, DialogTitle, MenuDivider, MenuItem, MenuList } from "@fluentui/react-components"; + import "./App.css"; -import { WindowTitlebar } from "./controls" +import { WindowTitlebar } from "./controls"; import ShowSpinner from "./views/spinner"; -import { platform } from "@tauri-apps/plugin-os" +import { platform } from "@tauri-apps/plugin-os"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "./components/ui/popover"; + +import { LogOutIcon } from "lucide-react"; +import { + PersonAddRegular, + PersonRegular, + ToolboxRegular, + BugArrowCounterclockwiseRegular, +} from "@fluentui/react-icons"; + +import { open, setScale } from "tauri-plugin-ahqstore-api"; +import { startLogin } from "./lib/auth/github"; +import { authObject, useAuth } from "./lib/auth/provider"; +import { logOut } from "./lib/auth"; +import { useExperiment } from "./lib/experiment"; +import { useHome } from "./lib/data"; +import { ApplicationView } from "./views/view"; +import { useMediaQuery } from "./hooks/use-media-query"; +import { useEffect, useState } from "react"; +import { ApplyAsDeveloper } from "./views/developer/applySelf"; +import { initPluginDaemonService } from "./api/plugin"; +import { useExperiments } from "./lib/experiments"; function App() { + const auth = useAuth(); + const experiment = useExperiment(); + const experiments = useExperiments(); + + const [ready, setReady] = useState(false); + + useEffect(() => { + if (platform() == "android") { + setReady(true) + } else if (experiments.plugins) { + initPluginDaemonService() + .then(() => setReady(true)); + } else { + setReady(true); + } + }, [experiments]); + + const [isOpen, setOpen] = useState(false); + + useEffect(() => { + const zoom = localStorage.getItem("defZoom"); + + if (zoom) setScale(Number(zoom)); + }, []); + return ( <> - {platform() != "android" && - -

AHQ Store

-

NEO

-
} + {platform() != "android" && ( + + + + {auth?.avatar_url ? ( + + ) : ( + + )} + + + + { + if (auth) { + open(`https://github.com/${auth.login}`); + } + }} + > +
+ {auth?.avatar_url ? ( + + ) : ( + + )} + +
+ {auth ? ( + + Hello, {auth.name || auth.login} + + ) : ( + + Hello, Guest + + )} + {auth && @{auth.login}} +
+
+
+ + + } + style={{ background: "transparent" }} + subText={experiment ? "Enabled" : "Disabled"} + > + Experimental Features + + {auth && ( + } + subText={ + auth.dev ? "Enabled" : "Register for developer mode" + } + style={{ background: "transparent" }} + onClick={() => { + if (!auth.dev) { + setOpen(true); + } + }} + > + Developer Mode + + )} + + ) : ( + + ) + } + subText={ + auth == undefined + ? "Login using GitHub authentication" + : "Logout from this device" + } + onClick={ + auth == undefined + ? () => startLogin(authObject) + : () => logOut(authObject) + } + className="w-72" + style={{ background: "transparent" }} + > + {auth == undefined ? "Login" : "Logout"} + +
+
+
+ + } + > + +

+ AHQ Store +

+ {useMediaQuery("(min-width: 400px)") && ( +

+ NEO +

+ )} +
+ )} + + + setOpen(false) + } + > + + Apply as a developer + + + + {useHome() == undefined || !ready ? : } + + ); + + function Loading() { + return (
- - ); + ); + } } export default App; diff --git a/src/Secondary.tsx b/src/Secondary.tsx new file mode 100644 index 0000000..1c59573 --- /dev/null +++ b/src/Secondary.tsx @@ -0,0 +1,24 @@ +export function Secondary() { + return ( +
+
+ + + AHQ Store + +
+
+

Enter this code

+

+ {window.location.pathname.replace("/", "")} +

+
+
+ ); +} diff --git a/src/api/fetchApps.ts b/src/api/fetchApps.ts new file mode 100644 index 0000000..f87272b --- /dev/null +++ b/src/api/fetchApps.ts @@ -0,0 +1,48 @@ +import { getKeyFromCache, setKeyToCache } from "@/data/appCache"; +import { fetch } from "@tauri-apps/plugin-http"; +import { AHQStoreApplication } from "ahqstore-types"; +import { getApp, getAppAsset } from "tauri-plugin-ahqstore-api"; + +export async function getAppWrapped(appId: string): Promise<[AHQStoreApplication, string]> { + const data = await getKeyFromCache(appId); + + if (data) { + return data; + } + + const [app, img] = await Promise.all([ + getApp(appId), + getAppAsset(appId, "0") + ]); + + const blob = new Blob([img as unknown as any]); + + let uri = URL.createObjectURL(blob); + if (appId.startsWith("f:")) { + const data = await fetch(await blob.text()) + const b = await data.blob(); + + uri = URL.createObjectURL(b); + } + + + await setKeyToCache(appId, [app, uri]); + + return [app, uri]; +} + +export const getRepo = (app: AHQStoreApplication) => { + switch (app.appId[0]) { + case "f": + return "F-Droid"; + case "w": + return "Winget"; + case "l": + return "AppImageHub"; + // This is the community repository, so fetch the exact repository + case "a": + return `${app.repo.author}/${app.repo.repo}`; + default: + return `Unknown: ${app.repo.author}/${app.repo.repo}`; + } +} \ No newline at end of file diff --git a/src/api/plugin/index.ts b/src/api/plugin/index.ts new file mode 100644 index 0000000..4aaf9c5 --- /dev/null +++ b/src/api/plugin/index.ts @@ -0,0 +1,81 @@ +import { platform } from "@tauri-apps/plugin-os"; +import { AStorePluginManager, Manifest } from "./mgnt"; + +export const root = () => { + if (platform() == "windows") { + return "http://ahqstoreplugin.localhost"; + } else { + return "ahqstoreplugin:/"; + } +} + +export const base = root(); + +const chars = 'abcdefghijklmnopqrstuvwxyz0123456789'.split(""); +export function genUniquePluginId() { + let id = '' + + for (let i = 0; i < 64; i++) { + id += chars[Math.floor(Math.random() * chars.length)]; + } + + return id; +} + +export async function plugins(): Promise { + const data = await fetch(`${base}/plug/`) + .then((d) => d.json()); + + return data; +} + +export async function meta(plugin: string): Promise { + const data = await fetch(`${base}/meta/${plugin}`) + .then((d) => d.text()) + .then((txt) => { + if (txt == "") { + throw new Error("Invalid"); + } + + return JSON.parse(txt); + }); + + return data; +} + +/** + * Only string assets + * @param plugin + * @param asset + * @returns + */ +export async function getAsset(plugin: string, asset: string): Promise { + const data = await fetch(`${base}/asst/${plugin}}::{${asset}`) + .then((d) => d.arrayBuffer()); + + return data; +} + +/** + * Checks if the file exists + * @param plugin + * @param asset + * @returns + */ +export async function existsUI(plugin: string, asset: string): Promise { + const data = await fetch(`${base}/asst/${plugin}}::{${asset}`) + .then((d) => d.ok); + + return data; +} + +export async function initPluginDaemonService() { + if (platform() != "android") { + if (!AStorePluginManager.hasInstance()) { + console.log("Creating instance"); + const plug = await plugins(); + + await AStorePluginManager.create(plug); + } + } +} \ No newline at end of file diff --git a/src/api/plugin/mgnt.ts b/src/api/plugin/mgnt.ts new file mode 100644 index 0000000..6fd882c --- /dev/null +++ b/src/api/plugin/mgnt.ts @@ -0,0 +1,409 @@ +import { Capability, CommunicationInterface, EventName, EventType, Metadata, ResponseStatus } from "@ahqstore/plugin-api" +import { getCurrentWebviewWindow } from "@tauri-apps/api/webviewWindow" +import { existsUI, getAsset, meta } from "."; +import { toast } from "sonner"; + +const winda = getCurrentWebviewWindow(); + +export interface Manifest { + displayName: string; + capabilities: Capability[]; + worker: boolean; +} + +export enum PluginFlags { + WorkerPlugin = 0b0001, + PluginUI = 0b0010, + SettingsUI = 0b0100, + Disabled = 0b1000 +} + +export class Flags { + flags: number; + + constructor(flags: number) { + this.flags = flags; + } + + has(flag: PluginFlags) { + return (this.flags & flag) > 0 + } + + add(flag: PluginFlags) { + this.flags |= flag + } + + remove(flag: PluginFlags) { + this.flags &= ~flag; + } + + toggle(flag: PluginFlags) { + this.flags ^= flag; + } +} + +export interface PluginMngtData { + man: Manifest; + id: string; + hInstance: AStorePlugin + registersSource: boolean; + sourceName: string | undefined; +} + +export interface BasicPluginData { + man: Manifest; + flags: Flags; + displayName: string; +} + +export class AStorePluginManager { + static #instance: AStorePluginManager | undefined; + + // Defines worker plugins that need special care + workerPlugins: Map = new Map(); + + registeredSources: Map = new Map(); + + // Defines UI plugins + // UI plugins can also be worker plugins + uiPlugins: Map = new Map(); + + private constructor() { + winda.listen("state-update", (ev) => { + const plugin = this.workerPlugins.get(ev.payload); + + if (plugin && plugin.hInstance.capability.includes(Capability.RequestsEvents)) { + plugin.hInstance.emit(EventName.CommonStateUpdated); + } + }); + } + + static sendThemeUpdate() { + try { + const me = AStorePluginManager.getInstance(true); + + const plugin = [...me.workerPlugins.entries()]; + + for (let i = 0; i < plugin.length; i++) { + const [, mnt] = plugin[i]; + + if (mnt.man.capabilities.includes(Capability.RequestsEvents)) { + mnt.hInstance.emit(EventName.OnThemeUpdate); + } + } + } catch (e) { + // Ignore since that means plugins not enabled + } + } + + static getInstance(strict = false) { + if (!AStorePluginManager.#instance) { + if (strict) { + throw new Error("Strict mode is on, instance not instantiated"); + } + AStorePluginManager.#instance = new AStorePluginManager(); + } + + return AStorePluginManager.#instance; + } + + static hasInstance() { + return AStorePluginManager.#instance !== undefined; + } + + static async create(plugins: string[]) { + const me = AStorePluginManager.getInstance(); + + const final: Promise[] = []; + const uiPlugins: Map = new Map(); + const enabled = (() => { + try { + const data = JSON.parse(localStorage.getItem("enabled-plugins")!!); + + if (data == null) { + throw new Error(""); + } + + return data as string[]; + } catch (e) { + localStorage.setItem("enabled-plugins", "[]"); + return []; + } + })(); + + for (let i = 0; i < plugins.length; i++) { + const id = plugins[i]; + + try { + const data = await meta(id); + + const flags = new Flags(0); + + if (data && data.displayName && Array.isArray(data.capabilities)) { + if (!enabled.includes(id)) { + flags.add(PluginFlags.Disabled); + } + if (data.worker) { + flags.flags |= PluginFlags.WorkerPlugin; + } + + if (await existsUI(id, "pluginUI.html")) { + flags.flags |= PluginFlags.PluginUI; + } + + if (await existsUI(id, "settings.html")) { + flags.flags |= PluginFlags.SettingsUI; + } + + if (data.worker && enabled.includes(id)) { + final.push((async () => { + const inst = new AStorePlugin(data.capabilities); + + let manifest: { + registersSource: boolean; + sourceName: string | undefined; + }; + try { + manifest = await inst.getInstance(id); + } catch (e) { + console.log("---- ERROR ------"); + console.warn(e); + console.log("-----------------"); + return null; + } + + return { + man: data, + id, + displayName: data.displayName, + hInstance: inst, + registersSource: manifest.registersSource, + sourceName: manifest.sourceName + } as PluginMngtData; + })()); + } + + uiPlugins.set(id, { + flags, + man: data, + displayName: data.displayName + }); + console.log(uiPlugins); + } + } catch (e) { + console.log(e); + } + } + + const finalResolved = await Promise.all(final); + + finalResolved + .filter((x) => x != null) + .forEach((d) => { + me.workerPlugins.set(d.id, d); + }); + me.uiPlugins = uiPlugins; + } +} + +const AHQSTORE_PLUGIN_API_CURRENT = 0 as const; + +export class AStorePlugin { + worker: Worker; + capability: Capability[]; + sourceRepoName: string | undefined; + + id: string = ""; + registered = false; + + constructor(cap: Capability[]) { + this.worker = new Worker(new URL("./worker.js", import.meta.url)); + this.capability = cap; + } + + async getInstance(plugin: string): Promise<{ registersSource: boolean; sourceName: string | undefined; }> { + // ArrayBuffer by design + this.id = plugin; + const data = await getAsset(plugin, "worker.js"); + + return new Promise((res, rej) => { + this.worker.postMessage(data, [data]); + + // Auto disable after 3 secs unless registered + const closure = setTimeout(() => { + this.worker.terminate(); + rej("Timed Out"); + }, 3 * 1000); + + this.worker.onmessage = (data: MessageEvent) => { + const dat = data.data; + + // Type Request + if (dat.eventType == EventType.Request) { + // Handle Initialization + if (dat.event == EventName.RequestInitialization && !this.registered) { + const meta = dat.data as Metadata; + + console.log(meta); + + if (![...meta.capabilities].every((c) => this.capability.includes(c))) { + this.worker.postMessage({ + eventType: EventType.Response, + status: ResponseStatus.Unauthorized, + data: "Invalid Capabilities", + refId: dat.refId + } as CommunicationInterface); + return; + } + + if (meta.capabilities.has(Capability.AppInstallationSource)) { + this.sourceRepoName = meta.newSourceName; + } + + // Change capability to what it registered as + // To prevent possible issues down the line + this.capability = [...meta.capabilities]; + + this.worker.postMessage({ + eventType: EventType.Response, + status: ResponseStatus.Ok, + data: AHQSTORE_PLUGIN_API_CURRENT, + refId: dat.refId + } as CommunicationInterface); + clearTimeout(closure); + + res({ + registersSource: this.sourceRepoName != null, + sourceName: this.sourceRepoName + }); + return; + } + + if (!this.registered) { + this.worker.postMessage({ + eventType: EventType.Response, + status: ResponseStatus.Unauthorized, + data: "Register", + refId: dat.refId + } as CommunicationInterface); + return; + } + + try { + // Processing + switch (dat.event) { + case EventName.RequestInjectCSS: + this.verify(Capability.UsesTheming, dat.refId); + + this.typeCheck(dat.data, "string", dat.refId); + + this.injectCss(dat.data as string); + + this.worker.postMessage({ + eventType: EventType.Response, + status: ResponseStatus.Ok, + data: "OK", + refId: dat.refId + } as CommunicationInterface); + + return; + case EventName.RequestThemeData: + this.verify(Capability.UsesTheming, dat.refId); + + this.worker.postMessage({ + eventType: EventType.Response, + status: ResponseStatus.Ok, + // @ts-ignore + data: globalThis.themeData, + refId: dat.refId + } as CommunicationInterface); + + return; + case EventName.RequestRestart: + this.verify(Capability.RequestClientRestart, dat.refId); + + toast( + "A plugin has requested you to restart AHQ Store. Would you like to restart?", + { + action: { + label: "Yes", + onClick: () => { + window.location.reload(); + } + }, + duration: 3000 + } + ); + + return; + case EventName.RequestState: + this.verify(Capability.UsesState, dat.refId); + + // TODO: Soon + + return; + case EventName.RequestFetch: + return; + default: + return; + } + } catch (e) { + console.warn(`Plugin tried to perform unauthorized action. ${e}`); + } + } + }; + }); + } + + private verify(cap: Capability, refId: number) { + if (!this.capability.includes(cap)) { + this.worker.postMessage({ + eventType: EventType.Response, + status: ResponseStatus.Unauthorized, + data: "Unauthorized", + refId + } as CommunicationInterface); + throw new Error("Capability Failure!"); + } + } + + private typeCheck(data: T, typeToCheck: "bigint" | "boolean" | "function" | "number" | "object" | "string" | "symbol" | "undefined", refId: number) { + if (typeof (data) != typeToCheck) { + this.worker.postMessage({ + eventType: EventType.Response, + status: ResponseStatus.Unauthorized, + data: "Unauthorized", + refId + } as CommunicationInterface); + throw new Error("Typecheck Failure!"); + } + } + + injectCss(css: string) { + let e = document.getElementById(this.id); + + if (!e) { + const node = document.createElement("style"); + + node.id = this.id; + + e = document.head.appendChild( + node + ); + } + + e.textContent = css; + } + + emit(ev: EventName, data?: T) { + this.worker.postMessage({ + eventType: EventType.Event, + event: ev, + data + } as CommunicationInterface); + } + + destroy() { + this.worker.terminate(); + } +} \ No newline at end of file diff --git a/src/api/plugin/worker.ts b/src/api/plugin/worker.ts new file mode 100644 index 0000000..da76a8a --- /dev/null +++ b/src/api/plugin/worker.ts @@ -0,0 +1,106 @@ +import "ses"; + +const MAX_LOGS_OVERALL = 8000; + +lockdown(); + +let logs = 0; +let lastLogAt = 0; + +const log = (...c: any) => { + const now = Date.now(); + + // Max 1 log every 200ms + if (lastLogAt > (now + 200)) { + return; + } + + if (logs > MAX_LOGS_OVERALL) { + return; + } + + logs += 1; + lastLogAt = now; + + console.log(...c); +} + +const c = new Compartment({ + // Critical + Math, + Date, + console: { + log: log.bind(self), + error: log.bind(self), + warn: log.bind(self) + }, + + // Timings + setTimeout, + clearTimeout, + Promise, + + // Structs & Utilities + Map, + Set, + JSON, + RegExp, + + // Buffer + ArrayBuffer, + DataView, + Blob, + Uint8Array, + Int8Array, + Uint16Array, + Int32Array, + Float32Array, + URL, + + // Decoding + TextDecoder, + TextEncoder, + + // Crypto + crypto: self.crypto, + + // Core + postMessage: self.postMessage.bind(self), + atob, + btoa +}); + +c.evaluate(` + globalThis.handleHostMessage = (messageEventData) => { + // The plugin's standard 'onmessage' handler is called here + globalThis.self.onmessage && globalThis.self.onmessage({ data: messageEventData }); + }; + + console.log("Worker: Testing", URL); + + globalThis.self = globalThis; + + Object.assign(globalThis, { onmessage, postMessage, atob, btoa }); +`); + +// main worker (host) +const handlePluginMessage = (dat: any) => { + const pluginHandler = c.globalThis.handleHostMessage; + + if (typeof pluginHandler === 'function') { + pluginHandler(dat); + } else { + // Error handling if the plugin failed to initialize its handler + console.error("Plugin message handler is not available."); + } +}; + +self.onmessage = (d: MessageEvent) => { + const code = new TextDecoder("utf-8").decode(d.data); + + c.evaluate(code); + + self.onmessage = (e) => { + handlePluginMessage({ data: e.data }); + }; +} diff --git a/src/components/backButton.tsx b/src/components/backButton.tsx new file mode 100644 index 0000000..b65fe1c --- /dev/null +++ b/src/components/backButton.tsx @@ -0,0 +1,10 @@ +import { ChevronLeft } from "lucide-react"; + +export default function BackButton({ backTo, set, noRightRound = false }: { backTo: number; set: (_: number) => void, noRightRound: boolean }) { + return +} \ No newline at end of file diff --git a/src/components/category.css b/src/components/category.css new file mode 100644 index 0000000..5fee161 --- /dev/null +++ b/src/components/category.css @@ -0,0 +1,7 @@ +.category:hover { + @apply bg-white dark:bg-neutral-content/10 rounded-lg; +} + +.category[data-open="true"]:hover { + @apply rounded-t-lg rounded-b-none; +} \ No newline at end of file diff --git a/src/components/category.tsx b/src/components/category.tsx new file mode 100644 index 0000000..6fccf2e --- /dev/null +++ b/src/components/category.tsx @@ -0,0 +1,65 @@ +import React, { useState } from "react"; + +import { Separator } from "@/components/ui/separator"; + +interface CategoryProps { + title: string; + description: string; + Icon: typeof ChevronDown; + children?: React.ReactNode; + nearChevron?: React.ReactNode; + openable?: boolean; + normallyOpen?: boolean; + forceOpen?: boolean; +} + +import { ChevronDown } from "lucide-react"; + +export function Category({ + title, + description, + Icon, + children, + nearChevron, + openable = true, + normallyOpen, + forceOpen = false +}: CategoryProps) { + const [open, setOpen] = useState(normallyOpen || false); + + return ( +
+
{ + if (openable && !forceOpen) { + setOpen((o) => !o) + } + }} + > +
+ +
+
+

{title}

+ {description} +
+
+ {nearChevron} +
+
+ {!forceOpen && (openable && )} +
+
+ + {openable &&
+ ); +} diff --git a/src/components/select.tsx b/src/components/select.tsx new file mode 100644 index 0000000..a1a7559 --- /dev/null +++ b/src/components/select.tsx @@ -0,0 +1,47 @@ +import React from "react"; + +interface ConfigProps { + title: string; + description: string; + Icon: typeof ChevronDown; + onClick?: () => void; + children?: React.ReactNode; + pointer?: boolean; +} + +import { ChevronDown } from "lucide-react"; + +export function ConfigSelect({ + title, + description, + Icon, + children, + onClick, + pointer +}: ConfigProps) { + return ( +
{ + if (onClick) { + onClick() + } + }} + > +
+
+ +
+
+

{title}

+ {description} +
+
+ {children} +
+
+
+ ); +} diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx index 61875fc..f56b88d 100644 --- a/src/components/ui/button.tsx +++ b/src/components/ui/button.tsx @@ -1,11 +1,11 @@ -import * as React from "react" -import { Slot } from "@radix-ui/react-slot" -import { cva, type VariantProps } from "class-variance-authority" +import * as React from "react"; +import { Slot } from "@radix-ui/react-slot"; +import { cva, type VariantProps } from "class-variance-authority"; -import { cn } from "@/lib/utils" +import { cn } from "@/lib/utils"; const buttonVariants = cva( - "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-[color,box-shadow] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 focus-visible:ring-4 focus-visible:outline-1 aria-invalid:focus-visible:ring-0", + "inline-flex items-center justify-center gap-2 cursor-pointer whitespace-nowrap rounded-md text-sm font-medium transition-[color,box-shadow] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 focus-visible:ring-4 focus-visible:outline-1 aria-invalid:focus-visible:ring-0", { variants: { variant: { @@ -31,8 +31,8 @@ const buttonVariants = cva( variant: "default", size: "default", }, - } -) + }, +); function Button({ className, @@ -42,9 +42,9 @@ function Button({ ...props }: React.ComponentProps<"button"> & VariantProps & { - asChild?: boolean + asChild?: boolean; }) { - const Comp = asChild ? Slot : "button" + const Comp = asChild ? Slot : "button"; return ( - ) + ); } -export { Button, buttonVariants } +export { Button, buttonVariants }; diff --git a/src/components/ui/popover.tsx b/src/components/ui/popover.tsx new file mode 100644 index 0000000..b654e53 --- /dev/null +++ b/src/components/ui/popover.tsx @@ -0,0 +1,50 @@ +import * as React from "react"; +import * as PopoverPrimitive from "@radix-ui/react-popover"; + +import { cn } from "@/lib/utils"; +import { FluentProvider } from "@fluentui/react-components"; +import { useUITheme } from "@/lib"; + +function Popover({ + ...props +}: React.ComponentProps) { + return ; +} + +function PopoverTrigger({ + ...props +}: React.ComponentProps) { + return ; +} + +function PopoverContent({ + className, + align = "center", + sideOffset = 4, + ...props +}: React.ComponentProps) { + return ( + + + + + + ); +} + +function PopoverAnchor({ + ...props +}: React.ComponentProps) { + return ; +} + +export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }; diff --git a/src/components/ui/select.tsx b/src/components/ui/select.tsx new file mode 100644 index 0000000..7935540 --- /dev/null +++ b/src/components/ui/select.tsx @@ -0,0 +1,183 @@ +import * as React from "react" +import * as SelectPrimitive from "@radix-ui/react-select" +import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from "lucide-react" + +import { cn } from "@/lib/utils" + +function Select({ + ...props +}: React.ComponentProps) { + return +} + +function SelectGroup({ + ...props +}: React.ComponentProps) { + return +} + +function SelectValue({ + ...props +}: React.ComponentProps) { + return +} + +function SelectTrigger({ + className, + size = "default", + children, + ...props +}: React.ComponentProps & { + size?: "sm" | "default" +}) { + return ( + + {children} + + + + + ) +} + +function SelectContent({ + className, + children, + position = "popper", + ...props +}: React.ComponentProps) { + return ( + + + + + {children} + + + + + ) +} + +function SelectLabel({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function SelectItem({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + + + + + + {children} + + ) +} + +function SelectSeparator({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function SelectScrollUpButton({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + ) +} + +function SelectScrollDownButton({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + ) +} + +export { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectLabel, + SelectScrollDownButton, + SelectScrollUpButton, + SelectSeparator, + SelectTrigger, + SelectValue, +} diff --git a/src/components/ui/separator.tsx b/src/components/ui/separator.tsx new file mode 100644 index 0000000..ccb63c0 --- /dev/null +++ b/src/components/ui/separator.tsx @@ -0,0 +1,26 @@ +import * as React from "react"; +import * as SeparatorPrimitive from "@radix-ui/react-separator"; + +import { cn } from "@/lib/utils"; + +function Separator({ + className, + orientation = "horizontal", + decorative = true, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +export { Separator }; diff --git a/src/components/ui/skeleton.tsx b/src/components/ui/skeleton.tsx new file mode 100644 index 0000000..32ea0ef --- /dev/null +++ b/src/components/ui/skeleton.tsx @@ -0,0 +1,13 @@ +import { cn } from "@/lib/utils" + +function Skeleton({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +export { Skeleton } diff --git a/src/components/ui/sonner.tsx b/src/components/ui/sonner.tsx index c5c090d..a589771 100644 --- a/src/components/ui/sonner.tsx +++ b/src/components/ui/sonner.tsx @@ -1,17 +1,18 @@ -import { useTheme } from "next-themes" -import { Toaster as Sonner, ToasterProps } from "sonner" +import { useUITheme } from "@/lib"; +import { teamsLightTheme } from "@fluentui/react-components"; +import { Toaster as Sonner, ToasterProps } from "sonner"; const Toaster = ({ ...props }: ToasterProps) => { - const { theme = "system" } = useTheme() + const theme = useUITheme(); return ( { }} {...props} /> - ) -} + ); +}; -export { Toaster } +export { Toaster }; diff --git a/src/controls/components/button.tsx b/src/controls/components/button.tsx index 62eac33..1637374 100644 --- a/src/controls/components/button.tsx +++ b/src/controls/components/button.tsx @@ -1,5 +1,5 @@ -import type { ButtonHTMLAttributes } from "react" -import { cn } from "@controls/libs/utils" +import type { ButtonHTMLAttributes } from "react"; +import { cn } from "@controls/libs/utils"; export function Button({ className, @@ -10,11 +10,11 @@ export function Button({ - ) + ); } diff --git a/src/controls/components/icons.tsx b/src/controls/components/icons.tsx index cbe55a2..9d3b1bc 100644 --- a/src/controls/components/icons.tsx +++ b/src/controls/components/icons.tsx @@ -1,4 +1,4 @@ -import type { JSX, SVGProps } from "react" +import type { JSX, SVGProps } from "react"; export const Icons = { minimizeWin: (props: JSX.IntrinsicAttributes & SVGProps) => ( @@ -34,7 +34,7 @@ export const Icons = { ), maximizeRestoreWin: ( - props: JSX.IntrinsicAttributes & SVGProps + props: JSX.IntrinsicAttributes & SVGProps, ) => ( ), -} +}; diff --git a/src/controls/contexts/plugin-window.tsx b/src/controls/contexts/plugin-window.tsx index 0feab83..f4ef725 100644 --- a/src/controls/contexts/plugin-window.tsx +++ b/src/controls/contexts/plugin-window.tsx @@ -1,17 +1,17 @@ -import type { Window } from "@tauri-apps/api/window" +import type { Window } from "@tauri-apps/api/window"; -import { getCurrentWindow } from "@tauri-apps/api/window" +import { getCurrentWindow } from "@tauri-apps/api/window"; -import React, { createContext, useCallback, useEffect, useState } from "react" -import { getOsType } from "../libs/plugin-os" +import React, { createContext, useCallback, useEffect, useState } from "react"; +import { getOsType } from "../libs/plugin-os"; interface TauriAppWindowContextType { - appWindow: Window | null - isWindowMaximized: boolean - minimizeWindow: () => Promise - maximizeWindow: () => Promise - fullscreenWindow: () => Promise - closeWindow: () => Promise + appWindow: Window | null; + isWindowMaximized: boolean; + minimizeWindow: () => Promise; + maximizeWindow: () => Promise; + fullscreenWindow: () => Promise; + closeWindow: () => Promise; } const TauriAppWindowContext = createContext({ @@ -21,85 +21,85 @@ const TauriAppWindowContext = createContext({ maximizeWindow: () => Promise.resolve(), fullscreenWindow: () => Promise.resolve(), closeWindow: () => Promise.resolve(), -}) +}); interface TauriAppWindowProviderProps { - children: React.ReactNode + children: React.ReactNode; } export const TauriAppWindowProvider: React.FC = ({ children, }: any) => { - const [appWindow, setAppWindow] = useState(null) - const [isWindowMaximized, setIsWindowMaximized] = useState(false) + const [appWindow, setAppWindow] = useState(null); + const [isWindowMaximized, setIsWindowMaximized] = useState(false); // Fetch the Tauri window plugin when the component mounts // Dynamically import plugin-window for next.js, sveltekit, nuxt etc. support: // https://github.com/tauri-apps/plugins-workspace/issues/217 useEffect(() => { if (typeof window !== "undefined") { - setAppWindow(getCurrentWindow()) + setAppWindow(getCurrentWindow()); } - }, []) + }, []); // Update the isWindowMaximized state when the window is resized const updateIsWindowMaximized = useCallback(async () => { if (appWindow) { - const _isWindowMaximized = await appWindow.isMaximized() - setIsWindowMaximized(_isWindowMaximized) + const _isWindowMaximized = await appWindow.isMaximized(); + setIsWindowMaximized(_isWindowMaximized); } - }, [appWindow]) + }, [appWindow]); useEffect(() => { getOsType().then((osname) => { // temporary: https://github.com/agmmnn/tauri-controls/issues/10#issuecomment-1675884962 if (osname !== "macos") { - updateIsWindowMaximized() - let unlisten: () => void = () => { } + updateIsWindowMaximized(); + let unlisten: () => void = () => {}; const listen = async () => { if (appWindow) { unlisten = await appWindow.onResized(() => { - updateIsWindowMaximized() - }) + updateIsWindowMaximized(); + }); } - } - listen() + }; + listen(); // Cleanup the listener when the component unmounts - return () => unlisten && unlisten() + return () => unlisten && unlisten(); } - }) - }, [appWindow, updateIsWindowMaximized]) + }); + }, [appWindow, updateIsWindowMaximized]); const minimizeWindow = async () => { if (appWindow) { - await appWindow.minimize() + await appWindow.minimize(); } - } + }; const maximizeWindow = async () => { if (appWindow) { - await appWindow.toggleMaximize() + await appWindow.toggleMaximize(); } - } + }; const fullscreenWindow = async () => { if (appWindow) { - const fullscreen = await appWindow.isFullscreen() + const fullscreen = await appWindow.isFullscreen(); if (fullscreen) { - await appWindow.setFullscreen(false) + await appWindow.setFullscreen(false); } else { - await appWindow.setFullscreen(true) + await appWindow.setFullscreen(true); } } - } + }; const closeWindow = async () => { if (appWindow) { - await appWindow.close() + await appWindow.close(); } - } + }; // Provide the context values to the children components return ( @@ -115,7 +115,7 @@ export const TauriAppWindowProvider: React.FC = ({ > {children} - ) -} + ); +}; -export default TauriAppWindowContext +export default TauriAppWindowContext; diff --git a/src/controls/controls/index.ts b/src/controls/controls/index.ts index 7ca2831..c89ec78 100644 --- a/src/controls/controls/index.ts +++ b/src/controls/controls/index.ts @@ -1,3 +1,3 @@ -export { Windows } from "./windows" -export { MacOS } from "./macos" -export { Gnome } from "./linux" +export { Windows } from "./windows"; +export { MacOS } from "./macos"; +export { Gnome } from "./linux"; diff --git a/src/controls/controls/linux/gnome.tsx b/src/controls/controls/linux/gnome.tsx index e400eb7..dce4a50 100644 --- a/src/controls/controls/linux/gnome.tsx +++ b/src/controls/controls/linux/gnome.tsx @@ -1,18 +1,23 @@ -import { useContext, type HTMLProps } from "react" -import { Button } from "@controls/components/button" -import { Icons } from "@controls/components/icons" -import TauriAppWindowContext from "@controls/contexts/plugin-window" -import { cn } from "@controls/libs/utils" +import { useContext, type HTMLProps } from "react"; +import { Button } from "@controls/components/button"; +import { Icons } from "@controls/components/icons"; +import TauriAppWindowContext from "@controls/contexts/plugin-window"; +import { cn } from "@controls/libs/utils"; -export function Gnome({ className, ...props }: HTMLProps) { +export function Gnome({ + className, + children, + ...props +}: HTMLProps) { const { isWindowMaximized, minimizeWindow, maximizeWindow, closeWindow } = - useContext(TauriAppWindowContext) + useContext(TauriAppWindowContext); return (
+ {children}
- ) + ); } diff --git a/src/controls/controls/linux/index.ts b/src/controls/controls/linux/index.ts index bed9723..d6821f5 100644 --- a/src/controls/controls/linux/index.ts +++ b/src/controls/controls/linux/index.ts @@ -1 +1 @@ -export { Gnome } from "./gnome" +export { Gnome } from "./gnome"; diff --git a/src/controls/controls/macos.tsx b/src/controls/controls/macos.tsx index 5f0d0a2..eda3124 100644 --- a/src/controls/controls/macos.tsx +++ b/src/controls/controls/macos.tsx @@ -1,52 +1,57 @@ -import { useContext, useEffect, useState, type HTMLProps } from "react" -import { Icons } from "@controls/components/icons" -import { cn } from "@controls/libs/utils" -import { Button } from "../components/button" -import TauriAppWindowContext from "../contexts/plugin-window" +import { useContext, useEffect, useState, type HTMLProps } from "react"; +import { Icons } from "@controls/components/icons"; +import { cn } from "@controls/libs/utils"; +import { Button } from "../components/button"; +import TauriAppWindowContext from "../contexts/plugin-window"; -export function MacOS({ className, ...props }: HTMLProps) { +export function MacOS({ + className, + children, + ...props +}: HTMLProps) { const { minimizeWindow, maximizeWindow, fullscreenWindow, closeWindow } = - useContext(TauriAppWindowContext) + useContext(TauriAppWindowContext); - const [isAltKeyPressed, setIsAltKeyPressed] = useState(false) - const [isHovering, setIsHovering] = useState(false) + const [isAltKeyPressed, setIsAltKeyPressed] = useState(false); + const [isHovering, setIsHovering] = useState(false); - const last = isAltKeyPressed ? : - const key = "Alt" + const last = isAltKeyPressed ? : ; + const key = "Alt"; const handleMouseEnter = () => { - setIsHovering(true) - } + setIsHovering(true); + }; const handleMouseLeave = () => { - setIsHovering(false) - } + setIsHovering(false); + }; const handleAltKeyDown = (e: KeyboardEvent) => { if (e.key === key) { - setIsAltKeyPressed(true) + setIsAltKeyPressed(true); } - } + }; const handleAltKeyUp = (e: KeyboardEvent) => { if (e.key === key) { - setIsAltKeyPressed(false) + setIsAltKeyPressed(false); } - } + }; useEffect(() => { // Attach event listeners when the component mounts - window.addEventListener("keydown", handleAltKeyDown) - window.addEventListener("keyup", handleAltKeyUp) - }, []) + window.addEventListener("keydown", handleAltKeyDown); + window.addEventListener("keyup", handleAltKeyUp); + }, []); return (
+ {children}
- ) + ); } diff --git a/src/controls/controls/windows.tsx b/src/controls/controls/windows.tsx index 5fc3dab..0229366 100644 --- a/src/controls/controls/windows.tsx +++ b/src/controls/controls/windows.tsx @@ -1,15 +1,20 @@ -import { useContext, type HTMLProps } from "react" -import { Icons } from "@controls/components/icons" -import TauriAppWindowContext from "@controls/contexts/plugin-window" -import { cn } from "@controls/libs/utils" -import { Button } from "../components/button" +import { useContext, type HTMLProps } from "react"; +import { Icons } from "@controls/components/icons"; +import TauriAppWindowContext from "@controls/contexts/plugin-window"; +import { cn } from "@controls/libs/utils"; +import { Button } from "../components/button"; -export function Windows({ className, ...props }: HTMLProps) { +export function Windows({ + className, + children, + ...props +}: HTMLProps) { const { isWindowMaximized, minimizeWindow, maximizeWindow, closeWindow } = - useContext(TauriAppWindowContext) + useContext(TauriAppWindowContext); return (
+ {children}
- ) + ); } diff --git a/src/controls/index.css b/src/controls/index.css index b5c61c9..0229963 100644 --- a/src/controls/index.css +++ b/src/controls/index.css @@ -1,3 +1,3 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; +@import "tailwindcss"; + +@custom-variant dark (&:where(.dark, .dark *)); \ No newline at end of file diff --git a/src/controls/index.ts b/src/controls/index.ts index 717c5f5..beb00fc 100644 --- a/src/controls/index.ts +++ b/src/controls/index.ts @@ -1,6 +1,6 @@ -import "./index.css" +import "./index.css"; -export type { WindowControlsProps, WindowTitlebarProps } from "./types" +export type { WindowControlsProps, WindowTitlebarProps } from "./types"; -export { WindowControls } from "./window-controls" -export { WindowTitlebar } from "./window-titlebar" +export { WindowControls } from "./window-controls"; +export { WindowTitlebar } from "./window-titlebar"; diff --git a/src/controls/libs/plugin-os.ts b/src/controls/libs/plugin-os.ts index bc12771..5047e96 100644 --- a/src/controls/libs/plugin-os.ts +++ b/src/controls/libs/plugin-os.ts @@ -1,9 +1,9 @@ -import type { OsType } from "@tauri-apps/plugin-os" -import { type } from "@tauri-apps/plugin-os" +import type { OsType } from "@tauri-apps/plugin-os"; +import { type } from "@tauri-apps/plugin-os"; -const osType = type() +const osType = type(); // A helper function to get the OS type, which returns a Promise export function getOsType(): Promise { - return new Promise((r) => r(osType)) + return new Promise((r) => r(osType)); } diff --git a/src/controls/libs/utils.ts b/src/controls/libs/utils.ts index bd0c391..a5ef193 100644 --- a/src/controls/libs/utils.ts +++ b/src/controls/libs/utils.ts @@ -1,6 +1,6 @@ -import { clsx, type ClassValue } from "clsx" -import { twMerge } from "tailwind-merge" +import { clsx, type ClassValue } from "clsx"; +import { twMerge } from "tailwind-merge"; export function cn(...inputs: ClassValue[]) { - return twMerge(clsx(inputs)) + return twMerge(clsx(inputs)); } diff --git a/src/controls/types.ts b/src/controls/types.ts index 0a06559..493b3e8 100644 --- a/src/controls/types.ts +++ b/src/controls/types.ts @@ -1,4 +1,4 @@ -import type { HTMLProps } from "react" +import type { HTMLProps, ReactNode } from "react"; /** * Interface for window controls. @@ -6,33 +6,35 @@ import type { HTMLProps } from "react" * the operating system the app is running on and display the appropriate elements. */ export interface WindowControlsProps extends HTMLProps { + right?: ReactNode; + /** * Specifies which platform's window controls to display. * It can be one of "windows", "macos", or "gnome". * If the `platform` property is not specified, the library will automatically detect * the operating system the app is running on and display the appropriate elements. */ - platform?: "windows" | "macos" | "gnome" + platform?: "windows" | "macos" | "gnome"; /** * Indicates whether the window controls should be shown or hidden. * @default false */ - hide?: boolean + hide?: boolean; /** * - "display": "display: none;" making them completely invisible and not taking up any space. * - "visibility": "visibility: hidden;" making them invisible but still occupying the same space. * @default "display" */ - hideMethod?: "display" | "visibility" + hideMethod?: "display" | "visibility"; /** * Justify/Snap WindowControls * * @default false, (if not defined in WindowTitlebar automatically assigned) */ - justify?: boolean + justify?: boolean; /** * Specifies the Linux desktop environment for which the window controls are intended. @@ -49,13 +51,15 @@ export interface WindowControlsProps extends HTMLProps { // preventRightClickMenu?: "always" | "production" /** `data-tauri-drag-region` */ - "data-tauri-drag-region"?: boolean + "data-tauri-drag-region"?: boolean; } /** * Interface for titlebar */ export interface WindowTitlebarProps extends HTMLProps { + right?: ReactNode; + /** * The `controlsOrder` property is an optional property used in the `WindowControls` interface. * It allows you to specify the order in which the window controls should be rendered relative to the children. @@ -71,10 +75,10 @@ export interface WindowTitlebarProps extends HTMLProps { * - "platform": for OS-based positioning specified in `windowControlsProps` * @default "system" */ - controlsOrder?: "right" | "left" | "platform" | "system" + controlsOrder?: "right" | "left" | "platform" | "system"; /** * `WindowControls` props */ - windowControlsProps?: WindowControlsProps + windowControlsProps?: WindowControlsProps; } diff --git a/src/controls/window-controls.tsx b/src/controls/window-controls.tsx index 99a1be8..ee9cfe0 100644 --- a/src/controls/window-controls.tsx +++ b/src/controls/window-controls.tsx @@ -1,47 +1,48 @@ -import { useEffect, useState } from "react" -import { cn } from "@controls/libs/utils" -import { TauriAppWindowProvider } from "./contexts/plugin-window" -import { Gnome, MacOS, Windows } from "./controls" -import { getOsType } from "./libs/plugin-os" -import type { WindowControlsProps } from "./types" +import { useEffect, useState } from "react"; +import { cn } from "@controls/libs/utils"; +import { TauriAppWindowProvider } from "./contexts/plugin-window"; +import { Gnome, MacOS, Windows } from "./controls"; +import { getOsType } from "./libs/plugin-os"; +import type { WindowControlsProps } from "./types"; export function WindowControls({ platform, justify = false, hide = false, hideMethod = "display", + right, // linuxDesktop = "gnome", className, ...props }: WindowControlsProps) { - const [osType, setOsType] = useState(undefined) + const [osType, setOsType] = useState(undefined); useEffect(() => { getOsType().then((type) => { - setOsType(type) - }) - }, []) + setOsType(type); + }); + }, []); const customClass = cn( "flex", className, - hide && (hideMethod === "display" ? "hidden" : "invisible") - ) + hide && (hideMethod === "display" ? "hidden" : "invisible"), + ); // Determine the default platform based on the operating system if not specified if (!platform) { switch (osType) { case "macos": - platform = "macos" - break + platform = "macos"; + break; case "linux": - platform = "gnome" - break + platform = "gnome"; + break; case "windows": - platform = "windows" - break + platform = "windows"; + break; default: - platform = undefined + platform = undefined; } } @@ -51,27 +52,34 @@ export function WindowControls({ return ( - ) + ); case "macos": return ( - - ) + + ); case "gnome": return ( - - ) + + ); default: - return ( - <> - ) + return <>; } - } + }; return ( - ) + ); } diff --git a/src/controls/window-titlebar.tsx b/src/controls/window-titlebar.tsx index 3e5328a..c8bf731 100644 --- a/src/controls/window-titlebar.tsx +++ b/src/controls/window-titlebar.tsx @@ -1,51 +1,52 @@ -import type { OsType } from "@tauri-apps/plugin-os" -import { useEffect, useState } from "react" -import { cn } from "@controls/libs/utils" -import { getOsType } from "./libs/plugin-os" -import type { WindowTitlebarProps } from "./types" -import { WindowControls } from "./window-controls" +import type { OsType } from "@tauri-apps/plugin-os"; +import { useEffect, useState } from "react"; +import { cn } from "@controls/libs/utils"; +import { getOsType } from "./libs/plugin-os"; +import type { WindowTitlebarProps } from "./types"; +import { WindowControls } from "./window-controls"; export function WindowTitlebar({ children, controlsOrder = "system", className, + right, windowControlsProps, ...props }: WindowTitlebarProps) { - const [osType, setOsType] = useState(undefined) + const [osType, setOsType] = useState(undefined); useEffect(() => { getOsType().then((type) => { - setOsType(type) - }) - }, []) + setOsType(type); + }); + }, []); const left = controlsOrder === "left" || (controlsOrder === "platform" && windowControlsProps?.platform === "macos") || - (controlsOrder === "system" && osType === "macos") + (controlsOrder === "system" && osType === "macos"); const customProps = (ml: string) => { - if (windowControlsProps?.justify !== undefined) return windowControlsProps + if (windowControlsProps?.justify !== undefined) return windowControlsProps; const { justify: windowControlsJustify, className: windowControlsClassName, ...restProps - } = windowControlsProps || {} + } = windowControlsProps || {}; return { justify: false, className: cn(windowControlsClassName, ml), ...restProps, - } - } + }; + }; return (
{children} + {right} ) : ( <> {children} - + )}
- ) + ); } diff --git a/src/data/appCache.ts b/src/data/appCache.ts new file mode 100644 index 0000000..571bb20 --- /dev/null +++ b/src/data/appCache.ts @@ -0,0 +1,46 @@ +import { AHQStoreApplication } from "ahqstore-types"; +import { getCommitSmart } from "./commit"; + +interface MapData { + data: [AHQStoreApplication, string], + expires: number +} + +let cache: Map = new Map(); +let commit: string | undefined = undefined; + +setInterval(() => { + const now = Date.now(); + cache.forEach((val, key, map) => { + if (now > val.expires) { + map.delete(key); + } + }); +}, 30 * 1000); + +export async function getKeyFromCache(key: string): Promise<[AHQStoreApplication, string] | undefined> { + const ahqstoreCommit = (await getCommitSmart()); + + if (commit != ahqstoreCommit) { + commit = ahqstoreCommit; + cache.clear(); + + return undefined; + } + + return cache.get(key)?.data; +} + +export async function setKeyToCache(key: string, val: [AHQStoreApplication, string]) { + const ahqstoreCommit = (await getCommitSmart()); + + if (commit != ahqstoreCommit) { + commit = ahqstoreCommit; + cache.clear(); + } + + cache.set(key, { + data: val, + expires: Date.now() + (60 * 1000) + }); +} diff --git a/src/data/commit.ts b/src/data/commit.ts new file mode 100644 index 0000000..0616d11 --- /dev/null +++ b/src/data/commit.ts @@ -0,0 +1,22 @@ +import { getCommit } from "src-plugin/dist-js"; + +// Simple Memoization +let cachedCommit: string | null = null; +let clearCacheTimer: any = null; + +export async function getCommitSmart() { + if (cachedCommit) return cachedCommit; + + // Fetch from Rust + cachedCommit = (await getCommit()).ahqstore; + + // Clear local cache after 50ms (enough time to render the whole list) + if (!clearCacheTimer) { + clearCacheTimer = setTimeout(() => { + cachedCommit = null; + clearCacheTimer = null; + }, 50); + } + + return cachedCommit; +} \ No newline at end of file diff --git a/src/data/implementations/appView.ts b/src/data/implementations/appView.ts new file mode 100644 index 0000000..26dc741 --- /dev/null +++ b/src/data/implementations/appView.ts @@ -0,0 +1,3 @@ +import { Store } from "../store"; + +export const openApplicationState = new Store(undefined); \ No newline at end of file diff --git a/src/data/implementations/catView.ts b/src/data/implementations/catView.ts new file mode 100644 index 0000000..b3d9c22 --- /dev/null +++ b/src/data/implementations/catView.ts @@ -0,0 +1,3 @@ +import { Store } from "../store"; + +export const categoryView = new Store(undefined); \ No newline at end of file diff --git a/src/data/implementations/devView.ts b/src/data/implementations/devView.ts new file mode 100644 index 0000000..166b235 --- /dev/null +++ b/src/data/implementations/devView.ts @@ -0,0 +1,4 @@ +import { Store } from "../store"; + +export const devIdStore = new Store(undefined); +export const backToPage = new Store(undefined); \ No newline at end of file diff --git a/src/data/implementations/searchData.ts b/src/data/implementations/searchData.ts new file mode 100644 index 0000000..35a266f --- /dev/null +++ b/src/data/implementations/searchData.ts @@ -0,0 +1,3 @@ +import { Store } from "../store"; + +export const searchQueryData = new Store(undefined); \ No newline at end of file diff --git a/src/data/store.ts b/src/data/store.ts new file mode 100644 index 0000000..0d78df1 --- /dev/null +++ b/src/data/store.ts @@ -0,0 +1,74 @@ +import { useEffect, useState } from "react"; + +interface Subcription { + unregister: () => void; +} + +export class Store { + private inner: T + private listeners: { + [key: number]: ((newData: T) => void) + }; + private counter = 0; + + constructor(data: T) { + this.inner = data + this.listeners = {} + } + + listen(listener: (newData: T) => void): Subcription { + const counter = ++this.counter; + + this.listeners[counter] = listener; + + const unregister = () => { + delete this.listeners[counter]; + }; + + return { + unregister + }; + } + + get data(): T { + return this.inner + } + + set data(value: T) { + this.inner = value; + + Object.values(this.listeners).forEach((a) => { + try { + a(value) + } catch (e) { + console.error("Unexpected: "); + console.error(e); + } + }); + } + + set data_using_fn(call: (old: T) => T) { + const value = call(this.inner); + + this.data = value; + } +} + +export function useStore(store: Store): T { + const [data, setData] = useState(store.data); + + useEffect(() => { + const listenFn = (data: T) => { + setData(data) + }; + + const sub = store.listen(listenFn); + + return () => { + console.info("Unregistering..."); + sub.unregister(); + }; + }, []); + + return data; +} \ No newline at end of file diff --git a/src/hooks/use-media-query.tsx b/src/hooks/use-media-query.tsx new file mode 100644 index 0000000..b2057ce --- /dev/null +++ b/src/hooks/use-media-query.tsx @@ -0,0 +1,13 @@ +import { useEffect, useState } from "react"; + +export function useMediaQuery(mediaQuery: string) { + const [query, setQuery] = useState(window.matchMedia(mediaQuery).matches); + + useEffect(() => { + window.addEventListener("resize", (_) => { + setQuery(window.matchMedia(mediaQuery).matches); + }); + }, []); + + return query; +} diff --git a/src-plugin/android/.gradle/8.5/gc.properties b/src/index.d.ts similarity index 100% rename from src-plugin/android/.gradle/8.5/gc.properties rename to src/index.d.ts diff --git a/src/lib/auth/apply.ts b/src/lib/auth/apply.ts new file mode 100644 index 0000000..222bc8a --- /dev/null +++ b/src/lib/auth/apply.ts @@ -0,0 +1,83 @@ +import { decrypt, open } from "tauri-plugin-ahqstore-api"; + +export interface CommentResp { + html_url: string; +} + +export async function applyForAppLaunch(manifest: string) { + const rawToken = JSON.parse( + localStorage.getItem("token") || "[]", + ) as number[]; + + const token = await decrypt(rawToken); + + try { + const out: CommentResp = await fetch( + `https://api.github.com/repos/ahqstore/repo_community/issues/29/comments`, + { + headers: { + Accept: "application/vnd.github+json", + "User-Agent": "AHQ Store Automation", + Authorization: `Bearer ${token}` + }, + method: "POST", + body: JSON.stringify({ + body: `/store set ${manifest}` + }) + } + ).then((r) => { + if (!r.ok) { + throw new Error("Oopsie"); + } + + return r.json(); + }); + + await open(out.html_url); + } catch (_) { + await open("https://ahqstore.github.io/submissionFailed"); + } +} + +export async function applyAsDeveloper(name: string) { + const rawToken = JSON.parse( + localStorage.getItem("token") || "[]", + ) as number[]; + + const token = await decrypt(rawToken); + + const link = btoa( + encodeURIComponent( + JSON.stringify({ + name + }) + ) + ); + + try { + const out: CommentResp = await fetch( + `https://api.github.com/repos/ahqstore/repo_community/issues/29/comments`, + { + headers: { + Accept: "application/vnd.github+json", + "User-Agent": "AHQ Store Automation", + Authorization: `Bearer ${token}` + }, + method: "POST", + body: JSON.stringify({ + body: `/account create base64:${link}` + }) + } + ).then((r) => { + if (!r.ok) { + throw new Error("Oopsie"); + } + + return r.json(); + }); + + await open(out.html_url); + } catch (_) { + await open("https://ahqstore.github.io/applyFailed"); + } +} \ No newline at end of file diff --git a/src/lib/auth/github.ts b/src/lib/auth/github.ts new file mode 100644 index 0000000..80d6fa2 --- /dev/null +++ b/src/lib/auth/github.ts @@ -0,0 +1,82 @@ +import { fetch } from "@tauri-apps/plugin-http"; +import { Auth } from "."; +import { login } from "./login"; + +import { open, showCode, removeCode } from "tauri-plugin-ahqstore-api"; + +import { toast } from "sonner"; + +import { clientId, scopes } from "./server"; + +interface DeviceCode { + device_code: string; + user_code: string; + verification_uri: string; + expires_in: number; + interval: number; +} + +interface Value { + access_token?: string; +} + +export async function startLogin(auth: Auth) { + const val: DeviceCode = await fetch( + `https://github.com/login/device/code?client_id=${clientId}&scope=${scopes}`, + { + headers: { + Accept: "application/json", + }, + method: "POST", + }, + ).then((r) => r.json()); + + toast.success(`Opened ${val.verification_uri}`); + + toast(`Enter code: ${val.user_code}`, { + cancel: { + label: "Ok", + onClick: () => { }, + }, + duration: 30_000, + }); + + open(val.verification_uri); + + showCode(val.user_code); + + let not_done = 0; + + const time = setInterval(async () => { + const response: Value = await fetch( + `https://github.com/login/oauth/access_token?client_id=${clientId}&device_code=${val.device_code}&grant_type=urn:ietf:params:oauth:grant-type:device_code`, + { + headers: { + Accept: "application/json", + }, + method: "POST", + }, + ).then((r) => r.json()); + + not_done += 1; + + if (response?.access_token != undefined) { + console.log(response); + + removeCode(); + clearInterval(time); + if (await login(auth, response.access_token)) { + toast.success("Logged in"); + } else { + toast.error("Failed to Log in"); + } + } + + if (not_done >= 10) { + removeCode(); + + toast.error("Failed to login: Timed Out"); + clearInterval(time); + } + }, 6000); +} diff --git a/src/lib/auth/hash.ts b/src/lib/auth/hash.ts new file mode 100644 index 0000000..6b161da --- /dev/null +++ b/src/lib/auth/hash.ts @@ -0,0 +1,18 @@ +import { getDevData, hashUsername } from "tauri-plugin-ahqstore-api" + +export async function generateGHUserHash(username: string): Promise { + if (username == "ahqsoftwares") return "a:1"; + + const hash = await hashUsername(username); + + return `a:${hash}`; +} + + +export async function verifyDevExists(hash: string) { + const resp = await getDevData( + hash + ).catch(() => undefined); + + return resp != undefined; +} diff --git a/src/lib/auth/index.ts b/src/lib/auth/index.ts new file mode 100644 index 0000000..f873b9b --- /dev/null +++ b/src/lib/auth/index.ts @@ -0,0 +1,28 @@ +export interface Auth { + loggedIn: boolean; + onAuthChange: ((auth?: User) => void)[]; + currentUser?: User; +} + +export interface User { + email?: string; + login: string; + name?: string; + avatar_url?: string; + dev: boolean; +} + +export function genAuth(): Auth { + return { + loggedIn: false, + onAuthChange: [], + }; +} + +export function logOut(auth: Auth) { + localStorage.removeItem("token"); + + auth.loggedIn = false; + auth.currentUser = undefined; + auth.onAuthChange.forEach((cb) => cb(undefined)); +} diff --git a/src/lib/auth/login.ts b/src/lib/auth/login.ts new file mode 100644 index 0000000..80c0712 --- /dev/null +++ b/src/lib/auth/login.ts @@ -0,0 +1,49 @@ +import { fetch } from "@tauri-apps/plugin-http"; +import { Auth, User } from "."; +import { decrypt, encrypt } from "tauri-plugin-ahqstore-api"; + +import { verifyDevExists, generateGHUserHash } from "./hash"; + +export function onAuthChange(auth: Auth, callback: (auth?: User) => void) { + auth.onAuthChange.push(callback); +} + +export async function tryAutoLogin(auth: Auth) { + try { + const rawToken = JSON.parse( + localStorage.getItem("token") || "[]", + ) as number[]; + + const token = await decrypt(rawToken); + + await login(auth, token); + } catch (_) { } +} + +export async function login(auth: Auth, auth_tok: string): Promise { + const { ok, data } = await fetch(`https://api.github.com/user`, { + method: "GET", + headers: { + Authorization: `Bearer ${auth_tok}`, + }, + connectTimeout: 100_000, + }).then(async (d) => ({ ...d, ok: d.ok, data: await d.json() })); + + if (ok) { + const hash = await generateGHUserHash(data.login); + + auth.currentUser = { + ...data, + dev: await verifyDevExists(hash), + }; + auth.loggedIn = true; + + localStorage.setItem("token", JSON.stringify(await encrypt(auth_tok))); + + auth.onAuthChange.forEach((cb) => cb(auth.currentUser)); + } else { + auth.onAuthChange.forEach((cb) => cb(undefined)); + } + + return ok; +} diff --git a/src/lib/auth/provider.tsx b/src/lib/auth/provider.tsx new file mode 100644 index 0000000..7e8f747 --- /dev/null +++ b/src/lib/auth/provider.tsx @@ -0,0 +1,28 @@ +import { + createContext, + ReactNode, + useContext, + useEffect, + useState, +} from "react"; +import { genAuth, User } from "."; +import { tryAutoLogin } from "./login"; + +export const authObject = genAuth(); + +const Auth = createContext(authObject.currentUser); +export const useAuth = () => useContext(Auth); + +export const AuthProvider = ({ children }: { children: ReactNode }) => { + const [user, setUser] = useState(); + + useEffect(() => { + authObject.onAuthChange.push((user) => { + console.debug(user); + setUser(user); + }); + tryAutoLogin(authObject); + }, []); + + return {children}; +}; diff --git a/src/lib/auth/server.ts b/src/lib/auth/server.ts new file mode 100644 index 0000000..b722920 --- /dev/null +++ b/src/lib/auth/server.ts @@ -0,0 +1,4 @@ +const clientId = "Ov23liU65H2gkdXeGc2G"; +const scopes = "read:user public_repo"; + +export { clientId, scopes }; diff --git a/src/lib/auth/verification.ts b/src/lib/auth/verification.ts new file mode 100644 index 0000000..29c3475 --- /dev/null +++ b/src/lib/auth/verification.ts @@ -0,0 +1,98 @@ +import { Repo } from "@/views/developer/applyApp"; +import { fetch } from "@tauri-apps/plugin-http"; +import { decrypt } from "tauri-plugin-ahqstore-api"; + +interface RepoData { + private: boolean +} + +interface ReleasesData { + assets: { + name: string; + browser_download_url: string; + }[] +} + +export async function verifyRepo(repo: Repo): Promise { + const rawToken = JSON.parse( + localStorage.getItem("token") || "[]", + ) as number[]; + + const token = await decrypt(rawToken); + + try { + const output: RepoData = await fetch( + `https://api.github.com/repos/${repo.author}/${repo.repo}`, + { + headers: { + "User-Agent": "AHQ Store Submissions", + Authorization: `Bearer ${token}` + } + } + ).then((r) => { + if (!r.ok) { + throw new Error("Failed to fetch repo") + } + + return r.json(); + }); + + if (output.private) { + return "The repository is private and hence can't be added to AHQ Store Community Repository" + } else { + return "" + } + } catch (_) { + return "Unable to fetch repository. The repository probably does not exist or is private." + } +} + +export interface Output { + error: boolean; + output: string; +} + +export async function getAHQStoreManifest(repo: Repo): Promise { + const rawToken = JSON.parse( + localStorage.getItem("token") || "[]", + ) as number[]; + + const token = await decrypt(rawToken); + + try { + const output: ReleasesData = await fetch( + `https://api.github.com/repos/${repo.author}/${repo.repo}/releases/latest`, + { + headers: { + "User-Agent": "AHQ Store Submissions", + Authorization: `Bearer ${token}` + } + } + ).then((r) => { + if (!r.ok) { + throw new Error("Failed to fetch repo") + } + + return r.json(); + }); + + const file = output.assets.find((x) => x.name == "ahqstore.json"); + + if (!file) { + return { + error: true, + output: "`ahqstore.json` is not present in the `latest` release assets" + } + } + + return { + error: false, + output: file.browser_download_url + } + } catch (_) { } + + return { + error: true, + output: "Unable to fetch `ahqstore.json` from your GitHub Releases" + } +} \ No newline at end of file diff --git a/src/lib/data.tsx b/src/lib/data.tsx new file mode 100644 index 0000000..0e0f882 --- /dev/null +++ b/src/lib/data.tsx @@ -0,0 +1,47 @@ +import { + createContext, + ReactNode, + useContext, + useEffect, + useState, +} from "react"; +import { getHome, Home as HomeInterface } from "tauri-plugin-ahqstore-api"; + +let homeStateRef: [string, string[]][] | undefined = undefined; +export const getHomeRef = () => homeStateRef; + +const Home = createContext<[string, string[]][] | undefined>(undefined); +const Splash = createContext(undefined); + +export const useHome = () => useContext(Home); +export const useSplash = () => useContext(Splash); + +export function HomeProvider({ children }: { children: ReactNode }) { + const [home, setHome] = useState<[string, string[]][] | undefined>(undefined); + const [splash, setSplash] = useState(undefined); + + useEffect(() => { + homeStateRef = home; + }, [home]); + + useEffect(() => { + console.log("Loading home..."); + + setTimeout(() => { + (async () => { + const json = await getHome(); + + setHome(json.home); + setSplash(json.splash); + + console.log("Done"); + })() + }, 1000); + }, []); + + return ( + + {children} + + ); +} diff --git a/src/lib/experiment.tsx b/src/lib/experiment.tsx new file mode 100644 index 0000000..e5a1e5f --- /dev/null +++ b/src/lib/experiment.tsx @@ -0,0 +1,26 @@ +import { + createContext, + ReactNode, + useContext, + useEffect, + useState, +} from "react"; + +const Experiment = createContext(false); + +export const useExperiment = () => useContext(Experiment); + +export function ExperimentProvider({ children }: { children: ReactNode }) { + const [val, setVal] = useState(false); + useEffect(() => { + setVal(localStorage.getItem("always-show-exp") == "true"); + + window.addEventListener("keydown", (e) => { + if (e.ctrlKey && e.key == "E") { + setVal((d) => !d); + } + }); + }, []); + + return {children}; +} diff --git a/src/lib/experiments.tsx b/src/lib/experiments.tsx new file mode 100644 index 0000000..b82643e --- /dev/null +++ b/src/lib/experiments.tsx @@ -0,0 +1,62 @@ +import { Bug, Cable, ToolboxIcon, SearchIcon } from "lucide-react"; +import { + createContext, + ReactNode, + useContext, + useEffect, + useMemo, +} from "react"; + +export interface Experiments { + toolbox?: boolean; + plugins?: boolean; + forceVibrant?: boolean; +} + +export const docs: { [key: string]: { docs: string, title: string, Icon: typeof SearchIcon } } = { + toolbox: { + docs: "Enables developer toolbox (FPS + heatmap) in AHQ Store", + title: "Enable Toolbox", + Icon: ToolboxIcon + }, + plugins: { + docs: "Enables plugins for Desktop Build for AHQ Store", + title: "Enable Plugins", + Icon: Cable + }, + forceVibrant: { + docs: "Forces Vibrant UI in any OS (danger: May lead to very broken UI)", + title: "Force Vibrant UI", + Icon: Bug + } +} + +const Experiments = createContext({}); + +export const useExperiments = () => useContext(Experiments); + +export let setExperiment: (n: Experiments) => void; + +export function ExperimentsProvider({ children }: { children: ReactNode }) { + // const [val, setVal] = useState({}); + const val = useMemo(() => { + try { + const item = localStorage.getItem("experiments")!; + const d = JSON.parse(item); + + if (d != null) { + return d; + } + } catch (_) { } + + return {} + }, []); + + useEffect(() => { + setExperiment = (d) => { + localStorage.setItem("experiments", JSON.stringify(d)); + }; + }, []); + + return {children}; +} diff --git a/src/lib/index.tsx b/src/lib/index.tsx index eb2b5d3..8e50170 100644 --- a/src/lib/index.tsx +++ b/src/lib/index.tsx @@ -1,29 +1,83 @@ -import { createContext, ReactNode, useEffect, useState } from "react"; -import { teamsDarkTheme, teamsLightTheme, FluentProvider } from "@fluentui/react-components" -import { type } from "@tauri-apps/plugin-os"; +import { + createContext, + ReactNode, + useContext, + useEffect, + useState, +} from "react"; +import { + teamsDarkTheme, + + teamsLightTheme, + FluentProvider, +} from "@fluentui/react-components"; +import { isWindows11 } from "src-plugin/dist-js"; +import { useExperiments } from "./experiments"; +import { AStorePluginManager } from "@/api/plugin/mgnt"; const def = String(window.matchMedia("(prefers-color-scheme: dark)").matches); -export default function fnTheme() { +export const VibrantWindows = createContext(false); + +export default function fnTheme(windows: boolean, micaApplied: (_: boolean) => void, alwaysVibrant?: boolean) { const dark = (localStorage.getItem("dark") || def) == "true"; - document.querySelector("html")?.classList.toggle("dark", dark); - document.querySelector("html")?.classList.toggle("not-win", type() != "windows"); + if (dark) { + document.querySelector("html")?.classList.add("dark"); + } else { + document.querySelector("html")?.classList.remove("dark"); + } + + if (alwaysVibrant || (windows && ((def == "true") == dark))) { + document.querySelector("html")?.classList.remove("not-win"); + micaApplied(true); + } else { + document.querySelector("html")?.classList.add("not-win"); + micaApplied(false); + } } -const ThemeContext = createContext(false); +export const ThemeContext = createContext(false); export let setUITheme = (_: boolean) => { }; -export function ThemeProvider({ children }: { children: ReactNode }) { - fnTheme(); +export const useUITheme = () => { + if (useContext(ThemeContext)) { + return teamsDarkTheme; + } else { + return teamsLightTheme; + } +}; +export function ThemeProvider({ children }: { children: ReactNode }) { const [dark, setDark] = useState(true); const [theme, setTheme] = useState(teamsDarkTheme); + const [windows, setWindows] = useState(false); + const [win32, setMICAApplied] = useState(false); + + const exp = useExperiments(); setUITheme = (theme: boolean) => setDark(theme); useEffect(() => { - localStorage.setItem("dark", String(dark)); + document + .querySelector("html")!! + .style.setProperty("--win32-accent", window.accent); + }, []); + + useEffect(() => { + isWindows11() + .then((d) => setWindows(d && dark == (def == "true"))) + .catch(console.error); + }, [dark]); + + useEffect(() => { + const dark = localStorage.getItem("dark"); + + if (typeof dark == "string") setDark(dark == "true"); + }, []); + + useEffect(() => { + localStorage.setItem("dark", dark ? "true" : "false"); if (dark) { setTheme(teamsDarkTheme); @@ -31,14 +85,26 @@ export function ThemeProvider({ children }: { children: ReactNode }) { setTheme(teamsLightTheme); } - fnTheme(); - }, [dark]); + fnTheme(windows, (value) => setMICAApplied(value), exp.forceVibrant); - return - -
- {children} -
-
-
-} \ No newline at end of file + AStorePluginManager.sendThemeUpdate(); + }, [exp, dark, windows]); + + useEffect(() => { + // @ts-ignore + globalThis.themeData = { + dark, + vibrant: win32 + }; + }, [dark, win32]); + + return ( + + + +
{children}
+
+
+
+ ); +} diff --git a/src/lib/utils.ts b/src/lib/utils.ts index bd0c391..a5ef193 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -1,6 +1,6 @@ -import { clsx, type ClassValue } from "clsx" -import { twMerge } from "tailwind-merge" +import { clsx, type ClassValue } from "clsx"; +import { twMerge } from "tailwind-merge"; export function cn(...inputs: ClassValue[]) { - return twMerge(clsx(inputs)) + return twMerge(clsx(inputs)); } diff --git a/src/main.tsx b/src/main.tsx index 6800c79..b181242 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,9 +1,35 @@ -import React from "react"; +import { scan } from "react-scan/all-environments"; + +try { + const item = localStorage.getItem("experiments")!; + const d = JSON.parse(item); + + if (d.toolbox) { + scan({ + enabled: true + }); + } +} catch (_) { } + + import ReactDOM from "react-dom/client"; import App from "./App"; -import { getCurrentWindow } from "@tauri-apps/api/window" +import { getCurrentWindow } from "@tauri-apps/api/window"; import { ThemeProvider } from "./lib"; +import { getCurrentWebviewWindow } from "@tauri-apps/api/webviewWindow"; +import { Secondary } from "./Secondary"; +import { Toaster } from "./components/ui/sonner"; +import { AuthProvider } from "./lib/auth/provider"; +import { ExperimentProvider } from "./lib/experiment"; +import { HomeProvider } from "./lib/data"; +import { ExperimentsProvider } from "./lib/experiments"; + +declare global { + interface Window { + accent: string; + } +} export const window = getCurrentWindow(); (async () => { @@ -12,10 +38,25 @@ export const window = getCurrentWindow(); } catch (_) { } })(); -ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( - +if (getCurrentWebviewWindow().label == "main") { + ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( + + + + + + + + + + + + , + ); +} else { + ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( - - - , -); + + , + ); +} diff --git a/src/views/app/app.css b/src/views/app/app.css new file mode 100644 index 0000000..f11d246 --- /dev/null +++ b/src/views/app/app.css @@ -0,0 +1 @@ +@reference "../../App.css"; diff --git a/src/views/app/index.tsx b/src/views/app/index.tsx new file mode 100644 index 0000000..c23bac0 --- /dev/null +++ b/src/views/app/index.tsx @@ -0,0 +1,43 @@ +import { openApplicationState } from "@/data/implementations/appView"; + +import { useStore } from "@/data/store"; + +import { useEffect, useState } from "react"; + +import "./app.css"; +import { CompoundButton } from "@fluentui/react-components"; +import { ArrowDownloadRegular } from "@fluentui/react-icons"; +import { getAppWrapped } from "@/api/fetchApps"; + +export default function Application() { + const appId = useStore(openApplicationState); + + const [, setLoading] = useState(true); + + console.log(appId); + + useEffect(() => { + setLoading(true); + + if (appId) { + getAppWrapped(appId); + } + }, [appId]); + + return
+
+ } + size="large" + shape="rounded" + secondaryContent={"Installs the app for current user."} + + > + Install (user) + +
+ + {appId} +
; +} \ No newline at end of file diff --git a/src/views/apps/app.css b/src/views/apps/app.css new file mode 100644 index 0000000..5a530bb --- /dev/null +++ b/src/views/apps/app.css @@ -0,0 +1,68 @@ +@reference "../../App.css"; + +.hero { + @apply min-w-full max-w-full lg:min-w-[58%] lg:max-w-[58%] xl:min-w-[65%] xl:max-w-[65%] lg:h-96 md:h-80 h-40 rounded-lg; + + @apply overflow-hidden flex p-6 relative; + align-items: flex-start; +} + +.hero div:nth-child(1) { + @apply absolute top-0 left-0 w-full h-80 lg:h-96 z-0 from-primary-foreground/70 to-primary-foreground/15 bg-linear-to-br; +} + +.hero div:nth-child(2) { + @apply relative z-1; + font-family: Arial, sans-serif; +} + +.hero h1 { + @apply text-xl sm:text-2xl md:text-3xl lg:text-4xl font-bold; +} + +.hero h2 { + @apply text-primary/60 text-lg; +} + +.hero button { + @apply hidden md:block relative overflow-hidden mt-12 rounded-xl bg-primary text-primary-foreground text-xl py-2 px-6 cursor-pointer transition-transform duration-200 ease-in-out backdrop-blur-md shadow-md; +} + +.hero button:hover { + @apply scale-105; + box-shadow: 0 0 24px color-mix(in oklab, var(--primary) 80%, transparent); +} + +.hero button:active { + @apply scale-90; +} + +.cards { + @apply max-h-full grid grid-cols-2 sm:grid-cols-4 lg:grid-cols-2 gap-5 w-full; +} + +.cards > div { + @apply w-[2fr] h-[1fr] min-h-24 rounded-lg lg:hover:translate-[-3px] cursor-pointer bg-accent-foreground/10 relative; +} + +.cards > div > div:nth-child(1) { + font-family: Arial, sans-serif; + @apply absolute z-0 w-full h-full left-0 top-0 rounded-lg; + @apply from-primary-foreground/10 hover:from-primary-foreground/0 via-primary-foreground/10 to-primary-foreground/40 bg-linear-to-br; + + @apply flex flex-col items-end justify-end p-2 px-4; + @apply text-xl md:text-muted font-bold; +} + +.cards > div:nth-child(1) { + @apply col-span-2 min-h-[1fr] max-h-[1fr]; +} + +.cards > div > img { + @apply rounded-lg h-full w-full; + object-fit: cover; +} + +.cards > div:hover { + box-shadow: 0 0 12px color-mix(in oklab, var(--primary) 50%, transparent); +} diff --git a/src/views/apps/appBox.tsx b/src/views/apps/appBox.tsx new file mode 100644 index 0000000..8e44cf2 --- /dev/null +++ b/src/views/apps/appBox.tsx @@ -0,0 +1,55 @@ +import { useEffect, useState } from "react" +import ShowSpinner from "../spinner"; +import type { AHQStoreApplication } from "@ahqstore/core-types"; +import { openApplicationState } from "@/data/implementations/appView"; +import { getAppWrapped } from "@/api/fetchApps"; +import { useInView } from "react-intersection-observer"; + +import "./app.css"; + +export function AppBox({ appId, set }: { appId: string, set: (_: number) => void }) { + const [application, setApp] = useState<"loading" | AHQStoreApplication>("loading") + const [img, setImg] = useState(undefined); + + const { ref, inView } = useInView({ + threshold: 0.1, + triggerOnce: true + }); + + useEffect(() => { + (async () => { + if (inView) { + try { + setApp("loading"); + + const [a, img] = await getAppWrapped(appId); + + setApp(a); + setImg(img); + } catch (e) { + console.warn(e); + } + } + })() + }, [appId, inView]); + + if (application == "loading" || img == undefined) { + return
{ + openApplicationState.data = appId; + set(10); + }}> + +
; + } + + return
{ + openApplicationState.data = appId; + set(10); + }}> + +
+

{application.appDisplayName}

+

{application.description || "Click to view more"}

+
+
+} \ No newline at end of file diff --git a/src/views/apps/apps.css b/src/views/apps/apps.css new file mode 100644 index 0000000..8043504 --- /dev/null +++ b/src/views/apps/apps.css @@ -0,0 +1,85 @@ +@reference "../../App.css"; + +.home_apps { + @apply flex flex-col w-full; +} + +.home_apps > div:nth-child(1) { + @apply w-full flex mt-2; + @apply text-xl font-semibold; + + font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; +} + +.home_apps_override > div:nth-child(1) { + @apply w-full flex text-center mt-2; + @apply text-xl font-semibold; + + font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; +} + +.home_apps > div:nth-child(1) > .arrow { + @apply hidden; +} + +.home_apps > div:nth-child(1) .all { + @apply ml-auto p-1 bg-accent/5 dark:bg-neutral-content/5 rounded-full cursor-pointer; +} + +.home_apps > div:nth-child(3) { + @apply grid gap-4 mt-2; + grid-template-columns: repeat(auto-fill, minmax(20rem, 1fr)) !important; +} + +.home_apps > div:nth-child(3) > div { + @apply break-inside-avoid rounded-xl p-4 cursor-pointer transition-all; + + @apply bg-accent/3 sm:bg-accent/15 dark:bg-neutral-content/3 dark:sm:bg-neutral-content/15 hover:dark:bg-neutral-content/10; + @apply h-24 sm:h-32; +} + +@media (min-width: 50rem) { + .home_apps > div:nth-child(1) { + @apply transition-all w-fit rounded-lg cursor-pointer flex items-center; + @apply hover:pl-3 hover:pr-3 pr-6 py-2; + + @apply text-xl font-semibold; + + font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; + } + + .home_apps > div:nth-child(1) > .arrow { + @apply block; + } + + .home_apps > div:nth-child(1) .all { + @apply hidden; + } + + .home_apps:not(.home_apps_override) > div:nth-child(1):hover { + color: color-mix( + in srgb, + var(--color-neutral-content) 5%, + var(--win32-accent) 75% + ) !important; + background: color-mix( + in srgb, + var(--color-neutral-content) 10%, + var(--win32-accent) 5% + ) !important; + } + + .home_apps > div:nth-child(3) > div { + @apply break-inside-avoid rounded-xl p-4 shadow-md cursor-pointer transition-all; + } + + .home_apps_override > div:nth-child(1), + .home_apps_override > div:nth-child(1):hover { + @apply transition-all w-fit rounded-lg cursor-default flex gap-3 items-center; + @apply hover:pl-0! hover:pr-0! pr-6 py-2; + + @apply text-xl font-semibold; + + font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; + } +} diff --git a/src/views/apps/index.tsx b/src/views/apps/index.tsx new file mode 100644 index 0000000..45f1421 --- /dev/null +++ b/src/views/apps/index.tsx @@ -0,0 +1,169 @@ +import { useHome, useSplash } from "@/lib/data"; +import { ArrowRight, Search } from "lucide-react"; + +import { ChevronRight } from "lucide-react"; +import { AppBox } from "./appBox"; +import { categoryView } from "@/data/implementations/catView"; +import { openApplicationState } from "@/data/implementations/appView"; +import { useMediaQuery } from "@/hooks/use-media-query"; +import { useRef } from "react"; +import { searchQueryData } from "@/data/implementations/searchData"; + +import "./apps.css" + +export function AppsHome({ set }: { set: (_: number) => void }) { + const splash = useSplash(); + const home = useHome(); + + const isTablet = useMediaQuery("(min-width: 50rem)"); + + const inputRef = useRef(null); + + return ( + <> +
+
+
+
{ + e.preventDefault(); + const val = inputRef.current!!.value; + + inputRef.current!!.value = ""; + + searchQueryData.data = val; + set(9); + }} + > + + + +
+
+ +
+ {splash && ( + <> +
+
{ + if (!isTablet) { + openApplicationState.data = splash.hero.appId; + set(10); + } + }} + > +
+
+

{splash.hero.title}

+

{splash.hero.description}

+ +
+ +
+ +

+ {splash.hero.author} +

+
+
+ +
+
{ + openApplicationState.data = splash.subhero.appId; + set(10); + }} + > +
+ {splash.subhero.title} +
+ +
+ +
{ + openApplicationState.data = splash.third.appId; + set(10); + }} + > +
+ {splash.third.title} +
+ +
+ +
{ + openApplicationState.data = splash.fourth.appId; + set(10); + }} + > +
+ {splash.fourth.title} +
+ +
+
+
+ + )} + + {home?.map((apps, index) => ( +
+
{ + if (isTablet) { + categoryView.data = index; + set(12); + } + }} + > + {apps[0]} + + +
+
+ {apps[1].length <= 1 ? `${apps[1].length} app` : `${apps[1].length} apps`} +
+
+ {apps[1].slice(0, 4).map((app) => ( + + ))} +
+
+ ))} +
+
+ + ); +} diff --git a/src/views/category/index.tsx b/src/views/category/index.tsx new file mode 100644 index 0000000..1f3e5ad --- /dev/null +++ b/src/views/category/index.tsx @@ -0,0 +1,39 @@ +import { useHome } from "@/lib/data"; +import { categoryView } from "@/data/implementations/catView"; + +import { AppBox } from "../apps/appBox"; +import { useStore } from "@/data/store"; +import BackButton from "@/components/backButton"; + +export function CategoryView({ set }: { set: (_: number) => void }) { + const home = useHome(); + + const index = useStore(categoryView); + + return ( + <> +
+ {[home!![index!!]]?.map((apps) => ( +
+
+ + + {apps[0]} +
+
+ Explore all of the {apps[1].length} apps +
+
+ {apps[1].slice(0, 4).map((app) => ( + + ))} +
+
+ ))} +
+ + ); +} diff --git a/src/views/deeplink.tsx b/src/views/deeplink.tsx new file mode 100644 index 0000000..0213cbd --- /dev/null +++ b/src/views/deeplink.tsx @@ -0,0 +1,169 @@ +import { getAppWrapped, getRepo } from "@/api/fetchApps"; +import { openApplicationState } from "@/data/implementations/appView"; +import { categoryView } from "@/data/implementations/catView"; +import { useHome } from "@/lib/data"; +import { + Dialog, + DialogTrigger, + DialogSurface, + DialogTitle, + DialogBody, + DialogContent, + DialogActions, + Button, + Card, + CardHeader, + Body1, + Caption1, +} from "@fluentui/react-components"; +import { useEffect, useState } from "react"; +import type { AHQStoreApplication } from "@ahqstore/core-types"; + +import { Check, BookMarked, SearchAlert } from "lucide-react" + +export interface DeepLinkMeta { + isOpen: boolean; + task: { + type: "app", + id: string + } | { + type: "category", + id: number; + }; +} + +export const close: DeepLinkMeta = { + isOpen: false, + task: { + type: "category", + id: 0 + } +}; + +interface Props { + meta: DeepLinkMeta; + setMeta: (_: DeepLinkMeta) => void; + set: (_: number) => void; +} + +export const DeepLink = ({ meta: { isOpen, task }, setMeta, set }: Props) => { + const home = useHome(); + + const [app, setApp] = useState<[AHQStoreApplication, string] | "unverified" | undefined>(); + + useEffect(() => { + if (task.type == "app") { + setApp(undefined); + + (async () => { + try { + setApp(await getAppWrapped(task.id)); + } catch (e) { + console.log(e); + setApp("unverified"); + } + })() + } + }, [task]); + + return ( + + {/* + <> + */} + + + Deep Link Triggered + + { + task.type == "category" && + <> +

+ A deep link has requested AHQ Store to navigate to home screen group named {home!![task.id][0]}. +

+ +

+ Would you like AHQ Store to acknowledge this interaction by performing the navigation action? +

+ + } + + { + task.type == "app" && + <> +

+ A deep link has requested AHQ Store to open application with id {task.id}. +

+ + {app === "unverified" && +

+ The application is non-existent. If you are experiencing such errors, it may be that someone is trying to hijack your AHQ Store experience by sending garbage data periodically. You should have a look at Task Manager or similar softwares to track the process or browser website trying to spam such invalid URLs. +

+ } + +
+ {app === undefined && } + + {app !== undefined && + + + {app == "unverified" ? : App Logo} + + } + header={ +
+ + {app == "unverified" ? "Unknown Application" : app[0].appDisplayName} + + {app != "unverified" && ( + app[0].verified ?
Verified
: +
{getRepo(app[0])}
+ ) + } +
+ + {task.id} +
+ } + /> + +
+ {app == "unverified" ? "This application does not exist in AHQ Store" : app[0].description} +
+
+ } +
+ +

+ Would you like AHQ Store to acknowledge this interaction by performing the navigation action? +

+ + } +
+ + + + + + + + +
+
+
+ ); +}; \ No newline at end of file diff --git a/src/views/developer/applyApp.tsx b/src/views/developer/applyApp.tsx new file mode 100644 index 0000000..210bed6 --- /dev/null +++ b/src/views/developer/applyApp.tsx @@ -0,0 +1,212 @@ +import { useEffect, useState } from "react"; +import ShowSpinner from "../spinner"; +import { Checkbox, Button, Input, DialogActions, Label } from "@fluentui/react-components"; +import { DatabaseRegular } from "@fluentui/react-icons"; + +import { open } from "tauri-plugin-ahqstore-api" +import { Separator } from "@/components/ui/separator"; +import { getAHQStoreManifest, verifyRepo } from "@/lib/auth/verification"; +import { applyForAppLaunch } from "@/lib/auth/apply"; + +export enum PageState { + Loading, + TOS, + Details, + Done +} + +export interface Repo { + author: string; + repo: string; +} + +export function ApplyForUpload() { + const [step, setStep] = useState(PageState.Loading); + + const [tos, setTos] = useState(false); + const [coc, setCoc] = useState(false); + + const [repo, setRepo] = useState(); + + const [err, setErr] = useState("Please fill the GitHub Repository"); + const [verified, setVerified] = useState(false); + const [manifest, setManifestUrl] = useState(""); + + useEffect(() => { + setTimeout(() => { + setStep(PageState.TOS); + }, 1000); + }, []); + + return
+
    +
  • = PageState.TOS ? "step-primary" : ""}`}>Review & Agree
  • +
  • = PageState.Details ? "step-primary" : ""}`}>Provide Details
  • +
  • = PageState.Done ? "step-primary" : ""}`}>Submitted
  • +
+ + {step == PageState.Loading && } + { + step == PageState.TOS && +
+

+ You're about to submit an application to the AHQ Store Community + Repository. We would like to remind you to check out our open("https://ahqstore.github.io/tos")}>Terms + of Service and open("https://ahqstore.github.io/privacy")}>Privacy Policy if you have not yet. Continuing means + that you are agreeing to both of them and hence you are being guided + by them. +

+

+ Since submitting an application also means contributing to our + repository, you must also agree to our open("https://github.com/ahqstore/client?tab=coc-ov-file#readme")}>code of conduct. +

+

+ You must also be aware that all the data is public and can be viewed by anyone. + This means that your account metadata, your application metadata, your icons will + be stored in our community repository and will remain public until requested for + deletion +

+

+ Transparency is the key to the best interaction. These notices ensure + a smooth and transparent conversation to ensure a long-lasting and thriving community. + We are not frightening you. Instead, we're empowering you with how we function +

+
+ setTos((t) => !t)} + label="Yes, I agree to the Disclaimer, Terms and Service and Privacy Policy" + /> + setCoc((t) => !t)} + label="I agree to the Code of Conduct" + /> +
+ + + +
+ } + + { + step == PageState.Details && + + <> +
+ + +

+ AHQ Store automatically fetches your ahqstore.json file from + your provided repository. You are supposed to set up + GitHub Releases and we'll automatically fetch + the data and create the app submission request +

+ +

+ If you have not yet set up your open sourced repository for AHQ Store Integration. + open("https://ahqstore.github.io/guide/integrate")}> Click here to set up +

+ +
+ + + + } + className="w-full" + disabled={err == "Verifying..." || verified} + onChange={(ev) => { + const input = ev.target.value; + + const splits = input.split("/"); + + if (splits.length == 2) { + const [author, repo] = splits; + + setErr(""); + setRepo({ + author, + repo + }); + } else { + setErr("Malformed Repository"); + } + }} + /> + + {err != "" &&
+ {err == "Verifying..." && } + {err} +
} +
+ + + {repo && !verified && } + + + + } + + {step == PageState.Done && <> +

+ Your request has been successfully submitted. A browser window will open shortly with + a GitHub issue. Please wait for any output from there patiently, or you can check for + the commits and see if your app metadata has been committed to the repository. +

+

+ Once committed, your app will slowly become available to users. You can restart your + computer to see the application in your AHQ Store application. +

+

+ Have a fabulous day ahead 👋! +

+
+ Tired of manually submitting apps and app updates? Learn to automate open("https://ahqstore.github.io/guide/automate")}>by clicking here +
+ } +
; +} \ No newline at end of file diff --git a/src/views/developer/applySelf.tsx b/src/views/developer/applySelf.tsx new file mode 100644 index 0000000..070c221 --- /dev/null +++ b/src/views/developer/applySelf.tsx @@ -0,0 +1,166 @@ +import { useEffect, useState } from "react"; +import ShowSpinner from "../spinner"; +import { Checkbox, Button, Input, DialogActions, Label } from "@fluentui/react-components"; +import { WindowDevEditFilled } from "@fluentui/react-icons"; + +import { open } from "tauri-plugin-ahqstore-api" +import { Separator } from "@/components/ui/separator"; + +import { applyAsDeveloper } from "@/lib/auth/apply"; + +export enum PageState { + Loading, + TOS, + Details, + Done +} + +export interface Repo { + author: string; + repo: string; +} + +export function ApplyAsDeveloper({ edit = false }: { edit?: boolean }) { + const [step, setStep] = useState(PageState.Loading); + + const [tos, setTos] = useState(false); + const [coc, setCoc] = useState(false); + + const [name, setName] = useState(""); + const [err, setErr] = useState("Please fill your new account name"); + + useEffect(() => { + setTimeout(() => { + if (!edit) { + setStep(PageState.TOS); + } else { + setStep(PageState.Details); + } + }, 1000); + }, []); + + return
+
    +
  • = PageState.TOS ? "step-primary" : ""}`}>Review & Agree
  • +
  • = PageState.Details ? "step-primary" : ""}`}>Provide Details
  • +
  • = PageState.Done ? "step-primary" : ""}`}>Submitted
  • +
+ + {step == PageState.Loading && } + { + step == PageState.TOS && +
+

+ You're about to apply for developer for the AHQ Store Community + Repository. We would like to remind you to check out our open("https://ahqstore.github.io/tos")}>Terms + of Service and open("https://ahqstore.github.io/privacy")}>Privacy Policy if you have not yet. Continuing means + that you are agreeing to both of them and hence you are being guided + by them. +

+

+ Since applying for developer also means contributing to our + repository, you must also agree to our open("https://github.com/ahqstore/client?tab=coc-ov-file#readme")}>code of conduct. +

+

+ You must also be aware that all the data is public and can be viewed by anyone. + This means that your account metadata, your application metadata, your avatar url will + be stored in our community repository and will remain public until requested for + deletion +

+

+ Transparency is the key to the best interaction. These notices ensure + a smooth and transparent conversation to ensure a long-lasting and thriving community. + We are not frightening you. Instead, we're empowering you with how we function +

+
+ setTos((t) => !t)} + label="Yes, I agree to the Disclaimer, Terms and Service and Privacy Policy" + /> + setCoc((t) => !t)} + label="I agree to the Code of Conduct" + /> +
+ + + +
+ } + + { + step == PageState.Details && + + <> +
+ + + + } + className="w-full" + minLength={5} + maxLength={64} + onChange={(ev) => { + const text = ev.target.value; + + if (text.length < 5) { + setErr("Too Small"); + } else if (text.length > 64) { + setErr("Too Long"); + } else { + setErr(""); + setName(text); + } + }} + /> + + {err != "" &&
+ {err} +
} +
+ + + + + + } + + {step == PageState.Done && <> +

+ Your request has been successfully submitted. A browser window will open shortly with + a GitHub issue. You can check the repository for the commits and see if your user metadata + has been committed to the repository. It will show that you have contributed to our repository. +

+

+ Once committed, your account metadata will slowly become available to all. You can restart + your computer to see the new Developer tab in your AHQ Store application. + Alternatively, you can open Settings page and click Refetch Data + if you see the commit in the repository. +

+

+ Have a fabulous day ahead 👋! +

+ } +
; +} \ No newline at end of file diff --git a/src/views/developer/index.tsx b/src/views/developer/index.tsx new file mode 100644 index 0000000..a3cb69c --- /dev/null +++ b/src/views/developer/index.tsx @@ -0,0 +1,133 @@ +import { Category } from "@/components/category"; +import { useAuth } from "@/lib/auth/provider"; +import { UserCircle2, PackageCheckIcon, PackagePlusIcon } from "lucide-react"; +import { useEffect, useState } from "react"; + +import { getDevData, getDevsApps, open } from "tauri-plugin-ahqstore-api" + +import type { DevData } from "@ahqstore/core-types"; +import { ConfigSelect } from "@/components/select"; + +import { Dialog, DialogSurface, DialogTitle } from "@fluentui/react-components" +import { generateGHUserHash } from "@/lib/auth/hash"; +import { ApplyForUpload } from "./applyApp"; + +export default function DeveloperPage() { + const auth = useAuth(); + + const [isOpen, setOpen] = useState(false); + const [dev, setDD] = useState(null); + const [apps, setDA] = useState(null); + const [ready, setReady] = useState(false); + + useEffect(() => { + (async () => { + if (auth) { + const devid = await generateGHUserHash(auth.login); + + // Correction for User Name + const devdata = await getDevData(devid); + + setDD(devdata); + + const apps = await getDevsApps(devid); + + if (apps[0] != "404: Not Found") { + setDA(apps); + } else { + setDA([]); + } + + setReady(true); + } + })() + }, [auth]); + + return ( + (ready && dev && apps && auth) ? <> +
+

Welcome, {dev?.name}

+ +
+ + + setOpen(false) + } + > + + Submit an AHQ Store Application + + + + + +
+ {/* Fields */} +
+ Developer Name + Developer ID + GitHub Username + GitHub Profile + Profile Picture +
+ + {/* Values */} +
+ {dev.name} + {dev.id} + {dev.github} + open(`https://github.com/${dev.github}`)} className="w-fit-content cursor-pointer underline">Open + open(dev.avatar_url || "")} className="rounded-full my-auto w-2 cursor-pointer" src={dev?.avatar_url || undefined} /> +
+
+
+ + +
+ {/* Fields */} +
+ Developer Name + Developer ID + GitHub Username +
+ + {/* Values */} +
+ {dev.name} + {dev.id} + {dev.github} +
+
+
+ + + setOpen(true) + } + > + + :
+ + Just a moment... +
+ ); +} diff --git a/src/views/disclaimer.tsx b/src/views/disclaimer.tsx new file mode 100644 index 0000000..9588352 --- /dev/null +++ b/src/views/disclaimer.tsx @@ -0,0 +1,62 @@ +import { + Dialog, + DialogTrigger, + DialogSurface, + DialogTitle, + DialogBody, + DialogContent, + DialogActions, + Button, +} from "@fluentui/react-components"; +import { useMemo } from "react"; + +import { open } from "tauri-plugin-ahqstore-api" + +export const Disclaimer = () => { + const isOpen = useMemo(() => { + return Date.now() >= Number(localStorage.getItem("expireAgreed") || "0") + }, []); + + return ( + { + // 30 days + localStorage.setItem("expireAgreed", String(Date.now() + 30 * 24 * 60 * 60 * 1000)); + }} + > + {/* + <> + */} + + + Please be informed + +

+ AHQ Store distributes applications from the sources such as + Winget, FDroid, AppImageHub, AHQStore Repo this means that + you should install the applications at your own discretion. + Even though AHQ Store explicitly scans application with Windows Defender + on Windows client, and uses ClamAV in its workflows during app submission. + We absolutely provide no guarantee and request your own discretion. +

+

+ Learn more about the security measures used by us open("https://ahqstore.github.io/security")}>here +

+

+ AHQ Store does not collect any data. No data is collected by + AHQ Store whatsoever. Logging into an account is absolutely not + necessary and not even required for the basic functionality with + a few exceptions (App Reporting, Issue Reporting) +

+
+ + + + + +
+
+
+ ); +}; diff --git a/src/views/lab/index.tsx b/src/views/lab/index.tsx new file mode 100644 index 0000000..d14a19a --- /dev/null +++ b/src/views/lab/index.tsx @@ -0,0 +1,76 @@ +import { Category } from "@/components/category"; +import { ConfigSelect } from "@/components/select"; +import { docs, setExperiment, useExperiments } from "@/lib/experiments"; +import { Button, Switch } from "@fluentui/react-components"; + +import { FlaskRound, ListRestart, ActivitySquareIcon } from "lucide-react"; + +export default function LabPage() { + const exp = useExperiments(); + const total = Object.entries(docs).length; + + return
+

Experiments

+ Each experiment may or may not end up in the release of AHQ Store + + + <> + + +
+ + { + localStorage.setItem("always-show-exp", String(data.checked)); + }} + /> + + + + + + + Configuration + + { + Object.entries(docs) + .map(([key, doc], index) => + + { + const checked = data.checked; + + // @ts-ignore + exp[key] = checked; + + setExperiment(exp) + }} + /> + + ) + } +
+
; +} \ No newline at end of file diff --git a/src/views/library/index.tsx b/src/views/library/index.tsx new file mode 100644 index 0000000..35eaca8 --- /dev/null +++ b/src/views/library/index.tsx @@ -0,0 +1,57 @@ +import { Category } from "@/components/category"; +import { ConfigSelect } from "@/components/select"; +import { Button } from "@/components/ui/button"; + +import { Repeat2, CheckCircle2, TriangleAlert, Package, PackageOpen } from "lucide-react" + +import { useState } from "react"; + +export default function LibraryPage() { + const [state, setState] = useState("done"); + + return <> +
+ + + + + +
+ +

Hold tight!

+
+
+ + +
+ +

Loading app list...

+
+
+
+ ; +} \ No newline at end of file diff --git a/src/views/loading/index.tsx b/src/views/loading/index.tsx deleted file mode 100644 index e69de29..0000000 diff --git a/src/views/nav.tsx b/src/views/nav.tsx new file mode 100644 index 0000000..fd0cc24 --- /dev/null +++ b/src/views/nav.tsx @@ -0,0 +1,65 @@ +import { ReactNode } from "react"; +import { items } from "./view"; + +function NavigationItem({ + name, + icon, + i, + iconFilled, + active, + id, + item, + setItem, +}: { + name: string; + id: number; + i: number; + icon: ReactNode; + iconFilled: ReactNode; + active?: number[]; + item: number; + setItem: (_: number) => void; +}) { + const isActive = id == item || (active && active.includes(item)); + + return ( +
setItem(id)} + > +
+
+ {isActive ? iconFilled : icon} + {!isActive && {name}} +
+
+ ); +} + +export default function NavigationSidebar({ + item, + setItem, +}: { + item: number; + setItem: (_: number) => void; +}) { + return ( + <> + {items + .filter((s) => !(s.hidden && s.hidden())) + .map((s, i) => ( + + ))} + + ); +} diff --git a/src/views/parser.ts b/src/views/parser.ts new file mode 100644 index 0000000..01212d0 --- /dev/null +++ b/src/views/parser.ts @@ -0,0 +1,58 @@ +import { toast } from "sonner"; +import { DeepLinkMeta } from "./deeplink"; + +import { getHomeRef } from "@/lib/data"; + +const regexp = /^ahqstore:\/\/(?:(?app|category)\/(?[a-zA-Z0-9:.]+))$/; + +let lastToastTime = 0; +const TOAST_COOLDOWN = 2000; // 2 seconds + +function showSecureToast(message: string, description: string) { + const now = Date.now(); + + if (now - lastToastTime > TOAST_COOLDOWN) { + toast.error(message, { description }); + lastToastTime = now; + } +} + +export function matchParseDeepLink(data: string): DeepLinkMeta | null { + const out = data.match(regexp); + + if (!out || !out.groups) { + showSecureToast("Invalid Deep Link", "A deep link from an application was created with completely invalid and garbage data. ERR_INVALID_DEEPLINK_SCHEMA"); + + return null; + } + + const { id, type } = out.groups; + + if (type == "app") { + return { + isOpen: true, + task: { + type: "app", + id + } + }; + } else { + const num = parseInt(id, 10); + + const home = getHomeRef(); + + if (!isNaN(num) && num.toString() === id && home && num >= 0 && num < home.length) { + return { + isOpen: true, + task: { + type: "category", + id: num + } + } + } else { + showSecureToast("Invalid Deep Link", "A deep link from an application was created with invalid navigation data. ERR_INVALID_GROUP_ID"); + + return null; + } + } +} \ No newline at end of file diff --git a/src-plugin/android/.gradle/vcs-1/gc.properties b/src/views/plugins/index.css similarity index 100% rename from src-plugin/android/.gradle/vcs-1/gc.properties rename to src/views/plugins/index.css diff --git a/src/views/plugins/index.tsx b/src/views/plugins/index.tsx new file mode 100644 index 0000000..94b449b --- /dev/null +++ b/src/views/plugins/index.tsx @@ -0,0 +1,101 @@ +import { base, genUniquePluginId } from "@/api/plugin"; +import { Category } from "@/components/category"; +import { Input, Button } from "@fluentui/react-components"; +import { PlugZapIcon, Zap } from "lucide-react"; +import { toast } from "sonner"; +import { Plugin } from "./plugin"; +import { useMemo } from "react"; +import { AStorePluginManager } from "@/api/plugin/mgnt"; + +export default function PluginPage() { + // useEffect(() => { + // invoke("open_plugin", { + // plugin: "1", + // title: "AHQ Store Test", + // settings: true + // }); + // }, []); + + const plugins = useMemo(() => [...AStorePluginManager.getInstance().uiPlugins.keys()], []); + + const column1Plugins = plugins.filter((_, index) => index % 2 === 0); // 0, 2, 4... + const column2Plugins = plugins.filter((_, index) => index % 2 !== 0); // 1, 3, 5... + + return <> +
+

Plugins

+ This page lists the plugins that are enabled + +
+
+ + Danger +
+
+ Plugins are run in a sandboxed environment but they can have a lot of capabilities including HTTP, AppInstallation Provider. Only install plugins that you trust. + Apart from that, plugins can also hang up your system causing instabilities. + Learn more about plugin architecture and developer guides open("https://ahqstore.github.io/guide/plugins")}>by clicking here +
+
+ + +
{ + e.preventDefault(); + + const put: HTMLInputElement = document.getElementById("anInput")!! as any; + + put.disabled = true; + const path = put.value; + + (async () => { + const data = `${genUniquePluginId()}}::{${path}`; + + const val = await fetch(`${base}/inst/${data}`).then((d) => d.text()); + + if (val == "NOK") { + toast("Something went wrong while installating the plugin..."); + } else { + window.location.reload(); + } + + put.disabled = false; + })() + }} + className="flex w-full" + > + + +
+
+ +

Installed Plugins

+ All the plugins are listed here + +
+
+ {column1Plugins.map((id) => )} +
+ +
+ {column2Plugins.map((id) => )} +
+
+ + {/*
+ {plugins.map((id) => )} +
*/} +
+ ; +} \ No newline at end of file diff --git a/src/views/plugins/plugin.tsx b/src/views/plugins/plugin.tsx new file mode 100644 index 0000000..6ddca25 --- /dev/null +++ b/src/views/plugins/plugin.tsx @@ -0,0 +1,87 @@ +import { AStorePluginManager, PluginFlags } from "@/api/plugin/mgnt"; +import { Category } from "@/components/category" +import { Button } from "@/components/ui/button"; +import { Switch } from "@fluentui/react-components"; +import { invoke } from "@tauri-apps/api/core"; +import { Puzzle, Settings, ExternalLink, AlertTriangle } from "lucide-react" + +import { useMemo } from "react"; + +export interface PluginProps { + id: string; +} +export function Plugin({ id }: PluginProps) { + const { displayName, flags } = useMemo(() => AStorePluginManager.getInstance().uiPlugins.get(id)!!, [id]); + const worker = useMemo(() => AStorePluginManager.getInstance().workerPlugins.get(id), [id]); + + const isWorker = flags.has(PluginFlags.WorkerPlugin); + + return + + + {isWorker && + { + let val = JSON.parse(localStorage.getItem("enabled-plugins")!!) as string[]; + + if (data.checked) { + val.push(id); + } else { + val = val.filter((x) => x != id); + } + + localStorage.setItem("enabled-plugins", JSON.stringify(val)); + window.location.reload(); + }} + />} +
+ + } + normallyOpen + forceOpen + openable + // pointer={flags.has(PluginFlags.PluginUI)} + > +
+ {isWorker &&
+ + + + {worker != null ? "Enabled worker plugin" : "This worker plugin is disabled."} + +
} + + +
+ +} \ No newline at end of file diff --git a/src/views/search/Desktop.tsx b/src/views/search/Desktop.tsx new file mode 100644 index 0000000..9dbb6f6 --- /dev/null +++ b/src/views/search/Desktop.tsx @@ -0,0 +1,80 @@ +import { getAppWrapped } from "@/api/fetchApps"; +import { openApplicationState } from "@/data/implementations/appView"; +import { memo, useEffect, useState } from "react"; + +import { useInView } from "react-intersection-observer"; +import type { AHQStoreApplication } from "@ahqstore/core-types"; +import { getAppAsset } from "src-plugin/dist-js"; + +export interface PanelProps { + appId: string; + set: (_: number) => void; +} + +const DesktopVerticalPanel = memo(function DesktopVerticalPanel({ appId, set }: PanelProps) { + const { ref, inView } = useInView({ + threshold: 0, + triggerOnce: true + }); + + const [[app, icon], setApp] = useState<[AHQStoreApplication, string] | [undefined, undefined]>([undefined, undefined]); + + const [image, setImage] = useState("loading"); + + const launch = () => { + openApplicationState.data = appId; + set(10); + }; + + useEffect(() => { + if (inView) { + (async () => { + const [app, icon] = await getAppWrapped(appId); + + if (app.displayImages.length != 0) { + const iconId = app.displayImages[0]; + + const img = await getAppAsset(appId, iconId.toString()); + const blob = new Blob([img as unknown as any]); + + let uri = URL.createObjectURL(blob); + if (appId.startsWith("f:")) { + const data = await fetch(await blob.text()) + const b = await data.blob(); + + uri = URL.createObjectURL(b); + } + + setImage(uri); + } else { + setImage("null"); + } + + setApp([app, icon]); + })(); + } + }, [inView]); + + if (app == undefined) { + return
+ +
+ } + + return
launch()}> +
+ +
+

{app.appDisplayName}

+ {image != "null" &&

{app.description || "Click to view more"}

} +
+
+ + {image == "null" &&
+ {app.description || "Click to view more"} +
} + {image != "null" && } +
+}); + +export default DesktopVerticalPanel; \ No newline at end of file diff --git a/src/views/search/Mobile.tsx b/src/views/search/Mobile.tsx new file mode 100644 index 0000000..abc225f --- /dev/null +++ b/src/views/search/Mobile.tsx @@ -0,0 +1,51 @@ +import { getAppWrapped } from "@/api/fetchApps"; +import { openApplicationState } from "@/data/implementations/appView"; +import { memo, useEffect, useState } from "react"; + +import { useInView } from "react-intersection-observer"; +import type { AHQStoreApplication } from "@ahqstore/core-types"; + +export interface PanelProps { + appId: string; + set: (_: number) => void; +} + +const MobileVerticalPanel = memo(function MobileVerticalPanel({ appId, set }: PanelProps) { + const { ref, inView } = useInView({ + threshold: 0, + triggerOnce: true + }); + + const [[app, icon], setApp] = useState<[AHQStoreApplication, string] | [undefined, undefined]>([undefined, undefined]); + + const launch = () => { + openApplicationState.data = appId; + set(10); + }; + + useEffect(() => { + if (inView) { + (async () => { + const [app, icon] = await getAppWrapped(appId); + + setApp([app, icon]); + })(); + } + }, [inView]); + + if (app == undefined) { + return
+ +
+ } + + return
launch()}> + +
+

{app.appDisplayName}

+

{app.description || "Click to view more"}

+
+
; +}); + +export default MobileVerticalPanel; \ No newline at end of file diff --git a/src/views/search/index.tsx b/src/views/search/index.tsx new file mode 100644 index 0000000..601061d --- /dev/null +++ b/src/views/search/index.tsx @@ -0,0 +1,86 @@ +import BackButton from "@/components/backButton"; +import { searchQueryData } from "@/data/implementations/searchData"; +import { useStore } from "@/data/store"; +import { useMediaQuery } from "@/hooks/use-media-query"; +import { Search } from "lucide-react"; +import { useEffect, useRef, useState } from "react"; +import { search } from "src-plugin/dist-js"; + +import ShowSpinner from "../spinner"; +import DesktopVerticalPanel from "./Desktop"; +import MobileVerticalPanel from "./Mobile"; + +import "./search.css"; + +export default function SearchInterface({ set }: { set: (_: number) => void }) { + const value = useStore(searchQueryData); + + const isTablet = useMediaQuery("(min-width: 50rem)"); + + const inputRef = useRef(null); + + const [searchData, setSearchState] = useState<"loading" | string[]>("loading"); + + useEffect(() => { + (async () => { + if (value) { + setSearchState("loading"); + + console.log("Searching"); + setSearchState(await search(value)); + } + })() + }, [value]); + + return
+
+ + +
+
{ + e.preventDefault(); + + const val = inputRef.current!!.value; + + searchQueryData.data = val; + }} + > + + + +
+ +
+
+ +
+ {searchData == "loading" ? +
+ +
+ : +
+

"{value?.substring(0, isTablet ? 30 : 10).trim()}{(value?.length || 0) > (isTablet ? 30 : 10) ? "..." : ""}"

+

{searchData.length} results

+ +
+ {searchData.map((appId) => ( + isTablet ? + + : + + ))} +
+
+ } +
+
; +} \ No newline at end of file diff --git a/src/views/search/search.css b/src/views/search/search.css new file mode 100644 index 0000000..589d556 --- /dev/null +++ b/src/views/search/search.css @@ -0,0 +1,27 @@ +@reference "../../App.css"; + +/* Mobile Version */ +/* TODO: Make it better */ + +.search-results { + @apply grid gap-2 md:gap-4 mb-32 grid-cols-1; +} + +.search-results > div { + @apply w-full h-24 flex flex-col cursor-pointer rounded-xl p-4; + @apply bg-accent/3 sm:bg-accent/15 dark:bg-neutral-content/3 dark:sm:bg-neutral-content/15 hover:dark:bg-neutral-content/10; +} + +@media (min-width: 800px) { + .search-results { + @apply gap-8; + grid-template-columns: repeat(auto-fill, minmax(20rem, 1fr)) !important; + } + + .search-results > div { + @apply break-inside-avoid rounded-xl p-4 cursor-pointer transition-all; + + @apply bg-accent/3 sm:bg-accent/15 dark:bg-neutral-content/3 dark:sm:bg-neutral-content/15 hover:dark:bg-neutral-content/10; + @apply h-64; + } +} diff --git a/src/views/settings/index.tsx b/src/views/settings/index.tsx new file mode 100644 index 0000000..21f60c5 --- /dev/null +++ b/src/views/settings/index.tsx @@ -0,0 +1,160 @@ +import { ConfigSelect } from "@/components/select"; +import { Label, Switch } from "@fluentui/react-components"; + +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select" + +import { ZoomIn, Aperture, Moon, Sparkles, DatabaseBackup } from "lucide-react"; + +import { useContext, useEffect, useMemo, useState } from "react"; + +import { disable, enable, isEnabled } from "@tauri-apps/plugin-autostart" +import { platform } from "@tauri-apps/plugin-os"; + +import { setScale, refreshCommit } from "tauri-plugin-ahqstore-api" +import { setUITheme, ThemeContext, VibrantWindows } from "@/lib"; +import { Separator } from "@/components/ui/separator"; +import { Category } from "@/components/category"; + +export default function Settings() { + const pc = useMemo(() => platform() != "android", []); + const defaultZoom = useMemo(() => localStorage.getItem("defZoom") || "1", []); + + const [autostart, setAutoStart] = useState(null); + + const loadAutostart = async () => { + setAutoStart(await isEnabled()); + }; + + // Init + useEffect(() => { + (async () => { + if (pc) { + await loadAutostart(); + } + })() + }, []); + + return <> +
+ + { + const checked = data.checked; + + setUITheme(checked); + }} + /> + + + { + useContext(VibrantWindows) && + + + + } + + {pc && + + } + + {/* Autostart is PC only setting */} + {pc && + {autostart == null ? + + : + { + const checked = data.checked; + + // Now it'll be set + if (checked) { + await enable() + } else { + await disable(); + } + + loadAutostart(); + }} + /> + } + } + + + + + + { + (async () => { + await refreshCommit(); + window.location.reload(); + })() + }} + > + + + + + + + ; + } as any} + > + <> + +
+ ; +} \ No newline at end of file diff --git a/src/views/spinner.tsx b/src/views/spinner.tsx index faa24d2..8731650 100644 --- a/src/views/spinner.tsx +++ b/src/views/spinner.tsx @@ -1,8 +1,8 @@ export default function ShowSpinner() { return (
- + {/* Almost There */}
); -} \ No newline at end of file +} diff --git a/src/views/view.css b/src/views/view.css new file mode 100644 index 0000000..07037d6 --- /dev/null +++ b/src/views/view.css @@ -0,0 +1,18 @@ +@layer utilities { + .nav_item { + @apply hover:bg-accent/10 hover:dark:bg-neutral-content/10 gap-1; + } + + .nav_item svg { + @apply size-6; + } + + .act_nav_item { + @apply shadow-lg; + background: color-mix( + in srgb, + var(--color-neutral-content) 10%, + var(--win32-accent) 5% + ) !important; + } +} diff --git a/src/views/view.tsx b/src/views/view.tsx new file mode 100644 index 0000000..8b5708f --- /dev/null +++ b/src/views/view.tsx @@ -0,0 +1,331 @@ +import { useMediaQuery } from "@/hooks/use-media-query"; + +import { + AppsRegular, + AppsFilled, + SettingsRegular, + SettingsFilled, + // @ts-ignore + PersonRegular, + // @ts-ignore + PersonFilled, + LibraryRegular, + LibraryFilled, + WindowDevToolsFilled, + WindowDevToolsRegular, + ToolboxRegular, + ToolboxFilled, + PlugConnectedSettingsRegular, + PlugConnectedSettingsFilled +} from "@fluentui/react-icons"; + +import { platform } from "@tauri-apps/plugin-os"; + +import { getCurrent, onOpenUrl } from "@tauri-apps/plugin-deep-link"; + +import { + Library, + LayoutGrid, + Settings, + // @ts-ignore + User, + LibraryBig, + Code2Icon, +} from "lucide-react"; + +import NavigationSidebar from "./nav"; + +import { JSX, useEffect, useMemo, useState } from "react"; +import { useExperiment } from "@/lib/experiment"; +import { useAuth } from "@/lib/auth/provider"; + +import { AppsHome } from "./apps"; + +import SettingsPage from "./settings"; +import LibraryPage from "./library"; +import DeveloperPage from "./developer"; +import LabPage from "./lab"; +import { Disclaimer } from "./disclaimer"; +import Application from "./app"; +import SearchInterface from "./search"; +import { useExperiments } from "@/lib/experiments"; +import PluginPage from "./plugins"; +import { CategoryView } from "./category"; +import { UnlistenFn } from "@tauri-apps/api/event"; + +import { close, DeepLink, DeepLinkMeta } from "./deeplink"; +import { matchParseDeepLink } from "./parser"; + +export const items: { + name: string; + id: number; + icon: JSX.Element; + iconFilled: JSX.Element; + iconMobile: JSX.Element; + iconMobileFilled: JSX.Element; + active?: number[]; + hidden?: () => boolean; +}[] = [ + { + name: "Apps", + id: 0, + icon: , + iconFilled: ( + + ), + active: [9, 10, 11, 12], + iconMobile: , + iconMobileFilled: , + }, + { + name: "Library", + id: 1, + icon: , + iconFilled: ( + + ), + iconMobile: , + iconMobileFilled: , + }, + // { + // name: "Profile", + // id: 2, + // hidden: () => platform() != "android", + // icon: , + // iconFilled: ( + // + // ), + // iconMobile: , + // iconMobileFilled: , + // }, + { + name: "Plugins", + id: 800, + hidden: () => (platform() == "android") || (useExperiments().plugins != true), + icon: , + iconFilled: ( + + ), + iconMobile: , + iconMobileFilled: , + }, + { + name: "Developer", + id: 3, + hidden: () => !(useAuth()?.dev || false), + icon: , + iconFilled: ( + + ), + iconMobile: , + iconMobileFilled: , + }, + { + name: "Lab", + id: 6, + hidden: () => !useExperiment(), + icon: , + iconFilled: ( + + ), + iconMobile: , + iconMobileFilled: , + }, + { + name: "Settings", + id: 8, + icon: , + iconFilled: ( + + ), + iconMobile: , + iconMobileFilled: , + }, + ]; + +export function ApplicationView() { + const [item, setItem] = useState(0); + const [mTop, setmtop] = useState(0); + const [mBot, setmBot] = useState(0); + + const [meta, setMeta] = useState(close); + + // const itemRef = useRef(item); + + // useEffect(() => { + // itemRef.current = item; + // }, [item]); + + useEffect(() => { + let unlisten: UnlistenFn | undefined; + + const hwnd = (path: string) => { + const data = matchParseDeepLink(path); + + if (data) setMeta(data); + }; + + (async () => { + const current = await getCurrent(); + + if (current && current.length >= 1) { + const path = current[0]; + hwnd(path); + } + + unlisten = await onOpenUrl((urls) => { + if (urls.length >= 1) { + const path = urls[0]; + hwnd(path); + } + }); + })() + + return (() => { + if (unlisten) unlisten(); + }); + }, []); + + const desktop = useMediaQuery("(min-width: 640px)"); + + const ui = useMemo(() => , [item, setItem]); + + const setMargins = () => { + // @ts-expect-error This is a custom fed data + if (window.topMargin) { + // @ts-expect-error This is a custom fed data + setmtop(window.topMargin); + // @ts-expect-error This is a custom fed data + setmBot(window.bottomMargin); + } + }; + + useEffect(() => { + setMargins(); + setInterval(() => { setMargins() }, 5000); + }, []); + + if (desktop) { + return ( +
+
+ +
+ + + + +
+ {ui} +
+
+ ); + } + + return ( +
+ + + +
+ {ui} +
+ +
+ ); +} + +interface Props { + item: number; + setItem: React.Dispatch>; +} + +function GetJsx({ item, setItem }: Props) { + switch (item) { + case 0: + return setItem(s)} />; + case 1: + return ; + case 2: + return <>Profile; + case 3: + return ; + case 6: + return ; + case 8: + return ; + case 9: + // Search + return ; + case 10: + // AppList + return ; + case 11: + // DevInfo + return ; + case 12: + // CategoryView + return + case 800: + return + default: + return <>Not Found; + } +} + +function BottomNavigation({ + item, + setItem, +}: { + item: number; + setItem: (_: number) => void; +}) { + return ( +
+ {items + .filter((s) => !(s.hidden && s.hidden())) + .map((s) => { + const isActive = s.id == item || (s.active && s.active.includes(item)); + + return + }) + } +
+ ); +} diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts index 11f02fe..b0ac762 100644 --- a/src/vite-env.d.ts +++ b/src/vite-env.d.ts @@ -1 +1 @@ -/// +/// diff --git a/update.ps1 b/update.ps1 index 7a498c9..16a3105 100644 --- a/update.ps1 +++ b/update.ps1 @@ -1,3 +1,9 @@ +pnpm up -L + +cd src-ahqstore-types +pnpm up -L +cd .. + $dirs = Get-ChildItem -Attributes Directory -Filter src-* foreach ($dir in $dirs) { diff --git a/vite.config.ts b/vite.config.ts deleted file mode 100644 index df4c9fb..0000000 --- a/vite.config.ts +++ /dev/null @@ -1,38 +0,0 @@ -import path from "path" -import { defineConfig } from "vite"; -import react from "@vitejs/plugin-react"; - -const host = process.env.TAURI_DEV_HOST; - -// https://vitejs.dev/config/ -export default defineConfig(async () => ({ - plugins: [react()], - - // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` - // - // 1. prevent vite from obscuring rust errors - clearScreen: false, - // 2. tauri expects a fixed port, fail if that port is not available - server: { - port: 1420, - strictPort: true, - host: host || false, - hmr: host - ? { - protocol: "ws", - host, - port: 1421, - } - : undefined, - watch: { - // 3. tell vite to ignore watching `src-tauri` - ignored: ["**/src-tauri/**"], - }, - }, - resolve: { - alias: { - "@": path.resolve(__dirname, "./src"), - "@controls": path.resolve(__dirname, "./src/controls"), - }, - }, -}));