diff --git a/.prettierignore b/.prettierignore index 209260b..ab1293b 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,4 +2,6 @@ dist node_modules src-tauri/target src-tauri/gen -pnpm-lock.yaml \ No newline at end of file +pnpm-lock.yaml + +.github/* \ No newline at end of file diff --git a/Contributing.md b/Contributing.md index c6e38f5..159d2a1 100644 --- a/Contributing.md +++ b/Contributing.md @@ -2,17 +2,18 @@ Thank you for your interest in contributing to CommDesk. -***CommDesk*** is a desktop platform for *communities*, *clubs*, *organizations*, and *event teams*. Contributions that improve *usability*, *reliability*, *documentation*, *maintainability*, and *developer experience* are welcome. +**_CommDesk_** is a desktop platform for _communities_, _clubs_, _organizations_, and _event teams_. Contributions that improve _usability_, _reliability_, _documentation_, _maintainability_, and _developer experience_ are welcome. ## Before You Start Before making changes, please review the **existing documentation** and **project structure** to understand the current scope of the repository. This repository includes: -- A *React* + *TypeScript* **frontend** -- A *Tauri* **desktop application** layer -- A *Rust* backend under `src-tauri` -- *Documentation* for project scope, implementation status, and release flow + +- A _React_ + _TypeScript_ **frontend** +- A _Tauri_ **desktop application** layer +- A _Rust_ backend under `src-tauri` +- _Documentation_ for project scope, implementation status, and release flow ## Prerequisites @@ -23,7 +24,7 @@ To work on this project, you should have the following installed: - **Rust stable** (`rustup`, `cargo`) - The platform-specific dependencies required by **Tauri** -For *Linux*, *macOS*, and *Windows*, please ensure the appropriate system dependencies are installed before building the project. +For _Linux_, _macOS_, and _Windows_, please ensure the appropriate system dependencies are installed before building the project. ## Getting Started @@ -40,7 +41,7 @@ For *Linux*, *macOS*, and *Windows*, please ensure the appropriate system depend git clone https://github.com/NexGenStudioDev/CommDesk.git cd CommDesk pnpm install -```` +``` ### Run the Application @@ -58,33 +59,33 @@ pnpm dev ## Branch Naming -Use a *descriptive branch name* for your work. +Use a _descriptive branch name_ for your work. Recommended formats: -* `feature/` -* `fix/` -* `docs/` -* `refactor/` +- `feature/` +- `fix/` +- `docs/` +- `refactor/` Examples: -* `feature/member-search` -* `fix/login-error` -* `docs/update-readme` +- `feature/member-search` +- `fix/login-error` +- `docs/update-readme` ## Coding Standards -Please follow the existing *code style* and *project conventions*. +Please follow the existing _code style_ and _project conventions_. General expectations: -* Keep changes focused and minimal -* Write clear, readable, and maintainable code -* Follow the current folder structure and architecture -* Avoid introducing unnecessary dependencies -* Prefer small, reusable components and functions -* Keep frontend and backend changes consistent with the existing design +- Keep changes focused and minimal +- Write clear, readable, and maintainable code +- Follow the current folder structure and architecture +- Avoid introducing unnecessary dependencies +- Prefer small, reusable components and functions +- Keep frontend and backend changes consistent with the existing design Before submitting, format and lint your code where applicable. @@ -94,10 +95,10 @@ All contributions should be tested locally before submission. At minimum, verify: -* The application starts successfully -* The change works as intended -* Existing functionality is not broken -* The project passes linting and build checks where relevant +- The application starts successfully +- The change works as intended +- Existing functionality is not broken +- The project passes linting and build checks where relevant Useful commands: @@ -113,34 +114,34 @@ If your contribution affects desktop packaging or Rust functionality, test the r Before opening a new issue: -* Search existing issues to avoid duplicates -* Use a clear and descriptive title -* Include steps to reproduce the problem -* Add screenshots, logs, or environment details when relevant +- Search existing issues to avoid duplicates +- Use a clear and descriptive title +- Include steps to reproduce the problem +- Add screenshots, logs, or environment details when relevant A good bug report should explain: -* What you expected to happen -* What actually happened -* How to reproduce the issue -* Which platform and version you used +- What you expected to happen +- What actually happened +- How to reproduce the issue +- Which platform and version you used ## Pull Request Guidelines When opening a pull request, please ensure that: -* The pull request has a clear title -* The description explains what was changed and why -* Related issues are linked when applicable -* The changes are limited to a single purpose where possible -* The branch is up to date with the target branch before submission +- The pull request has a clear title +- The description explains what was changed and why +- Related issues are linked when applicable +- The changes are limited to a single purpose where possible +- The branch is up to date with the target branch before submission A strong pull request should include: -* A short summary of the change -* Screenshots or recordings for UI updates -* Testing notes -* Any relevant context for reviewers +- A short summary of the change +- Screenshots or recordings for UI updates +- Testing notes +- Any relevant context for reviewers ## Commit Messages @@ -148,10 +149,10 @@ Use concise and meaningful commit messages. Recommended style: -* `feat: add member search` -* `fix: resolve updater issue` -* `docs: improve contribution guide` -* `refactor: simplify event module` +- `feat: add member search` +- `fix: resolve updater issue` +- `docs: improve contribution guide` +- `refactor: simplify event module` ## Security and Secrets @@ -165,10 +166,10 @@ Please keep discussions respectful, constructive, and professional. Be considerate in: -* Issues -* Pull requests -* Code reviews -* Documentation discussions +- Issues +- Pull requests +- Code reviews +- Documentation discussions This project follows a [code of conduct](CODE_OF_CONDUCT.md). All contributors are expected to follow it. @@ -178,4 +179,4 @@ Maintainers may request changes before merging a pull request. Please respond to ## License -**By contributing to CommDesk, you agree that your contributions will be made under the same [License](LICENSE) as the project.** \ No newline at end of file +**By contributing to CommDesk, you agree that your contributions will be made under the same [License](LICENSE) as the project.** diff --git a/docs/AUTO_UPDATE_SETUP_GUIDE.md b/docs/AUTO_UPDATE_SETUP_GUIDE.md index 81e8ca2..d154703 100644 --- a/docs/AUTO_UPDATE_SETUP_GUIDE.md +++ b/docs/AUTO_UPDATE_SETUP_GUIDE.md @@ -1,4 +1,4 @@ -# 🚀 CommDesk Auto-Update System +# 🚀 CommDesk Auto-Update System # Enterprise-Grade Auto-Update Infrastructure for Tauri, Snap, Flathub, AppImage, Windows & macOS @@ -6,32 +6,31 @@ This document is the complete source of truth for implementing, deploying, secur It covers: -* Tauri auto-updater -* GitHub Releases integration -* Snap auto-updates -* Flathub auto-updates -* Release signing -* CI/CD automation -* Rollback systems -* Security verification -* Production deployment -* Monitoring & analytics -* Enterprise release workflows +- Tauri auto-updater +- GitHub Releases integration +- Snap auto-updates +- Flathub auto-updates +- Release signing +- CI/CD automation +- Rollback systems +- Security verification +- Production deployment +- Monitoring & analytics +- Enterprise release workflows Reference architecture and implementation details: - --- # 🧠 What Is Auto-Update? Auto-update allows CommDesk to: -* Detect new releases automatically -* Download updates securely -* Verify signatures -* Install updates safely -* Restart into the latest version +- Detect new releases automatically +- Download updates securely +- Verify signatures +- Install updates safely +- Restart into the latest version without requiring users to manually reinstall the app. @@ -93,11 +92,11 @@ Users Every update must be: -* Signed -* Verified -* Version validated -* Integrity checked -* Securely downloaded +- Signed +- Verified +- Version validated +- Integrity checked +- Securely downloaded --- @@ -262,11 +261,11 @@ latest.json This latest.json is responsible for telling the Tauri updater: -* what version is available -* what notes to show the user -* when the release was published -* which download URL to use for each platform -* which signature file to verify before installation +- what version is available +- what notes to show the user +- when the release was published +- which download URL to use for each platform +- which signature file to verify before installation Before publishing latest.json, also create the matching signature file for each build artifact: @@ -279,8 +278,6 @@ minisign -S \ The resulting .sig file must be uploaded with the release and its signature content must be referenced inside latest.json. - - --- # Example @@ -348,8 +345,7 @@ Restart app # React Example ```tsx id="jlwm8g" -const { shouldUpdate, manifest } = -await checkForUpdates(); +const { shouldUpdate, manifest } = await checkForUpdates(); if (shouldUpdate) { await installUpdate(); @@ -361,11 +357,11 @@ if (shouldUpdate) { # Recommended Features -* Update notification dialog -* Release notes -* Progress bar -* Retry support -* Restart button +- Update notification dialog +- Release notes +- Progress bar +- Retry support +- Restart button --- @@ -375,10 +371,10 @@ if (shouldUpdate) { Snapd automatically: -* Checks every few hours -* Downloads updates -* Installs safely -* Allows rollback +- Checks every few hours +- Downloads updates +- Installs safely +- Allows rollback --- @@ -394,7 +390,7 @@ sudo apt install snapcraft ```yaml id="jlwm5c" name: commdesk -version: '1.0.0' +version: "1.0.0" grade: stable confinement: strict @@ -547,12 +543,12 @@ User receives update GitHub Actions should: -* Build app -* Sign binaries -* Generate latest.json -* Upload GitHub release -* Upload Snap -* Build Flatpak +- Build app +- Sign binaries +- Generate latest.json +- Upload GitHub release +- Upload Snap +- Build Flatpak --- @@ -679,11 +675,11 @@ CommDesk.old.AppImage Track: -* Update success rate -* Failed installs -* Download stats -* Adoption rate -* Crash reports +- Update success rate +- Failed installs +- Download stats +- Adoption rate +- Crash reports --- @@ -691,7 +687,7 @@ Track: ```ts id="jlwm4y" trackUpdate("installed", { - version: "1.0.0" + version: "1.0.0", }); ``` @@ -739,22 +735,22 @@ trackUpdate("installed", { ## Before Release -* [ ] Version updated -* [ ] CHANGELOG updated -* [ ] Tests passing -* [ ] Binaries signed -* [ ] latest.json generated -* [ ] GitHub release ready +- [ ] Version updated +- [ ] CHANGELOG updated +- [ ] Tests passing +- [ ] Binaries signed +- [ ] latest.json generated +- [ ] GitHub release ready --- ## After Release -* [ ] GitHub release verified -* [ ] Snap uploaded -* [ ] Flathub updated -* [ ] Update notification tested -* [ ] Metrics monitored +- [ ] GitHub release verified +- [ ] Snap uploaded +- [ ] Flathub updated +- [ ] Update notification tested +- [ ] Metrics monitored --- @@ -764,10 +760,10 @@ trackUpdate("installed", { ## Causes -* Invalid latest.json -* Wrong signature -* Incorrect version format -* Broken URLs +- Invalid latest.json +- Wrong signature +- Incorrect version format +- Broken URLs --- @@ -818,4 +814,3 @@ Users Receive Secure Updates ``` --- - diff --git a/docs/FLATPAK_BUILD_GUIDE.md b/docs/FLATPAK_BUILD_GUIDE.md index 4121549..63ed913 100644 --- a/docs/FLATPAK_BUILD_GUIDE.md +++ b/docs/FLATPAK_BUILD_GUIDE.md @@ -4,29 +4,29 @@ CommDesk is designed as a modern large-scale desktop platform built using: -* Tauri -* Rust -* React -* TypeScript -* Vite +- Tauri +- Rust +- React +- TypeScript +- Vite This guide explains how to package, test, optimize, and distribute CommDesk for Linux using: -* Flatpak -* Snap -* AppImage -* Native Linux bundles -* Enterprise-grade release workflows +- Flatpak +- Snap +- AppImage +- Native Linux bundles +- Enterprise-grade release workflows --- # 📦 Supported Linux Distribution Formats -| Format | Best For | Sandbox | Auto Update | Store Support | -| -------- | ---------------------------- | -------- | ----------- | --------------- | -| Flatpak | Universal Linux Distribution | ✅ Strong | ✅ | Flathub | -| Snap | Ubuntu Ecosystem | ✅ Strong | ✅ | Snap Store | -| AppImage | Portable Distribution | ❌ | ❌ Manual | Direct Download | +| Format | Best For | Sandbox | Auto Update | Store Support | +| -------- | ---------------------------- | --------- | ----------- | --------------- | +| Flatpak | Universal Linux Distribution | ✅ Strong | ✅ | Flathub | +| Snap | Ubuntu Ecosystem | ✅ Strong | ✅ | Snap Store | +| AppImage | Portable Distribution | ❌ | ❌ Manual | Direct Download | | DEB | Debian/Ubuntu | ❌ | Manual/APT | Native | | RPM | Fedora/RHEL | ❌ | Manual/DNF | Native | @@ -40,11 +40,11 @@ This guide explains how to package, test, optimize, and distribute CommDesk for Best for: -* Security -* Sandboxing -* Enterprise deployment -* Cross-distro support -* Flathub visibility +- Security +- Sandboxing +- Enterprise deployment +- Cross-distro support +- Flathub visibility --- @@ -54,10 +54,10 @@ Best for: Best for: -* Portable usage -* No installation required -* Quick testing -* Offline environments +- Portable usage +- No installation required +- Quick testing +- Offline environments --- @@ -67,9 +67,9 @@ Best for: Best for: -* Ubuntu ecosystem -* Auto updates -* Canonical Store distribution +- Ubuntu ecosystem +- Auto updates +- Canonical Store distribution --- @@ -175,8 +175,8 @@ cargo --version Recommended: -* Node.js 20+ -* pnpm latest +- Node.js 20+ +- pnpm latest Install: @@ -210,11 +210,11 @@ commdesk/ Flatpak provides: -* Sandboxed execution -* Cross-distribution support -* Secure permissions -* Runtime dependency isolation -* Enterprise deployment compatibility +- Sandboxed execution +- Cross-distribution support +- Secure permissions +- Runtime dependency isolation +- Enterprise deployment compatibility --- @@ -271,11 +271,7 @@ org.commdesk.CommDesk.json { "name": "commdesk", "buildsystem": "simple", - "build-commands": [ - "pnpm install", - "pnpm build", - "cargo build --release" - ], + "build-commands": ["pnpm install", "pnpm build", "cargo build --release"], "sources": [ { "type": "dir", @@ -390,11 +386,11 @@ flatpak run org.commdesk.CommDesk Snap provides: -* Automatic updates -* Ubuntu ecosystem integration -* Canonical Store support -* Sandboxing -* Rollback support +- Automatic updates +- Ubuntu ecosystem integration +- Canonical Store support +- Sandboxing +- Rollback support --- @@ -421,7 +417,7 @@ mkdir snap ```yaml name: commdesk base: core24 -version: '1.0.0' +version: "1.0.0" summary: CommDesk Community Management Platform description: | CommDesk is a modern community and event management platform. @@ -484,10 +480,10 @@ snap run commdesk Best for: -* Portable distribution -* No installation -* Easy testing -* Direct downloads +- Portable distribution +- No installation +- Easy testing +- Direct downloads --- @@ -591,32 +587,32 @@ build: { # Build Validation -* [ ] TypeScript passes -* [ ] Rust build passes -* [ ] Flatpak launches -* [ ] Snap launches -* [ ] AppImage launches -* [ ] GPU acceleration works -* [ ] Network APIs work -* [ ] File system permissions work +- [ ] TypeScript passes +- [ ] Rust build passes +- [ ] Flatpak launches +- [ ] Snap launches +- [ ] AppImage launches +- [ ] GPU acceleration works +- [ ] Network APIs work +- [ ] File system permissions work --- # Security Validation -* [ ] Sandbox tested -* [ ] No unnecessary permissions -* [ ] Production env variables secured -* [ ] Secrets removed from frontend +- [ ] Sandbox tested +- [ ] No unnecessary permissions +- [ ] Production env variables secured +- [ ] Secrets removed from frontend --- # Performance Validation -* [ ] Cold start benchmark -* [ ] Memory profiling -* [ ] CPU usage profiling -* [ ] Large dataset rendering test +- [ ] Cold start benchmark +- [ ] Memory profiling +- [ ] CPU usage profiling +- [ ] Large dataset rendering test --- @@ -669,12 +665,12 @@ jobs: Ensure: -* App icons added -* Metadata complete -* Screenshots prepared -* License included -* Permissions minimized -* Stable builds verified +- App icons added +- Metadata complete +- Screenshots prepared +- License included +- Permissions minimized +- Stable builds verified --- @@ -682,11 +678,11 @@ Ensure: | Asset | Required | | ------------ | -------- | -| App Icon | ✅ | -| Screenshots | ✅ | -| AppData XML | ✅ | -| LICENSE | ✅ | -| Desktop File | ✅ | +| App Icon | ✅ | +| Screenshots | ✅ | +| AppData XML | ✅ | +| LICENSE | ✅ | +| Desktop File | ✅ | --- @@ -698,11 +694,11 @@ Ensure: # 📚 Useful Resources -* [Flatpak Documentation](https://docs.flatpak.org/?utm_source=chatgpt.com) -* [Snapcraft Docs](https://snapcraft.io/docs?utm_source=chatgpt.com) -* [Tauri Distribution Guide](https://tauri.app/distribute/?utm_source=chatgpt.com) -* [AppImage Docs](https://docs.appimage.org/?utm_source=chatgpt.com) -* [Flathub](https://flathub.org/?utm_source=chatgpt.com) +- [Flatpak Documentation](https://docs.flatpak.org/?utm_source=chatgpt.com) +- [Snapcraft Docs](https://snapcraft.io/docs?utm_source=chatgpt.com) +- [Tauri Distribution Guide](https://tauri.app/distribute/?utm_source=chatgpt.com) +- [AppImage Docs](https://docs.appimage.org/?utm_source=chatgpt.com) +- [Flathub](https://flathub.org/?utm_source=chatgpt.com) --- @@ -718,4 +714,3 @@ Ensure: | DEB/RPM | Enterprise | --- - diff --git a/docs/PRODUCTION_DEPLOYMENT.md b/docs/PRODUCTION_DEPLOYMENT.md index 296437e..103bd84 100644 --- a/docs/PRODUCTION_DEPLOYMENT.md +++ b/docs/PRODUCTION_DEPLOYMENT.md @@ -2,19 +2,18 @@ ## Overview - The goal is to transform CommDesk into a fully production-ready desktop platform capable of large-scale Linux distribution through: -* Flatpak -* Snap -* AppImage -* DEB -* RPM -* GitHub Releases -* Flathub -* Snap Store +- Flatpak +- Snap +- AppImage +- DEB +- RPM +- GitHub Releases +- Flathub +- Snap Store -Reference documentation: +Reference documentation: --- @@ -22,15 +21,15 @@ Reference documentation: ## Primary Goals -* Add professional Linux distribution support -* Introduce production deployment workflows -* Add enterprise-grade release architecture -* Standardize build systems -* Implement secure auto-update infrastructure -* Create scalable CI/CD pipelines -* Add cross-platform packaging strategy -* Improve release maintainability -* Prepare CommDesk for public distribution +- Add professional Linux distribution support +- Introduce production deployment workflows +- Add enterprise-grade release architecture +- Standardize build systems +- Implement secure auto-update infrastructure +- Create scalable CI/CD pipelines +- Add cross-platform packaging strategy +- Improve release maintainability +- Prepare CommDesk for public distribution --- @@ -38,27 +37,25 @@ Reference documentation: ## Linux -* Flatpak -* Snap -* AppImage -* DEB -* RPM +- Flatpak +- Snap +- AppImage +- DEB +- RPM ## Windows -* NSIS -* MSI -* Portable EXE +- NSIS +- MSI +- Portable EXE ## macOS -* DMG -* App Bundle +- DMG +- App Bundle --- - - # 🟦 Flatpak Infrastructure ## Add Flatpak Manifest @@ -71,13 +68,13 @@ org.commdesk.CommDesk.json ## Required Features -* Sandboxed runtime -* Flathub compatibility -* GPU acceleration support -* Network permissions -* Wayland + X11 support -* Rust SDK extensions -* Node.js SDK extensions +- Sandboxed runtime +- Flathub compatibility +- GPU acceleration support +- Network permissions +- Wayland + X11 support +- Rust SDK extensions +- Node.js SDK extensions --- @@ -107,11 +104,11 @@ snap/snapcraft.yaml ## Required Features -* Strict confinement -* Network permissions -* OpenGL support -* Wayland/X11 support -* Auto-update compatibility +- Strict confinement +- Network permissions +- OpenGL support +- Wayland/X11 support +- Auto-update compatibility --- @@ -139,12 +136,12 @@ src-tauri/target/release/bundle/appimage/ Implement: -* Tauri updater -* GitHub Releases integration -* Signed updates -* Release manifests -* Version verification -* Secure update validation +- Tauri updater +- GitHub Releases integration +- Signed updates +- Release manifests +- Version verification +- Secure update validation --- @@ -160,11 +157,11 @@ release.pub ## Required Features -* Silent background downloads -* Update notifications -* Signature verification -* Rollback safety -* Cross-platform updates +- Silent background downloads +- Update notifications +- Signature verification +- Rollback safety +- Cross-platform updates --- @@ -174,23 +171,23 @@ release.pub ### Linux -* Flatpak sandboxing -* Snap confinement -* Minimal filesystem access +- Flatpak sandboxing +- Snap confinement +- Minimal filesystem access ### Updates -* Minisign signatures -* Binary verification -* Release integrity validation +- Minisign signatures +- Binary verification +- Release integrity validation ### Windows -* Code signing support +- Code signing support ### macOS -* Apple notarization preparation +- Apple notarization preparation --- @@ -215,29 +212,29 @@ release.pub ### Validation -* TypeScript checks -* ESLint checks -* Rust checks -* Build verification -* Packaging verification +- TypeScript checks +- ESLint checks +- Rust checks +- Build verification +- Packaging verification ### Build Matrix -* Ubuntu -* Windows -* macOS +- Ubuntu +- Windows +- macOS ### Artifacts Upload: -* AppImage -* Flatpak bundle -* Snap package -* DEB -* RPM -* MSI -* DMG +- AppImage +- Flatpak bundle +- Snap package +- DEB +- RPM +- MSI +- DMG --- @@ -272,9 +269,9 @@ scripts/update-version.sh Capabilities: -* Update all version files -* Validate consistency -* Prevent release mismatch +- Update all version files +- Validate consistency +- Prevent release mismatch --- @@ -284,12 +281,12 @@ Capabilities: Required Sizes: -* 32x32 -* 64x64 -* 128x128 -* 256x256 -* ICO -* ICNS +- 32x32 +- 64x64 +- 128x128 +- 256x256 +- ICO +- ICNS --- @@ -306,9 +303,9 @@ src-tauri/icons/ Include: -* Logo generation workflow -* Export best practices -* Platform-specific icon requirements +- Logo generation workflow +- Export best practices +- Platform-specific icon requirements --- @@ -330,10 +327,10 @@ playwright ### Production Validation -* Flatpak sandbox tests -* AppImage runtime tests -* Snap permission tests -* Auto-update tests +- Flatpak sandbox tests +- AppImage runtime tests +- Snap permission tests +- Auto-update tests --- @@ -358,10 +355,10 @@ opt-level = "z" Add: -* Code splitting -* Lazy loading -* Vendor chunking -* Production minification +- Code splitting +- Lazy loading +- Vendor chunking +- Production minification --- @@ -371,14 +368,14 @@ Add: ### Crash Reporting -* Rust panic reporting -* Frontend error tracking +- Rust panic reporting +- Frontend error tracking ### Update Analytics -* Update adoption rate -* Failed update tracking -* Release stability metrics +- Update adoption rate +- Failed update tracking +- Release stability metrics --- @@ -386,14 +383,14 @@ Add: All deployment docs must include: -* Prerequisites -* Installation -* Build commands -* Release workflow -* Security recommendations -* Troubleshooting -* CI/CD examples -* Production best practices +- Prerequisites +- Installation +- Build commands +- Release workflow +- Security recommendations +- Troubleshooting +- CI/CD examples +- Production best practices --- @@ -401,11 +398,11 @@ All deployment docs must include: ## DO NOT -* Hardcode secrets -* Commit private signing keys -* Disable security checks -* Use unrestricted filesystem permissions -* Skip binary verification +- Hardcode secrets +- Commit private signing keys +- Disable security checks +- Use unrestricted filesystem permissions +- Skip binary verification --- @@ -413,37 +410,36 @@ All deployment docs must include: ## Packaging -* [ ] Flatpak builds successfully -* [ ] Snap builds successfully -* [ ] AppImage builds successfully -* [ ] DEB builds successfully -* [ ] RPM builds successfully +- [ ] Flatpak builds successfully +- [ ] Snap builds successfully +- [ ] AppImage builds successfully +- [ ] DEB builds successfully +- [ ] RPM builds successfully --- ## Security -* [ ] Auto-update signing works -* [ ] Signature verification works -* [ ] Sandboxing validated -* [ ] Minimal permissions enforced +- [ ] Auto-update signing works +- [ ] Signature verification works +- [ ] Sandboxing validated +- [ ] Minimal permissions enforced --- ## CI/CD -* [ ] Multi-platform builds work -* [ ] Release workflows automated -* [ ] Artifact uploads work -* [ ] Release tagging works +- [ ] Multi-platform builds work +- [ ] Release workflows automated +- [ ] Artifact uploads work +- [ ] Release tagging works --- ## Documentation -* [ ] Linux packaging docs completed -* [ ] Production deployment docs completed -* [ ] Auto-update docs completed -* [ ] Troubleshooting docs completed -* [ ] Release workflow documented - +- [ ] Linux packaging docs completed +- [ ] Production deployment docs completed +- [ ] Auto-update docs completed +- [ ] Troubleshooting docs completed +- [ ] Release workflow documented diff --git a/docs/TESTING_AND_QA.md b/docs/TESTING_AND_QA.md index 7f25638..6c14d70 100644 --- a/docs/TESTING_AND_QA.md +++ b/docs/TESTING_AND_QA.md @@ -4,7 +4,7 @@ This document defines the complete testing architecture, QA workflows, automation strategy, performance validation, security testing, and release validation system for CommDesk. -Reference guide: +Reference guide: --- @@ -12,20 +12,20 @@ Reference guide: CommDesk is a large-scale desktop application built using: -* React -* TypeScript -* Tauri -* Rust -* Vite +- React +- TypeScript +- Tauri +- Rust +- Vite The testing system must guarantee: -* Stability -* Scalability -* Security -* Performance -* Cross-platform reliability -* Release confidence +- Stability +- Scalability +- Security +- Performance +- Cross-platform reliability +- Release confidence --- @@ -113,9 +113,7 @@ describe("EventCard", () => { it("should render title", () => { render(); - expect( - screen.getByText("Hackathon 2026") - ).toBeInTheDocument(); + expect(screen.getByText("Hackathon 2026")).toBeInTheDocument(); }); }); ``` @@ -152,11 +150,11 @@ pnpm test --coverage Validate: -* API interaction -* State management -* React Query behavior -* IPC communication -* Feature coordination +- API interaction +- State management +- React Query behavior +- IPC communication +- Feature coordination --- @@ -168,9 +166,7 @@ describe("Dashboard Integration", () => { render(); await waitFor(() => { - expect( - screen.getByText("Event 1") - ).toBeInTheDocument(); + expect(screen.getByText("Event 1")).toBeInTheDocument(); }); }); }); @@ -218,9 +214,9 @@ playwright.config.ts # Required Browser Targets -* Chromium -* Firefox -* WebKit +- Chromium +- Firefox +- WebKit --- @@ -228,13 +224,13 @@ playwright.config.ts Validate: -* Authentication -* Navigation -* Event creation -* Community workflows -* Dashboard interaction -* Permissions -* Error handling +- Authentication +- Navigation +- Event creation +- Community workflows +- Dashboard interaction +- Permissions +- Error handling --- @@ -246,16 +242,11 @@ test("should create event", async ({ page }) => { await page.click("[data-testid='btn-create-event']"); - await page.fill( - "[data-testid='input-title']", - "Hackathon" - ); + await page.fill("[data-testid='input-title']", "Hackathon"); await page.click("[data-testid='btn-submit']"); - await expect( - page.locator("text=Hackathon") - ).toBeVisible(); + await expect(page.locator("text=Hackathon")).toBeVisible(); }); ``` @@ -353,12 +344,12 @@ journalctl --user \ # Required Validation -* Installer works -* Desktop shortcut created -* Start menu integration works -* Taskbar icon renders -* Auto-update works -* Uninstall works cleanly +- Installer works +- Desktop shortcut created +- Start menu integration works +- Taskbar icon renders +- Auto-update works +- Uninstall works cleanly --- @@ -374,11 +365,11 @@ pnpm tauri build --target x86_64-pc-windows-gnu # Required Validation -* DMG mounts correctly -* App bundle launches -* Dock icon renders -* Code signing valid -* Notarization ready +- DMG mounts correctly +- App bundle launches +- Dock icon renders +- Code signing valid +- Notarization ready --- @@ -447,12 +438,12 @@ watch -n 1 'ps aux | grep commdesk' # Validate -* 10,000+ tasks -* 5,000+ events -* Massive dashboards -* Large activity feeds -* Infinite scrolling -* Search performance +- 10,000+ tasks +- 5,000+ events +- Massive dashboards +- Large activity feeds +- Infinite scrolling +- Search performance --- @@ -486,13 +477,13 @@ npm audit --audit-level=moderate # Required Security Checks -* Sandbox validation -* Permission minimization -* IPC validation -* Unsafe eval prevention -* CSP verification -* Dependency vulnerabilities -* Rust unsafe block review +- Sandbox validation +- Permission minimization +- IPC validation +- Unsafe eval prevention +- CSP verification +- Dependency vulnerabilities +- Rust unsafe block review --- @@ -500,11 +491,11 @@ npm audit --audit-level=moderate Before every release validate: -* Existing workflows still work -* No UI regressions -* No performance regressions -* Database compatibility maintained -* Auto-update compatibility maintained +- Existing workflows still work +- No UI regressions +- No performance regressions +- Database compatibility maintained +- Auto-update compatibility maintained --- @@ -547,13 +538,13 @@ Create: | Validation | Required | | ----------------- | -------- | -| TypeScript | ✅ | -| ESLint | ✅ | -| Unit Tests | ✅ | -| Integration Tests | ✅ | -| E2E Tests | ✅ | -| Production Build | ✅ | -| Linux Packaging | ✅ | +| TypeScript | ✅ | +| ESLint | ✅ | +| Unit Tests | ✅ | +| Integration Tests | ✅ | +| E2E Tests | ✅ | +| Production Build | ✅ | +| Linux Packaging | ✅ | --- @@ -587,12 +578,12 @@ Create: Validate: -* Keyboard navigation -* Screen reader support -* Focus management -* ARIA labels -* Contrast ratios -* Reduced motion support +- Keyboard navigation +- Screen reader support +- Focus management +- ARIA labels +- Contrast ratios +- Reduced motion support --- @@ -602,39 +593,39 @@ Validate: ## Core Validation -* [ ] Unit tests pass -* [ ] Integration tests pass -* [ ] E2E tests pass -* [ ] TypeScript passes -* [ ] ESLint passes +- [ ] Unit tests pass +- [ ] Integration tests pass +- [ ] E2E tests pass +- [ ] TypeScript passes +- [ ] ESLint passes --- ## Platform Validation -* [ ] Flatpak works -* [ ] Snap works -* [ ] AppImage works -* [ ] Windows installer works -* [ ] macOS DMG works +- [ ] Flatpak works +- [ ] Snap works +- [ ] AppImage works +- [ ] Windows installer works +- [ ] macOS DMG works --- ## Performance Validation -* [ ] Startup < 3 sec -* [ ] No memory leaks -* [ ] No major CPU spikes -* [ ] Large datasets render smoothly +- [ ] Startup < 3 sec +- [ ] No memory leaks +- [ ] No major CPU spikes +- [ ] Large datasets render smoothly --- ## Security Validation -* [ ] No high vulnerabilities -* [ ] Sandboxing works -* [ ] Auto-update signatures valid -* [ ] No unsafe permissions +- [ ] No high vulnerabilities +- [ ] Sandboxing works +- [ ] Auto-update signatures valid +- [ ] No unsafe permissions --- @@ -649,4 +640,3 @@ Validate: | Perf | Linux profiling | | Valgrind | Memory validation | | Codecov | Coverage reporting | - diff --git a/latest.json b/latest.json index e2e2f46..9460cf5 100644 --- a/latest.json +++ b/latest.json @@ -20,4 +20,4 @@ "url": "" } } -} \ No newline at end of file +} diff --git a/package.json b/package.json index 3290687..3e9f71d 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "@tauri-apps/plugin-opener": "2.5.4", "@tauri-apps/plugin-process": "2.3.1", "@tauri-apps/plugin-updater": "2.10.1", + "axios": "^1.16.1", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "date-fns": "^4.1.0", @@ -38,7 +39,8 @@ "react-router-dom": "^7.15.0", "recharts": "^3.8.1", "tailwind-merge": "^3.5.0", - "zod": "^4.4.3" + "zod": "^4.4.3", + "zustand": "^5.0.13" }, "devDependencies": { "@eslint/js": "^9.39.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9ddd8af..e25753c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,6 +26,9 @@ importers: '@tauri-apps/plugin-updater': specifier: 2.10.1 version: 2.10.1 + axios: + specifier: ^1.16.1 + version: 1.16.1 class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -77,6 +80,9 @@ importers: zod: specifier: ^4.4.3 version: 4.4.3 + zustand: + specifier: ^5.0.13 + version: 5.0.13(@types/react@19.2.14)(immer@11.1.8)(react@19.2.6)(use-sync-external-store@1.6.0(react@19.2.6)) devDependencies: '@eslint/js': specifier: ^9.39.4 @@ -90,6 +96,15 @@ importers: '@tauri-apps/cli': specifier: 2.10.1 version: 2.10.1 + '@testing-library/jest-dom': + specifier: ^6.9.1 + version: 6.9.1 + '@testing-library/react': + specifier: ^16.3.2 + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@testing-library/user-event': + specifier: ^14.6.1 + version: 14.6.1(@testing-library/dom@10.4.1) '@types/markdown-to-jsx': specifier: ^7.0.1 version: 7.0.1(react@19.2.6) @@ -117,6 +132,9 @@ importers: globals: specifier: ^17.6.0 version: 17.6.0 + jsdom: + specifier: ^29.1.1 + version: 29.1.1(@noble/hashes@1.8.0) prettier: specifier: ^3.8.3 version: 3.8.3 @@ -138,13 +156,34 @@ importers: vite: specifier: ^7.3.3 version: 7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0) + vitest: + specifier: ^4.1.6 + version: 4.1.6(@types/node@25.6.2)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.5(@types/node@25.6.2)(typescript@5.8.3))(vite@7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0)) packages: + '@adobe/css-tools@4.4.4': + resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} + '@antfu/ni@25.0.0': resolution: {integrity: sha512-9q/yCljni37pkMr4sPrI3G4jqdIk074+iukc5aFJl7kmDCCsiJrbZ6zKxnES1Gwg+i9RcDZwvktl23puGslmvA==} hasBin: true + '@asamuzakjp/css-color@5.1.11': + resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + '@asamuzakjp/dom-selector@7.1.1': + resolution: {integrity: sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + '@asamuzakjp/generational-cache@1.0.1': + resolution: {integrity: sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + '@asamuzakjp/nwsapi@2.3.9': + resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} + '@babel/code-frame@7.29.0': resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} @@ -274,6 +313,10 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/runtime@7.29.2': + resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} + engines: {node: '>=6.9.0'} + '@babel/template@7.28.6': resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} @@ -286,6 +329,46 @@ packages: resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} + '@bramus/specificity@2.4.2': + resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} + hasBin: true + + '@csstools/color-helpers@6.0.2': + resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==} + engines: {node: '>=20.19.0'} + + '@csstools/css-calc@3.2.0': + resolution: {integrity: sha512-bR9e6o2BDB12jzN/gIbjHa5wLJ4UjD1CB9pM7ehlc0ddk6EBz+yYS1EV2MF55/HUxrHcB/hehAyt5vhsA3hx7w==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-color-parser@4.1.0': + resolution: {integrity: sha512-U0KhLYmy2GVj6q4T3WaAe6NPuFYCPQoE3b0dRGxejWDgcPp8TP7S5rVdM5ZrFaqu4N67X8YaPBw14dQSYx3IyQ==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-parser-algorithms@4.0.0': + resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-syntax-patches-for-csstree@1.1.3': + resolution: {integrity: sha512-SH60bMfrRCJF3morcdk57WklujF4Jr/EsQUzqkarfHXEFcAR1gg7fS/chAE922Sehgzc1/+Tz5H3Ypa1HiEKrg==} + peerDependencies: + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true + + '@csstools/css-tokenizer@4.0.0': + resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} + engines: {node: '>=20.19.0'} + '@date-fns/tz@1.4.1': resolution: {integrity: sha512-P5LUNhtbj6YfI3iJjw5EL9eUAG6OitD0W3fWQcpQjDRc/QIsL0tRNuO1PcDvPccWL1fSTXXdE1ds+l95DV/OFA==} @@ -493,6 +576,15 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@exodus/bytes@1.15.0': + resolution: {integrity: sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@noble/hashes': ^1.8.0 || ^2.0.0 + peerDependenciesMeta: + '@noble/hashes': + optional: true + '@floating-ui/core@1.7.5': resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} @@ -1697,9 +1789,41 @@ packages: '@tauri-apps/plugin-updater@2.10.1': resolution: {integrity: sha512-NFYMg+tWOZPJdzE/PpFj2qfqwAWwNS3kXrb1tm1gnBJ9mYzZ4WDRrwy8udzWoAnfGCHLuePNLY1WVCNHnh3eRA==} + '@testing-library/dom@10.4.1': + resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + engines: {node: '>=18'} + + '@testing-library/jest-dom@6.9.1': + resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + + '@testing-library/react@16.3.2': + resolution: {integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==} + engines: {node: '>=18'} + peerDependencies: + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.0 || ^19.0.0 + '@types/react-dom': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@testing-library/user-event@14.6.1': + resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + '@ts-morph/common@0.27.0': resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==} + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -1712,6 +1836,9 @@ packages: '@types/babel__traverse@7.28.0': resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/d3-array@3.2.2': resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} @@ -1739,6 +1866,9 @@ packages: '@types/d3-timer@3.0.2': resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -1840,6 +1970,35 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@vitest/expect@4.1.6': + resolution: {integrity: sha512-7EHDquPthALSV0jhhjgEW8FXaviMx7rSqu8W6oqCoAuOhKov814P99QDV1pxMA3QPv21YudvJngIhjrNI4opLg==} + + '@vitest/mocker@4.1.6': + resolution: {integrity: sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@4.1.6': + resolution: {integrity: sha512-h5SxD/IzNhZYnrSZRsUZQIC+vD0GY8cUvq0iwsmkFKixRCKLLWqCXa/FIQ4S1R+sI+PGoojkHsdNrbZiM9Qpgw==} + + '@vitest/runner@4.1.6': + resolution: {integrity: sha512-nOPCmn2+yD0ZNmKdsXGv/UxMMWbMuKeD6GyYncNwdkYDxpQvrPSKYj2rWuDjC2Y4b6w6hjip5dBKFzEUuZe3vA==} + + '@vitest/snapshot@4.1.6': + resolution: {integrity: sha512-YhsdE6xAVfTDmzjxL2ZDUvjj+ZsgyOKe+TdQzqkD72wIOmHka8NuGQ6NpTNZv9D2Z63fbwWKJPeVpEw4EQgYxw==} + + '@vitest/spy@4.1.6': + resolution: {integrity: sha512-JFKxMx6udhwKh/Ldo270e17QX710vgunMkuPAvXjHSvC6oqLWAHhVhjg/I71q0u0CBSErIODV1Kjv0FQNSWjdg==} + + '@vitest/utils@4.1.6': + resolution: {integrity: sha512-FxIY+U81R3LGKCxaHHFRQ5+g6/iRgGLmeHWdp2Amj4ljQRrEIWHmZyDfDYBRZlpyqA7qKxtS9DD1dhk8RnRIVQ==} + accepts@2.0.0: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} @@ -1854,6 +2013,10 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} @@ -1884,6 +2047,10 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + ansis@4.2.0: resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} engines: {node: '>=14'} @@ -1895,10 +2062,27 @@ packages: resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} engines: {node: '>=10'} + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + ast-types@0.16.1: resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} engines: {node: '>=4'} + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.16.1: + resolution: {integrity: sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1911,6 +2095,9 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + body-parser@2.2.2: resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} engines: {node: '>=18'} @@ -1954,6 +2141,10 @@ packages: caniuse-lite@1.0.30001792: resolution: {integrity: sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -1995,6 +2186,10 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + commander@11.1.0: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} @@ -2046,6 +2241,13 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -2102,6 +2304,10 @@ packages: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} + data-urls@7.0.0: + resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + date-fns-jalali@4.1.0-0: resolution: {integrity: sha512-hTIP/z+t+qKwBDcmmsnmjWTduxCg+5KfdqWQvb2X/8C9+knYY6epN/pfxdDuyVlSVeFz0sM5eEfwIUQ70U4ckg==} @@ -2120,6 +2326,9 @@ packages: decimal.js-light@2.5.1: resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + dedent@1.7.2: resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} peerDependencies: @@ -2147,10 +2356,18 @@ packages: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -2162,6 +2379,12 @@ packages: resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} engines: {node: '>=0.3.1'} + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + + dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + dotenv@17.4.2: resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} engines: {node: '>=12'} @@ -2194,6 +2417,10 @@ packages: resolution: {integrity: sha512-xe9vQb5kReirPUxgQrXA3ihgbCqssmTiM7cOZ+Gzu+VeGWgpV98lLZvp0dl4yriyAePcewxGUs9UpKD8PET9KQ==} engines: {node: '>=10.13.0'} + entities@8.0.0: + resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} + engines: {node: '>=20.19.0'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -2209,10 +2436,17 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + es-module-lexer@2.1.0: + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + es-toolkit@1.46.1: resolution: {integrity: sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ==} @@ -2296,6 +2530,9 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -2323,6 +2560,10 @@ packages: resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} engines: {node: ^18.19.0 || >=20.5.0} + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} + express-rate-limit@8.5.1: resolution: {integrity: sha512-5O6KYmyJEpuPJV5hNTXKbAHWRqrzyu+OI3vUnSd2kXFubIVpG7ezpgxQy76Zo5GQZtrQBg86hF+CM/NX+cioiQ==} engines: {node: '>= 16'} @@ -2401,6 +2642,19 @@ packages: flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + formdata-polyfill@4.0.10: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} @@ -2502,6 +2756,10 @@ packages: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + hasown@2.0.3: resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} engines: {node: '>= 0.4'} @@ -2519,10 +2777,18 @@ packages: resolution: {integrity: sha512-RWzP96k/yv0PQfyXnWjs6zot20TqfpfsNXhOnev8d1InAxubW93L11/oNUc3tQqn2G0bSdAOBpX+2uDFHV7kdQ==} engines: {node: '>=16.9.0'} + html-encoding-sniffer@6.0.0: + resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + http-errors@2.0.1: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + https-proxy-agent@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} @@ -2561,6 +2827,10 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -2624,6 +2894,9 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-promise@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} @@ -2672,6 +2945,15 @@ packages: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true + jsdom@29.1.1: + resolution: {integrity: sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -2806,6 +3088,10 @@ packages: resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} engines: {node: '>=18'} + lru-cache@11.3.6: + resolution: {integrity: sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -2814,6 +3100,10 @@ packages: peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -2839,6 +3129,9 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + media-typer@1.1.0: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} @@ -2858,10 +3151,18 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + mime-db@1.54.0: resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} engines: {node: '>= 0.6'} + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + mime-types@3.0.2: resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} engines: {node: '>=18'} @@ -2874,6 +3175,10 @@ packages: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + minimatch@10.2.5: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} @@ -2951,6 +3256,9 @@ packages: resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} engines: {node: '>= 10'} + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -3004,6 +3312,9 @@ packages: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} engines: {node: '>=18'} + parse5@8.0.1: + resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -3029,6 +3340,9 @@ packages: path-to-regexp@8.4.2: resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -3069,6 +3383,10 @@ packages: engines: {node: '>=14'} hasBin: true + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + pretty-ms@9.3.0: resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} @@ -3081,6 +3399,10 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -3135,6 +3457,9 @@ packages: peerDependencies: react: '*' + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + react-is@19.2.5: resolution: {integrity: sha512-Dn0t8IQhCmeIT3wu+Apm1/YVsJXsGWi6k4sPdnBIdqMVtHtv0IGi6dcpNpNkNac0zB2uUAqNX3MHzN8c+z2rwQ==} @@ -3217,6 +3542,10 @@ packages: react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-is: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + redux-thunk@3.1.0: resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==} peerDependencies: @@ -3270,6 +3599,10 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} @@ -3327,6 +3660,9 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -3345,10 +3681,16 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + statuses@2.0.2: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} + std-env@4.1.0: + resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} + stdin-discarder@0.2.2: resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} engines: {node: '>=18'} @@ -3388,6 +3730,10 @@ packages: resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} engines: {node: '>=18'} + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -3396,6 +3742,9 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + tagged-tag@1.0.0: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} @@ -3413,6 +3762,9 @@ packages: tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + tinyexec@1.1.2: resolution: {integrity: sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==} engines: {node: '>=18'} @@ -3421,6 +3773,10 @@ packages: resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} + tinyrainbow@3.1.0: + resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} + engines: {node: '>=14.0.0'} + tldts-core@7.0.30: resolution: {integrity: sha512-uiHN8PIB1VmWyS98eZYja4xzlYqeFZVjb4OuYlJQnZAuJhMw4PbKQOKgHKhBdJR3FE/t5mUQ1Kd80++B+qhD1Q==} @@ -3440,6 +3796,10 @@ packages: resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==} engines: {node: '>=16'} + tr46@6.0.0: + resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} + engines: {node: '>=20'} + ts-api-utils@2.5.0: resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} @@ -3486,6 +3846,10 @@ packages: undici-types@7.19.2: resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} + undici@7.25.0: + resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==} + engines: {node: '>=20.18.1'} + unicorn-magic@0.3.0: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} @@ -3589,10 +3953,67 @@ packages: yaml: optional: true + vitest@4.1.6: + resolution: {integrity: sha512-6lvjbS3p9b4CrdCmguzbh2/4uoXhGE2q71R4OX5sqF9R1bo9Xd6fGrMAfvp5wnCzlBnFVdCOp6onuTQVbo8iUQ==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.1.6 + '@vitest/browser-preview': 4.1.6 + '@vitest/browser-webdriverio': 4.1.6 + '@vitest/coverage-istanbul': 4.1.6 + '@vitest/coverage-v8': 4.1.6 + '@vitest/ui': 4.1.6 + happy-dom: '*' + jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + web-streams-polyfill@3.3.3: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} + webidl-conversions@8.0.1: + resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} + engines: {node: '>=20'} + + whatwg-mimetype@5.0.0: + resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} + engines: {node: '>=20'} + + whatwg-url@16.0.1: + resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -3603,6 +4024,11 @@ packages: engines: {node: ^16.13.0 || >=18.0.0} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -3618,6 +4044,13 @@ packages: resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} engines: {node: '>=20'} + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -3662,8 +4095,28 @@ packages: zod@4.4.3: resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zustand@5.0.13: + resolution: {integrity: sha512-efI2tVaVQPqtOh114loML/Z80Y4NP3yc+Ff0fYiZJPauNeWZeIp/bRFD7I9bfmCOYBh/PHxlglQ9+wvlwnPikQ==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + snapshots: + '@adobe/css-tools@4.4.4': {} + '@antfu/ni@25.0.0': dependencies: ansis: 4.2.0 @@ -3671,6 +4124,26 @@ snapshots: package-manager-detector: 1.6.0 tinyexec: 1.1.2 + '@asamuzakjp/css-color@5.1.11': + dependencies: + '@asamuzakjp/generational-cache': 1.0.1 + '@csstools/css-calc': 3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-color-parser': 4.1.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + + '@asamuzakjp/dom-selector@7.1.1': + dependencies: + '@asamuzakjp/generational-cache': 1.0.1 + '@asamuzakjp/nwsapi': 2.3.9 + bidi-js: 1.0.3 + css-tree: 3.2.1 + is-potential-custom-element-name: 1.0.1 + + '@asamuzakjp/generational-cache@1.0.1': {} + + '@asamuzakjp/nwsapi@2.3.9': {} + '@babel/code-frame@7.29.0': dependencies: '@babel/helper-validator-identifier': 7.28.5 @@ -3844,6 +4317,8 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/runtime@7.29.2': {} + '@babel/template@7.28.6': dependencies: '@babel/code-frame': 7.29.0 @@ -3867,6 +4342,34 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@bramus/specificity@2.4.2': + dependencies: + css-tree: 3.2.1 + + '@csstools/color-helpers@6.0.2': {} + + '@csstools/css-calc@3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + + '@csstools/css-color-parser@4.1.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/color-helpers': 6.0.2 + '@csstools/css-calc': 3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + + '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/css-tokenizer': 4.0.0 + + '@csstools/css-syntax-patches-for-csstree@1.1.3(css-tree@3.2.1)': + optionalDependencies: + css-tree: 3.2.1 + + '@csstools/css-tokenizer@4.0.0': {} + '@date-fns/tz@1.4.1': {} '@dotenvx/dotenvx@1.65.0': @@ -4010,6 +4513,10 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 + '@exodus/bytes@1.15.0(@noble/hashes@1.8.0)': + optionalDependencies: + '@noble/hashes': 1.8.0 + '@floating-ui/core@1.7.5': dependencies: '@floating-ui/utils': 0.2.11 @@ -5149,12 +5656,48 @@ snapshots: dependencies: '@tauri-apps/api': 2.10.1 + '@testing-library/dom@10.4.1': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/runtime': 7.29.2 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + picocolors: 1.1.1 + pretty-format: 27.5.1 + + '@testing-library/jest-dom@6.9.1': + dependencies: + '@adobe/css-tools': 4.4.4 + aria-query: 5.3.2 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + picocolors: 1.1.1 + redent: 3.0.0 + + '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@babel/runtime': 7.29.2 + '@testing-library/dom': 10.4.1 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': + dependencies: + '@testing-library/dom': 10.4.1 + '@ts-morph/common@0.27.0': dependencies: fast-glob: 3.3.3 minimatch: 10.2.5 path-browserify: 1.0.1 + '@types/aria-query@5.0.4': {} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.29.3 @@ -5176,6 +5719,11 @@ snapshots: dependencies: '@babel/types': 7.29.0 + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + '@types/d3-array@3.2.2': {} '@types/d3-color@3.1.3': {} @@ -5200,6 +5748,8 @@ snapshots: '@types/d3-timer@3.0.2': {} + '@types/deep-eql@4.0.2': {} + '@types/estree@1.0.8': {} '@types/estree@1.0.9': {} @@ -5340,6 +5890,48 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitest/expect@4.1.6': + dependencies: + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.1.6 + '@vitest/utils': 4.1.6 + chai: 6.2.2 + tinyrainbow: 3.1.0 + + '@vitest/mocker@4.1.6(msw@2.14.5(@types/node@25.6.2)(typescript@5.8.3))(vite@7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0))': + dependencies: + '@vitest/spy': 4.1.6 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + msw: 2.14.5(@types/node@25.6.2)(typescript@5.8.3) + vite: 7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0) + + '@vitest/pretty-format@4.1.6': + dependencies: + tinyrainbow: 3.1.0 + + '@vitest/runner@4.1.6': + dependencies: + '@vitest/utils': 4.1.6 + pathe: 2.0.3 + + '@vitest/snapshot@4.1.6': + dependencies: + '@vitest/pretty-format': 4.1.6 + '@vitest/utils': 4.1.6 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@4.1.6': {} + + '@vitest/utils@4.1.6': + dependencies: + '@vitest/pretty-format': 4.1.6 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 + accepts@2.0.0: dependencies: mime-types: 3.0.2 @@ -5351,6 +5943,12 @@ snapshots: acorn@8.16.0: {} + agent-base@6.0.2: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + agent-base@7.1.4: {} ajv-formats@3.0.1(ajv@8.20.0): @@ -5379,6 +5977,8 @@ snapshots: dependencies: color-convert: 2.0.1 + ansi-styles@5.2.0: {} + ansis@4.2.0: {} argparse@2.0.1: {} @@ -5387,16 +5987,40 @@ snapshots: dependencies: tslib: 2.8.1 + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + aria-query@5.3.2: {} + + assertion-error@2.0.1: {} + ast-types@0.16.1: dependencies: tslib: 2.8.1 + asynckit@0.4.0: {} + + axios@1.16.1: + dependencies: + follow-redirects: 1.16.0 + form-data: 4.0.5 + https-proxy-agent: 5.0.1 + proxy-from-env: 2.1.0 + transitivePeerDependencies: + - debug + - supports-color + balanced-match@1.0.2: {} balanced-match@4.0.4: {} baseline-browser-mapping@2.10.29: {} + bidi-js@1.0.3: + dependencies: + require-from-string: 2.0.2 + body-parser@2.2.2: dependencies: bytes: 3.1.2 @@ -5452,6 +6076,8 @@ snapshots: caniuse-lite@1.0.30001792: {} + chai@6.2.2: {} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -5487,6 +6113,10 @@ snapshots: color-name@1.1.4: {} + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + commander@11.1.0: {} commander@14.0.3: {} @@ -5525,6 +6155,13 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + css-tree@3.2.1: + dependencies: + mdn-data: 2.27.1 + source-map-js: 1.2.1 + + css.escape@1.5.1: {} + cssesc@3.0.0: {} csstype@3.2.3: {} @@ -5569,6 +6206,13 @@ snapshots: data-uri-to-buffer@4.0.1: {} + data-urls@7.0.0(@noble/hashes@1.8.0): + dependencies: + whatwg-mimetype: 5.0.0 + whatwg-url: 16.0.1(@noble/hashes@1.8.0) + transitivePeerDependencies: + - '@noble/hashes' + date-fns-jalali@4.1.0-0: {} date-fns@4.1.0: {} @@ -5579,6 +6223,8 @@ snapshots: decimal.js-light@2.5.1: {} + decimal.js@10.6.0: {} + dedent@1.7.2: {} deep-is@0.1.4: {} @@ -5594,14 +6240,22 @@ snapshots: define-lazy-prop@3.0.0: {} + delayed-stream@1.0.0: {} + depd@2.0.0: {} + dequal@2.0.3: {} + detect-libc@2.1.2: {} detect-node-es@1.1.0: {} diff@8.0.4: {} + dom-accessibility-api@0.5.16: {} + + dom-accessibility-api@0.6.3: {} + dotenv@17.4.2: {} dunder-proto@1.0.1: @@ -5632,6 +6286,8 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.3.3 + entities@8.0.0: {} + env-paths@2.2.1: {} error-ex@1.3.4: @@ -5642,10 +6298,19 @@ snapshots: es-errors@1.3.0: {} + es-module-lexer@2.1.0: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.3 + es-toolkit@1.46.1: {} esbuild@0.27.7: @@ -5772,6 +6437,10 @@ snapshots: estraverse@5.3.0: {} + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.9 + esutils@2.0.3: {} etag@1.8.1: {} @@ -5811,6 +6480,8 @@ snapshots: strip-final-newline: 4.0.0 yoctocolors: 2.1.2 + expect-type@1.3.0: {} + express-rate-limit@8.5.1(express@5.2.1): dependencies: express: 5.2.1 @@ -5923,6 +6594,16 @@ snapshots: flatted@3.4.2: {} + follow-redirects@1.16.0: {} + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.3 + mime-types: 2.1.35 + formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 @@ -6003,6 +6684,10 @@ snapshots: has-symbols@1.1.0: {} + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + hasown@2.0.3: dependencies: function-bind: 1.1.2 @@ -6020,6 +6705,12 @@ snapshots: hono@4.12.18: {} + html-encoding-sniffer@6.0.0(@noble/hashes@1.8.0): + dependencies: + '@exodus/bytes': 1.15.0(@noble/hashes@1.8.0) + transitivePeerDependencies: + - '@noble/hashes' + http-errors@2.0.1: dependencies: depd: 2.0.0 @@ -6028,6 +6719,13 @@ snapshots: statuses: 2.0.2 toidentifier: 1.0.1 + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 @@ -6058,6 +6756,8 @@ snapshots: imurmurhash@0.1.4: {} + indent-string@4.0.0: {} + inherits@2.0.4: {} internmap@2.0.3: {} @@ -6094,6 +6794,8 @@ snapshots: is-plain-obj@4.1.0: {} + is-potential-custom-element-name@1.0.1: {} + is-promise@4.0.0: {} is-regexp@3.1.0: {} @@ -6124,6 +6826,32 @@ snapshots: dependencies: argparse: 2.0.1 + jsdom@29.1.1(@noble/hashes@1.8.0): + dependencies: + '@asamuzakjp/css-color': 5.1.11 + '@asamuzakjp/dom-selector': 7.1.1 + '@bramus/specificity': 2.4.2 + '@csstools/css-syntax-patches-for-csstree': 1.1.3(css-tree@3.2.1) + '@exodus/bytes': 1.15.0(@noble/hashes@1.8.0) + css-tree: 3.2.1 + data-urls: 7.0.0(@noble/hashes@1.8.0) + decimal.js: 10.6.0 + html-encoding-sniffer: 6.0.0(@noble/hashes@1.8.0) + is-potential-custom-element-name: 1.0.1 + lru-cache: 11.3.6 + parse5: 8.0.1 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 6.0.1 + undici: 7.25.0 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 8.0.1 + whatwg-mimetype: 5.0.0 + whatwg-url: 16.0.1(@noble/hashes@1.8.0) + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - '@noble/hashes' + jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -6221,6 +6949,8 @@ snapshots: chalk: 5.6.2 is-unicode-supported: 1.3.0 + lru-cache@11.3.6: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -6229,6 +6959,8 @@ snapshots: dependencies: react: 19.2.6 + lz-string@1.5.0: {} + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -6239,6 +6971,8 @@ snapshots: math-intrinsics@1.1.0: {} + mdn-data@2.27.1: {} + media-typer@1.1.0: {} merge-descriptors@2.0.0: {} @@ -6252,8 +6986,14 @@ snapshots: braces: 3.0.3 picomatch: 2.3.2 + mime-db@1.52.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + mime-types@3.0.2: dependencies: mime-db: 1.54.0 @@ -6262,6 +7002,8 @@ snapshots: mimic-function@5.0.1: {} + min-indent@1.0.1: {} + minimatch@10.2.5: dependencies: brace-expansion: 5.0.6 @@ -6337,6 +7079,8 @@ snapshots: object-treeify@1.1.33: {} + obug@2.1.1: {} + on-finished@2.4.1: dependencies: ee-first: 1.1.1 @@ -6408,6 +7152,10 @@ snapshots: parse-ms@4.0.0: {} + parse5@8.0.1: + dependencies: + entities: 8.0.0 + parseurl@1.3.3: {} path-browserify@1.0.1: {} @@ -6422,6 +7170,8 @@ snapshots: path-to-regexp@8.4.2: {} + pathe@2.0.3: {} + picocolors@1.1.1: {} picomatch@2.3.2: {} @@ -6452,6 +7202,12 @@ snapshots: prettier@3.8.3: {} + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + pretty-ms@9.3.0: dependencies: parse-ms: 4.0.0 @@ -6466,6 +7222,8 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 + proxy-from-env@2.1.0: {} + punycode@2.3.1: {} qs@6.15.1: @@ -6567,6 +7325,8 @@ snapshots: dependencies: react: 19.2.6 + react-is@17.0.2: {} + react-is@19.2.5: {} react-redux@9.2.0(@types/react@19.2.14)(react@19.2.6)(redux@5.0.1): @@ -6651,6 +7411,11 @@ snapshots: - '@types/react' - redux + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + redux-thunk@3.1.0(redux@5.0.1): dependencies: redux: 5.0.1 @@ -6723,6 +7488,10 @@ snapshots: safer-buffer@2.1.2: {} + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + scheduler@0.27.0: {} semver@6.3.1: {} @@ -6838,6 +7607,8 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} + signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -6848,8 +7619,12 @@ snapshots: source-map@0.6.1: {} + stackback@0.0.2: {} + statuses@2.0.2: {} + std-env@4.1.0: {} + stdin-discarder@0.2.2: {} strict-event-emitter@0.5.1: {} @@ -6886,12 +7661,18 @@ snapshots: strip-final-newline@4.0.0: {} + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + strip-json-comments@3.1.1: {} supports-color@7.2.0: dependencies: has-flag: 4.0.0 + symbol-tree@3.2.4: {} + tagged-tag@1.0.0: {} tailwind-merge@3.5.0: {} @@ -6902,6 +7683,8 @@ snapshots: tiny-invariant@1.3.3: {} + tinybench@2.9.0: {} + tinyexec@1.1.2: {} tinyglobby@0.2.16: @@ -6909,6 +7692,8 @@ snapshots: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 + tinyrainbow@3.1.0: {} + tldts-core@7.0.30: {} tldts@7.0.30: @@ -6925,6 +7710,10 @@ snapshots: dependencies: tldts: 7.0.30 + tr46@6.0.0: + dependencies: + punycode: 2.3.1 + ts-api-utils@2.5.0(typescript@5.8.3): dependencies: typescript: 5.8.3 @@ -6973,6 +7762,8 @@ snapshots: undici-types@7.19.2: {} + undici@7.25.0: {} + unicorn-magic@0.3.0: {} universalify@2.0.1: {} @@ -7047,8 +7838,52 @@ snapshots: jiti: 2.7.0 lightningcss: 1.32.0 + vitest@4.1.6(@types/node@25.6.2)(jsdom@29.1.1(@noble/hashes@1.8.0))(msw@2.14.5(@types/node@25.6.2)(typescript@5.8.3))(vite@7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0)): + dependencies: + '@vitest/expect': 4.1.6 + '@vitest/mocker': 4.1.6(msw@2.14.5(@types/node@25.6.2)(typescript@5.8.3))(vite@7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0)) + '@vitest/pretty-format': 4.1.6 + '@vitest/runner': 4.1.6 + '@vitest/snapshot': 4.1.6 + '@vitest/spy': 4.1.6 + '@vitest/utils': 4.1.6 + es-module-lexer: 2.1.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.4 + std-env: 4.1.0 + tinybench: 2.9.0 + tinyexec: 1.1.2 + tinyglobby: 0.2.16 + tinyrainbow: 3.1.0 + vite: 7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 25.6.2 + jsdom: 29.1.1(@noble/hashes@1.8.0) + transitivePeerDependencies: + - msw + + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + web-streams-polyfill@3.3.3: {} + webidl-conversions@8.0.1: {} + + whatwg-mimetype@5.0.0: {} + + whatwg-url@16.0.1(@noble/hashes@1.8.0): + dependencies: + '@exodus/bytes': 1.15.0(@noble/hashes@1.8.0) + tr46: 6.0.0 + webidl-conversions: 8.0.1 + transitivePeerDependencies: + - '@noble/hashes' + which@2.0.2: dependencies: isexe: 2.0.0 @@ -7057,6 +7892,11 @@ snapshots: dependencies: isexe: 3.1.5 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + word-wrap@1.2.5: {} wrap-ansi@7.0.0: @@ -7072,6 +7912,10 @@ snapshots: is-wsl: 3.1.1 powershell-utils: 0.1.0 + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} + y18n@5.0.8: {} yallist@3.1.1: {} @@ -7107,3 +7951,10 @@ snapshots: zod@3.25.76: {} zod@4.4.3: {} + + zustand@5.0.13(@types/react@19.2.14)(immer@11.1.8)(react@19.2.6)(use-sync-external-store@1.6.0(react@19.2.6)): + optionalDependencies: + '@types/react': 19.2.14 + immer: 11.1.8 + react: 19.2.6 + use-sync-external-store: 1.6.0(react@19.2.6) diff --git a/src/App.css b/src/App.css index 6610d51..dcd5ee2 100644 --- a/src/App.css +++ b/src/App.css @@ -251,7 +251,6 @@ body { /* ─── CommDesk utility classes ───────────────────────────────────────────── */ @layer utilities { - /* Cards */ .cd-card { background-color: var(--cd-surface); @@ -621,4 +620,4 @@ html { .custom-scrollbar::-webkit-scrollbar-thumb:hover { background-color: var(--cd-primary); -} \ No newline at end of file +} diff --git a/src/App.tsx b/src/App.tsx index c39f7ca..b84cf84 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -4,7 +4,6 @@ import { BrowserRouter } from "react-router-dom"; import "./App.css"; - import { startAutoUpdater } from "./system/updater/autoUpdater"; import { ThemeProvider } from "./theme"; @@ -16,15 +15,12 @@ function App() { void startAutoUpdater(); }, []); - return ( + - - - - + ); diff --git a/src/Component/ui/Button.tsx b/src/Component/ui/Button.tsx index ce6a5b7..22a6ce9 100644 --- a/src/Component/ui/Button.tsx +++ b/src/Component/ui/Button.tsx @@ -1,9 +1,9 @@ import React from "react"; - type ButtonProps = { text: string; icon?: React.ReactNode; + type?: "button" | "submit" | "reset"; width?: string; height?: string; onClick: () => void; @@ -15,6 +15,7 @@ type ButtonProps = { const Button = ({ text, icon, + type = "button", onClick, disabled, width, @@ -34,6 +35,7 @@ const Button = ({ return (
diff --git a/src/features/Auth/v1/Pages/SignUpPage.tsx b/src/features/Auth/v1/Pages/SignUpPage.tsx index 3568204..2735cac 100644 --- a/src/features/Auth/v1/Pages/SignUpPage.tsx +++ b/src/features/Auth/v1/Pages/SignUpPage.tsx @@ -4,7 +4,7 @@ import { Link } from "react-router-dom"; import { ArrowLeft, ArrowRight, Loader2 } from "lucide-react"; import { useSignupForm, STEP_FIELDS, SignupFormData } from "../hooks/useSignupForm"; -import { submitCommunitySignup } from "../api/signup"; +import { submitCommunitySignup } from "../utils/signup"; import StepProgress from "../components/signup/StepProgress"; import CommunityStep from "../components/signup/CommunityStep"; import ContactStep from "../components/signup/ContactStep"; diff --git a/src/features/Auth/v1/Store/Auth.Store.ts b/src/features/Auth/v1/Store/Auth.Store.ts new file mode 100644 index 0000000..453db3c --- /dev/null +++ b/src/features/Auth/v1/Store/Auth.Store.ts @@ -0,0 +1,28 @@ +import { create } from "zustand"; +import { persist } from "zustand/middleware"; + +import { AuthState, User } from "../Types/Auth.type"; + +const useAuthStore = create()( + persist( + (set) => ({ + token: null, + user: null, + + setAuthData: (user: User) => + set({ + user, + }), + + clearAuthData: () => + set({ + user: null, + }), + }), + { + name: "auth-storage", + }, + ), +); + +export default useAuthStore; diff --git a/src/features/Auth/v1/Store/Organization.Store.ts b/src/features/Auth/v1/Store/Organization.Store.ts new file mode 100644 index 0000000..2da8ef9 --- /dev/null +++ b/src/features/Auth/v1/Store/Organization.Store.ts @@ -0,0 +1,24 @@ +import { create } from "zustand"; +import { persist } from "zustand/middleware"; +import { CommunitySchema } from "../Types/Organization.Type"; + + +const useOrganizationStore = create<{ + organization: CommunitySchema | null; + setOrganization: (organization: CommunitySchema) => void; +}>()( + persist( + (set) => ({ + organization: null, + setOrganization: (organization: CommunitySchema) => + set({ + organization, + }), + }), + { + name: "organization-storage", + }, + ), +); + +export default useOrganizationStore; diff --git a/src/features/Auth/v1/Types/Auth.type.ts b/src/features/Auth/v1/Types/Auth.type.ts new file mode 100644 index 0000000..7956fd8 --- /dev/null +++ b/src/features/Auth/v1/Types/Auth.type.ts @@ -0,0 +1,14 @@ +export interface User { + _id: string; + + email: string; + role: string; +} + +export interface AuthState { + // token: string | null; + user: User | null; + + setAuthData: (user: User) => void; + clearAuthData: () => void; +} diff --git a/src/features/Auth/v1/Types/Organization.Type.ts b/src/features/Auth/v1/Types/Organization.Type.ts new file mode 100644 index 0000000..4f99cb5 --- /dev/null +++ b/src/features/Auth/v1/Types/Organization.Type.ts @@ -0,0 +1,20 @@ +export type CommunitySchema = { + CommunityName: string; + Bio: string; + Slug: string; + Website: string; + Country: string; + City: string; + OfficialEmail: string; + ContactPhone: string; + LogoUrl: string; + + SocialLinks: { + github?: string; + discord?: string; + twitter?: string; + linkedin?: string; + youtube?: string; + instagram?: string; + }; +}; diff --git a/src/features/Auth/v1/components/signup/CommunityStep.tsx b/src/features/Auth/v1/components/signup/CommunityStep.tsx index 5426bc4..fe49f11 100644 --- a/src/features/Auth/v1/components/signup/CommunityStep.tsx +++ b/src/features/Auth/v1/components/signup/CommunityStep.tsx @@ -2,7 +2,7 @@ import { useRef, useState } from "react"; import { useFormContext } from "react-hook-form"; import { Upload, X, AlertCircle } from "lucide-react"; import { SignupFormData } from "../../hooks/useSignupForm"; -import { uploadCommunityLogo } from "../../api/signup"; +import { uploadCommunityLogo } from "../../utils/signup"; export default function CommunityStep() { const { diff --git a/src/features/Auth/v1/components/signup/ReviewStep.tsx b/src/features/Auth/v1/components/signup/ReviewStep.tsx index f7bb107..d147301 100644 --- a/src/features/Auth/v1/components/signup/ReviewStep.tsx +++ b/src/features/Auth/v1/components/signup/ReviewStep.tsx @@ -10,7 +10,7 @@ import { Github, Facebook, User, - Lock + Lock, } from "lucide-react"; import { SignupFormData } from "../../hooks/useSignupForm"; diff --git a/src/features/Auth/v1/hooks/useAuth.ts b/src/features/Auth/v1/hooks/useAuth.ts new file mode 100644 index 0000000..76a86c2 --- /dev/null +++ b/src/features/Auth/v1/hooks/useAuth.ts @@ -0,0 +1,89 @@ +import api from "@/utils/axios.utils"; +import { useMutation } from "@tanstack/react-query"; + +import AUTH_ENDPOINTS from "../Constant/Auth.Endpoint.Constant"; +import useAuthStore from "../Store/Auth.Store"; +import useOrganizationStore from "../Store/Organization.Store"; + +const baseUrl = + import.meta.env.VITE_API_BASE_URL || "http://localhost:8000/api/v1"; + +// ========================= +// GET ORGANIZATION +// ========================= + +const useGetOrganizationMutation = () => { + return useMutation({ + mutationKey: ["organization"], + + mutationFn: async (_id: string) => { + const response = await api.get( + `${baseUrl}${AUTH_ENDPOINTS.GET_ORGANIZATION_BY_ID}?ownerId=${_id}` + ); + + return response.data; + }, + + onSuccess: (response) => { + useOrganizationStore.getState().setOrganization(response.data); + }, + + onError: (error) => { + console.error("Failed to fetch organization:", error); + }, + }); +}; + +// ========================= +// LOGIN +// ========================= + +const useLoginMutation = () => { + const organizationMutation = useGetOrganizationMutation(); + + return useMutation({ + mutationKey: ["login"], + + mutationFn: async (credentials: { + email: string; + password: string; + }) => { + const response = await api.post( + `${baseUrl}${AUTH_ENDPOINTS.LOGIN}`, + credentials + ); + + return response.data; + }, + + onSuccess: async (response) => { + const user = response.data; + + console.log("Login successful:", user); + + // Save auth first + useAuthStore.getState().setAuthData(user); + + // Fetch organization if needed + if (user.role === "organization") { + await organizationMutation.mutateAsync(user._id); + } + }, + + onError: (error) => { + console.error("Login failed:", error); + }, + }); +}; + +// ========================= +// AUTH HOOK +// ========================= + +export const useAuth = () => { + const loginMutation = useLoginMutation(); + + return { + loginMutation, + }; +}; \ No newline at end of file diff --git a/src/features/Auth/v1/api/signup.ts b/src/features/Auth/v1/utils/signup.ts similarity index 100% rename from src/features/Auth/v1/api/signup.ts rename to src/features/Auth/v1/utils/signup.ts diff --git a/src/features/Events/v1/Components/Partners_And_Sponsors_Card.tsx b/src/features/Events/v1/Components/Partners_And_Sponsors_Card.tsx index 8dd5b9f..a16dc5c 100644 --- a/src/features/Events/v1/Components/Partners_And_Sponsors_Card.tsx +++ b/src/features/Events/v1/Components/Partners_And_Sponsors_Card.tsx @@ -1,4 +1,3 @@ - import React, { memo } from "react"; import { CATEGORY_ACCENT_RULES, CategoryAccent, DEFAULT_ACCENT } from "../Constants/Event.constant"; import { theme } from "@/theme"; @@ -31,7 +30,6 @@ const Partners_And_Sponsors_Card = ({ name = "Partner/Sponsor Name", category = "Official Partner", }: PartnersAndSponsorsCardProps) => { - const [hasImageError, setHasImageError] = React.useState(false); React.useEffect(() => { diff --git a/src/features/Events/v1/Sections/Capacity_And_Registration.tsx b/src/features/Events/v1/Sections/Capacity_And_Registration.tsx index 77bf46a..915ee74 100644 --- a/src/features/Events/v1/Sections/Capacity_And_Registration.tsx +++ b/src/features/Events/v1/Sections/Capacity_And_Registration.tsx @@ -6,8 +6,6 @@ import DropDown from "@/Component/ui/DropDown"; import { theme } from "@/theme"; const Capacity_And_Registration = () => { - - let [eventData, setEventData] = React.useState({ MaxAttendees: "", TicketType: "Free", diff --git a/src/features/Events/v1/Sections/Settings.tsx b/src/features/Events/v1/Sections/Settings.tsx index ba9facf..b4e446f 100644 --- a/src/features/Events/v1/Sections/Settings.tsx +++ b/src/features/Events/v1/Sections/Settings.tsx @@ -1,10 +1,8 @@ - import { IoSettingsSharp } from "react-icons/io5"; import EventSetting from "../Components/EventSetting"; import { theme } from "@/theme"; const Settings = () => { - return (
{ + const user = useAuthStore((state) => state.user); + const organization = useOrganizationStore((state) => state.organization); + + console.log("User in SideBar:", user); + console.log("Organization in SideBar:", organization); const { theme } = useTheme(); return ( @@ -67,16 +83,16 @@ const SideBar = () => { style={{ backgroundColor: theme.bg.surfaceSecondary }} > Profile

- {dashboardData.user.name} + {organization?.CommunityName}

- {dashboardData.user.role} + {user?.role}

diff --git a/src/features/Tasks/v1/Task.types.ts b/src/features/Tasks/v1/Task.types.ts index 4b0ee5f..2c25f92 100644 --- a/src/features/Tasks/v1/Task.types.ts +++ b/src/features/Tasks/v1/Task.types.ts @@ -120,4 +120,4 @@ export interface ReviewSubmissionPayload { decision: ReviewDecision; score?: number; feedback?: string; -} \ No newline at end of file +} diff --git a/src/features/Tasks/v1/components/common/Avatar.tsx b/src/features/Tasks/v1/components/common/Avatar.tsx index 6656584..c9ac099 100644 --- a/src/features/Tasks/v1/components/common/Avatar.tsx +++ b/src/features/Tasks/v1/components/common/Avatar.tsx @@ -13,9 +13,15 @@ interface AvatarProps { // Color map for initials fallback — derived from name char code const BG_COLORS = [ - "bg-indigo-500", "bg-pink-500", "bg-orange-500", - "bg-emerald-500", "bg-sky-500", "bg-violet-500", - "bg-rose-500", "bg-amber-500","bg-teal-500", + "bg-indigo-500", + "bg-pink-500", + "bg-orange-500", + "bg-emerald-500", + "bg-sky-500", + "bg-violet-500", + "bg-rose-500", + "bg-amber-500", + "bg-teal-500", ]; function getColor(name: string): string { @@ -24,31 +30,47 @@ function getColor(name: string): string { } function getInitials(name: string): string { - return name.split(" ").map(w => w[0]).join("").slice(0, 2).toUpperCase(); + return name + .split(" ") + .map((w) => w[0]) + .join("") + .slice(0, 2) + .toUpperCase(); } const SIZE_MAP = { - xs: { outer: "w-6 h-6", text: "text-[9px]", dot: "w-1.5 h-1.5 -right-0 -bottom-0", ring: "ring-1" }, - sm: { outer: "w-7 h-7", text: "text-[10px]", dot: "w-2 h-2 -right-0 -bottom-0", ring: "ring-2" }, - md: { outer: "w-9 h-9", text: "text-xs", dot: "w-2.5 h-2.5 right-0 bottom-0", ring: "ring-2" }, - lg: { outer: "w-12 h-12", text: "text-sm", dot: "w-3 h-3 right-0.5 bottom-0.5", ring: "ring-2" }, + xs: { + outer: "w-6 h-6", + text: "text-[9px]", + dot: "w-1.5 h-1.5 -right-0 -bottom-0", + ring: "ring-1", + }, + sm: { outer: "w-7 h-7", text: "text-[10px]", dot: "w-2 h-2 -right-0 -bottom-0", ring: "ring-2" }, + md: { outer: "w-9 h-9", text: "text-xs", dot: "w-2.5 h-2.5 right-0 bottom-0", ring: "ring-2" }, + lg: { outer: "w-12 h-12", text: "text-sm", dot: "w-3 h-3 right-0.5 bottom-0.5", ring: "ring-2" }, }; const STATUS_COLOR = { - online: "bg-emerald-400", + online: "bg-emerald-400", offline: "bg-gray-300", - busy: "bg-red-400", + busy: "bg-red-400", }; export default function Avatar({ - name, src, role, size = "sm", - showTooltip = true, status = null, ring = false, ringColor = "ring-[var(--cd-surface)]", + name, + src, + role, + size = "sm", + showTooltip = true, + status = null, + ring = false, + ringColor = "ring-[var(--cd-surface)]", }: AvatarProps) { const [imgError, setImgError] = useState(false); - const [hovered, setHovered] = useState(false); + const [hovered, setHovered] = useState(false); const sz = SIZE_MAP[size]; const initials = getInitials(name); - const bgColor = getColor(name); + const bgColor = getColor(name); return (
setHovered(false)} > {/* Avatar circle */} -
+ `} + > {!imgError ? ( ) : ( /* Initials fallback */ -
+
{initials}
)} @@ -111,7 +137,7 @@ interface AvatarGroupProps { } export function AvatarGroup({ members, max = 3, size = "sm" }: AvatarGroupProps) { - const visible = members.slice(0, max); + const visible = members.slice(0, max); const overflow = members.length - max; const sz = SIZE_MAP[size]; @@ -137,7 +163,9 @@ export function AvatarGroup({ members, max = 3, size = "sm" }: AvatarGroupProps) borderColor: "var(--cd-surface)", }} > - +{overflow} + + +{overflow} +
)}
diff --git a/src/features/Tasks/v1/components/common/CommentsSection.tsx b/src/features/Tasks/v1/components/common/CommentsSection.tsx index 5df2bb0..5eccfd0 100644 --- a/src/features/Tasks/v1/components/common/CommentsSection.tsx +++ b/src/features/Tasks/v1/components/common/CommentsSection.tsx @@ -3,7 +3,9 @@ import { formatDistanceToNow, parseISO } from "date-fns"; import { Loader2, MessageCircle, Send } from "lucide-react"; import { useComments, useAddComment } from "../../hooks/useComments"; -interface Props { taskId: string; } +interface Props { + taskId: string; +} export default function CommentsSection({ taskId }: Props) { const { data: comments = [], isLoading } = useComments(taskId); @@ -12,7 +14,10 @@ export default function CommentsSection({ taskId }: Props) { const [error, setError] = useState(""); const handleSubmit = async () => { - if (!text.trim()) { setError("Comment cannot be empty."); return; } + if (!text.trim()) { + setError("Comment cannot be empty."); + return; + } setError(""); await addComment.mutateAsync({ taskId, text: text.trim() }); setText(""); @@ -34,13 +39,19 @@ export default function CommentsSection({ taskId }: Props) {

Loading comments…

) : comments.length === 0 ? (
-

No comments yet. Be the first to start the conversation!

+

+ No comments yet. Be the first to start the conversation! +

) : (
{comments.map((c) => (
- {c.author} + {c.author}
{c.author} @@ -60,9 +71,15 @@ export default function CommentsSection({ taskId }: Props) {