From cb2bb71791800aab2e2ce2fe5cbba8962e635519 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Sat, 30 Dec 2023 19:21:33 +0100 Subject: [PATCH 001/136] moved nextjs designs to react --- tauri-app/components/MobileNavbar/index.css | 52 + tauri-app/components/MobileNavbar/index.tsx | 29 + tauri-app/components/Navbar/index.css | 110 + tauri-app/components/Navbar/index.tsx | 39 + tauri-app/index.html | 16 +- tauri-app/package-lock.json | 5855 ------------------- tauri-app/pnpm-lock.yaml | 4080 +++++++++++++ tauri-app/src/App.tsx | 28 +- tauri-app/src/index.css | 15 + tauri-app/src/main.tsx | 4 +- tauri-app/src/pages/Home/index.css | 52 + tauri-app/src/pages/Home/index.tsx | 32 + tauri-app/src/pages/SharedLayout/index.css | 0 tauri-app/src/pages/SharedLayout/index.tsx | 40 + 14 files changed, 4480 insertions(+), 5872 deletions(-) create mode 100644 tauri-app/components/MobileNavbar/index.css create mode 100644 tauri-app/components/MobileNavbar/index.tsx create mode 100644 tauri-app/components/Navbar/index.css create mode 100644 tauri-app/components/Navbar/index.tsx delete mode 100644 tauri-app/package-lock.json create mode 100644 tauri-app/pnpm-lock.yaml create mode 100644 tauri-app/src/index.css create mode 100644 tauri-app/src/pages/Home/index.css create mode 100644 tauri-app/src/pages/Home/index.tsx create mode 100644 tauri-app/src/pages/SharedLayout/index.css create mode 100644 tauri-app/src/pages/SharedLayout/index.tsx diff --git a/tauri-app/components/MobileNavbar/index.css b/tauri-app/components/MobileNavbar/index.css new file mode 100644 index 0000000..0bfe306 --- /dev/null +++ b/tauri-app/components/MobileNavbar/index.css @@ -0,0 +1,52 @@ +.mobile_menu { + width: 85%; + height: 50px; + padding: 10px; + border-radius: 5px; + box-shadow: 0 0px 4px rgba(0, 0, 0, 0.3); + position: fixed; + bottom: 35px; + left: 50%; + transform: translateX(-50%); + display: flex; + justify-content: space-around; + align-items: center; + background: var(--color-white); +} + +.menu_item { + font-size: 30px; + color: var(--color-blue); + position: relative; + text-align: center; +} + +.menu_item h3 { + font-size: 12px; + font-family: "Roboto"; + font-weight: 800; +} + +.menu_item span { + font-size: 10px; + background: var(--color-red); + color: var(--color-white); + padding: 2px 4px; + border-radius: 5px; + font-family: "Roboto"; + border: 2px solid var(--color-white); + position: absolute; + top: 0; +} + +.menu_item span:nth-child(1) { + right: -14px; +} + +.menu_item span:nth-child(2) { + right: -18px; +} + +.menu_item span:nth-child(3) { + right: 0px; +} diff --git a/tauri-app/components/MobileNavbar/index.tsx b/tauri-app/components/MobileNavbar/index.tsx new file mode 100644 index 0000000..58d1084 --- /dev/null +++ b/tauri-app/components/MobileNavbar/index.tsx @@ -0,0 +1,29 @@ +import "./index.css"; + +const index = () => { + return ( +
+
+ +

Home

+
+
+ +

Records

+ 35 +
+
+ + 28 +

Chats

+
+
+ +

DIY Remedies

+ 99+ +
+
+ ); +}; + +export default index; diff --git a/tauri-app/components/Navbar/index.css b/tauri-app/components/Navbar/index.css new file mode 100644 index 0000000..2834efc --- /dev/null +++ b/tauri-app/components/Navbar/index.css @@ -0,0 +1,110 @@ +.main_navbar_container { + padding: 20px 65px; + box-shadow: 0 0 3px 4px rgba(0, 0, 0, 0.1); + display: flex; + justify-content: space-between; + align-items: center; + position: sticky; + top: 0; + background: var(--color-white); + z-index: 5; +} + +.logo_container { + position: relative; +} + +.logo_container i:nth-child(1) { + font-size: 54px; + color: var(--color-blue); +} + +.logo_container i:nth-child(2) { + font-size: 15px; + position: absolute; + left: 12px; + top: 8px; + color: var(--color-white); +} + +.comp_menu_container { + display: flex; + justify-content: center; + align-items: center; +} + +.comp_menu_container div { + font-family: "Roboto"; + font-size: 14px; + margin: 0px 10px; + position: relative; + display: flex; + justify-content: space-between; + align-items: center; +} + +.comp_menu_container div i { + color: var(--color-blue); + margin-right: 4px; +} + +.comp_menu_container div span { + color: var(--color-white); + background: var(--color-red); + font-family: "Roboto"; + display: flex; + justify-content: center; + align-items: center; + border-radius: 5px; + font-size: 14px; + margin-left: 8px; + text-align: center; + padding: 2px 4px; +} + +.comp_menu_container div h3 { + color: var(--color-blue); + font-weight: 800; + transition: 0.3s; +} + +.comp_menu_container div h3:hover { + opacity: 1; +} + +.auth_container { + display: flex; + align-items: center; + justify-content: center; + width: max-content; +} + +.auth_container { + padding: 8px 20px; + padding-right: 8px; + border-radius: 28px; + background: var(--color-green); + box-shadow: var(--box-shadow-green); + color: var(--color-white); + font-family: "Roboto"; + cursor: pointer; + font-weight: 800; +} + +.auth_container i { + background: var(--color-white); + padding: 10px 12px; + border-radius: 50%; + color: var(--color-black); + margin-left: 10px; +} + +@media (max-width: 750px) { + .main_navbar_container { + padding: 15px 25px; + } + + .comp_menu_container { + display: none; + } +} diff --git a/tauri-app/components/Navbar/index.tsx b/tauri-app/components/Navbar/index.tsx new file mode 100644 index 0000000..e00f881 --- /dev/null +++ b/tauri-app/components/Navbar/index.tsx @@ -0,0 +1,39 @@ +import "./index.css"; + +const index = () => { + return ( +
+
+ + +
+
+
+ +

Home

+
+
+ +

Records

+ 28 +
+
+ +

Chats

+ 5 +
+
+ +

DIY Remedies

+ 99+ +
+
+
+

Join us!

+ +
+
+ ); +}; + +export default index; diff --git a/tauri-app/index.html b/tauri-app/index.html index 03abf55..36ecb79 100644 --- a/tauri-app/index.html +++ b/tauri-app/index.html @@ -4,7 +4,21 @@ - Tauri + React + TS + PulsePal + + + + + diff --git a/tauri-app/package-lock.json b/tauri-app/package-lock.json deleted file mode 100644 index 42b5c04..0000000 --- a/tauri-app/package-lock.json +++ /dev/null @@ -1,5855 +0,0 @@ -{ - "name": "tauri-app", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "tauri-app", - "version": "0.0.0", - "dependencies": { - "@hookform/resolvers": "^3.3.2", - "@radix-ui/react-avatar": "^1.0.4", - "@radix-ui/react-dropdown-menu": "^2.0.6", - "@radix-ui/react-label": "^2.0.2", - "@radix-ui/react-slot": "^1.0.2", - "@radix-ui/react-tabs": "^1.0.4", - "@tauri-apps/api": "^1.5.2", - "@web5/api": "^0.8.3", - "class-variance-authority": "^0.7.0", - "clsx": "^2.0.0", - "lucide-react": "^0.298.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-dropzone": "^14.2.3", - "react-easy-crop": "^5.0.4", - "react-hook-form": "^7.49.2", - "react-pdf": "^7.6.0", - "react-router-dom": "^6.21.1", - "react-spinners": "^0.13.8", - "react-virtualized-auto-sizer": "^1.0.20", - "react-window": "^1.8.10", - "tailwind-merge": "^2.1.0", - "tailwindcss-animate": "^1.0.7", - "zod": "^3.22.4", - "zustand": "^4.4.7" - }, - "devDependencies": { - "@tauri-apps/cli": "^1.5.7", - "@types/node": "^20.10.5", - "@types/react": "^18.2.15", - "@types/react-dom": "^18.2.7", - "@types/react-window": "^1.8.8", - "@vitejs/plugin-react": "^4.0.3", - "autoprefixer": "^10.4.16", - "postcss": "^8.4.32", - "tailwindcss": "^3.4.0", - "typescript": "^5.0.2", - "vite": "^4.4.4" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@assemblyscript/loader": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.9.4.tgz", - "integrity": "sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==" - }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz", - "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.6", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.6", - "@babel/types": "^7.23.6", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz", - "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.6", - "@babel/types": "^7.23.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", - "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz", - "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz", - "integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", - "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@decentralized-identity/ion-pow-sdk": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/@decentralized-identity/ion-pow-sdk/-/ion-pow-sdk-1.0.17.tgz", - "integrity": "sha512-vk7DTDM8aKDbFyu1ad/qkoRrGL4q+KvNeL/FNZXhkWPaDhVExBN/qGEoRLf1YSfFe+myto3+4RYTPut+riiqnw==", - "dependencies": { - "buffer": "6.0.3", - "cross-fetch": "3.1.5", - "hash-wasm": "4.9.0" - } - }, - "node_modules/@decentralized-identity/ion-pow-sdk/node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dependencies": { - "node-fetch": "2.6.7" - } - }, - "node_modules/@decentralized-identity/ion-pow-sdk/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@decentralized-identity/ion-sdk": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@decentralized-identity/ion-sdk/-/ion-sdk-1.0.1.tgz", - "integrity": "sha512-+P+DXcRSFjsEsI5KIqUmVjpzgUT28B2lWpTO+IxiBcfibAN/1Sg20NebGTO/+serz2CnSZf95N2a1OZ6eXypGQ==", - "dependencies": { - "@noble/ed25519": "^2.0.0", - "@noble/secp256k1": "^2.0.0", - "canonicalize": "^2.0.0", - "multiformats": "^12.0.1", - "multihashes": "^4.0.3", - "uri-js": "^4.4.1" - } - }, - "node_modules/@decentralized-identity/ion-sdk/node_modules/multiformats": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz", - "integrity": "sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.2.tgz", - "integrity": "sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==", - "dependencies": { - "@floating-ui/utils": "^0.1.3" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", - "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", - "dependencies": { - "@floating-ui/core": "^1.4.2", - "@floating-ui/utils": "^0.1.3" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.4.tgz", - "integrity": "sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==", - "dependencies": { - "@floating-ui/dom": "^1.5.1" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", - "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" - }, - "node_modules/@hookform/resolvers": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.3.2.tgz", - "integrity": "sha512-Tw+GGPnBp+5DOsSg4ek3LCPgkBOuOgS5DsDV7qsWNH9LZc433kgsWICjlsh2J9p04H2K66hsXPPb9qn9ILdUtA==", - "peerDependencies": { - "react-hook-form": "^7.0.0" - } - }, - "node_modules/@ipld/dag-cbor": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@ipld/dag-cbor/-/dag-cbor-9.0.3.tgz", - "integrity": "sha512-A2UFccS0+sARK9xwXiVZIaWbLbPxLGP3UZOjBeOMWfDY04SXi8h1+t4rHBzOlKYF/yWNm3RbFLyclWO7hZcy4g==", - "dependencies": { - "cborg": "^2.0.1", - "multiformats": "^12.0.1" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@ipld/dag-cbor/node_modules/multiformats": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz", - "integrity": "sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@ipld/dag-pb": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@ipld/dag-pb/-/dag-pb-4.0.6.tgz", - "integrity": "sha512-wOij3jfDKZsb9yjhQeHp+TQy0pu1vmUkGv324xciFFZ7xGbDfAGTQW03lSA5aJ/7HBBNYgjEE0nvHmNW1Qjfag==", - "dependencies": { - "multiformats": "^12.0.1" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@ipld/dag-pb/node_modules/multiformats": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz", - "integrity": "sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@js-temporal/polyfill": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@js-temporal/polyfill/-/polyfill-0.4.4.tgz", - "integrity": "sha512-2X6bvghJ/JAoZO52lbgyAPFj8uCflhTo2g7nkFzEQdXd/D8rEeD4HtmTEpmtGCva260fcd66YNXBOYdnmHqSOg==", - "dependencies": { - "jsbi": "^4.3.0", - "tslib": "^2.4.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" - }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "optional": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true - }, - "node_modules/@multiformats/base-x": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/base-x/-/base-x-4.0.1.tgz", - "integrity": "sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==" - }, - "node_modules/@multiformats/murmur3": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@multiformats/murmur3/-/murmur3-2.1.7.tgz", - "integrity": "sha512-Yf0UpAaONjed+8PTt5NM/GG4Z4Ai4m1qfT7bqevjnkwRQ12K+0jxtRomirz+VJx4PokpA2St1ZSD1iMkZTqPRQ==", - "dependencies": { - "multiformats": "^12.0.1", - "murmurhash3js-revisited": "^3.0.0" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@multiformats/murmur3/node_modules/multiformats": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz", - "integrity": "sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@noble/ciphers": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.1.4.tgz", - "integrity": "sha512-d3ZR8vGSpy3v/nllS+bD/OMN5UZqusWiQqkyj7AwzTnhXFH72pF5oB4Ach6DQ50g5kXxC28LdaYBEpsyv9KOUQ==", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/curves": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", - "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", - "dependencies": { - "@noble/hashes": "1.3.1" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/ed25519": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-2.0.0.tgz", - "integrity": "sha512-/extjhkwFupyopDrt80OMWKdLgP429qLZj+z6sYJz90rF2Iz0gjZh2ArMKPImUl13Kx+0EXI2hN9T/KJV0/Zng==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@noble/hashes": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", - "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/secp256k1": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-2.0.0.tgz", - "integrity": "sha512-rUGBd95e2a45rlmFTqQJYEFA4/gdIARFfuTuTqLglz0PZ6AKyzyXsEZZq7UZn8hZsvaBgpCzKKBJizT2cJERXw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@radix-ui/primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz", - "integrity": "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==", - "dependencies": { - "@babel/runtime": "^7.13.10" - } - }, - "node_modules/@radix-ui/react-arrow": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz", - "integrity": "sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-avatar": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.0.4.tgz", - "integrity": "sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collection": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz", - "integrity": "sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-slot": "1.0.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz", - "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz", - "integrity": "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-direction": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.1.tgz", - "integrity": "sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz", - "integrity": "sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-escape-keydown": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.0.6.tgz", - "integrity": "sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-menu": "2.0.6", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-controllable-state": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz", - "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-scope": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.4.tgz", - "integrity": "sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-id": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz", - "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-layout-effect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-label": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.0.2.tgz", - "integrity": "sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.0.6.tgz", - "integrity": "sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-collection": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.5", - "@radix-ui/react-focus-guards": "1.0.1", - "@radix-ui/react-focus-scope": "1.0.4", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-popper": "1.1.3", - "@radix-ui/react-portal": "1.0.4", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-roving-focus": "1.0.4", - "@radix-ui/react-slot": "1.0.2", - "@radix-ui/react-use-callback-ref": "1.0.1", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popper": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.3.tgz", - "integrity": "sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1", - "@radix-ui/react-use-rect": "1.0.1", - "@radix-ui/react-use-size": "1.0.1", - "@radix-ui/rect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-portal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.4.tgz", - "integrity": "sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-presence": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.1.tgz", - "integrity": "sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-primitive": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", - "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-slot": "1.0.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-roving-focus": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz", - "integrity": "sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-collection": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-controllable-state": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slot": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", - "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.0.4.tgz", - "integrity": "sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-roving-focus": "1.0.4", - "@radix-ui/react-use-controllable-state": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz", - "integrity": "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz", - "integrity": "sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz", - "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz", - "integrity": "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-rect": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz", - "integrity": "sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/rect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-size": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz", - "integrity": "sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-layout-effect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/rect": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.1.tgz", - "integrity": "sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==", - "dependencies": { - "@babel/runtime": "^7.13.10" - } - }, - "node_modules/@remix-run/router": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.14.1.tgz", - "integrity": "sha512-Qg4DMQsfPNAs88rb2xkdk03N3bjK4jgX5fR24eHCTR9q6PrhZQZ4UJBPzCHJkIpTRN1UKxx2DzjZmnC+7Lj0Ow==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@tauri-apps/api": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-1.5.2.tgz", - "integrity": "sha512-tZK3XJiIUnUdHN7rGqA+j57dvT3/7z2bEiPfWmO3uAymv2JMBJrfGwbyDWLjGue37UVhh0gLYSkA9wV+/bASwA==", - "engines": { - "node": ">= 14.6.0", - "npm": ">= 6.6.0", - "yarn": ">= 1.19.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/tauri" - } - }, - "node_modules/@tauri-apps/cli": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-1.5.8.tgz", - "integrity": "sha512-c/mzk5vjjfxtH5uNXSc9h1eiprsolnoBcUwAa4/SZ3gxJ176CwrUKODz3cZBOnzs8omwagwgSN/j7K8NrdFL9g==", - "dev": true, - "bin": { - "tauri": "tauri.js" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/tauri" - }, - "optionalDependencies": { - "@tauri-apps/cli-darwin-arm64": "1.5.8", - "@tauri-apps/cli-darwin-x64": "1.5.8", - "@tauri-apps/cli-linux-arm-gnueabihf": "1.5.8", - "@tauri-apps/cli-linux-arm64-gnu": "1.5.8", - "@tauri-apps/cli-linux-arm64-musl": "1.5.8", - "@tauri-apps/cli-linux-x64-gnu": "1.5.8", - "@tauri-apps/cli-linux-x64-musl": "1.5.8", - "@tauri-apps/cli-win32-arm64-msvc": "1.5.8", - "@tauri-apps/cli-win32-ia32-msvc": "1.5.8", - "@tauri-apps/cli-win32-x64-msvc": "1.5.8" - } - }, - "node_modules/@tauri-apps/cli-darwin-arm64": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.5.8.tgz", - "integrity": "sha512-/AksDWfAt3NUSt8Rq2a3gTLASChKzldPVUjmJhcbtsuzFg2nx5g+hhOHxfBYzss2Te1K5mzlu+73LAMy1Sb9Gw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tauri-apps/cli-darwin-x64": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.5.8.tgz", - "integrity": "sha512-gcfSh+BFRDdbIGpggZ1+5R5SgToz2A9LthH8P4ak3OHagDzDvI6ov6zy2UQE3XDWJKdnlna2rSR1dIuRZ0T9bA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.5.8.tgz", - "integrity": "sha512-ZHQYuOBGvZubPnh5n8bNaN2VMxPBZWs26960FGQWamm9569UV/TNDHb6mD0Jjk9o0f9P+f98qNhuu5Y37P+vfQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tauri-apps/cli-linux-arm64-gnu": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.5.8.tgz", - "integrity": "sha512-FFs28Ew3R2EFPYKuyAIouTbp6YnR+shAmJGFNnVy7ibKHL0wxamVKqv1N5N9gUUr+EhbZu2syMBRfG9XQ5mgng==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tauri-apps/cli-linux-arm64-musl": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.5.8.tgz", - "integrity": "sha512-dEYvNyLMmWD0jb30FNfVPXmBq6OGg6is3km+4RlGg8tZU5Zvq78ClUZtaZuER+N/hv27+Uc6UHl9X3hin8cGGw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tauri-apps/cli-linux-x64-gnu": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.5.8.tgz", - "integrity": "sha512-ut3TDbtLXmZhz6Q4wim57PV02wG+AfuLSWRPhTL9MsPsg/E7Y6sJhv0bIMAq6SwC59RCH52ZGft6RH7samV2NQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tauri-apps/cli-linux-x64-musl": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.5.8.tgz", - "integrity": "sha512-k6ei7ETXVZlNpFOhl/8Cnj709UbEr+VuY9xKK/HgwvNfjA5f8HQ9TSKk/Um7oeT1Y61/eEcvcgF/hDURhFJDPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tauri-apps/cli-win32-arm64-msvc": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-1.5.8.tgz", - "integrity": "sha512-l6zm31x1inkS2K5e7otUZ90XBoK+xr2KJObFCZbzmluBE+LM0fgIXCrj7xwH/f0RCUX3VY9HHx4EIo7eLGBXKQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tauri-apps/cli-win32-ia32-msvc": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.5.8.tgz", - "integrity": "sha512-0k3YpWl6PKV4Qp2N52Sb45egXafSgQXcBaO7TIJG4EDfaEf5f6StN+hYSzdnrq9idrK5x9DDCPuebZTuJ+Q8EA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tauri-apps/cli-win32-x64-msvc": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.5.8.tgz", - "integrity": "sha512-XjBg8VMswmD9JAHKlb10NRPfBVAZoiOJBbPRte+GP1BUQtqDnbIYcOLSnUCmNZoy3fUBJuKJUBT9tDCbkMr5fQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tbd54566975/dwn-sdk-js": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@tbd54566975/dwn-sdk-js/-/dwn-sdk-js-0.2.8.tgz", - "integrity": "sha512-oiKk+ekAQO94bUkt6yk+xkDY8uCGmNC+rKaYQLhAoTrhYrczeRSuDT04F5/vPBT5K6NfAoRcQsIyBmvgRCUvgA==", - "dependencies": { - "@ipld/dag-cbor": "9.0.3", - "@js-temporal/polyfill": "0.4.4", - "@noble/ed25519": "2.0.0", - "@noble/secp256k1": "2.0.0", - "abstract-level": "1.0.3", - "ajv": "8.12.0", - "blockstore-core": "4.2.0", - "cross-fetch": "4.0.0", - "eciesjs": "0.4.5", - "flat": "5.0.2", - "interface-blockstore": "5.2.3", - "interface-store": "5.1.2", - "ipfs-unixfs-exporter": "13.1.5", - "ipfs-unixfs-importer": "15.1.5", - "level": "8.0.0", - "lodash": "4.17.21", - "lru-cache": "9.1.2", - "ms": "2.1.3", - "multiformats": "11.0.2", - "randombytes": "2.1.0", - "readable-stream": "4.4.2", - "ulidx": "2.1.0", - "uuid": "8.3.2", - "varint": "6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@tbd54566975/dwn-sdk-js/node_modules/lru-cache": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz", - "integrity": "sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/@tbd54566975/dwn-sdk-js/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.7", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", - "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", - "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/node": { - "version": "20.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", - "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", - "devOptional": true - }, - "node_modules/@types/react": { - "version": "18.2.45", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.45.tgz", - "integrity": "sha512-TtAxCNrlrBp8GoeEp1npd5g+d/OejJHFxS3OWmrPBMFaVQMSN0OFySozJio5BHxTuTeug00AVXVAjfDSfk+lUg==", - "devOptional": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.2.17", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.17.tgz", - "integrity": "sha512-rvrT/M7Df5eykWFxn6MYt5Pem/Dbyc1N8Y0S9Mrkw2WFCRiqUgw9P7ul2NpwsXCSM1DVdENzdG9J5SreqfAIWg==", - "devOptional": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-window": { - "version": "1.8.8", - "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.8.tgz", - "integrity": "sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", - "devOptional": true - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", - "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.23.5", - "@babel/plugin-transform-react-jsx-self": "^7.23.3", - "@babel/plugin-transform-react-jsx-source": "^7.23.3", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0" - } - }, - "node_modules/@web5/agent": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@web5/agent/-/agent-0.2.5.tgz", - "integrity": "sha512-Z9JY/43Yrg0xKK26y/iZFdHNtVf/k9XLxw8mXP5zfYidrqfAgVR0i4LKA7qZKfUSxC7/uaD/STYYIKpNByd/cw==", - "dependencies": { - "@tbd54566975/dwn-sdk-js": "0.2.8", - "@web5/common": "0.2.2", - "@web5/crypto": "0.2.2", - "@web5/dids": "0.2.3", - "level": "8.0.0", - "readable-stream": "4.4.2", - "readable-web-to-node-stream": "3.0.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/api": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@web5/api/-/api-0.8.3.tgz", - "integrity": "sha512-YXQ++ZShtd5LeFRqEMGlhVqJ7Zg5P6bMequpaLl068bCGjtjCwiFFgDtM1KeL36IAzQ4pFLFyj9aTGZ/JgCXHA==", - "dependencies": { - "@tbd54566975/dwn-sdk-js": "0.2.8", - "@web5/agent": "0.2.5", - "@web5/common": "0.2.2", - "@web5/crypto": "0.2.2", - "@web5/dids": "0.2.3", - "@web5/user-agent": "0.2.5", - "level": "8.0.0", - "ms": "2.1.3", - "readable-stream": "4.4.2", - "readable-web-to-node-stream": "3.0.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/api/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/@web5/common": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@web5/common/-/common-0.2.2.tgz", - "integrity": "sha512-dRn6SmALExeTLMTK/W5ozGarfaddK+Lraf5OjuIGLAaLfcX1RWx3oDMoY5Hr9LjfxHJC8mGXB8DnKflbeYJRgA==", - "dependencies": { - "level": "8.0.0", - "multiformats": "11.0.2", - "readable-stream": "4.4.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/crypto": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@web5/crypto/-/crypto-0.2.2.tgz", - "integrity": "sha512-vHFg0wXQSQXrwuBNQyDHnmSZchfTfO6/Sv+7rDsNkvofs+6lGTE8CZ02cwUYMeIwTRMLer12c+fMfzYrXokEUQ==", - "dependencies": { - "@noble/ciphers": "0.1.4", - "@noble/curves": "1.1.0", - "@noble/hashes": "1.3.1", - "@web5/common": "0.2.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/crypto/node_modules/@web5/common": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@web5/common/-/common-0.2.1.tgz", - "integrity": "sha512-Tt5P17HgQCx+Epw0IHnhRKqp5UU3E4xtsE8PkdghOBnvntBB0op5P6efvR1WqmJft5+VunDHt3yZAZstuqQkNg==", - "dependencies": { - "level": "8.0.0", - "multiformats": "11.0.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/dids": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@web5/dids/-/dids-0.2.3.tgz", - "integrity": "sha512-Y3PHOavNkSyjBxZQEpKE6XueaqemBO5w0UMOnFh4xH6+5B43ENEE4LHIqVyn2bCpfEBGLXENgDZYqyJphBu0pA==", - "dependencies": { - "@decentralized-identity/ion-pow-sdk": "1.0.17", - "@decentralized-identity/ion-sdk": "1.0.1", - "@web5/common": "0.2.2", - "@web5/crypto": "0.2.2", - "did-resolver": "4.1.0", - "dns-packet": "5.6.1", - "level": "8.0.0", - "ms": "2.1.3", - "pkarr": "1.1.1", - "z32": "1.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/dids/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/@web5/user-agent": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@web5/user-agent/-/user-agent-0.2.5.tgz", - "integrity": "sha512-qv5M698C5HSvq30xUgLWtcsbZppjfOH5qZthpTRx4ItL5UWA/eQ9DsQiQeb4vet3uIUy3NHRDIQezclOdwYErw==", - "dependencies": { - "@web5/agent": "0.2.5", - "@web5/common": "0.2.2", - "@web5/crypto": "0.2.2", - "@web5/dids": "0.2.3" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "optional": true - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/abstract-level": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", - "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", - "dependencies": { - "buffer": "^6.0.3", - "catering": "^2.1.0", - "is-buffer": "^2.0.5", - "level-supports": "^4.0.0", - "level-transcoder": "^1.0.1", - "module-error": "^1.0.1", - "queue-microtask": "^1.2.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "optional": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "optional": true - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "optional": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "node_modules/aria-hidden": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", - "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/attr-accept": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", - "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/b4a": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bencode": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bencode/-/bencode-3.1.1.tgz", - "integrity": "sha512-btsxX9201yoWh45TdqYg6+OZ5O1xTYKTYSGvJndICDFtznE/9zXgow8yjMvvhOqKKuzuL7h+iiCMpfkG8+QuBA==", - "dependencies": { - "uint8-util": "^2.1.6" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/bittorrent-dht": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/bittorrent-dht/-/bittorrent-dht-11.0.5.tgz", - "integrity": "sha512-R09D6uNaziRqsc+B/j5QzkjceTak+wH9vcNLnkmt8A52EWF9lQwBP0vvCKgSA3AJOYYl+41n3osA2KYYn/z5uQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "bencode": "^4.0.0", - "debug": "^4.3.4", - "k-bucket": "^5.1.0", - "k-rpc": "^5.1.0", - "last-one-wins": "^1.0.4", - "lru": "^3.1.0", - "randombytes": "^2.1.0", - "record-cache": "^1.2.0" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/bittorrent-dht/node_modules/bencode": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/bencode/-/bencode-4.0.0.tgz", - "integrity": "sha512-AERXw18df0pF3ziGOCyUjqKZBVNH8HV3lBxnx5w0qtgMIk4a1wb9BkcCQbkp9Zstfrn/dzRwl7MmUHHocX3sRQ==", - "dependencies": { - "uint8-util": "^2.2.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/blake2b": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.4.tgz", - "integrity": "sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A==", - "dependencies": { - "blake2b-wasm": "^2.4.0", - "nanoassert": "^2.0.0" - } - }, - "node_modules/blake2b-wasm": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz", - "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==", - "dependencies": { - "b4a": "^1.0.1", - "nanoassert": "^2.0.0" - } - }, - "node_modules/blockstore-core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/blockstore-core/-/blockstore-core-4.2.0.tgz", - "integrity": "sha512-F8BCobc75D+9/+hUD+5cixbU6zmZA+lBgNiuBkNlJqRgmAaBBvLOQF6Ad9Jei0Nvmy2a1jaF4CiN76W1apIghA==", - "dependencies": { - "err-code": "^3.0.1", - "interface-blockstore": "^5.0.0", - "interface-store": "^5.0.0", - "multiformats": "^11.0.2" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-level": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", - "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.1", - "module-error": "^1.0.2", - "run-parallel-limit": "^1.1.0" - } - }, - "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001570", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz", - "integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/canonicalize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/canonicalize/-/canonicalize-2.0.0.tgz", - "integrity": "sha512-ulDEYPv7asdKvqahuAY35c1selLdzDwHqugK92hfkzvlDCwXRRelDkR+Er33md/PtnpqHemgkuDPanZ4fiYZ8w==" - }, - "node_modules/canvas": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", - "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.0", - "nan": "^2.17.0", - "simple-get": "^3.0.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/catering": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cborg": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cborg/-/cborg-2.0.5.tgz", - "integrity": "sha512-xVW1rSIw1ZXbkwl2XhJ7o/jAv0vnVoQv/QlfQxV8a7V5PlA4UU/AcIiXqmpyybwNWy/GPQU1m/aBVNIWr7/T0w==", - "bin": { - "cborg": "cli.js" - } - }, - "node_modules/chacha20-universal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chacha20-universal/-/chacha20-universal-1.0.4.tgz", - "integrity": "sha512-/IOxdWWNa7nRabfe7+oF+jVkGjlr2xUL4J8l/OvzZhj+c9RpMqoo3Dq+5nU1j/BflRV4BKnaQ4+4oH1yBpQG1Q==", - "dependencies": { - "nanoassert": "^2.0.0" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "optional": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chrome-dgram": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/chrome-dgram/-/chrome-dgram-3.0.6.tgz", - "integrity": "sha512-bqBsUuaOiXiqxXt/zA/jukNJJ4oaOtc7ciwqJpZVEaaXwwxqgI2/ZdG02vXYWUhHGziDlvGMQWk0qObgJwVYKA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "inherits": "^2.0.4", - "run-series": "^1.1.9" - } - }, - "node_modules/chrome-dns": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chrome-dns/-/chrome-dns-1.0.1.tgz", - "integrity": "sha512-HqsYJgIc8ljJJOqOzLphjAs79EUuWSX3nzZi2LNkzlw3GIzAeZbaSektC8iT/tKvLqZq8yl1GJu5o6doA4TRbg==", - "dependencies": { - "chrome-net": "^3.3.2" - } - }, - "node_modules/chrome-net": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/chrome-net/-/chrome-net-3.3.4.tgz", - "integrity": "sha512-Jzy2EnzmE+ligqIZUsmWnck9RBXLuUy6CaKyuNMtowFG3ZvLt8d+WBJCTPEludV0DHpIKjAOlwjFmTaEdfdWCw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "inherits": "^2.0.1" - } - }, - "node_modules/class-variance-authority": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz", - "integrity": "sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==", - "dependencies": { - "clsx": "2.0.0" - }, - "funding": { - "url": "https://joebell.co.uk" - } - }, - "node_modules/classic-level": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", - "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", - "hasInstallScript": true, - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.0", - "module-error": "^1.0.1", - "napi-macros": "^2.2.2", - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clsx": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", - "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "optional": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "optional": true - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "devOptional": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "optional": true, - "dependencies": { - "mimic-response": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "optional": true - }, - "node_modules/detect-libc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" - }, - "node_modules/did-resolver": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/did-resolver/-/did-resolver-4.1.0.tgz", - "integrity": "sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA==" - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eciesjs": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.5.tgz", - "integrity": "sha512-2zSRIygO48LpdS95Rwt9ryIkJNO37IdbkjRsnYyAn7gx7e4WPBNimnk6jGNdx2QQYr/VJRPnSVdwQpO5bycYZw==", - "dependencies": { - "@noble/ciphers": "^0.3.0", - "@noble/curves": "^1.2.0", - "@noble/hashes": "^1.3.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/eciesjs/node_modules/@noble/ciphers": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.3.0.tgz", - "integrity": "sha512-ldbrnOjmNRwFdXcTM6uXDcxpMIFrbzAWNnpBPp4oTJTFF0XByGD6vf45WrehZGXRQTRVV+Zm8YP+EgEf+e4cWA==", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/eciesjs/node_modules/@noble/curves": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz", - "integrity": "sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==", - "dependencies": { - "@noble/hashes": "1.3.3" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/eciesjs/node_modules/@noble/hashes": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", - "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.614", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.614.tgz", - "integrity": "sha512-X4ze/9Sc3QWs6h92yerwqv7aB/uU8vCjZcrMjA8N9R1pjMFRe44dLsck5FzLilOYvcXuDn93B+bpGYyufc70gQ==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "optional": true - }, - "node_modules/err-code": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", - "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==" - }, - "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-selector": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz", - "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==", - "dependencies": { - "tslib": "^2.4.0" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "bin": { - "flat": "cli.js" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs-minipass/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "optional": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-nonce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-goodbye": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/graceful-goodbye/-/graceful-goodbye-1.3.0.tgz", - "integrity": "sha512-hcZOs20emYlTM7MmUE0FpuZcjlk2GPsR+UYTHDeWxtGjXcbh2CawGi8vlzqsIvspqAbot7mRv3sC/uhgtKc4hQ==", - "dependencies": { - "safety-catch": "^1.0.2" - } - }, - "node_modules/hamt-sharding": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/hamt-sharding/-/hamt-sharding-3.0.2.tgz", - "integrity": "sha512-f0DzBD2tSmLFdFsLAvOflIBqFPjerbA7BfmwO8mVho/5hXwgyyYhv+ijIzidQf/DpDX3bRjAQvhGoBFj+DBvPw==", - "dependencies": { - "sparse-array": "^1.3.1", - "uint8arrays": "^4.0.2" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "optional": true - }, - "node_modules/hash-wasm": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/hash-wasm/-/hash-wasm-4.9.0.tgz", - "integrity": "sha512-7SW7ejyfnRxuOc7ptQHSf4LDoZaWOivfzqw+5rpcQku0nHfmicPKE51ra9BiRLAmT8+gGLestr1XroUkqdjL6w==" - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "optional": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/interface-blockstore": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/interface-blockstore/-/interface-blockstore-5.2.3.tgz", - "integrity": "sha512-15cN+ZFdcVXdXo6I/SrSzFDsuJyDTyEI52XuvXQlR/G5fe3cK8p0tvVjfu5diRQH1XqNgmJEdMPixyt0xgjtvQ==", - "dependencies": { - "interface-store": "^5.0.0", - "multiformats": "^11.0.2" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/interface-store": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/interface-store/-/interface-store-5.1.2.tgz", - "integrity": "sha512-q2sLoqC+UdaWnjwGyghsH0jwqqVk226lsG207e3QwPB8sAZYmYIWUnJwJH3JjFNNRV9e6CUTmm+gDO0Xg4KRiw==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ipfs-unixfs": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-11.1.0.tgz", - "integrity": "sha512-Lq37nKLJOpRFjx3rcg3y+ZwUxBX7jluKfIt5UPp6wb1L3dP0sj1yaLR0Yg2CdGYvHWyUpZD1iTnT8upL0ToDOw==", - "dependencies": { - "err-code": "^3.0.1", - "protons-runtime": "^5.0.0", - "uint8arraylist": "^2.4.3" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/ipfs-unixfs-exporter": { - "version": "13.1.5", - "resolved": "https://registry.npmjs.org/ipfs-unixfs-exporter/-/ipfs-unixfs-exporter-13.1.5.tgz", - "integrity": "sha512-O5aMawsHoe4DaYk5FFil2EPrNOaU3pkHC6qUR5JMnW7es93W3b/RjJoO7AyDL1rpb+M3K0oRu86Yc5wLNQQ8jg==", - "dependencies": { - "@ipld/dag-cbor": "^9.0.0", - "@ipld/dag-pb": "^4.0.0", - "@multiformats/murmur3": "^2.0.0", - "err-code": "^3.0.1", - "hamt-sharding": "^3.0.0", - "interface-blockstore": "^5.0.0", - "ipfs-unixfs": "^11.0.0", - "it-filter": "^3.0.2", - "it-last": "^3.0.2", - "it-map": "^3.0.3", - "it-parallel": "^3.0.0", - "it-pipe": "^3.0.1", - "it-pushable": "^3.1.0", - "multiformats": "^11.0.0", - "p-queue": "^7.3.0", - "progress-events": "^1.0.0", - "uint8arrays": "^4.0.2" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/ipfs-unixfs-importer": { - "version": "15.1.5", - "resolved": "https://registry.npmjs.org/ipfs-unixfs-importer/-/ipfs-unixfs-importer-15.1.5.tgz", - "integrity": "sha512-TXaOI0M5KNpq2+qLw8AIYd0Lnc0gWTKCBqUd9eErBUwaP3Fna4qauF+JX9Rj2UrwaOvG/1xbF8Vm+92eOcKWMA==", - "dependencies": { - "@ipld/dag-pb": "^4.0.0", - "@multiformats/murmur3": "^2.0.0", - "err-code": "^3.0.1", - "hamt-sharding": "^3.0.0", - "interface-blockstore": "^5.0.0", - "interface-store": "^5.0.1", - "ipfs-unixfs": "^11.0.0", - "it-all": "^3.0.2", - "it-batch": "^3.0.2", - "it-first": "^3.0.2", - "it-parallel-batch": "^3.0.1", - "multiformats": "^11.0.0", - "progress-events": "^1.0.0", - "rabin-wasm": "^0.1.4", - "uint8arraylist": "^2.4.3", - "uint8arrays": "^4.0.2" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/it-all": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/it-all/-/it-all-3.0.4.tgz", - "integrity": "sha512-UMiy0i9DqCHBdWvMbzdYvVGa5/w4t1cc4nchpbnjdLhklglv8mQeEYnii0gvKESJuL1zV32Cqdb33R6/GPfxpQ==" - }, - "node_modules/it-batch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/it-batch/-/it-batch-3.0.4.tgz", - "integrity": "sha512-WRu2mqOYIs+T9k7+yxSK9VJdk0UE4R0jKQsWQcti5c6vhb1FhjC2+yCB5XBrctQ9edNfCMU/wVzdDj8qSwimbA==" - }, - "node_modules/it-filter": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/it-filter/-/it-filter-3.0.4.tgz", - "integrity": "sha512-e0sz+st4sudK/zH6GZ/gRTRP8A/ADuJFCYDmRgMbZvR79y5+v4ZXav850bBZk5wL9zXaYZFxS1v/6Qi+Vjwh5g==", - "dependencies": { - "it-peekable": "^3.0.0" - } - }, - "node_modules/it-first": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/it-first/-/it-first-3.0.4.tgz", - "integrity": "sha512-FtQl84iTNxN5EItP/JgL28V2rzNMkCzTUlNoj41eVdfix2z1DBuLnBqZ0hzYhGGa1rMpbQf0M7CQSA2adlrLJg==" - }, - "node_modules/it-last": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/it-last/-/it-last-3.0.4.tgz", - "integrity": "sha512-Ns+KTsQWhs0KCvfv5X3Ck3lpoYxHcp4zUp4d+AOdmC8cXXqDuoZqAjfWhgCbxJubXyIYWdfE2nRcfWqgvZHP8Q==" - }, - "node_modules/it-map": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/it-map/-/it-map-3.0.5.tgz", - "integrity": "sha512-hB0TDXo/h4KSJJDSRLgAPmDroiXP6Fx1ck4Bzl3US9hHfZweTKsuiP0y4gXuTMcJlS6vj0bb+f70rhkD47ZA3w==", - "dependencies": { - "it-peekable": "^3.0.0" - } - }, - "node_modules/it-merge": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/it-merge/-/it-merge-3.0.3.tgz", - "integrity": "sha512-FYVU15KC5pb/GQX1Ims+lee8d4pdqGVCpWr0lkNj8o4xuNo7jY71k6GuEiWdP+T7W1bJqewSxX5yoTy5yZpRVA==", - "dependencies": { - "it-pushable": "^3.2.0" - } - }, - "node_modules/it-parallel": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/it-parallel/-/it-parallel-3.0.6.tgz", - "integrity": "sha512-i7UM7I9LTkDJw3YIqXHFAPZX6CWYzGc+X3irdNrVExI4vPazrJdI7t5OqrSVN8CONXLAunCiqaSV/zZRbQR56A==", - "dependencies": { - "p-defer": "^4.0.0" - } - }, - "node_modules/it-parallel-batch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/it-parallel-batch/-/it-parallel-batch-3.0.4.tgz", - "integrity": "sha512-O1omh8ss8+UtXiMjE+8kM5C20DT0Ma4VtKVfrSHOJU0UHZ+iWBXarabzPYEp+WiuQmrv+klDPPlTZ9KaLN9xOA==", - "dependencies": { - "it-batch": "^3.0.0" - } - }, - "node_modules/it-peekable": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/it-peekable/-/it-peekable-3.0.3.tgz", - "integrity": "sha512-Wx21JX/rMzTEl9flx3DGHuPV1KQFGOl8uoKfQtmZHgPQtGb89eQ6RyVd82h3HuP9Ghpt0WgBDlmmdWeHXqyx7w==" - }, - "node_modules/it-pipe": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/it-pipe/-/it-pipe-3.0.1.tgz", - "integrity": "sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==", - "dependencies": { - "it-merge": "^3.0.0", - "it-pushable": "^3.1.2", - "it-stream-types": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/it-pushable": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.2.3.tgz", - "integrity": "sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==", - "dependencies": { - "p-defer": "^4.0.0" - } - }, - "node_modules/it-stream-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.1.tgz", - "integrity": "sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/jsbi": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-4.3.0.tgz", - "integrity": "sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==" - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/k-bucket": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/k-bucket/-/k-bucket-5.1.0.tgz", - "integrity": "sha512-Fac7iINEovXIWU20GPnOMLUbjctiS+cnmyjC4zAUgvs3XPf1vo9akfCHkigftSic/jiKqKl+KA3a/vFcJbHyCg==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/k-rpc": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/k-rpc/-/k-rpc-5.1.0.tgz", - "integrity": "sha512-FGc+n70Hcjoa/X2JTwP+jMIOpBz+pkRffHnSl9yrYiwUxg3FIgD50+u1ePfJUOnRCnx6pbjmVk5aAeB1wIijuQ==", - "dependencies": { - "k-bucket": "^5.0.0", - "k-rpc-socket": "^1.7.2", - "randombytes": "^2.0.5" - } - }, - "node_modules/k-rpc-socket": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/k-rpc-socket/-/k-rpc-socket-1.11.1.tgz", - "integrity": "sha512-8xtA8oqbZ6v1Niryp2/g4GxW16EQh5MvrUylQoOG+zcrDff5CKttON2XUXvMwlIHq4/2zfPVFiinAccJ+WhxoA==", - "dependencies": { - "bencode": "^2.0.0", - "chrome-dgram": "^3.0.2", - "chrome-dns": "^1.0.0", - "chrome-net": "^3.3.2" - } - }, - "node_modules/k-rpc-socket/node_modules/bencode": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/bencode/-/bencode-2.0.3.tgz", - "integrity": "sha512-D/vrAD4dLVX23NalHwb8dSvsUsxeRPO8Y7ToKA015JQYq69MLDOMkC0uGZYA/MPpltLO8rt8eqFC2j8DxjTZ/w==" - }, - "node_modules/last-one-wins": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/last-one-wins/-/last-one-wins-1.0.4.tgz", - "integrity": "sha512-t+KLJFkHPQk8lfN6WBOiGkiUXoub+gnb2XTYI2P3aiISL+94xgZ1vgz1SXN/N4hthuOoLXarXfBZPUruyjQtfA==" - }, - "node_modules/layerr": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/layerr/-/layerr-2.0.1.tgz", - "integrity": "sha512-z0730CwG/JO24evdORnyDkwG1Q7b7mF2Tp1qRQ0YvrMMARbt1DFG694SOv439Gm7hYKolyZyaB49YIrYIfZBdg==" - }, - "node_modules/level": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", - "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", - "dependencies": { - "browser-level": "^1.0.1", - "classic-level": "^1.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/level" - } - }, - "node_modules/level-supports": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/level-transcoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", - "dependencies": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lru/-/lru-3.1.0.tgz", - "integrity": "sha512-5OUtoiVIGU4VXBOshidmtOsvBIvcQR6FD/RzWSvaeHyxCGB+PCUCu+52lqMfdc0h/2CLvHhZS4TwUmMQrrMbBQ==", - "dependencies": { - "inherits": "^2.0.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lucide-react": { - "version": "0.298.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.298.0.tgz", - "integrity": "sha512-tWoxZ663Zf/n8VxXTHnTJsU/w1ysWT1LORnIL1pzqElFdSqBhWbZeJ3sLdCZ5FpzpbkpkYEtluhuTyG2BTDYNQ==", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/make-cancellable-promise": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/make-cancellable-promise/-/make-cancellable-promise-1.3.2.tgz", - "integrity": "sha512-GCXh3bq/WuMbS+Ky4JBPW1hYTOU+znU+Q5m9Pu+pI8EoUqIHk9+tviOKC6/qhHh8C4/As3tzJ69IF32kdz85ww==", - "funding": { - "url": "https://github.com/wojtekmaj/make-cancellable-promise?sponsor=1" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "optional": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-event-props": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/make-event-props/-/make-event-props-1.6.2.tgz", - "integrity": "sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA==", - "funding": { - "url": "https://github.com/wojtekmaj/make-event-props?sponsor=1" - } - }, - "node_modules/memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" - }, - "node_modules/merge-refs": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/merge-refs/-/merge-refs-1.2.2.tgz", - "integrity": "sha512-RwcT7GsQR3KbuLw1rRuodq4Nt547BKEBkliZ0qqsrpyNne9bGTFtsFIsIpx82huWhcl3kOlOlH4H0xkPk/DqVw==", - "funding": { - "url": "https://github.com/wojtekmaj/merge-refs?sponsor=1" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "optional": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "optional": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "optional": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/module-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/multibase": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.6.tgz", - "integrity": "sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ==", - "deprecated": "This module has been superseded by the multiformats module", - "dependencies": { - "@multiformats/base-x": "^4.0.1" - }, - "engines": { - "node": ">=12.0.0", - "npm": ">=6.0.0" - } - }, - "node_modules/multiformats": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz", - "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/multihashes": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.3.tgz", - "integrity": "sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA==", - "dependencies": { - "multibase": "^4.0.1", - "uint8arrays": "^3.0.0", - "varint": "^5.0.2" - }, - "engines": { - "node": ">=12.0.0", - "npm": ">=6.0.0" - } - }, - "node_modules/multihashes/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" - }, - "node_modules/multihashes/node_modules/uint8arrays": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", - "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", - "dependencies": { - "multiformats": "^9.4.2" - } - }, - "node_modules/multihashes/node_modules/varint": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", - "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" - }, - "node_modules/murmurhash3js-revisited": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz", - "integrity": "sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nan": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", - "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==", - "optional": true - }, - "node_modules/nanoassert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", - "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==" - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/napi-macros": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", - "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==" - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-gyp-build": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.7.1.tgz", - "integrity": "sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "optional": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-wheel": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz", - "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==" - }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "optional": true, - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/p-defer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-4.0.0.tgz", - "integrity": "sha512-Vb3QRvQ0Y5XnF40ZUWW7JfLogicVh/EnA5gBIvKDJoYpeI82+1E3AlB9yOcKFS0AhHrWVnAQO39fbR0G99IVEQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-queue": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.4.1.tgz", - "integrity": "sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==", - "dependencies": { - "eventemitter3": "^5.0.1", - "p-timeout": "^5.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", - "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path2d-polyfill": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path2d-polyfill/-/path2d-polyfill-2.0.1.tgz", - "integrity": "sha512-ad/3bsalbbWhmBo0D6FZ4RNMwsLsPpL6gnvhuSaU5Vm7b06Kr5ubSltQQ0T7YKsiJQO+g22zJ4dJKNTXIyOXtA==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pdfjs-dist": { - "version": "3.11.174", - "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-3.11.174.tgz", - "integrity": "sha512-TdTZPf1trZ8/UFu5Cx/GXB7GZM30LT+wWUNfsi6Bq8ePLnb+woNKtDymI2mxZYBpMbonNFqKmiz684DIfnd8dA==", - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "canvas": "^2.11.2", - "path2d-polyfill": "^2.0.1" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkarr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pkarr/-/pkarr-1.1.1.tgz", - "integrity": "sha512-X27LKqf83X3WuJd2Z9qdfVxkmfOu6HUbY0pm11LqeBbFmgmZRPgOxJG8bKiIsmmD6Vjc25j45KHYflF2lfodyQ==", - "dependencies": { - "bencode": "^3.0.3", - "bittorrent-dht": "^11.0.4", - "chalk": "^5.2.0", - "dns-packet": "^5.6.1", - "graceful-goodbye": "^1.3.0", - "sodium-universal": "^4.0.0", - "z32": "^1.0.0" - }, - "bin": { - "pkarr": "bin.js" - } - }, - "node_modules/pkarr/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/postcss": { - "version": "8.4.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", - "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", - "engines": { - "node": ">=14" - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/progress-events": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/progress-events/-/progress-events-1.0.0.tgz", - "integrity": "sha512-zIB6QDrSbPfRg+33FZalluFIowkbV5Xh1xSuetjG+rlC5he6u2dc6VQJ0TbMdlN3R1RHdpOqxEFMKTnQ+itUwA==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/protons-runtime": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-5.2.0.tgz", - "integrity": "sha512-jL3VSbXllgm17zurKQ/z+Ath0w+4BknJ+l/NLocfjAB8hbeASOZTNtb7zK3nDsKq2pHK9YFumNQvpkZ6gFfWhA==", - "dependencies": { - "uint8arraylist": "^2.4.3", - "uint8arrays": "^4.0.6" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/rabin-wasm": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/rabin-wasm/-/rabin-wasm-0.1.5.tgz", - "integrity": "sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA==", - "dependencies": { - "@assemblyscript/loader": "^0.9.4", - "bl": "^5.0.0", - "debug": "^4.3.1", - "minimist": "^1.2.5", - "node-fetch": "^2.6.1", - "readable-stream": "^3.6.0" - }, - "bin": { - "rabin-wasm": "cli/bin.js" - } - }, - "node_modules/rabin-wasm/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-dropzone": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz", - "integrity": "sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==", - "dependencies": { - "attr-accept": "^2.2.2", - "file-selector": "^0.6.0", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">= 10.13" - }, - "peerDependencies": { - "react": ">= 16.8 || 18.0.0" - } - }, - "node_modules/react-easy-crop": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/react-easy-crop/-/react-easy-crop-5.0.4.tgz", - "integrity": "sha512-JfzSk4cBHoksgAtgWUHR/jDYretebMxS0rpAlltP1LeELGMj4WTa420m4PsYFpgQXoJZV0DXmINUlBWAoAD/PQ==", - "dependencies": { - "normalize-wheel": "^1.0.1", - "tslib": "2.0.1" - }, - "peerDependencies": { - "react": ">=16.4.0", - "react-dom": ">=16.4.0" - } - }, - "node_modules/react-easy-crop/node_modules/tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" - }, - "node_modules/react-hook-form": { - "version": "7.49.2", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.49.2.tgz", - "integrity": "sha512-TZcnSc17+LPPVpMRIDNVITY6w20deMdNi6iehTFLV1x8SqThXGwu93HjlUVU09pzFgZH7qZOvLMM7UYf2ShAHA==", - "engines": { - "node": ">=18", - "pnpm": "8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-hook-form" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/react-pdf": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/react-pdf/-/react-pdf-7.6.0.tgz", - "integrity": "sha512-b2/8V6xhe5pn4Y01ELKTQZ+RhdZl1KpSAMGbN+HCZ/kwhYTIc4Pn5ctz1wRQUu1gOJbIEG4CcjMD9vTCzNdwjw==", - "dependencies": { - "clsx": "^2.0.0", - "make-cancellable-promise": "^1.3.1", - "make-event-props": "^1.6.0", - "merge-refs": "^1.2.1", - "pdfjs-dist": "3.11.174", - "prop-types": "^15.6.2", - "tiny-invariant": "^1.0.0", - "tiny-warning": "^1.0.0" - }, - "funding": { - "url": "https://github.com/wojtekmaj/react-pdf?sponsor=1" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-remove-scroll": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", - "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", - "dependencies": { - "react-remove-scroll-bar": "^2.3.3", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-remove-scroll-bar": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", - "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", - "dependencies": { - "react-style-singleton": "^2.2.1", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-router": { - "version": "6.21.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.21.1.tgz", - "integrity": "sha512-W0l13YlMTm1YrpVIOpjCADJqEUpz1vm+CMo47RuFX4Ftegwm6KOYsL5G3eiE52jnJpKvzm6uB/vTKTPKM8dmkA==", - "dependencies": { - "@remix-run/router": "1.14.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/react-router-dom": { - "version": "6.21.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.21.1.tgz", - "integrity": "sha512-QCNrtjtDPwHDO+AO21MJd7yIcr41UetYt5jzaB9Y1UYaPTCnVuJq6S748g1dE11OQlCFIQg+RtAA1SEZIyiBeA==", - "dependencies": { - "@remix-run/router": "1.14.1", - "react-router": "6.21.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, - "node_modules/react-spinners": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/react-spinners/-/react-spinners-0.13.8.tgz", - "integrity": "sha512-3e+k56lUkPj0vb5NDXPVFAOkPC//XyhKPJjvcGjyMNPWsBKpplfeyialP74G7H7+It7KzhtET+MvGqbKgAqpZA==", - "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-style-singleton": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", - "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", - "dependencies": { - "get-nonce": "^1.0.0", - "invariant": "^2.2.4", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-virtualized-auto-sizer": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.20.tgz", - "integrity": "sha512-OdIyHwj4S4wyhbKHOKM1wLSj/UDXm839Z3Cvfg2a9j+He6yDa6i5p0qQvEiCnyQlGO/HyfSnigQwuxvYalaAXA==", - "peerDependencies": { - "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc", - "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc" - } - }, - "node_modules/react-window": { - "version": "1.8.10", - "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.10.tgz", - "integrity": "sha512-Y0Cx+dnU6NLa5/EvoHukUD0BklJ8qITCtVEPY1C/nL8wwoZ0b5aEw8Ff1dOVHw7fCzMt55XfJDd8S8W8LCaUCg==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "memoize-one": ">=3.1.1 <6" - }, - "engines": { - "node": ">8.0.0" - }, - "peerDependencies": { - "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readable-stream": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", - "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/readable-web-to-node-stream": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", - "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", - "dependencies": { - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/readable-web-to-node-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/record-cache": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/record-cache/-/record-cache-1.2.0.tgz", - "integrity": "sha512-kyy3HWCez2WrotaL3O4fTn0rsIdfRKOdQQcEJ9KpvmKmbffKVvwsloX063EgRUlpJIXHiDQFhJcTbZequ2uTZw==", - "dependencies": { - "b4a": "^1.3.1" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "optional": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/run-parallel-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", - "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/run-series": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz", - "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safety-catch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/safety-catch/-/safety-catch-1.0.2.tgz", - "integrity": "sha512-C1UYVZ4dtbBxEtvOcpjBaaD27nP8MlvyAQEp2fOTOEe6pfUpk1cDUxij6BR1jZup6rSyUTaBBplK7LanskrULA==" - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "devOptional": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "optional": true - }, - "node_modules/sha256-universal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sha256-universal/-/sha256-universal-1.2.1.tgz", - "integrity": "sha512-ghn3muhdn1ailCQqqceNxRgkOeZSVfSE13RQWEg6njB+itsFzGVSJv+O//2hvNXZuxVIRyNzrgsZ37SPDdGJJw==", - "dependencies": { - "b4a": "^1.0.1", - "sha256-wasm": "^2.2.1" - } - }, - "node_modules/sha256-wasm": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/sha256-wasm/-/sha256-wasm-2.2.2.tgz", - "integrity": "sha512-qKSGARvao+JQlFiA+sjJZhJ/61gmW/3aNLblB2rsgIxDlDxsJPHo8a1seXj12oKtuHVgJSJJ7QEGBUYQN741lQ==", - "dependencies": { - "b4a": "^1.0.1", - "nanoassert": "^2.0.0" - } - }, - "node_modules/sha512-universal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sha512-universal/-/sha512-universal-1.2.1.tgz", - "integrity": "sha512-kehYuigMoRkIngCv7rhgruLJNNHDnitGTBdkcYbCbooL8Cidj/bS78MDxByIjcc69M915WxcQTgZetZ1JbeQTQ==", - "dependencies": { - "b4a": "^1.0.1", - "sha512-wasm": "^2.3.1" - } - }, - "node_modules/sha512-wasm": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/sha512-wasm/-/sha512-wasm-2.3.4.tgz", - "integrity": "sha512-akWoxJPGCB3aZCrZ+fm6VIFhJ/p8idBv7AWGFng/CZIrQo51oQNsvDbTSRXWAzIiZJvpy16oIDiCCPqTe21sKg==", - "dependencies": { - "b4a": "^1.0.1", - "nanoassert": "^2.0.0" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "optional": true - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true - }, - "node_modules/simple-get": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", - "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", - "optional": true, - "dependencies": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/siphash24": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/siphash24/-/siphash24-1.3.1.tgz", - "integrity": "sha512-moemC3ZKiTzH29nbFo3Iw8fbemWWod4vNs/WgKbQ54oEs6mE6XVlguxvinYjB+UmaE0PThgyED9fUkWvirT8hA==", - "dependencies": { - "nanoassert": "^2.0.0" - } - }, - "node_modules/sodium-javascript": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/sodium-javascript/-/sodium-javascript-0.8.0.tgz", - "integrity": "sha512-rEBzR5mPxPES+UjyMDvKPIXy9ImF17KOJ32nJNi9uIquWpS/nfj+h6m05J5yLJaGXjgM72LmQoUbWZVxh/rmGg==", - "dependencies": { - "blake2b": "^2.1.1", - "chacha20-universal": "^1.0.4", - "nanoassert": "^2.0.0", - "sha256-universal": "^1.1.0", - "sha512-universal": "^1.1.0", - "siphash24": "^1.0.1", - "xsalsa20": "^1.0.0" - } - }, - "node_modules/sodium-native": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.0.4.tgz", - "integrity": "sha512-faqOKw4WQKK7r/ybn6Lqo1F9+L5T6NlBJJYvpxbZPetpWylUVqz449mvlwIBKBqxEHbWakWuOlUt8J3Qpc4sWw==", - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.6.0" - } - }, - "node_modules/sodium-universal": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-4.0.0.tgz", - "integrity": "sha512-iKHl8XnBV96k1c75gwwzANFdephw/MDWSjQAjPmBE+du0y3P23Q8uf7AcdcfFsYAMwLg7WVBfSAIBtV/JvRsjA==", - "dependencies": { - "blake2b": "^2.1.1", - "chacha20-universal": "^1.0.4", - "nanoassert": "^2.0.0", - "sha256-universal": "^1.1.0", - "sha512-universal": "^1.1.0", - "siphash24": "^1.0.1", - "sodium-javascript": "~0.8.0", - "sodium-native": "^4.0.0", - "xsalsa20": "^1.0.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sparse-array": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/sparse-array/-/sparse-array-1.3.2.tgz", - "integrity": "sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg==" - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "optional": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "optional": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwind-merge": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.1.0.tgz", - "integrity": "sha512-l11VvI4nSwW7MtLSLYT4ldidDEUwQAMWuSHk7l4zcXZDgnCRa0V3OdCwFfM7DCzakVXMNRwAeje9maFFXT71dQ==", - "dependencies": { - "@babel/runtime": "^7.23.5" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/tailwindcss": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.0.tgz", - "integrity": "sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA==", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.19.1", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss-animate": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", - "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders" - } - }, - "node_modules/tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", - "optional": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tiny-invariant": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uint8-util": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/uint8-util/-/uint8-util-2.2.4.tgz", - "integrity": "sha512-uEI5lLozmKQPYEevfEhP9LY3Je5ZmrQhaWXrzTVqrLNQl36xsRh8NiAxYwB9J+2BAt99TRbmCkROQB2ZKhx4UA==", - "dependencies": { - "base64-arraybuffer": "^1.0.2" - } - }, - "node_modules/uint8arraylist": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.4.7.tgz", - "integrity": "sha512-ohRElqR6C5dd60vRFLq40MCiSnUe1AzkpHvbCEMCGGP6zMoFYECsjdhL6bR1kTK37ONNRDuHQ3RIpScRYcYYIg==", - "dependencies": { - "uint8arrays": "^4.0.2" - } - }, - "node_modules/uint8arrays": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.10.tgz", - "integrity": "sha512-AnJNUGGDJAgFw/eWu/Xb9zrVKEGlwJJCaeInlf3BkecE/zcTobk5YXYIPNQJO1q5Hh1QZrQQHf0JvcHqz2hqoA==", - "dependencies": { - "multiformats": "^12.0.1" - } - }, - "node_modules/uint8arrays/node_modules/multiformats": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz", - "integrity": "sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/ulidx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ulidx/-/ulidx-2.1.0.tgz", - "integrity": "sha512-DlMi97oP9HASI3kLCjBlOhAG1SoisUrEqC2PJ7itiFbq9q5Zo0JejupXeu2Gke99W62epNzA4MFNToNiq8A5LA==", - "dependencies": { - "layerr": "^2.0.1" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/use-callback-ref": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", - "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sidecar": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", - "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", - "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" - }, - "node_modules/vite": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz", - "integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==", - "dev": true, - "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "optional": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/xsalsa20": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/xsalsa20/-/xsalsa20-1.2.0.tgz", - "integrity": "sha512-FIr/DEeoHfj7ftfylnoFt3rAIRoWXpx2AoDfrT2qD2wtp7Dp+COajvs/Icb7uHqRW9m60f5iXZwdsJJO3kvb7w==" - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/z32": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/z32/-/z32-1.0.1.tgz", - "integrity": "sha512-Uytfqf6VEVchHKZDw0NRdCViOARHP84uzvOw0CXCMLOwhgHZUL9XibpEPLLQN10mCVLxOlGCQWbkV7km7yNYcw==", - "dependencies": { - "b4a": "^1.5.3" - } - }, - "node_modules/zod": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", - "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zustand": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.4.7.tgz", - "integrity": "sha512-QFJWJMdlETcI69paJwhSMJz7PPWjVP8Sjhclxmxmxv/RYI7ZOvR5BHX+ktH0we9gTWQMxcne8q1OY8xxz604gw==", - "dependencies": { - "use-sync-external-store": "1.2.0" - }, - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "@types/react": ">=16.8", - "immer": ">=9.0", - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - } - } - } - } -} diff --git a/tauri-app/pnpm-lock.yaml b/tauri-app/pnpm-lock.yaml new file mode 100644 index 0000000..606e550 --- /dev/null +++ b/tauri-app/pnpm-lock.yaml @@ -0,0 +1,4080 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@hookform/resolvers': + specifier: ^3.3.2 + version: 3.3.3(react-hook-form@7.49.2) + '@radix-ui/react-avatar': + specifier: ^1.0.4 + version: 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-dropdown-menu': + specifier: ^2.0.6 + version: 2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-label': + specifier: ^2.0.2 + version: 2.0.2(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': + specifier: ^1.0.2 + version: 1.0.2(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-tabs': + specifier: ^1.0.4 + version: 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@tauri-apps/api': + specifier: ^1.5.2 + version: 1.5.3 + '@web5/api': + specifier: ^0.8.3 + version: 0.8.3 + class-variance-authority: + specifier: ^0.7.0 + version: 0.7.0 + clsx: + specifier: ^2.0.0 + version: 2.1.0 + lucide-react: + specifier: ^0.298.0 + version: 0.298.0(react@18.2.0) + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + react-dropzone: + specifier: ^14.2.3 + version: 14.2.3(react@18.2.0) + react-easy-crop: + specifier: ^5.0.4 + version: 5.0.4(react-dom@18.2.0)(react@18.2.0) + react-hook-form: + specifier: ^7.49.2 + version: 7.49.2(react@18.2.0) + react-pdf: + specifier: ^7.6.0 + version: 7.6.0(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + react-router-dom: + specifier: ^6.21.1 + version: 6.21.1(react-dom@18.2.0)(react@18.2.0) + react-spinners: + specifier: ^0.13.8 + version: 0.13.8(react-dom@18.2.0)(react@18.2.0) + react-virtualized-auto-sizer: + specifier: ^1.0.20 + version: 1.0.20(react-dom@18.2.0)(react@18.2.0) + react-window: + specifier: ^1.8.10 + version: 1.8.10(react-dom@18.2.0)(react@18.2.0) + tailwind-merge: + specifier: ^2.1.0 + version: 2.2.0 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.0) + zod: + specifier: ^3.22.4 + version: 3.22.4 + zustand: + specifier: ^4.4.7 + version: 4.4.7(@types/react@18.2.46)(react@18.2.0) + +devDependencies: + '@tauri-apps/cli': + specifier: ^1.5.7 + version: 1.5.9 + '@types/node': + specifier: ^20.10.5 + version: 20.10.6 + '@types/react': + specifier: ^18.2.15 + version: 18.2.46 + '@types/react-dom': + specifier: ^18.2.7 + version: 18.2.18 + '@types/react-window': + specifier: ^1.8.8 + version: 1.8.8 + '@vitejs/plugin-react': + specifier: ^4.0.3 + version: 4.2.1(vite@4.5.1) + autoprefixer: + specifier: ^10.4.16 + version: 10.4.16(postcss@8.4.32) + postcss: + specifier: ^8.4.32 + version: 8.4.32 + tailwindcss: + specifier: ^3.4.0 + version: 3.4.0 + typescript: + specifier: ^5.0.2 + version: 5.3.3 + vite: + specifier: ^4.4.4 + version: 4.5.1(@types/node@20.10.6) + +packages: + + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + dev: true + + /@assemblyscript/loader@0.9.4: + resolution: {integrity: sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==} + dev: false + + /@babel/code-frame@7.23.5: + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + dev: true + + /@babel/compat-data@7.23.5: + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.23.7: + resolution: {integrity: sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) + '@babel/helpers': 7.23.7 + '@babel/parser': 7.23.6 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.7 + '@babel/types': 7.23.6 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.23.6: + resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + jsesc: 2.5.2 + dev: true + + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.22.2 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-string-parser@7.23.4: + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers@7.23.7: + resolution: {integrity: sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.7 + '@babel/types': 7.23.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight@7.23.4: + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/parser@7.23.6: + resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/runtime@7.23.7: + resolution: {integrity: sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + dev: false + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + dev: true + + /@babel/traverse@7.23.7: + resolution: {integrity: sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.23.6: + resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + + /@decentralized-identity/ion-pow-sdk@1.0.17: + resolution: {integrity: sha512-vk7DTDM8aKDbFyu1ad/qkoRrGL4q+KvNeL/FNZXhkWPaDhVExBN/qGEoRLf1YSfFe+myto3+4RYTPut+riiqnw==} + dependencies: + buffer: 6.0.3 + cross-fetch: 3.1.5 + hash-wasm: 4.9.0 + transitivePeerDependencies: + - encoding + dev: false + + /@decentralized-identity/ion-sdk@1.0.1: + resolution: {integrity: sha512-+P+DXcRSFjsEsI5KIqUmVjpzgUT28B2lWpTO+IxiBcfibAN/1Sg20NebGTO/+serz2CnSZf95N2a1OZ6eXypGQ==} + dependencies: + '@noble/ed25519': 2.0.0 + '@noble/secp256k1': 2.0.0 + canonicalize: 2.0.0 + multiformats: 12.1.3 + multihashes: 4.0.3 + uri-js: 4.4.1 + dev: false + + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@floating-ui/core@1.5.2: + resolution: {integrity: sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==} + dependencies: + '@floating-ui/utils': 0.1.6 + dev: false + + /@floating-ui/dom@1.5.3: + resolution: {integrity: sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==} + dependencies: + '@floating-ui/core': 1.5.2 + '@floating-ui/utils': 0.1.6 + dev: false + + /@floating-ui/react-dom@2.0.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/dom': 1.5.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@floating-ui/utils@0.1.6: + resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==} + dev: false + + /@hookform/resolvers@3.3.3(react-hook-form@7.49.2): + resolution: {integrity: sha512-bOMxKkSD3zWcS11TKoUQ8O0ZqKslFohvUsPKSrdCHiuEuMjRo/u3cq9YRJD/+xtNGYup++XD2LkjhegP5XENiw==} + peerDependencies: + react-hook-form: ^7.0.0 + dependencies: + react-hook-form: 7.49.2(react@18.2.0) + dev: false + + /@ipld/dag-cbor@9.0.3: + resolution: {integrity: sha512-A2UFccS0+sARK9xwXiVZIaWbLbPxLGP3UZOjBeOMWfDY04SXi8h1+t4rHBzOlKYF/yWNm3RbFLyclWO7hZcy4g==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + cborg: 2.0.5 + multiformats: 12.1.3 + dev: false + + /@ipld/dag-pb@4.0.7: + resolution: {integrity: sha512-EqJtSAcELiYbp9K0Y5ckbg+W0pD5cSy5PnE/QsCrpKvoq+u0E8Vi07chNGDLaShd5AjDq0AMtnuudKUUuEuSjg==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + multiformats: 13.0.0 + dev: false + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.20 + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.20: + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + + /@js-temporal/polyfill@0.4.4: + resolution: {integrity: sha512-2X6bvghJ/JAoZO52lbgyAPFj8uCflhTo2g7nkFzEQdXd/D8rEeD4HtmTEpmtGCva260fcd66YNXBOYdnmHqSOg==} + engines: {node: '>=12'} + dependencies: + jsbi: 4.3.0 + tslib: 2.6.2 + dev: false + + /@leichtgewicht/ip-codec@2.0.4: + resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} + dev: false + + /@mapbox/node-pre-gyp@1.0.11: + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true + requiresBuild: true + dependencies: + detect-libc: 2.0.2 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.7.0 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.5.4 + tar: 6.2.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + optional: true + + /@multiformats/base-x@4.0.1: + resolution: {integrity: sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==} + dev: false + + /@multiformats/murmur3@2.1.7: + resolution: {integrity: sha512-Yf0UpAaONjed+8PTt5NM/GG4Z4Ai4m1qfT7bqevjnkwRQ12K+0jxtRomirz+VJx4PokpA2St1ZSD1iMkZTqPRQ==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + multiformats: 12.1.3 + murmurhash3js-revisited: 3.0.0 + dev: false + + /@noble/ciphers@0.1.4: + resolution: {integrity: sha512-d3ZR8vGSpy3v/nllS+bD/OMN5UZqusWiQqkyj7AwzTnhXFH72pF5oB4Ach6DQ50g5kXxC28LdaYBEpsyv9KOUQ==} + dev: false + + /@noble/ciphers@0.3.0: + resolution: {integrity: sha512-ldbrnOjmNRwFdXcTM6uXDcxpMIFrbzAWNnpBPp4oTJTFF0XByGD6vf45WrehZGXRQTRVV+Zm8YP+EgEf+e4cWA==} + dev: false + + /@noble/curves@1.1.0: + resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} + dependencies: + '@noble/hashes': 1.3.1 + dev: false + + /@noble/curves@1.3.0: + resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} + dependencies: + '@noble/hashes': 1.3.3 + dev: false + + /@noble/ed25519@2.0.0: + resolution: {integrity: sha512-/extjhkwFupyopDrt80OMWKdLgP429qLZj+z6sYJz90rF2Iz0gjZh2ArMKPImUl13Kx+0EXI2hN9T/KJV0/Zng==} + dev: false + + /@noble/hashes@1.3.1: + resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} + engines: {node: '>= 16'} + dev: false + + /@noble/hashes@1.3.3: + resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} + engines: {node: '>= 16'} + dev: false + + /@noble/secp256k1@2.0.0: + resolution: {integrity: sha512-rUGBd95e2a45rlmFTqQJYEFA4/gdIARFfuTuTqLglz0PZ6AKyzyXsEZZq7UZn8hZsvaBgpCzKKBJizT2cJERXw==} + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.16.0 + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + optional: true + + /@radix-ui/primitive@1.0.1: + resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} + dependencies: + '@babel/runtime': 7.23.7 + dev: false + + /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-avatar@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@types/react': 18.2.46 + react: 18.2.0 + dev: false + + /@radix-ui/react-context@1.0.1(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@types/react': 18.2.46 + react: 18.2.0 + dev: false + + /@radix-ui/react-direction@1.0.1(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@types/react': 18.2.46 + react: 18.2.0 + dev: false + + /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@types/react': 18.2.46 + react: 18.2.0 + dev: false + + /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-id@1.0.1(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + react: 18.2.0 + dev: false + + /@radix-ui/react-label@2.0.2(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + aria-hidden: 1.2.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.46)(react@18.2.0) + dev: false + + /@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@floating-ui/react-dom': 2.0.4(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/rect': 1.0.1 + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-slot@1.0.2(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + react: 18.2.0 + dev: false + + /@radix-ui/react-tabs@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@types/react': 18.2.46 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@types/react': 18.2.46 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/rect': 1.0.1 + '@types/react': 18.2.46 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-size@1.0.1(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + react: 18.2.0 + dev: false + + /@radix-ui/rect@1.0.1: + resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} + dependencies: + '@babel/runtime': 7.23.7 + dev: false + + /@remix-run/router@1.14.1: + resolution: {integrity: sha512-Qg4DMQsfPNAs88rb2xkdk03N3bjK4jgX5fR24eHCTR9q6PrhZQZ4UJBPzCHJkIpTRN1UKxx2DzjZmnC+7Lj0Ow==} + engines: {node: '>=14.0.0'} + dev: false + + /@tauri-apps/api@1.5.3: + resolution: {integrity: sha512-zxnDjHHKjOsrIzZm6nO5Xapb/BxqUq1tc7cGkFXsFkGTsSWgCPH1D8mm0XS9weJY2OaR73I3k3S+b7eSzJDfqA==} + engines: {node: '>= 14.6.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} + dev: false + + /@tauri-apps/cli-darwin-arm64@1.5.9: + resolution: {integrity: sha512-7C2Jf8f0gzv778mLYb7Eszqqv1bm9Wzews81MRTqKrUIcC+eZEtDXLex+JaEkEzFEUrgIafdOvMBVEavF030IA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-darwin-x64@1.5.9: + resolution: {integrity: sha512-LHKytpkofPYgH8RShWvwDa3hD1ws131x7g7zNasJPfOiCWLqYVQFUuQVmjEUt8+dpHe/P/err5h4z+YZru2d0A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-linux-arm-gnueabihf@1.5.9: + resolution: {integrity: sha512-teGK20IYKx+dVn8wFq/Lg57Q9ce7foq1KHSfyHi464LVt1T0V1rsmULSgZpQPPj/NYPF5BG78PcWYv64yH86jw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-linux-arm64-gnu@1.5.9: + resolution: {integrity: sha512-onJ/DW5Crw38qVx+wquY4uBbfCxVhzhdJmlCYqnYyXsZZmSiPUfSyhV58y+5TYB0q1hG8eYdB5x8VAwzByhGzw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-linux-arm64-musl@1.5.9: + resolution: {integrity: sha512-23AYoLD3acakLp9NtheKQDJl8F66eTOflxoPzdJNRy13hUSxb+W9qpz4rRA+CIzkjICFvO2i3UWjeV9QwDVpsQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-linux-x64-gnu@1.5.9: + resolution: {integrity: sha512-9PQA1rE7gh41W2ylyKd5qOGOds55ymaYPml9KOpM0g+cxmCXa+8Wf9K5NKvACnJldJJ6cekWzIyB4eN6o5T+yQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-linux-x64-musl@1.5.9: + resolution: {integrity: sha512-5hdbNFeDsrJ/pXZ4cSQV4bJwUXPPxXxN3/pAtNUqIph7q+vLcBXOXIMoS64iuyaluJC59lhEwlWZFz+EPv0Hqg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-win32-arm64-msvc@1.5.9: + resolution: {integrity: sha512-O18JufjSB3hSJYu5WWByONouGeX7DraLAtXLErsG1r/VS3zHd/zyuzycrVUaObNXk5bfGlIP0Ypt+RvZJILN2w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-win32-ia32-msvc@1.5.9: + resolution: {integrity: sha512-FQxtxTZu0JVBihfd/lmpxo7jyMOesjWQehfyVUqtgMfm5+Pvvw0Y+ZioeDi1TZkFVrT3QDYy8R4LqDLSZVMQRA==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-win32-x64-msvc@1.5.9: + resolution: {integrity: sha512-EeI1+L518cIBLKw0qUFwnLIySBeSmPQjPLIlNwSukHSro4tAQPHycEVGgKrdToiCWgaZJBA0e5aRSds0Du2TWg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli@1.5.9: + resolution: {integrity: sha512-knSt/9AvCTeyfC6wkyeouF9hBW/0Mzuw+5vBKEvzaGPQsfFJo1ZCp5FkdiZpGBBfnm09BhugasGRTGofzatfqQ==} + engines: {node: '>= 10'} + hasBin: true + optionalDependencies: + '@tauri-apps/cli-darwin-arm64': 1.5.9 + '@tauri-apps/cli-darwin-x64': 1.5.9 + '@tauri-apps/cli-linux-arm-gnueabihf': 1.5.9 + '@tauri-apps/cli-linux-arm64-gnu': 1.5.9 + '@tauri-apps/cli-linux-arm64-musl': 1.5.9 + '@tauri-apps/cli-linux-x64-gnu': 1.5.9 + '@tauri-apps/cli-linux-x64-musl': 1.5.9 + '@tauri-apps/cli-win32-arm64-msvc': 1.5.9 + '@tauri-apps/cli-win32-ia32-msvc': 1.5.9 + '@tauri-apps/cli-win32-x64-msvc': 1.5.9 + dev: true + + /@tbd54566975/dwn-sdk-js@0.2.8: + resolution: {integrity: sha512-oiKk+ekAQO94bUkt6yk+xkDY8uCGmNC+rKaYQLhAoTrhYrczeRSuDT04F5/vPBT5K6NfAoRcQsIyBmvgRCUvgA==} + engines: {node: '>= 18'} + dependencies: + '@ipld/dag-cbor': 9.0.3 + '@js-temporal/polyfill': 0.4.4 + '@noble/ed25519': 2.0.0 + '@noble/secp256k1': 2.0.0 + abstract-level: 1.0.3 + ajv: 8.12.0 + blockstore-core: 4.2.0 + cross-fetch: 4.0.0 + eciesjs: 0.4.5 + flat: 5.0.2 + interface-blockstore: 5.2.3 + interface-store: 5.1.2 + ipfs-unixfs-exporter: 13.1.5 + ipfs-unixfs-importer: 15.1.5 + level: 8.0.0 + lodash: 4.17.21 + lru-cache: 9.1.2 + ms: 2.1.3 + multiformats: 11.0.2 + randombytes: 2.1.0 + readable-stream: 4.4.2 + ulidx: 2.1.0 + uuid: 8.3.2 + varint: 6.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + dependencies: + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.5 + dev: true + + /@types/babel__generator@7.6.8: + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + dependencies: + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + dev: true + + /@types/babel__traverse@7.20.5: + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@types/node@20.10.6: + resolution: {integrity: sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==} + dependencies: + undici-types: 5.26.5 + dev: true + + /@types/prop-types@15.7.11: + resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} + + /@types/react-dom@18.2.18: + resolution: {integrity: sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==} + dependencies: + '@types/react': 18.2.46 + + /@types/react-window@1.8.8: + resolution: {integrity: sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q==} + dependencies: + '@types/react': 18.2.46 + dev: true + + /@types/react@18.2.46: + resolution: {integrity: sha512-nNCvVBcZlvX4NU1nRRNV/mFl1nNRuTuslAJglQsq+8ldXe5Xv0Wd2f7WTE3jOxhLH2BFfiZGC6GCp+kHQbgG+w==} + dependencies: + '@types/prop-types': 15.7.11 + '@types/scheduler': 0.16.8 + csstype: 3.1.3 + + /@types/scheduler@0.16.8: + resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + + /@vitejs/plugin-react@4.2.1(vite@4.5.1): + resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.7) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.0 + vite: 4.5.1(@types/node@20.10.6) + transitivePeerDependencies: + - supports-color + dev: true + + /@web5/agent@0.2.5: + resolution: {integrity: sha512-Z9JY/43Yrg0xKK26y/iZFdHNtVf/k9XLxw8mXP5zfYidrqfAgVR0i4LKA7qZKfUSxC7/uaD/STYYIKpNByd/cw==} + engines: {node: '>=18.0.0'} + dependencies: + '@tbd54566975/dwn-sdk-js': 0.2.8 + '@web5/common': 0.2.2 + '@web5/crypto': 0.2.2 + '@web5/dids': 0.2.3 + level: 8.0.0 + readable-stream: 4.4.2 + readable-web-to-node-stream: 3.0.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@web5/api@0.8.3: + resolution: {integrity: sha512-YXQ++ZShtd5LeFRqEMGlhVqJ7Zg5P6bMequpaLl068bCGjtjCwiFFgDtM1KeL36IAzQ4pFLFyj9aTGZ/JgCXHA==} + engines: {node: '>=18.0.0'} + dependencies: + '@tbd54566975/dwn-sdk-js': 0.2.8 + '@web5/agent': 0.2.5 + '@web5/common': 0.2.2 + '@web5/crypto': 0.2.2 + '@web5/dids': 0.2.3 + '@web5/user-agent': 0.2.5 + level: 8.0.0 + ms: 2.1.3 + readable-stream: 4.4.2 + readable-web-to-node-stream: 3.0.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@web5/common@0.2.1: + resolution: {integrity: sha512-Tt5P17HgQCx+Epw0IHnhRKqp5UU3E4xtsE8PkdghOBnvntBB0op5P6efvR1WqmJft5+VunDHt3yZAZstuqQkNg==} + engines: {node: '>=18.0.0'} + dependencies: + level: 8.0.0 + multiformats: 11.0.2 + dev: false + + /@web5/common@0.2.2: + resolution: {integrity: sha512-dRn6SmALExeTLMTK/W5ozGarfaddK+Lraf5OjuIGLAaLfcX1RWx3oDMoY5Hr9LjfxHJC8mGXB8DnKflbeYJRgA==} + engines: {node: '>=18.0.0'} + dependencies: + level: 8.0.0 + multiformats: 11.0.2 + readable-stream: 4.4.2 + dev: false + + /@web5/crypto@0.2.2: + resolution: {integrity: sha512-vHFg0wXQSQXrwuBNQyDHnmSZchfTfO6/Sv+7rDsNkvofs+6lGTE8CZ02cwUYMeIwTRMLer12c+fMfzYrXokEUQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@noble/ciphers': 0.1.4 + '@noble/curves': 1.1.0 + '@noble/hashes': 1.3.1 + '@web5/common': 0.2.1 + dev: false + + /@web5/dids@0.2.3: + resolution: {integrity: sha512-Y3PHOavNkSyjBxZQEpKE6XueaqemBO5w0UMOnFh4xH6+5B43ENEE4LHIqVyn2bCpfEBGLXENgDZYqyJphBu0pA==} + engines: {node: '>=18.0.0'} + dependencies: + '@decentralized-identity/ion-pow-sdk': 1.0.17 + '@decentralized-identity/ion-sdk': 1.0.1 + '@web5/common': 0.2.2 + '@web5/crypto': 0.2.2 + did-resolver: 4.1.0 + dns-packet: 5.6.1 + level: 8.0.0 + ms: 2.1.3 + pkarr: 1.1.1 + z32: 1.0.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@web5/user-agent@0.2.5: + resolution: {integrity: sha512-qv5M698C5HSvq30xUgLWtcsbZppjfOH5qZthpTRx4ItL5UWA/eQ9DsQiQeb4vet3uIUy3NHRDIQezclOdwYErw==} + engines: {node: '>=18.0.0'} + dependencies: + '@web5/agent': 0.2.5 + '@web5/common': 0.2.2 + '@web5/crypto': 0.2.2 + '@web5/dids': 0.2.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + requiresBuild: true + dev: false + optional: true + + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: false + + /abstract-level@1.0.3: + resolution: {integrity: sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==} + engines: {node: '>=12'} + dependencies: + buffer: 6.0.3 + catering: 2.1.1 + is-buffer: 2.0.5 + level-supports: 4.0.1 + level-transcoder: 1.0.1 + module-error: 1.0.2 + queue-microtask: 1.2.3 + dev: false + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + requiresBuild: true + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + optional: true + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + /aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + requiresBuild: true + dev: false + optional: true + + /are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + requiresBuild: true + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: false + optional: true + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + /aria-hidden@1.2.3: + resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} + engines: {node: '>=10'} + dependencies: + tslib: 2.6.2 + dev: false + + /attr-accept@2.2.2: + resolution: {integrity: sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==} + engines: {node: '>=4'} + dev: false + + /autoprefixer@10.4.16(postcss@8.4.32): + resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.22.2 + caniuse-lite: 1.0.30001572 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: true + + /b4a@1.6.4: + resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base64-arraybuffer@1.0.2: + resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} + engines: {node: '>= 0.6.0'} + dev: false + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + + /bencode@2.0.3: + resolution: {integrity: sha512-D/vrAD4dLVX23NalHwb8dSvsUsxeRPO8Y7ToKA015JQYq69MLDOMkC0uGZYA/MPpltLO8rt8eqFC2j8DxjTZ/w==} + dev: false + + /bencode@3.1.1: + resolution: {integrity: sha512-btsxX9201yoWh45TdqYg6+OZ5O1xTYKTYSGvJndICDFtznE/9zXgow8yjMvvhOqKKuzuL7h+iiCMpfkG8+QuBA==} + engines: {node: '>=12.20.0'} + dependencies: + uint8-util: 2.2.4 + dev: false + + /bencode@4.0.0: + resolution: {integrity: sha512-AERXw18df0pF3ziGOCyUjqKZBVNH8HV3lBxnx5w0qtgMIk4a1wb9BkcCQbkp9Zstfrn/dzRwl7MmUHHocX3sRQ==} + engines: {node: '>=12.20.0'} + dependencies: + uint8-util: 2.2.4 + dev: false + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + /bittorrent-dht@11.0.5: + resolution: {integrity: sha512-R09D6uNaziRqsc+B/j5QzkjceTak+wH9vcNLnkmt8A52EWF9lQwBP0vvCKgSA3AJOYYl+41n3osA2KYYn/z5uQ==} + engines: {node: '>=12.20.0'} + dependencies: + bencode: 4.0.0 + debug: 4.3.4 + k-bucket: 5.1.0 + k-rpc: 5.1.0 + last-one-wins: 1.0.4 + lru: 3.1.0 + randombytes: 2.1.0 + record-cache: 1.2.0 + transitivePeerDependencies: + - supports-color + dev: false + + /bl@5.1.0: + resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + dependencies: + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /blake2b-wasm@2.4.0: + resolution: {integrity: sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==} + dependencies: + b4a: 1.6.4 + nanoassert: 2.0.0 + dev: false + + /blake2b@2.1.4: + resolution: {integrity: sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A==} + dependencies: + blake2b-wasm: 2.4.0 + nanoassert: 2.0.0 + dev: false + + /blockstore-core@4.2.0: + resolution: {integrity: sha512-F8BCobc75D+9/+hUD+5cixbU6zmZA+lBgNiuBkNlJqRgmAaBBvLOQF6Ad9Jei0Nvmy2a1jaF4CiN76W1apIghA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + err-code: 3.0.1 + interface-blockstore: 5.2.3 + interface-store: 5.1.2 + multiformats: 11.0.2 + dev: false + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + requiresBuild: true + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: false + optional: true + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + + /browser-level@1.0.1: + resolution: {integrity: sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==} + dependencies: + abstract-level: 1.0.3 + catering: 2.1.1 + module-error: 1.0.2 + run-parallel-limit: 1.1.0 + dev: false + + /browserslist@4.22.2: + resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001572 + electron-to-chromium: 1.4.616 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.22.2) + dev: true + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + /caniuse-lite@1.0.30001572: + resolution: {integrity: sha512-1Pbh5FLmn5y4+QhNyJE9j3/7dK44dGB83/ZMjv/qJk86TvDbjk0LosiZo0i0WB0Vx607qMX9jYrn1VLHCkN4rw==} + dev: true + + /canonicalize@2.0.0: + resolution: {integrity: sha512-ulDEYPv7asdKvqahuAY35c1selLdzDwHqugK92hfkzvlDCwXRRelDkR+Er33md/PtnpqHemgkuDPanZ4fiYZ8w==} + dev: false + + /canvas@2.11.2: + resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} + engines: {node: '>=6'} + requiresBuild: true + dependencies: + '@mapbox/node-pre-gyp': 1.0.11 + nan: 2.18.0 + simple-get: 3.1.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + optional: true + + /catering@2.1.1: + resolution: {integrity: sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==} + engines: {node: '>=6'} + dev: false + + /cborg@2.0.5: + resolution: {integrity: sha512-xVW1rSIw1ZXbkwl2XhJ7o/jAv0vnVoQv/QlfQxV8a7V5PlA4UU/AcIiXqmpyybwNWy/GPQU1m/aBVNIWr7/T0w==} + hasBin: true + dev: false + + /chacha20-universal@1.0.4: + resolution: {integrity: sha512-/IOxdWWNa7nRabfe7+oF+jVkGjlr2xUL4J8l/OvzZhj+c9RpMqoo3Dq+5nU1j/BflRV4BKnaQ4+4oH1yBpQG1Q==} + dependencies: + nanoassert: 2.0.0 + dev: false + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: false + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + requiresBuild: true + dev: false + optional: true + + /chrome-dgram@3.0.6: + resolution: {integrity: sha512-bqBsUuaOiXiqxXt/zA/jukNJJ4oaOtc7ciwqJpZVEaaXwwxqgI2/ZdG02vXYWUhHGziDlvGMQWk0qObgJwVYKA==} + dependencies: + inherits: 2.0.4 + run-series: 1.1.9 + dev: false + + /chrome-dns@1.0.1: + resolution: {integrity: sha512-HqsYJgIc8ljJJOqOzLphjAs79EUuWSX3nzZi2LNkzlw3GIzAeZbaSektC8iT/tKvLqZq8yl1GJu5o6doA4TRbg==} + dependencies: + chrome-net: 3.3.4 + dev: false + + /chrome-net@3.3.4: + resolution: {integrity: sha512-Jzy2EnzmE+ligqIZUsmWnck9RBXLuUy6CaKyuNMtowFG3ZvLt8d+WBJCTPEludV0DHpIKjAOlwjFmTaEdfdWCw==} + dependencies: + inherits: 2.0.4 + dev: false + + /class-variance-authority@0.7.0: + resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} + dependencies: + clsx: 2.0.0 + dev: false + + /classic-level@1.3.0: + resolution: {integrity: sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==} + engines: {node: '>=12'} + requiresBuild: true + dependencies: + abstract-level: 1.0.3 + catering: 2.1.1 + module-error: 1.0.2 + napi-macros: 2.2.2 + node-gyp-build: 4.7.1 + dev: false + + /clsx@2.0.0: + resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} + engines: {node: '>=6'} + dev: false + + /clsx@2.1.0: + resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} + engines: {node: '>=6'} + dev: false + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + requiresBuild: true + dev: false + optional: true + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + requiresBuild: true + dev: false + optional: true + + /console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + requiresBuild: true + dev: false + optional: true + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /cross-fetch@3.1.5: + resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} + dependencies: + node-fetch: 2.6.7 + transitivePeerDependencies: + - encoding + dev: false + + /cross-fetch@4.0.0: + resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /decompress-response@4.2.1: + resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} + engines: {node: '>=8'} + requiresBuild: true + dependencies: + mimic-response: 2.1.0 + dev: false + optional: true + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + requiresBuild: true + dev: false + optional: true + + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + requiresBuild: true + dev: false + optional: true + + /detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + dev: false + + /did-resolver@4.1.0: + resolution: {integrity: sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA==} + dev: false + + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + /dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + dependencies: + '@leichtgewicht/ip-codec': 2.0.4 + dev: false + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + /eciesjs@0.4.5: + resolution: {integrity: sha512-2zSRIygO48LpdS95Rwt9ryIkJNO37IdbkjRsnYyAn7gx7e4WPBNimnk6jGNdx2QQYr/VJRPnSVdwQpO5bycYZw==} + engines: {node: '>=16.0.0'} + dependencies: + '@noble/ciphers': 0.3.0 + '@noble/curves': 1.3.0 + '@noble/hashes': 1.3.3 + dev: false + + /electron-to-chromium@1.4.616: + resolution: {integrity: sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + /err-code@3.0.1: + resolution: {integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==} + dev: false + + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: false + + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: false + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: false + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: false + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + /fastq@1.16.0: + resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} + dependencies: + reusify: 1.0.4 + + /file-selector@0.6.0: + resolution: {integrity: sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==} + engines: {node: '>= 12'} + dependencies: + tslib: 2.6.2 + dev: false + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + dev: false + + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + dev: true + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + requiresBuild: true + dependencies: + minipass: 3.3.6 + dev: false + optional: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + requiresBuild: true + dev: false + optional: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + /gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + requiresBuild: true + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: false + optional: true + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.4 + path-scurry: 1.10.1 + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + requiresBuild: true + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: false + optional: true + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /graceful-goodbye@1.3.0: + resolution: {integrity: sha512-hcZOs20emYlTM7MmUE0FpuZcjlk2GPsR+UYTHDeWxtGjXcbh2CawGi8vlzqsIvspqAbot7mRv3sC/uhgtKc4hQ==} + dependencies: + safety-catch: 1.0.2 + dev: false + + /hamt-sharding@3.0.2: + resolution: {integrity: sha512-f0DzBD2tSmLFdFsLAvOflIBqFPjerbA7BfmwO8mVho/5hXwgyyYhv+ijIzidQf/DpDX3bRjAQvhGoBFj+DBvPw==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + sparse-array: 1.3.2 + uint8arrays: 4.0.10 + dev: false + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + requiresBuild: true + dev: false + optional: true + + /hash-wasm@4.9.0: + resolution: {integrity: sha512-7SW7ejyfnRxuOc7ptQHSf4LDoZaWOivfzqw+5rpcQku0nHfmicPKE51ra9BiRLAmT8+gGLestr1XroUkqdjL6w==} + dev: false + + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + requiresBuild: true + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + optional: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + requiresBuild: true + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: false + optional: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: false + + /interface-blockstore@5.2.3: + resolution: {integrity: sha512-15cN+ZFdcVXdXo6I/SrSzFDsuJyDTyEI52XuvXQlR/G5fe3cK8p0tvVjfu5diRQH1XqNgmJEdMPixyt0xgjtvQ==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + interface-store: 5.1.2 + multiformats: 11.0.2 + dev: false + + /interface-store@5.1.2: + resolution: {integrity: sha512-q2sLoqC+UdaWnjwGyghsH0jwqqVk226lsG207e3QwPB8sAZYmYIWUnJwJH3JjFNNRV9e6CUTmm+gDO0Xg4KRiw==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dev: false + + /invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /ipfs-unixfs-exporter@13.1.5: + resolution: {integrity: sha512-O5aMawsHoe4DaYk5FFil2EPrNOaU3pkHC6qUR5JMnW7es93W3b/RjJoO7AyDL1rpb+M3K0oRu86Yc5wLNQQ8jg==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + '@ipld/dag-cbor': 9.0.3 + '@ipld/dag-pb': 4.0.7 + '@multiformats/murmur3': 2.1.7 + err-code: 3.0.1 + hamt-sharding: 3.0.2 + interface-blockstore: 5.2.3 + ipfs-unixfs: 11.1.2 + it-filter: 3.0.4 + it-last: 3.0.4 + it-map: 3.0.5 + it-parallel: 3.0.6 + it-pipe: 3.0.1 + it-pushable: 3.2.3 + multiformats: 11.0.2 + p-queue: 7.4.1 + progress-events: 1.0.0 + uint8arrays: 4.0.10 + dev: false + + /ipfs-unixfs-importer@15.1.5: + resolution: {integrity: sha512-TXaOI0M5KNpq2+qLw8AIYd0Lnc0gWTKCBqUd9eErBUwaP3Fna4qauF+JX9Rj2UrwaOvG/1xbF8Vm+92eOcKWMA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + '@ipld/dag-pb': 4.0.7 + '@multiformats/murmur3': 2.1.7 + err-code: 3.0.1 + hamt-sharding: 3.0.2 + interface-blockstore: 5.2.3 + interface-store: 5.1.2 + ipfs-unixfs: 11.1.2 + it-all: 3.0.4 + it-batch: 3.0.4 + it-first: 3.0.4 + it-parallel-batch: 3.0.4 + multiformats: 11.0.2 + progress-events: 1.0.0 + rabin-wasm: 0.1.5 + uint8arraylist: 2.4.8 + uint8arrays: 4.0.10 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /ipfs-unixfs@11.1.2: + resolution: {integrity: sha512-HVjrACOhU8RgMskcrfydk+FDAE9pFKr8tneKLaVYQ2f81HUKXoiSdgsAJY/jt7Ieyj4tE12TZGduIeWtNpScOw==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + err-code: 3.0.1 + protons-runtime: 5.2.1 + uint8arraylist: 2.4.8 + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + + /is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + dev: false + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.0 + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /it-all@3.0.4: + resolution: {integrity: sha512-UMiy0i9DqCHBdWvMbzdYvVGa5/w4t1cc4nchpbnjdLhklglv8mQeEYnii0gvKESJuL1zV32Cqdb33R6/GPfxpQ==} + dev: false + + /it-batch@3.0.4: + resolution: {integrity: sha512-WRu2mqOYIs+T9k7+yxSK9VJdk0UE4R0jKQsWQcti5c6vhb1FhjC2+yCB5XBrctQ9edNfCMU/wVzdDj8qSwimbA==} + dev: false + + /it-filter@3.0.4: + resolution: {integrity: sha512-e0sz+st4sudK/zH6GZ/gRTRP8A/ADuJFCYDmRgMbZvR79y5+v4ZXav850bBZk5wL9zXaYZFxS1v/6Qi+Vjwh5g==} + dependencies: + it-peekable: 3.0.3 + dev: false + + /it-first@3.0.4: + resolution: {integrity: sha512-FtQl84iTNxN5EItP/JgL28V2rzNMkCzTUlNoj41eVdfix2z1DBuLnBqZ0hzYhGGa1rMpbQf0M7CQSA2adlrLJg==} + dev: false + + /it-last@3.0.4: + resolution: {integrity: sha512-Ns+KTsQWhs0KCvfv5X3Ck3lpoYxHcp4zUp4d+AOdmC8cXXqDuoZqAjfWhgCbxJubXyIYWdfE2nRcfWqgvZHP8Q==} + dev: false + + /it-map@3.0.5: + resolution: {integrity: sha512-hB0TDXo/h4KSJJDSRLgAPmDroiXP6Fx1ck4Bzl3US9hHfZweTKsuiP0y4gXuTMcJlS6vj0bb+f70rhkD47ZA3w==} + dependencies: + it-peekable: 3.0.3 + dev: false + + /it-merge@3.0.3: + resolution: {integrity: sha512-FYVU15KC5pb/GQX1Ims+lee8d4pdqGVCpWr0lkNj8o4xuNo7jY71k6GuEiWdP+T7W1bJqewSxX5yoTy5yZpRVA==} + dependencies: + it-pushable: 3.2.3 + dev: false + + /it-parallel-batch@3.0.4: + resolution: {integrity: sha512-O1omh8ss8+UtXiMjE+8kM5C20DT0Ma4VtKVfrSHOJU0UHZ+iWBXarabzPYEp+WiuQmrv+klDPPlTZ9KaLN9xOA==} + dependencies: + it-batch: 3.0.4 + dev: false + + /it-parallel@3.0.6: + resolution: {integrity: sha512-i7UM7I9LTkDJw3YIqXHFAPZX6CWYzGc+X3irdNrVExI4vPazrJdI7t5OqrSVN8CONXLAunCiqaSV/zZRbQR56A==} + dependencies: + p-defer: 4.0.0 + dev: false + + /it-peekable@3.0.3: + resolution: {integrity: sha512-Wx21JX/rMzTEl9flx3DGHuPV1KQFGOl8uoKfQtmZHgPQtGb89eQ6RyVd82h3HuP9Ghpt0WgBDlmmdWeHXqyx7w==} + dev: false + + /it-pipe@3.0.1: + resolution: {integrity: sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + it-merge: 3.0.3 + it-pushable: 3.2.3 + it-stream-types: 2.0.1 + dev: false + + /it-pushable@3.2.3: + resolution: {integrity: sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==} + dependencies: + p-defer: 4.0.0 + dev: false + + /it-stream-types@2.0.1: + resolution: {integrity: sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dev: false + + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + /jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /jsbi@4.3.0: + resolution: {integrity: sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==} + dev: false + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: false + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /k-bucket@5.1.0: + resolution: {integrity: sha512-Fac7iINEovXIWU20GPnOMLUbjctiS+cnmyjC4zAUgvs3XPf1vo9akfCHkigftSic/jiKqKl+KA3a/vFcJbHyCg==} + dependencies: + randombytes: 2.1.0 + dev: false + + /k-rpc-socket@1.11.1: + resolution: {integrity: sha512-8xtA8oqbZ6v1Niryp2/g4GxW16EQh5MvrUylQoOG+zcrDff5CKttON2XUXvMwlIHq4/2zfPVFiinAccJ+WhxoA==} + dependencies: + bencode: 2.0.3 + chrome-dgram: 3.0.6 + chrome-dns: 1.0.1 + chrome-net: 3.3.4 + dev: false + + /k-rpc@5.1.0: + resolution: {integrity: sha512-FGc+n70Hcjoa/X2JTwP+jMIOpBz+pkRffHnSl9yrYiwUxg3FIgD50+u1ePfJUOnRCnx6pbjmVk5aAeB1wIijuQ==} + dependencies: + k-bucket: 5.1.0 + k-rpc-socket: 1.11.1 + randombytes: 2.1.0 + dev: false + + /last-one-wins@1.0.4: + resolution: {integrity: sha512-t+KLJFkHPQk8lfN6WBOiGkiUXoub+gnb2XTYI2P3aiISL+94xgZ1vgz1SXN/N4hthuOoLXarXfBZPUruyjQtfA==} + dev: false + + /layerr@2.0.1: + resolution: {integrity: sha512-z0730CwG/JO24evdORnyDkwG1Q7b7mF2Tp1qRQ0YvrMMARbt1DFG694SOv439Gm7hYKolyZyaB49YIrYIfZBdg==} + dev: false + + /level-supports@4.0.1: + resolution: {integrity: sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==} + engines: {node: '>=12'} + dev: false + + /level-transcoder@1.0.1: + resolution: {integrity: sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==} + engines: {node: '>=12'} + dependencies: + buffer: 6.0.3 + module-error: 1.0.2 + dev: false + + /level@8.0.0: + resolution: {integrity: sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==} + engines: {node: '>=12'} + dependencies: + browser-level: 1.0.1 + classic-level: 1.3.0 + dev: false + + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + /lilconfig@3.0.0: + resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} + engines: {node: '>=14'} + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: false + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /lru-cache@10.1.0: + resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} + engines: {node: 14 || >=16.14} + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + requiresBuild: true + dependencies: + yallist: 4.0.0 + dev: false + optional: true + + /lru-cache@9.1.2: + resolution: {integrity: sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==} + engines: {node: 14 || >=16.14} + dev: false + + /lru@3.1.0: + resolution: {integrity: sha512-5OUtoiVIGU4VXBOshidmtOsvBIvcQR6FD/RzWSvaeHyxCGB+PCUCu+52lqMfdc0h/2CLvHhZS4TwUmMQrrMbBQ==} + engines: {node: '>= 0.4.0'} + dependencies: + inherits: 2.0.4 + dev: false + + /lucide-react@0.298.0(react@18.2.0): + resolution: {integrity: sha512-tWoxZ663Zf/n8VxXTHnTJsU/w1ysWT1LORnIL1pzqElFdSqBhWbZeJ3sLdCZ5FpzpbkpkYEtluhuTyG2BTDYNQ==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /make-cancellable-promise@1.3.2: + resolution: {integrity: sha512-GCXh3bq/WuMbS+Ky4JBPW1hYTOU+znU+Q5m9Pu+pI8EoUqIHk9+tviOKC6/qhHh8C4/As3tzJ69IF32kdz85ww==} + dev: false + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + requiresBuild: true + dependencies: + semver: 6.3.1 + dev: false + optional: true + + /make-event-props@1.6.2: + resolution: {integrity: sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA==} + dev: false + + /memoize-one@5.2.1: + resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + dev: false + + /merge-refs@1.2.2(@types/react@18.2.46): + resolution: {integrity: sha512-RwcT7GsQR3KbuLw1rRuodq4Nt547BKEBkliZ0qqsrpyNne9bGTFtsFIsIpx82huWhcl3kOlOlH4H0xkPk/DqVw==} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.46 + dev: false + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + /mimic-response@2.1.0: + resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} + engines: {node: '>=8'} + requiresBuild: true + dev: false + optional: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + requiresBuild: true + dependencies: + brace-expansion: 1.1.11 + dev: false + optional: true + + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: false + + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + requiresBuild: true + dependencies: + yallist: 4.0.0 + dev: false + optional: true + + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + requiresBuild: true + dev: false + optional: true + + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + requiresBuild: true + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + dev: false + optional: true + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + requiresBuild: true + dev: false + optional: true + + /module-error@1.0.2: + resolution: {integrity: sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==} + engines: {node: '>=10'} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: false + + /multibase@4.0.6: + resolution: {integrity: sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ==} + engines: {node: '>=12.0.0', npm: '>=6.0.0'} + deprecated: This module has been superseded by the multiformats module + dependencies: + '@multiformats/base-x': 4.0.1 + dev: false + + /multiformats@11.0.2: + resolution: {integrity: sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dev: false + + /multiformats@12.1.3: + resolution: {integrity: sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dev: false + + /multiformats@13.0.0: + resolution: {integrity: sha512-xiIB0p7EKmETm3wyKedOg/xuyQ18PoWwXCzzgpZAiDxL9ktl3XTh8AqoDT5kAqRg+DU48XAGPsUJL2Rn6Bx3Lw==} + dev: false + + /multiformats@9.9.0: + resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + dev: false + + /multihashes@4.0.3: + resolution: {integrity: sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA==} + engines: {node: '>=12.0.0', npm: '>=6.0.0'} + dependencies: + multibase: 4.0.6 + uint8arrays: 3.1.1 + varint: 5.0.2 + dev: false + + /murmurhash3js-revisited@3.0.0: + resolution: {integrity: sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==} + engines: {node: '>=8.0.0'} + dev: false + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + /nan@2.18.0: + resolution: {integrity: sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==} + requiresBuild: true + dev: false + optional: true + + /nanoassert@2.0.0: + resolution: {integrity: sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==} + dev: false + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /napi-macros@2.2.2: + resolution: {integrity: sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==} + dev: false + + /node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /node-gyp-build@4.7.1: + resolution: {integrity: sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg==} + hasBin: true + dev: false + + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + dev: true + + /nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + requiresBuild: true + dependencies: + abbrev: 1.1.1 + dev: false + optional: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-wheel@1.0.1: + resolution: {integrity: sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==} + dev: false + + /npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + requiresBuild: true + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + dev: false + optional: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + requiresBuild: true + dependencies: + wrappy: 1.0.2 + dev: false + optional: true + + /p-defer@4.0.0: + resolution: {integrity: sha512-Vb3QRvQ0Y5XnF40ZUWW7JfLogicVh/EnA5gBIvKDJoYpeI82+1E3AlB9yOcKFS0AhHrWVnAQO39fbR0G99IVEQ==} + engines: {node: '>=12'} + dev: false + + /p-queue@7.4.1: + resolution: {integrity: sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==} + engines: {node: '>=12'} + dependencies: + eventemitter3: 5.0.1 + p-timeout: 5.1.0 + dev: false + + /p-timeout@5.1.0: + resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} + engines: {node: '>=12'} + dev: false + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dev: false + optional: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.1.0 + minipass: 7.0.4 + + /path2d-polyfill@2.0.1: + resolution: {integrity: sha512-ad/3bsalbbWhmBo0D6FZ4RNMwsLsPpL6gnvhuSaU5Vm7b06Kr5ubSltQQ0T7YKsiJQO+g22zJ4dJKNTXIyOXtA==} + engines: {node: '>=8'} + requiresBuild: true + dev: false + optional: true + + /pdfjs-dist@3.11.174: + resolution: {integrity: sha512-TdTZPf1trZ8/UFu5Cx/GXB7GZM30LT+wWUNfsi6Bq8ePLnb+woNKtDymI2mxZYBpMbonNFqKmiz684DIfnd8dA==} + engines: {node: '>=18'} + optionalDependencies: + canvas: 2.11.2 + path2d-polyfill: 2.0.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + /pkarr@1.1.1: + resolution: {integrity: sha512-X27LKqf83X3WuJd2Z9qdfVxkmfOu6HUbY0pm11LqeBbFmgmZRPgOxJG8bKiIsmmD6Vjc25j45KHYflF2lfodyQ==} + hasBin: true + dependencies: + bencode: 3.1.1 + bittorrent-dht: 11.0.5 + chalk: 5.3.0 + dns-packet: 5.6.1 + graceful-goodbye: 1.3.0 + sodium-universal: 4.0.0 + z32: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /postcss-import@15.1.0(postcss@8.4.32): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + + /postcss-js@4.0.1(postcss@8.4.32): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.32 + + /postcss-load-config@4.0.2(postcss@8.4.32): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.0.0 + postcss: 8.4.32 + yaml: 2.3.4 + + /postcss-nested@6.0.1(postcss@8.4.32): + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.32 + postcss-selector-parser: 6.0.15 + + /postcss-selector-parser@6.0.15: + resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + /postcss@8.4.32: + resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: false + + /progress-events@1.0.0: + resolution: {integrity: sha512-zIB6QDrSbPfRg+33FZalluFIowkbV5Xh1xSuetjG+rlC5he6u2dc6VQJ0TbMdlN3R1RHdpOqxEFMKTnQ+itUwA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dev: false + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: false + + /protons-runtime@5.2.1: + resolution: {integrity: sha512-Rt4ORm1WR62ysrXX5sCV32a5jPwVoIpU90XUzrdAfMIOSNTizvqlx/7wedNpogvZjUUY/gLJp3VftpA+ebx/og==} + dependencies: + uint8arraylist: 2.4.8 + uint8arrays: 5.0.1 + dev: false + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /rabin-wasm@0.1.5: + resolution: {integrity: sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA==} + hasBin: true + dependencies: + '@assemblyscript/loader': 0.9.4 + bl: 5.1.0 + debug: 4.3.4 + minimist: 1.2.8 + node-fetch: 2.7.0 + readable-stream: 3.6.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /react-dom@18.2.0(react@18.2.0): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: false + + /react-dropzone@14.2.3(react@18.2.0): + resolution: {integrity: sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==} + engines: {node: '>= 10.13'} + peerDependencies: + react: '>= 16.8 || 18.0.0' + dependencies: + attr-accept: 2.2.2 + file-selector: 0.6.0 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /react-easy-crop@5.0.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-JfzSk4cBHoksgAtgWUHR/jDYretebMxS0rpAlltP1LeELGMj4WTa420m4PsYFpgQXoJZV0DXmINUlBWAoAD/PQ==} + peerDependencies: + react: '>=16.4.0' + react-dom: '>=16.4.0' + dependencies: + normalize-wheel: 1.0.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.0.1 + dev: false + + /react-hook-form@7.49.2(react@18.2.0): + resolution: {integrity: sha512-TZcnSc17+LPPVpMRIDNVITY6w20deMdNi6iehTFLV1x8SqThXGwu93HjlUVU09pzFgZH7qZOvLMM7UYf2ShAHA==} + engines: {node: '>=18', pnpm: '8'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 + dependencies: + react: 18.2.0 + dev: false + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + dev: false + + /react-pdf@7.6.0(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-b2/8V6xhe5pn4Y01ELKTQZ+RhdZl1KpSAMGbN+HCZ/kwhYTIc4Pn5ctz1wRQUu1gOJbIEG4CcjMD9vTCzNdwjw==} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.46 + clsx: 2.1.0 + make-cancellable-promise: 1.3.2 + make-event-props: 1.6.2 + merge-refs: 1.2.2(@types/react@18.2.46) + pdfjs-dist: 3.11.174 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tiny-invariant: 1.3.1 + tiny-warning: 1.0.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /react-refresh@0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + dev: true + + /react-remove-scroll-bar@2.3.4(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.46 + react: 18.2.0 + react-style-singleton: 2.2.1(@types/react@18.2.46)(react@18.2.0) + tslib: 2.6.2 + dev: false + + /react-remove-scroll@2.5.5(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.46 + react: 18.2.0 + react-remove-scroll-bar: 2.3.4(@types/react@18.2.46)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.46)(react@18.2.0) + tslib: 2.6.2 + use-callback-ref: 1.3.1(@types/react@18.2.46)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.46)(react@18.2.0) + dev: false + + /react-router-dom@6.21.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-QCNrtjtDPwHDO+AO21MJd7yIcr41UetYt5jzaB9Y1UYaPTCnVuJq6S748g1dE11OQlCFIQg+RtAA1SEZIyiBeA==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + '@remix-run/router': 1.14.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-router: 6.21.1(react@18.2.0) + dev: false + + /react-router@6.21.1(react@18.2.0): + resolution: {integrity: sha512-W0l13YlMTm1YrpVIOpjCADJqEUpz1vm+CMo47RuFX4Ftegwm6KOYsL5G3eiE52jnJpKvzm6uB/vTKTPKM8dmkA==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + dependencies: + '@remix-run/router': 1.14.1 + react: 18.2.0 + dev: false + + /react-spinners@0.13.8(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3e+k56lUkPj0vb5NDXPVFAOkPC//XyhKPJjvcGjyMNPWsBKpplfeyialP74G7H7+It7KzhtET+MvGqbKgAqpZA==} + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react-style-singleton@2.2.1(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.46 + get-nonce: 1.0.1 + invariant: 2.2.4 + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /react-virtualized-auto-sizer@1.0.20(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-OdIyHwj4S4wyhbKHOKM1wLSj/UDXm839Z3Cvfg2a9j+He6yDa6i5p0qQvEiCnyQlGO/HyfSnigQwuxvYalaAXA==} + peerDependencies: + react: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc + react-dom: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react-window@1.8.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Y0Cx+dnU6NLa5/EvoHukUD0BklJ8qITCtVEPY1C/nL8wwoZ0b5aEw8Ff1dOVHw7fCzMt55XfJDd8S8W8LCaUCg==} + engines: {node: '>8.0.0'} + peerDependencies: + react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.23.7 + memoize-one: 5.2.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: false + + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readable-stream@4.4.2: + resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + dev: false + + /readable-web-to-node-stream@3.0.2: + resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} + engines: {node: '>=8'} + dependencies: + readable-stream: 3.6.2 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + + /record-cache@1.2.0: + resolution: {integrity: sha512-kyy3HWCez2WrotaL3O4fTn0rsIdfRKOdQQcEJ9KpvmKmbffKVvwsloX063EgRUlpJIXHiDQFhJcTbZequ2uTZw==} + dependencies: + b4a: 1.6.4 + dev: false + + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + dev: false + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: false + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + requiresBuild: true + dependencies: + glob: 7.2.3 + dev: false + optional: true + + /rollup@3.29.4: + resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /run-parallel-limit@1.1.0: + resolution: {integrity: sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==} + dependencies: + queue-microtask: 1.2.3 + dev: false + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /run-series@1.1.9: + resolution: {integrity: sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==} + dev: false + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /safety-catch@1.0.2: + resolution: {integrity: sha512-C1UYVZ4dtbBxEtvOcpjBaaD27nP8MlvyAQEp2fOTOEe6pfUpk1cDUxij6BR1jZup6rSyUTaBBplK7LanskrULA==} + dev: false + + /scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + requiresBuild: true + dependencies: + lru-cache: 6.0.0 + dev: false + optional: true + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + requiresBuild: true + dev: false + optional: true + + /sha256-universal@1.2.1: + resolution: {integrity: sha512-ghn3muhdn1ailCQqqceNxRgkOeZSVfSE13RQWEg6njB+itsFzGVSJv+O//2hvNXZuxVIRyNzrgsZ37SPDdGJJw==} + dependencies: + b4a: 1.6.4 + sha256-wasm: 2.2.2 + dev: false + + /sha256-wasm@2.2.2: + resolution: {integrity: sha512-qKSGARvao+JQlFiA+sjJZhJ/61gmW/3aNLblB2rsgIxDlDxsJPHo8a1seXj12oKtuHVgJSJJ7QEGBUYQN741lQ==} + dependencies: + b4a: 1.6.4 + nanoassert: 2.0.0 + dev: false + + /sha512-universal@1.2.1: + resolution: {integrity: sha512-kehYuigMoRkIngCv7rhgruLJNNHDnitGTBdkcYbCbooL8Cidj/bS78MDxByIjcc69M915WxcQTgZetZ1JbeQTQ==} + dependencies: + b4a: 1.6.4 + sha512-wasm: 2.3.4 + dev: false + + /sha512-wasm@2.3.4: + resolution: {integrity: sha512-akWoxJPGCB3aZCrZ+fm6VIFhJ/p8idBv7AWGFng/CZIrQo51oQNsvDbTSRXWAzIiZJvpy16oIDiCCPqTe21sKg==} + dependencies: + b4a: 1.6.4 + nanoassert: 2.0.0 + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + requiresBuild: true + dev: false + optional: true + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + requiresBuild: true + dev: false + optional: true + + /simple-get@3.1.1: + resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} + requiresBuild: true + dependencies: + decompress-response: 4.2.1 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false + optional: true + + /siphash24@1.3.1: + resolution: {integrity: sha512-moemC3ZKiTzH29nbFo3Iw8fbemWWod4vNs/WgKbQ54oEs6mE6XVlguxvinYjB+UmaE0PThgyED9fUkWvirT8hA==} + dependencies: + nanoassert: 2.0.0 + dev: false + + /sodium-javascript@0.8.0: + resolution: {integrity: sha512-rEBzR5mPxPES+UjyMDvKPIXy9ImF17KOJ32nJNi9uIquWpS/nfj+h6m05J5yLJaGXjgM72LmQoUbWZVxh/rmGg==} + dependencies: + blake2b: 2.1.4 + chacha20-universal: 1.0.4 + nanoassert: 2.0.0 + sha256-universal: 1.2.1 + sha512-universal: 1.2.1 + siphash24: 1.3.1 + xsalsa20: 1.2.0 + dev: false + + /sodium-native@4.0.4: + resolution: {integrity: sha512-faqOKw4WQKK7r/ybn6Lqo1F9+L5T6NlBJJYvpxbZPetpWylUVqz449mvlwIBKBqxEHbWakWuOlUt8J3Qpc4sWw==} + requiresBuild: true + dependencies: + node-gyp-build: 4.7.1 + dev: false + + /sodium-universal@4.0.0: + resolution: {integrity: sha512-iKHl8XnBV96k1c75gwwzANFdephw/MDWSjQAjPmBE+du0y3P23Q8uf7AcdcfFsYAMwLg7WVBfSAIBtV/JvRsjA==} + dependencies: + blake2b: 2.1.4 + chacha20-universal: 1.0.4 + nanoassert: 2.0.0 + sha256-universal: 1.2.1 + sha512-universal: 1.2.1 + siphash24: 1.3.1 + sodium-javascript: 0.8.0 + sodium-native: 4.0.4 + xsalsa20: 1.2.0 + dev: false + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + /sparse-array@1.3.2: + resolution: {integrity: sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg==} + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + + /sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + commander: 4.1.1 + glob: 10.3.10 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /tailwind-merge@2.2.0: + resolution: {integrity: sha512-SqqhhaL0T06SW59+JVNfAqKdqLs0497esifRrZ7jOaefP3o64fdFNDMrAQWZFMxTLJPiHVjRLUywT8uFz1xNWQ==} + dependencies: + '@babel/runtime': 7.23.7 + dev: false + + /tailwindcss-animate@1.0.7(tailwindcss@3.4.0): + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + dependencies: + tailwindcss: 3.4.0 + dev: false + + /tailwindcss@3.4.0: + resolution: {integrity: sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.5.3 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.0 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.32 + postcss-import: 15.1.0(postcss@8.4.32) + postcss-js: 4.0.1(postcss@8.4.32) + postcss-load-config: 4.0.2(postcss@8.4.32) + postcss-nested: 6.0.1(postcss@8.4.32) + postcss-selector-parser: 6.0.15 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + /tar@6.2.0: + resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} + engines: {node: '>=10'} + requiresBuild: true + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: false + optional: true + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + + /tiny-invariant@1.3.1: + resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} + dev: false + + /tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + dev: false + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + /tslib@2.0.1: + resolution: {integrity: sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==} + dev: false + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: false + + /typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /uint8-util@2.2.4: + resolution: {integrity: sha512-uEI5lLozmKQPYEevfEhP9LY3Je5ZmrQhaWXrzTVqrLNQl36xsRh8NiAxYwB9J+2BAt99TRbmCkROQB2ZKhx4UA==} + dependencies: + base64-arraybuffer: 1.0.2 + dev: false + + /uint8arraylist@2.4.8: + resolution: {integrity: sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==} + dependencies: + uint8arrays: 5.0.1 + dev: false + + /uint8arrays@3.1.1: + resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==} + dependencies: + multiformats: 9.9.0 + dev: false + + /uint8arrays@4.0.10: + resolution: {integrity: sha512-AnJNUGGDJAgFw/eWu/Xb9zrVKEGlwJJCaeInlf3BkecE/zcTobk5YXYIPNQJO1q5Hh1QZrQQHf0JvcHqz2hqoA==} + dependencies: + multiformats: 12.1.3 + dev: false + + /uint8arrays@5.0.1: + resolution: {integrity: sha512-ND5RpJAnPgHmZT7hWD/2T4BwRp04j8NLKvMKC/7bhiEwEjUMkQ4kvBKiH6hOqbljd6qJ2xS8reL3vl1e33grOQ==} + dependencies: + multiformats: 13.0.0 + dev: false + + /ulidx@2.1.0: + resolution: {integrity: sha512-DlMi97oP9HASI3kLCjBlOhAG1SoisUrEqC2PJ7itiFbq9q5Zo0JejupXeu2Gke99W62epNzA4MFNToNiq8A5LA==} + engines: {node: '>=16'} + dependencies: + layerr: 2.0.1 + dev: false + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + + /update-browserslist-db@1.0.13(browserslist@4.22.2): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.2 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: false + + /use-callback-ref@1.3.1(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.46 + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /use-sidecar@1.1.2(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.46 + detect-node-es: 1.1.0 + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /use-sync-external-store@1.2.0(react@18.2.0): + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: false + + /varint@5.0.2: + resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==} + dev: false + + /varint@6.0.0: + resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} + dev: false + + /vite@4.5.1(@types/node@20.10.6): + resolution: {integrity: sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.10.6 + esbuild: 0.18.20 + postcss: 8.4.32 + rollup: 3.29.4 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: false + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + requiresBuild: true + dependencies: + string-width: 4.2.3 + dev: false + optional: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + requiresBuild: true + dev: false + optional: true + + /xsalsa20@1.2.0: + resolution: {integrity: sha512-FIr/DEeoHfj7ftfylnoFt3rAIRoWXpx2AoDfrT2qD2wtp7Dp+COajvs/Icb7uHqRW9m60f5iXZwdsJJO3kvb7w==} + dev: false + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + requiresBuild: true + dev: false + optional: true + + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + + /z32@1.0.1: + resolution: {integrity: sha512-Uytfqf6VEVchHKZDw0NRdCViOARHP84uzvOw0CXCMLOwhgHZUL9XibpEPLLQN10mCVLxOlGCQWbkV7km7yNYcw==} + dependencies: + b4a: 1.6.4 + dev: false + + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + dev: false + + /zustand@4.4.7(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-QFJWJMdlETcI69paJwhSMJz7PPWjVP8Sjhclxmxmxv/RYI7ZOvR5BHX+ktH0we9gTWQMxcne8q1OY8xxz604gw==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + dependencies: + '@types/react': 18.2.46 + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index fbdf233..6175df4 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -1,20 +1,20 @@ -import useWeb5Store from "./stores/useWeb5Store"; -import { useEffect } from "react"; +import { Route, Routes, BrowserRouter } from "react-router-dom"; -function App() { - const web5 = useWeb5Store((state) => state.web5); - const connect = useWeb5Store((state) => state.connect); - const did = useWeb5Store((state) => state.did); - - useEffect(() => { - if (!web5) connect(); - }, []); +import SharedLayout from "./pages/SharedLayout/"; +import Home from "./pages/Home/"; +function App() { return ( -
- {did} -
- ) + <> + + + }> + } /> + + + + + ); } export default App; diff --git a/tauri-app/src/index.css b/tauri-app/src/index.css new file mode 100644 index 0000000..cc3d57a --- /dev/null +++ b/tauri-app/src/index.css @@ -0,0 +1,15 @@ +:root { + --color-green: #22c55e; + --box-shadow-green: 0 5px 12px rgba(34, 197, 94, 0.5); + --color-red: #ef4444; + --box-shadow-red: 0 5px 12px rgba(239, 68, 68, 0.5); + --color-blue: #0ea5e9; + --color-white: #fff; + --color-black: #000; + --color-orange: #f97316; +} + +* { + margin: 0; + padding: 0; +} diff --git a/tauri-app/src/main.tsx b/tauri-app/src/main.tsx index 24eb0b3..ca0902c 100644 --- a/tauri-app/src/main.tsx +++ b/tauri-app/src/main.tsx @@ -1,10 +1,10 @@ // import React from "react"; import ReactDOM from "react-dom/client"; import App from "./App"; -import "./globals.css"; +import "./index.css"; ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( // - + , // {/* */} ); diff --git a/tauri-app/src/pages/Home/index.css b/tauri-app/src/pages/Home/index.css new file mode 100644 index 0000000..b026f0a --- /dev/null +++ b/tauri-app/src/pages/Home/index.css @@ -0,0 +1,52 @@ +.main_container { + padding: 40px 65px; +} + +.info_container h1 { + font-size: 40px; + font-family: "Roboto"; + font-weight: 700; + text-transform: uppercase; + margin: 20px 0px; +} + +.header { + font-family: "Roboto"; + font-size: 20px; + font-weight: 500; +} + +.header b { + font-family: "Pacifico"; + text-transform: capitalize; + color: var(--color-blue); +} + +.info_container p { + font-family: "Open Sans"; + font-weight: 200; + margin-bottom: 20px; +} + +.gs_btn { + width: max-content; + background: var(--color-red); + color: var(--color-white); + box-shadow: var(--box-shadow-red); + padding: 15px 20px; + border: none; + border-radius: 5px; + font-size: 20px; + font-family: "Pacifico"; + font-weight: 600; +} + +.gs_btn i { + margin-left: 12px; +} + +@media (max-width: 750px) { + .main_container { + padding: 40px 25px; + } +} diff --git a/tauri-app/src/pages/Home/index.tsx b/tauri-app/src/pages/Home/index.tsx new file mode 100644 index 0000000..c26364f --- /dev/null +++ b/tauri-app/src/pages/Home/index.tsx @@ -0,0 +1,32 @@ +import "./index.css"; + +export default function Home() { + return ( + <> +
+
+
+ + Hi welcome to, + + pulsepal + + +

Stay up & running while connected

+

+ Pulsepal utilizes web5 to safely store critical user medical + records.Keeping it safe from data loss and give the user full + control over there data as well as keeping,verifying and tracking + home remedies from people with similar conditions while keeping + them connected +

+ +
+
+
+
+ + ); +} diff --git a/tauri-app/src/pages/SharedLayout/index.css b/tauri-app/src/pages/SharedLayout/index.css new file mode 100644 index 0000000..e69de29 diff --git a/tauri-app/src/pages/SharedLayout/index.tsx b/tauri-app/src/pages/SharedLayout/index.tsx new file mode 100644 index 0000000..e7f61c9 --- /dev/null +++ b/tauri-app/src/pages/SharedLayout/index.tsx @@ -0,0 +1,40 @@ +import useWeb5Store from "../../stores/useWeb5Store"; +import { useState, useEffect } from "react"; + +import "./index.css"; +import { Outlet } from "react-router-dom"; +import Navbar from "../../../components/Navbar/"; +import MobileNavbar from "../../../components/MobileNavbar/"; + +const index = () => { + const web5 = useWeb5Store((state) => state.web5); + const connect = useWeb5Store((state) => state.connect); + const did = useWeb5Store((state) => state.did); + + useEffect(() => { + if (!web5) connect(); + }, []); + + const [isMobile, setIsMobile] = useState(false); + + useEffect(() => { + if (window.innerWidth < 750) { + setIsMobile(true); + return; + } + + setIsMobile(false); + }, []); + + return ( +
+ +
+ +
+ {isMobile && } +
+ ); +}; + +export default index; From d3bf00884d317945e04d2be8a2f8bdb7bda70a5d Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 31 Dec 2023 14:19:10 +0000 Subject: [PATCH 002/136] created a page to test out the medic record storage --- tauri-app/src/App.tsx | 5 ++ tauri-app/src/pages/medic.tsx | 100 ++++++++++++++++++++++++ tauri-app/src/utils/medical-document.ts | 53 +++++++++---- 3 files changed, 144 insertions(+), 14 deletions(-) create mode 100644 tauri-app/src/pages/medic.tsx diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index 45ade59..8dab653 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -4,6 +4,7 @@ import { useEffect } from "react"; import Home from "./pages/home"; import Connect from "./pages/connect"; import Remedy from "./pages/remedy"; +import MedicPage from "./pages/medic"; const router = createHashRouter([ { @@ -17,6 +18,10 @@ const router = createHashRouter([ { path: "/remedy", element: , + }, + { + path: "/medic", + element: , } ]); diff --git a/tauri-app/src/pages/medic.tsx b/tauri-app/src/pages/medic.tsx new file mode 100644 index 0000000..76e4a01 --- /dev/null +++ b/tauri-app/src/pages/medic.tsx @@ -0,0 +1,100 @@ +import { FunctionComponent, useEffect, useRef, useState } from "react"; +import useWeb5Store, { schemaOrgProtocolDefinition } from "@/stores/useWeb5Store"; +import { MedicalDocument, MedicalRecord, createItem, createQuantityMagnitude } from "@/utils/medical-document"; + +const MedicPage: FunctionComponent = () => { + const { web5, connect } = useWeb5Store((state) => ({ web5: state.web5!, connect: state.connect })); + const medicalRecord = useRef(new MedicalDocument(web5, schemaOrgProtocolDefinition.protocol)) + const [form, setForm] = useState<{ + name: string, + magnitude: number, + unit: string, + comment?: string + }>({ + name: "", + magnitude: 0, + unit: "kg", + comment: undefined + }) + + const [historyEvents, setHistoryEvents] = useState[]>([]) + + const addHistoryEvent = () => { + const historyEvent = { + time: new Date(), + state: createItem({ + name: form.name, + value: createQuantityMagnitude({ + magnitude: form.magnitude, + unit: form.unit, + comment: form.comment + }) + }) + } + medicalRecord.current.addHistoryEvent(historyEvent) + setHistoryEvents([...historyEvents, historyEvent]) + } + + const saveMedicalRecord = async () => { + const res = await medicalRecord.current.save() + if (res) { + alert(`Medical record saved: ${res}`) + } + else { + alert("Failed to save record") + } + } + + return ( +
+
{ + e.preventDefault() + saveMedicalRecord() + }}> +
+ setForm({ ...form, name: e.target.value })} + placeholder="Item name. E.g: weight" /> +
+
+ setForm({ ...form, magnitude: parseInt(e.target.value) })} + placeholder="Magnitude" /> + +
+
+ setForm({ ...form, comment: e.target.value })} + placeholder="Comment" /> +
+
+ {historyEvents.map((event, index) => ( +
+ {event.time.toLocaleString()} + {JSON.stringify(event.state)} +
+ ))} +
+ + +
+
+ ) +} + +export default MedicPage diff --git a/tauri-app/src/utils/medical-document.ts b/tauri-app/src/utils/medical-document.ts index c3fc6d1..7296af3 100644 --- a/tauri-app/src/utils/medical-document.ts +++ b/tauri-app/src/utils/medical-document.ts @@ -3,19 +3,26 @@ import { Record as Web5Record, Web5 } from "@web5/api" export namespace MedicalRecord { export type NullFlavor = "253|unknown|" | "271|no information|" | "272|masked|" | "273|not applicable|" - export type Quantity = { - "@type": "DV_QUANTITY", + export type QuantityComment = { + "@type": "DV_TEXT", + value: string + } + + export type QuantityMagnitude = { + "@type": "DV_MAGNITUDE", magnitude: number, - units: string, + unit: string, comment?: string - } | { comment: string } + } + + type Quantity = QuantityMagnitude | QuantityComment export type Element = { "@type": "ELEMENT", name: string, value: Quantity } & ({ - null_flavor: NullFlavor, + null_flavor?: NullFlavor, null_reason?: string } | { null_flavor: NullFlavor, @@ -34,7 +41,7 @@ export namespace MedicalRecord { export type Item = ItemSingle | ItemList - export type Event = { + export type HistoryEvent = { "@type": "EVENT", time: Date, state: Item @@ -45,7 +52,7 @@ export namespace MedicalRecord { origin?: Date, period?: Date, duration?: Date, - events: Event[] + events: HistoryEvent[] } export type Document = { @@ -54,12 +61,28 @@ export namespace MedicalRecord { } } -export function createMedicalRecordItem(element: Omit): MedicalRecord.ItemSingle { +export function createQuantityMagnitude(quantity: Omit): MedicalRecord.QuantityMagnitude { + return { + ...quantity, + "@type": "DV_MAGNITUDE" + } +} + +export function createQuantityComment(quantity: Omit): MedicalRecord.QuantityComment { + return { + ...quantity, + "@type": "DV_TEXT" + } +} + + +export function createItem(element: Omit): MedicalRecord.ItemSingle { return { "@type": "ITEM_SINGLE", - item: Object.assign(element, { + item: { + ...element, "@type": "ELEMENT" - } as const) + } } } @@ -155,7 +178,7 @@ export class MedicalDocument { return false } - const { record: res } = await this._web5.dwn.records.create({ + const res = await this._web5.dwn.records.create({ data: { "@context": "https://schema.org", "@type": "MEDICAL_RECORD", @@ -163,13 +186,15 @@ export class MedicalDocument { comment: this._comment }, message: { - schema: "https://schema.org/OpenEHR", + schema: "https://schema.org/Person", dataFormat: "application/json", - protocol: this._protocol + protocol: this._protocol, + protocolPath: "person", }, }) - record = res?.record + record = res.record + console.log(res) if (!record) return false From a22757604db73d81adfc43bb280ba85a9f638434 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 31 Dec 2023 17:17:16 +0000 Subject: [PATCH 003/136] added a useDocument hook --- tauri-app/package.json | 2 + tauri-app/pnpm-lock.yaml | 10 ++ tauri-app/src/stores/useDocuments.ts | 163 +++++++++++++++++++++++++++ 3 files changed, 175 insertions(+) create mode 100644 tauri-app/src/stores/useDocuments.ts diff --git a/tauri-app/package.json b/tauri-app/package.json index fc0659a..ea2631d 100644 --- a/tauri-app/package.json +++ b/tauri-app/package.json @@ -20,6 +20,7 @@ "@web5/api": "^0.8.3", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", + "lodash": "^4.17.21", "lucide-react": "^0.298.0", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -38,6 +39,7 @@ }, "devDependencies": { "@tauri-apps/cli": "^1.5.7", + "@types/lodash": "^4.14.202", "@types/node": "^20.10.5", "@types/react": "^18.2.15", "@types/react-dom": "^18.2.7", diff --git a/tauri-app/pnpm-lock.yaml b/tauri-app/pnpm-lock.yaml index 65b044d..1baf231 100644 --- a/tauri-app/pnpm-lock.yaml +++ b/tauri-app/pnpm-lock.yaml @@ -31,6 +31,9 @@ dependencies: clsx: specifier: ^2.0.0 version: 2.0.0 + lodash: + specifier: ^4.17.21 + version: 4.17.21 lucide-react: specifier: ^0.298.0 version: 0.298.0(react@18.2.0) @@ -81,6 +84,9 @@ devDependencies: '@tauri-apps/cli': specifier: ^1.5.7 version: 1.5.7 + '@types/lodash': + specifier: ^4.14.202 + version: 4.14.202 '@types/node': specifier: ^20.10.5 version: 20.10.5 @@ -1454,6 +1460,10 @@ packages: - supports-color dev: false + /@types/lodash@4.14.202: + resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} + dev: true + /@types/node@20.10.5: resolution: {integrity: sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==} dependencies: diff --git a/tauri-app/src/stores/useDocuments.ts b/tauri-app/src/stores/useDocuments.ts new file mode 100644 index 0000000..9fea14e --- /dev/null +++ b/tauri-app/src/stores/useDocuments.ts @@ -0,0 +1,163 @@ +import { Web5, Record as Web5Record } from '@web5/api'; +import { useState, useEffect } from 'react'; +import { schemaOrgProtocolDefinition } from './useWeb5Store'; +import _ from "lodash" + +export type DigitalDocument = { + "@context": "https://schema.org"; + "@type": "DigitalDocument"; + name: string; + encodingFormat: string; + size: string; + url: string; + identifier: string; + dateCreated?: string; + dateModified?: string; + datePublished: string; + thumbnail?: Blob; + thumbnailUrl?: string; +}; + +type Document = { + record: Web5Record, + id: string + data: DigitalDocument +} + +export function useDocuments(web5: Web5) { + const [documents, setDocuments] = useState([]); + + useEffect(() => { + if (!web5) return; + + async function fetchDocuments() { + const { records } = await web5.dwn.records.query({ + message: { + filter: { + schema: "https://schema.org/DigitalDocument", + }, + dateSort: "createdAscending", + }, + }); + + if (!records) return false + + const docs = []; + for (const record of records) { + const data = await record.data.json(); + docs.push({ + record, + data, + id: record.id + }); + } + setDocuments(docs); + } + fetchDocuments(); + }, [web5]); + + async function createDocument(file: File) { + const { record: uploadedFileResponse } = await web5.dwn.records.create({ + data: new Blob([file], { type: file.type }), + }); + + if (!uploadedFileResponse) return false; + + const { record } = await web5.dwn.records.create({ + data: { + "@context": "https://schema.org", + "@type": "DigitalDocument", + name: file.name, + encodingFormat: file.type, + size: file.size.toString(), + url: uploadedFileResponse.id, + identifier: "", + dateCreated: new Date().toISOString(), + dateModified: new Date().toISOString(), + datePublished: new Date().toISOString(), + }, + message: { + schema: "https://schema.org/DigitalDocument", + protocol: schemaOrgProtocolDefinition.protocol, + protocolPath: "digitalDocument", + dataFormat: "application/json", + published: true + }, + }); + + if (!record) return false; + + const data = await record.data.json(); + const message = { record, data, id: record.id }; + + setDocuments((prevDocs) => [...prevDocs, message]); + } + + async function updateDocument(document: Document, { name, file }: { name?: string, file?: File }) { + let uploadedFileResponse: Web5Record | undefined = undefined + if (file) { + const { record } = await web5.dwn.records.create({ + data: new Blob([file], { type: file.type }), + }); + uploadedFileResponse = record + } + + if (file && !uploadedFileResponse) return false; + + const data = { + name: name ?? file?.name ?? document.data.name, + encodingFormat: file?.type, + size: file?.size.toString(), + url: uploadedFileResponse?.id, + dateModified: new Date().toISOString(), + } + + const responseStatus = await document.record.update({ + data + }); + + // await responseStatus.status + const updatedDoc = _.merge(document, { data }) + + setDocuments((prevDocs) => + prevDocs.map((doc) => + doc.id === document.id + ? updatedDoc + : doc + ) + ); + } + + async function deleteDocument(document: Document) { + await web5.dwn.records.delete({ + message: { + recordId: document.id, + }, + }); + setDocuments((prevDocs) => + prevDocs.filter((doc) => doc.id !== document.id) + ); + } + + async function getDocumentFile(document: Document) { + const { records } = await web5.dwn.records.query({ + message: { + filter: { + recordId: document.data.url, + } + } + }) + + if (!records) return false + + const firstRecord = records[0] + + if (!firstRecord) return false + + const file = new File([await firstRecord.data.blob()], document.data.name, { type: document.data.encodingFormat }); + + return file; + } + + return { documents, createDocument, updateDocument, deleteDocument, getDocumentFile }; +} From fa479543e12c878190c483232b968662c6eb81ae Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Sun, 31 Dec 2023 18:24:26 +0100 Subject: [PATCH 004/136] done with landing page tho awaiting review --- tauri-app/components/FootNavbar/index.css | 87 ++++++ tauri-app/components/FootNavbar/index.tsx | 35 +++ tauri-app/components/MobileNavbar/index.css | 1 + tauri-app/public/pg.jpg | Bin 0 -> 74547 bytes tauri-app/public/pic.jpg | Bin 0 -> 21888 bytes tauri-app/public/pic2.jpg | Bin 0 -> 54940 bytes tauri-app/public/pm.jpg | Bin 0 -> 47392 bytes tauri-app/public/pma.png | Bin 0 -> 249743 bytes tauri-app/src/index.css | 3 + tauri-app/src/pages/Home/index.css | 277 +++++++++++++++++++- tauri-app/src/pages/Home/index.tsx | 139 +++++++++- tauri-app/src/pages/SharedLayout/index.css | 4 + tauri-app/src/pages/SharedLayout/index.tsx | 13 + 13 files changed, 556 insertions(+), 3 deletions(-) create mode 100644 tauri-app/components/FootNavbar/index.css create mode 100644 tauri-app/components/FootNavbar/index.tsx create mode 100644 tauri-app/public/pg.jpg create mode 100644 tauri-app/public/pic.jpg create mode 100644 tauri-app/public/pic2.jpg create mode 100644 tauri-app/public/pm.jpg create mode 100644 tauri-app/public/pma.png diff --git a/tauri-app/components/FootNavbar/index.css b/tauri-app/components/FootNavbar/index.css new file mode 100644 index 0000000..711ee03 --- /dev/null +++ b/tauri-app/components/FootNavbar/index.css @@ -0,0 +1,87 @@ +.footer-container { + background: #000; + padding: var(--padding-desktop); + color: #fff; + display: flex; + justify-content: space-around; + align-items: center; + padding-top: 20px; +} + +.footer-logo-right-container { + margin-right: 50px; + text-align: center; +} + +.footer-logo-right-container h1 { + margin-bottom: 35px; + font-family: "Roboto"; +} + +.footer-logo-right-container p { + font-family: "Roboto"; +} + +.footer-logo-right-container h1 span { + font-family: "Pacifico"; +} + +.footer-link-container { + width: 100%; +} + +.footer-utils-link-container { + display: flex; + align-items: center; + padding: 10px 0px; + justify-content: space-evenly; +} + +.footer-utils-link-container h1 { + font-family: "Roboto"; + font-size: 18px; +} + +.footer-utils-link-container h1 a { + color: #fff; + text-decoration: none; +} + +.footer-line { + width: 50%; + margin: 10px auto; +} + +.footer-link-container p { + color: #fff; + font-family: "Pacifico"; + margin: 10px auto; +} + +.team-container { + width: 100%; + text-align: center; +} + +@media (max-width: 750px) { + .footer-container { + display: block; + background: #000; + padding: var(--padding-mobile); + } + + .footer-utils-link-container { + display: block; + justify-content: center; + } + + .footer-utils-link-container h1 { + margin: 10px auto; + width: max-content; + } + + .footer-logo-right-container { + width: 100%; + margin: 0; + } +} diff --git a/tauri-app/components/FootNavbar/index.tsx b/tauri-app/components/FootNavbar/index.tsx new file mode 100644 index 0000000..8645bb8 --- /dev/null +++ b/tauri-app/components/FootNavbar/index.tsx @@ -0,0 +1,35 @@ +import "./index.css"; + +const index = () => { + return ( +
+
+

+ PulsePal +

+

Copyright © 2023

+
+
+
+

+ Home +

+

+ DIY Remedies +

+

+ Contact Us +

+
+
+
+

+ Made with by pulsepal team. +

+
+
+
+ ); +}; + +export default index; diff --git a/tauri-app/components/MobileNavbar/index.css b/tauri-app/components/MobileNavbar/index.css index 0bfe306..45b1d1c 100644 --- a/tauri-app/components/MobileNavbar/index.css +++ b/tauri-app/components/MobileNavbar/index.css @@ -12,6 +12,7 @@ justify-content: space-around; align-items: center; background: var(--color-white); + z-index: 5; } .menu_item { diff --git a/tauri-app/public/pg.jpg b/tauri-app/public/pg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..86a828a2ea1371b40207e1908eb71532e2af7908 GIT binary patch literal 74547 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 literal 0 HcmV?d00001 diff --git a/tauri-app/public/pic.jpg b/tauri-app/public/pic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0195eff6bd02a0ad09ad8cc242f26c82921cbcb2 GIT binary patch literal 21888 zcmbrk1y~$WurAm$gEPRO!5xAJcXxLu1b26Lg1cLS1Sf&umJrZ};>}e}7lik*;G^)#rKfc>{pSOUp?EAP@+UeYt?=EvT-XgoKf*x{9=%qSOlm z0HCspHjYkU7yvjpy1S~&h?DE;>60Ul17H9dKmgbPz{JeWSxG}$6L?8-QWE5DFGBzD zf2Her;H4x0m|>PxB`5zc`u{70Y3A(e4get47ikW23pcYD9R7msz1*Gu(a&Enj;Y;0 z42JuMU0)jbg7N=htN*}E|3l_Ku;@Q*?%-(tBJ;1!&gKs0|8VaMj`H-dc)<|G7aZYf zW8w9JXJ0V2y@!L%3%-59I1UyjZU6uW{YQ7VFtdKatS=bqs;MsVf&~Ep32ODSuwUMw~i zW-R{{`k(3lQQ$u%|JUHZ)yML$zW>x6xuk`qiHE&A`9GzaIoUgTxRSd$o0wUUGymTQ z@&D(H|E*d7tsPA27M2#S7LG4fX}^pz8%L{`?shb{akp`DB)4(=U-j_+$87(t4gcVO zjO!PGUHk;#7_k7b2^;`&G77+9qXLk(A7412|LiwKWNqNz%+n#;`;T$|f?xRmYC(c9E3g z$^jLEDnPZMR!|pc2s8y+0&Rj0K$oCjUa%Ng0jvo&1Y3b!z`o#c zZ~{0BTm=3MZUT3KN5FI74e$~84+MaqLhv9I5M~H3L;|7$(T7+L495x&|95b8%oGhFcoEe-8Tp(N=Tn=10ToYU`+zi|%+&SD6JQ_SP zJR>|myd1nPycN6`d<1+3d?|b*d>{NA{4V@80s;aa!fON`1X%<<1X~0@ggAr`2sH?u z2vZ2#2!9X}5eX0(5rq&{5KR!>5hD<@5kDjTK%7S0MZ85qMIu9DN0LU;M{-08Man>` zMCw4AM%qJqK!zdHAoC-uAe$rmASWUhBex+>AnzhSpkSiBMiD~MM6pE)LCHd?M(IOY zMY%#nMWsaLLsdhyK@CRDLj8(5h`Nb-2gQOiKqa7Wp&rl#Xc@E1ojNOO5i-Umk8b=Pt7AF?x3(h#sIW871C$2WGH*PNOcias;2p%n-9G*R1B3>Qd zJl_2)l2>A{EM7&ws(v;7>IR<(UliX0KL)=Be-8hifSf>zz>Xl9pqXHe5RQ<6P>s-w z@FQU#;V}^okpPhyQ4CQX(K0cZn1NWG*pK)V@hI^h5>gTw5@(WZk{*&{Qan;oQd`nA z(hkxCGHfzoG8?iqvL9rJRl&>kZC_^c0DA%Y^ zsCcO?snV#rsm`g%sFkSwsjH}$X^?4nX{>27X$EL+XkXLn&_>cW)9$~mB1NomtlHUxxd1B>awP!76U17swlV=NMYh$})XJ9vD z&t;$GK;w|+2;ykrxZq^uwBY>6xyXghrNkA<)y?&nn}^$#yPErehnmNjCy!@=7l&7s zH;#9Z51vn)FNp6O-yJ_UzdL^&|Cs=@fSo|4z`o#XK?}iR!EGT*ArqlOp$%bjVPoL} z;SCWA5fhOjku6awQFGB!(LFJGF(=nNC@FSq0f-*#$WgIWxHmxpR3Q`2hJ|1*n3CLXN_gB7>r< zVw)0JNnR;cX;qm<*-^P!1yGSwNmW@>eXZ)E+OCG6rmB{!_Dh{j-Cun`16#vLqf+Bq zQ(QAqb480z%R{SM8$wd8k0vT6MJ9ht# zkQ|I1S{<<*?HqfZNS(Z$rkoj_Bb+x}_+8Rn&RrE;OWi| zVb5I8TQ6;|dT&f`NAFP|2A^o3Jzr_x5c20!az`*nc?e2~UC3A{YiLU7?=YRPws4a0;PCDDGViM*&?8(U79s^A^P}LRY@)`aIij

{KPDk0IVQ~~izJt)V5az{Y^N%vHl>lL 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�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 I0J2~I*{(3C$p8QV literal 0 HcmV?d00001 diff --git a/tauri-app/public/pic2.jpg b/tauri-app/public/pic2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..986a06f3dc0bc89b37b67b2ebf8ad2b5f04d2bb7 GIT binary patch literal 54940 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 z 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 Sb@Cw+w6B~1gP_>X>HpcwRqylw literal 0 HcmV?d00001 diff --git a/tauri-app/public/pma.png b/tauri-app/public/pma.png new file mode 100644 index 0000000000000000000000000000000000000000..d60b845a0bdaed3f9aa9eb8c8ed47c860e9c4f50 GIT binary patch literal 249743 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

*sQzOwFw3K==Bos9fY$78~VUeLsr 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 z

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

    rx}wGCgV=zj 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 -
    +
    + + + +
    +

    Major Technologies

    +
    +
    + +

    Blockchain

    +

    + Pulsepal utililizes blockchain technology specifically web5 to + ensure the immutability of user data stored making it a breeze + to safely store medical data/records. +

    +
    +
    + +

    A.I

    +

    + Pulsepal uses articial intelligence to aid users with similiar + medical conditions find matches who can relate with them and + also find doctors/specialist within there regions on such + condition. +

    +
    +
    + +

    React

    +

    + Pulsepal employes react a frontend framework to power our + frontend along with typescript enabling better user experience + and smoother and faster development,updates and feature roll + outs giving quality product delivery. +

    +
    +
    +
    + + + +
    +
    +
    +

    + "Our Culture" +

    +

    + A culture where innovation and empathy converge to create + impactful solutions. Team members are driven by a shared + commitment to improving healthcare outcomes through cutting-edge + technology. +

    +
    +
    + + + +
    +

    Testimonials

    +
    +
    +
    +
    + +

    Dave

    +
    +
    +

    + Pulsepal has being awesome so far making it a breeze + to keep track of my medical history coupled with guidance + have made staying healthy so much more accessible. The + user-friendly interface and helpful home remedies{" "} + keep me on prepared for emergency breakouts.{" "} + Thank you +

    +
    +
    +
    +
    + +

    Greg

    +
    +
    +

    + Knowing that blockchain is being used and it's + immutaility makes feel safer from losing such vital records + and there + chat functionality is quite great feel's nice to know + others with the same condition as me.Great job +

    +
    +
    +
    +
    +
    + +

    Nikki

    +
    +
    +

    + Using it for quite a while now and it had being nice + especially a beta feature,i heard it can find out what + is wrong with your just from your + finger print it is cool can't wait for the roll + out,talk about a.i in action +

    +
    +
    +
    +
    + + + ); diff --git a/tauri-app/src/pages/SharedLayout/index.css b/tauri-app/src/pages/SharedLayout/index.css index e69de29..b570e86 100644 --- a/tauri-app/src/pages/SharedLayout/index.css +++ b/tauri-app/src/pages/SharedLayout/index.css @@ -0,0 +1,4 @@ +.b-wave-m { + position: relative; + top: 10px; +} diff --git a/tauri-app/src/pages/SharedLayout/index.tsx b/tauri-app/src/pages/SharedLayout/index.tsx index e7f61c9..5858a40 100644 --- a/tauri-app/src/pages/SharedLayout/index.tsx +++ b/tauri-app/src/pages/SharedLayout/index.tsx @@ -5,6 +5,7 @@ import "./index.css"; import { Outlet } from "react-router-dom"; import Navbar from "../../../components/Navbar/"; import MobileNavbar from "../../../components/MobileNavbar/"; +import FootNavbar from "../../../components/FootNavbar/"; const index = () => { const web5 = useWeb5Store((state) => state.web5); @@ -33,6 +34,18 @@ const index = () => { {isMobile && } + + + + ); }; From ea09f233213354884564a3ec82d6c284416a3640 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 31 Dec 2023 17:45:04 +0000 Subject: [PATCH 005/136] updated the code to upload docs --- tauri-app/src/pages/medic.tsx | 116 ++++++++++++++------------- tauri-app/src/stores/useDocuments.ts | 55 ++++++------- 2 files changed, 88 insertions(+), 83 deletions(-) diff --git a/tauri-app/src/pages/medic.tsx b/tauri-app/src/pages/medic.tsx index 76e4a01..ff5ca8c 100644 --- a/tauri-app/src/pages/medic.tsx +++ b/tauri-app/src/pages/medic.tsx @@ -1,42 +1,55 @@ import { FunctionComponent, useEffect, useRef, useState } from "react"; import useWeb5Store, { schemaOrgProtocolDefinition } from "@/stores/useWeb5Store"; -import { MedicalDocument, MedicalRecord, createItem, createQuantityMagnitude } from "@/utils/medical-document"; +import { useDocuments } from "@/stores/useDocuments"; const MedicPage: FunctionComponent = () => { const { web5, connect } = useWeb5Store((state) => ({ web5: state.web5!, connect: state.connect })); - const medicalRecord = useRef(new MedicalDocument(web5, schemaOrgProtocolDefinition.protocol)) + const { fetchDocuments, documents, createDocument, getDocumentFile } = useDocuments(web5) + const [docsWithImageUrls, setDocsWithImageUrls] = useState<{ + document: typeof documents[0], + url: string + }[]>([]) + const [form, setForm] = useState<{ - name: string, - magnitude: number, - unit: string, - comment?: string + name: string + doc: File }>({ name: "", - magnitude: 0, - unit: "kg", - comment: undefined + doc: new File([], "") }) - const [historyEvents, setHistoryEvents] = useState[]>([]) + useEffect(() => { + if (web5) { + fetchDocuments() + } + }, [web5]) + + async function processDocsImage() { + const docsWithImageUrls: { document: typeof documents[0], url: string }[] = [] - const addHistoryEvent = () => { - const historyEvent = { - time: new Date(), - state: createItem({ - name: form.name, - value: createQuantityMagnitude({ - magnitude: form.magnitude, - unit: form.unit, - comment: form.comment - }) + for (const doc of documents) { + const file = await getDocumentFile(doc) + let url = "" + if (file) + url = URL.createObjectURL(file) + + docsWithImageUrls.push({ + document: doc, + url }) } - medicalRecord.current.addHistoryEvent(historyEvent) - setHistoryEvents([...historyEvents, historyEvent]) + + setDocsWithImageUrls(docsWithImageUrls) } + useEffect(() => { + processDocsImage() + }, [documents]) + const saveMedicalRecord = async () => { - const res = await medicalRecord.current.save() + const res = await createDocument({ name: form.name ? form.name : undefined, file: form.doc }) + + // console.log(res) if (res) { alert(`Medical record saved: ${res}`) } @@ -45,8 +58,10 @@ const MedicPage: FunctionComponent = () => { } } + console.log(documents) + return ( -
    +
    { e.preventDefault() saveMedicalRecord() @@ -54,45 +69,38 @@ const MedicPage: FunctionComponent = () => {
    setForm({ ...form, name: e.target.value })} - placeholder="Item name. E.g: weight" /> -
    -
    - setForm({ ...form, magnitude: parseInt(e.target.value) })} - placeholder="Magnitude" /> - + placeholder="Name" />
    setForm({ ...form, comment: e.target.value })} - placeholder="Comment" /> -
    -
    - {historyEvents.map((event, index) => ( -
    - {event.time.toLocaleString()} - {JSON.stringify(event.state)} -
    - ))} + onChange={(e) => { + const fileList = e.target.files + if (!fileList) return + + const file = fileList[0] + if (!file) return + + setForm({ + ...form, + doc: file + }) + }} + placeholder="Document" />
    -
    +
    + {docsWithImageUrls.map(({ document, url }) => ( +
    + img +
    + ))} +
    ) } diff --git a/tauri-app/src/stores/useDocuments.ts b/tauri-app/src/stores/useDocuments.ts index 9fea14e..0667df2 100644 --- a/tauri-app/src/stores/useDocuments.ts +++ b/tauri-app/src/stores/useDocuments.ts @@ -27,36 +27,31 @@ type Document = { export function useDocuments(web5: Web5) { const [documents, setDocuments] = useState([]); - useEffect(() => { - if (!web5) return; - - async function fetchDocuments() { - const { records } = await web5.dwn.records.query({ - message: { - filter: { - schema: "https://schema.org/DigitalDocument", - }, - dateSort: "createdAscending", + async function fetchDocuments() { + const { records } = await web5.dwn.records.query({ + message: { + filter: { + schema: "https://schema.org/DigitalDocument", }, - }); + dateSort: "createdAscending", + }, + }); - if (!records) return false + if (!records) return false - const docs = []; - for (const record of records) { - const data = await record.data.json(); - docs.push({ - record, - data, - id: record.id - }); - } - setDocuments(docs); + const docs = []; + for (const record of records) { + const data = await record.data.json(); + docs.push({ + record, + data, + id: record.id + }); } - fetchDocuments(); - }, [web5]); + setDocuments(docs); + } - async function createDocument(file: File) { + async function createDocument({ name, file }: { name: string | undefined, file: File }): Promise { const { record: uploadedFileResponse } = await web5.dwn.records.create({ data: new Blob([file], { type: file.type }), }); @@ -67,7 +62,7 @@ export function useDocuments(web5: Web5) { data: { "@context": "https://schema.org", "@type": "DigitalDocument", - name: file.name, + name: name ?? file.name, encodingFormat: file.type, size: file.size.toString(), url: uploadedFileResponse.id, @@ -88,9 +83,11 @@ export function useDocuments(web5: Web5) { if (!record) return false; const data = await record.data.json(); - const message = { record, data, id: record.id }; + const doc = { record, data, id: record.id }; + + setDocuments((prevDocs) => [...prevDocs, doc]); - setDocuments((prevDocs) => [...prevDocs, message]); + return doc } async function updateDocument(document: Document, { name, file }: { name?: string, file?: File }) { @@ -159,5 +156,5 @@ export function useDocuments(web5: Web5) { return file; } - return { documents, createDocument, updateDocument, deleteDocument, getDocumentFile }; + return { documents, createDocument, updateDocument, deleteDocument, getDocumentFile, fetchDocuments }; } From 1a52908a9a398adee5facd8996bf06e23905b5d4 Mon Sep 17 00:00:00 2001 From: coder12git Date: Mon, 1 Jan 2024 12:34:59 +0530 Subject: [PATCH 006/136] added remedy schema Signed-off-by: coder12git --- tauri-app/package-lock.json | 8 +++ tauri-app/src/pages/remedy.tsx | 102 +++++++++++++++++++++++++++-- tauri-app/src/stores/useRemedy.ts | 104 ++++++++++++++++++++++++++++++ 3 files changed, 208 insertions(+), 6 deletions(-) create mode 100644 tauri-app/src/stores/useRemedy.ts diff --git a/tauri-app/package-lock.json b/tauri-app/package-lock.json index 42b5c04..6bb3ea4 100644 --- a/tauri-app/package-lock.json +++ b/tauri-app/package-lock.json @@ -18,6 +18,7 @@ "@web5/api": "^0.8.3", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", + "lodash": "^4.17.21", "lucide-react": "^0.298.0", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -36,6 +37,7 @@ }, "devDependencies": { "@tauri-apps/cli": "^1.5.7", + "@types/lodash": "^4.14.202", "@types/node": "^20.10.5", "@types/react": "^18.2.15", "@types/react-dom": "^18.2.7", @@ -2041,6 +2043,12 @@ "@babel/types": "^7.20.7" } }, + "node_modules/@types/lodash": { + "version": "4.14.202", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", + "dev": true + }, "node_modules/@types/node": { "version": "20.10.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", diff --git a/tauri-app/src/pages/remedy.tsx b/tauri-app/src/pages/remedy.tsx index d692825..dc3fb36 100644 --- a/tauri-app/src/pages/remedy.tsx +++ b/tauri-app/src/pages/remedy.tsx @@ -1,9 +1,99 @@ -// import React from "react"; +import { FunctionComponent, useEffect, useRef, useState } from "react"; +import useWeb5Store, { schemaOrgProtocolDefinition } from "@/stores/useWeb5Store"; +import { useRemedies } from "@/stores/useRemedy"; -function Remedy (){ - return ( -
    - ) +const Remedy: FunctionComponent = () => { + const { web5, connect } = useWeb5Store((state) => ({ web5: state.web5!, connect: state.connect })); + const { fetchRemedies, remedies, createRemedy } = useRemedies(web5) + const [docsWithImageUrls, setDocsWithImageUrls] = useState<{ + document: typeof remedies[0], + url: string + }[]>([]) + + const [form, setForm] = useState<{ + name: string + description: string + }>({ + name: "", + description: "" + }) + + useEffect(() => { + if (web5) { + fetchRemedies() + } + }, [web5]) + + // async function processDocsImage() { + // const docsWithImageUrls: { document: typeof remedies[0], url: string }[] = [] + + // for (const doc of remedies) { + // const file = await getDocumentFile(doc) + // let url = "" + // if (file) + // url = URL.createObjectURL(file) + + // docsWithImageUrls.push({ + // document: doc, + // url + // }) + // } + + // setDocsWithImageUrls(docsWithImageUrls) + // } + + // useEffect(() => { + // processDocsImage() + // }, [remedies]) + + const saveRemedy = async () => { + const res = await createRemedy({ name: form.name ? form.name : undefined, description: form.description ? form.description : undefined }) + + console.log(res) + if (res) { + alert(`Remedy record saved: ${res}`) + } + else { + alert("Failed to save record") + console.error(); + } + } + + console.log(remedies) + + return ( +
    +
    { + e.preventDefault() + saveRemedy() + }}> +
    + setForm({ ...form, name: e.target.value })} + placeholder="Name" /> +
    +
    + setForm({ ...form, description: e.target.value })} + placeholder="Description" /> +
    + + +
    +
    + {remedies.map((remedy) => ( +
    +

    {remedy.data.name}

    +

    {remedy.data.description}

    +
    + ))} +
    +
    + ) } -export default Remedy; \ No newline at end of file +export default Remedy diff --git a/tauri-app/src/stores/useRemedy.ts b/tauri-app/src/stores/useRemedy.ts new file mode 100644 index 0000000..2104219 --- /dev/null +++ b/tauri-app/src/stores/useRemedy.ts @@ -0,0 +1,104 @@ +import { Web5, Record as Web5Record } from '@web5/api'; +import { useState } from 'react'; +import { schemaOrgProtocolDefinition } from './useWeb5Store'; +import _ from "lodash" + +export type Remedy = { + "@context": "https://schema.org"; + "@type": "Remedy"; + name: string; + description: string; + // Add more properties as needed +}; + +type RemedyDocument = { + record: Web5Record; + id: string; + data: Remedy; +}; + +export function useRemedies(web5: Web5) { + const [remedies, setRemedies] = useState([]); + + async function fetchRemedies() { + const { records } = await web5.dwn.records.query({ + message: { + filter: { + schema: "https://schema.org/DigitalDocument", + }, + dateSort: "createdAscending", + }, + }); + + if (!records) return false; + + const remedies = []; + for (const record of records) { + const data = await record.data.json(); + remedies.push({ + record, + data, + id: record.id, + }); + } + setRemedies(remedies); + } + + async function createRemedy({ name, description }: { name: string | undefined ; description: string | undefined }): Promise { + const { record } = await web5.dwn.records.create({ + data: { + "@context": "https://schema.org", + "@type": "Remedy", + name: name, + description: description, + // Add more properties as needed + }, + message: { + schema: "https://schema.org/DigitalDocument", + protocol: schemaOrgProtocolDefinition.protocol, + protocolPath: "remedy", + dataFormat: "application/json", + published: true, + }, + }); + + if (!record) return false; + + const data = await record.data.json(); + const remedy = { record, data, id: record.id }; + + setRemedies((prevRemedies) => [...prevRemedies, remedy]); + + return remedy; + } + + async function updateRemedy(remedy: RemedyDocument, { name, description }: { name?: string; description?: string }) { + const data = { + name: name ?? remedy.data.name, + description: description ?? remedy.data.description, + // Add more properties as needed + }; + + const responseStatus = await remedy.record.update({ + data, + }); + + const updatedRemedy = _.merge(remedy, { data }); + + setRemedies((prevRemedies) => + prevRemedies.map((r) => (r.id === remedy.id ? updatedRemedy : r)) + ); + } + + async function deleteRemedy(remedy: RemedyDocument) { + await web5.dwn.records.delete({ + message: { + recordId: remedy.id, + }, + }); + + setRemedies((prevRemedies) => prevRemedies.filter((r) => r.id !== remedy.id)); + } + + return { remedies, createRemedy, updateRemedy, deleteRemedy, fetchRemedies }; +} From 3700eb1bd5d68c8f85dde05f9436c4dc9826b092 Mon Sep 17 00:00:00 2001 From: coder12git Date: Mon, 1 Jan 2024 16:15:27 +0530 Subject: [PATCH 007/136] error fixed in remedy Signed-off-by: coder12git --- tauri-app/src/pages/remedy.tsx | 2 +- tauri-app/src/stores/useRemedy.ts | 21 +++++++++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/tauri-app/src/pages/remedy.tsx b/tauri-app/src/pages/remedy.tsx index dc3fb36..9c20385 100644 --- a/tauri-app/src/pages/remedy.tsx +++ b/tauri-app/src/pages/remedy.tsx @@ -59,7 +59,7 @@ const Remedy: FunctionComponent = () => { } } - console.log(remedies) + // console.log(remedies) return (
    diff --git a/tauri-app/src/stores/useRemedy.ts b/tauri-app/src/stores/useRemedy.ts index 2104219..a1118f0 100644 --- a/tauri-app/src/stores/useRemedy.ts +++ b/tauri-app/src/stores/useRemedy.ts @@ -5,9 +5,18 @@ import _ from "lodash" export type Remedy = { "@context": "https://schema.org"; - "@type": "Remedy"; + "@type": "Collection"; name: string; description: string; + encodingFormat: string; + size: string; + url: string; + identifier: string; + dateCreated?: string; + dateModified?: string; + datePublished: string; + thumbnail?: Blob; + thumbnailUrl?: string; // Add more properties as needed }; @@ -24,7 +33,7 @@ export function useRemedies(web5: Web5) { const { records } = await web5.dwn.records.query({ message: { filter: { - schema: "https://schema.org/DigitalDocument", + schema: "https://schema.org/Collection", }, dateSort: "createdAscending", }, @@ -48,21 +57,21 @@ export function useRemedies(web5: Web5) { const { record } = await web5.dwn.records.create({ data: { "@context": "https://schema.org", - "@type": "Remedy", + "@type": "Collection", name: name, description: description, // Add more properties as needed }, message: { - schema: "https://schema.org/DigitalDocument", + schema: "https://schema.org/Collection", protocol: schemaOrgProtocolDefinition.protocol, - protocolPath: "remedy", + protocolPath: "collection", dataFormat: "application/json", published: true, }, }); - if (!record) return false; + if (!record) return false const data = await record.data.json(); const remedy = { record, data, id: record.id }; From 40793bf2834d39cf4b49e497a4dea12a97501925 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Tue, 2 Jan 2024 06:41:25 +0000 Subject: [PATCH 008/136] added a field to store the user's condition --- tauri-app/src/stores/useDocuments.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tauri-app/src/stores/useDocuments.ts b/tauri-app/src/stores/useDocuments.ts index 0667df2..9227b2d 100644 --- a/tauri-app/src/stores/useDocuments.ts +++ b/tauri-app/src/stores/useDocuments.ts @@ -51,7 +51,7 @@ export function useDocuments(web5: Web5) { setDocuments(docs); } - async function createDocument({ name, file }: { name: string | undefined, file: File }): Promise { + async function createDocument({ name, file, condition }: { name: string | undefined, file: File, condition: string }): Promise { const { record: uploadedFileResponse } = await web5.dwn.records.create({ data: new Blob([file], { type: file.type }), }); @@ -67,6 +67,7 @@ export function useDocuments(web5: Web5) { size: file.size.toString(), url: uploadedFileResponse.id, identifier: "", + condition, dateCreated: new Date().toISOString(), dateModified: new Date().toISOString(), datePublished: new Date().toISOString(), @@ -90,7 +91,7 @@ export function useDocuments(web5: Web5) { return doc } - async function updateDocument(document: Document, { name, file }: { name?: string, file?: File }) { + async function updateDocument(document: Document, { name, condition, file }: { name?: string, condition?: string, file?: File }) { let uploadedFileResponse: Web5Record | undefined = undefined if (file) { const { record } = await web5.dwn.records.create({ @@ -106,6 +107,7 @@ export function useDocuments(web5: Web5) { encodingFormat: file?.type, size: file?.size.toString(), url: uploadedFileResponse?.id, + condition, dateModified: new Date().toISOString(), } From 7cdf71c15fae3eca5e8be97c5d483adc5972ea81 Mon Sep 17 00:00:00 2001 From: coder12git Date: Tue, 2 Jan 2024 18:00:32 +0530 Subject: [PATCH 009/136] added remedy feature Signed-off-by: coder12git --- tauri-app/src/pages/remedy.tsx | 99 ++++++++++++++++++++-------- tauri-app/src/stores/useDocuments.ts | 1 + tauri-app/src/stores/useRemedy.ts | 38 ++++++++++- 3 files changed, 108 insertions(+), 30 deletions(-) diff --git a/tauri-app/src/pages/remedy.tsx b/tauri-app/src/pages/remedy.tsx index 9c20385..6dae49d 100644 --- a/tauri-app/src/pages/remedy.tsx +++ b/tauri-app/src/pages/remedy.tsx @@ -2,9 +2,28 @@ import { FunctionComponent, useEffect, useRef, useState } from "react"; import useWeb5Store, { schemaOrgProtocolDefinition } from "@/stores/useWeb5Store"; import { useRemedies } from "@/stores/useRemedy"; +const cards = [ + { + name: "Cancer", + description: "Dangerous..." + }, + { + name: "Cancer", + description: "Dangerous..." + }, + { + name: "Cancer", + description: "Dangerous..." + }, + { + name: "Cancer", + description: "Dangerous..." + } +] + const Remedy: FunctionComponent = () => { const { web5, connect } = useWeb5Store((state) => ({ web5: state.web5!, connect: state.connect })); - const { fetchRemedies, remedies, createRemedy } = useRemedies(web5) + const { fetchRemedies, remedies, createRemedy, deleteRemedy, updateRemedy, getDocumentFile } = useRemedies(web5) const [docsWithImageUrls, setDocsWithImageUrls] = useState<{ document: typeof remedies[0], url: string @@ -13,9 +32,11 @@ const Remedy: FunctionComponent = () => { const [form, setForm] = useState<{ name: string description: string + doc: File }>({ name: "", - description: "" + description: "", + doc: new File([], "") }) useEffect(() => { @@ -24,30 +45,31 @@ const Remedy: FunctionComponent = () => { } }, [web5]) - // async function processDocsImage() { - // const docsWithImageUrls: { document: typeof remedies[0], url: string }[] = [] + async function processDocsImage() { + const docsWithImageUrls: { document: typeof remedies[0], url: string }[] = [] - // for (const doc of remedies) { - // const file = await getDocumentFile(doc) - // let url = "" - // if (file) - // url = URL.createObjectURL(file) + for (const doc of remedies) { + const file = await getDocumentFile(doc) + let url = "" + if (file) + url = URL.createObjectURL(file) + console.log(url); - // docsWithImageUrls.push({ - // document: doc, - // url - // }) - // } + docsWithImageUrls.push({ + document: doc, + url + }) + } - // setDocsWithImageUrls(docsWithImageUrls) - // } + setDocsWithImageUrls(docsWithImageUrls) + } - // useEffect(() => { - // processDocsImage() - // }, [remedies]) + useEffect(() => { + processDocsImage() + }, [remedies]) const saveRemedy = async () => { - const res = await createRemedy({ name: form.name ? form.name : undefined, description: form.description ? form.description : undefined }) + const res = await createRemedy({ name: form.name ? form.name : undefined, description: form.description ? form.description : undefined , file: form.doc}) console.log(res) if (res) { @@ -59,7 +81,13 @@ const Remedy: FunctionComponent = () => { } } - // console.log(remedies) + // const deleteItem = async (id) => { + // deleteRemedy(id); + // } + + + console.log(remedies) + console.log(docsWithImageUrls) return (
    @@ -84,13 +112,28 @@ const Remedy: FunctionComponent = () => { Create Remedy -
    - {remedies.map((remedy) => ( -
    -

    {remedy.data.name}

    -

    {remedy.data.description}

    -
    - ))} +
    +
    + {cards.map((card, index) => ( +
    +
    {card.name}
    +

    {card.description}

    +
    + ))} +
    +
    +
    +
    + {remedies.map((document) => ( +
    +
    {document.data.name}
    +

    {document.data.description}

    + +
    + +
    + ))} +
    ) diff --git a/tauri-app/src/stores/useDocuments.ts b/tauri-app/src/stores/useDocuments.ts index 0667df2..76c03f0 100644 --- a/tauri-app/src/stores/useDocuments.ts +++ b/tauri-app/src/stores/useDocuments.ts @@ -52,6 +52,7 @@ export function useDocuments(web5: Web5) { } async function createDocument({ name, file }: { name: string | undefined, file: File }): Promise { + const { record: uploadedFileResponse } = await web5.dwn.records.create({ data: new Blob([file], { type: file.type }), }); diff --git a/tauri-app/src/stores/useRemedy.ts b/tauri-app/src/stores/useRemedy.ts index a1118f0..852cebd 100644 --- a/tauri-app/src/stores/useRemedy.ts +++ b/tauri-app/src/stores/useRemedy.ts @@ -53,13 +53,27 @@ export function useRemedies(web5: Web5) { setRemedies(remedies); } - async function createRemedy({ name, description }: { name: string | undefined ; description: string | undefined }): Promise { + async function createRemedy({ name, description, file }: { name: string | undefined ; description: string | undefined; file: File }): Promise { + + const { record: uploadedFileResponse } = await web5.dwn.records.create({ + data: new Blob([file], { type: file.type }), + }); + + if (!uploadedFileResponse) return false; + const { record } = await web5.dwn.records.create({ data: { "@context": "https://schema.org", "@type": "Collection", name: name, description: description, + encodingFormat: file.type, + size: file.size.toString(), + url: uploadedFileResponse?.id, + identifier: "", + dateCreated: new Date().toISOString(), + dateModified: new Date().toISOString(), + datePublished: new Date().toISOString(), // Add more properties as needed }, message: { @@ -109,5 +123,25 @@ export function useRemedies(web5: Web5) { setRemedies((prevRemedies) => prevRemedies.filter((r) => r.id !== remedy.id)); } - return { remedies, createRemedy, updateRemedy, deleteRemedy, fetchRemedies }; + async function getDocumentFile(document: RemedyDocument) { + const { records } = await web5.dwn.records.query({ + message: { + filter: { + recordId: document.data.url, + } + } + }) + + if (!records) return false + + const firstRecord = records[0] + + if (!firstRecord) return false + + const file = new File([await firstRecord.data.blob()], document.data.name, { type: document.data.encodingFormat }); + + return file; + } + + return { remedies, createRemedy, updateRemedy, deleteRemedy, getDocumentFile, fetchRemedies }; } From 36e4799a814dc1bef1dd1c8edcdec49bb7ab9159 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Wed, 3 Jan 2024 00:44:30 +0100 Subject: [PATCH 010/136] records page done -- awaiting furrher reviews by team mate --- .../components/AddCardComponent/index.css | 198 ++++++++++++++++++ .../components/AddCardComponent/index.tsx | 52 +++++ tauri-app/components/Card/index.css | 61 ++++++ tauri-app/components/Card/index.tsx | 48 +++++ .../components/DetailCardComponent/index.css | 75 +++++++ .../components/DetailCardComponent/index.tsx | 57 +++++ tauri-app/components/MobileNavbar/index.tsx | 23 +- tauri-app/components/Navbar/index.css | 2 +- tauri-app/components/Navbar/index.tsx | 25 ++- tauri-app/public/pma.png | Bin 249743 -> 0 bytes tauri-app/src/App.tsx | 2 + tauri-app/src/index.css | 3 + tauri-app/src/pages/Home/index.css | 6 +- tauri-app/src/pages/Home/index.tsx | 51 ++++- tauri-app/src/pages/RecordDetail/index.css | 0 tauri-app/src/pages/RecordDetail/index.tsx | 9 + tauri-app/src/pages/Records/index.css | 96 +++++++++ tauri-app/src/pages/Records/index.tsx | 111 ++++++++++ 18 files changed, 796 insertions(+), 23 deletions(-) create mode 100644 tauri-app/components/AddCardComponent/index.css create mode 100644 tauri-app/components/AddCardComponent/index.tsx create mode 100644 tauri-app/components/Card/index.css create mode 100644 tauri-app/components/Card/index.tsx create mode 100644 tauri-app/components/DetailCardComponent/index.css create mode 100644 tauri-app/components/DetailCardComponent/index.tsx delete mode 100644 tauri-app/public/pma.png create mode 100644 tauri-app/src/pages/RecordDetail/index.css create mode 100644 tauri-app/src/pages/RecordDetail/index.tsx create mode 100644 tauri-app/src/pages/Records/index.css create mode 100644 tauri-app/src/pages/Records/index.tsx diff --git a/tauri-app/components/AddCardComponent/index.css b/tauri-app/components/AddCardComponent/index.css new file mode 100644 index 0000000..62a2e57 --- /dev/null +++ b/tauri-app/components/AddCardComponent/index.css @@ -0,0 +1,198 @@ +.main-add-card-container { + background: var(--color-white); + width: 500px; + min-height: 300px; + position: relative; + z-index: 7; + border-radius: 15px; + padding: var(--padding-desktop); + margin-bottom: 30px; +} + +.main-add-card-container h1 { + font-family: "Roboto"; + font-size: 35px; + font-weight: 400; + margin-bottom: 20px; +} + +.input-form { + display: flex; + justify-content: space-between; + align-items: center; + flex-direction: column; +} + +.input-form input[type="text"] { + width: 60%; + border: none; + background: var(--color-slate); + padding: 10px 2px; + border-radius: 8px; + font-family: "Roboto"; + text-indent: 10px; + outline: none; + margin-bottom: 10px; + margin-right: 40%; +} + +.input-form textarea { + width: 100%; + border: none; + background: var(--color-slate); + padding: 10px 2px; + border-radius: 8px; + font-family: "Roboto"; + text-indent: 10px; + outline: none; + min-height: 80px; +} + +.input-form button { + width: 30%; + border: none; + color: var(--color-white); + background: var(--color-green); + box-shadow: var(--box-shadow-green); + margin-top: 20px; + padding: 5px 2px; + margin-right: 70%; + font-size: 24px; + border-radius: 8px; + font-family: "Pacifico"; + text-indent: 10px; + outline: none; +} + +.input-form p { + color: var(--color-red); + font-family: "Roboto"; + margin-top: 10px; +} + +.form-container { + border: 2px solid var(--color-blue); + border-style: dashed; + border-radius: 15px; + width: 100%; + height: 100px; + margin: 15px 0; + display: flex; + justify-content: center; + align-items: center; + transition: 0.3s; +} + +.form-container-active { + border: 2px solid var(--color-green); + border-radius: 15px; + width: 100%; + height: 100px; + margin: 15px 0; + display: flex; + justify-content: center; + align-items: center; + transition: 0.3s; +} + +.form-container input { + width: 40%; + position: relative; + margin: auto auto; +} + +.form-container-active input { + width: 40%; + position: relative; + margin: auto auto; +} + +.add-mu { + background: var(--color-red); + color: var(--color-white); + box-shadow: var(--box-shadow-red); + width: 35px; + height: 35px; + border-radius: 50%; + font-size: 20px; + display: flex; + justify-content: center; + align-items: center; + position: absolute; + left: 15px; + transform: translateY(20px); +} + +.sadd-mu { + background: var(--color-red); + color: var(--color-white); + box-shadow: var(--box-shadow-red); + width: 35px; + height: 35px; + border-radius: 50%; + font-size: 20px; + display: flex; + justify-content: center; + align-items: center; + position: absolute; + left: 15px; + transform: translateY(50px); + opacity: 0.5; +} + +.uploader-content { + width: 100%; +} + +@media (max-width: 750px) { + .main-add-card-container { + width: 300px; + padding: var(--padding-mobile); + margin-top: 50px; + z-index: 10; + position: relative; + } + + .input-form { + overflow-y: scroll; + height: 400px; + padding: 5px; + } + + .main-add-card-container h1 { + font-size: 25px; + } + + .add-mu, + .sadd-mu { + top: 20px; + left: 265px; + } + + .sadd-mu { + transform: translateY(13px); + } + + .form-container, + .form-container-active { + height: 60px; + } + + .input-form input[type="text"] { + width: 100%; + margin-right: 0; + } + + .input-form input[type="file"] { + padding: 10px 0; + } + + .input-form button { + width: 100%; + margin-right: 0; + } + + .input-form textarea { + width: 100%; + } +} diff --git a/tauri-app/components/AddCardComponent/index.tsx b/tauri-app/components/AddCardComponent/index.tsx new file mode 100644 index 0000000..66c9bb6 --- /dev/null +++ b/tauri-app/components/AddCardComponent/index.tsx @@ -0,0 +1,52 @@ +import "./index.css"; +import { useState } from "react"; + +const FileUploader = () => { + const [file, setFile] = useState(null); + + return ( +
    + { + setFile(e.target.files[0]); + }} + type="file" + accept=".jpg,.png,.jpeg,.docx,.pdf" + /> +
    + ); +}; + +const index = () => { + const [fileUploaders, setUploaderFile] = useState([]); + return ( +
    +

    Create New Record

    +
    + {fileUploaders.length > 2 &&

    Max file uploads reached

    } +
    2 ? "sadd-mu" : "add-mu"} + onClick={() => + fileUploaders.length > 2 + ? null + : setUploaderFile([...fileUploaders, ]) + } + > + +
    + {fileUploaders.map((Uploader) => { + return Uploader; + })} + + + +

    + *ensure inputted information are correct as once saved it cannot be + deleted/edited +

    +
    +
    + ); +}; + +export default index; diff --git a/tauri-app/components/Card/index.css b/tauri-app/components/Card/index.css new file mode 100644 index 0000000..ee364de --- /dev/null +++ b/tauri-app/components/Card/index.css @@ -0,0 +1,61 @@ +.main-card-container { + box-shadow: var(--box-shadow-black); + border-radius: 8px; + height: 300px; + margin: 20px 10px; + min-width: 300px; + width: 300px; + overflow: hidden; +} + +.card-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 26px 20px; + background: var(--color-slate); +} + +.card-header h1 { + font-family: "Roboto"; + font-size: 20px; + font-weight: 300; + text-transform: lowercase; +} + +.card-header i { + font-size: 34px; +} + +.info-container { + padding: 20px 10px; +} + +.info-container p { + font-family: "Open Sans"; +} + +.date-container { + display: flex; + align-items: center; + justify-content: space-between; + font-family: "Open Sans"; + width: 25%; + margin-top: 30px; +} + +.vbtn { + border: none; + font-size: 24px; + padding: 6px 8px; + border-radius: 5px; + font-family: "Pacifico"; + background: var(--color-green); + box-shadow: var(--box-shadow-green); + color: var(--color-white); + margin: 0 auto; + margin-top: 14px; + width: 280px; + outline: none; + cursor: pointer; +} diff --git a/tauri-app/components/Card/index.tsx b/tauri-app/components/Card/index.tsx new file mode 100644 index 0000000..e98d449 --- /dev/null +++ b/tauri-app/components/Card/index.tsx @@ -0,0 +1,48 @@ +import "./index.css"; +import { useState } from "react"; + +const index = ({ file_name, file_extension, title, desc, date, cardUtils }) => { + const [supportedIMGExtensions, setSupportedIMG, Extensions] = useState([ + "jpg", + "png", + "jpeg", + ]); + return ( +
    +
    + {file_extension == "pdf" && ( + + )} + {file_extension == "docx" && ( + + )} + {supportedIMGExtensions.includes(file_extension) && ( + + )} + +

    {title ? title : file_name}

    +
    +
    +

    {desc}

    +
    + + {date} +
    + +
    +
    + ); +}; + +export default index; diff --git a/tauri-app/components/DetailCardComponent/index.css b/tauri-app/components/DetailCardComponent/index.css new file mode 100644 index 0000000..093fbff --- /dev/null +++ b/tauri-app/components/DetailCardComponent/index.css @@ -0,0 +1,75 @@ +.main-detail-container { + width: 500px; + min-height: 450px; + background: var(--color-white); + padding: var(--padding-desktop); + border-radius: 15px; + position: relative; + margin-top: 20px; + overflow-y: scroll; +} + +.main-detail-container h1 { + font-family: "Roboto"; + font-weight: 400; +} + +.image-container img { + width: 100%; + height: 280px; + border-radius: 15px; + margin-top: 20px; +} + +.main-detail-container p { + margin: 20px 0; + font-family: "Open Sans"; +} + +.close-btn { + width: 50px; + height: 50px; + background: var(--color-red); + box-shadow: var(--box-shadow-red); + border-radius: 15px; + position: absolute; + top: 20px; + right: 80px; + color: var(--color-white); + display: flex; + justify-content: center; + align-items: center; + font-size: 25px; + transform: rotate(45deg); +} + +.file-container { + display: flex; + justify-content: left; + align-items: center; +} + +.file-container a { + color: var(--color-blue); + font-family: "Roboto"; + text-decoration: none; + margin-left: 18px; + font-weight: 400; +} + +@media (max-width: 750px) { + .main-detail-container { + padding: var(--padding-mobile); + width: 300px; + height: 400px; + overflow-y: scroll; + } + + .image-container img { + height: 180px; + } + + .close-btn { + right: 25px; + } +} diff --git a/tauri-app/components/DetailCardComponent/index.tsx b/tauri-app/components/DetailCardComponent/index.tsx new file mode 100644 index 0000000..393c33f --- /dev/null +++ b/tauri-app/components/DetailCardComponent/index.tsx @@ -0,0 +1,57 @@ +import "./index.css"; +import { useState } from "react"; + +const index = ({ cardData, close }) => { + const [supportedIMGExtensions, setSupportedIMGExtensions] = useState([ + "jpg", + "png", + "jpeg", + ]); + + return ( +
    +
    close(false)}> + +
    +

    {cardData.title ? cardData.title : cardData.file_name}

    + {supportedIMGExtensions.includes(cardData.file_extension) && ( +
    + +
    + )} +

    {cardData.desc}

    +
    + {cardData.other_files && + cardData.other_files.map((file) => { + return ( +
    + {file.file_extension == "pdf" && ( + + )} + {file.file_extension == "docx" && ( + + )} + {supportedIMGExtensions.includes(file.file_extension) && ( + + )} + +

    {file.file_name}

    +
    +
    + ); + })} +
    +
    + ); +}; + +export default index; diff --git a/tauri-app/components/MobileNavbar/index.tsx b/tauri-app/components/MobileNavbar/index.tsx index 58d1084..5027e7f 100644 --- a/tauri-app/components/MobileNavbar/index.tsx +++ b/tauri-app/components/MobileNavbar/index.tsx @@ -1,17 +1,22 @@ import "./index.css"; +import { NavLink } from "react-router-dom"; const index = () => { return (
    -
    - -

    Home

    -
    -
    - -

    Records

    - 35 -
    + +
    + +

    Home

    +
    +
    + +
    + +

    Records

    + 35 +
    +
    28 diff --git a/tauri-app/components/Navbar/index.css b/tauri-app/components/Navbar/index.css index 2834efc..9ec3d00 100644 --- a/tauri-app/components/Navbar/index.css +++ b/tauri-app/components/Navbar/index.css @@ -7,7 +7,7 @@ position: sticky; top: 0; background: var(--color-white); - z-index: 5; + z-index: 8; } .logo_container { diff --git a/tauri-app/components/Navbar/index.tsx b/tauri-app/components/Navbar/index.tsx index e00f881..e380395 100644 --- a/tauri-app/components/Navbar/index.tsx +++ b/tauri-app/components/Navbar/index.tsx @@ -1,4 +1,5 @@ import "./index.css"; +import { NavLink } from "react-router-dom"; const index = () => { return ( @@ -8,15 +9,19 @@ const index = () => {
    -
    - -

    Home

    -
    -
    - -

    Records

    - 28 -
    + +
    + +

    Home

    +
    +
    + +
    + +

    Records

    + 28 +
    +

    Chats

    @@ -29,7 +34,7 @@ const index = () => {
    -

    Join us!

    +

    Connect Wallet

    diff --git a/tauri-app/public/pma.png b/tauri-app/public/pma.png deleted file mode 100644 index d60b845a0bdaed3f9aa9eb8c8ed47c860e9c4f50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 249743 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

    *sQzOwFw3K==Bos9fY$78~VUeLsr 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 z

    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

      rx}wGCgV=zj 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 }> } /> + } /> diff --git a/tauri-app/src/index.css b/tauri-app/src/index.css index eda7ffc..de785d5 100644 --- a/tauri-app/src/index.css +++ b/tauri-app/src/index.css @@ -5,8 +5,11 @@ --box-shadow-red: 0 5px 12px rgba(239, 68, 68, 0.5); --color-blue: #0ea5e9; --box-shadow-blue: 0 5px 12px rgba(14, 165, 233, 0.3); + --box-shadow-black: 0 3px 12px rgba(0, 0, 0, 0.2); + --color-white: #fff; --color-black: #000; + --color-slate: #e2e8f0; --color-orange: #f97316; --padding-desktop: 40px 65px; --padding-mobile: 40px 25px; diff --git a/tauri-app/src/pages/Home/index.css b/tauri-app/src/pages/Home/index.css index 514d9a2..991884d 100644 --- a/tauri-app/src/pages/Home/index.css +++ b/tauri-app/src/pages/Home/index.css @@ -96,7 +96,7 @@ align-items: center; justify-content: center; flex-direction: column; - padding: 18px 15px; + padding: 15px 18px; margin: 20px; box-shadow: 0 4px 3px rgba(0, 0, 0, 0.2); } @@ -119,8 +119,9 @@ .tech-container { display: flex; - justify-content: space-between; + justify-content: space-around; align-items: center; + flex-wrap: wrap; } .more-info-container { @@ -286,6 +287,7 @@ .tech-container { flex-direction: column; + flex-wrap: nowrap; } .more-info-container { diff --git a/tauri-app/src/pages/Home/index.tsx b/tauri-app/src/pages/Home/index.tsx index 409a2db..8d24ccb 100644 --- a/tauri-app/src/pages/Home/index.tsx +++ b/tauri-app/src/pages/Home/index.tsx @@ -105,7 +105,7 @@ export default function Home() {
      - +

      Dave

      @@ -163,6 +163,55 @@ export default function Home() { d="M0,128L10,154.7C20,181,40,235,60,240C80,245,100,203,120,160C140,117,160,75,180,69.3C200,64,220,96,240,133.3C260,171,280,213,300,218.7C320,224,340,192,360,202.7C380,213,400,267,420,256C440,245,460,171,480,122.7C500,75,520,53,540,48C560,43,580,53,600,96C620,139,640,213,660,229.3C680,245,700,203,720,176C740,149,760,139,780,117.3C800,96,820,64,840,69.3C860,75,880,117,900,149.3C920,181,940,203,960,208C980,213,1000,203,1020,170.7C1040,139,1060,85,1080,53.3C1100,21,1120,11,1140,42.7C1160,75,1180,149,1200,192C1220,235,1240,245,1260,229.3C1280,213,1300,171,1320,149.3C1340,128,1360,128,1380,128C1400,128,1420,128,1430,128L1440,128L1440,0L1430,0C1420,0,1400,0,1380,0C1360,0,1340,0,1320,0C1300,0,1280,0,1260,0C1240,0,1220,0,1200,0C1180,0,1160,0,1140,0C1120,0,1100,0,1080,0C1060,0,1040,0,1020,0C1000,0,980,0,960,0C940,0,920,0,900,0C880,0,860,0,840,0C820,0,800,0,780,0C760,0,740,0,720,0C700,0,680,0,660,0C640,0,620,0,600,0C580,0,560,0,540,0C520,0,500,0,480,0C460,0,440,0,420,0C400,0,380,0,360,0C340,0,320,0,300,0C280,0,260,0,240,0C220,0,200,0,180,0C160,0,140,0,120,0C100,0,80,0,60,0C40,0,20,0,10,0L0,0Z" > +
      +

      Major Features

      +
      +
      + +

      Secure Storage

      +

      + Pulsepal employes blockchain for.storing user data and this + ensures that effective data protection from data loss or + manipulation and this is due to the immutability of data stored + on a blockchain. +

      +
      +
      + +

      Find Your Tribe

      +

      + Pulsepal uses articial intelligence to aid users with similiar + medical conditions find matches who can relate with them and + also find doctors/specialist within there regions on such + condition. +

      +
      +
      + +

      Home Remedies

      +

      + Pulsepal home remedies help users find a quick for emergency + situations and a also find better ways to cope with issues + bothering them. +

      +
      +
      + +

      Find Specialist

      +

      + Pulsepal use of artifical intelligence aids in making users + easily locate specialist within there region on medical + conditions affecting giving them easier access to a health + professional. +

      +
      +
      +
      ); diff --git a/tauri-app/src/pages/RecordDetail/index.css b/tauri-app/src/pages/RecordDetail/index.css new file mode 100644 index 0000000..e69de29 diff --git a/tauri-app/src/pages/RecordDetail/index.tsx b/tauri-app/src/pages/RecordDetail/index.tsx new file mode 100644 index 0000000..47af476 --- /dev/null +++ b/tauri-app/src/pages/RecordDetail/index.tsx @@ -0,0 +1,9 @@ +import "./index.css"; + +const index = () => { + return
      +

      RecordDetail

      +
      ; +}; + +export default index; diff --git a/tauri-app/src/pages/Records/index.css b/tauri-app/src/pages/Records/index.css new file mode 100644 index 0000000..13c38ab --- /dev/null +++ b/tauri-app/src/pages/Records/index.css @@ -0,0 +1,96 @@ +.main-records-container { + padding: var(--padding-desktop); +} + +.records-header { + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; +} + +.records-header h1 { + font-family: "Pacifico"; + font-size: 45px; +} + +.add-records-btn { + width: 60px; + height: 60px; + background: var(--color-blue); + font-size: 34px; + color: var(--color-white); + box-shadow: var(--box-shadow-blue); + display: flex; + justify-content: center; + align-items: center; + border-radius: 50%; + cursor: pointer; + z-index: 7; + transition: 0.3s; +} + +.close-add-records-btn { + width: 60px; + height: 60px; + background: var(--color-red); + font-size: 34px; + color: var(--color-white); + box-shadow: var(--box-shadow-red); + display: flex; + justify-content: center; + align-items: center; + border-radius: 50%; + cursor: pointer; + z-index: 7; + transform: rotate(45deg); + transition: 0.3s; +} + +.cards-container { + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; +} + +.add-card-container { + background: rgba(0, 0, 0, 0.3); + position: fixed; + width: 100%; + height: 100vh; + top: 0; + left: 0; + display: flex; + justify-content: center; + align-items: center; + z-index: 6; +} + +.component-container { + position: relative; +} + +@media (max-width: 750px) { + .main-records-container { + padding: var(--padding-mobile); + } + + .add-records-btn { + position: fixed; + bottom: 140px; + right: 30px; + } + + .close-add-records-btn { + position: fixed; + bottom: 140px; + right: 30px; + } + + .cards-container { + flex-direction: column; + justify-content: center; + flex-wrap: nowrap; + } +} diff --git a/tauri-app/src/pages/Records/index.tsx b/tauri-app/src/pages/Records/index.tsx new file mode 100644 index 0000000..b1119c0 --- /dev/null +++ b/tauri-app/src/pages/Records/index.tsx @@ -0,0 +1,111 @@ +import "./index.css"; +import { useState } from "react"; + +import AddCardComponent from "../../../components/AddCardComponent/"; +import DetailCardComponent from "../../../components/DetailCardComponent"; + +import Card from "../../../components/Card/"; + +const index = () => { + const [cardsData, setCardsData] = useState([ + { + title: "Diabetes Docs", + desc: "documentation of test ran for diagonese of diabtets slated for type dissertion", + date: "1/2/24", + file_extension: "pdf", + file_name: "Diabetes_scan.pdf", + }, + { + title: "Diabetes Docs", + desc: "documentation of test ran for diagonese of diabtets slated for type dissertion", + date: "1/2/24", + file_extension: "pdf", + file_name: "Diabetes_scan.pdf", + other_files: [ + { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, + { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, + ], + }, + { + title: "Diabetes Docs", + desc: "documentation of test ran for diagonese of diabtets slated for type dissertion", + date: "1/2/24", + file_extension: "docx", + file_name: "Diabetes_test.docx", + other_files: [ + { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, + { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, + ], + }, + { + desc: "documentation of test ran for diagonese of diabtets slated for type dissertion", + date: "1/2/24", + file_extension: "jpg", + file_name: "D_IMG1103.jpg", + file_1_url: "../../../public/pic.jpg", + other_files: [ + { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, + { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, + ], + }, + ]); + + const [isAddCardActive, setIsAddCardActive] = useState(false); + const [isCardDetailActive, setIsCardDetailActive] = useState(false); + const [activeCard, setActiveCard] = useState(null); + + const isCardClicked = (cardDetail) => { + setIsCardDetailActive(!isCardDetailActive); + setIsAddCardActive(false); + setActiveCard(cardDetail); + }; + + return ( +
      +
      +

      Records

      +
      +
      setIsAddCardActive(!isAddCardActive)} + > + +
      +
      +
      + {cardsData.map((card) => { + return ( + + ); + })} +
      + {(isAddCardActive || isCardDetailActive) && ( +
      +
      + {isAddCardActive && } + {isCardDetailActive && ( + + )} +
      +
      + )} +
      + ); +}; + +export default index; From 480801b5a38db7d5a6932e1a510b8dac511bcaf9 Mon Sep 17 00:00:00 2001 From: coder12git Date: Wed, 3 Jan 2024 10:25:41 +0530 Subject: [PATCH 011/136] added nearby doctors Signed-off-by: coder12git --- tauri-app/package-lock.json | 91 ++++++++++++++++++++++++++++ tauri-app/package.json | 1 + tauri-app/src/App.tsx | 5 ++ tauri-app/src/pages/medic.tsx | 2 +- tauri-app/src/pages/nearbyDoctor.tsx | 41 +++++++++++++ 5 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 tauri-app/src/pages/nearbyDoctor.tsx diff --git a/tauri-app/package-lock.json b/tauri-app/package-lock.json index 6bb3ea4..c747970 100644 --- a/tauri-app/package-lock.json +++ b/tauri-app/package-lock.json @@ -16,6 +16,7 @@ "@radix-ui/react-tabs": "^1.0.4", "@tauri-apps/api": "^1.5.2", "@web5/api": "^0.8.3", + "axios": "^1.6.3", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", "lodash": "^4.17.21", @@ -2386,6 +2387,11 @@ "node": ">=10" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "node_modules/attr-accept": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", @@ -2431,6 +2437,16 @@ "postcss": "^8.1.0" } }, + "node_modules/axios": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.3.tgz", + "integrity": "sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/b4a": { "version": "1.6.4", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", @@ -2916,6 +2932,17 @@ "color-support": "bin.js" } }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -2994,6 +3021,14 @@ "node": ">=8" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -3245,6 +3280,38 @@ "flat": "cli.js" } }, + "node_modules/follow-redirects": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fraction.js": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", @@ -4019,6 +4086,25 @@ "node": ">=8.6" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/mimic-response": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", @@ -4633,6 +4719,11 @@ "uint8arrays": "^4.0.6" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", diff --git a/tauri-app/package.json b/tauri-app/package.json index ea2631d..7b4e845 100644 --- a/tauri-app/package.json +++ b/tauri-app/package.json @@ -18,6 +18,7 @@ "@radix-ui/react-tabs": "^1.0.4", "@tauri-apps/api": "^1.5.2", "@web5/api": "^0.8.3", + "axios": "^1.6.3", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", "lodash": "^4.17.21", diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index 8dab653..69726d4 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -5,6 +5,7 @@ import Home from "./pages/home"; import Connect from "./pages/connect"; import Remedy from "./pages/remedy"; import MedicPage from "./pages/medic"; +import Doctors from "./pages/nearbyDoctor"; const router = createHashRouter([ { @@ -22,6 +23,10 @@ const router = createHashRouter([ { path: "/medic", element: , + }, + { + path: "/nearbyDoctors", + element: , } ]); diff --git a/tauri-app/src/pages/medic.tsx b/tauri-app/src/pages/medic.tsx index ff5ca8c..58fa9b5 100644 --- a/tauri-app/src/pages/medic.tsx +++ b/tauri-app/src/pages/medic.tsx @@ -97,7 +97,7 @@ const MedicPage: FunctionComponent = () => {
      {docsWithImageUrls.map(({ document, url }) => (
      - img +
      ))}
      diff --git a/tauri-app/src/pages/nearbyDoctor.tsx b/tauri-app/src/pages/nearbyDoctor.tsx new file mode 100644 index 0000000..d7255c2 --- /dev/null +++ b/tauri-app/src/pages/nearbyDoctor.tsx @@ -0,0 +1,41 @@ +import { FunctionComponent, useEffect, useRef, useState } from "react"; +import useWeb5Store from "@/stores/useWeb5Store"; +import { fetch, ResponseType } from '@tauri-apps/api/http'; +import axios from 'axios' + +const accessToken = 'AIzaSyCfqty5e_JIBd-2RrdbB0W5ykv3D4noYNg' + +const Doctors: FunctionComponent = () => { + const { web5 } = useWeb5Store((state) => ({ web5: state.web5!, connect: state.connect })); + const [places, setPlaces] = useState(null); + + useEffect(()=>{ + const fetchData = async()=>{ + try { + const response = await axios.get( + `https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-33.8670522%2C151.1957362&radius=1500&keyword=hospital&key=${accessToken}`, + ); + + if (!response.data.ok) { + throw new Error('Network response was not ok'); + } + + // const result = response.data; + // console.log(result); + setPlaces(response.data.json); + } catch (error) { + console.error('Error fetching data:', error); + } + }; + if (web5) { + fetchData() + } + },[web5]) + return ( +
      + {places} +
      + ) +} + +export default Doctors \ No newline at end of file From b2ff90840520c48ef0d2501888eaaa6a6f54775c Mon Sep 17 00:00:00 2001 From: coder12git Date: Wed, 3 Jan 2024 12:40:55 +0530 Subject: [PATCH 012/136] location feature Signed-off-by: coder12git --- tauri-app/.gitignore | 1 + tauri-app/src/pages/nearbyDoctor.tsx | 30 ++++++++++++++++++---------- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/tauri-app/.gitignore b/tauri-app/.gitignore index a547bf3..7ceb59f 100644 --- a/tauri-app/.gitignore +++ b/tauri-app/.gitignore @@ -22,3 +22,4 @@ dist-ssr *.njsproj *.sln *.sw? +.env diff --git a/tauri-app/src/pages/nearbyDoctor.tsx b/tauri-app/src/pages/nearbyDoctor.tsx index d7255c2..7884b04 100644 --- a/tauri-app/src/pages/nearbyDoctor.tsx +++ b/tauri-app/src/pages/nearbyDoctor.tsx @@ -1,28 +1,28 @@ import { FunctionComponent, useEffect, useRef, useState } from "react"; import useWeb5Store from "@/stores/useWeb5Store"; -import { fetch, ResponseType } from '@tauri-apps/api/http'; -import axios from 'axios' +// import { fetch, ResponseType } from '@tauri-apps/api/http'; +// import axios from 'axios' -const accessToken = 'AIzaSyCfqty5e_JIBd-2RrdbB0W5ykv3D4noYNg' +const accessToken = "AIzaSyCfqty5e_JIBd-2RrdbB0W5ykv3D4noYNg" const Doctors: FunctionComponent = () => { const { web5 } = useWeb5Store((state) => ({ web5: state.web5!, connect: state.connect })); - const [places, setPlaces] = useState(null); + const [places, setPlaces] = useState([]); useEffect(()=>{ const fetchData = async()=>{ try { - const response = await axios.get( - `https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-33.8670522%2C151.1957362&radius=1500&keyword=hospital&key=${accessToken}`, + const response = await fetch( + `https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=22.572645%2C88.363892&radius=1500&keyword=hospital&key=${accessToken}` ); - if (!response.data.ok) { + if (!response.ok) { throw new Error('Network response was not ok'); } - // const result = response.data; - // console.log(result); - setPlaces(response.data.json); + const result = await response.json(); + console.log(result.results) + setPlaces(result.results); } catch (error) { console.error('Error fetching data:', error); } @@ -33,7 +33,15 @@ const Doctors: FunctionComponent = () => { },[web5]) return (
      - {places} + {places?.map((place)=>( +
      +
        +
      • Name: {place.name}
      • +
      • Address: {place.vicinity}
      • +
      • Rating: {place.rating}
      • +
      +
      + ))}
      ) } From 8ac89fbf331c5c2bb8a5fb5dc4124534f99f445e Mon Sep 17 00:00:00 2001 From: coder12git Date: Wed, 3 Jan 2024 12:53:28 +0530 Subject: [PATCH 013/136] nearbyDoctors feature done Signed-off-by: coder12git --- tauri-app/src/pages/nearbyDoctor.tsx | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/tauri-app/src/pages/nearbyDoctor.tsx b/tauri-app/src/pages/nearbyDoctor.tsx index 7884b04..26d1a61 100644 --- a/tauri-app/src/pages/nearbyDoctor.tsx +++ b/tauri-app/src/pages/nearbyDoctor.tsx @@ -8,12 +8,25 @@ const accessToken = "AIzaSyCfqty5e_JIBd-2RrdbB0W5ykv3D4noYNg" const Doctors: FunctionComponent = () => { const { web5 } = useWeb5Store((state) => ({ web5: state.web5!, connect: state.connect })); const [places, setPlaces] = useState([]); + const [lat, setlat] = useState(); + const [long, setlong] = useState(); + + if(navigator.geolocation){ + navigator.geolocation.getCurrentPosition((position)=>{ + const lat = position.coords.latitude + const long = position.coords.longitude + setlat(lat); + setlong(long); + }) + } else { + console.log('Geolocation is not supported') + } useEffect(()=>{ const fetchData = async()=>{ try { const response = await fetch( - `https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=22.572645%2C88.363892&radius=1500&keyword=hospital&key=${accessToken}` + `https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=${lat}%2C${long}&radius=1500&keyword=hospital&key=${accessToken}` ); if (!response.ok) { From 1bfc61ed429c5422c82bf635d2b5b5c794cd87db Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Thu, 4 Jan 2024 01:22:51 +0100 Subject: [PATCH 014/136] ratings design moved to 8:00am today --- tauri-app/components/MobileNavbar/index.tsx | 12 +- tauri-app/components/Navbar/index.tsx | 12 +- .../Ratings}/index.css | 0 .../Ratings}/index.tsx | 6 +- tauri-app/components/RemedyCard/index.css | 58 +++++++ tauri-app/components/RemedyCard/index.tsx | 75 +++++++++ tauri-app/pnpm-lock.yaml | 12 +- tauri-app/src/App.tsx | 2 + tauri-app/src/pages/Records/index.css | 5 +- tauri-app/src/pages/Remedies/index.css | 152 ++++++++++++++++++ tauri-app/src/pages/Remedies/index.tsx | 126 +++++++++++++++ 11 files changed, 440 insertions(+), 20 deletions(-) rename tauri-app/{src/pages/RecordDetail => components/Ratings}/index.css (100%) rename tauri-app/{src/pages/RecordDetail => components/Ratings}/index.tsx (57%) create mode 100644 tauri-app/components/RemedyCard/index.css create mode 100644 tauri-app/components/RemedyCard/index.tsx create mode 100644 tauri-app/src/pages/Remedies/index.css create mode 100644 tauri-app/src/pages/Remedies/index.tsx diff --git a/tauri-app/components/MobileNavbar/index.tsx b/tauri-app/components/MobileNavbar/index.tsx index 5027e7f..5fd1e7a 100644 --- a/tauri-app/components/MobileNavbar/index.tsx +++ b/tauri-app/components/MobileNavbar/index.tsx @@ -22,11 +22,13 @@ const index = () => { 28

      Chats

      -
      - -

      DIY Remedies

      - 99+ -
      + +
      + +

      DIY Remedies

      + 99+ +
      +
      ); }; diff --git a/tauri-app/components/Navbar/index.tsx b/tauri-app/components/Navbar/index.tsx index e380395..4ce03a0 100644 --- a/tauri-app/components/Navbar/index.tsx +++ b/tauri-app/components/Navbar/index.tsx @@ -27,11 +27,13 @@ const index = () => {

      Chats

      5
    -
    - -

    DIY Remedies

    - 99+ -
    + +
    + +

    DIY Remedies

    + 99+ +
    +

    Connect Wallet

    diff --git a/tauri-app/src/pages/RecordDetail/index.css b/tauri-app/components/Ratings/index.css similarity index 100% rename from tauri-app/src/pages/RecordDetail/index.css rename to tauri-app/components/Ratings/index.css diff --git a/tauri-app/src/pages/RecordDetail/index.tsx b/tauri-app/components/Ratings/index.tsx similarity index 57% rename from tauri-app/src/pages/RecordDetail/index.tsx rename to tauri-app/components/Ratings/index.tsx index 47af476..a62c374 100644 --- a/tauri-app/src/pages/RecordDetail/index.tsx +++ b/tauri-app/components/Ratings/index.tsx @@ -1,9 +1,7 @@ import "./index.css"; - + const index = () => { - return
    -

    RecordDetail

    -
    ; + return
    ; }; export default index; diff --git a/tauri-app/components/RemedyCard/index.css b/tauri-app/components/RemedyCard/index.css new file mode 100644 index 0000000..7c02190 --- /dev/null +++ b/tauri-app/components/RemedyCard/index.css @@ -0,0 +1,58 @@ +.ratings-container { + margin: 10px 0; +} + +.ratings-container i { + margin-right: 5px; +} + +.remedy-card { + height: 400px; + width: 300px; + border-radius: 15px; + padding: px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + overflow: hidden; + margin: 20px 0px; +} + +.remedy-card-image-container { + height: 200px; + color: var(--color-white); + padding: 15px; + font-weight: 500; + border-radius: 0 0 15px 15px; +} + +.remedy-card-image-container h1 { + font-family: "Roboto"; + margin-bottom: 15px; + text-transform: capitalize; + font-size: 30px; +} + +.remedy-card-image-container p { + font-family: "Roboto"; +} + +.remedy-info-container p { + padding: 15px; + font-family: "Open Sans"; +} + +.remedy-info-container button { + margin-top: 20px; + border: none; + font-family: "Pacifico"; + background: var(--color-green); + box-shadow: var(--box-shadow-green); + padding: 10px 15px; + width: 90%; + color: var(--color-white); + font-size: 24px; + margin: auto auto; + border-radius: 8px; + margin-left: 5%; + cursor: pointer; + outline: none; +} diff --git a/tauri-app/components/RemedyCard/index.tsx b/tauri-app/components/RemedyCard/index.tsx new file mode 100644 index 0000000..f4dacfb --- /dev/null +++ b/tauri-app/components/RemedyCard/index.tsx @@ -0,0 +1,75 @@ +import "./index.css"; + +const Rating = ({ rating }) => { + return ( +
    + {rating >= 1 && rating < 2 && ( +
    + +
    + )} + {rating >= 2 && rating < 3 && ( +
    + + +
    + )} + {rating >= 3 && rating < 4 && ( +
    + + + +
    + )} + {rating >= 4 && rating < 5 && ( +
    + + + + +
    + )} + {rating >= 5 && ( +
    + + + + + +
    + )} +
    + ); +}; + +const index = ({ + title, + coverIMGUrl, + desc_snippet, + created_by, + rating, + isClicked, +}) => { + return ( +
    +
    +

    {title}

    +

    --by {created_by}

    + +
    +
    +

    {desc_snippet}

    + +
    +
    + ); +}; + +export default index; diff --git a/tauri-app/pnpm-lock.yaml b/tauri-app/pnpm-lock.yaml index 606e550..38b38b7 100644 --- a/tauri-app/pnpm-lock.yaml +++ b/tauri-app/pnpm-lock.yaml @@ -699,11 +699,11 @@ packages: resolution: {integrity: sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==} dev: false - /@multiformats/murmur3@2.1.7: - resolution: {integrity: sha512-Yf0UpAaONjed+8PTt5NM/GG4Z4Ai4m1qfT7bqevjnkwRQ12K+0jxtRomirz+VJx4PokpA2St1ZSD1iMkZTqPRQ==} + /@multiformats/murmur3@2.1.8: + resolution: {integrity: sha512-6vId1C46ra3R1sbJUOFCZnsUIveR9oF20yhPmAFxPm0JfrX3/ZRCgP3YDrBzlGoEppOXnA9czHeYc0T9mB6hbA==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: - multiformats: 12.1.3 + multiformats: 13.0.0 murmurhash3js-revisited: 3.0.0 dev: false @@ -2163,6 +2163,7 @@ packages: /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + requiresBuild: true /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} @@ -2455,7 +2456,7 @@ packages: dependencies: '@ipld/dag-cbor': 9.0.3 '@ipld/dag-pb': 4.0.7 - '@multiformats/murmur3': 2.1.7 + '@multiformats/murmur3': 2.1.8 err-code: 3.0.1 hamt-sharding: 3.0.2 interface-blockstore: 5.2.3 @@ -2477,7 +2478,7 @@ packages: engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: '@ipld/dag-pb': 4.0.7 - '@multiformats/murmur3': 2.1.7 + '@multiformats/murmur3': 2.1.8 err-code: 3.0.1 hamt-sharding: 3.0.2 interface-blockstore: 5.2.3 @@ -2529,6 +2530,7 @@ packages: /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + requiresBuild: true /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index d71cf98..478eac0 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -3,6 +3,7 @@ import { Route, Routes, BrowserRouter } from "react-router-dom"; import SharedLayout from "./pages/SharedLayout/"; import Home from "./pages/Home/"; import Records from "./pages/Records/"; +import Remedies from "./pages/Remedies/"; function App() { return ( @@ -12,6 +13,7 @@ function App() { }> } /> } /> + } /> diff --git a/tauri-app/src/pages/Records/index.css b/tauri-app/src/pages/Records/index.css index 13c38ab..f1bf303 100644 --- a/tauri-app/src/pages/Records/index.css +++ b/tauri-app/src/pages/Records/index.css @@ -27,7 +27,6 @@ border-radius: 50%; cursor: pointer; z-index: 7; - transition: 0.3s; } .close-add-records-btn { @@ -93,4 +92,8 @@ justify-content: center; flex-wrap: nowrap; } + + .records-header h1 { + font-size: 35px; + } } diff --git a/tauri-app/src/pages/Remedies/index.css b/tauri-app/src/pages/Remedies/index.css new file mode 100644 index 0000000..28fc17d --- /dev/null +++ b/tauri-app/src/pages/Remedies/index.css @@ -0,0 +1,152 @@ +.main-remedies-container { + padding: var(--padding-desktop); +} + +.main-remedy-cards-container { + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; +} + +.main-remedies-container h1 { + font-family: "Pacifico"; + font-size: 45px; +} + +.view-card-detail-container { + background: rgba(0, 0, 0, 0.3); + position: fixed; + width: 100%; + height: 100vh; + top: 0; + left: 0; + display: flex; + justify-content: center; + align-items: center; + z-index: 6; +} + +.active-remedy-container { + width: 500px; + min-height: 400px; + background: var(--color-white); + border-radius: 15px; + padding: 25px 20px; + position: relative; +} + +.active-remedy-container h1 { + font-family: "Roboto"; + font-weight: 400; + font-size: 30px; + margin: 10px 0px; +} + +.active-remedy-container p { + font-family: "Open Sans"; + margin: 20px 0px; +} + +.rimg-container { + width: 100%; + height: 300px; + border-radius: 15px; +} + +.r-close-btn { + width: 40px; + height: 40px; + background: var(--color-red); + color: var(--color-white); + border-radius: 50%; + box-shadow: var(--box-shadow-red); + position: absolute; + right: 30px; + top: 60px; + font-size: 20px; + display: flex; + justify-content: center; + align-items: center; + transform: rotate(45deg); +} + +.report-btn { + background: var(--color-red); + color: var(--color-white); + border-radius: 20px; + box-shadow: var(--box-shadow-red); + position: absolute; + right: 80px; + top: 60px; + display: flex; + justify-content: space-between; + align-items: center; + font-family: "Roboto"; + padding: 8px 15px; + text-transform: uppercase; +} + +.report-btn i { + font-size: 25px; + margin-left: 10px; +} + +.remedy-main-info-container { + height: 300px; + overflow-y: scroll; + padding: 5px; + border-radius: 5px; +} + +.remedy-main-info-container h3 { + font-family: "Roboto"; +} + +.remedy-main-info-container p { + font-family: "Open Sans"; + margin-left: 30px; +} + +@media (max-width: 750px) { + .main-remedies-container { + padding: var(--padding-mobile); + } + + .main-remedies-container h1 { + font-size: 35px; + } + + .main-remedy-cards-container { + flex: nowrap; + flex-direction: column; + } + + .active-remedy-container { + width: 91%; + height: 70%; + margin-top: 20px; + padding: 15px 10px; + } + + .rimg-container { + height: 180px; + } + + .remedy-main-info-container { + height: 180px; + overflow-y: scroll; + padding: 5px; + } + + .report-btn, + .r-close-btn { + top: 40px; + transform: translateX(15px); + } + + .r-close-btn { + transform: rotate(45deg); + right: 20px; + } +} diff --git a/tauri-app/src/pages/Remedies/index.tsx b/tauri-app/src/pages/Remedies/index.tsx new file mode 100644 index 0000000..cdf6857 --- /dev/null +++ b/tauri-app/src/pages/Remedies/index.tsx @@ -0,0 +1,126 @@ +import "./index.css"; +import { useState } from "react"; +import RemedyCard from "../../../components/RemedyCard/"; + +const index = () => { + const [remedies, setRemedies] = useState([ + { + title: "Lavendar Scalp Treament", + desc_snippet: + "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat...", + desc: "Lorem ipsum dolor sit amet, officia excepteur ex fugiat reprehenderit enim labore culpa sint ad nisi Lorem pariatur mollit ex esse exercitation amet. Nisi anim cupidatat excepteur officia. Reprehenderit nostrud nostrud ipsum Lorem est aliquip amet voluptate voluptate dolor minim nulla est proident. Nostrud officia pariatur ut officia. Sit irure elit esse ea nulla sunt ex occaecat reprehenderit commodo officia dolor Lorem duis laboris cupidatat officia voluptate. Culpa proident adipisicing id nulla nisi laboris ex in Lorem sunt duis officia eiusmod. Aliqua reprehenderit commodo ex non excepteur duis sunt velit enim. Voluptate laboris sint cupidatat ullamco ut ea consectetur et est culpa et culpa duis.", + coverIMGUrl: "/pg.jpg", + rating: 1.5, + created_by: "draky", + steps: [ + { + title: "Clean Scalp Throughly", + desc: "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat.", + }, + { + title: "Apply Anti-Flammtory Cream", + desc: "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat.", + }, + ], + }, + { + title: "Aloe Vera Eczema Fix", + desc_snippet: + "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat...", + coverIMGUrl: "/pg.jpg", + rating: 4, + created_by: "dave", + }, + { + title: "Asthma Breathing Exercises", + desc_snippet: + "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat...", + coverIMGUrl: "/pg.jpg", + rating: 3.5, + created_by: "nikki", + }, + ]); + + const [isDetailRemedyActive, setIsDetailRemedyActive] = useState(false); + const [activeRemedy, setActiveRemedy] = useState(null); + + const remedyClicked = (remedyDetail) => { + setActiveRemedy(remedyDetail); + setIsDetailRemedyActive(true); + }; + + return ( +
    +

    Get a quick fix!

    +
    + {remedies.map((remedy) => { + return ( + + ); + })} +
    + {isDetailRemedyActive && ( +
    +
    +
    { + setIsDetailRemedyActive(false); + setActiveRemedy(null); + }} + > + +
    +
    { + alert("Report Sent!!"); + }} + > +

    Report

    + +
    + +
    +
    +

    {activeRemedy.star_stats}

    +
    +
    +

    {activeRemedy.title}

    + +
    +

    {activeRemedy.desc}

    + {activeRemedy.steps && + activeRemedy.steps.map((step, indx) => { + return ( +
    +

    + #Step - {indx + 1} {step.title} +

    +

    {step.desc}

    +
    + ); + })} +
    +
    +
    + )} +
    + ); +}; + +export default index; From ddcd0584b82b15cd577f5ab56900bde48f7c4e8b Mon Sep 17 00:00:00 2001 From: coder12git Date: Thu, 4 Jan 2024 10:18:19 +0530 Subject: [PATCH 015/136] remove pnpm file Signed-off-by: coder12git --- tauri-app/pnpm-lock.yaml | 4008 -------------------------------------- 1 file changed, 4008 deletions(-) delete mode 100644 tauri-app/pnpm-lock.yaml diff --git a/tauri-app/pnpm-lock.yaml b/tauri-app/pnpm-lock.yaml deleted file mode 100644 index 1baf231..0000000 --- a/tauri-app/pnpm-lock.yaml +++ /dev/null @@ -1,4008 +0,0 @@ -lockfileVersion: '6.0' - -dependencies: - '@hookform/resolvers': - specifier: ^3.3.2 - version: 3.3.2(react-hook-form@7.49.2) - '@radix-ui/react-avatar': - specifier: ^1.0.4 - version: 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-dropdown-menu': - specifier: ^2.0.6 - version: 2.0.6(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-label': - specifier: ^2.0.2 - version: 2.0.2(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': - specifier: ^1.0.2 - version: 1.0.2(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-tabs': - specifier: ^1.0.4 - version: 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@tauri-apps/api': - specifier: ^1.5.2 - version: 1.5.2 - '@web5/api': - specifier: ^0.8.3 - version: 0.8.3 - class-variance-authority: - specifier: ^0.7.0 - version: 0.7.0 - clsx: - specifier: ^2.0.0 - version: 2.0.0 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - lucide-react: - specifier: ^0.298.0 - version: 0.298.0(react@18.2.0) - react: - specifier: ^18.2.0 - version: 18.2.0 - react-dom: - specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) - react-dropzone: - specifier: ^14.2.3 - version: 14.2.3(react@18.2.0) - react-easy-crop: - specifier: ^5.0.4 - version: 5.0.4(react-dom@18.2.0)(react@18.2.0) - react-hook-form: - specifier: ^7.49.2 - version: 7.49.2(react@18.2.0) - react-pdf: - specifier: ^7.6.0 - version: 7.6.0(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - react-router-dom: - specifier: ^6.21.1 - version: 6.21.1(react-dom@18.2.0)(react@18.2.0) - react-spinners: - specifier: ^0.13.8 - version: 0.13.8(react-dom@18.2.0)(react@18.2.0) - react-virtualized-auto-sizer: - specifier: ^1.0.20 - version: 1.0.20(react-dom@18.2.0)(react@18.2.0) - react-window: - specifier: ^1.8.10 - version: 1.8.10(react-dom@18.2.0)(react@18.2.0) - tailwind-merge: - specifier: ^2.1.0 - version: 2.1.0 - tailwindcss-animate: - specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.0) - zod: - specifier: ^3.22.4 - version: 3.22.4 - zustand: - specifier: ^4.4.7 - version: 4.4.7(@types/react@18.2.15)(react@18.2.0) - -devDependencies: - '@tauri-apps/cli': - specifier: ^1.5.7 - version: 1.5.7 - '@types/lodash': - specifier: ^4.14.202 - version: 4.14.202 - '@types/node': - specifier: ^20.10.5 - version: 20.10.5 - '@types/react': - specifier: ^18.2.15 - version: 18.2.15 - '@types/react-dom': - specifier: ^18.2.7 - version: 18.2.7 - '@types/react-window': - specifier: ^1.8.8 - version: 1.8.8 - '@vitejs/plugin-react': - specifier: ^4.0.3 - version: 4.0.3(vite@4.4.4) - autoprefixer: - specifier: ^10.4.16 - version: 10.4.16(postcss@8.4.32) - postcss: - specifier: ^8.4.32 - version: 8.4.32 - tailwindcss: - specifier: ^3.4.0 - version: 3.4.0 - typescript: - specifier: ^5.0.2 - version: 5.0.2 - vite: - specifier: ^4.4.4 - version: 4.4.4(@types/node@20.10.5) - -packages: - - /@alloc/quick-lru@5.2.0: - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} - - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 - dev: true - - /@assemblyscript/loader@0.9.4: - resolution: {integrity: sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==} - dev: false - - /@babel/code-frame@7.23.5: - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 - dev: true - - /@babel/compat-data@7.23.5: - resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/core@7.23.7: - resolution: {integrity: sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) - '@babel/helpers': 7.23.7 - '@babel/parser': 7.23.6 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.7 - '@babel/types': 7.23.6 - convert-source-map: 2.0.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/generator@7.23.6: - resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.6 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 - jsesc: 2.5.2 - dev: true - - /@babel/helper-compilation-targets@7.23.6: - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.23.5 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.22.2 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.6 - dev: true - - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.6 - dev: true - - /@babel/helper-module-imports@7.22.15: - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.6 - dev: true - - /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.7 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - dev: true - - /@babel/helper-plugin-utils@7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.6 - dev: true - - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.6 - dev: true - - /@babel/helper-string-parser@7.23.4: - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-option@7.23.5: - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helpers@7.23.7: - resolution: {integrity: sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.7 - '@babel/types': 7.23.6 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - - /@babel/parser@7.23.6: - resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.23.6 - dev: true - - /@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/runtime@7.23.7: - resolution: {integrity: sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.1 - dev: false - - /@babel/template@7.22.15: - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.23.5 - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 - dev: true - - /@babel/traverse@7.23.7: - resolution: {integrity: sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/types@7.23.6: - resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.23.4 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - dev: true - - /@decentralized-identity/ion-pow-sdk@1.0.17: - resolution: {integrity: sha512-vk7DTDM8aKDbFyu1ad/qkoRrGL4q+KvNeL/FNZXhkWPaDhVExBN/qGEoRLf1YSfFe+myto3+4RYTPut+riiqnw==} - dependencies: - buffer: 6.0.3 - cross-fetch: 3.1.5 - hash-wasm: 4.9.0 - transitivePeerDependencies: - - encoding - dev: false - - /@decentralized-identity/ion-sdk@1.0.1: - resolution: {integrity: sha512-+P+DXcRSFjsEsI5KIqUmVjpzgUT28B2lWpTO+IxiBcfibAN/1Sg20NebGTO/+serz2CnSZf95N2a1OZ6eXypGQ==} - dependencies: - '@noble/ed25519': 2.0.0 - '@noble/secp256k1': 2.0.0 - canonicalize: 2.0.0 - multiformats: 12.1.3 - multihashes: 4.0.3 - uri-js: 4.4.1 - dev: false - - /@esbuild/android-arm64@0.18.20: - resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.18.20: - resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.18.20: - resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.18.20: - resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.18.20: - resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.18.20: - resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.18.20: - resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.18.20: - resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.18.20: - resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.18.20: - resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.18.20: - resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.18.20: - resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.18.20: - resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.18.20: - resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.18.20: - resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.18.20: - resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.18.20: - resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.18.20: - resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.18.20: - resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.18.20: - resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.18.20: - resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.18.20: - resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@floating-ui/core@1.5.2: - resolution: {integrity: sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==} - dependencies: - '@floating-ui/utils': 0.1.6 - dev: false - - /@floating-ui/dom@1.5.3: - resolution: {integrity: sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==} - dependencies: - '@floating-ui/core': 1.5.2 - '@floating-ui/utils': 0.1.6 - dev: false - - /@floating-ui/react-dom@2.0.4(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - dependencies: - '@floating-ui/dom': 1.5.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@floating-ui/utils@0.1.6: - resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==} - dev: false - - /@hookform/resolvers@3.3.2(react-hook-form@7.49.2): - resolution: {integrity: sha512-Tw+GGPnBp+5DOsSg4ek3LCPgkBOuOgS5DsDV7qsWNH9LZc433kgsWICjlsh2J9p04H2K66hsXPPb9qn9ILdUtA==} - peerDependencies: - react-hook-form: ^7.0.0 - dependencies: - react-hook-form: 7.49.2(react@18.2.0) - dev: false - - /@ipld/dag-cbor@9.0.3: - resolution: {integrity: sha512-A2UFccS0+sARK9xwXiVZIaWbLbPxLGP3UZOjBeOMWfDY04SXi8h1+t4rHBzOlKYF/yWNm3RbFLyclWO7hZcy4g==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - cborg: 2.0.5 - multiformats: 12.1.3 - dev: false - - /@ipld/dag-pb@4.0.7: - resolution: {integrity: sha512-EqJtSAcELiYbp9K0Y5ckbg+W0pD5cSy5PnE/QsCrpKvoq+u0E8Vi07chNGDLaShd5AjDq0AMtnuudKUUuEuSjg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - multiformats: 13.0.0 - dev: false - - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - dependencies: - string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.20 - - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - - /@jridgewell/trace-mapping@0.3.20: - resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - - /@js-temporal/polyfill@0.4.4: - resolution: {integrity: sha512-2X6bvghJ/JAoZO52lbgyAPFj8uCflhTo2g7nkFzEQdXd/D8rEeD4HtmTEpmtGCva260fcd66YNXBOYdnmHqSOg==} - engines: {node: '>=12'} - dependencies: - jsbi: 4.3.0 - tslib: 2.6.2 - dev: false - - /@leichtgewicht/ip-codec@2.0.4: - resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} - dev: false - - /@mapbox/node-pre-gyp@1.0.11: - resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} - hasBin: true - dependencies: - detect-libc: 2.0.2 - https-proxy-agent: 5.0.1 - make-dir: 3.1.0 - node-fetch: 2.7.0 - nopt: 5.0.0 - npmlog: 5.0.1 - rimraf: 3.0.2 - semver: 7.5.4 - tar: 6.2.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - optional: true - - /@multiformats/base-x@4.0.1: - resolution: {integrity: sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==} - dev: false - - /@multiformats/murmur3@2.1.7: - resolution: {integrity: sha512-Yf0UpAaONjed+8PTt5NM/GG4Z4Ai4m1qfT7bqevjnkwRQ12K+0jxtRomirz+VJx4PokpA2St1ZSD1iMkZTqPRQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - multiformats: 12.1.3 - murmurhash3js-revisited: 3.0.0 - dev: false - - /@noble/ciphers@0.1.4: - resolution: {integrity: sha512-d3ZR8vGSpy3v/nllS+bD/OMN5UZqusWiQqkyj7AwzTnhXFH72pF5oB4Ach6DQ50g5kXxC28LdaYBEpsyv9KOUQ==} - dev: false - - /@noble/ciphers@0.3.0: - resolution: {integrity: sha512-ldbrnOjmNRwFdXcTM6uXDcxpMIFrbzAWNnpBPp4oTJTFF0XByGD6vf45WrehZGXRQTRVV+Zm8YP+EgEf+e4cWA==} - dev: false - - /@noble/curves@1.1.0: - resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} - dependencies: - '@noble/hashes': 1.3.1 - dev: false - - /@noble/curves@1.3.0: - resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} - dependencies: - '@noble/hashes': 1.3.3 - dev: false - - /@noble/ed25519@2.0.0: - resolution: {integrity: sha512-/extjhkwFupyopDrt80OMWKdLgP429qLZj+z6sYJz90rF2Iz0gjZh2ArMKPImUl13Kx+0EXI2hN9T/KJV0/Zng==} - dev: false - - /@noble/hashes@1.3.1: - resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} - engines: {node: '>= 16'} - dev: false - - /@noble/hashes@1.3.3: - resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} - engines: {node: '>= 16'} - dev: false - - /@noble/secp256k1@2.0.0: - resolution: {integrity: sha512-rUGBd95e2a45rlmFTqQJYEFA4/gdIARFfuTuTqLglz0PZ6AKyzyXsEZZq7UZn8hZsvaBgpCzKKBJizT2cJERXw==} - dev: false - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.16.0 - - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - optional: true - - /@radix-ui/primitive@1.0.1: - resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} - dependencies: - '@babel/runtime': 7.23.7 - dev: false - - /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.15 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-avatar@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/react-context': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@types/react': 18.2.15 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.15)(react@18.2.0) - '@types/react': 18.2.15 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.15)(react@18.2.0): - resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@types/react': 18.2.15 - react: 18.2.0 - dev: false - - /@radix-ui/react-context@1.0.1(@types/react@18.2.15)(react@18.2.0): - resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@types/react': 18.2.15 - react: 18.2.0 - dev: false - - /@radix-ui/react-direction@1.0.1(@types/react@18.2.15)(react@18.2.0): - resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@types/react': 18.2.15 - react: 18.2.0 - dev: false - - /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.15)(react@18.2.0) - '@types/react': 18.2.15 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@types/react': 18.2.15 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.15)(react@18.2.0): - resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@types/react': 18.2.15 - react: 18.2.0 - dev: false - - /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@types/react': 18.2.15 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-id@1.0.1(@types/react@18.2.15)(react@18.2.0): - resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@types/react': 18.2.15 - react: 18.2.0 - dev: false - - /@radix-ui/react-label@2.0.2(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.15 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@types/react': 18.2.15 - '@types/react-dom': 18.2.7 - aria-hidden: 1.2.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.15)(react@18.2.0) - dev: false - - /@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@floating-ui/react-dom': 2.0.4(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.15 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.15 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@types/react': 18.2.15 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.15)(react@18.2.0) - '@types/react': 18.2.15 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@types/react': 18.2.15 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-slot@1.0.2(@types/react@18.2.15)(react@18.2.0): - resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@types/react': 18.2.15 - react: 18.2.0 - dev: false - - /@radix-ui/react-tabs@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-context': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@types/react': 18.2.15 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.15)(react@18.2.0): - resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@types/react': 18.2.15 - react: 18.2.0 - dev: false - - /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.15)(react@18.2.0): - resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@types/react': 18.2.15 - react: 18.2.0 - dev: false - - /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.15)(react@18.2.0): - resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@types/react': 18.2.15 - react: 18.2.0 - dev: false - - /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.15)(react@18.2.0): - resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@types/react': 18.2.15 - react: 18.2.0 - dev: false - - /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.15)(react@18.2.0): - resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.15 - react: 18.2.0 - dev: false - - /@radix-ui/react-use-size@1.0.1(@types/react@18.2.15)(react@18.2.0): - resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.15)(react@18.2.0) - '@types/react': 18.2.15 - react: 18.2.0 - dev: false - - /@radix-ui/rect@1.0.1: - resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} - dependencies: - '@babel/runtime': 7.23.7 - dev: false - - /@remix-run/router@1.14.1: - resolution: {integrity: sha512-Qg4DMQsfPNAs88rb2xkdk03N3bjK4jgX5fR24eHCTR9q6PrhZQZ4UJBPzCHJkIpTRN1UKxx2DzjZmnC+7Lj0Ow==} - engines: {node: '>=14.0.0'} - dev: false - - /@tauri-apps/api@1.5.2: - resolution: {integrity: sha512-tZK3XJiIUnUdHN7rGqA+j57dvT3/7z2bEiPfWmO3uAymv2JMBJrfGwbyDWLjGue37UVhh0gLYSkA9wV+/bASwA==} - engines: {node: '>= 14.6.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} - dev: false - - /@tauri-apps/cli-darwin-arm64@1.5.7: - resolution: {integrity: sha512-eUpOUhs2IOpKaLa6RyGupP2owDLfd0q2FR/AILzryjtBtKJJRDQQvuotf+LcbEce2Nc2AHeYJIqYAsB4sw9K+g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@tauri-apps/cli-darwin-x64@1.5.7: - resolution: {integrity: sha512-zfumTv1xUuR+RB1pzhRy+51tB6cm8I76g0xUBaXOfEdOJ9FqW5GW2jdnEUbpNuU65qJ1lB8LVWHKGrSWWKazew==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@tauri-apps/cli-linux-arm-gnueabihf@1.5.7: - resolution: {integrity: sha512-JngWNqS06bMND9PhiPWp0e+yknJJuSozsSbo+iMzHoJNRauBZCUx+HnUcygUR66Cy6qM4eJvLXtsRG7ApxvWmg==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@tauri-apps/cli-linux-arm64-gnu@1.5.7: - resolution: {integrity: sha512-WyIYP9BskgBGq+kf4cLAyru8ArrxGH2eMYGBJvuNEuSaqBhbV0i1uUxvyWdazllZLAEz1WvSocUmSwLknr1+sQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@tauri-apps/cli-linux-arm64-musl@1.5.7: - resolution: {integrity: sha512-OrDpihQP2MB0JY1a/wP9wsl9dDjFDpVEZOQxt4hU+UVGRCZQok7ghPBg4+Xpd1CkNkcCCuIeY8VxRvwLXpnIzg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@tauri-apps/cli-linux-x64-gnu@1.5.7: - resolution: {integrity: sha512-4T7FAYVk76rZi8VkuLpiKUAqaSxlva86C1fHm/RtmoTKwZEV+MI3vIMoVg+AwhyWIy9PS55C75nF7+OwbnFnvQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@tauri-apps/cli-linux-x64-musl@1.5.7: - resolution: {integrity: sha512-LL9aMK601BmQjAUDcKWtt5KvAM0xXi0iJpOjoUD3LPfr5dLvBMTflVHQDAEtuZexLQyqpU09+60781PrI/FCTw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@tauri-apps/cli-win32-arm64-msvc@1.5.7: - resolution: {integrity: sha512-TmAdM6GVkfir3AUFsDV2gyc25kIbJeAnwT72OnmJGAECHs/t/GLP9IkFLLVcFKsiosRf8BXhVyQ84NYkSWo14w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@tauri-apps/cli-win32-ia32-msvc@1.5.7: - resolution: {integrity: sha512-bqWfxwCfLmrfZy69sEU19KHm5TFEaMb8KIekd4aRq/kyOlrjKLdZxN1PyNRP8zpJA1lTiRHzfUDfhpmnZH/skg==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@tauri-apps/cli-win32-x64-msvc@1.5.7: - resolution: {integrity: sha512-OxLHVBNdzyQ//xT3kwjQFnJTn/N5zta/9fofAkXfnL7vqmVn6s/RY1LDa3sxCHlRaKw0n3ShpygRbM9M8+sO9w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@tauri-apps/cli@1.5.7: - resolution: {integrity: sha512-z7nXLpDAYfQqR5pYhQlWOr88DgPq1AfQyxHhGiakiVgWlaG0ikEfQxop2txrd52H0TRADG0JHR9vFrVFPv4hVQ==} - engines: {node: '>= 10'} - hasBin: true - optionalDependencies: - '@tauri-apps/cli-darwin-arm64': 1.5.7 - '@tauri-apps/cli-darwin-x64': 1.5.7 - '@tauri-apps/cli-linux-arm-gnueabihf': 1.5.7 - '@tauri-apps/cli-linux-arm64-gnu': 1.5.7 - '@tauri-apps/cli-linux-arm64-musl': 1.5.7 - '@tauri-apps/cli-linux-x64-gnu': 1.5.7 - '@tauri-apps/cli-linux-x64-musl': 1.5.7 - '@tauri-apps/cli-win32-arm64-msvc': 1.5.7 - '@tauri-apps/cli-win32-ia32-msvc': 1.5.7 - '@tauri-apps/cli-win32-x64-msvc': 1.5.7 - dev: true - - /@tbd54566975/dwn-sdk-js@0.2.8: - resolution: {integrity: sha512-oiKk+ekAQO94bUkt6yk+xkDY8uCGmNC+rKaYQLhAoTrhYrczeRSuDT04F5/vPBT5K6NfAoRcQsIyBmvgRCUvgA==} - engines: {node: '>= 18'} - dependencies: - '@ipld/dag-cbor': 9.0.3 - '@js-temporal/polyfill': 0.4.4 - '@noble/ed25519': 2.0.0 - '@noble/secp256k1': 2.0.0 - abstract-level: 1.0.3 - ajv: 8.12.0 - blockstore-core: 4.2.0 - cross-fetch: 4.0.0 - eciesjs: 0.4.5 - flat: 5.0.2 - interface-blockstore: 5.2.3 - interface-store: 5.1.2 - ipfs-unixfs-exporter: 13.1.5 - ipfs-unixfs-importer: 15.1.5 - level: 8.0.0 - lodash: 4.17.21 - lru-cache: 9.1.2 - ms: 2.1.3 - multiformats: 11.0.2 - randombytes: 2.1.0 - readable-stream: 4.4.2 - ulidx: 2.1.0 - uuid: 8.3.2 - varint: 6.0.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@types/lodash@4.14.202: - resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} - dev: true - - /@types/node@20.10.5: - resolution: {integrity: sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==} - dependencies: - undici-types: 5.26.5 - dev: true - - /@types/prop-types@15.7.11: - resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} - - /@types/react-dom@18.2.7: - resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} - dependencies: - '@types/react': 18.2.15 - - /@types/react-window@1.8.8: - resolution: {integrity: sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q==} - dependencies: - '@types/react': 18.2.15 - dev: true - - /@types/react@18.2.15: - resolution: {integrity: sha512-oEjE7TQt1fFTFSbf8kkNuc798ahTUzn3Le67/PWjE8MAfYAD/qB7O8hSTcromLFqHCt9bcdOg5GXMokzTjJ5SA==} - dependencies: - '@types/prop-types': 15.7.11 - '@types/scheduler': 0.16.8 - csstype: 3.1.3 - - /@types/scheduler@0.16.8: - resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} - - /@vitejs/plugin-react@4.0.3(vite@4.4.4): - resolution: {integrity: sha512-pwXDog5nwwvSIzwrvYYmA2Ljcd/ZNlcsSG2Q9CNDBwnsd55UGAyr2doXtB5j+2uymRCnCfExlznzzSFbBRcoCg==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.2.0 - dependencies: - '@babel/core': 7.23.7 - '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.7) - react-refresh: 0.14.0 - vite: 4.4.4(@types/node@20.10.5) - transitivePeerDependencies: - - supports-color - dev: true - - /@web5/agent@0.2.5: - resolution: {integrity: sha512-Z9JY/43Yrg0xKK26y/iZFdHNtVf/k9XLxw8mXP5zfYidrqfAgVR0i4LKA7qZKfUSxC7/uaD/STYYIKpNByd/cw==} - engines: {node: '>=18.0.0'} - dependencies: - '@tbd54566975/dwn-sdk-js': 0.2.8 - '@web5/common': 0.2.2 - '@web5/crypto': 0.2.2 - '@web5/dids': 0.2.3 - level: 8.0.0 - readable-stream: 4.4.2 - readable-web-to-node-stream: 3.0.2 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@web5/api@0.8.3: - resolution: {integrity: sha512-YXQ++ZShtd5LeFRqEMGlhVqJ7Zg5P6bMequpaLl068bCGjtjCwiFFgDtM1KeL36IAzQ4pFLFyj9aTGZ/JgCXHA==} - engines: {node: '>=18.0.0'} - dependencies: - '@tbd54566975/dwn-sdk-js': 0.2.8 - '@web5/agent': 0.2.5 - '@web5/common': 0.2.2 - '@web5/crypto': 0.2.2 - '@web5/dids': 0.2.3 - '@web5/user-agent': 0.2.5 - level: 8.0.0 - ms: 2.1.3 - readable-stream: 4.4.2 - readable-web-to-node-stream: 3.0.2 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@web5/common@0.2.1: - resolution: {integrity: sha512-Tt5P17HgQCx+Epw0IHnhRKqp5UU3E4xtsE8PkdghOBnvntBB0op5P6efvR1WqmJft5+VunDHt3yZAZstuqQkNg==} - engines: {node: '>=18.0.0'} - dependencies: - level: 8.0.0 - multiformats: 11.0.2 - dev: false - - /@web5/common@0.2.2: - resolution: {integrity: sha512-dRn6SmALExeTLMTK/W5ozGarfaddK+Lraf5OjuIGLAaLfcX1RWx3oDMoY5Hr9LjfxHJC8mGXB8DnKflbeYJRgA==} - engines: {node: '>=18.0.0'} - dependencies: - level: 8.0.0 - multiformats: 11.0.2 - readable-stream: 4.4.2 - dev: false - - /@web5/crypto@0.2.2: - resolution: {integrity: sha512-vHFg0wXQSQXrwuBNQyDHnmSZchfTfO6/Sv+7rDsNkvofs+6lGTE8CZ02cwUYMeIwTRMLer12c+fMfzYrXokEUQ==} - engines: {node: '>=18.0.0'} - dependencies: - '@noble/ciphers': 0.1.4 - '@noble/curves': 1.1.0 - '@noble/hashes': 1.3.1 - '@web5/common': 0.2.1 - dev: false - - /@web5/dids@0.2.3: - resolution: {integrity: sha512-Y3PHOavNkSyjBxZQEpKE6XueaqemBO5w0UMOnFh4xH6+5B43ENEE4LHIqVyn2bCpfEBGLXENgDZYqyJphBu0pA==} - engines: {node: '>=18.0.0'} - dependencies: - '@decentralized-identity/ion-pow-sdk': 1.0.17 - '@decentralized-identity/ion-sdk': 1.0.1 - '@web5/common': 0.2.2 - '@web5/crypto': 0.2.2 - did-resolver: 4.1.0 - dns-packet: 5.6.1 - level: 8.0.0 - ms: 2.1.3 - pkarr: 1.1.1 - z32: 1.0.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@web5/user-agent@0.2.5: - resolution: {integrity: sha512-qv5M698C5HSvq30xUgLWtcsbZppjfOH5qZthpTRx4ItL5UWA/eQ9DsQiQeb4vet3uIUy3NHRDIQezclOdwYErw==} - engines: {node: '>=18.0.0'} - dependencies: - '@web5/agent': 0.2.5 - '@web5/common': 0.2.2 - '@web5/crypto': 0.2.2 - '@web5/dids': 0.2.3 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: false - optional: true - - /abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - dependencies: - event-target-shim: 5.0.1 - dev: false - - /abstract-level@1.0.3: - resolution: {integrity: sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==} - engines: {node: '>=12'} - dependencies: - buffer: 6.0.3 - catering: 2.1.1 - is-buffer: 2.0.5 - level-supports: 4.0.1 - level-transcoder: 1.0.1 - module-error: 1.0.2 - queue-microtask: 1.2.3 - dev: false - - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: false - optional: true - - /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - dev: false - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - dev: true - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - /aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - dev: false - optional: true - - /are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - dev: false - optional: true - - /arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - - /aria-hidden@1.2.3: - resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} - engines: {node: '>=10'} - dependencies: - tslib: 2.6.2 - dev: false - - /attr-accept@2.2.2: - resolution: {integrity: sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==} - engines: {node: '>=4'} - dev: false - - /autoprefixer@10.4.16(postcss@8.4.32): - resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - dependencies: - browserslist: 4.22.2 - caniuse-lite: 1.0.30001572 - fraction.js: 4.3.7 - normalize-range: 0.1.2 - picocolors: 1.0.0 - postcss: 8.4.32 - postcss-value-parser: 4.2.0 - dev: true - - /b4a@1.6.4: - resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} - dev: false - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - /base64-arraybuffer@1.0.2: - resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} - engines: {node: '>= 0.6.0'} - dev: false - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: false - - /bencode@2.0.3: - resolution: {integrity: sha512-D/vrAD4dLVX23NalHwb8dSvsUsxeRPO8Y7ToKA015JQYq69MLDOMkC0uGZYA/MPpltLO8rt8eqFC2j8DxjTZ/w==} - dev: false - - /bencode@3.1.1: - resolution: {integrity: sha512-btsxX9201yoWh45TdqYg6+OZ5O1xTYKTYSGvJndICDFtznE/9zXgow8yjMvvhOqKKuzuL7h+iiCMpfkG8+QuBA==} - engines: {node: '>=12.20.0'} - dependencies: - uint8-util: 2.2.4 - dev: false - - /bencode@4.0.0: - resolution: {integrity: sha512-AERXw18df0pF3ziGOCyUjqKZBVNH8HV3lBxnx5w0qtgMIk4a1wb9BkcCQbkp9Zstfrn/dzRwl7MmUHHocX3sRQ==} - engines: {node: '>=12.20.0'} - dependencies: - uint8-util: 2.2.4 - dev: false - - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - - /bittorrent-dht@11.0.5: - resolution: {integrity: sha512-R09D6uNaziRqsc+B/j5QzkjceTak+wH9vcNLnkmt8A52EWF9lQwBP0vvCKgSA3AJOYYl+41n3osA2KYYn/z5uQ==} - engines: {node: '>=12.20.0'} - dependencies: - bencode: 4.0.0 - debug: 4.3.4 - k-bucket: 5.1.0 - k-rpc: 5.1.0 - last-one-wins: 1.0.4 - lru: 3.1.0 - randombytes: 2.1.0 - record-cache: 1.2.0 - transitivePeerDependencies: - - supports-color - dev: false - - /bl@5.1.0: - resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} - dependencies: - buffer: 6.0.3 - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: false - - /blake2b-wasm@2.4.0: - resolution: {integrity: sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==} - dependencies: - b4a: 1.6.4 - nanoassert: 2.0.0 - dev: false - - /blake2b@2.1.4: - resolution: {integrity: sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A==} - dependencies: - blake2b-wasm: 2.4.0 - nanoassert: 2.0.0 - dev: false - - /blockstore-core@4.2.0: - resolution: {integrity: sha512-F8BCobc75D+9/+hUD+5cixbU6zmZA+lBgNiuBkNlJqRgmAaBBvLOQF6Ad9Jei0Nvmy2a1jaF4CiN76W1apIghA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - err-code: 3.0.1 - interface-blockstore: 5.2.3 - interface-store: 5.1.2 - multiformats: 11.0.2 - dev: false - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: false - optional: true - - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - - /browser-level@1.0.1: - resolution: {integrity: sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==} - dependencies: - abstract-level: 1.0.3 - catering: 2.1.1 - module-error: 1.0.2 - run-parallel-limit: 1.1.0 - dev: false - - /browserslist@4.22.2: - resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001572 - electron-to-chromium: 1.4.616 - node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.22.2) - dev: true - - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: false - - /camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} - - /caniuse-lite@1.0.30001572: - resolution: {integrity: sha512-1Pbh5FLmn5y4+QhNyJE9j3/7dK44dGB83/ZMjv/qJk86TvDbjk0LosiZo0i0WB0Vx607qMX9jYrn1VLHCkN4rw==} - dev: true - - /canonicalize@2.0.0: - resolution: {integrity: sha512-ulDEYPv7asdKvqahuAY35c1selLdzDwHqugK92hfkzvlDCwXRRelDkR+Er33md/PtnpqHemgkuDPanZ4fiYZ8w==} - dev: false - - /canvas@2.11.2: - resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} - engines: {node: '>=6'} - requiresBuild: true - dependencies: - '@mapbox/node-pre-gyp': 1.0.11 - nan: 2.18.0 - simple-get: 3.1.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - optional: true - - /catering@2.1.1: - resolution: {integrity: sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==} - engines: {node: '>=6'} - dev: false - - /cborg@2.0.5: - resolution: {integrity: sha512-xVW1rSIw1ZXbkwl2XhJ7o/jAv0vnVoQv/QlfQxV8a7V5PlA4UU/AcIiXqmpyybwNWy/GPQU1m/aBVNIWr7/T0w==} - hasBin: true - dev: false - - /chacha20-universal@1.0.4: - resolution: {integrity: sha512-/IOxdWWNa7nRabfe7+oF+jVkGjlr2xUL4J8l/OvzZhj+c9RpMqoo3Dq+5nU1j/BflRV4BKnaQ4+4oH1yBpQG1Q==} - dependencies: - nanoassert: 2.0.0 - dev: false - - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: true - - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: false - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - /chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - dev: false - optional: true - - /chrome-dgram@3.0.6: - resolution: {integrity: sha512-bqBsUuaOiXiqxXt/zA/jukNJJ4oaOtc7ciwqJpZVEaaXwwxqgI2/ZdG02vXYWUhHGziDlvGMQWk0qObgJwVYKA==} - dependencies: - inherits: 2.0.4 - run-series: 1.1.9 - dev: false - - /chrome-dns@1.0.1: - resolution: {integrity: sha512-HqsYJgIc8ljJJOqOzLphjAs79EUuWSX3nzZi2LNkzlw3GIzAeZbaSektC8iT/tKvLqZq8yl1GJu5o6doA4TRbg==} - dependencies: - chrome-net: 3.3.4 - dev: false - - /chrome-net@3.3.4: - resolution: {integrity: sha512-Jzy2EnzmE+ligqIZUsmWnck9RBXLuUy6CaKyuNMtowFG3ZvLt8d+WBJCTPEludV0DHpIKjAOlwjFmTaEdfdWCw==} - dependencies: - inherits: 2.0.4 - dev: false - - /class-variance-authority@0.7.0: - resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} - dependencies: - clsx: 2.0.0 - dev: false - - /classic-level@1.3.0: - resolution: {integrity: sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==} - engines: {node: '>=12'} - requiresBuild: true - dependencies: - abstract-level: 1.0.3 - catering: 2.1.1 - module-error: 1.0.2 - napi-macros: 2.2.2 - node-gyp-build: 4.7.1 - dev: false - - /clsx@2.0.0: - resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} - engines: {node: '>=6'} - dev: false - - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - dev: true - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - /color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - dev: false - optional: true - - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: false - optional: true - - /console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - dev: false - optional: true - - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true - - /cross-fetch@3.1.5: - resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} - dependencies: - node-fetch: 2.6.7 - transitivePeerDependencies: - - encoding - dev: false - - /cross-fetch@4.0.0: - resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} - dependencies: - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - dev: false - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - /cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - - /csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /decompress-response@4.2.1: - resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} - engines: {node: '>=8'} - dependencies: - mimic-response: 2.1.0 - dev: false - optional: true - - /delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - dev: false - optional: true - - /detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} - engines: {node: '>=8'} - dev: false - optional: true - - /detect-node-es@1.1.0: - resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - dev: false - - /did-resolver@4.1.0: - resolution: {integrity: sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA==} - dev: false - - /didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - - /dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - - /dns-packet@5.6.1: - resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} - engines: {node: '>=6'} - dependencies: - '@leichtgewicht/ip-codec': 2.0.4 - dev: false - - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - /eciesjs@0.4.5: - resolution: {integrity: sha512-2zSRIygO48LpdS95Rwt9ryIkJNO37IdbkjRsnYyAn7gx7e4WPBNimnk6jGNdx2QQYr/VJRPnSVdwQpO5bycYZw==} - engines: {node: '>=16.0.0'} - dependencies: - '@noble/ciphers': 0.3.0 - '@noble/curves': 1.3.0 - '@noble/hashes': 1.3.3 - dev: false - - /electron-to-chromium@1.4.616: - resolution: {integrity: sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg==} - dev: true - - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - /err-code@3.0.1: - resolution: {integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==} - dev: false - - /esbuild@0.18.20: - resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.18.20 - '@esbuild/android-arm64': 0.18.20 - '@esbuild/android-x64': 0.18.20 - '@esbuild/darwin-arm64': 0.18.20 - '@esbuild/darwin-x64': 0.18.20 - '@esbuild/freebsd-arm64': 0.18.20 - '@esbuild/freebsd-x64': 0.18.20 - '@esbuild/linux-arm': 0.18.20 - '@esbuild/linux-arm64': 0.18.20 - '@esbuild/linux-ia32': 0.18.20 - '@esbuild/linux-loong64': 0.18.20 - '@esbuild/linux-mips64el': 0.18.20 - '@esbuild/linux-ppc64': 0.18.20 - '@esbuild/linux-riscv64': 0.18.20 - '@esbuild/linux-s390x': 0.18.20 - '@esbuild/linux-x64': 0.18.20 - '@esbuild/netbsd-x64': 0.18.20 - '@esbuild/openbsd-x64': 0.18.20 - '@esbuild/sunos-x64': 0.18.20 - '@esbuild/win32-arm64': 0.18.20 - '@esbuild/win32-ia32': 0.18.20 - '@esbuild/win32-x64': 0.18.20 - dev: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: true - - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: true - - /event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - dev: false - - /eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - dev: false - - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - dev: false - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: false - - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - - /fastq@1.16.0: - resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} - dependencies: - reusify: 1.0.4 - - /file-selector@0.6.0: - resolution: {integrity: sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==} - engines: {node: '>= 12'} - dependencies: - tslib: 2.6.2 - dev: false - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - - /flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - dev: false - - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} - dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.1.0 - - /fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - dev: true - - /fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - dev: false - optional: true - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: false - optional: true - - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - optional: true - - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - /gauge@3.0.2: - resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} - engines: {node: '>=10'} - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - object-assign: 4.1.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - dev: false - optional: true - - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true - - /get-nonce@1.0.1: - resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} - engines: {node: '>=6'} - dev: false - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - - /glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.6 - minimatch: 9.0.3 - minipass: 7.0.4 - path-scurry: 1.10.1 - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: false - optional: true - - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true - - /graceful-goodbye@1.3.0: - resolution: {integrity: sha512-hcZOs20emYlTM7MmUE0FpuZcjlk2GPsR+UYTHDeWxtGjXcbh2CawGi8vlzqsIvspqAbot7mRv3sC/uhgtKc4hQ==} - dependencies: - safety-catch: 1.0.2 - dev: false - - /hamt-sharding@3.0.2: - resolution: {integrity: sha512-f0DzBD2tSmLFdFsLAvOflIBqFPjerbA7BfmwO8mVho/5hXwgyyYhv+ijIzidQf/DpDX3bRjAQvhGoBFj+DBvPw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - sparse-array: 1.3.2 - uint8arrays: 4.0.10 - dev: false - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true - - /has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - dev: false - optional: true - - /hash-wasm@4.9.0: - resolution: {integrity: sha512-7SW7ejyfnRxuOc7ptQHSf4LDoZaWOivfzqw+5rpcQku0nHfmicPKE51ra9BiRLAmT8+gGLestr1XroUkqdjL6w==} - dev: false - - /hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} - dependencies: - function-bind: 1.1.2 - - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: false - optional: true - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: false - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: false - optional: true - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: false - - /interface-blockstore@5.2.3: - resolution: {integrity: sha512-15cN+ZFdcVXdXo6I/SrSzFDsuJyDTyEI52XuvXQlR/G5fe3cK8p0tvVjfu5diRQH1XqNgmJEdMPixyt0xgjtvQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - interface-store: 5.1.2 - multiformats: 11.0.2 - dev: false - - /interface-store@5.1.2: - resolution: {integrity: sha512-q2sLoqC+UdaWnjwGyghsH0jwqqVk226lsG207e3QwPB8sAZYmYIWUnJwJH3JjFNNRV9e6CUTmm+gDO0Xg4KRiw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - - /invariant@2.2.4: - resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - dependencies: - loose-envify: 1.4.0 - dev: false - - /ipfs-unixfs-exporter@13.1.5: - resolution: {integrity: sha512-O5aMawsHoe4DaYk5FFil2EPrNOaU3pkHC6qUR5JMnW7es93W3b/RjJoO7AyDL1rpb+M3K0oRu86Yc5wLNQQ8jg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@ipld/dag-cbor': 9.0.3 - '@ipld/dag-pb': 4.0.7 - '@multiformats/murmur3': 2.1.7 - err-code: 3.0.1 - hamt-sharding: 3.0.2 - interface-blockstore: 5.2.3 - ipfs-unixfs: 11.1.2 - it-filter: 3.0.4 - it-last: 3.0.4 - it-map: 3.0.5 - it-parallel: 3.0.6 - it-pipe: 3.0.1 - it-pushable: 3.2.3 - multiformats: 11.0.2 - p-queue: 7.4.1 - progress-events: 1.0.0 - uint8arrays: 4.0.10 - dev: false - - /ipfs-unixfs-importer@15.1.5: - resolution: {integrity: sha512-TXaOI0M5KNpq2+qLw8AIYd0Lnc0gWTKCBqUd9eErBUwaP3Fna4qauF+JX9Rj2UrwaOvG/1xbF8Vm+92eOcKWMA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - '@ipld/dag-pb': 4.0.7 - '@multiformats/murmur3': 2.1.7 - err-code: 3.0.1 - hamt-sharding: 3.0.2 - interface-blockstore: 5.2.3 - interface-store: 5.1.2 - ipfs-unixfs: 11.1.2 - it-all: 3.0.4 - it-batch: 3.0.4 - it-first: 3.0.4 - it-parallel-batch: 3.0.4 - multiformats: 11.0.2 - progress-events: 1.0.0 - rabin-wasm: 0.1.5 - uint8arraylist: 2.4.8 - uint8arrays: 4.0.10 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /ipfs-unixfs@11.1.2: - resolution: {integrity: sha512-HVjrACOhU8RgMskcrfydk+FDAE9pFKr8tneKLaVYQ2f81HUKXoiSdgsAJY/jt7Ieyj4tE12TZGduIeWtNpScOw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - err-code: 3.0.1 - protons-runtime: 5.2.1 - uint8arraylist: 2.4.8 - dev: false - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - - /is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - dev: false - - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - dependencies: - hasown: 2.0.0 - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - /it-all@3.0.4: - resolution: {integrity: sha512-UMiy0i9DqCHBdWvMbzdYvVGa5/w4t1cc4nchpbnjdLhklglv8mQeEYnii0gvKESJuL1zV32Cqdb33R6/GPfxpQ==} - dev: false - - /it-batch@3.0.4: - resolution: {integrity: sha512-WRu2mqOYIs+T9k7+yxSK9VJdk0UE4R0jKQsWQcti5c6vhb1FhjC2+yCB5XBrctQ9edNfCMU/wVzdDj8qSwimbA==} - dev: false - - /it-filter@3.0.4: - resolution: {integrity: sha512-e0sz+st4sudK/zH6GZ/gRTRP8A/ADuJFCYDmRgMbZvR79y5+v4ZXav850bBZk5wL9zXaYZFxS1v/6Qi+Vjwh5g==} - dependencies: - it-peekable: 3.0.3 - dev: false - - /it-first@3.0.4: - resolution: {integrity: sha512-FtQl84iTNxN5EItP/JgL28V2rzNMkCzTUlNoj41eVdfix2z1DBuLnBqZ0hzYhGGa1rMpbQf0M7CQSA2adlrLJg==} - dev: false - - /it-last@3.0.4: - resolution: {integrity: sha512-Ns+KTsQWhs0KCvfv5X3Ck3lpoYxHcp4zUp4d+AOdmC8cXXqDuoZqAjfWhgCbxJubXyIYWdfE2nRcfWqgvZHP8Q==} - dev: false - - /it-map@3.0.5: - resolution: {integrity: sha512-hB0TDXo/h4KSJJDSRLgAPmDroiXP6Fx1ck4Bzl3US9hHfZweTKsuiP0y4gXuTMcJlS6vj0bb+f70rhkD47ZA3w==} - dependencies: - it-peekable: 3.0.3 - dev: false - - /it-merge@3.0.3: - resolution: {integrity: sha512-FYVU15KC5pb/GQX1Ims+lee8d4pdqGVCpWr0lkNj8o4xuNo7jY71k6GuEiWdP+T7W1bJqewSxX5yoTy5yZpRVA==} - dependencies: - it-pushable: 3.2.3 - dev: false - - /it-parallel-batch@3.0.4: - resolution: {integrity: sha512-O1omh8ss8+UtXiMjE+8kM5C20DT0Ma4VtKVfrSHOJU0UHZ+iWBXarabzPYEp+WiuQmrv+klDPPlTZ9KaLN9xOA==} - dependencies: - it-batch: 3.0.4 - dev: false - - /it-parallel@3.0.6: - resolution: {integrity: sha512-i7UM7I9LTkDJw3YIqXHFAPZX6CWYzGc+X3irdNrVExI4vPazrJdI7t5OqrSVN8CONXLAunCiqaSV/zZRbQR56A==} - dependencies: - p-defer: 4.0.0 - dev: false - - /it-peekable@3.0.3: - resolution: {integrity: sha512-Wx21JX/rMzTEl9flx3DGHuPV1KQFGOl8uoKfQtmZHgPQtGb89eQ6RyVd82h3HuP9Ghpt0WgBDlmmdWeHXqyx7w==} - dev: false - - /it-pipe@3.0.1: - resolution: {integrity: sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dependencies: - it-merge: 3.0.3 - it-pushable: 3.2.3 - it-stream-types: 2.0.1 - dev: false - - /it-pushable@3.2.3: - resolution: {integrity: sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==} - dependencies: - p-defer: 4.0.0 - dev: false - - /it-stream-types@2.0.1: - resolution: {integrity: sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - /jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} - hasBin: true - - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - /jsbi@4.3.0: - resolution: {integrity: sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==} - dev: false - - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: false - - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true - - /k-bucket@5.1.0: - resolution: {integrity: sha512-Fac7iINEovXIWU20GPnOMLUbjctiS+cnmyjC4zAUgvs3XPf1vo9akfCHkigftSic/jiKqKl+KA3a/vFcJbHyCg==} - dependencies: - randombytes: 2.1.0 - dev: false - - /k-rpc-socket@1.11.1: - resolution: {integrity: sha512-8xtA8oqbZ6v1Niryp2/g4GxW16EQh5MvrUylQoOG+zcrDff5CKttON2XUXvMwlIHq4/2zfPVFiinAccJ+WhxoA==} - dependencies: - bencode: 2.0.3 - chrome-dgram: 3.0.6 - chrome-dns: 1.0.1 - chrome-net: 3.3.4 - dev: false - - /k-rpc@5.1.0: - resolution: {integrity: sha512-FGc+n70Hcjoa/X2JTwP+jMIOpBz+pkRffHnSl9yrYiwUxg3FIgD50+u1ePfJUOnRCnx6pbjmVk5aAeB1wIijuQ==} - dependencies: - k-bucket: 5.1.0 - k-rpc-socket: 1.11.1 - randombytes: 2.1.0 - dev: false - - /last-one-wins@1.0.4: - resolution: {integrity: sha512-t+KLJFkHPQk8lfN6WBOiGkiUXoub+gnb2XTYI2P3aiISL+94xgZ1vgz1SXN/N4hthuOoLXarXfBZPUruyjQtfA==} - dev: false - - /layerr@2.0.1: - resolution: {integrity: sha512-z0730CwG/JO24evdORnyDkwG1Q7b7mF2Tp1qRQ0YvrMMARbt1DFG694SOv439Gm7hYKolyZyaB49YIrYIfZBdg==} - dev: false - - /level-supports@4.0.1: - resolution: {integrity: sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==} - engines: {node: '>=12'} - dev: false - - /level-transcoder@1.0.1: - resolution: {integrity: sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==} - engines: {node: '>=12'} - dependencies: - buffer: 6.0.3 - module-error: 1.0.2 - dev: false - - /level@8.0.0: - resolution: {integrity: sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==} - engines: {node: '>=12'} - dependencies: - browser-level: 1.0.1 - classic-level: 1.3.0 - dev: false - - /lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} - - /lilconfig@3.0.0: - resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} - engines: {node: '>=14'} - - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: false - - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - dependencies: - js-tokens: 4.0.0 - dev: false - - /lru-cache@10.1.0: - resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} - engines: {node: 14 || >=16.14} - - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - dependencies: - yallist: 3.1.1 - dev: true - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: false - optional: true - - /lru-cache@9.1.2: - resolution: {integrity: sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==} - engines: {node: 14 || >=16.14} - dev: false - - /lru@3.1.0: - resolution: {integrity: sha512-5OUtoiVIGU4VXBOshidmtOsvBIvcQR6FD/RzWSvaeHyxCGB+PCUCu+52lqMfdc0h/2CLvHhZS4TwUmMQrrMbBQ==} - engines: {node: '>= 0.4.0'} - dependencies: - inherits: 2.0.4 - dev: false - - /lucide-react@0.298.0(react@18.2.0): - resolution: {integrity: sha512-tWoxZ663Zf/n8VxXTHnTJsU/w1ysWT1LORnIL1pzqElFdSqBhWbZeJ3sLdCZ5FpzpbkpkYEtluhuTyG2BTDYNQ==} - peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 - dependencies: - react: 18.2.0 - dev: false - - /make-cancellable-promise@1.3.2: - resolution: {integrity: sha512-GCXh3bq/WuMbS+Ky4JBPW1hYTOU+znU+Q5m9Pu+pI8EoUqIHk9+tviOKC6/qhHh8C4/As3tzJ69IF32kdz85ww==} - dev: false - - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - dependencies: - semver: 6.3.1 - dev: false - optional: true - - /make-event-props@1.6.2: - resolution: {integrity: sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA==} - dev: false - - /memoize-one@5.2.1: - resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} - dev: false - - /merge-refs@1.2.2(@types/react@18.2.15): - resolution: {integrity: sha512-RwcT7GsQR3KbuLw1rRuodq4Nt547BKEBkliZ0qqsrpyNne9bGTFtsFIsIpx82huWhcl3kOlOlH4H0xkPk/DqVw==} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@types/react': 18.2.15 - dev: false - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - - /mimic-response@2.1.0: - resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} - engines: {node: '>=8'} - dev: false - optional: true - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: false - optional: true - - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: 2.0.1 - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: false - - /minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - dependencies: - yallist: 4.0.0 - dev: false - optional: true - - /minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - dev: false - optional: true - - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - - /minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - dev: false - optional: true - - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - dev: false - optional: true - - /module-error@1.0.2: - resolution: {integrity: sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==} - engines: {node: '>=10'} - dev: false - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: false - - /multibase@4.0.6: - resolution: {integrity: sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ==} - engines: {node: '>=12.0.0', npm: '>=6.0.0'} - deprecated: This module has been superseded by the multiformats module - dependencies: - '@multiformats/base-x': 4.0.1 - dev: false - - /multiformats@11.0.2: - resolution: {integrity: sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - - /multiformats@12.1.3: - resolution: {integrity: sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - - /multiformats@13.0.0: - resolution: {integrity: sha512-xiIB0p7EKmETm3wyKedOg/xuyQ18PoWwXCzzgpZAiDxL9ktl3XTh8AqoDT5kAqRg+DU48XAGPsUJL2Rn6Bx3Lw==} - dev: false - - /multiformats@9.9.0: - resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} - dev: false - - /multihashes@4.0.3: - resolution: {integrity: sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA==} - engines: {node: '>=12.0.0', npm: '>=6.0.0'} - dependencies: - multibase: 4.0.6 - uint8arrays: 3.1.1 - varint: 5.0.2 - dev: false - - /murmurhash3js-revisited@3.0.0: - resolution: {integrity: sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==} - engines: {node: '>=8.0.0'} - dev: false - - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - - /nan@2.18.0: - resolution: {integrity: sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==} - dev: false - optional: true - - /nanoassert@2.0.0: - resolution: {integrity: sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==} - dev: false - - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - /napi-macros@2.2.2: - resolution: {integrity: sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==} - dev: false - - /node-fetch@2.6.7: - resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: false - - /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: false - - /node-gyp-build@4.7.1: - resolution: {integrity: sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg==} - hasBin: true - dev: false - - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - dev: true - - /nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true - dependencies: - abbrev: 1.1.1 - dev: false - optional: true - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - /normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - dev: true - - /normalize-wheel@1.0.1: - resolution: {integrity: sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==} - dev: false - - /npmlog@5.0.1: - resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} - dependencies: - are-we-there-yet: 2.0.0 - console-control-strings: 1.1.0 - gauge: 3.0.2 - set-blocking: 2.0.0 - dev: false - optional: true - - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - /object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - dev: false - optional: true - - /p-defer@4.0.0: - resolution: {integrity: sha512-Vb3QRvQ0Y5XnF40ZUWW7JfLogicVh/EnA5gBIvKDJoYpeI82+1E3AlB9yOcKFS0AhHrWVnAQO39fbR0G99IVEQ==} - engines: {node: '>=12'} - dev: false - - /p-queue@7.4.1: - resolution: {integrity: sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==} - engines: {node: '>=12'} - dependencies: - eventemitter3: 5.0.1 - p-timeout: 5.1.0 - dev: false - - /p-timeout@5.1.0: - resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} - engines: {node: '>=12'} - dev: false - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: false - optional: true - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - lru-cache: 10.1.0 - minipass: 7.0.4 - - /path2d-polyfill@2.0.1: - resolution: {integrity: sha512-ad/3bsalbbWhmBo0D6FZ4RNMwsLsPpL6gnvhuSaU5Vm7b06Kr5ubSltQQ0T7YKsiJQO+g22zJ4dJKNTXIyOXtA==} - engines: {node: '>=8'} - requiresBuild: true - dev: false - optional: true - - /pdfjs-dist@3.11.174: - resolution: {integrity: sha512-TdTZPf1trZ8/UFu5Cx/GXB7GZM30LT+wWUNfsi6Bq8ePLnb+woNKtDymI2mxZYBpMbonNFqKmiz684DIfnd8dA==} - engines: {node: '>=18'} - optionalDependencies: - canvas: 2.11.2 - path2d-polyfill: 2.0.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - - /pkarr@1.1.1: - resolution: {integrity: sha512-X27LKqf83X3WuJd2Z9qdfVxkmfOu6HUbY0pm11LqeBbFmgmZRPgOxJG8bKiIsmmD6Vjc25j45KHYflF2lfodyQ==} - hasBin: true - dependencies: - bencode: 3.1.1 - bittorrent-dht: 11.0.5 - chalk: 5.3.0 - dns-packet: 5.6.1 - graceful-goodbye: 1.3.0 - sodium-universal: 4.0.0 - z32: 1.0.1 - transitivePeerDependencies: - - supports-color - dev: false - - /postcss-import@15.1.0(postcss@8.4.32): - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} - peerDependencies: - postcss: ^8.0.0 - dependencies: - postcss: 8.4.32 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.8 - - /postcss-js@4.0.1(postcss@8.4.32): - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 - dependencies: - camelcase-css: 2.0.1 - postcss: 8.4.32 - - /postcss-load-config@4.0.2(postcss@8.4.32): - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} - engines: {node: '>= 14'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - dependencies: - lilconfig: 3.0.0 - postcss: 8.4.32 - yaml: 2.3.4 - - /postcss-nested@6.0.1(postcss@8.4.32): - resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - dependencies: - postcss: 8.4.32 - postcss-selector-parser: 6.0.15 - - /postcss-selector-parser@6.0.15: - resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} - engines: {node: '>=4'} - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - - /postcss@8.4.32: - resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.0.2 - - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - dev: false - - /progress-events@1.0.0: - resolution: {integrity: sha512-zIB6QDrSbPfRg+33FZalluFIowkbV5Xh1xSuetjG+rlC5he6u2dc6VQJ0TbMdlN3R1RHdpOqxEFMKTnQ+itUwA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - dev: false - - /prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - dev: false - - /protons-runtime@5.2.1: - resolution: {integrity: sha512-Rt4ORm1WR62ysrXX5sCV32a5jPwVoIpU90XUzrdAfMIOSNTizvqlx/7wedNpogvZjUUY/gLJp3VftpA+ebx/og==} - dependencies: - uint8arraylist: 2.4.8 - uint8arrays: 5.0.1 - dev: false - - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: false - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - /rabin-wasm@0.1.5: - resolution: {integrity: sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA==} - hasBin: true - dependencies: - '@assemblyscript/loader': 0.9.4 - bl: 5.1.0 - debug: 4.3.4 - minimist: 1.2.8 - node-fetch: 2.7.0 - readable-stream: 3.6.2 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - dependencies: - safe-buffer: 5.2.1 - dev: false - - /react-dom@18.2.0(react@18.2.0): - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} - peerDependencies: - react: ^18.2.0 - dependencies: - loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.23.0 - dev: false - - /react-dropzone@14.2.3(react@18.2.0): - resolution: {integrity: sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==} - engines: {node: '>= 10.13'} - peerDependencies: - react: '>= 16.8 || 18.0.0' - dependencies: - attr-accept: 2.2.2 - file-selector: 0.6.0 - prop-types: 15.8.1 - react: 18.2.0 - dev: false - - /react-easy-crop@5.0.4(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-JfzSk4cBHoksgAtgWUHR/jDYretebMxS0rpAlltP1LeELGMj4WTa420m4PsYFpgQXoJZV0DXmINUlBWAoAD/PQ==} - peerDependencies: - react: '>=16.4.0' - react-dom: '>=16.4.0' - dependencies: - normalize-wheel: 1.0.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - tslib: 2.0.1 - dev: false - - /react-hook-form@7.49.2(react@18.2.0): - resolution: {integrity: sha512-TZcnSc17+LPPVpMRIDNVITY6w20deMdNi6iehTFLV1x8SqThXGwu93HjlUVU09pzFgZH7qZOvLMM7UYf2ShAHA==} - engines: {node: '>=18', pnpm: '8'} - peerDependencies: - react: ^16.8.0 || ^17 || ^18 - dependencies: - react: 18.2.0 - dev: false - - /react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - dev: false - - /react-pdf@7.6.0(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-b2/8V6xhe5pn4Y01ELKTQZ+RhdZl1KpSAMGbN+HCZ/kwhYTIc4Pn5ctz1wRQUu1gOJbIEG4CcjMD9vTCzNdwjw==} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@types/react': 18.2.15 - clsx: 2.0.0 - make-cancellable-promise: 1.3.2 - make-event-props: 1.6.2 - merge-refs: 1.2.2(@types/react@18.2.15) - pdfjs-dist: 3.11.174 - prop-types: 15.8.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - tiny-invariant: 1.3.1 - tiny-warning: 1.0.3 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /react-refresh@0.14.0: - resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} - engines: {node: '>=0.10.0'} - dev: true - - /react-remove-scroll-bar@2.3.4(@types/react@18.2.15)(react@18.2.0): - resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@types/react': 18.2.15 - react: 18.2.0 - react-style-singleton: 2.2.1(@types/react@18.2.15)(react@18.2.0) - tslib: 2.6.2 - dev: false - - /react-remove-scroll@2.5.5(@types/react@18.2.15)(react@18.2.0): - resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@types/react': 18.2.15 - react: 18.2.0 - react-remove-scroll-bar: 2.3.4(@types/react@18.2.15)(react@18.2.0) - react-style-singleton: 2.2.1(@types/react@18.2.15)(react@18.2.0) - tslib: 2.6.2 - use-callback-ref: 1.3.1(@types/react@18.2.15)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.15)(react@18.2.0) - dev: false - - /react-router-dom@6.21.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-QCNrtjtDPwHDO+AO21MJd7yIcr41UetYt5jzaB9Y1UYaPTCnVuJq6S748g1dE11OQlCFIQg+RtAA1SEZIyiBeA==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' - dependencies: - '@remix-run/router': 1.14.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-router: 6.21.1(react@18.2.0) - dev: false - - /react-router@6.21.1(react@18.2.0): - resolution: {integrity: sha512-W0l13YlMTm1YrpVIOpjCADJqEUpz1vm+CMo47RuFX4Ftegwm6KOYsL5G3eiE52jnJpKvzm6uB/vTKTPKM8dmkA==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=16.8' - dependencies: - '@remix-run/router': 1.14.1 - react: 18.2.0 - dev: false - - /react-spinners@0.13.8(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-3e+k56lUkPj0vb5NDXPVFAOkPC//XyhKPJjvcGjyMNPWsBKpplfeyialP74G7H7+It7KzhtET+MvGqbKgAqpZA==} - peerDependencies: - react: ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 - dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /react-style-singleton@2.2.1(@types/react@18.2.15)(react@18.2.0): - resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@types/react': 18.2.15 - get-nonce: 1.0.1 - invariant: 2.2.4 - react: 18.2.0 - tslib: 2.6.2 - dev: false - - /react-virtualized-auto-sizer@1.0.20(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-OdIyHwj4S4wyhbKHOKM1wLSj/UDXm839Z3Cvfg2a9j+He6yDa6i5p0qQvEiCnyQlGO/HyfSnigQwuxvYalaAXA==} - peerDependencies: - react: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc - react-dom: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc - dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /react-window@1.8.10(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Y0Cx+dnU6NLa5/EvoHukUD0BklJ8qITCtVEPY1C/nL8wwoZ0b5aEw8Ff1dOVHw7fCzMt55XfJDd8S8W8LCaUCg==} - engines: {node: '>8.0.0'} - peerDependencies: - react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - dependencies: - '@babel/runtime': 7.23.7 - memoize-one: 5.2.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} - dependencies: - loose-envify: 1.4.0 - dev: false - - /read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - dependencies: - pify: 2.3.0 - - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: false - - /readable-stream@4.4.2: - resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - abort-controller: 3.0.0 - buffer: 6.0.3 - events: 3.3.0 - process: 0.11.10 - string_decoder: 1.3.0 - dev: false - - /readable-web-to-node-stream@3.0.2: - resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} - engines: {node: '>=8'} - dependencies: - readable-stream: 3.6.2 - dev: false - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - - /record-cache@1.2.0: - resolution: {integrity: sha512-kyy3HWCez2WrotaL3O4fTn0rsIdfRKOdQQcEJ9KpvmKmbffKVvwsloX063EgRUlpJIXHiDQFhJcTbZequ2uTZw==} - dependencies: - b4a: 1.6.4 - dev: false - - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - dev: false - - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - dev: false - - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: false - optional: true - - /rollup@3.29.4: - resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /run-parallel-limit@1.1.0: - resolution: {integrity: sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==} - dependencies: - queue-microtask: 1.2.3 - dev: false - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - - /run-series@1.1.9: - resolution: {integrity: sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==} - dev: false - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: false - - /safety-catch@1.0.2: - resolution: {integrity: sha512-C1UYVZ4dtbBxEtvOcpjBaaD27nP8MlvyAQEp2fOTOEe6pfUpk1cDUxij6BR1jZup6rSyUTaBBplK7LanskrULA==} - dev: false - - /scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} - dependencies: - loose-envify: 1.4.0 - dev: false - - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: false - optional: true - - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: false - optional: true - - /sha256-universal@1.2.1: - resolution: {integrity: sha512-ghn3muhdn1ailCQqqceNxRgkOeZSVfSE13RQWEg6njB+itsFzGVSJv+O//2hvNXZuxVIRyNzrgsZ37SPDdGJJw==} - dependencies: - b4a: 1.6.4 - sha256-wasm: 2.2.2 - dev: false - - /sha256-wasm@2.2.2: - resolution: {integrity: sha512-qKSGARvao+JQlFiA+sjJZhJ/61gmW/3aNLblB2rsgIxDlDxsJPHo8a1seXj12oKtuHVgJSJJ7QEGBUYQN741lQ==} - dependencies: - b4a: 1.6.4 - nanoassert: 2.0.0 - dev: false - - /sha512-universal@1.2.1: - resolution: {integrity: sha512-kehYuigMoRkIngCv7rhgruLJNNHDnitGTBdkcYbCbooL8Cidj/bS78MDxByIjcc69M915WxcQTgZetZ1JbeQTQ==} - dependencies: - b4a: 1.6.4 - sha512-wasm: 2.3.4 - dev: false - - /sha512-wasm@2.3.4: - resolution: {integrity: sha512-akWoxJPGCB3aZCrZ+fm6VIFhJ/p8idBv7AWGFng/CZIrQo51oQNsvDbTSRXWAzIiZJvpy16oIDiCCPqTe21sKg==} - dependencies: - b4a: 1.6.4 - nanoassert: 2.0.0 - dev: false - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: false - optional: true - - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - /simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - dev: false - optional: true - - /simple-get@3.1.1: - resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} - dependencies: - decompress-response: 4.2.1 - once: 1.4.0 - simple-concat: 1.0.1 - dev: false - optional: true - - /siphash24@1.3.1: - resolution: {integrity: sha512-moemC3ZKiTzH29nbFo3Iw8fbemWWod4vNs/WgKbQ54oEs6mE6XVlguxvinYjB+UmaE0PThgyED9fUkWvirT8hA==} - dependencies: - nanoassert: 2.0.0 - dev: false - - /sodium-javascript@0.8.0: - resolution: {integrity: sha512-rEBzR5mPxPES+UjyMDvKPIXy9ImF17KOJ32nJNi9uIquWpS/nfj+h6m05J5yLJaGXjgM72LmQoUbWZVxh/rmGg==} - dependencies: - blake2b: 2.1.4 - chacha20-universal: 1.0.4 - nanoassert: 2.0.0 - sha256-universal: 1.2.1 - sha512-universal: 1.2.1 - siphash24: 1.3.1 - xsalsa20: 1.2.0 - dev: false - - /sodium-native@4.0.4: - resolution: {integrity: sha512-faqOKw4WQKK7r/ybn6Lqo1F9+L5T6NlBJJYvpxbZPetpWylUVqz449mvlwIBKBqxEHbWakWuOlUt8J3Qpc4sWw==} - requiresBuild: true - dependencies: - node-gyp-build: 4.7.1 - dev: false - - /sodium-universal@4.0.0: - resolution: {integrity: sha512-iKHl8XnBV96k1c75gwwzANFdephw/MDWSjQAjPmBE+du0y3P23Q8uf7AcdcfFsYAMwLg7WVBfSAIBtV/JvRsjA==} - dependencies: - blake2b: 2.1.4 - chacha20-universal: 1.0.4 - nanoassert: 2.0.0 - sha256-universal: 1.2.1 - sha512-universal: 1.2.1 - siphash24: 1.3.1 - sodium-javascript: 0.8.0 - sodium-native: 4.0.4 - xsalsa20: 1.2.0 - dev: false - - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - - /sparse-array@1.3.2: - resolution: {integrity: sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg==} - dev: false - - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: false - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - dependencies: - ansi-regex: 6.0.1 - - /sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - commander: 4.1.1 - glob: 10.3.10 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.6 - ts-interface-checker: 0.1.13 - - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - dev: true - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - /tailwind-merge@2.1.0: - resolution: {integrity: sha512-l11VvI4nSwW7MtLSLYT4ldidDEUwQAMWuSHk7l4zcXZDgnCRa0V3OdCwFfM7DCzakVXMNRwAeje9maFFXT71dQ==} - dependencies: - '@babel/runtime': 7.23.7 - dev: false - - /tailwindcss-animate@1.0.7(tailwindcss@3.4.0): - resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} - peerDependencies: - tailwindcss: '>=3.0.0 || insiders' - dependencies: - tailwindcss: 3.4.0 - dev: false - - /tailwindcss@3.4.0: - resolution: {integrity: sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA==} - engines: {node: '>=14.0.0'} - hasBin: true - dependencies: - '@alloc/quick-lru': 5.2.0 - arg: 5.0.2 - chokidar: 3.5.3 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.3.2 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.21.0 - lilconfig: 2.1.0 - micromatch: 4.0.5 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.0.0 - postcss: 8.4.32 - postcss-import: 15.1.0(postcss@8.4.32) - postcss-js: 4.0.1(postcss@8.4.32) - postcss-load-config: 4.0.2(postcss@8.4.32) - postcss-nested: 6.0.1(postcss@8.4.32) - postcss-selector-parser: 6.0.15 - resolve: 1.22.8 - sucrase: 3.35.0 - transitivePeerDependencies: - - ts-node - - /tar@6.2.0: - resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} - engines: {node: '>=10'} - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - dev: false - optional: true - - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - dependencies: - thenify: 3.3.1 - - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - dependencies: - any-promise: 1.3.0 - - /tiny-invariant@1.3.1: - resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} - dev: false - - /tiny-warning@1.0.3: - resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} - dev: false - - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: true - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: false - - /ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - - /tslib@2.0.1: - resolution: {integrity: sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==} - dev: false - - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: false - - /typescript@5.0.2: - resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} - engines: {node: '>=12.20'} - hasBin: true - dev: true - - /uint8-util@2.2.4: - resolution: {integrity: sha512-uEI5lLozmKQPYEevfEhP9LY3Je5ZmrQhaWXrzTVqrLNQl36xsRh8NiAxYwB9J+2BAt99TRbmCkROQB2ZKhx4UA==} - dependencies: - base64-arraybuffer: 1.0.2 - dev: false - - /uint8arraylist@2.4.8: - resolution: {integrity: sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==} - dependencies: - uint8arrays: 5.0.1 - dev: false - - /uint8arrays@3.1.1: - resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==} - dependencies: - multiformats: 9.9.0 - dev: false - - /uint8arrays@4.0.10: - resolution: {integrity: sha512-AnJNUGGDJAgFw/eWu/Xb9zrVKEGlwJJCaeInlf3BkecE/zcTobk5YXYIPNQJO1q5Hh1QZrQQHf0JvcHqz2hqoA==} - dependencies: - multiformats: 12.1.3 - dev: false - - /uint8arrays@5.0.1: - resolution: {integrity: sha512-ND5RpJAnPgHmZT7hWD/2T4BwRp04j8NLKvMKC/7bhiEwEjUMkQ4kvBKiH6hOqbljd6qJ2xS8reL3vl1e33grOQ==} - dependencies: - multiformats: 13.0.0 - dev: false - - /ulidx@2.1.0: - resolution: {integrity: sha512-DlMi97oP9HASI3kLCjBlOhAG1SoisUrEqC2PJ7itiFbq9q5Zo0JejupXeu2Gke99W62epNzA4MFNToNiq8A5LA==} - engines: {node: '>=16'} - dependencies: - layerr: 2.0.1 - dev: false - - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - dev: true - - /update-browserslist-db@1.0.13(browserslist@4.22.2): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.22.2 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.1 - dev: false - - /use-callback-ref@1.3.1(@types/react@18.2.15)(react@18.2.0): - resolution: {integrity: sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@types/react': 18.2.15 - react: 18.2.0 - tslib: 2.6.2 - dev: false - - /use-sidecar@1.1.2(@types/react@18.2.15)(react@18.2.0): - resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@types/react': 18.2.15 - detect-node-es: 1.1.0 - react: 18.2.0 - tslib: 2.6.2 - dev: false - - /use-sync-external-store@1.2.0(react@18.2.0): - resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - react: 18.2.0 - dev: false - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - dev: false - - /varint@5.0.2: - resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==} - dev: false - - /varint@6.0.0: - resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} - dev: false - - /vite@4.4.4(@types/node@20.10.5): - resolution: {integrity: sha512-4mvsTxjkveWrKDJI70QmelfVqTm+ihFAb6+xf4sjEU2TmUCTlVX87tmg/QooPEMQb/lM9qGHT99ebqPziEd3wg==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 20.10.5 - esbuild: 0.18.20 - postcss: 8.4.32 - rollup: 3.29.4 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: false - - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - dev: false - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - - /wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - dependencies: - string-width: 4.2.3 - dev: false - optional: true - - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: false - optional: true - - /xsalsa20@1.2.0: - resolution: {integrity: sha512-FIr/DEeoHfj7ftfylnoFt3rAIRoWXpx2AoDfrT2qD2wtp7Dp+COajvs/Icb7uHqRW9m60f5iXZwdsJJO3kvb7w==} - dev: false - - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: false - optional: true - - /yaml@2.3.4: - resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} - engines: {node: '>= 14'} - - /z32@1.0.1: - resolution: {integrity: sha512-Uytfqf6VEVchHKZDw0NRdCViOARHP84uzvOw0CXCMLOwhgHZUL9XibpEPLLQN10mCVLxOlGCQWbkV7km7yNYcw==} - dependencies: - b4a: 1.6.4 - dev: false - - /zod@3.22.4: - resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - dev: false - - /zustand@4.4.7(@types/react@18.2.15)(react@18.2.0): - resolution: {integrity: sha512-QFJWJMdlETcI69paJwhSMJz7PPWjVP8Sjhclxmxmxv/RYI7ZOvR5BHX+ktH0we9gTWQMxcne8q1OY8xxz604gw==} - engines: {node: '>=12.7.0'} - peerDependencies: - '@types/react': '>=16.8' - immer: '>=9.0' - react: '>=16.8' - peerDependenciesMeta: - '@types/react': - optional: true - immer: - optional: true - react: - optional: true - dependencies: - '@types/react': 18.2.15 - react: 18.2.0 - use-sync-external-store: 1.2.0(react@18.2.0) - dev: false From 46ff71112a930054578e3261cceb7cb3e66849b7 Mon Sep 17 00:00:00 2001 From: coder12git Date: Thu, 4 Jan 2024 11:17:48 +0530 Subject: [PATCH 016/136] make nearbyDoctor page to track location based on user input Signed-off-by: coder12git --- tauri-app/src/pages/nearbyDoctor.tsx | 110 +++++++++++++++++---------- 1 file changed, 71 insertions(+), 39 deletions(-) diff --git a/tauri-app/src/pages/nearbyDoctor.tsx b/tauri-app/src/pages/nearbyDoctor.tsx index 26d1a61..8ee6b72 100644 --- a/tauri-app/src/pages/nearbyDoctor.tsx +++ b/tauri-app/src/pages/nearbyDoctor.tsx @@ -1,18 +1,17 @@ import { FunctionComponent, useEffect, useRef, useState } from "react"; import useWeb5Store from "@/stores/useWeb5Store"; -// import { fetch, ResponseType } from '@tauri-apps/api/http'; -// import axios from 'axios' const accessToken = "AIzaSyCfqty5e_JIBd-2RrdbB0W5ykv3D4noYNg" const Doctors: FunctionComponent = () => { - const { web5 } = useWeb5Store((state) => ({ web5: state.web5!, connect: state.connect })); - const [places, setPlaces] = useState([]); - const [lat, setlat] = useState(); - const [long, setlong] = useState(); + const { web5 } = useWeb5Store((state) => ({ web5: state.web5!, connect: state.connect })); + const [places, setPlaces] = useState([]); + const [lat, setlat] = useState(); + const [long, setlong] = useState(); - if(navigator.geolocation){ - navigator.geolocation.getCurrentPosition((position)=>{ + const findHospitals = () => { + if (navigator.geolocation) { + navigator.geolocation.getCurrentPosition((position) => { const lat = position.coords.latitude const long = position.coords.longitude setlat(lat); @@ -22,39 +21,72 @@ const Doctors: FunctionComponent = () => { console.log('Geolocation is not supported') } - useEffect(()=>{ - const fetchData = async()=>{ - try { - const response = await fetch( - `https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=${lat}%2C${long}&radius=1500&keyword=hospital&key=${accessToken}` - ); - - if (!response.ok) { - throw new Error('Network response was not ok'); - } - - const result = await response.json(); - console.log(result.results) - setPlaces(result.results); - } catch (error) { - console.error('Error fetching data:', error); - } - }; - if (web5) { - fetchData() - } - },[web5]) + const fetchData = async () => { + try { + const response = await fetch( + `https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=${lat}%2C${long}&radius=1500&keyword=hospital&key=${accessToken}` + ); + + if (!response.ok) { + throw new Error('Network response was not ok'); + } + + const result = await response.json(); + console.log(result.results) + setPlaces(result.results); + } catch (error) { + console.error('Error fetching data:', error); + } + }; + if (web5) { + fetchData() + } + } + // if(navigator.geolocation){ + // navigator.geolocation.getCurrentPosition((position)=>{ + // const lat = position.coords.latitude + // const long = position.coords.longitude + // setlat(lat); + // setlong(long); + // }) + // } else { + // console.log('Geolocation is not supported') + // } + + // useEffect(()=>{ + // const fetchData = async()=>{ + // try { + // const response = await fetch( + // `https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=${lat}%2C${long}&radius=1500&keyword=hospital&key=${accessToken}` + // ); + + // if (!response.ok) { + // throw new Error('Network response was not ok'); + // } + + // const result = await response.json(); + // console.log(result.results) + // setPlaces(result.results); + // } catch (error) { + // console.error('Error fetching data:', error); + // } + // }; + // if (web5) { + // fetchData() + // } + // },[web5]) return (
    - {places?.map((place)=>( -
    -
      -
    • Name: {place.name}
    • -
    • Address: {place.vicinity}
    • -
    • Rating: {place.rating}
    • -
    -
    - ))} + + {places?.map((place) => ( +
    +
      +
    • Name: {place.name}
    • +
    • Address: {place.vicinity}
    • +
    • Rating: {place.rating}
    • +
    +
    + ))}
    ) } From 78c8d976bdcd5f4136332d18d7eec20c44f3309c Mon Sep 17 00:00:00 2001 From: Adophilus Date: Thu, 4 Jan 2024 08:32:10 +0000 Subject: [PATCH 017/136] inpmenented some bits of the connect page --- tauri-app/src/pages/connect.tsx | 64 +++++++++++++++++-- tauri-app/src/pages/medic.tsx | 23 +++++-- tauri-app/src/stores/useDocuments.ts | 61 +++++++++++++++++- tauri-app/src/stores/useWeb5Store.ts | 7 +- .../src/utils/protocols/medical-conditions.ts | 30 +++++++++ 5 files changed, 171 insertions(+), 14 deletions(-) create mode 100644 tauri-app/src/utils/protocols/medical-conditions.ts diff --git a/tauri-app/src/pages/connect.tsx b/tauri-app/src/pages/connect.tsx index 650cec8..e6f9ec4 100644 --- a/tauri-app/src/pages/connect.tsx +++ b/tauri-app/src/pages/connect.tsx @@ -1,9 +1,65 @@ -// import React from "react"; +import useWeb5Store, { schemaOrgProtocolDefinition } from "@/stores/useWeb5Store"; +import { useDocuments } from "@/stores/useDocuments"; +import { useEffect, useState } from "react"; + +function Connect() { + const { web5, did } = useWeb5Store((state) => ({ web5: state.web5!, did: state.did! })) + const { fetchDocumentsWithCondition } = useDocuments(web5, did) + const [similarConditions, setSimilarConditions] = useState<{ did: string, condition: string }[]>([]) + const [form, setForm] = useState<{ + condition: string + }>({ + condition: "" + }) + + useEffect(() => { + fetchDocumentsWithCondition("cancer") + }, []) + + const connectCondition = async () => { + const res = await fetchDocumentsWithCondition(form.condition) + console.log(res) + if (res) + setSimilarConditions(res) + } + -function Connect (){ return ( -
    + <> +
    +
    { + e.preventDefault() + connectCondition() + }}> + { + setForm({ ...form, condition: e.target.value }) + }} + placeholder="Condition" /> + +
    +
    +
    +
    + People with similar conditions: +
    +
    + {similarConditions.map((condition, index) => ( +
    +
    + {condition.did} +
    +
    + {condition.condition} +
    +
    + ))} +
    +
    + ) } -export default Connect; \ No newline at end of file +export default Connect; diff --git a/tauri-app/src/pages/medic.tsx b/tauri-app/src/pages/medic.tsx index 58fa9b5..40ed80e 100644 --- a/tauri-app/src/pages/medic.tsx +++ b/tauri-app/src/pages/medic.tsx @@ -3,8 +3,8 @@ import useWeb5Store, { schemaOrgProtocolDefinition } from "@/stores/useWeb5Store import { useDocuments } from "@/stores/useDocuments"; const MedicPage: FunctionComponent = () => { - const { web5, connect } = useWeb5Store((state) => ({ web5: state.web5!, connect: state.connect })); - const { fetchDocuments, documents, createDocument, getDocumentFile } = useDocuments(web5) + const { web5, did } = useWeb5Store((state) => ({ web5: state.web5!, did: state.did! })) + const { fetchDocuments, documents, createDocument, getDocumentFile } = useDocuments(web5, did) const [docsWithImageUrls, setDocsWithImageUrls] = useState<{ document: typeof documents[0], url: string @@ -12,10 +12,12 @@ const MedicPage: FunctionComponent = () => { const [form, setForm] = useState<{ name: string - doc: File + doc: File, + condition: string }>({ name: "", - doc: new File([], "") + doc: new File([], ""), + condition: "" }) useEffect(() => { @@ -47,7 +49,7 @@ const MedicPage: FunctionComponent = () => { }, [documents]) const saveMedicalRecord = async () => { - const res = await createDocument({ name: form.name ? form.name : undefined, file: form.doc }) + const res = await createDocument({ name: form.name ? form.name : undefined, file: form.doc, condition: form.condition }) // console.log(res) if (res) { @@ -90,6 +92,17 @@ const MedicPage: FunctionComponent = () => { }} placeholder="Document" />
    +
    + { + setForm({ + ...form, + condition: e.target.value.toLowerCase() + }) + }} + placeholder="Condition" /> +
    diff --git a/tauri-app/src/stores/useDocuments.ts b/tauri-app/src/stores/useDocuments.ts index 9227b2d..599cdd4 100644 --- a/tauri-app/src/stores/useDocuments.ts +++ b/tauri-app/src/stores/useDocuments.ts @@ -1,6 +1,7 @@ import { Web5, Record as Web5Record } from '@web5/api'; import { useState, useEffect } from 'react'; import { schemaOrgProtocolDefinition } from './useWeb5Store'; +import MedicalConditionsProtocol, { did as MedicalConditionsProtocolDID } from '@/utils/protocols/medical-conditions'; import _ from "lodash" export type DigitalDocument = { @@ -24,7 +25,7 @@ type Document = { data: DigitalDocument } -export function useDocuments(web5: Web5) { +export function useDocuments(web5: Web5, did: string) { const [documents, setDocuments] = useState([]); async function fetchDocuments() { @@ -51,6 +52,40 @@ export function useDocuments(web5: Web5) { setDocuments(docs); } + async function fetchDocumentsWithCondition(condition: string) { + + const res = await web5.dwn.records.query({ + from: MedicalConditionsProtocolDID, + message: { + filter: { + protocolPath: 'medicalCondition', + schema: MedicalConditionsProtocol.types.medicalCondition.schema, + }, + }, + }); + console.log(res) + console.log(res.records) + + return [] + const { records } = await web5.dwn.records.query({ + from: MedicalConditionsProtocolDID, + message: { + filter: { + protocolPath: 'medicalCondition', + schema: MedicalConditionsProtocol.types.medicalCondition.schema, + }, + dateSort: "createdAscending", + }, + }); + if (!records) return false + + const fetchedRecords = await Promise.allSettled(records.map(record => record.data.json())) + .then(results => results + .filter(result => result.status === 'fulfilled') + .map(result => result.value)) + return fetchedRecords + } + async function createDocument({ name, file, condition }: { name: string | undefined, file: File, condition: string }): Promise { const { record: uploadedFileResponse } = await web5.dwn.records.create({ data: new Blob([file], { type: file.type }), @@ -83,6 +118,28 @@ export function useDocuments(web5: Web5) { if (!record) return false; + const { record: medicalConditionRecord, status } = await web5.dwn.records.create({ + data: { + condition, + did + }, + message: { + protocol: MedicalConditionsProtocol.protocol, + protocolPath: 'medicalCondition', + schema: MedicalConditionsProtocol.types.medicalCondition.schema, + dataFormat: MedicalConditionsProtocol.types.medicalCondition.dataFormats[0], + } + }) + + console.log(status) + console.log(medicalConditionRecord) + if (!medicalConditionRecord) return false + + await medicalConditionRecord.send(MedicalConditionsProtocolDID) + console.log('sent to pulsepal dwn') + await medicalConditionRecord.send(did) + console.log('sent to user dwn') + const data = await record.data.json(); const doc = { record, data, id: record.id }; @@ -158,5 +215,5 @@ export function useDocuments(web5: Web5) { return file; } - return { documents, createDocument, updateDocument, deleteDocument, getDocumentFile, fetchDocuments }; + return { documents, createDocument, updateDocument, deleteDocument, getDocumentFile, fetchDocuments, fetchDocumentsWithCondition }; } diff --git a/tauri-app/src/stores/useWeb5Store.ts b/tauri-app/src/stores/useWeb5Store.ts index 637f0f3..0dcdf84 100644 --- a/tauri-app/src/stores/useWeb5Store.ts +++ b/tauri-app/src/stores/useWeb5Store.ts @@ -1,5 +1,6 @@ import { Web5 } from "@web5/api/browser"; import { create } from "zustand"; +import MedicalConditionsProtocol from "@/utils/protocols/medical-conditions"; interface Web5State { web5: Web5 | null; @@ -56,9 +57,9 @@ const useWeb5Store = create((set, get) => ({ return; } - // protocol already exists if (protocols.length > 0) { - // console.log("protocol already exists"); + console.log("protocol already exists:", await protocols[0]) + continue } // configure protocol on local DWN @@ -190,4 +191,4 @@ export const schemaOrgProtocolDefinition = { }, }; -const protocols = [schemaOrgProtocolDefinition]; +const protocols = [schemaOrgProtocolDefinition, MedicalConditionsProtocol]; diff --git a/tauri-app/src/utils/protocols/medical-conditions.ts b/tauri-app/src/utils/protocols/medical-conditions.ts new file mode 100644 index 0000000..6cb4ee9 --- /dev/null +++ b/tauri-app/src/utils/protocols/medical-conditions.ts @@ -0,0 +1,30 @@ +const MedicalConditionsProtocol = { + protocol: "https://pulsepal.com/medical-conditions", + published: true, + types: { + medicalCondition: { + schema: "https://pulsepal.com/medical-conditions/schemas/medical-condition.json", + dataFormats: [ + "application/json" + ] + } + }, + structure: { + medicalCondition: { + $actions: [ + { + who: "anyone", + can: "read" + }, + { + who: "anyone", + can: "write" + } + ] + } + } +} + +export const did = "did:ion:EiAx_twrw3f0yLOv3Pe6pk4gWG4miV9SVXiHe_Q4lMn8Ow:eyJkZWx0YSI6eyJwYXRjaGVzIjpbeyJhY3Rpb24iOiJyZXBsYWNlIiwiZG9jdW1lbnQiOnsicHVibGljS2V5cyI6W3siaWQiOiJkd24tc2lnIiwicHVibGljS2V5SndrIjp7ImNydiI6IkVkMjU1MTkiLCJrdHkiOiJPS1AiLCJ4IjoiV1M1QXFqeDA1V2Z0YWMwYUhYRnpGNV9wZjM2eTVPQ0N0Qy1tM1lCTFo4WSJ9LCJwdXJwb3NlcyI6WyJhdXRoZW50aWNhdGlvbiJdLCJ0eXBlIjoiSnNvbldlYktleTIwMjAifSx7ImlkIjoiZHduLWVuYyIsInB1YmxpY0tleUp3ayI6eyJjcnYiOiJzZWNwMjU2azEiLCJrdHkiOiJFQyIsIngiOiJpSnpYYkljR0FHdm1QMzd2Z2VfTjB1M3FadllmLWpteGdyM2RTaDUtOE5vIiwieSI6InBBc1BuQ1hLcXlXRWhiS1ZDWjFJejhrWkljVVRXQXBNS2NOS3VtQ3R4T2cifSwicHVycG9zZXMiOlsia2V5QWdyZWVtZW50Il0sInR5cGUiOiJKc29uV2ViS2V5MjAyMCJ9XSwic2VydmljZXMiOlt7ImlkIjoiZHduIiwic2VydmljZUVuZHBvaW50Ijp7ImVuY3J5cHRpb25LZXlzIjpbIiNkd24tZW5jIl0sIm5vZGVzIjpbImh0dHBzOi8vZHduLnRiZGRldi5vcmcvZHduNSIsImh0dHBzOi8vZHduLnRiZGRldi5vcmcvZHduMyJdLCJzaWduaW5nS2V5cyI6WyIjZHduLXNpZyJdfSwidHlwZSI6IkRlY2VudHJhbGl6ZWRXZWJOb2RlIn1dfX1dLCJ1cGRhdGVDb21taXRtZW50IjoiRWlBSVIyQWFjQXZFVi16ODgwWHl2eHB4bWMzWDJkbDdYVmcwRHdWTGtfTms0QSJ9LCJzdWZmaXhEYXRhIjp7ImRlbHRhSGFzaCI6IkVpRGlvWktVc3cyZ0gzU29Nb0V5T0duVE9NQkZURFhZZ1hFX3Z6am5RU0M5aUEiLCJyZWNvdmVyeUNvbW1pdG1lbnQiOiJFaUQzU0JIaEtXXzduUF9QamV1WDcybDRjcXVTMWVPVTBCUk1EcW1vdnFpVGxnIn19" + +export default MedicalConditionsProtocol From 78db4cd9035583a80cabfba8f7950704b03fd2b5 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Thu, 4 Jan 2024 08:54:25 +0000 Subject: [PATCH 018/136] removing some strict checks --- tauri-app/src/stores/useDocuments.ts | 35 ++++++++++++++-------------- tauri-app/src/stores/useRemedy.ts | 1 + tauri-app/src/stores/useWeb5Store.ts | 7 +++--- tauri-app/tsconfig.json | 4 ++-- 4 files changed, 25 insertions(+), 22 deletions(-) diff --git a/tauri-app/src/stores/useDocuments.ts b/tauri-app/src/stores/useDocuments.ts index 599cdd4..5a8ab1c 100644 --- a/tauri-app/src/stores/useDocuments.ts +++ b/tauri-app/src/stores/useDocuments.ts @@ -34,6 +34,7 @@ export function useDocuments(web5: Web5, did: string) { filter: { schema: "https://schema.org/DigitalDocument", }, + // @ts-ignore dateSort: "createdAscending", }, }); @@ -67,23 +68,23 @@ export function useDocuments(web5: Web5, did: string) { console.log(res.records) return [] - const { records } = await web5.dwn.records.query({ - from: MedicalConditionsProtocolDID, - message: { - filter: { - protocolPath: 'medicalCondition', - schema: MedicalConditionsProtocol.types.medicalCondition.schema, - }, - dateSort: "createdAscending", - }, - }); - if (!records) return false - - const fetchedRecords = await Promise.allSettled(records.map(record => record.data.json())) - .then(results => results - .filter(result => result.status === 'fulfilled') - .map(result => result.value)) - return fetchedRecords + // const { records } = await web5.dwn.records.query({ + // from: MedicalConditionsProtocolDID, + // message: { + // filter: { + // protocolPath: 'medicalCondition', + // schema: MedicalConditionsProtocol.types.medicalCondition.schema, + // }, + // dateSort: "createdAscending", + // }, + // }); + // if (!records) return false + // + // const fetchedRecords = await Promise.allSettled(records.map(record => record.data.json())) + // .then(results => results + // .filter(result => result.status === 'fulfilled') + // .map(result => result.value)) + // return fetchedRecords } async function createDocument({ name, file, condition }: { name: string | undefined, file: File, condition: string }): Promise { diff --git a/tauri-app/src/stores/useRemedy.ts b/tauri-app/src/stores/useRemedy.ts index 852cebd..3c4b4f5 100644 --- a/tauri-app/src/stores/useRemedy.ts +++ b/tauri-app/src/stores/useRemedy.ts @@ -35,6 +35,7 @@ export function useRemedies(web5: Web5) { filter: { schema: "https://schema.org/Collection", }, + // @ts-ignore dateSort: "createdAscending", }, }); diff --git a/tauri-app/src/stores/useWeb5Store.ts b/tauri-app/src/stores/useWeb5Store.ts index 0dcdf84..f7da3bd 100644 --- a/tauri-app/src/stores/useWeb5Store.ts +++ b/tauri-app/src/stores/useWeb5Store.ts @@ -21,10 +21,11 @@ const useWeb5Store = create((set, get) => ({ try { // Connect to Web5 const { web5, did } = await Web5.connect({ - techPreview: { - dwnEndpoints: [], - }, + // techPreview: { + // dwnEndpoints: [], + // }, // sync: "1000", + sync: "5s", }); // Set the Web5 instance and DID diff --git a/tauri-app/tsconfig.json b/tauri-app/tsconfig.json index 4a83aa7..22b1db8 100644 --- a/tauri-app/tsconfig.json +++ b/tauri-app/tsconfig.json @@ -16,8 +16,8 @@ /* Linting */ "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, + // "noUnusedLocals": true, + // "noUnusedParameters": true, "noFallthroughCasesInSwitch": true, "baseUrl": ".", From bf21238d725de95278b8858976cb08ebf85fe589 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Thu, 4 Jan 2024 11:42:12 +0000 Subject: [PATCH 019/136] added a bit more logs --- tauri-app/src/stores/useDocuments.ts | 62 ++++++++----------- tauri-app/src/stores/useWeb5Store.ts | 22 +++++-- .../{medical-conditions.ts => conditions.ts} | 12 ++-- 3 files changed, 47 insertions(+), 49 deletions(-) rename tauri-app/src/utils/protocols/{medical-conditions.ts => conditions.ts} (85%) diff --git a/tauri-app/src/stores/useDocuments.ts b/tauri-app/src/stores/useDocuments.ts index 5a8ab1c..3864381 100644 --- a/tauri-app/src/stores/useDocuments.ts +++ b/tauri-app/src/stores/useDocuments.ts @@ -1,7 +1,7 @@ import { Web5, Record as Web5Record } from '@web5/api'; import { useState, useEffect } from 'react'; import { schemaOrgProtocolDefinition } from './useWeb5Store'; -import MedicalConditionsProtocol, { did as MedicalConditionsProtocolDID } from '@/utils/protocols/medical-conditions'; +import ConditionsProtocol, { did as ConditionsProtocolDID } from '@/utils/protocols/conditions'; import _ from "lodash" export type DigitalDocument = { @@ -54,37 +54,24 @@ export function useDocuments(web5: Web5, did: string) { } async function fetchDocumentsWithCondition(condition: string) { - - const res = await web5.dwn.records.query({ - from: MedicalConditionsProtocolDID, + const { records } = await web5.dwn.records.query({ + from: ConditionsProtocolDID, message: { filter: { - protocolPath: 'medicalCondition', - schema: MedicalConditionsProtocol.types.medicalCondition.schema, + protocolPath: 'condition', + schema: ConditionsProtocol.types.condition.schema, }, + dateSort: "createdAscending", }, }); - console.log(res) - console.log(res.records) - - return [] - // const { records } = await web5.dwn.records.query({ - // from: MedicalConditionsProtocolDID, - // message: { - // filter: { - // protocolPath: 'medicalCondition', - // schema: MedicalConditionsProtocol.types.medicalCondition.schema, - // }, - // dateSort: "createdAscending", - // }, - // }); - // if (!records) return false - // - // const fetchedRecords = await Promise.allSettled(records.map(record => record.data.json())) - // .then(results => results - // .filter(result => result.status === 'fulfilled') - // .map(result => result.value)) - // return fetchedRecords + if (!records) return false + + const fetchedRecords = await Promise.allSettled(records.map(record => record.data.json())) + .then(results => results + .filter(result => result.status === 'fulfilled') + .map(result => result.value)) + + return fetchedRecords } async function createDocument({ name, file, condition }: { name: string | undefined, file: File, condition: string }): Promise { @@ -119,27 +106,28 @@ export function useDocuments(web5: Web5, did: string) { if (!record) return false; - const { record: medicalConditionRecord, status } = await web5.dwn.records.create({ + const { record: conditionRecord, status } = await web5.dwn.records.create({ data: { condition, did }, message: { - protocol: MedicalConditionsProtocol.protocol, - protocolPath: 'medicalCondition', - schema: MedicalConditionsProtocol.types.medicalCondition.schema, - dataFormat: MedicalConditionsProtocol.types.medicalCondition.dataFormats[0], + protocol: ConditionsProtocol.protocol, + protocolPath: 'condition', + schema: ConditionsProtocol.types.condition.schema, + dataFormat: ConditionsProtocol.types.condition.dataFormats[0], } }) console.log(status) - console.log(medicalConditionRecord) - if (!medicalConditionRecord) return false + console.log(conditionRecord) + if (!conditionRecord) return false - await medicalConditionRecord.send(MedicalConditionsProtocolDID) + await conditionRecord.send(ConditionsProtocolDID) console.log('sent to pulsepal dwn') - await medicalConditionRecord.send(did) - console.log('sent to user dwn') + + // await conditionRecord.send(did) + // console.log('sent to user dwn') const data = await record.data.json(); const doc = { record, data, id: record.id }; diff --git a/tauri-app/src/stores/useWeb5Store.ts b/tauri-app/src/stores/useWeb5Store.ts index f7da3bd..9f0a7a9 100644 --- a/tauri-app/src/stores/useWeb5Store.ts +++ b/tauri-app/src/stores/useWeb5Store.ts @@ -1,6 +1,6 @@ import { Web5 } from "@web5/api/browser"; import { create } from "zustand"; -import MedicalConditionsProtocol from "@/utils/protocols/medical-conditions"; +import ConditionsProtocol from "@/utils/protocols/conditions"; interface Web5State { web5: Web5 | null; @@ -27,6 +27,7 @@ const useWeb5Store = create((set, get) => ({ // sync: "1000", sync: "5s", }); + console.log("did:", did) // Set the Web5 instance and DID set({ web5, did }); @@ -59,20 +60,29 @@ const useWeb5Store = create((set, get) => ({ } if (protocols.length > 0) { - console.log("protocol already exists:", await protocols[0]) + console.log("protocol already exists:", p.protocol) continue } + console.log("Configuring protocol:", p.protocol) // configure protocol on local DWN - const { protocol } = await web5.dwn.protocols.configure({ + const { protocol, status: protocolConfigurationStatus } = await web5.dwn.protocols.configure({ message: { definition: p, }, }); - // console.log("configure protocol local status", configureStatus); + if (!protocol) { + console.log("Failed to configure protocol:", p.protocol) + console.log(protocolConfigurationStatus) + continue + } + + console.log("configured protocol:", protocol); // configure protocol on remote DWN, because sync may not have occured yet - await protocol!.send(did); + console.log("sending protocol to remote DWN...") + const protocolSendStatus = await protocol.send(did); + console.log("sent protocol to remote DWN:", protocolSendStatus); // console.log("configure protocol remote status", remoteConfigureStatus); } }, @@ -192,4 +202,4 @@ export const schemaOrgProtocolDefinition = { }, }; -const protocols = [schemaOrgProtocolDefinition, MedicalConditionsProtocol]; +const protocols = [schemaOrgProtocolDefinition, ConditionsProtocol]; diff --git a/tauri-app/src/utils/protocols/medical-conditions.ts b/tauri-app/src/utils/protocols/conditions.ts similarity index 85% rename from tauri-app/src/utils/protocols/medical-conditions.ts rename to tauri-app/src/utils/protocols/conditions.ts index 6cb4ee9..d1a41d4 100644 --- a/tauri-app/src/utils/protocols/medical-conditions.ts +++ b/tauri-app/src/utils/protocols/conditions.ts @@ -1,16 +1,16 @@ -const MedicalConditionsProtocol = { - protocol: "https://pulsepal.com/medical-conditions", +const ConditionsProtocol = { + protocol: "https://dschema.org/conditions", published: true, types: { - medicalCondition: { - schema: "https://pulsepal.com/medical-conditions/schemas/medical-condition.json", + condition: { + schema: "https://schema.org/conditions/schemas/condition.json", dataFormats: [ "application/json" ] } }, structure: { - medicalCondition: { + condition: { $actions: [ { who: "anyone", @@ -27,4 +27,4 @@ const MedicalConditionsProtocol = { export const did = "did:ion:EiAx_twrw3f0yLOv3Pe6pk4gWG4miV9SVXiHe_Q4lMn8Ow:eyJkZWx0YSI6eyJwYXRjaGVzIjpbeyJhY3Rpb24iOiJyZXBsYWNlIiwiZG9jdW1lbnQiOnsicHVibGljS2V5cyI6W3siaWQiOiJkd24tc2lnIiwicHVibGljS2V5SndrIjp7ImNydiI6IkVkMjU1MTkiLCJrdHkiOiJPS1AiLCJ4IjoiV1M1QXFqeDA1V2Z0YWMwYUhYRnpGNV9wZjM2eTVPQ0N0Qy1tM1lCTFo4WSJ9LCJwdXJwb3NlcyI6WyJhdXRoZW50aWNhdGlvbiJdLCJ0eXBlIjoiSnNvbldlYktleTIwMjAifSx7ImlkIjoiZHduLWVuYyIsInB1YmxpY0tleUp3ayI6eyJjcnYiOiJzZWNwMjU2azEiLCJrdHkiOiJFQyIsIngiOiJpSnpYYkljR0FHdm1QMzd2Z2VfTjB1M3FadllmLWpteGdyM2RTaDUtOE5vIiwieSI6InBBc1BuQ1hLcXlXRWhiS1ZDWjFJejhrWkljVVRXQXBNS2NOS3VtQ3R4T2cifSwicHVycG9zZXMiOlsia2V5QWdyZWVtZW50Il0sInR5cGUiOiJKc29uV2ViS2V5MjAyMCJ9XSwic2VydmljZXMiOlt7ImlkIjoiZHduIiwic2VydmljZUVuZHBvaW50Ijp7ImVuY3J5cHRpb25LZXlzIjpbIiNkd24tZW5jIl0sIm5vZGVzIjpbImh0dHBzOi8vZHduLnRiZGRldi5vcmcvZHduNSIsImh0dHBzOi8vZHduLnRiZGRldi5vcmcvZHduMyJdLCJzaWduaW5nS2V5cyI6WyIjZHduLXNpZyJdfSwidHlwZSI6IkRlY2VudHJhbGl6ZWRXZWJOb2RlIn1dfX1dLCJ1cGRhdGVDb21taXRtZW50IjoiRWlBSVIyQWFjQXZFVi16ODgwWHl2eHB4bWMzWDJkbDdYVmcwRHdWTGtfTms0QSJ9LCJzdWZmaXhEYXRhIjp7ImRlbHRhSGFzaCI6IkVpRGlvWktVc3cyZ0gzU29Nb0V5T0duVE9NQkZURFhZZ1hFX3Z6am5RU0M5aUEiLCJyZWNvdmVyeUNvbW1pdG1lbnQiOiJFaUQzU0JIaEtXXzduUF9QamV1WDcybDRjcXVTMWVPVTBCUk1EcW1vdnFpVGxnIn19" -export default MedicalConditionsProtocol +export default ConditionsProtocol From 7045a72a826a515252cc56cbaf4a0608df9410ec Mon Sep 17 00:00:00 2001 From: Adophilus Date: Thu, 4 Jan 2024 12:08:27 +0000 Subject: [PATCH 020/136] set some dummy conditions --- tauri-app/src/pages/medic.tsx | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/tauri-app/src/pages/medic.tsx b/tauri-app/src/pages/medic.tsx index 40ed80e..0d8e9e2 100644 --- a/tauri-app/src/pages/medic.tsx +++ b/tauri-app/src/pages/medic.tsx @@ -2,6 +2,15 @@ import { FunctionComponent, useEffect, useRef, useState } from "react"; import useWeb5Store, { schemaOrgProtocolDefinition } from "@/stores/useWeb5Store"; import { useDocuments } from "@/stores/useDocuments"; +const possibleConditions = [ + "Cancer", + "Diabetes", + "Heart Disease", + "High Blood Pressure", + "High Cholesterol", + "Mental Illness", +] + const MedicPage: FunctionComponent = () => { const { web5, did } = useWeb5Store((state) => ({ web5: state.web5!, did: state.did! })) const { fetchDocuments, documents, createDocument, getDocumentFile } = useDocuments(web5, did) @@ -51,7 +60,6 @@ const MedicPage: FunctionComponent = () => { const saveMedicalRecord = async () => { const res = await createDocument({ name: form.name ? form.name : undefined, file: form.doc, condition: form.condition }) - // console.log(res) if (res) { alert(`Medical record saved: ${res}`) } @@ -93,15 +101,18 @@ const MedicPage: FunctionComponent = () => { placeholder="Document" />
    - { setForm({ ...form, - condition: e.target.value.toLowerCase() + condition: e.target.value }) - }} - placeholder="Condition" /> + }}> + {possibleConditions.map((condition) => ( + + ))} +
    +

    + *ensure inputted information are correct as once saved it cannot be + deleted/edited +

    + + + ); +}; + +export default index; diff --git a/tauri-app/src/components/MobileNavbar/index.tsx b/tauri-app/src/components/MobileNavbar/index.tsx index 5fd1e7a..8fd49dd 100644 --- a/tauri-app/src/components/MobileNavbar/index.tsx +++ b/tauri-app/src/components/MobileNavbar/index.tsx @@ -17,11 +17,13 @@ const index = () => { 35 -
    - - 28 -

    Chats

    -
    + +
    + + 28 +

    Chats

    +
    +
    diff --git a/tauri-app/src/components/Navbar/index.tsx b/tauri-app/src/components/Navbar/index.tsx index e7b716a..306f248 100644 --- a/tauri-app/src/components/Navbar/index.tsx +++ b/tauri-app/src/components/Navbar/index.tsx @@ -22,11 +22,13 @@ const index = () => { 28
    -
    - -

    Chats

    - 5 -
    + +
    + +

    Chats

    + 5 +
    +
    diff --git a/tauri-app/src/index.css b/tauri-app/src/index.css index de785d5..0b0b566 100644 --- a/tauri-app/src/index.css +++ b/tauri-app/src/index.css @@ -6,7 +6,7 @@ --color-blue: #0ea5e9; --box-shadow-blue: 0 5px 12px rgba(14, 165, 233, 0.3); --box-shadow-black: 0 3px 12px rgba(0, 0, 0, 0.2); - + --color-slate-accent: #f1f5f9; --color-white: #fff; --color-black: #000; --color-slate: #e2e8f0; diff --git a/tauri-app/src/pages/Chat/FindFriends/index.css b/tauri-app/src/pages/Chat/FindFriends/index.css new file mode 100644 index 0000000..e69de29 diff --git a/tauri-app/src/pages/Chat/FindFriends/index.tsx b/tauri-app/src/pages/Chat/FindFriends/index.tsx new file mode 100644 index 0000000..e69de29 diff --git a/tauri-app/src/pages/Chat/index.css b/tauri-app/src/pages/Chat/index.css new file mode 100644 index 0000000..e69de29 diff --git a/tauri-app/src/pages/Chat/index.tsx b/tauri-app/src/pages/Chat/index.tsx new file mode 100644 index 0000000..7a3fff2 --- /dev/null +++ b/tauri-app/src/pages/Chat/index.tsx @@ -0,0 +1,12 @@ +import "./index.css"; +import { FC } from "react"; + +const index: FC = () => { + return ( +
    +

    Chat Page

    +
    + ); +}; + +export default index; diff --git a/tauri-app/src/pages/Records/index.tsx b/tauri-app/src/pages/Records/index.tsx index b2e39a2..9a61790 100644 --- a/tauri-app/src/pages/Records/index.tsx +++ b/tauri-app/src/pages/Records/index.tsx @@ -64,7 +64,6 @@ const index = () => {

    Records

    -
    { const [remedies, setRemedies] = useState([ { @@ -52,7 +54,6 @@ const index = () => { const [isRated, setIsRated] = useState(false); const Rate = () => { - console.log(activeRemedy); if (!isRated) { setActiveRemedy({ ...activeRemedy, @@ -65,12 +66,24 @@ const index = () => { }); } setIsRated(!isRated); - console.log(activeRemedy); }; + const [isAddRemedyActive, setIsAddRemedyActive] = useState(false); + return (
    -

    Get a quick fix!

    +
    +

    Get a quick Fix!

    +
    setIsAddRemedyActive(!isAddRemedyActive)} + > + +
    +
    +
    {remedies.map((remedy) => { return ( @@ -142,6 +155,15 @@ const index = () => {
    )} + + {isAddRemedyActive && ( +
    + +
    + )}
    ); }; From 0738b6ca886d618801c684d4f28be42ab2f32e1c Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Fri, 5 Jan 2024 00:18:09 +0100 Subject: [PATCH 027/136] contact page added --- tauri-app/src/App.tsx | 2 + tauri-app/src/pages/Chat/index.tsx | 3 +- tauri-app/src/pages/Contact/index.css | 83 ++++++++++++++++++++++++++ tauri-app/src/pages/Contact/index.tsx | 79 ++++++++++++++++++++++++ tauri-app/src/pages/Remedies/index.css | 2 +- 5 files changed, 166 insertions(+), 3 deletions(-) create mode 100644 tauri-app/src/pages/Contact/index.css create mode 100644 tauri-app/src/pages/Contact/index.tsx diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index 07c359f..043b4b3 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -11,6 +11,7 @@ import SharedLayout from "./pages/SharedLayout/"; import Records from "./pages/Records"; import Remedies from "./pages/Remedies"; import Chat from "./pages/Chat/"; +import Contact from "./pages/Contact/"; const router = createHashRouter([ { @@ -25,6 +26,7 @@ const router = createHashRouter([ { path: "/medic", element: }, { path: "/nearbyDoctors", element: }, { path: "/chat", element: }, + { path: "/contact", element: }, ], }, ]); diff --git a/tauri-app/src/pages/Chat/index.tsx b/tauri-app/src/pages/Chat/index.tsx index 7a3fff2..ab8d90e 100644 --- a/tauri-app/src/pages/Chat/index.tsx +++ b/tauri-app/src/pages/Chat/index.tsx @@ -1,7 +1,6 @@ import "./index.css"; -import { FC } from "react"; -const index: FC = () => { +const index= () => { return (

    Chat Page

    diff --git a/tauri-app/src/pages/Contact/index.css b/tauri-app/src/pages/Contact/index.css new file mode 100644 index 0000000..32b3cf2 --- /dev/null +++ b/tauri-app/src/pages/Contact/index.css @@ -0,0 +1,83 @@ +.row-container { + display: flex; + justify-content: space-between; + align-items: center; + width: 70%; + + box-shadow: var(--box-shadow-black); + border-radius: 8px; + margin: 20px auto; + font-family: "Open Sans"; +} + +.row-container div { + padding: 10px 14px; + width: 100px; + border-radius: 15px; + margin: 10px; + text-align: center; +} + +.row-container div:nth-child(2) { + background: var(--color-green); + color: var(--color-white); + box-shadow: var(--box-shadow-green); +} + +.row-container div:nth-child(4) { + background: var(--color-red); + color: var(--color-white); + box-shadow: var(--box-shadow-red); +} + +.locate-container { + padding: var(--padding-desktop); +} + +.header { + display: flex; + justify-content: space-between; + align-items: center; +} + +.header h1 { + font-family: "Pacifico"; + margin: auto 0; +} + +.header button { + width: 150px; + border-radius: 50px; + background: var(--color-blue); + color: var(--color-white); + border: none; + outline: none; + font-size: 28px; + font-family: "Pacifico"; + padding: 8px 20px; + box-shadow: var(--box-shadow-blue); +} + +@media (max-width: 750px) { + .locate-container { + padding: var(--padding-mobile); + } + + .header { + flex-direction: column; + justify-content: center; + } + + .header button { + margin-top: 20px; + } + + .row-container { + width: 100%; + flex-direction: column; + } + + .row-container div { + width: 80%; + } +} diff --git a/tauri-app/src/pages/Contact/index.tsx b/tauri-app/src/pages/Contact/index.tsx new file mode 100644 index 0000000..ca84645 --- /dev/null +++ b/tauri-app/src/pages/Contact/index.tsx @@ -0,0 +1,79 @@ +import "./index.css"; +import React, { FC, useState } from "react"; + +interface RowProp { + name: String; + address: String; + city: String; + distance: Number; +} + +const RowComponent: FC = ({ name, address, city, distance }) => { + return ( +
    +
    +

    {name}

    +
    +
    +

    {address}

    +
    +
    +

    {city}

    +
    +
    +

    {distance}

    +
    +
    + ); +}; + +const index: FC = () => { + const [fetchedLocations, setFetchedLocations] = useState([ + { + name: "Hopsital", + address: "No 4 Dress road", + city: "Kumkubaga", + distance: 47, + }, + { + name: "Hopsital", + address: "No 4 Dress road", + city: "Kumkubaga", + distance: 47, + }, + { + name: "Hopsital", + address: "No 4 Dress road", + city: "Kumkubaga", + distance: 47, + }, + ]); + return ( +
    +
    +

    Find Hospitals/Drs. Near You.

    + +
    +
    + + {fetchedLocations.map((location) => { + return ( + + ); + })} +
    +
    + ); +}; + +export default index; diff --git a/tauri-app/src/pages/Remedies/index.css b/tauri-app/src/pages/Remedies/index.css index 229b2ca..62df5a5 100644 --- a/tauri-app/src/pages/Remedies/index.css +++ b/tauri-app/src/pages/Remedies/index.css @@ -138,7 +138,7 @@ } .remedy-main-info-container { - height: 300px; + min-height: 300px; overflow-y: scroll; padding: 5px; border-radius: 5px; From 606f81b25bcd17a8076c0c39f9947c672985d324 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 02:30:22 +0000 Subject: [PATCH 028/136] added the server --- server/.gitignore | 146 +++++++++++++++++++++++++++++++++++++++ server/package.json | 18 +++++ server/server.ts | 9 +++ server/src/app.ts | 31 +++++++++ server/src/middleware.ts | 22 ++++++ server/src/utils.ts | 84 ++++++++++++++++++++++ server/tsconfig.json | 19 +++++ 7 files changed, 329 insertions(+) create mode 100644 server/.gitignore create mode 100644 server/package.json create mode 100644 server/server.ts create mode 100644 server/src/app.ts create mode 100644 server/src/middleware.ts create mode 100644 server/src/utils.ts create mode 100644 server/tsconfig.json diff --git a/server/.gitignore b/server/.gitignore new file mode 100644 index 0000000..5b81ddf --- /dev/null +++ b/server/.gitignore @@ -0,0 +1,146 @@ +# Created by https://www.toptal.com/developers/gitignore/api/node +# Edit at https://www.toptal.com/developers/gitignore?templates=node + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +### Node Patch ### +# Serverless Webpack directories +.webpack/ + +# Optional stylelint cache + +# SvelteKit build / generate output +.svelte-kit + +# End of https://www.toptal.com/developers/gitignore/api/node + +DATA/ diff --git a/server/package.json b/server/package.json new file mode 100644 index 0000000..ce20a8d --- /dev/null +++ b/server/package.json @@ -0,0 +1,18 @@ +{ + "scripts": { + "dev": "tsx --watch server.ts" + }, + "dependencies": { + "@hono/node-server": "^1.4.0", + "@hono/zod-validator": "^0.1.11", + "@web5/api": "^0.8.3", + "hono": "^3.12.0", + "true-myth": "5", + "tsconfig-paths": "^4.2.0", + "zod": "^3.22.4" + }, + "devDependencies": { + "tsx": "^4.7.0", + "typescript": "^5.3.3" + } +} diff --git a/server/server.ts b/server/server.ts new file mode 100644 index 0000000..f321b00 --- /dev/null +++ b/server/server.ts @@ -0,0 +1,9 @@ +import app from "./src/app"; +import { serve } from '@hono/node-server' + +serve({ + fetch: app.fetch, + port: process.env.PORT || 5000, +}, (addr) => { + console.log("Server running on port:", addr.port) +}) diff --git a/server/src/app.ts b/server/src/app.ts new file mode 100644 index 0000000..82f695f --- /dev/null +++ b/server/src/app.ts @@ -0,0 +1,31 @@ +import { Hono } from "hono"; +import { fetchConditions } from "./utils"; +import { agentMiddleware } from "./middleware"; +import { zValidator } from '@hono/zod-validator' +import { z } from 'zod' +import { logger } from "hono/logger" +import { cors } from 'hono/cors' + +const app = new Hono() + .basePath("/api") + .use("*", cors()) + .use("*", logger()) + .get("/conditions", + zValidator( + 'query', + z.object({ + condition: z.string() + })), + agentMiddleware, async (c) => { + const { condition } = c.req.valid("query") + const res = await fetchConditions(c.get("agent")) + if (res.isErr) + return c.json({ error: res.error }) + + const conditions = res.value.filter(record => record.condition === condition) + return c.json(conditions) + }) + +export type App = typeof app + +export default app diff --git a/server/src/middleware.ts b/server/src/middleware.ts new file mode 100644 index 0000000..e6503bc --- /dev/null +++ b/server/src/middleware.ts @@ -0,0 +1,22 @@ +import { type Agent, configureProtocol, setupAgent } from "./utils"; +import { MiddlewareHandler } from "hono" + +let agent: Agent + +export const agentMiddleware: MiddlewareHandler<{ + Variables: { + agent: Agent + } +}> = async (c, next) => { + if (!agent) + agent = await setupAgent() + + const connectionResult = await configureProtocol(agent) + if (connectionResult.isErr) { + console.log(connectionResult.error) + process.exit() + } + + c.set('agent', agent) + await next() +} diff --git a/server/src/utils.ts b/server/src/utils.ts new file mode 100644 index 0000000..6460426 --- /dev/null +++ b/server/src/utils.ts @@ -0,0 +1,84 @@ +import { Web5 } from "@web5/api"; +import ConditionsProtocol, { type Record, did as ConditionsProtocolDID } from "@frontend/utils/protocols/conditions" +import Result, { ok, err } from "true-myth/result" + +export type Agent = { + web5: Web5, + did: string +} + +export type Status = { + code: number, + detail: string, +} + +export async function configureProtocol(agent: Agent): Promise> { + const { protocols } = await agent.web5.dwn.protocols.query({ + message: { + filter: { + protocol: ConditionsProtocol.protocol, + } + } + }) + + if (protocols.length > 0) + return ok(undefined) + + const { protocol, status: localProtocolConfigurationStatus } = await agent.web5.dwn.protocols.configure({ + message: { + definition: ConditionsProtocol, + } + }); + + if (!protocol) + return err({ + type: "LOCAL_PROTOCOL_CONFIGURATION_FAILED", + status: localProtocolConfigurationStatus, + }) + + const { status: remoteProtocolConfigurationStatus } = await protocol.send(ConditionsProtocolDID) + + if (remoteProtocolConfigurationStatus.code !== 202) + return err({ + type: "REMOTE_PROTOCOL_CONFIGURATION_FAILED", + status: remoteProtocolConfigurationStatus, + }) + + return ok(undefined) +} + +export async function fetchConditions(agent: Agent): Promise> { + const { records, status } = await agent.web5.dwn.records.query({ + from: ConditionsProtocolDID, + message: { + filter: { + protocolPath: 'condition', + schema: ConditionsProtocol.types.condition.schema, + protocol: ConditionsProtocol.protocol, + }, + dateSort: "createdAscending", + } + }) + + if (!records) { + if (status.code !== 200) + return err(status) + + return ok([]) + } + + const conditions: Record.Condition[] = [] + for (const record of records) { + conditions.push(await record.data.json()) + } + + return ok(conditions) +} + +export async function setupAgent(): Promise { + const { web5, did } = await Web5.connect({ + sync: "5s", + }); + + return { web5, did } +} diff --git a/server/tsconfig.json b/server/tsconfig.json new file mode 100644 index 0000000..3cb9101 --- /dev/null +++ b/server/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "composite": true, + "noEmit": true + }, + "include": [ + "server.ts", + "./src/**/*.ts" + ], + "exclude": [ + "node_modules" + ], + "references": [ + { + "path": "../tsconfig.json" + } + ], + "extends": "../tsconfig.json" +} From 6e48466e369f6cf3b9d2db22ebfe971d269e2aed Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 02:31:23 +0000 Subject: [PATCH 029/136] updated the types to work with the backend --- .gitignore | 2 + tauri-app/package.json | 1 + tauri-app/src/pages/connect.tsx | 133 +++++++++++--------- tauri-app/src/pages/medic.tsx | 5 +- tauri-app/src/utils/protocols/conditions.ts | 7 ++ tauri-app/tsconfig.json | 29 +++-- tauri-app/vite.config.ts | 3 + tsconfig.json | 42 +++++++ 8 files changed, 154 insertions(+), 68 deletions(-) create mode 100644 .gitignore create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..649ac14 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +pnpm-lock.yaml +*.tsbuildinfo diff --git a/tauri-app/package.json b/tauri-app/package.json index 7b4e845..be51e78 100644 --- a/tauri-app/package.json +++ b/tauri-app/package.json @@ -21,6 +21,7 @@ "axios": "^1.6.3", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", + "hono": "^3.12.0", "lodash": "^4.17.21", "lucide-react": "^0.298.0", "react": "^18.2.0", diff --git a/tauri-app/src/pages/connect.tsx b/tauri-app/src/pages/connect.tsx index e6f9ec4..31b8dc9 100644 --- a/tauri-app/src/pages/connect.tsx +++ b/tauri-app/src/pages/connect.tsx @@ -1,65 +1,86 @@ -import useWeb5Store, { schemaOrgProtocolDefinition } from "@/stores/useWeb5Store"; -import { useDocuments } from "@/stores/useDocuments"; -import { useEffect, useState } from "react"; +import useWeb5Store from "@/stores/useWeb5Store"; +import { useState } from "react"; +import { hc } from "hono/client" +import { App } from "@backend/app" -function Connect() { - const { web5, did } = useWeb5Store((state) => ({ web5: state.web5!, did: state.did! })) - const { fetchDocumentsWithCondition } = useDocuments(web5, did) - const [similarConditions, setSimilarConditions] = useState<{ did: string, condition: string }[]>([]) - const [form, setForm] = useState<{ - condition: string - }>({ - condition: "" - }) +const backendClient = hc("/") + +const possibleConditions = [ + "Cancer", + "Diabetes", + "Heart Disease", + "High Blood Pressure", + "High Cholesterol", + "Mental Illness", +] - useEffect(() => { - fetchDocumentsWithCondition("cancer") - }, []) +function Connect() { + const [similarConditions, setSimilarConditions] = useState<{ did: string, condition: string }[]>([]) + const [form, setForm] = useState({ condition: "" }) - const connectCondition = async () => { - const res = await fetchDocumentsWithCondition(form.condition) - console.log(res) - if (res) - setSimilarConditions(res) - } + const fetchDocumentsWithCondition = async (condition: string) => { + const maybeConditions = await backendClient.api.conditions.$get({ + query: { + condition + } + }) + .then(res => res.json()) + if (!Array.isArray(maybeConditions)) + return [] + const conditions = maybeConditions + return conditions + } + const connectCondition = async () => { + const res = await fetchDocumentsWithCondition(form.condition) + setSimilarConditions(res) + } - return ( - <> -
    -
    { - e.preventDefault() - connectCondition() - }}> - { - setForm({ ...form, condition: e.target.value }) - }} - placeholder="Condition" /> - -
    -
    -
    -
    - People with similar conditions: -
    -
    - {similarConditions.map((condition, index) => ( -
    -
    - {condition.did} -
    -
    - {condition.condition} -
    -
    - ))} -
    + return ( + <> +
    +
    { + e.preventDefault() + connectCondition() + }}> +
    + +
    + +
    +
    +
    +
    + People with similar conditions: +
    +
    + {similarConditions.map((condition, index) => ( +
    +
    + {condition.did} +
    +
    + {condition.condition} +
    - - ) + ))} +
    +
    + + ) } export default Connect; diff --git a/tauri-app/src/pages/medic.tsx b/tauri-app/src/pages/medic.tsx index 0d8e9e2..9ae13ff 100644 --- a/tauri-app/src/pages/medic.tsx +++ b/tauri-app/src/pages/medic.tsx @@ -1,5 +1,5 @@ -import { FunctionComponent, useEffect, useRef, useState } from "react"; -import useWeb5Store, { schemaOrgProtocolDefinition } from "@/stores/useWeb5Store"; +import { FunctionComponent, useEffect, useState } from "react"; +import useWeb5Store from "@/stores/useWeb5Store"; import { useDocuments } from "@/stores/useDocuments"; const possibleConditions = [ @@ -58,6 +58,7 @@ const MedicPage: FunctionComponent = () => { }, [documents]) const saveMedicalRecord = async () => { + console.log(form) const res = await createDocument({ name: form.name ? form.name : undefined, file: form.doc, condition: form.condition }) if (res) { diff --git a/tauri-app/src/utils/protocols/conditions.ts b/tauri-app/src/utils/protocols/conditions.ts index d1a41d4..5ffae94 100644 --- a/tauri-app/src/utils/protocols/conditions.ts +++ b/tauri-app/src/utils/protocols/conditions.ts @@ -25,6 +25,13 @@ const ConditionsProtocol = { } } +export namespace Record { + export type Condition = { + did: string + condition: string + } +} + export const did = "did:ion:EiAx_twrw3f0yLOv3Pe6pk4gWG4miV9SVXiHe_Q4lMn8Ow:eyJkZWx0YSI6eyJwYXRjaGVzIjpbeyJhY3Rpb24iOiJyZXBsYWNlIiwiZG9jdW1lbnQiOnsicHVibGljS2V5cyI6W3siaWQiOiJkd24tc2lnIiwicHVibGljS2V5SndrIjp7ImNydiI6IkVkMjU1MTkiLCJrdHkiOiJPS1AiLCJ4IjoiV1M1QXFqeDA1V2Z0YWMwYUhYRnpGNV9wZjM2eTVPQ0N0Qy1tM1lCTFo4WSJ9LCJwdXJwb3NlcyI6WyJhdXRoZW50aWNhdGlvbiJdLCJ0eXBlIjoiSnNvbldlYktleTIwMjAifSx7ImlkIjoiZHduLWVuYyIsInB1YmxpY0tleUp3ayI6eyJjcnYiOiJzZWNwMjU2azEiLCJrdHkiOiJFQyIsIngiOiJpSnpYYkljR0FHdm1QMzd2Z2VfTjB1M3FadllmLWpteGdyM2RTaDUtOE5vIiwieSI6InBBc1BuQ1hLcXlXRWhiS1ZDWjFJejhrWkljVVRXQXBNS2NOS3VtQ3R4T2cifSwicHVycG9zZXMiOlsia2V5QWdyZWVtZW50Il0sInR5cGUiOiJKc29uV2ViS2V5MjAyMCJ9XSwic2VydmljZXMiOlt7ImlkIjoiZHduIiwic2VydmljZUVuZHBvaW50Ijp7ImVuY3J5cHRpb25LZXlzIjpbIiNkd24tZW5jIl0sIm5vZGVzIjpbImh0dHBzOi8vZHduLnRiZGRldi5vcmcvZHduNSIsImh0dHBzOi8vZHduLnRiZGRldi5vcmcvZHduMyJdLCJzaWduaW5nS2V5cyI6WyIjZHduLXNpZyJdfSwidHlwZSI6IkRlY2VudHJhbGl6ZWRXZWJOb2RlIn1dfX1dLCJ1cGRhdGVDb21taXRtZW50IjoiRWlBSVIyQWFjQXZFVi16ODgwWHl2eHB4bWMzWDJkbDdYVmcwRHdWTGtfTms0QSJ9LCJzdWZmaXhEYXRhIjp7ImRlbHRhSGFzaCI6IkVpRGlvWktVc3cyZ0gzU29Nb0V5T0duVE9NQkZURFhZZ1hFX3Z6am5RU0M5aUEiLCJyZWNvdmVyeUNvbW1pdG1lbnQiOiJFaUQzU0JIaEtXXzduUF9QamV1WDcybDRjcXVTMWVPVTBCUk1EcW1vdnFpVGxnIn19" export default ConditionsProtocol diff --git a/tauri-app/tsconfig.json b/tauri-app/tsconfig.json index 22b1db8..27ffeda 100644 --- a/tauri-app/tsconfig.json +++ b/tauri-app/tsconfig.json @@ -1,11 +1,15 @@ { "compilerOptions": { + "composite": true, "target": "ES2020", "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], + "lib": [ + "ES2020", + "DOM", + "DOM.Iterable" + ], "module": "ESNext", "skipLibCheck": true, - /* Bundler mode */ "moduleResolution": "bundler", "allowImportingTsExtensions": true, @@ -13,18 +17,23 @@ "isolatedModules": true, "noEmit": true, "jsx": "react-jsx", - /* Linting */ "strict": true, // "noUnusedLocals": true, // "noUnusedParameters": true, "noFallthroughCasesInSwitch": true, - - "baseUrl": ".", - "paths": { - "@/*": ["./src/*"] - } + "outDir": "./build" }, - "include": ["src"], - "references": [{ "path": "./tsconfig.node.json" }] + "include": [ + "./src/**/*.ts" + ], + "references": [ + { + "path": "./tsconfig.node.json" + }, + { + "path": "../tsconfig.json" + } + ], + "extends": "../tsconfig.json" } diff --git a/tauri-app/vite.config.ts b/tauri-app/vite.config.ts index d54908f..4cb61b7 100644 --- a/tauri-app/vite.config.ts +++ b/tauri-app/vite.config.ts @@ -19,6 +19,9 @@ export default defineConfig(async () => ({ server: { port: 1420, strictPort: true, + proxy: { + "/api": "http://127.0.0.1:5000/" + }, watch: { // 3. tell vite to ignore watching `src-tauri` ignored: ["**/src-tauri/**"], diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..6b70144 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,42 @@ +{ + "compilerOptions": { + "composite": true, + "baseUrl": ".", + "paths": { + "@frontend/*": [ + "./tauri-app/src/*" + ], + "@backend/*": [ + "./server/src/*" + ], + "@/*": [ + "./tauri-app/src/*" + ] + }, + // "noUnusedLocals": true, + // "noUnusedParameters": true, + // "strictFunctionTypes": true, + "esModuleInterop": true, + "experimentalDecorators": true, + "allowUnreachableCode": false, + "target": "ES2020", + "useDefineForClassFields": true, + "lib": [ + "ES2020", + "DOM", + "DOM.Iterable" + ], + "module": "ESNext", + "skipLibCheck": true, + /* Bundler mode */ + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + /* Linting */ + "strict": true, + "noFallthroughCasesInSwitch": true, + "outDir": "./build", + "rootDir": "." + } +} From 99cf8162b299ecf38c32d0f1316045e54831aa12 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 02:36:47 +0000 Subject: [PATCH 030/136] updated protocol --- tauri-app/src/utils/protocols/conditions.ts | 4 +- tauri-app/src/utils/protocols/user-details.ts | 38 +++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 tauri-app/src/utils/protocols/user-details.ts diff --git a/tauri-app/src/utils/protocols/conditions.ts b/tauri-app/src/utils/protocols/conditions.ts index 5ffae94..e513310 100644 --- a/tauri-app/src/utils/protocols/conditions.ts +++ b/tauri-app/src/utils/protocols/conditions.ts @@ -1,9 +1,9 @@ const ConditionsProtocol = { - protocol: "https://dschema.org/conditions", + protocol: "https://dschema.org/protocols/conditions", published: true, types: { condition: { - schema: "https://schema.org/conditions/schemas/condition.json", + schema: "https://dschema.org/protocols/conditions/schemas/condition.json", dataFormats: [ "application/json" ] diff --git a/tauri-app/src/utils/protocols/user-details.ts b/tauri-app/src/utils/protocols/user-details.ts new file mode 100644 index 0000000..c047683 --- /dev/null +++ b/tauri-app/src/utils/protocols/user-details.ts @@ -0,0 +1,38 @@ +const UserDetailsProtocol = { + protocol: "https://dschema.org/protocols/user", + published: true, + types: { + details: { + schema: "https://dschema.org/protocols/user/schemas/details.json", + dataFormats: [ + "application/json" + ] + } + }, + structure: { + details: { + $actions: [ + { + who: "author", + can: "read" + }, + { + who: "anyone", + can: "write" + } + ] + } + } +} + +export namespace Record { + export type UserDetails = { + firstName: string + lastName: string + profilePictureUrl: string + } +} + +export const did = "did:ion:EiAx_twrw3f0yLOv3Pe6pk4gWG4miV9SVXiHe_Q4lMn8Ow:eyJkZWx0YSI6eyJwYXRjaGVzIjpbeyJhY3Rpb24iOiJyZXBsYWNlIiwiZG9jdW1lbnQiOnsicHVibGljS2V5cyI6W3siaWQiOiJkd24tc2lnIiwicHVibGljS2V5SndrIjp7ImNydiI6IkVkMjU1MTkiLCJrdHkiOiJPS1AiLCJ4IjoiV1M1QXFqeDA1V2Z0YWMwYUhYRnpGNV9wZjM2eTVPQ0N0Qy1tM1lCTFo4WSJ9LCJwdXJwb3NlcyI6WyJhdXRoZW50aWNhdGlvbiJdLCJ0eXBlIjoiSnNvbldlYktleTIwMjAifSx7ImlkIjoiZHduLWVuYyIsInB1YmxpY0tleUp3ayI6eyJjcnYiOiJzZWNwMjU2azEiLCJrdHkiOiJFQyIsIngiOiJpSnpYYkljR0FHdm1QMzd2Z2VfTjB1M3FadllmLWpteGdyM2RTaDUtOE5vIiwieSI6InBBc1BuQ1hLcXlXRWhiS1ZDWjFJejhrWkljVVRXQXBNS2NOS3VtQ3R4T2cifSwicHVycG9zZXMiOlsia2V5QWdyZWVtZW50Il0sInR5cGUiOiJKc29uV2ViS2V5MjAyMCJ9XSwic2VydmljZXMiOlt7ImlkIjoiZHduIiwic2VydmljZUVuZHBvaW50Ijp7ImVuY3J5cHRpb25LZXlzIjpbIiNkd24tZW5jIl0sIm5vZGVzIjpbImh0dHBzOi8vZHduLnRiZGRldi5vcmcvZHduNSIsImh0dHBzOi8vZHduLnRiZGRldi5vcmcvZHduMyJdLCJzaWduaW5nS2V5cyI6WyIjZHduLXNpZyJdfSwidHlwZSI6IkRlY2VudHJhbGl6ZWRXZWJOb2RlIn1dfX1dLCJ1cGRhdGVDb21taXRtZW50IjoiRWlBSVIyQWFjQXZFVi16ODgwWHl2eHB4bWMzWDJkbDdYVmcwRHdWTGtfTms0QSJ9LCJzdWZmaXhEYXRhIjp7ImRlbHRhSGFzaCI6IkVpRGlvWktVc3cyZ0gzU29Nb0V5T0duVE9NQkZURFhZZ1hFX3Z6am5RU0M5aUEiLCJyZWNvdmVyeUNvbW1pdG1lbnQiOiJFaUQzU0JIaEtXXzduUF9QamV1WDcybDRjcXVTMWVPVTBCUk1EcW1vdnFpVGxnIn19" + +export default UserDetailsProtocol From c1c27d70ac8c34dbb7db24d79732aa56e3b58807 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 02:38:20 +0000 Subject: [PATCH 031/136] updated import --- tauri-app/src/stores/useWeb5Store.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tauri-app/src/stores/useWeb5Store.ts b/tauri-app/src/stores/useWeb5Store.ts index 9f0a7a9..ad26103 100644 --- a/tauri-app/src/stores/useWeb5Store.ts +++ b/tauri-app/src/stores/useWeb5Store.ts @@ -1,4 +1,4 @@ -import { Web5 } from "@web5/api/browser"; +import { Web5 } from "@web5/api"; import { create } from "zustand"; import ConditionsProtocol from "@/utils/protocols/conditions"; From eed78b1fb43e010a7eedea2e7a54e5ad9de041b0 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 02:39:10 +0000 Subject: [PATCH 032/136] renamed protocol file --- tauri-app/src/utils/protocols/{user-details.ts => user.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tauri-app/src/utils/protocols/{user-details.ts => user.ts} (100%) diff --git a/tauri-app/src/utils/protocols/user-details.ts b/tauri-app/src/utils/protocols/user.ts similarity index 100% rename from tauri-app/src/utils/protocols/user-details.ts rename to tauri-app/src/utils/protocols/user.ts From 5814cfb877c905d5012a3cc81d7fc5a9c53b44a8 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 03:06:57 +0000 Subject: [PATCH 033/136] updated tsconfigs --- server/tsconfig.json | 20 +++++----- tauri-app/src/utils/document.ts | 0 tauri-app/src/utils/protocols/conditions.ts | 4 +- tauri-app/tsconfig.json | 31 ++++++--------- tsconfig.json | 42 --------------------- 5 files changed, 25 insertions(+), 72 deletions(-) create mode 100644 tauri-app/src/utils/document.ts delete mode 100644 tsconfig.json diff --git a/server/tsconfig.json b/server/tsconfig.json index 3cb9101..b77ecc0 100644 --- a/server/tsconfig.json +++ b/server/tsconfig.json @@ -1,7 +1,15 @@ { "compilerOptions": { - "composite": true, - "noEmit": true + "noEmit": true, + "strict": false, + "noImplicitAny": true, + "noFallthroughCasesInSwitch": true, + "module": "CommonJS", + "baseUrl": ".", + "paths": { + "@backend/*": ["./src/*"], + "@frontend/*": ["../tauri-app/src/*"] + } }, "include": [ "server.ts", @@ -9,11 +17,5 @@ ], "exclude": [ "node_modules" - ], - "references": [ - { - "path": "../tsconfig.json" - } - ], - "extends": "../tsconfig.json" + ] } diff --git a/tauri-app/src/utils/document.ts b/tauri-app/src/utils/document.ts new file mode 100644 index 0000000..e69de29 diff --git a/tauri-app/src/utils/protocols/conditions.ts b/tauri-app/src/utils/protocols/conditions.ts index e513310..aaf5811 100644 --- a/tauri-app/src/utils/protocols/conditions.ts +++ b/tauri-app/src/utils/protocols/conditions.ts @@ -1,9 +1,9 @@ const ConditionsProtocol = { - protocol: "https://dschema.org/protocols/conditions", + protocol: "https://dschema.org/protocols/condition", published: true, types: { condition: { - schema: "https://dschema.org/protocols/conditions/schemas/condition.json", + schema: "https://dschema.org/protocols/condition/schemas/condition.json", dataFormats: [ "application/json" ] diff --git a/tauri-app/tsconfig.json b/tauri-app/tsconfig.json index 27ffeda..36ff4af 100644 --- a/tauri-app/tsconfig.json +++ b/tauri-app/tsconfig.json @@ -1,15 +1,11 @@ { "compilerOptions": { - "composite": true, "target": "ES2020", "useDefineForClassFields": true, - "lib": [ - "ES2020", - "DOM", - "DOM.Iterable" - ], + "lib": ["ES2020", "DOM", "DOM.Iterable"], "module": "ESNext", "skipLibCheck": true, + /* Bundler mode */ "moduleResolution": "bundler", "allowImportingTsExtensions": true, @@ -17,23 +13,20 @@ "isolatedModules": true, "noEmit": true, "jsx": "react-jsx", + /* Linting */ "strict": true, // "noUnusedLocals": true, // "noUnusedParameters": true, "noFallthroughCasesInSwitch": true, - "outDir": "./build" - }, - "include": [ - "./src/**/*.ts" - ], - "references": [ - { - "path": "./tsconfig.node.json" - }, - { - "path": "../tsconfig.json" + + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"], + "@backend/*": ["../server/src/*"], + "@frontend/*": ["./src/*"] } - ], - "extends": "../tsconfig.json" + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] } diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 6b70144..0000000 --- a/tsconfig.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "baseUrl": ".", - "paths": { - "@frontend/*": [ - "./tauri-app/src/*" - ], - "@backend/*": [ - "./server/src/*" - ], - "@/*": [ - "./tauri-app/src/*" - ] - }, - // "noUnusedLocals": true, - // "noUnusedParameters": true, - // "strictFunctionTypes": true, - "esModuleInterop": true, - "experimentalDecorators": true, - "allowUnreachableCode": false, - "target": "ES2020", - "useDefineForClassFields": true, - "lib": [ - "ES2020", - "DOM", - "DOM.Iterable" - ], - "module": "ESNext", - "skipLibCheck": true, - /* Bundler mode */ - "moduleResolution": "Node", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "react-jsx", - /* Linting */ - "strict": true, - "noFallthroughCasesInSwitch": true, - "outDir": "./build", - "rootDir": "." - } -} From e2b754949fa6365da19bad5333c5acc5d83bf4e2 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 03:07:10 +0000 Subject: [PATCH 034/136] updated web5 import --- tauri-app/src/stores/useWeb5Store.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tauri-app/src/stores/useWeb5Store.ts b/tauri-app/src/stores/useWeb5Store.ts index ad26103..9f0a7a9 100644 --- a/tauri-app/src/stores/useWeb5Store.ts +++ b/tauri-app/src/stores/useWeb5Store.ts @@ -1,4 +1,4 @@ -import { Web5 } from "@web5/api"; +import { Web5 } from "@web5/api/browser"; import { create } from "zustand"; import ConditionsProtocol from "@/utils/protocols/conditions"; From 3b585e511dbc517f6b2c413c9acb2eaf147df3e3 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 03:07:18 +0000 Subject: [PATCH 035/136] defined document protocol --- tauri-app/src/utils/protocols/document.ts | 63 +++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 tauri-app/src/utils/protocols/document.ts diff --git a/tauri-app/src/utils/protocols/document.ts b/tauri-app/src/utils/protocols/document.ts new file mode 100644 index 0000000..e4a148b --- /dev/null +++ b/tauri-app/src/utils/protocols/document.ts @@ -0,0 +1,63 @@ +const DocumentProtocol = { + protocol: "https://dschema.org/protocols/document", + published: true, + types: { + document: { + schema: "https://schema.org/protocols/document/schemas/document.json", + dataFormats: [ + "application/json" + ] + }, + blob: { + schema: "https://dschema.org/protocols/document/schemas/blob.json", + dataFormats: [ + "application/json" + ] + } + }, + structure: { + document: { + $actions: [ + { + who: "anyone", + can: "read" + }, + { + who: "author", + can: "write" + } + ] + }, + blob: { + $actions: [ + { + who: "anyone", + can: "read" + }, + { + who: "author", + of: "parentId", + can: "write" + } + ] + } + } +} + +export namespace Record { + export type File = Blob + + export type Document = { + name: string + encodingFormat: string + size: number + url: string + condition: string + dateCreated?: string + dateModified?: string + }; +} + +export const did = "did:ion:EiAx_twrw3f0yLOv3Pe6pk4gWG4miV9SVXiHe_Q4lMn8Ow:eyJkZWx0YSI6eyJwYXRjaGVzIjpbeyJhY3Rpb24iOiJyZXBsYWNlIiwiZG9jdW1lbnQiOnsicHVibGljS2V5cyI6W3siaWQiOiJkd24tc2lnIiwicHVibGljS2V5SndrIjp7ImNydiI6IkVkMjU1MTkiLCJrdHkiOiJPS1AiLCJ4IjoiV1M1QXFqeDA1V2Z0YWMwYUhYRnpGNV9wZjM2eTVPQ0N0Qy1tM1lCTFo4WSJ9LCJwdXJwb3NlcyI6WyJhdXRoZW50aWNhdGlvbiJdLCJ0eXBlIjoiSnNvbldlYktleTIwMjAifSx7ImlkIjoiZHduLWVuYyIsInB1YmxpY0tleUp3ayI6eyJjcnYiOiJzZWNwMjU2azEiLCJrdHkiOiJFQyIsIngiOiJpSnpYYkljR0FHdm1QMzd2Z2VfTjB1M3FadllmLWpteGdyM2RTaDUtOE5vIiwieSI6InBBc1BuQ1hLcXlXRWhiS1ZDWjFJejhrWkljVVRXQXBNS2NOS3VtQ3R4T2cifSwicHVycG9zZXMiOlsia2V5QWdyZWVtZW50Il0sInR5cGUiOiJKc29uV2ViS2V5MjAyMCJ9XSwic2VydmljZXMiOlt7ImlkIjoiZHduIiwic2VydmljZUVuZHBvaW50Ijp7ImVuY3J5cHRpb25LZXlzIjpbIiNkd24tZW5jIl0sIm5vZGVzIjpbImh0dHBzOi8vZHduLnRiZGRldi5vcmcvZHduNSIsImh0dHBzOi8vZHduLnRiZGRldi5vcmcvZHduMyJdLCJzaWduaW5nS2V5cyI6WyIjZHduLXNpZyJdfSwidHlwZSI6IkRlY2VudHJhbGl6ZWRXZWJOb2RlIn1dfX1dLCJ1cGRhdGVDb21taXRtZW50IjoiRWlBSVIyQWFjQXZFVi16ODgwWHl2eHB4bWMzWDJkbDdYVmcwRHdWTGtfTms0QSJ9LCJzdWZmaXhEYXRhIjp7ImRlbHRhSGFzaCI6IkVpRGlvWktVc3cyZ0gzU29Nb0V5T0duVE9NQkZURFhZZ1hFX3Z6am5RU0M5aUEiLCJyZWNvdmVyeUNvbW1pdG1lbnQiOiJFaUQzU0JIaEtXXzduUF9QamV1WDcybDRjcXVTMWVPVTBCUk1EcW1vdnFpVGxnIn19" + +export default DocumentProtocol From 29a01403cffa9e9edae370d8b8b184ba2441143f Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 05:00:38 +0000 Subject: [PATCH 036/136] added some tsignores --- tauri-app/src/stores/useDocuments.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tauri-app/src/stores/useDocuments.ts b/tauri-app/src/stores/useDocuments.ts index 3864381..c6914f7 100644 --- a/tauri-app/src/stores/useDocuments.ts +++ b/tauri-app/src/stores/useDocuments.ts @@ -61,6 +61,7 @@ export function useDocuments(web5: Web5, did: string) { protocolPath: 'condition', schema: ConditionsProtocol.types.condition.schema, }, + // @ts-ignore dateSort: "createdAscending", }, }); @@ -69,6 +70,7 @@ export function useDocuments(web5: Web5, did: string) { const fetchedRecords = await Promise.allSettled(records.map(record => record.data.json())) .then(results => results .filter(result => result.status === 'fulfilled') + // @ts-ignore .map(result => result.value)) return fetchedRecords From 1ed113ca91e6e5f1f0646f67028494d94e1789ef Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 05:00:49 +0000 Subject: [PATCH 037/136] removed checks from package.json --- tauri-app/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tauri-app/package.json b/tauri-app/package.json index be51e78..39b4c47 100644 --- a/tauri-app/package.json +++ b/tauri-app/package.json @@ -5,7 +5,7 @@ "type": "module", "scripts": { "dev": "vite", - "build": "tsc && vite build", + "build": "vite build", "preview": "vite preview", "tauri": "tauri" }, From a61e87658df6e1fc73c030975b229499427a77aa Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Fri, 5 Jan 2024 11:42:04 +0100 Subject: [PATCH 038/136] porting javascript to ttpescript --- .../src/components/AddCardComponent/index.tsx | 14 +++++++--- .../components/AddRemedyComponent/index.tsx | 27 ++++++++++++++----- tauri-app/src/components/Card/index.tsx | 22 ++++++++++++--- .../components/DetailCardComponent/index.tsx | 26 ++++++++++++++++-- tauri-app/src/pages/Contact/index.tsx | 21 ++++++++++----- tauri-app/src/pages/Remedies/index.css | 2 +- 6 files changed, 89 insertions(+), 23 deletions(-) diff --git a/tauri-app/src/components/AddCardComponent/index.tsx b/tauri-app/src/components/AddCardComponent/index.tsx index 66c9bb6..3da12d8 100644 --- a/tauri-app/src/components/AddCardComponent/index.tsx +++ b/tauri-app/src/components/AddCardComponent/index.tsx @@ -1,14 +1,18 @@ import "./index.css"; -import { useState } from "react"; +import React, { useState } from "react"; + +interface FileProp { + file: File | null | undefined; +} const FileUploader = () => { - const [file, setFile] = useState(null); + const [file, setFile] = useState({ file: null }); return (
    { - setFile(e.target.files[0]); + setFile({ file: e?.target?.files?.[0] }); }} type="file" accept=".jpg,.png,.jpeg,.docx,.pdf" @@ -18,7 +22,9 @@ const FileUploader = () => { }; const index = () => { - const [fileUploaders, setUploaderFile] = useState([]); + const [fileUploaders, setUploaderFile] = useState([ + , + ]); return (

    Create New Record

    diff --git a/tauri-app/src/components/AddRemedyComponent/index.tsx b/tauri-app/src/components/AddRemedyComponent/index.tsx index bdf446a..31d8dc4 100644 --- a/tauri-app/src/components/AddRemedyComponent/index.tsx +++ b/tauri-app/src/components/AddRemedyComponent/index.tsx @@ -1,14 +1,18 @@ import "./index.css"; -import { useState } from "react"; +import React, { FC, useState } from "react"; -const FileUploader = () => { - const [file, setFile] = useState(null); +interface FileProp { + file: File | null | undefined; +} + +const FileUploader: FC = () => { + const [file, setFile] = useState({ file: null }); return (
    { - setFile(e.target.files[0]); + setFile({ file: e?.target?.files?.[0] }); }} type="file" accept=".jpg,.png,.jpeg" @@ -17,7 +21,13 @@ const FileUploader = () => { ); }; -const StepField = ({ addStep, index }) => { +interface StepProp { + index: React.ReactNode; +} + +//add stepFunction +//to trigger when save in main form is clicked +const StepField: FC = ({ index }) => { return (

    Step #{index}

    @@ -27,8 +37,11 @@ const StepField = ({ addStep, index }) => { ); }; -const index = () => { - const [steps, setSteps] = useState([]); +const index: FC = () => { + const [steps, setSteps] = useState([ + , + ]); + return (

    Create New Remedy

    diff --git a/tauri-app/src/components/Card/index.tsx b/tauri-app/src/components/Card/index.tsx index e98d449..d61c871 100644 --- a/tauri-app/src/components/Card/index.tsx +++ b/tauri-app/src/components/Card/index.tsx @@ -1,8 +1,24 @@ import "./index.css"; -import { useState } from "react"; +import React, { FC, useState } from "react"; -const index = ({ file_name, file_extension, title, desc, date, cardUtils }) => { - const [supportedIMGExtensions, setSupportedIMG, Extensions] = useState([ +interface CardProp { + file_name: String; + file_extension: string; + title: String; + desc: String; + date: String; + cardUtils: any[]; +} + +const index: FC = ({ + file_name, + file_extension, + title, + desc, + date, + cardUtils, +}) => { + const [supportedIMGExtensions, setSupportedIMGExtensions] = useState([ "jpg", "png", "jpeg", diff --git a/tauri-app/src/components/DetailCardComponent/index.tsx b/tauri-app/src/components/DetailCardComponent/index.tsx index 393c33f..9ae854b 100644 --- a/tauri-app/src/components/DetailCardComponent/index.tsx +++ b/tauri-app/src/components/DetailCardComponent/index.tsx @@ -1,7 +1,29 @@ import "./index.css"; -import { useState } from "react"; +import React, { FC, useState } from "react"; -const index = ({ cardData, close }) => { +interface OtherFileProp { + title: String; + file_extension: string; + file_name: string; + + file_url: string; +} + +interface CardDataProps { + file_name: String; + file_extension: string; + title: String; + desc: String; + date: String; + other_files: OtherFileProp[]; +} + +interface CardProp { + cardData: CardDataProps; + close: (isCardDetailActive: boolean) => void; +} + +const index: FC = ({ cardData, close }) => { const [supportedIMGExtensions, setSupportedIMGExtensions] = useState([ "jpg", "png", diff --git a/tauri-app/src/pages/Contact/index.tsx b/tauri-app/src/pages/Contact/index.tsx index ca84645..4c07599 100644 --- a/tauri-app/src/pages/Contact/index.tsx +++ b/tauri-app/src/pages/Contact/index.tsx @@ -55,12 +55,21 @@ const index: FC = () => {
    - +
    +
    +

    Hospital/Dr. name

    +
    +
    +

    Address

    +
    +
    +

    City

    +
    +
    +

    Distance

    +
    +
    + {fetchedLocations.map((location) => { return ( Date: Fri, 5 Jan 2024 17:10:09 +0530 Subject: [PATCH 039/136] fixed all errors --- server/package-lock.json | 2354 +++++++++++++++++ server/src/app.ts | 1 + server/src/utils.ts | 5 + tauri-app/package-lock.json | 9 + tauri-app/src/components/RemedyCard/index.tsx | 9 + tauri-app/src/pages/Contact/index.tsx | 8 +- tauri-app/src/pages/Records/index.tsx | 3 + tauri-app/src/pages/Remedies/index.tsx | 22 +- 8 files changed, 2402 insertions(+), 9 deletions(-) create mode 100644 server/package-lock.json diff --git a/server/package-lock.json b/server/package-lock.json new file mode 100644 index 0000000..9794805 --- /dev/null +++ b/server/package-lock.json @@ -0,0 +1,2354 @@ +{ + "name": "server", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@hono/node-server": "^1.4.0", + "@hono/zod-validator": "^0.1.11", + "@web5/api": "^0.8.3", + "hono": "^3.12.0", + "true-myth": "5", + "tsconfig-paths": "^4.2.0", + "zod": "^3.22.4" + }, + "devDependencies": { + "tsx": "^4.7.0", + "typescript": "^5.3.3" + } + }, + "node_modules/@assemblyscript/loader": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.9.4.tgz", + "integrity": "sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==" + }, + "node_modules/@decentralized-identity/ion-pow-sdk": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/@decentralized-identity/ion-pow-sdk/-/ion-pow-sdk-1.0.17.tgz", + "integrity": "sha512-vk7DTDM8aKDbFyu1ad/qkoRrGL4q+KvNeL/FNZXhkWPaDhVExBN/qGEoRLf1YSfFe+myto3+4RYTPut+riiqnw==", + "dependencies": { + "buffer": "6.0.3", + "cross-fetch": "3.1.5", + "hash-wasm": "4.9.0" + } + }, + "node_modules/@decentralized-identity/ion-pow-sdk/node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "node_modules/@decentralized-identity/ion-pow-sdk/node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/@decentralized-identity/ion-sdk": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@decentralized-identity/ion-sdk/-/ion-sdk-1.0.1.tgz", + "integrity": "sha512-+P+DXcRSFjsEsI5KIqUmVjpzgUT28B2lWpTO+IxiBcfibAN/1Sg20NebGTO/+serz2CnSZf95N2a1OZ6eXypGQ==", + "dependencies": { + "@noble/ed25519": "^2.0.0", + "@noble/secp256k1": "^2.0.0", + "canonicalize": "^2.0.0", + "multiformats": "^12.0.1", + "multihashes": "^4.0.3", + "uri-js": "^4.4.1" + } + }, + "node_modules/@decentralized-identity/ion-sdk/node_modules/multiformats": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz", + "integrity": "sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==", + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", + "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", + "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", + "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", + "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", + "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", + "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", + "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", + "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", + "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", + "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", + "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", + "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", + "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", + "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", + "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", + "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", + "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", + "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", + "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", + "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", + "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", + "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", + "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@hono/node-server": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.4.0.tgz", + "integrity": "sha512-bhDkhldW7w9VgjrX0gG1vJ2YyvTxFWd5WG9nHjSR4UauhVECQZC3qy7mVVuQ054I5NWhKttHfKzYfoPzmUzAjw==", + "engines": { + "node": ">=18.14.1" + } + }, + "node_modules/@hono/zod-validator": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@hono/zod-validator/-/zod-validator-0.1.11.tgz", + "integrity": "sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==", + "peerDependencies": { + "hono": ">=3.9.0", + "zod": "^3.19.1" + } + }, + "node_modules/@ipld/dag-cbor": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@ipld/dag-cbor/-/dag-cbor-9.0.3.tgz", + "integrity": "sha512-A2UFccS0+sARK9xwXiVZIaWbLbPxLGP3UZOjBeOMWfDY04SXi8h1+t4rHBzOlKYF/yWNm3RbFLyclWO7hZcy4g==", + "dependencies": { + "cborg": "^2.0.1", + "multiformats": "^12.0.1" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@ipld/dag-cbor/node_modules/multiformats": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz", + "integrity": "sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==", + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@ipld/dag-pb": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@ipld/dag-pb/-/dag-pb-4.0.7.tgz", + "integrity": "sha512-EqJtSAcELiYbp9K0Y5ckbg+W0pD5cSy5PnE/QsCrpKvoq+u0E8Vi07chNGDLaShd5AjDq0AMtnuudKUUuEuSjg==", + "dependencies": { + "multiformats": "^13.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@ipld/dag-pb/node_modules/multiformats": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.0.0.tgz", + "integrity": "sha512-xiIB0p7EKmETm3wyKedOg/xuyQ18PoWwXCzzgpZAiDxL9ktl3XTh8AqoDT5kAqRg+DU48XAGPsUJL2Rn6Bx3Lw==" + }, + "node_modules/@js-temporal/polyfill": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@js-temporal/polyfill/-/polyfill-0.4.4.tgz", + "integrity": "sha512-2X6bvghJ/JAoZO52lbgyAPFj8uCflhTo2g7nkFzEQdXd/D8rEeD4HtmTEpmtGCva260fcd66YNXBOYdnmHqSOg==", + "dependencies": { + "jsbi": "^4.3.0", + "tslib": "^2.4.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + }, + "node_modules/@multiformats/base-x": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/base-x/-/base-x-4.0.1.tgz", + "integrity": "sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==" + }, + "node_modules/@multiformats/murmur3": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@multiformats/murmur3/-/murmur3-2.1.8.tgz", + "integrity": "sha512-6vId1C46ra3R1sbJUOFCZnsUIveR9oF20yhPmAFxPm0JfrX3/ZRCgP3YDrBzlGoEppOXnA9czHeYc0T9mB6hbA==", + "dependencies": { + "multiformats": "^13.0.0", + "murmurhash3js-revisited": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@multiformats/murmur3/node_modules/multiformats": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.0.0.tgz", + "integrity": "sha512-xiIB0p7EKmETm3wyKedOg/xuyQ18PoWwXCzzgpZAiDxL9ktl3XTh8AqoDT5kAqRg+DU48XAGPsUJL2Rn6Bx3Lw==" + }, + "node_modules/@noble/ciphers": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.1.4.tgz", + "integrity": "sha512-d3ZR8vGSpy3v/nllS+bD/OMN5UZqusWiQqkyj7AwzTnhXFH72pF5oB4Ach6DQ50g5kXxC28LdaYBEpsyv9KOUQ==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", + "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "dependencies": { + "@noble/hashes": "1.3.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/ed25519": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-2.0.0.tgz", + "integrity": "sha512-/extjhkwFupyopDrt80OMWKdLgP429qLZj+z6sYJz90rF2Iz0gjZh2ArMKPImUl13Kx+0EXI2hN9T/KJV0/Zng==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/secp256k1": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-2.0.0.tgz", + "integrity": "sha512-rUGBd95e2a45rlmFTqQJYEFA4/gdIARFfuTuTqLglz0PZ6AKyzyXsEZZq7UZn8hZsvaBgpCzKKBJizT2cJERXw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@tbd54566975/dwn-sdk-js": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@tbd54566975/dwn-sdk-js/-/dwn-sdk-js-0.2.8.tgz", + "integrity": "sha512-oiKk+ekAQO94bUkt6yk+xkDY8uCGmNC+rKaYQLhAoTrhYrczeRSuDT04F5/vPBT5K6NfAoRcQsIyBmvgRCUvgA==", + "dependencies": { + "@ipld/dag-cbor": "9.0.3", + "@js-temporal/polyfill": "0.4.4", + "@noble/ed25519": "2.0.0", + "@noble/secp256k1": "2.0.0", + "abstract-level": "1.0.3", + "ajv": "8.12.0", + "blockstore-core": "4.2.0", + "cross-fetch": "4.0.0", + "eciesjs": "0.4.5", + "flat": "5.0.2", + "interface-blockstore": "5.2.3", + "interface-store": "5.1.2", + "ipfs-unixfs-exporter": "13.1.5", + "ipfs-unixfs-importer": "15.1.5", + "level": "8.0.0", + "lodash": "4.17.21", + "lru-cache": "9.1.2", + "ms": "2.1.3", + "multiformats": "11.0.2", + "randombytes": "2.1.0", + "readable-stream": "4.4.2", + "ulidx": "2.1.0", + "uuid": "8.3.2", + "varint": "6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@web5/agent": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@web5/agent/-/agent-0.2.5.tgz", + "integrity": "sha512-Z9JY/43Yrg0xKK26y/iZFdHNtVf/k9XLxw8mXP5zfYidrqfAgVR0i4LKA7qZKfUSxC7/uaD/STYYIKpNByd/cw==", + "dependencies": { + "@tbd54566975/dwn-sdk-js": "0.2.8", + "@web5/common": "0.2.2", + "@web5/crypto": "0.2.2", + "@web5/dids": "0.2.3", + "level": "8.0.0", + "readable-stream": "4.4.2", + "readable-web-to-node-stream": "3.0.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@web5/api": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/@web5/api/-/api-0.8.3.tgz", + "integrity": "sha512-YXQ++ZShtd5LeFRqEMGlhVqJ7Zg5P6bMequpaLl068bCGjtjCwiFFgDtM1KeL36IAzQ4pFLFyj9aTGZ/JgCXHA==", + "dependencies": { + "@tbd54566975/dwn-sdk-js": "0.2.8", + "@web5/agent": "0.2.5", + "@web5/common": "0.2.2", + "@web5/crypto": "0.2.2", + "@web5/dids": "0.2.3", + "@web5/user-agent": "0.2.5", + "level": "8.0.0", + "ms": "2.1.3", + "readable-stream": "4.4.2", + "readable-web-to-node-stream": "3.0.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@web5/common": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@web5/common/-/common-0.2.2.tgz", + "integrity": "sha512-dRn6SmALExeTLMTK/W5ozGarfaddK+Lraf5OjuIGLAaLfcX1RWx3oDMoY5Hr9LjfxHJC8mGXB8DnKflbeYJRgA==", + "dependencies": { + "level": "8.0.0", + "multiformats": "11.0.2", + "readable-stream": "4.4.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@web5/crypto": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@web5/crypto/-/crypto-0.2.2.tgz", + "integrity": "sha512-vHFg0wXQSQXrwuBNQyDHnmSZchfTfO6/Sv+7rDsNkvofs+6lGTE8CZ02cwUYMeIwTRMLer12c+fMfzYrXokEUQ==", + "dependencies": { + "@noble/ciphers": "0.1.4", + "@noble/curves": "1.1.0", + "@noble/hashes": "1.3.1", + "@web5/common": "0.2.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@web5/crypto/node_modules/@web5/common": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@web5/common/-/common-0.2.1.tgz", + "integrity": "sha512-Tt5P17HgQCx+Epw0IHnhRKqp5UU3E4xtsE8PkdghOBnvntBB0op5P6efvR1WqmJft5+VunDHt3yZAZstuqQkNg==", + "dependencies": { + "level": "8.0.0", + "multiformats": "11.0.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@web5/dids": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@web5/dids/-/dids-0.2.3.tgz", + "integrity": "sha512-Y3PHOavNkSyjBxZQEpKE6XueaqemBO5w0UMOnFh4xH6+5B43ENEE4LHIqVyn2bCpfEBGLXENgDZYqyJphBu0pA==", + "dependencies": { + "@decentralized-identity/ion-pow-sdk": "1.0.17", + "@decentralized-identity/ion-sdk": "1.0.1", + "@web5/common": "0.2.2", + "@web5/crypto": "0.2.2", + "did-resolver": "4.1.0", + "dns-packet": "5.6.1", + "level": "8.0.0", + "ms": "2.1.3", + "pkarr": "1.1.1", + "z32": "1.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@web5/user-agent": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@web5/user-agent/-/user-agent-0.2.5.tgz", + "integrity": "sha512-qv5M698C5HSvq30xUgLWtcsbZppjfOH5qZthpTRx4ItL5UWA/eQ9DsQiQeb4vet3uIUy3NHRDIQezclOdwYErw==", + "dependencies": { + "@web5/agent": "0.2.5", + "@web5/common": "0.2.2", + "@web5/crypto": "0.2.2", + "@web5/dids": "0.2.3" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/abstract-level": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", + "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", + "dependencies": { + "buffer": "^6.0.3", + "catering": "^2.1.0", + "is-buffer": "^2.0.5", + "level-supports": "^4.0.0", + "level-transcoder": "^1.0.1", + "module-error": "^1.0.1", + "queue-microtask": "^1.2.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/b4a": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", + "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" + }, + "node_modules/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bencode": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bencode/-/bencode-3.1.1.tgz", + "integrity": "sha512-btsxX9201yoWh45TdqYg6+OZ5O1xTYKTYSGvJndICDFtznE/9zXgow8yjMvvhOqKKuzuL7h+iiCMpfkG8+QuBA==", + "dependencies": { + "uint8-util": "^2.1.6" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/bittorrent-dht": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/bittorrent-dht/-/bittorrent-dht-11.0.5.tgz", + "integrity": "sha512-R09D6uNaziRqsc+B/j5QzkjceTak+wH9vcNLnkmt8A52EWF9lQwBP0vvCKgSA3AJOYYl+41n3osA2KYYn/z5uQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "bencode": "^4.0.0", + "debug": "^4.3.4", + "k-bucket": "^5.1.0", + "k-rpc": "^5.1.0", + "last-one-wins": "^1.0.4", + "lru": "^3.1.0", + "randombytes": "^2.1.0", + "record-cache": "^1.2.0" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/bittorrent-dht/node_modules/bencode": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/bencode/-/bencode-4.0.0.tgz", + "integrity": "sha512-AERXw18df0pF3ziGOCyUjqKZBVNH8HV3lBxnx5w0qtgMIk4a1wb9BkcCQbkp9Zstfrn/dzRwl7MmUHHocX3sRQ==", + "dependencies": { + "uint8-util": "^2.2.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/blake2b": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.4.tgz", + "integrity": "sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A==", + "dependencies": { + "blake2b-wasm": "^2.4.0", + "nanoassert": "^2.0.0" + } + }, + "node_modules/blake2b-wasm": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz", + "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==", + "dependencies": { + "b4a": "^1.0.1", + "nanoassert": "^2.0.0" + } + }, + "node_modules/blockstore-core": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/blockstore-core/-/blockstore-core-4.2.0.tgz", + "integrity": "sha512-F8BCobc75D+9/+hUD+5cixbU6zmZA+lBgNiuBkNlJqRgmAaBBvLOQF6Ad9Jei0Nvmy2a1jaF4CiN76W1apIghA==", + "dependencies": { + "err-code": "^3.0.1", + "interface-blockstore": "^5.0.0", + "interface-store": "^5.0.0", + "multiformats": "^11.0.2" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/browser-level": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", + "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", + "dependencies": { + "abstract-level": "^1.0.2", + "catering": "^2.1.1", + "module-error": "^1.0.2", + "run-parallel-limit": "^1.1.0" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/canonicalize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/canonicalize/-/canonicalize-2.0.0.tgz", + "integrity": "sha512-ulDEYPv7asdKvqahuAY35c1selLdzDwHqugK92hfkzvlDCwXRRelDkR+Er33md/PtnpqHemgkuDPanZ4fiYZ8w==" + }, + "node_modules/catering": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", + "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cborg": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cborg/-/cborg-2.0.5.tgz", + "integrity": "sha512-xVW1rSIw1ZXbkwl2XhJ7o/jAv0vnVoQv/QlfQxV8a7V5PlA4UU/AcIiXqmpyybwNWy/GPQU1m/aBVNIWr7/T0w==", + "bin": { + "cborg": "cli.js" + } + }, + "node_modules/chacha20-universal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chacha20-universal/-/chacha20-universal-1.0.4.tgz", + "integrity": "sha512-/IOxdWWNa7nRabfe7+oF+jVkGjlr2xUL4J8l/OvzZhj+c9RpMqoo3Dq+5nU1j/BflRV4BKnaQ4+4oH1yBpQG1Q==", + "dependencies": { + "nanoassert": "^2.0.0" + } + }, + "node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chrome-dgram": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/chrome-dgram/-/chrome-dgram-3.0.6.tgz", + "integrity": "sha512-bqBsUuaOiXiqxXt/zA/jukNJJ4oaOtc7ciwqJpZVEaaXwwxqgI2/ZdG02vXYWUhHGziDlvGMQWk0qObgJwVYKA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "inherits": "^2.0.4", + "run-series": "^1.1.9" + } + }, + "node_modules/chrome-dns": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chrome-dns/-/chrome-dns-1.0.1.tgz", + "integrity": "sha512-HqsYJgIc8ljJJOqOzLphjAs79EUuWSX3nzZi2LNkzlw3GIzAeZbaSektC8iT/tKvLqZq8yl1GJu5o6doA4TRbg==", + "dependencies": { + "chrome-net": "^3.3.2" + } + }, + "node_modules/chrome-net": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/chrome-net/-/chrome-net-3.3.4.tgz", + "integrity": "sha512-Jzy2EnzmE+ligqIZUsmWnck9RBXLuUy6CaKyuNMtowFG3ZvLt8d+WBJCTPEludV0DHpIKjAOlwjFmTaEdfdWCw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "inherits": "^2.0.1" + } + }, + "node_modules/classic-level": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", + "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", + "hasInstallScript": true, + "dependencies": { + "abstract-level": "^1.0.2", + "catering": "^2.1.0", + "module-error": "^1.0.1", + "napi-macros": "^2.2.2", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/did-resolver": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/did-resolver/-/did-resolver-4.1.0.tgz", + "integrity": "sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA==" + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eciesjs": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.5.tgz", + "integrity": "sha512-2zSRIygO48LpdS95Rwt9ryIkJNO37IdbkjRsnYyAn7gx7e4WPBNimnk6jGNdx2QQYr/VJRPnSVdwQpO5bycYZw==", + "dependencies": { + "@noble/ciphers": "^0.3.0", + "@noble/curves": "^1.2.0", + "@noble/hashes": "^1.3.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/eciesjs/node_modules/@noble/ciphers": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.3.0.tgz", + "integrity": "sha512-ldbrnOjmNRwFdXcTM6uXDcxpMIFrbzAWNnpBPp4oTJTFF0XByGD6vf45WrehZGXRQTRVV+Zm8YP+EgEf+e4cWA==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/eciesjs/node_modules/@noble/curves": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz", + "integrity": "sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==", + "dependencies": { + "@noble/hashes": "1.3.3" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/eciesjs/node_modules/@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/err-code": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", + "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==" + }, + "node_modules/esbuild": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", + "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.11", + "@esbuild/android-arm": "0.19.11", + "@esbuild/android-arm64": "0.19.11", + "@esbuild/android-x64": "0.19.11", + "@esbuild/darwin-arm64": "0.19.11", + "@esbuild/darwin-x64": "0.19.11", + "@esbuild/freebsd-arm64": "0.19.11", + "@esbuild/freebsd-x64": "0.19.11", + "@esbuild/linux-arm": "0.19.11", + "@esbuild/linux-arm64": "0.19.11", + "@esbuild/linux-ia32": "0.19.11", + "@esbuild/linux-loong64": "0.19.11", + "@esbuild/linux-mips64el": "0.19.11", + "@esbuild/linux-ppc64": "0.19.11", + "@esbuild/linux-riscv64": "0.19.11", + "@esbuild/linux-s390x": "0.19.11", + "@esbuild/linux-x64": "0.19.11", + "@esbuild/netbsd-x64": "0.19.11", + "@esbuild/openbsd-x64": "0.19.11", + "@esbuild/sunos-x64": "0.19.11", + "@esbuild/win32-arm64": "0.19.11", + "@esbuild/win32-ia32": "0.19.11", + "@esbuild/win32-x64": "0.19.11" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/graceful-goodbye": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/graceful-goodbye/-/graceful-goodbye-1.3.0.tgz", + "integrity": "sha512-hcZOs20emYlTM7MmUE0FpuZcjlk2GPsR+UYTHDeWxtGjXcbh2CawGi8vlzqsIvspqAbot7mRv3sC/uhgtKc4hQ==", + "dependencies": { + "safety-catch": "^1.0.2" + } + }, + "node_modules/hamt-sharding": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/hamt-sharding/-/hamt-sharding-3.0.2.tgz", + "integrity": "sha512-f0DzBD2tSmLFdFsLAvOflIBqFPjerbA7BfmwO8mVho/5hXwgyyYhv+ijIzidQf/DpDX3bRjAQvhGoBFj+DBvPw==", + "dependencies": { + "sparse-array": "^1.3.1", + "uint8arrays": "^4.0.2" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/hash-wasm": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/hash-wasm/-/hash-wasm-4.9.0.tgz", + "integrity": "sha512-7SW7ejyfnRxuOc7ptQHSf4LDoZaWOivfzqw+5rpcQku0nHfmicPKE51ra9BiRLAmT8+gGLestr1XroUkqdjL6w==" + }, + "node_modules/hono": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/hono/-/hono-3.12.0.tgz", + "integrity": "sha512-UPEtZuLY7Wo7g0mqKWSOjLFdT8t7wJ60IYEcxKl3AQNU4u+R2QqU2fJMPmSu24C+/ag20Z8mOTQOErZzK4DMvA==", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/interface-blockstore": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/interface-blockstore/-/interface-blockstore-5.2.3.tgz", + "integrity": "sha512-15cN+ZFdcVXdXo6I/SrSzFDsuJyDTyEI52XuvXQlR/G5fe3cK8p0tvVjfu5diRQH1XqNgmJEdMPixyt0xgjtvQ==", + "dependencies": { + "interface-store": "^5.0.0", + "multiformats": "^11.0.2" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/interface-store": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/interface-store/-/interface-store-5.1.2.tgz", + "integrity": "sha512-q2sLoqC+UdaWnjwGyghsH0jwqqVk226lsG207e3QwPB8sAZYmYIWUnJwJH3JjFNNRV9e6CUTmm+gDO0Xg4KRiw==", + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/ipfs-unixfs": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-11.1.2.tgz", + "integrity": "sha512-HVjrACOhU8RgMskcrfydk+FDAE9pFKr8tneKLaVYQ2f81HUKXoiSdgsAJY/jt7Ieyj4tE12TZGduIeWtNpScOw==", + "dependencies": { + "err-code": "^3.0.1", + "protons-runtime": "^5.0.0", + "uint8arraylist": "^2.4.3" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/ipfs-unixfs-exporter": { + "version": "13.1.5", + "resolved": "https://registry.npmjs.org/ipfs-unixfs-exporter/-/ipfs-unixfs-exporter-13.1.5.tgz", + "integrity": "sha512-O5aMawsHoe4DaYk5FFil2EPrNOaU3pkHC6qUR5JMnW7es93W3b/RjJoO7AyDL1rpb+M3K0oRu86Yc5wLNQQ8jg==", + "dependencies": { + "@ipld/dag-cbor": "^9.0.0", + "@ipld/dag-pb": "^4.0.0", + "@multiformats/murmur3": "^2.0.0", + "err-code": "^3.0.1", + "hamt-sharding": "^3.0.0", + "interface-blockstore": "^5.0.0", + "ipfs-unixfs": "^11.0.0", + "it-filter": "^3.0.2", + "it-last": "^3.0.2", + "it-map": "^3.0.3", + "it-parallel": "^3.0.0", + "it-pipe": "^3.0.1", + "it-pushable": "^3.1.0", + "multiformats": "^11.0.0", + "p-queue": "^7.3.0", + "progress-events": "^1.0.0", + "uint8arrays": "^4.0.2" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/ipfs-unixfs-importer": { + "version": "15.1.5", + "resolved": "https://registry.npmjs.org/ipfs-unixfs-importer/-/ipfs-unixfs-importer-15.1.5.tgz", + "integrity": "sha512-TXaOI0M5KNpq2+qLw8AIYd0Lnc0gWTKCBqUd9eErBUwaP3Fna4qauF+JX9Rj2UrwaOvG/1xbF8Vm+92eOcKWMA==", + "dependencies": { + "@ipld/dag-pb": "^4.0.0", + "@multiformats/murmur3": "^2.0.0", + "err-code": "^3.0.1", + "hamt-sharding": "^3.0.0", + "interface-blockstore": "^5.0.0", + "interface-store": "^5.0.1", + "ipfs-unixfs": "^11.0.0", + "it-all": "^3.0.2", + "it-batch": "^3.0.2", + "it-first": "^3.0.2", + "it-parallel-batch": "^3.0.1", + "multiformats": "^11.0.0", + "progress-events": "^1.0.0", + "rabin-wasm": "^0.1.4", + "uint8arraylist": "^2.4.3", + "uint8arrays": "^4.0.2" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/it-all": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/it-all/-/it-all-3.0.4.tgz", + "integrity": "sha512-UMiy0i9DqCHBdWvMbzdYvVGa5/w4t1cc4nchpbnjdLhklglv8mQeEYnii0gvKESJuL1zV32Cqdb33R6/GPfxpQ==" + }, + "node_modules/it-batch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/it-batch/-/it-batch-3.0.4.tgz", + "integrity": "sha512-WRu2mqOYIs+T9k7+yxSK9VJdk0UE4R0jKQsWQcti5c6vhb1FhjC2+yCB5XBrctQ9edNfCMU/wVzdDj8qSwimbA==" + }, + "node_modules/it-filter": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/it-filter/-/it-filter-3.0.4.tgz", + "integrity": "sha512-e0sz+st4sudK/zH6GZ/gRTRP8A/ADuJFCYDmRgMbZvR79y5+v4ZXav850bBZk5wL9zXaYZFxS1v/6Qi+Vjwh5g==", + "dependencies": { + "it-peekable": "^3.0.0" + } + }, + "node_modules/it-first": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/it-first/-/it-first-3.0.4.tgz", + "integrity": "sha512-FtQl84iTNxN5EItP/JgL28V2rzNMkCzTUlNoj41eVdfix2z1DBuLnBqZ0hzYhGGa1rMpbQf0M7CQSA2adlrLJg==" + }, + "node_modules/it-last": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/it-last/-/it-last-3.0.4.tgz", + "integrity": "sha512-Ns+KTsQWhs0KCvfv5X3Ck3lpoYxHcp4zUp4d+AOdmC8cXXqDuoZqAjfWhgCbxJubXyIYWdfE2nRcfWqgvZHP8Q==" + }, + "node_modules/it-map": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/it-map/-/it-map-3.0.5.tgz", + "integrity": "sha512-hB0TDXo/h4KSJJDSRLgAPmDroiXP6Fx1ck4Bzl3US9hHfZweTKsuiP0y4gXuTMcJlS6vj0bb+f70rhkD47ZA3w==", + "dependencies": { + "it-peekable": "^3.0.0" + } + }, + "node_modules/it-merge": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/it-merge/-/it-merge-3.0.3.tgz", + "integrity": "sha512-FYVU15KC5pb/GQX1Ims+lee8d4pdqGVCpWr0lkNj8o4xuNo7jY71k6GuEiWdP+T7W1bJqewSxX5yoTy5yZpRVA==", + "dependencies": { + "it-pushable": "^3.2.0" + } + }, + "node_modules/it-parallel": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/it-parallel/-/it-parallel-3.0.6.tgz", + "integrity": "sha512-i7UM7I9LTkDJw3YIqXHFAPZX6CWYzGc+X3irdNrVExI4vPazrJdI7t5OqrSVN8CONXLAunCiqaSV/zZRbQR56A==", + "dependencies": { + "p-defer": "^4.0.0" + } + }, + "node_modules/it-parallel-batch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/it-parallel-batch/-/it-parallel-batch-3.0.4.tgz", + "integrity": "sha512-O1omh8ss8+UtXiMjE+8kM5C20DT0Ma4VtKVfrSHOJU0UHZ+iWBXarabzPYEp+WiuQmrv+klDPPlTZ9KaLN9xOA==", + "dependencies": { + "it-batch": "^3.0.0" + } + }, + "node_modules/it-peekable": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/it-peekable/-/it-peekable-3.0.3.tgz", + "integrity": "sha512-Wx21JX/rMzTEl9flx3DGHuPV1KQFGOl8uoKfQtmZHgPQtGb89eQ6RyVd82h3HuP9Ghpt0WgBDlmmdWeHXqyx7w==" + }, + "node_modules/it-pipe": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/it-pipe/-/it-pipe-3.0.1.tgz", + "integrity": "sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==", + "dependencies": { + "it-merge": "^3.0.0", + "it-pushable": "^3.1.2", + "it-stream-types": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/it-pushable": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.2.3.tgz", + "integrity": "sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==", + "dependencies": { + "p-defer": "^4.0.0" + } + }, + "node_modules/it-stream-types": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.1.tgz", + "integrity": "sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg==", + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/jsbi": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-4.3.0.tgz", + "integrity": "sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/k-bucket": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/k-bucket/-/k-bucket-5.1.0.tgz", + "integrity": "sha512-Fac7iINEovXIWU20GPnOMLUbjctiS+cnmyjC4zAUgvs3XPf1vo9akfCHkigftSic/jiKqKl+KA3a/vFcJbHyCg==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/k-rpc": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/k-rpc/-/k-rpc-5.1.0.tgz", + "integrity": "sha512-FGc+n70Hcjoa/X2JTwP+jMIOpBz+pkRffHnSl9yrYiwUxg3FIgD50+u1ePfJUOnRCnx6pbjmVk5aAeB1wIijuQ==", + "dependencies": { + "k-bucket": "^5.0.0", + "k-rpc-socket": "^1.7.2", + "randombytes": "^2.0.5" + } + }, + "node_modules/k-rpc-socket": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/k-rpc-socket/-/k-rpc-socket-1.11.1.tgz", + "integrity": "sha512-8xtA8oqbZ6v1Niryp2/g4GxW16EQh5MvrUylQoOG+zcrDff5CKttON2XUXvMwlIHq4/2zfPVFiinAccJ+WhxoA==", + "dependencies": { + "bencode": "^2.0.0", + "chrome-dgram": "^3.0.2", + "chrome-dns": "^1.0.0", + "chrome-net": "^3.3.2" + } + }, + "node_modules/k-rpc-socket/node_modules/bencode": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bencode/-/bencode-2.0.3.tgz", + "integrity": "sha512-D/vrAD4dLVX23NalHwb8dSvsUsxeRPO8Y7ToKA015JQYq69MLDOMkC0uGZYA/MPpltLO8rt8eqFC2j8DxjTZ/w==" + }, + "node_modules/last-one-wins": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/last-one-wins/-/last-one-wins-1.0.4.tgz", + "integrity": "sha512-t+KLJFkHPQk8lfN6WBOiGkiUXoub+gnb2XTYI2P3aiISL+94xgZ1vgz1SXN/N4hthuOoLXarXfBZPUruyjQtfA==" + }, + "node_modules/layerr": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layerr/-/layerr-2.0.1.tgz", + "integrity": "sha512-z0730CwG/JO24evdORnyDkwG1Q7b7mF2Tp1qRQ0YvrMMARbt1DFG694SOv439Gm7hYKolyZyaB49YIrYIfZBdg==" + }, + "node_modules/level": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", + "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", + "dependencies": { + "browser-level": "^1.0.1", + "classic-level": "^1.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/level" + } + }, + "node_modules/level-supports": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", + "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/level-transcoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", + "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", + "dependencies": { + "buffer": "^6.0.3", + "module-error": "^1.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lru": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lru/-/lru-3.1.0.tgz", + "integrity": "sha512-5OUtoiVIGU4VXBOshidmtOsvBIvcQR6FD/RzWSvaeHyxCGB+PCUCu+52lqMfdc0h/2CLvHhZS4TwUmMQrrMbBQ==", + "dependencies": { + "inherits": "^2.0.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/lru-cache": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz", + "integrity": "sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/module-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", + "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/multibase": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.6.tgz", + "integrity": "sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "@multiformats/base-x": "^4.0.1" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=6.0.0" + } + }, + "node_modules/multiformats": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz", + "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==", + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/multihashes": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.3.tgz", + "integrity": "sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA==", + "dependencies": { + "multibase": "^4.0.1", + "uint8arrays": "^3.0.0", + "varint": "^5.0.2" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=6.0.0" + } + }, + "node_modules/multihashes/node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + }, + "node_modules/multihashes/node_modules/uint8arrays": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", + "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", + "dependencies": { + "multiformats": "^9.4.2" + } + }, + "node_modules/multihashes/node_modules/varint": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", + "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" + }, + "node_modules/murmurhash3js-revisited": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz", + "integrity": "sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/nanoassert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", + "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==" + }, + "node_modules/napi-macros": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", + "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp-build": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.7.1.tgz", + "integrity": "sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/p-defer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-4.0.0.tgz", + "integrity": "sha512-Vb3QRvQ0Y5XnF40ZUWW7JfLogicVh/EnA5gBIvKDJoYpeI82+1E3AlB9yOcKFS0AhHrWVnAQO39fbR0G99IVEQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.4.1.tgz", + "integrity": "sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^5.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkarr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pkarr/-/pkarr-1.1.1.tgz", + "integrity": "sha512-X27LKqf83X3WuJd2Z9qdfVxkmfOu6HUbY0pm11LqeBbFmgmZRPgOxJG8bKiIsmmD6Vjc25j45KHYflF2lfodyQ==", + "dependencies": { + "bencode": "^3.0.3", + "bittorrent-dht": "^11.0.4", + "chalk": "^5.2.0", + "dns-packet": "^5.6.1", + "graceful-goodbye": "^1.3.0", + "sodium-universal": "^4.0.0", + "z32": "^1.0.0" + }, + "bin": { + "pkarr": "bin.js" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/progress-events": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/progress-events/-/progress-events-1.0.0.tgz", + "integrity": "sha512-zIB6QDrSbPfRg+33FZalluFIowkbV5Xh1xSuetjG+rlC5he6u2dc6VQJ0TbMdlN3R1RHdpOqxEFMKTnQ+itUwA==", + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/protons-runtime": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-5.2.1.tgz", + "integrity": "sha512-Rt4ORm1WR62ysrXX5sCV32a5jPwVoIpU90XUzrdAfMIOSNTizvqlx/7wedNpogvZjUUY/gLJp3VftpA+ebx/og==", + "dependencies": { + "uint8arraylist": "^2.4.3", + "uint8arrays": "^5.0.1" + } + }, + "node_modules/protons-runtime/node_modules/multiformats": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.0.0.tgz", + "integrity": "sha512-xiIB0p7EKmETm3wyKedOg/xuyQ18PoWwXCzzgpZAiDxL9ktl3XTh8AqoDT5kAqRg+DU48XAGPsUJL2Rn6Bx3Lw==" + }, + "node_modules/protons-runtime/node_modules/uint8arrays": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.0.1.tgz", + "integrity": "sha512-ND5RpJAnPgHmZT7hWD/2T4BwRp04j8NLKvMKC/7bhiEwEjUMkQ4kvBKiH6hOqbljd6qJ2xS8reL3vl1e33grOQ==", + "dependencies": { + "multiformats": "^13.0.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/rabin-wasm": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/rabin-wasm/-/rabin-wasm-0.1.5.tgz", + "integrity": "sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA==", + "dependencies": { + "@assemblyscript/loader": "^0.9.4", + "bl": "^5.0.0", + "debug": "^4.3.1", + "minimist": "^1.2.5", + "node-fetch": "^2.6.1", + "readable-stream": "^3.6.0" + }, + "bin": { + "rabin-wasm": "cli/bin.js" + } + }, + "node_modules/rabin-wasm/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readable-stream": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/readable-web-to-node-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/record-cache": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/record-cache/-/record-cache-1.2.0.tgz", + "integrity": "sha512-kyy3HWCez2WrotaL3O4fTn0rsIdfRKOdQQcEJ9KpvmKmbffKVvwsloX063EgRUlpJIXHiDQFhJcTbZequ2uTZw==", + "dependencies": { + "b4a": "^1.3.1" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/run-parallel-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", + "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/run-series": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz", + "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safety-catch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/safety-catch/-/safety-catch-1.0.2.tgz", + "integrity": "sha512-C1UYVZ4dtbBxEtvOcpjBaaD27nP8MlvyAQEp2fOTOEe6pfUpk1cDUxij6BR1jZup6rSyUTaBBplK7LanskrULA==" + }, + "node_modules/sha256-universal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sha256-universal/-/sha256-universal-1.2.1.tgz", + "integrity": "sha512-ghn3muhdn1ailCQqqceNxRgkOeZSVfSE13RQWEg6njB+itsFzGVSJv+O//2hvNXZuxVIRyNzrgsZ37SPDdGJJw==", + "dependencies": { + "b4a": "^1.0.1", + "sha256-wasm": "^2.2.1" + } + }, + "node_modules/sha256-wasm": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/sha256-wasm/-/sha256-wasm-2.2.2.tgz", + "integrity": "sha512-qKSGARvao+JQlFiA+sjJZhJ/61gmW/3aNLblB2rsgIxDlDxsJPHo8a1seXj12oKtuHVgJSJJ7QEGBUYQN741lQ==", + "dependencies": { + "b4a": "^1.0.1", + "nanoassert": "^2.0.0" + } + }, + "node_modules/sha512-universal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sha512-universal/-/sha512-universal-1.2.1.tgz", + "integrity": "sha512-kehYuigMoRkIngCv7rhgruLJNNHDnitGTBdkcYbCbooL8Cidj/bS78MDxByIjcc69M915WxcQTgZetZ1JbeQTQ==", + "dependencies": { + "b4a": "^1.0.1", + "sha512-wasm": "^2.3.1" + } + }, + "node_modules/sha512-wasm": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/sha512-wasm/-/sha512-wasm-2.3.4.tgz", + "integrity": "sha512-akWoxJPGCB3aZCrZ+fm6VIFhJ/p8idBv7AWGFng/CZIrQo51oQNsvDbTSRXWAzIiZJvpy16oIDiCCPqTe21sKg==", + "dependencies": { + "b4a": "^1.0.1", + "nanoassert": "^2.0.0" + } + }, + "node_modules/siphash24": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/siphash24/-/siphash24-1.3.1.tgz", + "integrity": "sha512-moemC3ZKiTzH29nbFo3Iw8fbemWWod4vNs/WgKbQ54oEs6mE6XVlguxvinYjB+UmaE0PThgyED9fUkWvirT8hA==", + "dependencies": { + "nanoassert": "^2.0.0" + } + }, + "node_modules/sodium-javascript": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/sodium-javascript/-/sodium-javascript-0.8.0.tgz", + "integrity": "sha512-rEBzR5mPxPES+UjyMDvKPIXy9ImF17KOJ32nJNi9uIquWpS/nfj+h6m05J5yLJaGXjgM72LmQoUbWZVxh/rmGg==", + "dependencies": { + "blake2b": "^2.1.1", + "chacha20-universal": "^1.0.4", + "nanoassert": "^2.0.0", + "sha256-universal": "^1.1.0", + "sha512-universal": "^1.1.0", + "siphash24": "^1.0.1", + "xsalsa20": "^1.0.0" + } + }, + "node_modules/sodium-native": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.0.4.tgz", + "integrity": "sha512-faqOKw4WQKK7r/ybn6Lqo1F9+L5T6NlBJJYvpxbZPetpWylUVqz449mvlwIBKBqxEHbWakWuOlUt8J3Qpc4sWw==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.6.0" + } + }, + "node_modules/sodium-universal": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-4.0.0.tgz", + "integrity": "sha512-iKHl8XnBV96k1c75gwwzANFdephw/MDWSjQAjPmBE+du0y3P23Q8uf7AcdcfFsYAMwLg7WVBfSAIBtV/JvRsjA==", + "dependencies": { + "blake2b": "^2.1.1", + "chacha20-universal": "^1.0.4", + "nanoassert": "^2.0.0", + "sha256-universal": "^1.1.0", + "sha512-universal": "^1.1.0", + "siphash24": "^1.0.1", + "sodium-javascript": "~0.8.0", + "sodium-native": "^4.0.0", + "xsalsa20": "^1.0.0" + } + }, + "node_modules/sparse-array": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/sparse-array/-/sparse-array-1.3.2.tgz", + "integrity": "sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg==" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/true-myth": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/true-myth/-/true-myth-5.4.0.tgz", + "integrity": "sha512-MonJqkJf+VOXZ2msbpvAI1uJWoyfCN7nirR8/fNK+IlFDWYNLb9iqeAc2uhIbAQBynHtM02azZgepQDQclOwAw==", + "engines": { + "node": "12.* || 14.* || 16.* || >= 18.*" + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/tsx": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.0.tgz", + "integrity": "sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==", + "dev": true, + "dependencies": { + "esbuild": "~0.19.10", + "get-tsconfig": "^4.7.2" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uint8-util": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/uint8-util/-/uint8-util-2.2.4.tgz", + "integrity": "sha512-uEI5lLozmKQPYEevfEhP9LY3Je5ZmrQhaWXrzTVqrLNQl36xsRh8NiAxYwB9J+2BAt99TRbmCkROQB2ZKhx4UA==", + "dependencies": { + "base64-arraybuffer": "^1.0.2" + } + }, + "node_modules/uint8arraylist": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.4.8.tgz", + "integrity": "sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==", + "dependencies": { + "uint8arrays": "^5.0.1" + } + }, + "node_modules/uint8arraylist/node_modules/multiformats": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.0.0.tgz", + "integrity": "sha512-xiIB0p7EKmETm3wyKedOg/xuyQ18PoWwXCzzgpZAiDxL9ktl3XTh8AqoDT5kAqRg+DU48XAGPsUJL2Rn6Bx3Lw==" + }, + "node_modules/uint8arraylist/node_modules/uint8arrays": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.0.1.tgz", + "integrity": "sha512-ND5RpJAnPgHmZT7hWD/2T4BwRp04j8NLKvMKC/7bhiEwEjUMkQ4kvBKiH6hOqbljd6qJ2xS8reL3vl1e33grOQ==", + "dependencies": { + "multiformats": "^13.0.0" + } + }, + "node_modules/uint8arrays": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.10.tgz", + "integrity": "sha512-AnJNUGGDJAgFw/eWu/Xb9zrVKEGlwJJCaeInlf3BkecE/zcTobk5YXYIPNQJO1q5Hh1QZrQQHf0JvcHqz2hqoA==", + "dependencies": { + "multiformats": "^12.0.1" + } + }, + "node_modules/uint8arrays/node_modules/multiformats": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz", + "integrity": "sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==", + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/ulidx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ulidx/-/ulidx-2.1.0.tgz", + "integrity": "sha512-DlMi97oP9HASI3kLCjBlOhAG1SoisUrEqC2PJ7itiFbq9q5Zo0JejupXeu2Gke99W62epNzA4MFNToNiq8A5LA==", + "dependencies": { + "layerr": "^2.0.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/xsalsa20": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/xsalsa20/-/xsalsa20-1.2.0.tgz", + "integrity": "sha512-FIr/DEeoHfj7ftfylnoFt3rAIRoWXpx2AoDfrT2qD2wtp7Dp+COajvs/Icb7uHqRW9m60f5iXZwdsJJO3kvb7w==" + }, + "node_modules/z32": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/z32/-/z32-1.0.1.tgz", + "integrity": "sha512-Uytfqf6VEVchHKZDw0NRdCViOARHP84uzvOw0CXCMLOwhgHZUL9XibpEPLLQN10mCVLxOlGCQWbkV7km7yNYcw==", + "dependencies": { + "b4a": "^1.5.3" + } + }, + "node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/server/src/app.ts b/server/src/app.ts index 82f695f..9344854 100644 --- a/server/src/app.ts +++ b/server/src/app.ts @@ -22,6 +22,7 @@ const app = new Hono() if (res.isErr) return c.json({ error: res.error }) + // @ts-ignore const conditions = res.value.filter(record => record.condition === condition) return c.json(conditions) }) diff --git a/server/src/utils.ts b/server/src/utils.ts index 6460426..4a9c280 100644 --- a/server/src/utils.ts +++ b/server/src/utils.ts @@ -1,5 +1,6 @@ import { Web5 } from "@web5/api"; import ConditionsProtocol, { type Record, did as ConditionsProtocolDID } from "@frontend/utils/protocols/conditions" +// @ts-ignore import Result, { ok, err } from "true-myth/result" export type Agent = { @@ -12,6 +13,7 @@ export type Status = { detail: string, } +// @ts-ignore export async function configureProtocol(agent: Agent): Promise> { const { protocols } = await agent.web5.dwn.protocols.query({ message: { @@ -47,6 +49,7 @@ export async function configureProtocol(agent: Agent): Promise> { const { records, status } = await agent.web5.dwn.records.query({ from: ConditionsProtocolDID, @@ -56,6 +59,7 @@ export async function fetchConditions(agent: Agent): Promise { const { web5, did } = await Web5.connect({ sync: "5s", diff --git a/tauri-app/package-lock.json b/tauri-app/package-lock.json index c747970..e01b1d3 100644 --- a/tauri-app/package-lock.json +++ b/tauri-app/package-lock.json @@ -19,6 +19,7 @@ "axios": "^1.6.3", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", + "hono": "^3.12.0", "lodash": "^4.17.21", "lucide-react": "^0.298.0", "react": "^18.2.0", @@ -3509,6 +3510,14 @@ "node": ">= 0.4" } }, + "node_modules/hono": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/hono/-/hono-3.12.0.tgz", + "integrity": "sha512-UPEtZuLY7Wo7g0mqKWSOjLFdT8t7wJ60IYEcxKl3AQNU4u+R2QqU2fJMPmSu24C+/ag20Z8mOTQOErZzK4DMvA==", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", diff --git a/tauri-app/src/components/RemedyCard/index.tsx b/tauri-app/src/components/RemedyCard/index.tsx index e271b75..234198c 100644 --- a/tauri-app/src/components/RemedyCard/index.tsx +++ b/tauri-app/src/components/RemedyCard/index.tsx @@ -1,5 +1,6 @@ import "./index.css"; +// @ts-ignore const Rating = ({ rating }) => { return (
    @@ -42,6 +43,7 @@ const Rating = ({ rating }) => { ); }; +// @ts-ignore const createRatingsIcons = (ratings) => { const icons = []; for (let n = 0; n < ratings; n++) { @@ -51,12 +53,19 @@ const createRatingsIcons = (ratings) => { return icons; }; + const index = ({ + // @ts-ignore title, + // @ts-ignore coverIMGUrl, + // @ts-ignore desc_snippet, + // @ts-ignore created_by, + // @ts-ignore rating, + // @ts-ignore isClicked, }) => { return ( diff --git a/tauri-app/src/pages/Contact/index.tsx b/tauri-app/src/pages/Contact/index.tsx index 4c07599..d37ad95 100644 --- a/tauri-app/src/pages/Contact/index.tsx +++ b/tauri-app/src/pages/Contact/index.tsx @@ -5,7 +5,7 @@ interface RowProp { name: String; address: String; city: String; - distance: Number; + distance: string; } const RowComponent: FC = ({ name, address, city, distance }) => { @@ -33,19 +33,19 @@ const index: FC = () => { name: "Hopsital", address: "No 4 Dress road", city: "Kumkubaga", - distance: 47, + distance: '47', }, { name: "Hopsital", address: "No 4 Dress road", city: "Kumkubaga", - distance: 47, + distance: '47', }, { name: "Hopsital", address: "No 4 Dress road", city: "Kumkubaga", - distance: 47, + distance: '47', }, ]); return ( diff --git a/tauri-app/src/pages/Records/index.tsx b/tauri-app/src/pages/Records/index.tsx index 9a61790..d95d177 100644 --- a/tauri-app/src/pages/Records/index.tsx +++ b/tauri-app/src/pages/Records/index.tsx @@ -54,6 +54,7 @@ const index = () => { const [isCardDetailActive, setIsCardDetailActive] = useState(false); const [activeCard, setActiveCard] = useState(null); + // @ts-ignore const isCardClicked = (cardDetail) => { setIsCardDetailActive(!isCardDetailActive); setIsAddCardActive(false); @@ -79,6 +80,7 @@ const index = () => { { {isAddCardActive && } {isCardDetailActive && ( diff --git a/tauri-app/src/pages/Remedies/index.tsx b/tauri-app/src/pages/Remedies/index.tsx index 627b7c6..8045d24 100644 --- a/tauri-app/src/pages/Remedies/index.tsx +++ b/tauri-app/src/pages/Remedies/index.tsx @@ -1,7 +1,7 @@ import "./index.css"; import { useState } from "react"; -import Ratings from "../../../components/Ratings/"; +import Ratings from "../../components/Ratings"; import RemedyCard from "../../components/RemedyCard/"; import AddRemedyComponent from "../../components/AddRemedyComponent/"; @@ -47,6 +47,7 @@ const index = () => { const [isDetailRemedyActive, setIsDetailRemedyActive] = useState(false); const [activeRemedy, setActiveRemedy] = useState(null); + // @ts-ignore const remedyClicked = (remedyDetail) => { setActiveRemedy(remedyDetail); setIsDetailRemedyActive(true); @@ -56,12 +57,16 @@ const index = () => { const Rate = () => { if (!isRated) { setActiveRemedy({ + // @ts-ignore ...activeRemedy, + // @ts-ignore rating: activeRemedy.rating + 1, }); } else { setActiveRemedy({ + // @ts-ignore ...activeRemedy, + // @ts-ignore rating: activeRemedy.rating - 1, }); } @@ -104,6 +109,7 @@ const index = () => {
    {
    Rate()} className="rd-container"> - {activeRemedy.rating} + {// @ts-ignore + activeRemedy.rating}
    -

    {activeRemedy.title}

    +

    {// @ts-ignore + activeRemedy.title}

    -

    {activeRemedy.desc}

    - {activeRemedy.steps && +

    { + // @ts-ignore + activeRemedy.desc}

    + {// @ts-ignore + activeRemedy.steps && + // @ts-ignore activeRemedy.steps.map((step, indx) => { return (
    From d7908030837d856a9647912a2b6c3cef6cfcebd1 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 11:41:06 +0000 Subject: [PATCH 040/136] trying something out with the docs schema --- tauri-app/src/utils/document.ts | 58 +++++++++++++++++++++++ tauri-app/src/utils/protocols/document.ts | 5 +- 2 files changed, 60 insertions(+), 3 deletions(-) diff --git a/tauri-app/src/utils/document.ts b/tauri-app/src/utils/document.ts index e69de29..58f6970 100644 --- a/tauri-app/src/utils/document.ts +++ b/tauri-app/src/utils/document.ts @@ -0,0 +1,58 @@ +import { Record, Web5 } from "@web5/api/browser" +import DocumentProtocol from "./protocols/document"; + +type Agent = { + web5: Web5 + did: string +} + +type DocumentSchema = typeof DocumentProtocol["types"][keyof typeof DocumentProtocol["types"]]["schema"] + +type FilterObj = { + schema?: DocumentSchema +} + +async function fetchDocumentRecords(agent: Agent, filter?: FilterObj) { + const { records } = await agent.web5.dwn.records.query({ + message: { + filter: { + ...filter, + protocol: DocumentProtocol.protocol, + }, + // @ts-ignore + dateSort: "createdAscending", + }, + }); + + if (!records) return false + + return records +} + +async function createRecord() { + const docs = []; + for (const record of records) { + const data = await record.data.json(); + docs.push({ + record, + data, + id: record.id + }); + } + + setDocuments(docs); +} + +async function createBlobRecord(web5: Web5, file: File) { + const { record: uploadedRecord } = await web5.dwn.records.create({ + data: new Blob([file], { type: file.type }), + message: { + schema: DocumentProtocol.types.blob.schema, + protocol: DocumentProtocol.protocol + } + }) + + if (!uploadedRecord) return false + + return uploadedRecord +} diff --git a/tauri-app/src/utils/protocols/document.ts b/tauri-app/src/utils/protocols/document.ts index e4a148b..ce134ca 100644 --- a/tauri-app/src/utils/protocols/document.ts +++ b/tauri-app/src/utils/protocols/document.ts @@ -11,7 +11,7 @@ const DocumentProtocol = { blob: { schema: "https://dschema.org/protocols/document/schemas/blob.json", dataFormats: [ - "application/json" + "application/binary" ] } }, @@ -36,13 +36,12 @@ const DocumentProtocol = { }, { who: "author", - of: "parentId", can: "write" } ] } } -} +} as const export namespace Record { export type File = Blob From 326a9e699811359549718ec0111a37c7889eb1f7 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Fri, 5 Jan 2024 13:27:32 +0100 Subject: [PATCH 041/136] added contact link to nav --- tauri-app/src/components/MobileNavbar/index.tsx | 6 ++++++ tauri-app/src/components/Navbar/index.tsx | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/tauri-app/src/components/MobileNavbar/index.tsx b/tauri-app/src/components/MobileNavbar/index.tsx index 8fd49dd..bf5ec08 100644 --- a/tauri-app/src/components/MobileNavbar/index.tsx +++ b/tauri-app/src/components/MobileNavbar/index.tsx @@ -31,6 +31,12 @@ const index = () => { 99+
    + +
    + +

    Contact

    +
    +
    ); }; diff --git a/tauri-app/src/components/Navbar/index.tsx b/tauri-app/src/components/Navbar/index.tsx index 306f248..dbdee85 100644 --- a/tauri-app/src/components/Navbar/index.tsx +++ b/tauri-app/src/components/Navbar/index.tsx @@ -36,6 +36,12 @@ const index = () => { 99+
    + +
    + +

    Contact

    +
    +

    Join us!

    From e1a644c57dfea7480f430c928874981282eae4be Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Fri, 5 Jan 2024 14:29:43 +0100 Subject: [PATCH 042/136] landing page ficed --- tauri-app/src/pages/Home/index.css | 5 ++--- tauri-app/src/pages/Home/index.tsx | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/tauri-app/src/pages/Home/index.css b/tauri-app/src/pages/Home/index.css index 991884d..1016240 100644 --- a/tauri-app/src/pages/Home/index.css +++ b/tauri-app/src/pages/Home/index.css @@ -21,13 +21,13 @@ margin: 20px 0px; } -.header { +#header { font-family: "Roboto"; font-size: 20px; font-weight: 500; } -.header b { +#header b { font-family: "Pacifico"; text-transform: capitalize; color: var(--color-blue); @@ -150,7 +150,6 @@ } @keyframes morphBorder { - 0%, 100% { border-radius: 70% 30% 41% 59% / 47% 73% 27% 53%; diff --git a/tauri-app/src/pages/Home/index.tsx b/tauri-app/src/pages/Home/index.tsx index 45fb46d..0e8f03e 100644 --- a/tauri-app/src/pages/Home/index.tsx +++ b/tauri-app/src/pages/Home/index.tsx @@ -6,7 +6,7 @@ export default function HomePage() {
    - + Hi welcome to, pulsePal From f7fd39c174801c8646e44b1cd4a8c97aac0093d2 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Fri, 5 Jan 2024 15:14:50 +0100 Subject: [PATCH 043/136] fix add card modal padding --- .../src/components/AddCardComponent/index.css | 33 +++++++++++++++---- .../src/components/AddCardComponent/index.tsx | 2 +- .../components/AddRemedyComponent/index.css | 8 ++--- .../components/AddRemedyComponent/index.tsx | 2 +- .../components/DetailCardComponent/index.css | 21 ++++++++++-- 5 files changed, 51 insertions(+), 15 deletions(-) diff --git a/tauri-app/src/components/AddCardComponent/index.css b/tauri-app/src/components/AddCardComponent/index.css index 62a2e57..a10a401 100644 --- a/tauri-app/src/components/AddCardComponent/index.css +++ b/tauri-app/src/components/AddCardComponent/index.css @@ -1,7 +1,7 @@ .main-add-card-container { background: var(--color-white); width: 500px; - min-height: 300px; + max-height: 600px; position: relative; z-index: 7; border-radius: 15px; @@ -21,6 +21,25 @@ justify-content: space-between; align-items: center; flex-direction: column; + padding: 10px; + overflow-y: scroll; + min-height: 300px; +} + +.input-form::-webkit-scrollbar { + width: 6px; +} + +.input-form::-webkit-scrollbar-track { + box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.1); + border-radius: 5px; +} + +.input-form::-webkit-scrollbar-thumb { + width: 2px; + background: var(--color-blue); + border-radius: 5px; + margin: 0 3px; } .input-form input[type="text"] { @@ -74,9 +93,9 @@ border: 2px solid var(--color-blue); border-style: dashed; border-radius: 15px; - width: 100%; - height: 100px; - margin: 15px 0; + width: 90%; + min-height: 60px; + margin: 15px; display: flex; justify-content: center; align-items: center; @@ -86,9 +105,9 @@ .form-container-active { border: 2px solid var(--color-green); border-radius: 15px; - width: 100%; - height: 100px; - margin: 15px 0; + width: 90%; + min-height: 60px; + margin: 15px; display: flex; justify-content: center; align-items: center; diff --git a/tauri-app/src/components/AddCardComponent/index.tsx b/tauri-app/src/components/AddCardComponent/index.tsx index 3da12d8..9e324bd 100644 --- a/tauri-app/src/components/AddCardComponent/index.tsx +++ b/tauri-app/src/components/AddCardComponent/index.tsx @@ -9,7 +9,7 @@ const FileUploader = () => { const [file, setFile] = useState({ file: null }); return ( -
    +
    { setFile({ file: e?.target?.files?.[0] }); diff --git a/tauri-app/src/components/AddRemedyComponent/index.css b/tauri-app/src/components/AddRemedyComponent/index.css index 6d610f5..13c1aa5 100644 --- a/tauri-app/src/components/AddRemedyComponent/index.css +++ b/tauri-app/src/components/AddRemedyComponent/index.css @@ -29,7 +29,7 @@ flex-direction: column; overflow-y: scroll; overflow-x: hidden; - max-height: 300px; + height: 400px; } .input-form::-webkit-scrollbar { @@ -101,7 +101,7 @@ border-style: dashed; border-radius: 15px; width: 100%; - height: 100px; + min-height: 60px; margin: 15px 0; display: flex; justify-content: center; @@ -113,7 +113,7 @@ border: 2px solid var(--color-green); border-radius: 15px; width: 100%; - height: 100px; + min-height: 60px; margin: 15px 0; display: flex; justify-content: center; @@ -167,7 +167,7 @@ } .uploader-content { - width: 100%; + width: 90%; } @media (max-width: 750px) { diff --git a/tauri-app/src/components/AddRemedyComponent/index.tsx b/tauri-app/src/components/AddRemedyComponent/index.tsx index 31d8dc4..323808c 100644 --- a/tauri-app/src/components/AddRemedyComponent/index.tsx +++ b/tauri-app/src/components/AddRemedyComponent/index.tsx @@ -9,7 +9,7 @@ const FileUploader: FC = () => { const [file, setFile] = useState({ file: null }); return ( -
    +
    { setFile({ file: e?.target?.files?.[0] }); diff --git a/tauri-app/src/components/DetailCardComponent/index.css b/tauri-app/src/components/DetailCardComponent/index.css index 093fbff..e93f6dd 100644 --- a/tauri-app/src/components/DetailCardComponent/index.css +++ b/tauri-app/src/components/DetailCardComponent/index.css @@ -1,12 +1,11 @@ .main-detail-container { width: 500px; - min-height: 450px; + max-height: 600px; background: var(--color-white); padding: var(--padding-desktop); border-radius: 15px; position: relative; margin-top: 20px; - overflow-y: scroll; } .main-detail-container h1 { @@ -24,6 +23,24 @@ .main-detail-container p { margin: 20px 0; font-family: "Open Sans"; + max-height: 300px; + overflow-y: scroll; +} + +.main-detail-container::-webkit-scrollbar { + width: 6px; +} + +.main-detail-container::-webkit-scrollbar-track { + box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.1); + border-radius: 5px; +} + +.main-detail-container::-webkit-scrollbar-thumb { + width: 2px; + background: var(--color-blue); + border-radius: 5px; + margin: 0 3px; } .close-btn { From 521207eb47b9de63522542fa9c017ec599c9074b Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 14:54:26 +0000 Subject: [PATCH 044/136] updated the protocol --- tauri-app/src/stores/useWeb5Store.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tauri-app/src/stores/useWeb5Store.ts b/tauri-app/src/stores/useWeb5Store.ts index 9f0a7a9..ba32509 100644 --- a/tauri-app/src/stores/useWeb5Store.ts +++ b/tauri-app/src/stores/useWeb5Store.ts @@ -1,6 +1,7 @@ import { Web5 } from "@web5/api/browser"; import { create } from "zustand"; import ConditionsProtocol from "@/utils/protocols/conditions"; +import DocumentProtocol from "@/utils/protocols/document"; interface Web5State { web5: Web5 | null; @@ -68,7 +69,7 @@ const useWeb5Store = create((set, get) => ({ // configure protocol on local DWN const { protocol, status: protocolConfigurationStatus } = await web5.dwn.protocols.configure({ message: { - definition: p, + definition: Object.assign(p), }, }); if (!protocol) { @@ -202,4 +203,4 @@ export const schemaOrgProtocolDefinition = { }, }; -const protocols = [schemaOrgProtocolDefinition, ConditionsProtocol]; +const protocols = [schemaOrgProtocolDefinition, ConditionsProtocol, DocumentProtocol]; From 6eba629e49187d095bd4c44abd6cc08dbf57c830 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 14:54:32 +0000 Subject: [PATCH 045/136] updated the medic page --- tauri-app/src/pages/medic.tsx | 99 ++++++++++++++++++----------------- 1 file changed, 50 insertions(+), 49 deletions(-) diff --git a/tauri-app/src/pages/medic.tsx b/tauri-app/src/pages/medic.tsx index 9ae13ff..b732166 100644 --- a/tauri-app/src/pages/medic.tsx +++ b/tauri-app/src/pages/medic.tsx @@ -1,6 +1,9 @@ import { FunctionComponent, useEffect, useState } from "react"; -import useWeb5Store from "@/stores/useWeb5Store"; -import { useDocuments } from "@/stores/useDocuments"; +import useWeb5Store from "@/stores/useWeb5Store"; +import DocumentUtils from "@/utils/document"; +import { Record as DocumentRecord } from "@/utils/protocols/document"; +import { Record as Web5Record } from "@web5/api/browser"; +import AuthGuard from "@/components/Auth/Guard"; const possibleConditions = [ "Cancer", @@ -11,55 +14,46 @@ const possibleConditions = [ "Mental Illness", ] -const MedicPage: FunctionComponent = () => { - const { web5, did } = useWeb5Store((state) => ({ web5: state.web5!, did: state.did! })) - const { fetchDocuments, documents, createDocument, getDocumentFile } = useDocuments(web5, did) - const [docsWithImageUrls, setDocsWithImageUrls] = useState<{ - document: typeof documents[0], - url: string - }[]>([]) - - const [form, setForm] = useState<{ - name: string - doc: File, - condition: string - }>({ +const Page: FunctionComponent = () => { + const agent = useWeb5Store((state) => ({ web5: state.web5!, did: state.did! })) + const [documentsWithUrl, setDocumentsWithUrl] = useState<{ document: DocumentRecord.Document, fileUrl: string, record: Web5Record }[]>([]) + const [form, setForm] = useState({ name: "", - doc: new File([], ""), - condition: "" + file: new File([], ""), + condition: possibleConditions[0] }) useEffect(() => { - if (web5) { - fetchDocuments() - } - }, [web5]) - - async function processDocsImage() { - const docsWithImageUrls: { document: typeof documents[0], url: string }[] = [] - - for (const doc of documents) { - const file = await getDocumentFile(doc) - let url = "" - if (file) - url = URL.createObjectURL(file) - - docsWithImageUrls.push({ - document: doc, - url - }) - } - - setDocsWithImageUrls(docsWithImageUrls) - } - - useEffect(() => { - processDocsImage() - }, [documents]) + (async () => { + const docRecords = await DocumentUtils.fetchDocumentRecords(agent) + if (!docRecords) { + console.log("Failed to fetch document records") + return + } + + const docsWithUrl = [] + for (const docRecord of docRecords) { + const data: DocumentRecord.Document = await docRecord.data.json() + const fileRecord = await DocumentUtils.fetchBlobRecord(agent, data.url) + + if (!fileRecord) + continue + + const file = new File([await fileRecord.data.blob()], data.name, { type: data.encodingFormat }) + + docsWithUrl.push({ + record: docRecord, + document: data, + fileUrl: URL.createObjectURL(file), + }) + } + + setDocumentsWithUrl(docsWithUrl) + })() + }, []) const saveMedicalRecord = async () => { - console.log(form) - const res = await createDocument({ name: form.name ? form.name : undefined, file: form.doc, condition: form.condition }) + const res = await DocumentUtils.createDocumentRecord(agent, form) if (res) { alert(`Medical record saved: ${res}`) @@ -69,8 +63,6 @@ const MedicPage: FunctionComponent = () => { } } - console.log(documents) - return (
    { @@ -96,7 +88,7 @@ const MedicPage: FunctionComponent = () => { setForm({ ...form, - doc: file + file: file }) }} placeholder="Document" /> @@ -105,6 +97,7 @@ const MedicPage: FunctionComponent = () => {
    diff --git a/tauri-app/src/components/UserProfile/index.css b/tauri-app/src/components/UserProfile/index.css new file mode 100644 index 0000000..2c3dd37 --- /dev/null +++ b/tauri-app/src/components/UserProfile/index.css @@ -0,0 +1,55 @@ +.userprofile-container { + box-shadow: var(--box-shadow-black); + width: 200px; + text-align: center; + border-radius: 15px; + padding: 8px 12px; + position: relative; +} + +.userprofile-info-container img { + width: 80px; + height: 80px; + border-radius: 50%; + background: var(--color-white); + padding: 10px; + position: absolute; + top: 80px; + left: 50%; + transform: translateX(-50%); +} + +.userprofile-info-container p { + font-family: "Open Sans"; + margin-top: 40px; +} + +.cover-container { + height: 130px; + border-radius: 15px; + text-align: left; +} + +.cover-container h3 { + color: var(--color-white); + font-family: "Roboto"; + font-size: 18px; + position: relative; + left: 6px; + top: 10px; +} + +.cover-container p { + color: var(--color-white); + font-family: "Open Sans"; + font-size: 14px; + position: relative; + left: 6px; + top: 15px; +} + +@media (max-width: 750px) { + .userprofile-container { + width: 100%; + } +} diff --git a/tauri-app/src/components/UserProfile/index.tsx b/tauri-app/src/components/UserProfile/index.tsx new file mode 100644 index 0000000..59c87f0 --- /dev/null +++ b/tauri-app/src/components/UserProfile/index.tsx @@ -0,0 +1,42 @@ +import React, { FC } from "react"; + +import "./index.css"; + +interface UserProfileProps { + username: String; + profile_pic: String; + cover_pic: String; + about_user: String; + friends: Number; +} +const index: FC = ({ + username, + profile_pic, + cover_pic, + about_user, + friends, +}) => { + return ( +
    +
    +

    @{username}

    +

    + Friends | {friends} +

    +
    +
    + +

    {about_user}

    +
    +
    + ); +}; + +export default index; diff --git a/tauri-app/src/pages/Chat/index.css b/tauri-app/src/pages/Chat/index.css index e69de29..322a4e5 100644 --- a/tauri-app/src/pages/Chat/index.css +++ b/tauri-app/src/pages/Chat/index.css @@ -0,0 +1,12 @@ +.main-chat-container { + padding: var(--padding-desktop); + display: flex; + justify-content: center; + align-items: center; +} + +@media (max-width: 750px) { + .main-chat-container { + padding: var(--padding-mobile); + } +} diff --git a/tauri-app/src/pages/Chat/index.tsx b/tauri-app/src/pages/Chat/index.tsx index ab8d90e..89b5b1f 100644 --- a/tauri-app/src/pages/Chat/index.tsx +++ b/tauri-app/src/pages/Chat/index.tsx @@ -1,9 +1,18 @@ import "./index.css"; +import UserProfile from "../../components/UserProfile/"; -const index= () => { +const index = () => { return ( -
    -

    Chat Page

    +
    +
    ); }; From 2e416aacb1a371fc422eef09b23c0bd336ad37f4 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 19:29:46 +0000 Subject: [PATCH 055/136] updated the protocol defs --- tauri-app/src/utils/document.ts | 2 + tauri-app/src/utils/medical-document.ts | 206 ------------------------ tauri-app/src/utils/protocols/defns.ts | 2 +- tauri-app/src/utils/protocols/user.ts | 2 + tauri-app/src/utils/user.ts | 180 +++++++++++++++++++++ 5 files changed, 185 insertions(+), 207 deletions(-) delete mode 100644 tauri-app/src/utils/medical-document.ts create mode 100644 tauri-app/src/utils/user.ts diff --git a/tauri-app/src/utils/document.ts b/tauri-app/src/utils/document.ts index 01c36de..7ffa21d 100644 --- a/tauri-app/src/utils/document.ts +++ b/tauri-app/src/utils/document.ts @@ -238,6 +238,8 @@ const DocumentUtils = { fetchDocumentRecords, updateDocumentRecord, createDocumentRecord, + createBlobRecord, + updateBlobRecord, fetchBlobRecord, } diff --git a/tauri-app/src/utils/medical-document.ts b/tauri-app/src/utils/medical-document.ts deleted file mode 100644 index 7296af3..0000000 --- a/tauri-app/src/utils/medical-document.ts +++ /dev/null @@ -1,206 +0,0 @@ -import { Record as Web5Record, Web5 } from "@web5/api" - -export namespace MedicalRecord { - export type NullFlavor = "253|unknown|" | "271|no information|" | "272|masked|" | "273|not applicable|" - - export type QuantityComment = { - "@type": "DV_TEXT", - value: string - } - - export type QuantityMagnitude = { - "@type": "DV_MAGNITUDE", - magnitude: number, - unit: string, - comment?: string - } - - type Quantity = QuantityMagnitude | QuantityComment - - export type Element = { - "@type": "ELEMENT", - name: string, - value: Quantity - } & ({ - null_flavor?: NullFlavor, - null_reason?: string - } | { - null_flavor: NullFlavor, - null_reason: string - }) - - export type ItemSingle = { - "@type": "ITEM_SINGLE", - item: Element - } - - export type ItemList = { - "@type": "ITEM_LIST", - items: Item[] - } - - export type Item = ItemSingle | ItemList - - export type HistoryEvent = { - "@type": "EVENT", - time: Date, - state: Item - } - - export type History = { - "@type": "HISTORY", - origin?: Date, - period?: Date, - duration?: Date, - events: HistoryEvent[] - } - - export type Document = { - history?: History, - comment?: string - } -} - -export function createQuantityMagnitude(quantity: Omit): MedicalRecord.QuantityMagnitude { - return { - ...quantity, - "@type": "DV_MAGNITUDE" - } -} - -export function createQuantityComment(quantity: Omit): MedicalRecord.QuantityComment { - return { - ...quantity, - "@type": "DV_TEXT" - } -} - - -export function createItem(element: Omit): MedicalRecord.ItemSingle { - return { - "@type": "ITEM_SINGLE", - item: { - ...element, - "@type": "ELEMENT" - } - } -} - -export class MedicalDocument { - declare private _web5: Web5 - declare private _protocol: string - private _id: string | undefined = undefined - declare private _history: MedicalRecord.History - private _comment: string | undefined = "" - declare private _record: Web5Record - - constructor(web5: Web5, protocol: string, doc?: MedicalRecord.Document & { id: string }) { - this._web5 = web5 - this._protocol = protocol - - this._history = { - "@type": "HISTORY", - events: [] - } - - if (doc) { - if (doc.history) - this._history = doc.history - this._comment = doc.comment - this._id = doc.id - } - } - - setHistory(payload: { origin?: Date, period?: Date, duration?: Date }) { - this._history = { - '@type': 'HISTORY', - origin: payload.origin, - period: payload.period, - duration: payload.duration, - events: [] - } - } - - addHistoryEvent(payload: { time: Date, state: MedicalRecord.Item }) { - this._history.events.push({ - "@type": "EVENT", - time: payload.time, - state: payload.state - }) - - return this._history.events.length - 1 - } - - set comment(comment: string | undefined) { - this._comment = comment - } - - get comment() { - return this._comment - } - - static async getById(web5: Web5, protocol: string, id: string) { - const { records } = await web5.dwn.records.query({ - message: { - filter: { - recordId: id, - protocol - } - } - }) - - if (!records) - return null - - const firstRecordResponse = records[0] - if (!firstRecordResponse) - return null - - const medicalRecord: MedicalRecord.Document = await firstRecordResponse.data.json() - - return new MedicalDocument(web5, protocol, Object.assign(medicalRecord, { id })) - } - - async save(): Promise { - let record: Web5Record | undefined = undefined - - if (this._id) { - const res = await this._record.update({ - data: { - history: this._history, - comment: this._comment - } - }) - - if (res.status.code === 200) - return this._id - - return false - } - - const res = await this._web5.dwn.records.create({ - data: { - "@context": "https://schema.org", - "@type": "MEDICAL_RECORD", - history: this._history, - comment: this._comment - }, - message: { - schema: "https://schema.org/Person", - dataFormat: "application/json", - protocol: this._protocol, - protocolPath: "person", - }, - }) - - record = res.record - console.log(res) - - if (!record) - return false - - this._id = record.id - - return record.id - } -} diff --git a/tauri-app/src/utils/protocols/defns.ts b/tauri-app/src/utils/protocols/defns.ts index 9a68b17..89846ca 100644 --- a/tauri-app/src/utils/protocols/defns.ts +++ b/tauri-app/src/utils/protocols/defns.ts @@ -1 +1 @@ -export const url = "https://dschema.org/v0.0.1" as const +export const url = "https://dschema.org/v0.0.2" as const diff --git a/tauri-app/src/utils/protocols/user.ts b/tauri-app/src/utils/protocols/user.ts index fd61a66..afbc382 100644 --- a/tauri-app/src/utils/protocols/user.ts +++ b/tauri-app/src/utils/protocols/user.ts @@ -17,6 +17,7 @@ const UserDetailsProtocol = { $actions: [ { who: "author", + of: "details", can: "read" }, { @@ -33,6 +34,7 @@ export namespace Record { firstName: string lastName: string profilePictureUrl: string + dateCreated: string } } diff --git a/tauri-app/src/utils/user.ts b/tauri-app/src/utils/user.ts new file mode 100644 index 0000000..44a53a2 --- /dev/null +++ b/tauri-app/src/utils/user.ts @@ -0,0 +1,180 @@ +import { Web5, Record as Web5Record } from "@web5/api/browser" +import UserDetailsProtocol, { Record as UserDetailsProtocolRecord, did as UserDetailsProtocolDID } from "./protocols/user"; +import DocumentUtils from "./document"; +import _ from "lodash"; + +type Agent = { + web5: Web5 + did: string +} + +type FilterObj = { + recordId: string, +} + +type Type = keyof typeof UserDetailsProtocol["types"] +type Schema = typeof UserDetailsProtocol["types"][T]["schema"] +type DataFormat = typeof UserDetailsProtocol["types"][T]["dataFormats"][number] + +type FullFilterObj = { + protocolPath: T + schema: Schema +} + +type FullMessageObj = { + schema: Schema + protocolPath: T + dataFormat: DataFormat + published: typeof UserDetailsProtocol["published"] +} + +async function createRecord(agent: Agent, data: UserDetailsProtocolRecord.Details, message: FullMessageObj) { + const { record, status } = await agent.web5.dwn.records.create({ + data, + message: Object.assign({ + ...message, + protocol: UserDetailsProtocol.protocol, + }) + }); + + if (!record) { + console.error("Failed to create record:", status) + return false + } + + const { status: syncStatus } = await record.send(UserDetailsProtocolDID) + + if (syncStatus.code !== 202) { + console.log("Failed to sync record with remote DWN:", syncStatus) + } + + return record +} + +async function fetchRecords(agent: Agent, filter: FullFilterObj) { + const { records, status } = await agent.web5.dwn.records.query({ + from: UserDetailsProtocolDID, + message: { + filter: { + ...filter, + protocol: UserDetailsProtocol.protocol, + }, + // @ts-ignore + dateSort: "createdAscending", + }, + }); + + if (!records) { + console.log("Failed to fetch records:", status) + return false + } + return records +} + +async function fetchUserDetailsRecord(agent: Agent) { + const records = await fetchRecords(agent, { + schema: UserDetailsProtocol.types.details.schema, + protocolPath: "details", + }) + + if (!records || !records[0]) return false + + return records[0] +} + +async function fetchUserDetailsRecords(agent: Agent) { + return fetchRecords(agent, { + protocolPath: "details", + schema: UserDetailsProtocol.types.details.schema, + }) +} + +type UpdatePayload = Partial<{ + firstName: string + lastName: string + profilePicture: File +}> + +async function updateUserDetailsRecord(agent: Agent, idOrRecord: string | Web5Record, payload: Partial) { + let record: Web5Record + + if (typeof idOrRecord === "string") { + const fetchedRecord = await fetchUserDetailsRecord(agent, { recordId: idOrRecord }) + + if (!fetchedRecord) return false + + record = fetchedRecord + } + else { + record = idOrRecord + } + + const data: UserDetailsProtocolRecord.Details = await record.data.json() + const { profilePicture, ...restPayload } = payload + + let url = data.profilePictureUrl + if (profilePicture) { + const blobRecord = await DocumentUtils.updateBlobRecord(agent, url, profilePicture) + if (!blobRecord) return false + + url = blobRecord.id + } + + const { status } = await record.update({ + data: _.merge(data, Object.assign(restPayload, { url })) + }) + + if (status.code !== 202) { + console.log("Failed to sync document record update with remote DWN:", status) + return false + } + + return record +} + +type CreatePayload = { + firstName: string + lastName: string + profilePicture: File, +} +async function createUserDetailsRecord(agent: Agent, payload: CreatePayload) { + const existingRecord = await fetchUserDetailsRecord(agent) + if (existingRecord) { + console.error("User details record already exists") + return false + } + + const blobRecord = await DocumentUtils.createBlobRecord(agent, payload.profilePicture) + if (!blobRecord) return false + + const { profilePicture, ...restPayload } = payload + + const record = await createRecord( + agent, + { + ...restPayload, + profilePictureUrl: blobRecord.id, + dateCreated: new Date().toISOString() + }, + { + schema: UserDetailsProtocol.types.details.schema, + protocolPath: "details", + dataFormat: UserDetailsProtocol.types.details.dataFormats[0], + published: UserDetailsProtocol.published, + }) + + if (!record) { + console.error("Failed to create document record") + return false + } + + return record +} + +const UserDetailsUtils = { + fetchUserDetailsRecord, + updateUserDetailsRecord, + createUserDetailsRecord, +} + +export default UserDetailsUtils From 336689b1e060f21843d37784156660e70007bc8b Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 19:29:53 +0000 Subject: [PATCH 056/136] added new components for the auth --- .../src/components/Auth/Account/Guard.tsx | 18 ++++++++++++++++++ tauri-app/src/components/Navbar/index.tsx | 16 ++++++++++++---- 2 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 tauri-app/src/components/Auth/Account/Guard.tsx diff --git a/tauri-app/src/components/Auth/Account/Guard.tsx b/tauri-app/src/components/Auth/Account/Guard.tsx new file mode 100644 index 0000000..c558411 --- /dev/null +++ b/tauri-app/src/components/Auth/Account/Guard.tsx @@ -0,0 +1,18 @@ +import { PropsWithChildren, ReactNode } from "react"; +import AuthGuard from "../Guard"; +import { useProfile } from "@/stores/profile"; + +const Guard = ({ children, fallback }: PropsWithChildren & { fallback?: ReactNode }) => { + const isSignedIn = useProfile(state => state.state.isSignedIn) + + if (!isSignedIn) + return <>{fallback} ?? null + + return <>{children} +} + +export default function AccountGuard(props: PropsWithChildren & { fallback?: ReactNode }) { + return + + +} diff --git a/tauri-app/src/components/Navbar/index.tsx b/tauri-app/src/components/Navbar/index.tsx index dbdee85..71fc31e 100644 --- a/tauri-app/src/components/Navbar/index.tsx +++ b/tauri-app/src/components/Navbar/index.tsx @@ -1,3 +1,4 @@ +import AccountGuard from "../Auth/Account/Guard"; import "./index.css"; import { NavLink } from "react-router-dom"; @@ -43,10 +44,17 @@ const index = () => {
    -
    -

    Join us!

    - -
    + +

    Join us!

    + +
    + }> +
    +

    Profile

    + +
    +
    ); }; From 3e86282f6f0dafcd8667b9c4676241b8593edecb Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 19:30:00 +0000 Subject: [PATCH 057/136] added a new profile store --- tauri-app/src/stores/profile.ts | 77 +++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 tauri-app/src/stores/profile.ts diff --git a/tauri-app/src/stores/profile.ts b/tauri-app/src/stores/profile.ts new file mode 100644 index 0000000..df439f2 --- /dev/null +++ b/tauri-app/src/stores/profile.ts @@ -0,0 +1,77 @@ +import { create } from "zustand" +import { combine } from "zustand/middleware"; +import { Record as UserDetailsProtocolRecord } from "@/utils/protocols/user"; +import { Agent } from "@/components/Auth/types"; +import UserDetailsUtils from "@/utils/user"; +import DocumentUtils from "@/utils/document"; + +type State = { + profile: { + firstName: string, + lastName: string, + profilePictureUrl: string + }, + isSignedIn: true +} | { + profile: null, + isSignedIn: false +} + +type Payload = { + firstName: string, + lastName: string, + profilePicture: File +} + +export const useProfile = create( + combine({ + state: { + profile: null, + isSignedIn: false + } as State + }, (set, get) => ({ + signOut: () => { + if (get().state.isSignedIn) { + set({ + state: { + isSignedIn: false, + profile: null + } + }) + } + }, + signIn: async (agent: Agent) => { + const profileRecord = await UserDetailsUtils.fetchUserDetailsRecord(agent) + if (!profileRecord) return false + + const profile: UserDetailsProtocolRecord.Details = await profileRecord.data.json() + console.log(profile) + + const profilePicture = await DocumentUtils.fetchBlobRecord(agent, profile.profilePictureUrl) + let profilePictureUrl = "" + if (profilePicture) { + const profilePictureBlob = await profilePicture.data.blob() + profilePictureUrl = URL.createObjectURL(profilePictureBlob) + } + + set({ + state: { + isSignedIn: true, + profile: { + firstName: profile.firstName, + lastName: profile.lastName, + profilePictureUrl + } + } + }) + + return true + }, + signUp: async (agent: Agent, payload: Payload) => { + const profile = await UserDetailsUtils.createUserDetailsRecord(agent, payload) + if (!profile) return false + + return true + } + })) +) From 8253b5d277a3d1629a420898a637fe5ca22cd19e Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 19:30:15 +0000 Subject: [PATCH 058/136] updated the es version on the server --- server/tsconfig.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/tsconfig.json b/server/tsconfig.json index b77ecc0..880f229 100644 --- a/server/tsconfig.json +++ b/server/tsconfig.json @@ -5,6 +5,7 @@ "noImplicitAny": true, "noFallthroughCasesInSwitch": true, "module": "CommonJS", + "target": "ES2020", "baseUrl": ".", "paths": { "@backend/*": ["./src/*"], @@ -12,7 +13,7 @@ } }, "include": [ - "server.ts", + "*.ts", "./src/**/*.ts" ], "exclude": [ From 6e07780dcb36ca11498922e45f4d8cb3c01e3095 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Fri, 5 Jan 2024 22:04:33 +0100 Subject: [PATCH 059/136] fixed some bugs again --- tauri-app/src/components/AddCardComponent/index.css | 3 ++- tauri-app/src/components/AddRemedyComponent/index.css | 3 ++- tauri-app/src/components/Navbar/index.css | 2 +- tauri-app/src/pages/Remedies/index.css | 1 + 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tauri-app/src/components/AddCardComponent/index.css b/tauri-app/src/components/AddCardComponent/index.css index a10a401..e82047b 100644 --- a/tauri-app/src/components/AddCardComponent/index.css +++ b/tauri-app/src/components/AddCardComponent/index.css @@ -23,7 +23,8 @@ flex-direction: column; padding: 10px; overflow-y: scroll; - min-height: 300px; + overflow-x: hidden; + max-height: 300px; } .input-form::-webkit-scrollbar { diff --git a/tauri-app/src/components/AddRemedyComponent/index.css b/tauri-app/src/components/AddRemedyComponent/index.css index b2ba7cd..47a106b 100644 --- a/tauri-app/src/components/AddRemedyComponent/index.css +++ b/tauri-app/src/components/AddRemedyComponent/index.css @@ -29,7 +29,8 @@ flex-direction: column; padding: 10px; overflow-y: scroll; - height: 300px; + overflow-x: hidden; + max-height: 300px; } .input-form-r::-webkit-scrollbar { diff --git a/tauri-app/src/components/Navbar/index.css b/tauri-app/src/components/Navbar/index.css index 9ec3d00..056aa0b 100644 --- a/tauri-app/src/components/Navbar/index.css +++ b/tauri-app/src/components/Navbar/index.css @@ -7,7 +7,7 @@ position: sticky; top: 0; background: var(--color-white); - z-index: 8; + z-index: 10; } .logo_container { diff --git a/tauri-app/src/pages/Remedies/index.css b/tauri-app/src/pages/Remedies/index.css index 52d4931..483959e 100644 --- a/tauri-app/src/pages/Remedies/index.css +++ b/tauri-app/src/pages/Remedies/index.css @@ -69,6 +69,7 @@ justify-content: center; align-items: center; z-index: 6; + margin-top: 30px; } .active-remedy-container { From 457d3a51acd732746f2609d617a2df65b417746b Mon Sep 17 00:00:00 2001 From: coder12git Date: Sat, 6 Jan 2024 08:18:50 +0530 Subject: [PATCH 060/136] integrated remedy Signed-off-by: coder12git --- tauri-app/src/App.tsx | 2 - .../components/AddRemedyComponent/index.tsx | 46 +++++----- tauri-app/src/components/Navbar/index.tsx | 2 +- tauri-app/src/components/RemedyCard/index.tsx | 14 ++- tauri-app/src/pages/Remedies/index.tsx | 89 ++++++++++--------- tauri-app/src/pages/remedy.tsx | 75 ++++++++++------ tauri-app/src/stores/useRemedy.ts | 10 ++- 7 files changed, 133 insertions(+), 105 deletions(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index 043b4b3..3035450 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -9,7 +9,6 @@ import Doctors from "./pages/nearbyDoctor"; import HomePage from "./pages/Home"; import SharedLayout from "./pages/SharedLayout/"; import Records from "./pages/Records"; -import Remedies from "./pages/Remedies"; import Chat from "./pages/Chat/"; import Contact from "./pages/Contact/"; @@ -20,7 +19,6 @@ const router = createHashRouter([ children: [ { path: "/", element: }, { path: "/records", element: }, - { path: "/remedies", element: }, { path: "/connect", element: }, { path: "/remedy", element: }, { path: "/medic", element: }, diff --git a/tauri-app/src/components/AddRemedyComponent/index.tsx b/tauri-app/src/components/AddRemedyComponent/index.tsx index 323808c..9d00665 100644 --- a/tauri-app/src/components/AddRemedyComponent/index.tsx +++ b/tauri-app/src/components/AddRemedyComponent/index.tsx @@ -1,5 +1,6 @@ import "./index.css"; import React, { FC, useState } from "react"; +import Remedies from '../../pages/Remedies' interface FileProp { file: File | null | undefined; @@ -37,7 +38,8 @@ const StepField: FC = ({ index }) => { ); }; -const index: FC = () => { +//@ts-ignore +const index: FC = ({saveFunc, formFunc, form}) => { const [steps, setSteps] = useState([ , ]); @@ -45,29 +47,29 @@ const index: FC = () => { return (

    Create New Remedy

    - + {/* */} + { + e.preventDefault() + saveFunc() + }} + >
    - - -
    -
    - setSteps([...steps, ]) - } - > - -
    - {steps.map((Field) => { - return Field; - })} -
    - -

    - *ensure inputted information are correct as once saved it cannot be - deleted/edited -

    + formFunc({ ...form, name: e.target.value })} + /> + + + +
    +
    + )}
    ); diff --git a/tauri-app/src/pages/Remedies/index.css b/tauri-app/src/pages/Remedies/index.css index 483959e..e39bc8a 100644 --- a/tauri-app/src/pages/Remedies/index.css +++ b/tauri-app/src/pages/Remedies/index.css @@ -33,7 +33,7 @@ align-items: center; border-radius: 50%; cursor: pointer; - z-index: 8; + z-index: 9; } .close-add-records-btn { @@ -48,7 +48,7 @@ align-items: center; border-radius: 50%; cursor: pointer; - z-index: 8; + z-index: 9; transform: rotate(45deg); transition: 0.3s; } @@ -69,7 +69,7 @@ justify-content: center; align-items: center; z-index: 6; - margin-top: 30px; + margin-top: 40px; } .active-remedy-container { diff --git a/tauri-app/src/stores/pulseGlobalStore.ts b/tauri-app/src/stores/pulseGlobalStore.ts new file mode 100644 index 0000000..069b0b7 --- /dev/null +++ b/tauri-app/src/stores/pulseGlobalStore.ts @@ -0,0 +1,13 @@ +import { create } from "zustand"; + +type PulseGlobalStore = { + isAuthBtnClicked: boolean; + toggleIsAuthBtnClicked: () => void; +}; + +export const usePulseGlobalStore = create((set) => ({ + isAuthBtnClicked: true, + toggleIsAuthBtnClicked: () => { + set((state) => ({ isAuthBtnClicked: !state.isAuthBtnClicked })); + }, +})); From 7b6bf959963f896b6c9f2691723bd5bbe1261b97 Mon Sep 17 00:00:00 2001 From: coder12git Date: Sat, 6 Jan 2024 19:03:10 +0530 Subject: [PATCH 070/136] fixed remedy bug Signed-off-by: coder12git --- tauri-app/src/components/RemedyCard/index.tsx | 4 ++-- tauri-app/src/pages/Remedies/index.tsx | 12 ++++++------ tauri-app/src/pages/remedy.tsx | 2 +- tauri-app/src/stores/useRemedy.ts | 1 + 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/tauri-app/src/components/RemedyCard/index.tsx b/tauri-app/src/components/RemedyCard/index.tsx index 4acf880..0144f85 100644 --- a/tauri-app/src/components/RemedyCard/index.tsx +++ b/tauri-app/src/components/RemedyCard/index.tsx @@ -60,7 +60,7 @@ const index = ({ // @ts-ignore description, // @ts-ignore - created_by, url, + created_by, useUrl, // @ts-ignore rating, // @ts-ignore @@ -70,7 +70,7 @@ const index = ({
    { description: "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat...", desc: "Lorem ipsum dolor sit amet, officia excepteur ex fugiat reprehenderit enim labore culpa sint ad nisi Lorem pariatur mollit ex esse exercitation amet. Nisi anim cupidatat excepteur officia. Reprehenderit nostrud nostrud ipsum Lorem est aliquip amet voluptate voluptate dolor minim nulla est proident. Nostrud officia pariatur ut officia. Sit irure elit esse ea nulla sunt ex occaecat reprehenderit commodo officia dolor Lorem duis laboris cupidatat officia voluptate. Culpa proident adipisicing id nulla nisi laboris ex in Lorem sunt duis officia eiusmod. Aliqua reprehenderit commodo ex non excepteur duis sunt velit enim. Voluptate laboris sint cupidatat ullamco ut ea consectetur et est culpa et culpa duis.", - url: "/pg.jpg", + useUrl: "/pg.jpg", rating: '1.5', created_by: "draky", // steps: [ @@ -31,7 +31,7 @@ const index = ({save, formFunc, form, remediesData, docsWithImageUrls}) => { name: "Aloe Vera Eczema Fix", description: "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat...", - url: "/pg.jpg", + useUrl: "/pg.jpg", rating: '4', created_by: "dave", }, @@ -39,7 +39,7 @@ const index = ({save, formFunc, form, remediesData, docsWithImageUrls}) => { name: "Asthma Breathing Exercises", description: "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat...", - url: "/pg.jpg", + useUrl: "/pg.jpg", rating: '3.5', created_by: "nikki", }, @@ -105,7 +105,7 @@ const index = ({save, formFunc, form, remediesData, docsWithImageUrls}) => { { { className="rimg-container" style={{ // @ts-ignore - background: `url(/pg.jpg)`, + background: `url(${activeRemedy.useUrl})`, backgroundPosition: "center", backgroundSize: "cover", }} diff --git a/tauri-app/src/pages/remedy.tsx b/tauri-app/src/pages/remedy.tsx index 7fb9f6f..eb39b90 100644 --- a/tauri-app/src/pages/remedy.tsx +++ b/tauri-app/src/pages/remedy.tsx @@ -57,7 +57,7 @@ const Remedy: FunctionComponent = () => { if (file) url = URL.createObjectURL(file) console.log(url); - + doc.data.useUrl=url docsWithImageUrls.push({ document: doc, url diff --git a/tauri-app/src/stores/useRemedy.ts b/tauri-app/src/stores/useRemedy.ts index 4170818..8e5199e 100644 --- a/tauri-app/src/stores/useRemedy.ts +++ b/tauri-app/src/stores/useRemedy.ts @@ -9,6 +9,7 @@ export type Remedy = { name: string; description: string; created_by: string; + useUrl: string; encodingFormat: string; size: string; url: string; From 891f92544bdfe3749fc08aa83d1b597ce143c119 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Sat, 6 Jan 2024 14:48:37 +0100 Subject: [PATCH 071/136] fixed buttin z-index --- tauri-app/src/App.tsx | 4 +- tauri-app/src/components/RemedyCard/index.tsx | 2 +- tauri-app/src/pages/Remedies/index.css | 4 +- tauri-app/src/pages/Remedies/index.tsx | 75 +++++++++++-------- 4 files changed, 50 insertions(+), 35 deletions(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index 28269fe..ff8e222 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -35,7 +35,9 @@ function App() { if (!web5) connect(); }, []); - return <>{web5 ? :
    Connecting...
    }; + return ( + <>{true ? :
    Connecting...
    } + ); } export default App; diff --git a/tauri-app/src/components/RemedyCard/index.tsx b/tauri-app/src/components/RemedyCard/index.tsx index 5110d2c..79e6422 100644 --- a/tauri-app/src/components/RemedyCard/index.tsx +++ b/tauri-app/src/components/RemedyCard/index.tsx @@ -45,7 +45,7 @@ const index = ({
    -

    {desc_snippet.slice(0, 150) + "..."}

    +

    {description.substring(0, 150) + "..."}

    diff --git a/tauri-app/src/pages/Remedies/index.css b/tauri-app/src/pages/Remedies/index.css index e39bc8a..cffe86d 100644 --- a/tauri-app/src/pages/Remedies/index.css +++ b/tauri-app/src/pages/Remedies/index.css @@ -33,7 +33,7 @@ align-items: center; border-radius: 50%; cursor: pointer; - z-index: 9; + z-index: 8; } .close-add-records-btn { @@ -48,7 +48,7 @@ align-items: center; border-radius: 50%; cursor: pointer; - z-index: 9; + z-index: 8; transform: rotate(45deg); transition: 0.3s; } diff --git a/tauri-app/src/pages/Remedies/index.tsx b/tauri-app/src/pages/Remedies/index.tsx index e6fdc4c..c4ca609 100644 --- a/tauri-app/src/pages/Remedies/index.tsx +++ b/tauri-app/src/pages/Remedies/index.tsx @@ -6,7 +6,7 @@ import RemedyCard from "../../components/RemedyCard/"; import AddRemedyComponent from "../../components/AddRemedyComponent/"; import Remedy from "../remedy"; //@ts-ignore -const index = ({save, formFunc, form, remediesData, docsWithImageUrls}) => { +const index = ({ save, formFunc, form, remediesData, docsWithImageUrls }) => { const [remedies, setRemedies] = useState([ { name: "Lavendar Scalp Treament", @@ -14,7 +14,7 @@ const index = ({save, formFunc, form, remediesData, docsWithImageUrls}) => { "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat...", desc: "Lorem ipsum dolor sit amet, officia excepteur ex fugiat reprehenderit enim labore culpa sint ad nisi Lorem pariatur mollit ex esse exercitation amet. Nisi anim cupidatat excepteur officia. Reprehenderit nostrud nostrud ipsum Lorem est aliquip amet voluptate voluptate dolor minim nulla est proident. Nostrud officia pariatur ut officia. Sit irure elit esse ea nulla sunt ex occaecat reprehenderit commodo officia dolor Lorem duis laboris cupidatat officia voluptate. Culpa proident adipisicing id nulla nisi laboris ex in Lorem sunt duis officia eiusmod. Aliqua reprehenderit commodo ex non excepteur duis sunt velit enim. Voluptate laboris sint cupidatat ullamco ut ea consectetur et est culpa et culpa duis.", useUrl: "/pg.jpg", - rating: '1.5', + rating: "1.5", created_by: "draky", // steps: [ // { @@ -32,7 +32,7 @@ const index = ({save, formFunc, form, remediesData, docsWithImageUrls}) => { description: "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat...", useUrl: "/pg.jpg", - rating: '4', + rating: "4", created_by: "dave", }, { @@ -40,7 +40,7 @@ const index = ({save, formFunc, form, remediesData, docsWithImageUrls}) => { description: "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat...", useUrl: "/pg.jpg", - rating: '3.5', + rating: "3.5", created_by: "nikki", }, ]); @@ -48,7 +48,7 @@ const index = ({save, formFunc, form, remediesData, docsWithImageUrls}) => { const [isDetailRemedyActive, setIsDetailRemedyActive] = useState(false); const [activeRemedy, setActiveRemedy] = useState(null); - const url = ''; + const url = ""; // @ts-ignore const remedyClicked = (remedyDetail) => { setActiveRemedy(remedyDetail); @@ -113,22 +113,23 @@ const index = ({save, formFunc, form, remediesData, docsWithImageUrls}) => { ); })} - {/* Remedy Created by user */} - {//@ts-ignore - docsWithImageUrls.map(({document, url}) => { - return ( - - ); - })} + { + //@ts-ignore + docsWithImageUrls.map(({ document, url }) => { + return ( + + ); + }) + }
    {isDetailRemedyActive && (
    @@ -162,21 +163,30 @@ const index = ({save, formFunc, form, remediesData, docsWithImageUrls}) => {
    Rate()} className="rd-container"> - {// @ts-ignore - activeRemedy.rating} + { + // @ts-ignore + activeRemedy.rating + }
    -

    {// @ts-ignore - activeRemedy.name}

    +

    + { + // @ts-ignore + activeRemedy.name + }{" "} +

    -

    { - // @ts-ignore - activeRemedy.description}

    +

    + { + // @ts-ignore + activeRemedy.description + } +

    @@ -185,11 +195,14 @@ const index = ({save, formFunc, form, remediesData, docsWithImageUrls}) => { {isAddRemedyActive && (
    - +
    )}
    From 261b68cb0667a279a189833e3757632ee4522611 Mon Sep 17 00:00:00 2001 From: coder12git Date: Sat, 6 Jan 2024 22:57:53 +0530 Subject: [PATCH 072/136] fix text overflow in remedy Signed-off-by: coder12git --- tauri-app/src/components/RemedyCard/index.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tauri-app/src/components/RemedyCard/index.tsx b/tauri-app/src/components/RemedyCard/index.tsx index 79e6422..32ae41e 100644 --- a/tauri-app/src/components/RemedyCard/index.tsx +++ b/tauri-app/src/components/RemedyCard/index.tsx @@ -16,8 +16,7 @@ const index = ({ // @ts-ignore description, // @ts-ignore - created_by, - url, + created_by, useUrl, // @ts-ignore rating, // @ts-ignore @@ -27,7 +26,7 @@ const index = ({
    -

    {description.substring(0, 150) + "..."}

    +

    {description.substring(0,50) + "..."}

    From ca7c7028fdc9edf220abc4f61c76177e91f3436e Mon Sep 17 00:00:00 2001 From: coder12git Date: Sat, 6 Jan 2024 23:14:02 +0530 Subject: [PATCH 073/136] Revert "fix text overflow in remedy" This reverts commit 261b68cb0667a279a189833e3757632ee4522611. --- tauri-app/src/components/RemedyCard/index.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tauri-app/src/components/RemedyCard/index.tsx b/tauri-app/src/components/RemedyCard/index.tsx index 32ae41e..79e6422 100644 --- a/tauri-app/src/components/RemedyCard/index.tsx +++ b/tauri-app/src/components/RemedyCard/index.tsx @@ -16,7 +16,8 @@ const index = ({ // @ts-ignore description, // @ts-ignore - created_by, useUrl, + created_by, + url, // @ts-ignore rating, // @ts-ignore @@ -26,7 +27,7 @@ const index = ({
    -

    {description.substring(0,50) + "..."}

    +

    {description.substring(0, 150) + "..."}

    From d14636da7853f14601bdd49c075eaed236d7262d Mon Sep 17 00:00:00 2001 From: coder12git Date: Sat, 6 Jan 2024 23:18:59 +0530 Subject: [PATCH 074/136] changes Signed-off-by: coder12git --- tauri-app/src/App.tsx | 2 +- tauri-app/src/components/RemedyCard/index.tsx | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index ff8e222..de7a969 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -36,7 +36,7 @@ function App() { }, []); return ( - <>{true ? :
    Connecting...
    } + <>{web5 ? :
    Connecting...
    } ); } diff --git a/tauri-app/src/components/RemedyCard/index.tsx b/tauri-app/src/components/RemedyCard/index.tsx index 79e6422..21709a2 100644 --- a/tauri-app/src/components/RemedyCard/index.tsx +++ b/tauri-app/src/components/RemedyCard/index.tsx @@ -16,8 +16,7 @@ const index = ({ // @ts-ignore description, // @ts-ignore - created_by, - url, + created_by, useUrl, // @ts-ignore rating, // @ts-ignore @@ -27,7 +26,7 @@ const index = ({
    -

    {description.substring(0, 150) + "..."}

    +

    {description.substring(0, 50) + "..."}

    From 98d192bfcd014689aa635c968563cd74d19ac632 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sat, 6 Jan 2024 21:37:03 +0000 Subject: [PATCH 075/136] updated the protocol schema --- tauri-app/src/utils/protocols/defns.ts | 2 +- tauri-app/src/utils/protocols/document.ts | 6 ++---- tauri-app/src/utils/protocols/index.ts | 4 ++-- tauri-app/src/utils/protocols/user.ts | 3 +-- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/tauri-app/src/utils/protocols/defns.ts b/tauri-app/src/utils/protocols/defns.ts index 89846ca..a634369 100644 --- a/tauri-app/src/utils/protocols/defns.ts +++ b/tauri-app/src/utils/protocols/defns.ts @@ -1 +1 @@ -export const url = "https://dschema.org/v0.0.2" as const +export const url = "https://dschema.org/v0.0.5" as const diff --git a/tauri-app/src/utils/protocols/document.ts b/tauri-app/src/utils/protocols/document.ts index eddff20..c1b6883 100644 --- a/tauri-app/src/utils/protocols/document.ts +++ b/tauri-app/src/utils/protocols/document.ts @@ -29,8 +29,7 @@ const DocumentProtocol = { can: "read" }, { - who: "author", - of: "document", + who: "anyone", can: "write" } ] @@ -42,8 +41,7 @@ const DocumentProtocol = { can: "read" }, { - who: "author", - of: "blob", + who: "anyone", can: "write" } ] diff --git a/tauri-app/src/utils/protocols/index.ts b/tauri-app/src/utils/protocols/index.ts index ce802f2..1c0a671 100644 --- a/tauri-app/src/utils/protocols/index.ts +++ b/tauri-app/src/utils/protocols/index.ts @@ -4,6 +4,6 @@ import UserDetailsProtocol from "./user" export const protocols = [ DocumentProtocol, - UserDetailsProtocol - // ConditionsProtocol, + UserDetailsProtocol, + ConditionsProtocol, ] diff --git a/tauri-app/src/utils/protocols/user.ts b/tauri-app/src/utils/protocols/user.ts index 7402ca6..227b09f 100644 --- a/tauri-app/src/utils/protocols/user.ts +++ b/tauri-app/src/utils/protocols/user.ts @@ -16,8 +16,7 @@ const UserDetailsProtocol = { details: { $actions: [ { - who: "author", - of: "details", + who: "anyone", can: "read" }, { From 300e87740a5cc44d3471ac4bf925aaf691bd6b2c Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sat, 6 Jan 2024 21:37:23 +0000 Subject: [PATCH 076/136] integrated auth --- tauri-app/package.json | 1 + tauri-app/src/App.tsx | 9 +- .../src/components/Auth/Profile/Guard.tsx | 10 +- tauri-app/src/components/Navbar/index.css | 5 + tauri-app/src/components/Navbar/index.tsx | 37 +++-- tauri-app/src/pages/Home/SignUpForm.tsx | 142 ++++++++++++++++++ tauri-app/src/pages/Home/index.tsx | 58 ++----- tauri-app/src/stores/profile.ts | 7 +- tauri-app/src/stores/pulseGlobalStore.ts | 10 +- tauri-app/src/stores/useWeb5Store.ts | 3 - 10 files changed, 211 insertions(+), 71 deletions(-) create mode 100644 tauri-app/src/pages/Home/SignUpForm.tsx diff --git a/tauri-app/package.json b/tauri-app/package.json index 39b4c47..ff5225a 100644 --- a/tauri-app/package.json +++ b/tauri-app/package.json @@ -29,6 +29,7 @@ "react-dropzone": "^14.2.3", "react-easy-crop": "^5.0.4", "react-hook-form": "^7.49.2", + "react-hot-toast": "^2.4.1", "react-pdf": "^7.6.0", "react-router-dom": "^6.21.1", "react-spinners": "^0.13.8", diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index de7a969..77b379a 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -9,6 +9,7 @@ import HomePage from "./pages/Home"; import SharedLayout from "./pages/SharedLayout/"; import Records from "./pages/Records"; import Chat from "./pages/Chat/"; +import { Toaster } from "react-hot-toast"; const router = createHashRouter([ { @@ -36,7 +37,13 @@ function App() { }, []); return ( - <>{web5 ? :
    Connecting...
    } + <> + <>{web5 ? :
    Connecting...
    } + + ); } diff --git a/tauri-app/src/components/Auth/Profile/Guard.tsx b/tauri-app/src/components/Auth/Profile/Guard.tsx index d36719a..b20e4e8 100644 --- a/tauri-app/src/components/Auth/Profile/Guard.tsx +++ b/tauri-app/src/components/Auth/Profile/Guard.tsx @@ -1,9 +1,15 @@ -import { PropsWithChildren, ReactNode } from "react"; +import { PropsWithChildren, ReactNode, useEffect } from "react"; import AuthGuard from "../Guard"; import { useProfile } from "@/stores/profile"; +import useWeb5Store from "@/stores/useWeb5Store"; const Guard = ({ children, fallback }: PropsWithChildren & { fallback?: ReactNode }) => { - const isSignedIn = useProfile(state => state.state.isSignedIn) + const agent = useWeb5Store(state => ({ web5: state.web5!, did: state.did! })) + const { isSignedIn, signIn } = useProfile(state => ({ isSignedIn: state.state.isSignedIn, signIn: state.signIn })) + + useEffect(() => { + signIn(agent) + }, [signIn]) if (!isSignedIn) return <>{fallback} ?? null diff --git a/tauri-app/src/components/Navbar/index.css b/tauri-app/src/components/Navbar/index.css index 056aa0b..b433b8d 100644 --- a/tauri-app/src/components/Navbar/index.css +++ b/tauri-app/src/components/Navbar/index.css @@ -72,7 +72,12 @@ opacity: 1; } +.auth_container:focus { + outline: none; +} + .auth_container { + border: 0; display: flex; align-items: center; justify-content: center; diff --git a/tauri-app/src/components/Navbar/index.tsx b/tauri-app/src/components/Navbar/index.tsx index 02fca70..73a729e 100644 --- a/tauri-app/src/components/Navbar/index.tsx +++ b/tauri-app/src/components/Navbar/index.tsx @@ -2,11 +2,24 @@ import ProfileGuard from "../Auth/Profile/Guard"; import "./index.css"; import { NavLink } from "react-router-dom"; import { usePulseGlobalStore } from "../../stores/pulseGlobalStore.ts"; +import useWeb5Store from "@/stores/useWeb5Store.ts"; +import { Agent } from "../Auth/types"; +import { useProfile } from "@/stores/profile.ts"; const index = () => { - const toggleIsAuthBtnClicked = usePulseGlobalStore( - (store) => store.toggleIsAuthBtnClicked, - ); + const { web5, did } = useWeb5Store((state) => ({ web5: state.web5, did: state.did })); + const { signIn, setShowAuthModal, signOut } = useProfile(state => ({ + signIn: state.signIn, + signOut: state.signOut, + setShowAuthModal: state.setShowAuthModal + })) + + const beginAuthFlow = async (agent: Agent) => { + const signedIn = await signIn(agent) + if (!signedIn) + setShowAuthModal(true) + } + return (
    @@ -50,19 +63,23 @@ const index = () => {
    toggleIsAuthBtnClicked()} + onClick={() => web5 && did ? beginAuthFlow({ web5, did }) : null} >

    Join us!

    -
    + } > -
    -

    Profile

    - -
    +
    ); diff --git a/tauri-app/src/pages/Home/SignUpForm.tsx b/tauri-app/src/pages/Home/SignUpForm.tsx new file mode 100644 index 0000000..ed71e4c --- /dev/null +++ b/tauri-app/src/pages/Home/SignUpForm.tsx @@ -0,0 +1,142 @@ +import "./index.css"; +import useWeb5Store from "@/stores/useWeb5Store"; +import { useProfile } from "@/stores/profile"; +import { Agent } from "@/components/Auth/types"; +import { FunctionComponent, useRef, useState } from "react"; +import { z } from "zod" +import { zodResolver } from "@hookform/resolvers/zod" +import { Controller, useForm } from "react-hook-form" +import { parse } from "path"; +import toast from "react-hot-toast"; + +const formSchema = z.object({ + firstName: z.string().min(1), + lastName: z.string().min(1), + description: z.string().min(1), + profilePicture: z.instanceof(File) +}) + +interface FileProp { + file: File | null | undefined; +} + +const FileUploader: FunctionComponent<{ onChange: (file: File | null) => void }> = ({ onChange }) => { + const [file, setFile] = useState({ file: null }); + + return ( +
    +

    Profile Picture

    +
    + { + const file = e?.target?.files?.[0] + onChange(file ? file : null) + setFile({ file: e?.target?.files?.[0] }); + }} + type="file" + accept=".jpg,.png,.jpeg" + /> +
    + ); +}; + +export default function SignUpForm() { + const { web5, did } = useWeb5Store((state) => ({ web5: state.web5!, did: state.did! })); + const submitBtnRef = useRef(null); + const { setShowAuthModal, signUp, signIn } = useProfile( + (state) => ({ signUp: state.signUp, signIn: state.signIn, setShowAuthModal: state.setShowAuthModal }), + ); + // const [form, setForm] = useState({ + // firstName: "", + // lastName: "", + // description: "", + // profilePicture: new File([], ""), + // }) + + const form = useForm>({ + resolver: zodResolver(formSchema) + }) + + form.watch((value) => { + if (!submitBtnRef.current) return + + const isValid = formSchema.safeParse(value).success + + if (isValid) { + submitBtnRef.current.classList.remove("not-filled-btn") + submitBtnRef.current.classList.add("filled-btn") + submitBtnRef.current.disabled = false + } + else { + submitBtnRef.current.classList.add("not-filled-btn") + submitBtnRef.current.classList.remove("filled-btn") + submitBtnRef.current.disabled = true + } + }) + + type Payload = { + firstName: string + lastName: string + description: string + profilePicture: File + } + + const createProfile = async (agent: Agent, payload: Payload) => { + const hasSignedUpSuccessfully = await signUp(agent, payload) + + if (!hasSignedUpSuccessfully) { + toast.success('Sorry an error occurred!') + + return + } + + if (!await signIn()) return + + toast.success('Successfully signed up!') + + + setShowAuthModal(false) + } + + const onSubmit = (value: z.infer) => { + if (web5 && did) createProfile({ web5, did }, value) + } + + return ( +
    + + form.setValue("profilePicture", file as File)} + /> + + + + - - -
    -
    + {showAuthModal && ( + + + )} -
    +
    ); } diff --git a/tauri-app/src/stores/profile.ts b/tauri-app/src/stores/profile.ts index df439f2..4d45e9c 100644 --- a/tauri-app/src/stores/profile.ts +++ b/tauri-app/src/stores/profile.ts @@ -28,8 +28,12 @@ export const useProfile = create( state: { profile: null, isSignedIn: false - } as State + } as State, + showAuthModal: false }, (set, get) => ({ + setShowAuthModal: (showAuthModal: boolean) => { + set({ showAuthModal }) + }, signOut: () => { if (get().state.isSignedIn) { set({ @@ -45,7 +49,6 @@ export const useProfile = create( if (!profileRecord) return false const profile: UserDetailsProtocolRecord.Details = await profileRecord.data.json() - console.log(profile) const profilePicture = await DocumentUtils.fetchBlobRecord(agent, profile.profilePictureUrl) let profilePictureUrl = "" diff --git a/tauri-app/src/stores/pulseGlobalStore.ts b/tauri-app/src/stores/pulseGlobalStore.ts index 069b0b7..9252348 100644 --- a/tauri-app/src/stores/pulseGlobalStore.ts +++ b/tauri-app/src/stores/pulseGlobalStore.ts @@ -1,13 +1,13 @@ import { create } from "zustand"; type PulseGlobalStore = { - isAuthBtnClicked: boolean; - toggleIsAuthBtnClicked: () => void; + showAuthModal: boolean; + toggleAuthModal: () => void; }; export const usePulseGlobalStore = create((set) => ({ - isAuthBtnClicked: true, - toggleIsAuthBtnClicked: () => { - set((state) => ({ isAuthBtnClicked: !state.isAuthBtnClicked })); + showAuthModal: true, + toggleAuthModal: () => { + set((state) => ({ showAuthModal: !state.showAuthModal })); }, })); diff --git a/tauri-app/src/stores/useWeb5Store.ts b/tauri-app/src/stores/useWeb5Store.ts index 37eff48..2451557 100644 --- a/tauri-app/src/stores/useWeb5Store.ts +++ b/tauri-app/src/stores/useWeb5Store.ts @@ -1,8 +1,5 @@ import { Web5 } from "@web5/api/browser"; import { create } from "zustand"; -import ConditionsProtocol from "@/utils/protocols/conditions"; -import DocumentProtocol from "@/utils/protocols/document"; -import UserDetailsProtocol from "@/utils/protocols/user"; import { protocols as AllProtocols } from "@/utils/protocols"; interface Web5State { From 82082514ffd36a2178b038b897855109e67ff200 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sat, 6 Jan 2024 21:37:32 +0000 Subject: [PATCH 077/136] added a SS script for testing --- server/script.ts | 94 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 server/script.ts diff --git a/server/script.ts b/server/script.ts new file mode 100644 index 0000000..e58a7e5 --- /dev/null +++ b/server/script.ts @@ -0,0 +1,94 @@ +import { Web5 } from "@web5/api"; +import { protocols } from "@frontend/utils/protocols"; +import DocumentUtils from "@frontend/utils/document"; +import { Agent } from "@backend/utils"; + +async function configureProtocols(agent: Agent) { + console.log("=== CONFIGURE PROTOCOL ===") + + for (const protocol of protocols) { + const { protocols } = await agent.web5.dwn.protocols.query({ + message: { + filter: { + protocol: protocol.protocol, + } + } + }) + + if (protocols.length > 0) { + console.log("Protocol already exists:", protocol.protocol) + continue + } + + const { protocol: configuredProtocol, status: localProtocolConfigurationStatus } = await agent.web5.dwn.protocols.configure({ + message: { + definition: Object.assign({ ...protocol }), + } + }); + + if (!configuredProtocol) { + console.log("Failed to configure protocol:", localProtocolConfigurationStatus) + return + } + + console.log("Configured protocol on local DWN:", protocol.protocol) + const { status: remoteProtocolConfigurationStatus } = await configuredProtocol.send(agent.did) + + console.log("Sent protocol to remote DWN") + console.log(protocol.protocol, remoteProtocolConfigurationStatus) + } + + console.log("=== END CONFIGURE PROTOCOL ===") +} + +async function queryConditions(agent: Agent) { + console.log("=== QUERY CONDITIONS ===") + + const records = await DocumentUtils.fetchDocumentRecords(agent) + if (!records) { + console.log("No records found") + return + } + + if (records.length > 0) { + for (const record of records) { + // console.log("author:", record.author) + // console.log("recipient:", record.recipient) + // Bun.write("records/" + record.id + ".json", JSON.stringify(record)) + // console.log(record.author === record.target) + console.log(await record.data.json()) + } + } + + console.log("=== END QUERY CONDITIONS ===") +} + +async function createCondition(agent: Agent) { + console.log("=== CREATE CONDITION ===") + + const record = await DocumentUtils.createDocumentRecord(agent, { name: "test", condition: "command", file: new File([], "", { type: "image/png" }) }) + + if (!record) return false + + console.log("=== END CREATE CONDITION ===") +} + +async function connect() { + console.log("=== CONNECT ===") + const agent = await Web5.connect({ + sync: "5s", + }); + + console.log("=== END CONNECT ===") + + return agent +} +async function main() { + const agent = await connect() + await configureProtocols(agent) + await queryConditions(agent) + // await createCondition(agent) + // await queryConditions(agent) +} + +main() From b83bdda525cdc1c516e36303d964f4dc690197b2 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Sat, 6 Jan 2024 23:01:21 +0100 Subject: [PATCH 078/136] chat still in dev moving to add minor feature --- tauri-app/src/components/Chat/index.css | 74 ++++++++++++++++++ tauri-app/src/components/Chat/index.tsx | 48 ++++++++++++ .../src/components/UserFriendList/index.css | 78 +++++++++++++++++++ .../src/components/UserFriendList/index.tsx | 61 +++++++++++++++ .../src/components/UserProfile/index.css | 2 +- tauri-app/src/index.css | 4 + tauri-app/src/pages/Chat/index.css | 15 +++- tauri-app/src/pages/Chat/index.tsx | 35 ++++++--- 8 files changed, 305 insertions(+), 12 deletions(-) create mode 100644 tauri-app/src/components/Chat/index.css create mode 100644 tauri-app/src/components/Chat/index.tsx create mode 100644 tauri-app/src/components/UserFriendList/index.css create mode 100644 tauri-app/src/components/UserFriendList/index.tsx diff --git a/tauri-app/src/components/Chat/index.css b/tauri-app/src/components/Chat/index.css new file mode 100644 index 0000000..b2b6a6f --- /dev/null +++ b/tauri-app/src/components/Chat/index.css @@ -0,0 +1,74 @@ +.chat-component-container { + box-shadow: var(--box-shadow-black); + border-radius: 15px; + padding: 20px; + width: 100%; + height: 100%; + min-height: 500px; +} + +.chat-message-input-container { + width: 100%; + padding: 15px 0px; + display: flex; + justify-content: space-around; + align-items: center; +} + +.chat-message-input-container input { + width: 80%; + height: 30px; + padding: 8px 12px; + background: var(--color-slate-accent); + border: none; + border-radius: 25px; + outline: none; + font-family: "Roboto"; + font-size: 20px; + text-indent: 8px; +} + +.chat-message-input-container button { + width: 40px; + height: 40px; + border: none; + border-radius: 50%; + color: var(--color-white); + background: var(--color-blue); + box-shadow: var(--box-shadow-blue); + font-size: 20px; +} + +.chats-container { + width: 95%; + background: var(--color-light-grey); + height: 90%; + padding: 12px; + border-radius: 15px; + margin: 0 auto; +} + +.msg-container { + width: 100%; + margin: 25px 2px; +} + +.msg-f { + width: max-content; + background: var(--color-light-green); + font-family: "Roboto"; + padding: 4px 10px; + border-radius: 8px 8px 8px 0px; + margin-right: auto; + max-width: 300px; +} + +.msg-t { + width: max-content; + background: var(--color-light-blue); + font-family: "Roboto"; + padding: 4px 10px; + border-radius: 8px 8px 0px 8px; + margin-left: auto; + max-width: 300px; +} diff --git a/tauri-app/src/components/Chat/index.tsx b/tauri-app/src/components/Chat/index.tsx new file mode 100644 index 0000000..9492f36 --- /dev/null +++ b/tauri-app/src/components/Chat/index.tsx @@ -0,0 +1,48 @@ +import "./index.css"; +import React, { FC } from "react"; + +interface MessageProp { + message: string; + isLeft: boolean; +} + +const Message: FC = ({ message, isLeft }) => { + return ( +
    +
    +

    {message}

    +
    +
    + ); +}; + +const index: FC = () => { + return ( +
    +
    + + + + +
    +
    + + +
    +
    + ); +}; + +export default index; diff --git a/tauri-app/src/components/UserFriendList/index.css b/tauri-app/src/components/UserFriendList/index.css new file mode 100644 index 0000000..dc82b4b --- /dev/null +++ b/tauri-app/src/components/UserFriendList/index.css @@ -0,0 +1,78 @@ +.friend-tag-container { + display: flex; + justify-content: space-between; + align-items: center; + margin: 12px 0; + border-radius: 8px; + transition: 0.3s; + padding: 8px; + transition: 0.3s; +} + +.friend-tag-container h1 { + font-size: 18px; + font-family: "Roboto"; +} + +.friend-tag-container img { + width: 40px; + height: 40px; + border-radius: 5px; +} + +.friends-list-container hr { + width: 60%; + margin: 0 auto; +} + +.friends-list-container hr:last-child { + display: none; +} + +.friend-tag-container:hover { + background: var(--color-slate-accent); +} + +.friends-list-container { + box-shadow: var(--box-shadow-black); + padding: 8px 14px; + border-radius: 15px; + margin-top: 30px; + width: 300px; +} + +.friends-list-header { + background: var(--color-blue); + padding: 4px 12px; + border-radius: 10px; + color: var(--color-white); + font-family: "Roboto"; + text-align: center; +} + +.friend-main-list-container { + overflow-y: scroll; + height: 300px; + margin: 15px 0; + padding: 5px; +} + +.friend-main-list-container::-webkit-scrollbar { + width: 6px; +} + +.friend-main-list-container::-webkit-scrollbar-track { + box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.1); + border-radius: 5px; +} + +.friend-main-list-container::-webkit-scrollbar-thumb { + width: 2px; + background: var(--color-blue); + border-radius: 5px; + margin: 0 3px; +} + +.friends-list-header b { + font-family: "Pacifico"; +} diff --git a/tauri-app/src/components/UserFriendList/index.tsx b/tauri-app/src/components/UserFriendList/index.tsx new file mode 100644 index 0000000..d76e959 --- /dev/null +++ b/tauri-app/src/components/UserFriendList/index.tsx @@ -0,0 +1,61 @@ +import "./index.css"; +import React, { FC, useState } from "react"; + +interface FriendTagProp { + friendProfileImg: string; + friendName: string; + isFriendOnline: boolean; +} + +const FriendTag: FC = ({ + friendProfileImg, + friendName, + isFriendOnline, +}) => { + return ( +
    + +

    {friendName.slice(0, 60) + "..."}

    + +
    + ); +}; + +interface UserFriendListProp { + friendList: FriendTagProp[]; +} + +const index: FC = ({ friendList }) => { + return ( +
    +
    +

    + Friends 45 +

    +
    +
    + {friendList.map((friend) => { + return ( + <> + +
    + + ); + })} +
    +
    + ); +}; + +export default index; diff --git a/tauri-app/src/components/UserProfile/index.css b/tauri-app/src/components/UserProfile/index.css index 2c3dd37..b426bd5 100644 --- a/tauri-app/src/components/UserProfile/index.css +++ b/tauri-app/src/components/UserProfile/index.css @@ -1,6 +1,6 @@ .userprofile-container { box-shadow: var(--box-shadow-black); - width: 200px; + width: 300px; text-align: center; border-radius: 15px; padding: 8px 12px; diff --git a/tauri-app/src/index.css b/tauri-app/src/index.css index 0b0b566..5bfae8d 100644 --- a/tauri-app/src/index.css +++ b/tauri-app/src/index.css @@ -11,6 +11,10 @@ --color-black: #000; --color-slate: #e2e8f0; --color-orange: #f97316; + --color-light-green: #4ade80; + --color-light-blue: #7dd3fc; + --color-light-grey: #f8fafc; + --color-grey: #d1d5db; --padding-desktop: 40px 65px; --padding-mobile: 40px 25px; } diff --git a/tauri-app/src/pages/Chat/index.css b/tauri-app/src/pages/Chat/index.css index 322a4e5..d96fd05 100644 --- a/tauri-app/src/pages/Chat/index.css +++ b/tauri-app/src/pages/Chat/index.css @@ -1,8 +1,19 @@ .main-chat-container { padding: var(--padding-desktop); display: flex; - justify-content: center; - align-items: center; + justify-content: space-between; + align-items: flex-start; + position: relative; +} + +.utils-container { + width: 35%; +} + +.chat-container { + width: 60%; + height: 100%; + height: 40vh; } @media (max-width: 750px) { diff --git a/tauri-app/src/pages/Chat/index.tsx b/tauri-app/src/pages/Chat/index.tsx index 89b5b1f..560826e 100644 --- a/tauri-app/src/pages/Chat/index.tsx +++ b/tauri-app/src/pages/Chat/index.tsx @@ -1,18 +1,35 @@ import "./index.css"; import UserProfile from "../../components/UserProfile/"; +import UserFriendList from "../../components/UserFriendList/"; +import Chat from "../../components/Chat/"; + +import { useState } from "react"; const index = () => { + const [friends, setFriends] = useState([ + { profile_pic: "/pg.jpg", username: "@scriptkidd", isOnline: false }, + { profile_pic: "/pg.jpg", username: "@nikki", isOnline: false }, + { profile_pic: "/pm.jpg", username: "@gregidd", isOnline: true }, + { profile_pic: "/pic.jpg", username: "@scdd", isOnline: false }, + ]); + return (
    - +
    + + +
    +
    + +
    ); }; From c086371345a5b41cd9b21d13ffc0bf6ec81c4e6d Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 00:03:36 +0000 Subject: [PATCH 079/136] made the schema to match the site --- tauri-app/src/pages/Home/SignUpForm.tsx | 9 +- tauri-app/src/pages/Records/index.tsx | 79 ++++++++++++++-- tauri-app/src/pages/connect.tsx | 2 +- tauri-app/src/pages/medic.tsx | 2 +- tauri-app/src/stores/profile.ts | 19 ++-- tauri-app/src/utils/document.ts | 105 ++++++++++++++++++---- tauri-app/src/utils/protocols/document.ts | 21 +++-- 7 files changed, 187 insertions(+), 50 deletions(-) diff --git a/tauri-app/src/pages/Home/SignUpForm.tsx b/tauri-app/src/pages/Home/SignUpForm.tsx index ed71e4c..0a1f2fd 100644 --- a/tauri-app/src/pages/Home/SignUpForm.tsx +++ b/tauri-app/src/pages/Home/SignUpForm.tsx @@ -5,8 +5,7 @@ import { Agent } from "@/components/Auth/types"; import { FunctionComponent, useRef, useState } from "react"; import { z } from "zod" import { zodResolver } from "@hookform/resolvers/zod" -import { Controller, useForm } from "react-hook-form" -import { parse } from "path"; +import { useForm } from "react-hook-form" import toast from "react-hot-toast"; const formSchema = z.object({ @@ -46,12 +45,6 @@ export default function SignUpForm() { const { setShowAuthModal, signUp, signIn } = useProfile( (state) => ({ signUp: state.signUp, signIn: state.signIn, setShowAuthModal: state.setShowAuthModal }), ); - // const [form, setForm] = useState({ - // firstName: "", - // lastName: "", - // description: "", - // profilePicture: new File([], ""), - // }) const form = useForm>({ resolver: zodResolver(formSchema) diff --git a/tauri-app/src/pages/Records/index.tsx b/tauri-app/src/pages/Records/index.tsx index d95d177..54ef08d 100644 --- a/tauri-app/src/pages/Records/index.tsx +++ b/tauri-app/src/pages/Records/index.tsx @@ -1,23 +1,75 @@ import "./index.css"; -import { useState } from "react"; +import { useEffect, useState } from "react"; +import { Record as DocumentRecord } from "@/utils/protocols/document"; import AddCardComponent from "../../components/AddCardComponent"; import DetailCardComponent from "../../components/DetailCardComponent"; import Card from "../../components/Card"; +import { Agent } from "@/components/Auth/types"; +import DocumentUtils from "@/utils/document"; +import { ProfileState, useProfile } from "@/stores/profile"; +import useWeb5Store from "@/stores/useWeb5Store"; + +const fetchRecords = async (agent: Agent, profile: ProfileState) => { + const records = await DocumentUtils.fetchDocumentRecords(agent) + if (!records) return false + + const profileRecords = [] + for (const record of records) { + const data: DocumentRecord.Document = await record.data.json() + const fileRecord = await DocumentUtils.fetchBlobRecord(agent, data.file.id) + if (!fileRecord) continue + const fileData = await fileRecord.data.blob() + + const otherFiles = await Promise.all(data.otherFiles.map(async file => { + const record = await DocumentUtils.fetchBlobRecord(agent, file.id) + if (!record) return false + + const data = await record.data.blob() + return { + name: file.name, + type: file.type, + url: URL.createObjectURL( + new File([data], file.name, { type: file.type }) + ) + } + })) + + if (data.profileId === profile.id) { + profileRecords.push({ + title: data.title, + description: data.description, + dateCreated: data.dateCreated, + file: { + name: data.file.name, + type: data.file.type, + url: URL.createObjectURL( + new File([fileData], data.file.name, { type: data.file.type }) + ) + }, + otherFiles + }) + } + } + return profileRecords +} const index = () => { + const agent = useWeb5Store(state => ({ web5: state.web5!, did: state.did! })) + const profile = useProfile(state => state.state.profile!) + const [cardsData, setCardsData] = useState([ { title: "Diabetes Docs", - desc: "documentation of test ran for diagonese of diabtets slated for type dissertion", + description: "documentation of test ran for diagonese of diabtets slated for type dissertion", date: "1/2/24", file_extension: "pdf", file_name: "Diabetes_scan.pdf", }, { title: "Diabetes Docs", - desc: "documentation of test ran for diagonese of diabtets slated for type dissertion", + description: "documentation of test ran for diagonese of diabtets slated for type dissertion", date: "1/2/24", file_extension: "pdf", file_name: "Diabetes_scan.pdf", @@ -28,7 +80,7 @@ const index = () => { }, { title: "Diabetes Docs", - desc: "documentation of test ran for diagonese of diabtets slated for type dissertion", + description: "documentation of test ran for diagonese of diabtets slated for type dissertion", date: "1/2/24", file_extension: "docx", file_name: "Diabetes_test.docx", @@ -50,6 +102,17 @@ const index = () => { }, ]); + useEffect(() => { + (async () => { + const records = await fetchRecords(agent, profile) + console.log(records) + + if (!records) return + + return + })() + }, []) + const [isAddCardActive, setIsAddCardActive] = useState(false); const [isCardDetailActive, setIsCardDetailActive] = useState(false); const [activeCard, setActiveCard] = useState(null); @@ -75,7 +138,7 @@ const index = () => {
    - {cardsData.map((card) => { + {cardsData.length > 0 ? cardsData.map((card) => { return ( { // @ts-ignore title={card.title} date={card.date} - desc={card.desc} + desc={card.description} cardUtils={[card, isCardClicked]} /> ); - })} + }) :
    No Records Found
    }
    {(isAddCardActive || isCardDetailActive) && (
    { {isAddCardActive && } {isCardDetailActive && ( diff --git a/tauri-app/src/pages/connect.tsx b/tauri-app/src/pages/connect.tsx index 88c7fcc..7519602 100644 --- a/tauri-app/src/pages/connect.tsx +++ b/tauri-app/src/pages/connect.tsx @@ -74,7 +74,7 @@ function Connect() { {similarConditionDocuments.map((doc, index) => (
    - {doc.name} + {doc.title}
    {doc.condition} diff --git a/tauri-app/src/pages/medic.tsx b/tauri-app/src/pages/medic.tsx index 17ad038..9ca1924 100644 --- a/tauri-app/src/pages/medic.tsx +++ b/tauri-app/src/pages/medic.tsx @@ -39,7 +39,7 @@ const Page: FunctionComponent = () => { if (!fileRecord) continue - const file = new File([await fileRecord.data.blob()], data.name, { type: data.encodingFormat }) + const file = new File([await fileRecord.data.blob()], data.title, { type: data.encodingFormat }) docsWithUrl.push({ record: docRecord, diff --git a/tauri-app/src/stores/profile.ts b/tauri-app/src/stores/profile.ts index 4d45e9c..62d2eee 100644 --- a/tauri-app/src/stores/profile.ts +++ b/tauri-app/src/stores/profile.ts @@ -5,21 +5,23 @@ import { Agent } from "@/components/Auth/types"; import UserDetailsUtils from "@/utils/user"; import DocumentUtils from "@/utils/document"; +export type ProfileState = { + id: string + // username: string + firstName: string, + lastName: string, + profilePictureUrl: string +} + type State = { - profile: { - firstName: string, - lastName: string, - profilePictureUrl: string - }, + profile: ProfileState, isSignedIn: true } | { profile: null, isSignedIn: false } -type Payload = { - firstName: string, - lastName: string, +type Payload = Omit & { profilePicture: File } @@ -61,6 +63,7 @@ export const useProfile = create( state: { isSignedIn: true, profile: { + id: profileRecord.id, firstName: profile.firstName, lastName: profile.lastName, profilePictureUrl diff --git a/tauri-app/src/utils/document.ts b/tauri-app/src/utils/document.ts index 6e66835..ab8245d 100644 --- a/tauri-app/src/utils/document.ts +++ b/tauri-app/src/utils/document.ts @@ -73,18 +73,45 @@ async function fetchRecords(agent: Agent, filter: FullFilterObj< return records } -async function createDocumentRecord(agent: Agent, { name, file, condition }: { name: string | undefined, file: File, condition: string }) { +type CreatePayload = Omit & +{ + title?: string + file: File, + otherFiles: File[] +} + +async function createDocumentRecord(agent: Agent, payload: CreatePayload) { + const { file, otherFiles, ...restPayload } = payload + const blobRecord = await createBlobRecord(agent, file) if (!blobRecord) return false + const fileData = { + id: blobRecord.id, + size: file.size, + type: file.type, + name: file.name, + } + + const otherFilesData = [] + for (const file of otherFiles) { + const blobRecord = await createBlobRecord(agent, file) + if (!blobRecord) return false + + otherFilesData.push({ + id: blobRecord.id, + size: file.size, + type: file.type, + name: file.name, + }) + } + const record = await createRecord( agent, { - name: name ?? file.name, - encodingFormat: file.type, - size: file.size, - url: blobRecord.id, - condition, + ..._.merge({ title: file.name }, restPayload), + file: fileData, + otherFiles: otherFilesData, dateCreated: new Date().toISOString(), dateModified: new Date().toISOString() }, @@ -160,11 +187,13 @@ async function fetchBlobRecords(agent: Agent) { }) } -type UpdatePayload = Partial<{ - name: string - condition: string - file: File -}> +type UpdatePayload = Partial< + Omit & + { + file: File, + otherFiles: File[] + } +> async function updateDocumentRecord(agent: Agent, id: string, payload: UpdatePayload): Promise; async function updateDocumentRecord(agent: Agent, record: Web5Record, payload: UpdatePayload): Promise; @@ -184,18 +213,56 @@ async function updateDocumentRecord(agent: Agent, idOrRecord: string | Web5Recor } const data: DocumentProtocolRecord.Document = await record.data.json() - const { file, ...restPayload } = payload + const { file, otherFiles, ...restPayload } = payload - let url = data.url + const fileData = data.file if (file) { - const blobRecord = await updateBlobRecord(agent, url, file) + const blobRecord = await updateBlobRecord(agent, data.file.id, file) if (!blobRecord) return false - url = blobRecord.id + fileData.id = blobRecord.id + fileData.name = file.name + fileData.size = file.size + fileData.type = file.type + } + + const otherFilesData = data.otherFiles + if (otherFiles) { + for (let i = 0; i < otherFiles.length; i++) { + const file = otherFiles[i] + const otherFile = otherFilesData[i] + + const blobRecord = await updateBlobRecord(agent, otherFile.id, file) + if (!blobRecord) return false + + otherFile.id = blobRecord.id + otherFile.name = file.name + otherFile.size = file.size + otherFile.type = file.type + } + + if (otherFiles.length < otherFilesData.length) { + otherFilesData.splice(otherFiles.length, otherFilesData.length - otherFiles.length) + } + else { + for (let i = otherFilesData.length; i < otherFiles.length; i++) { + const file = otherFiles[i] + + const blobRecord = await createBlobRecord(agent, file) + if (!blobRecord) return false + + otherFilesData.push({ + id: blobRecord.id, + name: file.name, + size: file.size, + type: file.type, + }) + } + } } const { status } = await record.update({ - data: _.merge(data, Object.assign(restPayload, { url })) + data: _.merge(data, Object.assign(restPayload, { file: fileData, otherFiles: otherFilesData })) }) if (status.code !== 202) { @@ -252,9 +319,13 @@ async function deleteDocumentRecord(agent: Agent, idOrRecord: string | Web5Recor const document: DocumentProtocolRecord.Document = await record.data.json() - const hasDeletedBlobRecord = await deleteBlobRecord(agent, document.url) + const hasDeletedBlobRecord = await deleteBlobRecord(agent, document.file.id) if (!hasDeletedBlobRecord) return false + for (const otherFile of document.otherFiles) { + await deleteBlobRecord(agent, otherFile.id) + } + const { status } = await agent.web5.dwn.records.delete({ message: { recordId: record.id diff --git a/tauri-app/src/utils/protocols/document.ts b/tauri-app/src/utils/protocols/document.ts index c1b6883..a248fe6 100644 --- a/tauri-app/src/utils/protocols/document.ts +++ b/tauri-app/src/utils/protocols/document.ts @@ -50,17 +50,24 @@ const DocumentProtocol = { } as const export namespace Record { + type FileMeta = { + id: string + size: number + type: string + name: string + } + export type File = Blob export type Document = { - name: string - encodingFormat: string - size: number - url: string - // profileUrl: string + title: string + file: FileMeta, + description?: string + otherFiles: FileMeta[], + profileId: string condition: string - dateCreated?: string - dateModified?: string + dateCreated: string + dateModified: string }; } From 7ff667f1ac59ca339a8df674a7df33e0771b9f3f Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 01:12:14 +0000 Subject: [PATCH 080/136] integrated the record feature --- tauri-app/src/App.tsx | 3 +- .../src/components/AddCardComponent/index.css | 21 +++ .../src/components/AddCardComponent/index.tsx | 157 ++++++++++++---- .../components/DetailCardComponent/index.tsx | 67 ++++--- tauri-app/src/pages/Home/SignUpForm.tsx | 5 +- tauri-app/src/pages/Records/index.tsx | 167 +++++++----------- tauri-app/src/pages/Records/utils.tsx | 54 ++++++ tauri-app/src/utils/protocols/document.ts | 2 +- 8 files changed, 306 insertions(+), 170 deletions(-) create mode 100644 tauri-app/src/pages/Records/utils.tsx diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index 77b379a..be69d99 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -10,6 +10,7 @@ import SharedLayout from "./pages/SharedLayout/"; import Records from "./pages/Records"; import Chat from "./pages/Chat/"; import { Toaster } from "react-hot-toast"; +import ProfileGuard from "./components/Auth/Profile/Guard"; const router = createHashRouter([ { @@ -17,7 +18,7 @@ const router = createHashRouter([ element: , children: [ { path: "/", element: }, - { path: "/records", element: }, + { path: "/records", element: }, { path: "/connect", element: }, { path: "/remedies", element: }, { path: "/medic", element: }, diff --git a/tauri-app/src/components/AddCardComponent/index.css b/tauri-app/src/components/AddCardComponent/index.css index e82047b..a644737 100644 --- a/tauri-app/src/components/AddCardComponent/index.css +++ b/tauri-app/src/components/AddCardComponent/index.css @@ -56,6 +56,20 @@ margin-right: 40%; } +.input-form select { + width: 60%; + border: none; + background: var(--color-slate); + padding: 10px 2px; + border-radius: 8px; + font-family: "Roboto"; + text-indent: 10px; + outline: none; + margin-bottom: 10px; + margin-right: 40%; +} + + .input-form textarea { width: 100%; border: none; @@ -66,6 +80,7 @@ text-indent: 10px; outline: none; min-height: 80px; + margin-bottom: 10px; } .input-form button { @@ -203,6 +218,12 @@ margin-right: 0; } + .input-form select { + width: 100%; + margin-right: 0; + } + + .input-form input[type="file"] { padding: 10px 0; } diff --git a/tauri-app/src/components/AddCardComponent/index.tsx b/tauri-app/src/components/AddCardComponent/index.tsx index 9e324bd..a30753f 100644 --- a/tauri-app/src/components/AddCardComponent/index.tsx +++ b/tauri-app/src/components/AddCardComponent/index.tsx @@ -1,56 +1,153 @@ import "./index.css"; -import React, { useState } from "react"; +import React, { FunctionComponent, useState } from "react"; +import { z } from "zod" +import { zodResolver } from "@hookform/resolvers/zod" +import { useForm } from "react-hook-form" +import toast from "react-hot-toast"; +import DocumentUtils from "@/utils/document"; +import { Agent } from "../Auth/types"; +import { ProfileState } from "@/stores/profile"; + +const possibleConditions = [ + "Cancer", + "Diabetes", + "Heart Disease", + "High Blood Pressure", + "High Cholesterol", + "Mental Illness", +] interface FileProp { file: File | null | undefined; } -const FileUploader = () => { +const FileUploader: FunctionComponent<{ required?: boolean, onChange: (file: File | null) => void }> = ({ required, onChange }) => { const [file, setFile] = useState({ file: null }); return ( -
    +
    { + const file = e?.target?.files?.[0] + onChange(file ? file : null) setFile({ file: e?.target?.files?.[0] }); }} type="file" - accept=".jpg,.png,.jpeg,.docx,.pdf" + accept=".jpg,.png,.jpeg" />
    ); }; -const index = () => { - const [fileUploaders, setUploaderFile] = useState([ - , - ]); +// const FileUploader = () => { +// const [file, setFile] = useState({ file: null }); +// +// return ( +//
    +// { +// setFile({ file: e?.target?.files?.[0] }); +// }} +// type="file" +// accept=".jpg,.png,.jpeg,.docx,.pdf" +// /> +//
    +// ); +// }; + +const formSchema = z.object({ + title: z.string().optional(), + description: z.string().min(1), + condition: z.string().min(1), + file: z.instanceof(File), + otherFiles: z.array(z.instanceof(File)) +}) + +const index: FunctionComponent<{profile: ProfileState, agent: Agent, onClose: () => void}> = ({ profile, agent, onClose }) => { + const [numFileUploaders, setNumFileUploaders] = useState(0) + + const form = useForm>({ + resolver: zodResolver(formSchema), + defaultValues: { + otherFiles: [] + } + }) + // console.log(form.formState.errors) + + const onSubmit = async (data: z.infer) => { + const payload = { + ...data, + profileId: profile.id + } + const createdRecord = await DocumentUtils.createDocumentRecord(agent, payload) + if (!createdRecord) { + toast.error('Sorry an error occurred!') + return + } + + toast.success('Successfully created record!') + + onClose() + } + return (

    Create New Record

    -
    - {fileUploaders.length > 2 &&

    Max file uploads reached

    } -
    2 ? "sadd-mu" : "add-mu"} - onClick={() => - fileUploaders.length > 2 - ? null - : setUploaderFile([...fileUploaders, ]) - } - > - + +
    + {numFileUploaders > 2 &&

    Max file uploads reached

    } +
    2 ? "sadd-mu" : "add-mu"} + onClick={() => + numFileUploaders > 2 + ? null + : setNumFileUploaders(numFileUploaders + 1) + } + > + +
    + {Array.from({ length: numFileUploaders }) + .map((_, index) => ( + { + const otherFiles = form.getValues("otherFiles") + otherFiles[index] = file as File + form.setValue("otherFiles", otherFiles) + }} /> + ))} + + - -

    - *ensure inputted information are correct as once saved it cannot be - deleted/edited -

    -
    +
    ); }; diff --git a/tauri-app/src/components/DetailCardComponent/index.tsx b/tauri-app/src/components/DetailCardComponent/index.tsx index 9ae854b..b22aedb 100644 --- a/tauri-app/src/components/DetailCardComponent/index.tsx +++ b/tauri-app/src/components/DetailCardComponent/index.tsx @@ -1,25 +1,27 @@ import "./index.css"; import React, { FC, useState } from "react"; +import { CardData } from "@/pages/Records/utils"; -interface OtherFileProp { - title: String; - file_extension: string; - file_name: string; +// interface OtherFileProp { +// title: String; +// file_extension: string; +// file_name: string; +// +// file_url: string; +// } - file_url: string; -} - -interface CardDataProps { - file_name: String; - file_extension: string; - title: String; - desc: String; - date: String; - other_files: OtherFileProp[]; -} +// interface CardDataProps { +// file_name: String; +// file_extension: string; +// title: String; +// desc: String; +// date: String; +// other_files: OtherFileProp[]; +// } interface CardProp { - cardData: CardDataProps; + // cardData: CardDataProps; + cardData: CardData close: (isCardDetailActive: boolean) => void; } @@ -33,40 +35,37 @@ const index: FC = ({ cardData, close }) => { return (
    close(false)}> - +
    -

    {cardData.title ? cardData.title : cardData.file_name}

    - {supportedIMGExtensions.includes(cardData.file_extension) && ( +

    {cardData.title ? cardData.title : cardData.file.name}

    + {supportedIMGExtensions.includes(cardData.file.type.split("/")[1]) && (
    - + {cardData.file.name}
    )} -

    {cardData.desc}

    +

    {cardData.description}

    - {cardData.other_files && - cardData.other_files.map((file) => { + {cardData.otherFiles.map((file) => { + const fileExtension = file.type.split("/")[1] return (
    - {file.file_extension == "pdf" && ( + {fileExtension === "pdf" && ( + className="fa-solid fa-file-pdf" /> )} - {file.file_extension == "docx" && ( + {fileExtension === "docx" && ( + className="fas fa-file-word" /> )} - {supportedIMGExtensions.includes(file.file_extension) && ( + {supportedIMGExtensions.includes(fileExtension) && ( + style={{ color: "var(--color-blue)" }} /> )} - -

    {file.file_name}

    +
    +

    {file.name}

    ); diff --git a/tauri-app/src/pages/Home/SignUpForm.tsx b/tauri-app/src/pages/Home/SignUpForm.tsx index 0a1f2fd..2dfb6f6 100644 --- a/tauri-app/src/pages/Home/SignUpForm.tsx +++ b/tauri-app/src/pages/Home/SignUpForm.tsx @@ -78,12 +78,11 @@ export default function SignUpForm() { const hasSignedUpSuccessfully = await signUp(agent, payload) if (!hasSignedUpSuccessfully) { - toast.success('Sorry an error occurred!') - + toast.error('Sorry an error occurred!') return } - if (!await signIn()) return + if (!await signIn(agent)) return toast.success('Successfully signed up!') diff --git a/tauri-app/src/pages/Records/index.tsx b/tauri-app/src/pages/Records/index.tsx index 54ef08d..46983e9 100644 --- a/tauri-app/src/pages/Records/index.tsx +++ b/tauri-app/src/pages/Records/index.tsx @@ -1,117 +1,76 @@ import "./index.css"; import { useEffect, useState } from "react"; -import { Record as DocumentRecord } from "@/utils/protocols/document"; +import { format } from "date-fns"; import AddCardComponent from "../../components/AddCardComponent"; import DetailCardComponent from "../../components/DetailCardComponent"; import Card from "../../components/Card"; -import { Agent } from "@/components/Auth/types"; -import DocumentUtils from "@/utils/document"; -import { ProfileState, useProfile } from "@/stores/profile"; +import { useProfile } from "@/stores/profile"; import useWeb5Store from "@/stores/useWeb5Store"; - -const fetchRecords = async (agent: Agent, profile: ProfileState) => { - const records = await DocumentUtils.fetchDocumentRecords(agent) - if (!records) return false - - const profileRecords = [] - for (const record of records) { - const data: DocumentRecord.Document = await record.data.json() - const fileRecord = await DocumentUtils.fetchBlobRecord(agent, data.file.id) - if (!fileRecord) continue - const fileData = await fileRecord.data.blob() - - const otherFiles = await Promise.all(data.otherFiles.map(async file => { - const record = await DocumentUtils.fetchBlobRecord(agent, file.id) - if (!record) return false - - const data = await record.data.blob() - return { - name: file.name, - type: file.type, - url: URL.createObjectURL( - new File([data], file.name, { type: file.type }) - ) - } - })) - - if (data.profileId === profile.id) { - profileRecords.push({ - title: data.title, - description: data.description, - dateCreated: data.dateCreated, - file: { - name: data.file.name, - type: data.file.type, - url: URL.createObjectURL( - new File([fileData], data.file.name, { type: data.file.type }) - ) - }, - otherFiles - }) - } - } - return profileRecords -} +import { fetchRecords } from "./utils"; const index = () => { const agent = useWeb5Store(state => ({ web5: state.web5!, did: state.did! })) const profile = useProfile(state => state.state.profile!) - const [cardsData, setCardsData] = useState([ - { - title: "Diabetes Docs", - description: "documentation of test ran for diagonese of diabtets slated for type dissertion", - date: "1/2/24", - file_extension: "pdf", - file_name: "Diabetes_scan.pdf", - }, - { - title: "Diabetes Docs", - description: "documentation of test ran for diagonese of diabtets slated for type dissertion", - date: "1/2/24", - file_extension: "pdf", - file_name: "Diabetes_scan.pdf", - other_files: [ - { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, - { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, - ], - }, - { - title: "Diabetes Docs", - description: "documentation of test ran for diagonese of diabtets slated for type dissertion", - date: "1/2/24", - file_extension: "docx", - file_name: "Diabetes_test.docx", - other_files: [ - { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, - { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, - ], - }, - { - desc: "documentation of test ran for diagonese of diabtets slated for type dissertion", - date: "1/2/24", - file_extension: "jpg", - file_name: "D_IMG1103.jpg", - file_1_url: "../../../public/pic.jpg", - other_files: [ - { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, - { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, - ], - }, + const [cardsData, setCardsData] = useState([ + // { + // title: "Diabetes Docs", + // description: "documentation of test ran for diagonese of diabtets slated for type dissertion", + // date: "1/2/24", + // file_extension: "pdf", + // file_name: "Diabetes_scan.pdf", + // }, + // { + // title: "Diabetes Docs", + // description: "documentation of test ran for diagonese of diabtets slated for type dissertion", + // date: "1/2/24", + // file_extension: "pdf", + // file_name: "Diabetes_scan.pdf", + // other_files: [ + // { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, + // { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, + // ], + // }, + // { + // title: "Diabetes Docs", + // description: "documentation of test ran for diagonese of diabtets slated for type dissertion", + // date: "1/2/24", + // file_extension: "docx", + // file_name: "Diabetes_test.docx", + // other_files: [ + // { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, + // { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, + // ], + // }, + // { + // desc: "documentation of test ran for diagonese of diabtets slated for type dissertion", + // date: "1/2/24", + // file_extension: "jpg", + // file_name: "D_IMG1103.jpg", + // file_1_url: "../../../public/pic.jpg", + // other_files: [ + // { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, + // { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, + // ], + // }, ]); useEffect(() => { - (async () => { - const records = await fetchRecords(agent, profile) - console.log(records) + refetchRecords() + }, []) - if (!records) return + const refetchRecords = async () => { + const records = await fetchRecords(agent, profile) + console.log('records:', records) - return - })() - }, []) + if (!records) return + + setCardsData(records) + + return + } const [isAddCardActive, setIsAddCardActive] = useState(false); const [isCardDetailActive, setIsCardDetailActive] = useState(false); @@ -141,11 +100,10 @@ const index = () => { {cardsData.length > 0 ? cardsData.map((card) => { return ( @@ -158,7 +116,14 @@ const index = () => { style={{ zIndex: `${isCardDetailActive ? "7" : "6"}` }} >
    - {isAddCardActive && } + {isAddCardActive && { + setIsAddCardActive(false) + refetchRecords() + }} /> + } {isCardDetailActive && ( { + const records = await DocumentUtils.fetchDocumentRecords(agent) + if (!records) return false + + const profileRecords = [] + for (const record of records) { + const data: DocumentRecord.Document = await record.data.json() + const fileRecord = await DocumentUtils.fetchBlobRecord(agent, data.file.id) + if (!fileRecord) continue + const fileData = await fileRecord.data.blob() + + const otherFilesProcessing = await Promise.all(data.otherFiles.map(async file => { + const record = await DocumentUtils.fetchBlobRecord(agent, file.id) + if (!record) return false + + const data = await record.data.blob() + return { + name: file.name, + type: file.type, + url: URL.createObjectURL( + new File([data], file.name, { type: file.type }) + ) + } + })) + + if (otherFilesProcessing.includes(false)) continue + + const otherFiles = otherFilesProcessing as Exclude[] + + if (data.profileId === profile.id) { + profileRecords.push({ + title: data.title, + description: data.description, + dateCreated: data.dateCreated, + file: { + name: data.file.name, + type: data.file.type, + url: URL.createObjectURL( + new File([fileData], data.file.name, { type: data.file.type }) + ) + }, + otherFiles + }) + } + } + return profileRecords +} + +export type CardData = Exclude>, false>[0] diff --git a/tauri-app/src/utils/protocols/document.ts b/tauri-app/src/utils/protocols/document.ts index a248fe6..33838c2 100644 --- a/tauri-app/src/utils/protocols/document.ts +++ b/tauri-app/src/utils/protocols/document.ts @@ -62,7 +62,7 @@ export namespace Record { export type Document = { title: string file: FileMeta, - description?: string + description: string otherFiles: FileMeta[], profileId: string condition: string From 8ffc12ce623bc94279782c61a20f35097a9eb784 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 01:13:03 +0000 Subject: [PATCH 081/136] added date fns --- tauri-app/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/tauri-app/package.json b/tauri-app/package.json index ff5225a..9c9b086 100644 --- a/tauri-app/package.json +++ b/tauri-app/package.json @@ -21,6 +21,7 @@ "axios": "^1.6.3", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", + "date-fns": "^3.1.0", "hono": "^3.12.0", "lodash": "^4.17.21", "lucide-react": "^0.298.0", From 3c38834dc41b0d1d166e6a806511c120eb032aa3 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 01:22:44 +0000 Subject: [PATCH 082/136] removed medic page --- tauri-app/src/App.tsx | 2 - tauri-app/src/pages/Records/index.tsx | 4 +- tauri-app/src/pages/medic.tsx | 134 -------------------------- 3 files changed, 2 insertions(+), 138 deletions(-) delete mode 100644 tauri-app/src/pages/medic.tsx diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index be69d99..d609656 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -3,7 +3,6 @@ import useWeb5Store from "./stores/useWeb5Store"; import { useEffect } from "react"; import Connect from "./pages/connect"; import Remedy from "./pages/remedy"; -import MedicPage from "./pages/medic"; import Doctors from "./pages/nearbyDoctor"; import HomePage from "./pages/Home"; import SharedLayout from "./pages/SharedLayout/"; @@ -21,7 +20,6 @@ const router = createHashRouter([ { path: "/records", element: }, { path: "/connect", element: }, { path: "/remedies", element: }, - { path: "/medic", element: }, { path: "/contact", element: }, { path: "/chat", element: }, ], diff --git a/tauri-app/src/pages/Records/index.tsx b/tauri-app/src/pages/Records/index.tsx index 46983e9..7c0d7e8 100644 --- a/tauri-app/src/pages/Records/index.tsx +++ b/tauri-app/src/pages/Records/index.tsx @@ -8,7 +8,7 @@ import DetailCardComponent from "../../components/DetailCardComponent"; import Card from "../../components/Card"; import { useProfile } from "@/stores/profile"; import useWeb5Store from "@/stores/useWeb5Store"; -import { fetchRecords } from "./utils"; +import { CardData, fetchRecords } from "./utils"; const index = () => { const agent = useWeb5Store(state => ({ web5: state.web5!, did: state.did! })) @@ -93,7 +93,7 @@ const index = () => { } onClick={() => setIsAddCardActive(!isAddCardActive)} > - +
    diff --git a/tauri-app/src/pages/medic.tsx b/tauri-app/src/pages/medic.tsx deleted file mode 100644 index 9ca1924..0000000 --- a/tauri-app/src/pages/medic.tsx +++ /dev/null @@ -1,134 +0,0 @@ -import { FunctionComponent, useEffect, useState } from "react"; -import useWeb5Store from "@/stores/useWeb5Store"; -import DocumentUtils from "@/utils/document"; -import { Record as DocumentRecord } from "@/utils/protocols/document"; -import { Record as Web5Record } from "@web5/api/browser"; -import AuthGuard from "@/components/Auth/Guard"; - -const possibleConditions = [ - "Cancer", - "Diabetes", - "Heart Disease", - "High Blood Pressure", - "High Cholesterol", - "Mental Illness", -] - -const Page: FunctionComponent = () => { - const agent = useWeb5Store((state) => ({ web5: state.web5!, did: state.did! })) - const [documentsWithUrl, setDocumentsWithUrl] = useState<{ document: DocumentRecord.Document, fileUrl: string, record: Web5Record }[]>([]) - const [form, setForm] = useState({ - name: "", - file: new File([], ""), - condition: possibleConditions[0] - }) - - useEffect(() => { - (async () => { - const docRecords = await DocumentUtils.fetchDocumentRecords(agent) - if (!docRecords) { - console.log("Failed to fetch document records") - return - } - - const docsWithUrl = [] - for (const docRecord of docRecords) { - const data: DocumentRecord.Document = await docRecord.data.json() - const fileRecord = await DocumentUtils.fetchBlobRecord(agent, data.url) - - if (!fileRecord) - continue - - const file = new File([await fileRecord.data.blob()], data.title, { type: data.encodingFormat }) - - docsWithUrl.push({ - record: docRecord, - document: data, - fileUrl: URL.createObjectURL(file), - }) - } - - setDocumentsWithUrl(docsWithUrl) - })() - }, []) - - const saveMedicalRecord = async () => { - const res = await DocumentUtils.createDocumentRecord(agent, form) - - if (res) { - alert(`Medical record saved: ${res}`) - } - else { - alert("Failed to save record") - } - } - - return ( -
    -
    { - e.preventDefault() - saveMedicalRecord() - }}> -
    - setForm({ ...form, name: e.target.value })} - placeholder="Name" /> -
    -
    - { - const fileList = e.target.files - if (!fileList) return - - const file = fileList[0] - if (!file) return - - setForm({ - ...form, - file: file - }) - }} - placeholder="Document" /> -
    -
    - -
    - -
    -
    - {documentsWithUrl.map(({ record, document, fileUrl: url }) => ( -
    - -
    - ))} -
    -
    - ) -} - -const MedicPage: FunctionComponent = () => { - return ( - - - - ) -} - -export default MedicPage From 1af754135a87dc8eeca6be6be34c411c68db1ac9 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 01:22:49 +0000 Subject: [PATCH 083/136] updated dev deps --- tauri-app/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/tauri-app/package.json b/tauri-app/package.json index 9c9b086..63472a0 100644 --- a/tauri-app/package.json +++ b/tauri-app/package.json @@ -48,6 +48,7 @@ "@types/react": "^18.2.15", "@types/react-dom": "^18.2.7", "@types/react-window": "^1.8.8", + "@types/readable-stream": "^4.0.10", "@vitejs/plugin-react": "^4.0.3", "autoprefixer": "^10.4.16", "postcss": "^8.4.32", From ccb8c54c2378a0c5f5191e5176802bda9af6df14 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 01:22:53 +0000 Subject: [PATCH 084/136] updated tsconfig --- tauri-app/tsconfig.json | 1 + 1 file changed, 1 insertion(+) diff --git a/tauri-app/tsconfig.json b/tauri-app/tsconfig.json index 36ff4af..0a1cb27 100644 --- a/tauri-app/tsconfig.json +++ b/tauri-app/tsconfig.json @@ -5,6 +5,7 @@ "lib": ["ES2020", "DOM", "DOM.Iterable"], "module": "ESNext", "skipLibCheck": true, + "esModuleInterop": true, /* Bundler mode */ "moduleResolution": "bundler", From ac3ef61814695982b31c50db515be16c3c7739df Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 01:23:16 +0000 Subject: [PATCH 085/136] remved comments --- tauri-app/src/pages/Records/index.tsx | 43 +-------------------------- 1 file changed, 1 insertion(+), 42 deletions(-) diff --git a/tauri-app/src/pages/Records/index.tsx b/tauri-app/src/pages/Records/index.tsx index 7c0d7e8..6a3c4ef 100644 --- a/tauri-app/src/pages/Records/index.tsx +++ b/tauri-app/src/pages/Records/index.tsx @@ -14,48 +14,7 @@ const index = () => { const agent = useWeb5Store(state => ({ web5: state.web5!, did: state.did! })) const profile = useProfile(state => state.state.profile!) - const [cardsData, setCardsData] = useState([ - // { - // title: "Diabetes Docs", - // description: "documentation of test ran for diagonese of diabtets slated for type dissertion", - // date: "1/2/24", - // file_extension: "pdf", - // file_name: "Diabetes_scan.pdf", - // }, - // { - // title: "Diabetes Docs", - // description: "documentation of test ran for diagonese of diabtets slated for type dissertion", - // date: "1/2/24", - // file_extension: "pdf", - // file_name: "Diabetes_scan.pdf", - // other_files: [ - // { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, - // { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, - // ], - // }, - // { - // title: "Diabetes Docs", - // description: "documentation of test ran for diagonese of diabtets slated for type dissertion", - // date: "1/2/24", - // file_extension: "docx", - // file_name: "Diabetes_test.docx", - // other_files: [ - // { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, - // { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, - // ], - // }, - // { - // desc: "documentation of test ran for diagonese of diabtets slated for type dissertion", - // date: "1/2/24", - // file_extension: "jpg", - // file_name: "D_IMG1103.jpg", - // file_1_url: "../../../public/pic.jpg", - // other_files: [ - // { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, - // { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, - // ], - // }, - ]); + const [cardsData, setCardsData] = useState([]); useEffect(() => { refetchRecords() From 7863d645dc273651d1e3b04fe12b21e6e955defc Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 01:26:33 +0000 Subject: [PATCH 086/136] fixed some type issues --- tauri-app/src/stores/profile.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tauri-app/src/stores/profile.ts b/tauri-app/src/stores/profile.ts index 62d2eee..f916d86 100644 --- a/tauri-app/src/stores/profile.ts +++ b/tauri-app/src/stores/profile.ts @@ -21,7 +21,7 @@ type State = { isSignedIn: false } -type Payload = Omit & { +type Payload = Omit & { profilePicture: File } From 618aa1e5100f6a988f0d407fe5c5be798b9b843b Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 07:28:55 +0000 Subject: [PATCH 087/136] updated the protocol version --- tauri-app/src/utils/user.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tauri-app/src/utils/user.ts b/tauri-app/src/utils/user.ts index 6d04b12..10dec36 100644 --- a/tauri-app/src/utils/user.ts +++ b/tauri-app/src/utils/user.ts @@ -93,7 +93,7 @@ async function createUserDetailsRecord(agent: Agent, payload: CreatePayload) { agent, { ...restPayload, - profilePictureUrl: blobRecord.id, + profilePictureId: blobRecord.id, dateCreated: new Date().toISOString() }, { @@ -153,7 +153,7 @@ async function updateUserDetailsRecord(agent: Agent, idOrRecord: string | Web5Re const data: UserDetailsProtocolRecord.Details = await record.data.json() const { profilePicture, ...restPayload } = payload - let url = data.profilePictureUrl + let url = data.profilePictureId if (profilePicture) { const blobRecord = await DocumentUtils.updateBlobRecord(agent, url, profilePicture) if (!blobRecord) return false @@ -179,7 +179,7 @@ async function deleteUserDetailsRecord(agent: Agent) { const profile: UserDetailsProtocolRecord.Details = await record.data.json() - const hasDeletedProfilePictureRecord = await DocumentUtils.deleteBlobRecord(agent, profile.profilePictureUrl) + const hasDeletedProfilePictureRecord = await DocumentUtils.deleteBlobRecord(agent, profile.profilePictureId) if (!hasDeletedProfilePictureRecord) return false const { status } = await agent.web5.dwn.records.delete({ From b29f11b4d8a32c412bfb8e7261142c5bca2ae180 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 07:29:08 +0000 Subject: [PATCH 088/136] updated the protocol version --- tauri-app/src/utils/protocols/defns.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tauri-app/src/utils/protocols/defns.ts b/tauri-app/src/utils/protocols/defns.ts index a634369..7af44e2 100644 --- a/tauri-app/src/utils/protocols/defns.ts +++ b/tauri-app/src/utils/protocols/defns.ts @@ -1 +1 @@ -export const url = "https://dschema.org/v0.0.5" as const +export const url = "https://dschema.org/v0.0.6" as const From b600b3f78dd36adf3b3b1e6509ad3076a08465d1 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 08:18:53 +0000 Subject: [PATCH 089/136] fixed bug --- tauri-app/src/App.tsx | 10 ++++++++-- tauri-app/src/components/Navbar/index.tsx | 11 ++++++----- tauri-app/src/pages/Home/SignUpForm.tsx | 13 ++++--------- tauri-app/src/pages/Home/index.tsx | 1 + tauri-app/src/pages/Records/utils.tsx | 2 ++ tauri-app/src/stores/profile.ts | 6 +++--- tauri-app/src/stores/pulseGlobalStore.ts | 13 ------------- tauri-app/src/utils/user.ts | 22 ++++++++++------------ 8 files changed, 34 insertions(+), 44 deletions(-) delete mode 100644 tauri-app/src/stores/pulseGlobalStore.ts diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index d609656..c88dc27 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -1,4 +1,4 @@ -import { RouterProvider, createHashRouter } from "react-router-dom"; +import { RouterProvider, createHashRouter, Navigate } from "react-router-dom"; import useWeb5Store from "./stores/useWeb5Store"; import { useEffect } from "react"; import Connect from "./pages/connect"; @@ -17,7 +17,13 @@ const router = createHashRouter([ element: , children: [ { path: "/", element: }, - { path: "/records", element: }, + { + path: "/records", element: ( + }> + + + ) + }, { path: "/connect", element: }, { path: "/remedies", element: }, { path: "/contact", element: }, diff --git a/tauri-app/src/components/Navbar/index.tsx b/tauri-app/src/components/Navbar/index.tsx index 73a729e..5b48669 100644 --- a/tauri-app/src/components/Navbar/index.tsx +++ b/tauri-app/src/components/Navbar/index.tsx @@ -1,7 +1,6 @@ import ProfileGuard from "../Auth/Profile/Guard"; import "./index.css"; import { NavLink } from "react-router-dom"; -import { usePulseGlobalStore } from "../../stores/pulseGlobalStore.ts"; import useWeb5Store from "@/stores/useWeb5Store.ts"; import { Agent } from "../Auth/types"; import { useProfile } from "@/stores/profile.ts"; @@ -16,8 +15,10 @@ const index = () => { const beginAuthFlow = async (agent: Agent) => { const signedIn = await signIn(agent) - if (!signedIn) + if (!signedIn) { + console.log("displaying auth modal") setShowAuthModal(true) + } } return ( @@ -74,9 +75,9 @@ const index = () => { } > diff --git a/tauri-app/src/pages/Home/SignUpForm.tsx b/tauri-app/src/pages/Home/SignUpForm.tsx index 2dfb6f6..68a1fe6 100644 --- a/tauri-app/src/pages/Home/SignUpForm.tsx +++ b/tauri-app/src/pages/Home/SignUpForm.tsx @@ -7,6 +7,7 @@ import { z } from "zod" import { zodResolver } from "@hookform/resolvers/zod" import { useForm } from "react-hook-form" import toast from "react-hot-toast"; +import { CreatePayload } from "@/utils/user"; const formSchema = z.object({ firstName: z.string().min(1), @@ -40,6 +41,7 @@ const FileUploader: FunctionComponent<{ onChange: (file: File | null) => void }> }; export default function SignUpForm() { + console.log("kfjle") const { web5, did } = useWeb5Store((state) => ({ web5: state.web5!, did: state.did! })); const submitBtnRef = useRef(null); const { setShowAuthModal, signUp, signIn } = useProfile( @@ -67,14 +69,7 @@ export default function SignUpForm() { } }) - type Payload = { - firstName: string - lastName: string - description: string - profilePicture: File - } - - const createProfile = async (agent: Agent, payload: Payload) => { + const createProfile = async (agent: Agent, payload: CreatePayload) => { const hasSignedUpSuccessfully = await signUp(agent, payload) if (!hasSignedUpSuccessfully) { @@ -82,7 +77,7 @@ export default function SignUpForm() { return } - if (!await signIn(agent)) return + if (!await signIn(agent)) return toast.success('Successfully signed up!') diff --git a/tauri-app/src/pages/Home/index.tsx b/tauri-app/src/pages/Home/index.tsx index 8ab5cf9..867031f 100644 --- a/tauri-app/src/pages/Home/index.tsx +++ b/tauri-app/src/pages/Home/index.tsx @@ -221,6 +221,7 @@ export default function HomePage() {
    {showAuthModal && ( + {console.log("fjekkfle") || null} )} diff --git a/tauri-app/src/pages/Records/utils.tsx b/tauri-app/src/pages/Records/utils.tsx index 6f36241..c1d36b6 100644 --- a/tauri-app/src/pages/Records/utils.tsx +++ b/tauri-app/src/pages/Records/utils.tsx @@ -32,6 +32,8 @@ export const fetchRecords = async (agent: Agent, profile: ProfileState) => { const otherFiles = otherFilesProcessing as Exclude[] + console.log(data.profileId) + console.log(data.profileId === profile.id) if (data.profileId === profile.id) { profileRecords.push({ title: data.title, diff --git a/tauri-app/src/stores/profile.ts b/tauri-app/src/stores/profile.ts index f916d86..bce5670 100644 --- a/tauri-app/src/stores/profile.ts +++ b/tauri-app/src/stores/profile.ts @@ -2,7 +2,7 @@ import { create } from "zustand" import { combine } from "zustand/middleware"; import { Record as UserDetailsProtocolRecord } from "@/utils/protocols/user"; import { Agent } from "@/components/Auth/types"; -import UserDetailsUtils from "@/utils/user"; +import UserDetailsUtils, { CreatePayload } from "@/utils/user"; import DocumentUtils from "@/utils/document"; export type ProfileState = { @@ -52,7 +52,7 @@ export const useProfile = create( const profile: UserDetailsProtocolRecord.Details = await profileRecord.data.json() - const profilePicture = await DocumentUtils.fetchBlobRecord(agent, profile.profilePictureUrl) + const profilePicture = await DocumentUtils.fetchBlobRecord(agent, profile.profilePictureId) let profilePictureUrl = "" if (profilePicture) { const profilePictureBlob = await profilePicture.data.blob() @@ -73,7 +73,7 @@ export const useProfile = create( return true }, - signUp: async (agent: Agent, payload: Payload) => { + signUp: async (agent: Agent, payload: CreatePayload) => { const profile = await UserDetailsUtils.createUserDetailsRecord(agent, payload) if (!profile) return false diff --git a/tauri-app/src/stores/pulseGlobalStore.ts b/tauri-app/src/stores/pulseGlobalStore.ts deleted file mode 100644 index 9252348..0000000 --- a/tauri-app/src/stores/pulseGlobalStore.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { create } from "zustand"; - -type PulseGlobalStore = { - showAuthModal: boolean; - toggleAuthModal: () => void; -}; - -export const usePulseGlobalStore = create((set) => ({ - showAuthModal: true, - toggleAuthModal: () => { - set((state) => ({ showAuthModal: !state.showAuthModal })); - }, -})); diff --git a/tauri-app/src/utils/user.ts b/tauri-app/src/utils/user.ts index 10dec36..91db42d 100644 --- a/tauri-app/src/utils/user.ts +++ b/tauri-app/src/utils/user.ts @@ -51,9 +51,9 @@ async function createRecord(agent: Agent, data: UserDetailsProto return record } -async function fetchRecords(agent: Agent, filter: FullFilterObj) { +async function fetchRecords(agent: Agent, filter: FullFilterObj, from?: string) { const { records, status } = await agent.web5.dwn.records.query({ - from: UserDetailsProtocolDID, + from, message: { filter: { ...filter, @@ -71,12 +71,10 @@ async function fetchRecords(agent: Agent, filter: FullFilterObj< return records } -type CreatePayload = { - firstName: string - lastName: string - description: string +export type CreatePayload = Omit & { profilePicture: File, } + async function createUserDetailsRecord(agent: Agent, payload: CreatePayload) { const existingRecord = await fetchUserDetailsRecord(agent) if (existingRecord) { @@ -129,12 +127,12 @@ async function fetchUserDetailsRecords(agent: Agent) { }) } -type UpdatePayload = Partial<{ - firstName: string - lastName: string - description: string - profilePicture: File -}> +type UpdatePayload = Partial< + Omit & + { + profilePicture: File, + } +> async function updateUserDetailsRecord(agent: Agent, idOrRecord: string | Web5Record, payload: Partial) { let record: Web5Record From a18ea86ebb4352a8ecbf375e7fbaa93b591ce536 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 08:19:42 +0000 Subject: [PATCH 090/136] updated protocol --- tauri-app/src/utils/protocols/defns.ts | 2 +- tauri-app/src/utils/protocols/user.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tauri-app/src/utils/protocols/defns.ts b/tauri-app/src/utils/protocols/defns.ts index 7af44e2..d2f24d1 100644 --- a/tauri-app/src/utils/protocols/defns.ts +++ b/tauri-app/src/utils/protocols/defns.ts @@ -1 +1 @@ -export const url = "https://dschema.org/v0.0.6" as const +export const url = "https://dschema.org/v0.0.7" as const diff --git a/tauri-app/src/utils/protocols/user.ts b/tauri-app/src/utils/protocols/user.ts index 227b09f..95967af 100644 --- a/tauri-app/src/utils/protocols/user.ts +++ b/tauri-app/src/utils/protocols/user.ts @@ -32,7 +32,7 @@ export namespace Record { export type Details = { firstName: string lastName: string - profilePictureUrl: string + profilePictureId: string description: string dateCreated: string } From b37e2c6028964db7630317869d2ef59874474930 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Sun, 7 Jan 2024 11:06:25 +0100 Subject: [PATCH 091/136] ahhhh finally found the right one for mobile about to start implementing it --- tauri-app/src/App.tsx | 9 ++--- .../src/components/Auth/Profile/Guard.tsx | 38 ++++++++++++------- tauri-app/src/components/Card/index.tsx | 2 +- tauri-app/src/components/Chat/index.css | 36 ++++++++++++++---- tauri-app/src/components/Chat/index.tsx | 12 ++++++ tauri-app/src/components/Navbar/index.tsx | 2 +- .../src/components/UserFriendList/index.css | 6 +-- .../src/components/UserFriendList/index.tsx | 6 +-- .../src/components/UserProfile/index.css | 5 ++- tauri-app/src/pages/Chat/index.css | 6 +-- 10 files changed, 82 insertions(+), 40 deletions(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index 77b379a..54a6107 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -38,11 +38,10 @@ function App() { return ( <> - <>{web5 ? :
    Connecting...
    } - + <> + {web5 ? :
    Connecting...
    } + + ); } diff --git a/tauri-app/src/components/Auth/Profile/Guard.tsx b/tauri-app/src/components/Auth/Profile/Guard.tsx index b20e4e8..d74f652 100644 --- a/tauri-app/src/components/Auth/Profile/Guard.tsx +++ b/tauri-app/src/components/Auth/Profile/Guard.tsx @@ -3,22 +3,34 @@ import AuthGuard from "../Guard"; import { useProfile } from "@/stores/profile"; import useWeb5Store from "@/stores/useWeb5Store"; -const Guard = ({ children, fallback }: PropsWithChildren & { fallback?: ReactNode }) => { - const agent = useWeb5Store(state => ({ web5: state.web5!, did: state.did! })) - const { isSignedIn, signIn } = useProfile(state => ({ isSignedIn: state.state.isSignedIn, signIn: state.signIn })) +const Guard = ({ + children, + fallback, +}: PropsWithChildren & { fallback?: ReactNode }) => { + const agent = useWeb5Store((state) => ({ + web5: state.web5!, + did: state.did!, + })); + const { isSignedIn, signIn } = useProfile((state) => ({ + isSignedIn: state.state.isSignedIn, + signIn: state.signIn, + })); useEffect(() => { - signIn(agent) - }, [signIn]) + signIn(agent); + }, [signIn]); - if (!isSignedIn) - return <>{fallback} ?? null + if (!isSignedIn) return <>{fallback} ?? null; - return <>{children} -} + return <>{children}; +}; -export default function ProfileGuard(props: PropsWithChildren & { fallback?: ReactNode }) { - return - - +export default function ProfileGuard( + props: PropsWithChildren & { fallback?: ReactNode }, +) { + return ( + + + + ); } diff --git a/tauri-app/src/components/Card/index.tsx b/tauri-app/src/components/Card/index.tsx index d61c871..994dabd 100644 --- a/tauri-app/src/components/Card/index.tsx +++ b/tauri-app/src/components/Card/index.tsx @@ -48,7 +48,7 @@ const index: FC = ({

    {title ? title : file_name}

    -

    {desc}

    +

    {desc.slice(0, 150)}

    {date} diff --git a/tauri-app/src/components/Chat/index.css b/tauri-app/src/components/Chat/index.css index b2b6a6f..a5a6d6c 100644 --- a/tauri-app/src/components/Chat/index.css +++ b/tauri-app/src/components/Chat/index.css @@ -16,9 +16,8 @@ } .chat-message-input-container input { - width: 80%; - height: 30px; - padding: 8px 12px; + width: 85%; + padding: 12px 8px; background: var(--color-slate-accent); border: none; border-radius: 25px; @@ -37,15 +36,36 @@ background: var(--color-blue); box-shadow: var(--box-shadow-blue); font-size: 20px; + outline: none; } .chats-container { - width: 95%; + width: 98%; background: var(--color-light-grey); - height: 90%; + height: 85%; padding: 12px; - border-radius: 15px; + border-radius: 15px 5px 5px 15px; margin: 0 auto; + overflow-y: scroll; + overflow-x: hidden; + height: 600px; +} + +.chats-container::-webkit-scrollbar { + width: 6px; +} + +.chats-container::-webkit-scrollbar-track { + box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.1); + border-radius: 0 15px 15px 0; + transform: translateX(-4px); +} + +.chats-container::-webkit-scrollbar-thumb { + width: 2px; + background: var(--color-blue); + border-radius: 5px; + margin: 0 3px; } .msg-container { @@ -60,7 +80,7 @@ padding: 4px 10px; border-radius: 8px 8px 8px 0px; margin-right: auto; - max-width: 300px; + max-width: 400px; } .msg-t { @@ -70,5 +90,5 @@ padding: 4px 10px; border-radius: 8px 8px 0px 8px; margin-left: auto; - max-width: 300px; + max-width: 400px; } diff --git a/tauri-app/src/components/Chat/index.tsx b/tauri-app/src/components/Chat/index.tsx index 9492f36..4bc8898 100644 --- a/tauri-app/src/components/Chat/index.tsx +++ b/tauri-app/src/components/Chat/index.tsx @@ -34,6 +34,18 @@ const index: FC = () => { } isLeft={true} /> + +
    diff --git a/tauri-app/src/components/Navbar/index.tsx b/tauri-app/src/components/Navbar/index.tsx index 73a729e..8bbe621 100644 --- a/tauri-app/src/components/Navbar/index.tsx +++ b/tauri-app/src/components/Navbar/index.tsx @@ -68,7 +68,7 @@ const index = () => { className="auth_container" onClick={() => web5 && did ? beginAuthFlow({ web5, did }) : null} > -

    Join us!

    +

    Connect Wallet

    } diff --git a/tauri-app/src/components/UserFriendList/index.css b/tauri-app/src/components/UserFriendList/index.css index dc82b4b..9082926 100644 --- a/tauri-app/src/components/UserFriendList/index.css +++ b/tauri-app/src/components/UserFriendList/index.css @@ -10,7 +10,7 @@ } .friend-tag-container h1 { - font-size: 18px; + font-size: 15px; font-family: "Roboto"; } @@ -38,12 +38,12 @@ padding: 8px 14px; border-radius: 15px; margin-top: 30px; - width: 300px; + width: 200px; } .friends-list-header { background: var(--color-blue); - padding: 4px 12px; + padding: 8px 12px; border-radius: 10px; color: var(--color-white); font-family: "Roboto"; diff --git a/tauri-app/src/components/UserFriendList/index.tsx b/tauri-app/src/components/UserFriendList/index.tsx index d76e959..38833b0 100644 --- a/tauri-app/src/components/UserFriendList/index.tsx +++ b/tauri-app/src/components/UserFriendList/index.tsx @@ -15,7 +15,7 @@ const FriendTag: FC = ({ return (
    -

    {friendName.slice(0, 60) + "..."}

    +

    {friendName.slice(0, 6) + "..."}

    { return (
    -

    - Friends 45 -

    +

    Friends

    {friendList.map((friend) => { diff --git a/tauri-app/src/components/UserProfile/index.css b/tauri-app/src/components/UserProfile/index.css index b426bd5..084e0cd 100644 --- a/tauri-app/src/components/UserProfile/index.css +++ b/tauri-app/src/components/UserProfile/index.css @@ -1,10 +1,11 @@ .userprofile-container { box-shadow: var(--box-shadow-black); - width: 300px; + width: 200px; text-align: center; border-radius: 15px; - padding: 8px 12px; + padding: 8px 11px; position: relative; + padding-bottom: 12px; } .userprofile-info-container img { diff --git a/tauri-app/src/pages/Chat/index.css b/tauri-app/src/pages/Chat/index.css index d96fd05..4632a88 100644 --- a/tauri-app/src/pages/Chat/index.css +++ b/tauri-app/src/pages/Chat/index.css @@ -4,16 +4,16 @@ justify-content: space-between; align-items: flex-start; position: relative; + max-height: 100%; } .utils-container { - width: 35%; + width: 30%; } .chat-container { - width: 60%; + width: 70%; height: 100%; - height: 40vh; } @media (max-width: 750px) { From a4bd25e15182a81276f7905f193fc1863668811a Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 11:36:59 +0000 Subject: [PATCH 092/136] removed log --- tauri-app/src/pages/Home/SignUpForm.tsx | 1 - tauri-app/src/pages/Home/index.tsx | 1 - 2 files changed, 2 deletions(-) diff --git a/tauri-app/src/pages/Home/SignUpForm.tsx b/tauri-app/src/pages/Home/SignUpForm.tsx index 68a1fe6..f059f00 100644 --- a/tauri-app/src/pages/Home/SignUpForm.tsx +++ b/tauri-app/src/pages/Home/SignUpForm.tsx @@ -81,7 +81,6 @@ export default function SignUpForm() { toast.success('Successfully signed up!') - setShowAuthModal(false) } diff --git a/tauri-app/src/pages/Home/index.tsx b/tauri-app/src/pages/Home/index.tsx index 867031f..8ab5cf9 100644 --- a/tauri-app/src/pages/Home/index.tsx +++ b/tauri-app/src/pages/Home/index.tsx @@ -221,7 +221,6 @@ export default function HomePage() {
    {showAuthModal && ( - {console.log("fjekkfle") || null} )} From d822ec116cab61011c499bfad2dd453036f6af08 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 11:37:16 +0000 Subject: [PATCH 093/136] return profile record after creating it --- tauri-app/src/stores/profile.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tauri-app/src/stores/profile.ts b/tauri-app/src/stores/profile.ts index bce5670..0592e03 100644 --- a/tauri-app/src/stores/profile.ts +++ b/tauri-app/src/stores/profile.ts @@ -55,7 +55,9 @@ export const useProfile = create( const profilePicture = await DocumentUtils.fetchBlobRecord(agent, profile.profilePictureId) let profilePictureUrl = "" if (profilePicture) { + console.log('fetching blob:', profilePicture.data) const profilePictureBlob = await profilePicture.data.blob() + console.log(profilePictureBlob) profilePictureUrl = URL.createObjectURL(profilePictureBlob) } @@ -77,7 +79,7 @@ export const useProfile = create( const profile = await UserDetailsUtils.createUserDetailsRecord(agent, payload) if (!profile) return false - return true + return profile } })) ) From c44e436aa1c32b467ed362c96be27b64bb27d36e Mon Sep 17 00:00:00 2001 From: Suruchi Kumari Date: Sun, 7 Jan 2024 17:46:29 +0530 Subject: [PATCH 094/136] Update README.md --- README.md | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0d3ea6a..5c39ce2 100644 --- a/README.md +++ b/README.md @@ -1 +1,59 @@ -# Web5-Hack \ No newline at end of file +# PulsePal 🌟 + +Safely store medical records with decentralized identifiers and web nodes, ensuring data security. Connect with similar conditions, share home remedies with a rating system, and access specialized doctors based on your location. PulsePal – where advanced technology meets user-friendly design for your secure, connected health journey. + +## What it does + +1. Secure Medical Record Storage: +- Users can securely store their medical records using decentralized identifiers (DIDs) in the app. +- Data stored through decentralized web nodes (DWNs) ensures security and user ownership. + +2. Connect with Similar Medical Conditions: +- An algorithm will match users based on their medical records, enabling them to chat and connect. +- Users can share experiences, insights, and support each other within the platform. + +3. Home Remedies Section: +- Users can contribute and share simple, effective home remedies. +- Remedies will be rated by users to gauge their usefulness. + +4. Recommend specialized doctors in your nearby areas, based on your current location + +## Setting up Local Development + +1. Clone the repository + +``` +git clone https://github.com/coder12git/Web5-Hack.git +``` + +2. Navigate to the project folder + +``` +cd Web5-Hack/tauri-app +``` + +3. Install dependencies + +``` +npm install +``` + +4. To start the server run + +``` +npm run dev +``` + +## What's next for Pulsepal + +1. Personalized Health Insights: "Our plan includes integrating AI-driven analytics to offer personalized health insights, assessing individual health risks and predicting future health trends based on users' medical records." + +2. Natural Language Processing (NLP) Chatbot: "We aim to implement an NLP-powered chatbot that assists users in comprehending medical terminology, interpreting test results, and providing preliminary guidance in emergencies based on entered symptoms." + +3. AI-Driven Diagnostics: "Incorporating an AI system for preliminary diagnostics, we intend to analyze symptoms and user-entered data to provide suggestive measures or identify potential health issues, prompting users to seek professional medical advice." + +4. Augmented Reality (AR) for First Aid Guidance: "Our future plan involves integrating AR technology to guide users through basic first aid procedures by overlaying instructional visuals onto real-time surroundings." + +5. Health Gamification and Incentivization: "To encourage healthy habits, we plan to introduce gamification within PulsePal, utilizing AI to personalize challenges, rewards, and reminders aligned with individual health goals." + +6. Predictive Appointment Scheduling: "Utilizing AI algorithms, we aim to predict potential health concerns or follow-up appointments based on stored medical records, proactively suggesting relevant appointments or check-ups." From 128a22c1278b68d73c4d9de785ffe2c8b9e85eff Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 12:32:50 +0000 Subject: [PATCH 095/136] removed script --- server/script.ts | 94 ------------------------------------------------ 1 file changed, 94 deletions(-) delete mode 100644 server/script.ts diff --git a/server/script.ts b/server/script.ts deleted file mode 100644 index e58a7e5..0000000 --- a/server/script.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { Web5 } from "@web5/api"; -import { protocols } from "@frontend/utils/protocols"; -import DocumentUtils from "@frontend/utils/document"; -import { Agent } from "@backend/utils"; - -async function configureProtocols(agent: Agent) { - console.log("=== CONFIGURE PROTOCOL ===") - - for (const protocol of protocols) { - const { protocols } = await agent.web5.dwn.protocols.query({ - message: { - filter: { - protocol: protocol.protocol, - } - } - }) - - if (protocols.length > 0) { - console.log("Protocol already exists:", protocol.protocol) - continue - } - - const { protocol: configuredProtocol, status: localProtocolConfigurationStatus } = await agent.web5.dwn.protocols.configure({ - message: { - definition: Object.assign({ ...protocol }), - } - }); - - if (!configuredProtocol) { - console.log("Failed to configure protocol:", localProtocolConfigurationStatus) - return - } - - console.log("Configured protocol on local DWN:", protocol.protocol) - const { status: remoteProtocolConfigurationStatus } = await configuredProtocol.send(agent.did) - - console.log("Sent protocol to remote DWN") - console.log(protocol.protocol, remoteProtocolConfigurationStatus) - } - - console.log("=== END CONFIGURE PROTOCOL ===") -} - -async function queryConditions(agent: Agent) { - console.log("=== QUERY CONDITIONS ===") - - const records = await DocumentUtils.fetchDocumentRecords(agent) - if (!records) { - console.log("No records found") - return - } - - if (records.length > 0) { - for (const record of records) { - // console.log("author:", record.author) - // console.log("recipient:", record.recipient) - // Bun.write("records/" + record.id + ".json", JSON.stringify(record)) - // console.log(record.author === record.target) - console.log(await record.data.json()) - } - } - - console.log("=== END QUERY CONDITIONS ===") -} - -async function createCondition(agent: Agent) { - console.log("=== CREATE CONDITION ===") - - const record = await DocumentUtils.createDocumentRecord(agent, { name: "test", condition: "command", file: new File([], "", { type: "image/png" }) }) - - if (!record) return false - - console.log("=== END CREATE CONDITION ===") -} - -async function connect() { - console.log("=== CONNECT ===") - const agent = await Web5.connect({ - sync: "5s", - }); - - console.log("=== END CONNECT ===") - - return agent -} -async function main() { - const agent = await connect() - await configureProtocols(agent) - await queryConditions(agent) - // await createCondition(agent) - // await queryConditions(agent) -} - -main() From 683c2b7bfa00c20d647c1f1cc431bdee4c672c0f Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 12:35:25 +0000 Subject: [PATCH 096/136] updated the protocol and record form --- .gitignore | 1 + tauri-app/src/components/Auth/Profile/Guard.tsx | 8 +------- tauri-app/src/components/Card/index.tsx | 2 +- tauri-app/src/pages/Home/SignUpForm.tsx | 1 - tauri-app/src/pages/Records/utils.tsx | 5 +++-- tauri-app/src/stores/profile.ts | 6 ++---- 6 files changed, 8 insertions(+), 15 deletions(-) diff --git a/.gitignore b/.gitignore index 649ac14..a873b84 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ pnpm-lock.yaml *.tsbuildinfo +utils/ diff --git a/tauri-app/src/components/Auth/Profile/Guard.tsx b/tauri-app/src/components/Auth/Profile/Guard.tsx index b20e4e8..527f8bf 100644 --- a/tauri-app/src/components/Auth/Profile/Guard.tsx +++ b/tauri-app/src/components/Auth/Profile/Guard.tsx @@ -1,15 +1,9 @@ import { PropsWithChildren, ReactNode, useEffect } from "react"; import AuthGuard from "../Guard"; import { useProfile } from "@/stores/profile"; -import useWeb5Store from "@/stores/useWeb5Store"; const Guard = ({ children, fallback }: PropsWithChildren & { fallback?: ReactNode }) => { - const agent = useWeb5Store(state => ({ web5: state.web5!, did: state.did! })) - const { isSignedIn, signIn } = useProfile(state => ({ isSignedIn: state.state.isSignedIn, signIn: state.signIn })) - - useEffect(() => { - signIn(agent) - }, [signIn]) + const { isSignedIn } = useProfile(state => ({ isSignedIn: state.state.isSignedIn, signIn: state.signIn })) if (!isSignedIn) return <>{fallback} ?? null diff --git a/tauri-app/src/components/Card/index.tsx b/tauri-app/src/components/Card/index.tsx index d61c871..4edfdac 100644 --- a/tauri-app/src/components/Card/index.tsx +++ b/tauri-app/src/components/Card/index.tsx @@ -48,7 +48,7 @@ const index: FC = ({

    {title ? title : file_name}

    -

    {desc}

    +

    {desc.substring(0, 50)}

    {date} diff --git a/tauri-app/src/pages/Home/SignUpForm.tsx b/tauri-app/src/pages/Home/SignUpForm.tsx index f059f00..b232969 100644 --- a/tauri-app/src/pages/Home/SignUpForm.tsx +++ b/tauri-app/src/pages/Home/SignUpForm.tsx @@ -41,7 +41,6 @@ const FileUploader: FunctionComponent<{ onChange: (file: File | null) => void }> }; export default function SignUpForm() { - console.log("kfjle") const { web5, did } = useWeb5Store((state) => ({ web5: state.web5!, did: state.did! })); const submitBtnRef = useRef(null); const { setShowAuthModal, signUp, signIn } = useProfile( diff --git a/tauri-app/src/pages/Records/utils.tsx b/tauri-app/src/pages/Records/utils.tsx index c1d36b6..852ceac 100644 --- a/tauri-app/src/pages/Records/utils.tsx +++ b/tauri-app/src/pages/Records/utils.tsx @@ -2,6 +2,7 @@ import { Agent } from "@/components/Auth/types" import { ProfileState } from "@/stores/profile" import { Record as DocumentRecord } from "@/utils/protocols/document"; import DocumentUtils from "@/utils/document" +import BlobUtils from "@/utils/blob"; export const fetchRecords = async (agent: Agent, profile: ProfileState) => { const records = await DocumentUtils.fetchDocumentRecords(agent) @@ -10,12 +11,12 @@ export const fetchRecords = async (agent: Agent, profile: ProfileState) => { const profileRecords = [] for (const record of records) { const data: DocumentRecord.Document = await record.data.json() - const fileRecord = await DocumentUtils.fetchBlobRecord(agent, data.file.id) + const fileRecord = await BlobUtils.fetchBlobRecord(agent, { recordId: data.file.id }) if (!fileRecord) continue const fileData = await fileRecord.data.blob() const otherFilesProcessing = await Promise.all(data.otherFiles.map(async file => { - const record = await DocumentUtils.fetchBlobRecord(agent, file.id) + const record = await BlobUtils.fetchBlobRecord(agent, { recordId: file.id }) if (!record) return false const data = await record.data.blob() diff --git a/tauri-app/src/stores/profile.ts b/tauri-app/src/stores/profile.ts index 0592e03..69aa213 100644 --- a/tauri-app/src/stores/profile.ts +++ b/tauri-app/src/stores/profile.ts @@ -3,7 +3,7 @@ import { combine } from "zustand/middleware"; import { Record as UserDetailsProtocolRecord } from "@/utils/protocols/user"; import { Agent } from "@/components/Auth/types"; import UserDetailsUtils, { CreatePayload } from "@/utils/user"; -import DocumentUtils from "@/utils/document"; +import BlobUtils from "@/utils/blob"; export type ProfileState = { id: string @@ -52,12 +52,10 @@ export const useProfile = create( const profile: UserDetailsProtocolRecord.Details = await profileRecord.data.json() - const profilePicture = await DocumentUtils.fetchBlobRecord(agent, profile.profilePictureId) + const profilePicture = await BlobUtils.fetchBlobRecord(agent, { recordId: profile.profilePictureId }) let profilePictureUrl = "" if (profilePicture) { - console.log('fetching blob:', profilePicture.data) const profilePictureBlob = await profilePicture.data.blob() - console.log(profilePictureBlob) profilePictureUrl = URL.createObjectURL(profilePictureBlob) } From ba64d6d679442ae0a457de901c4af8aec6474e8c Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 12:36:31 +0000 Subject: [PATCH 097/136] updated protocols --- tauri-app/src/utils/document.ts | 124 +++------------------- tauri-app/src/utils/protocols/defns.ts | 2 +- tauri-app/src/utils/protocols/document.ts | 23 ---- tauri-app/src/utils/protocols/index.ts | 2 + tauri-app/src/utils/user.ts | 37 ++++--- 5 files changed, 41 insertions(+), 147 deletions(-) diff --git a/tauri-app/src/utils/document.ts b/tauri-app/src/utils/document.ts index ab8245d..47382b6 100644 --- a/tauri-app/src/utils/document.ts +++ b/tauri-app/src/utils/document.ts @@ -1,5 +1,6 @@ import { Web5, Record as Web5Record } from "@web5/api/browser" -import DocumentProtocol, { Record as DocumentProtocolRecord, did as DocumentProtocolDID } from "./protocols/document"; +import DocumentProtocol, { Record } from "./protocols/document"; +import BlobUtils from "./blob"; import _ from "lodash"; type Agent = { @@ -27,10 +28,7 @@ type FullMessageObj = { published: typeof DocumentProtocol["published"] } -async function createRecord(agent: Agent, data: DocumentProtocolRecord.Document, message: FullMessageObj<"document">): Promise; -async function createRecord(agent: Agent, data: DocumentProtocolRecord.File, message: FullMessageObj<"blob">): Promise; - -async function createRecord(agent: Agent, data: DocumentProtocolRecord.Document | DocumentProtocolRecord.File, message: FullMessageObj) { +async function createRecord(agent: Agent, data: Record.Document, message: FullMessageObj) { const { record, status } = await agent.web5.dwn.records.create({ data, message: Object.assign({ @@ -44,7 +42,8 @@ async function createRecord(agent: Agent, data: DocumentProtocol return false } - const { status: syncStatus } = await record.send(DocumentProtocolDID) + // const { status: syncStatus } = await record.send(DocumentProtocolDID) + const { status: syncStatus } = await record.send(agent.did) if (syncStatus.code !== 202) { console.log("Failed to sync record with remote DWN:", syncStatus) @@ -55,7 +54,7 @@ async function createRecord(agent: Agent, data: DocumentProtocol async function fetchRecords(agent: Agent, filter: FullFilterObj) { const { records, status } = await agent.web5.dwn.records.query({ - from: DocumentProtocolDID, + // from: DocumentProtocolDID, message: { filter: { ...filter, @@ -73,7 +72,7 @@ async function fetchRecords(agent: Agent, filter: FullFilterObj< return records } -type CreatePayload = Omit & +type CreatePayload = Omit & { title?: string file: File, @@ -83,7 +82,7 @@ type CreatePayload = Omit, - published: DocumentProtocol.published, - } - ) - - if (!record) { - console.error("Failed to create blob record") - return false - } - - return record -} - async function fetchDocumentRecord(agent: Agent, filter: FilterObj) { const records = await fetchRecords(agent, { ...filter, @@ -169,26 +148,8 @@ async function fetchDocumentRecords(agent: Agent) { }) } -async function fetchBlobRecord(agent: Agent, id: string) { - const records = await fetchRecords(agent, { - protocolPath: "blob", - schema: DocumentProtocol.types.blob.schema, - }) - - if (!records || !records[0]) return false - - return records[0] -} - -async function fetchBlobRecords(agent: Agent) { - return fetchRecords(agent, { - protocolPath: "blob", - schema: DocumentProtocol.types.blob.schema, - }) -} - type UpdatePayload = Partial< - Omit & + Omit & { file: File, otherFiles: File[] @@ -212,12 +173,12 @@ async function updateDocumentRecord(agent: Agent, idOrRecord: string | Web5Recor record = idOrRecord } - const data: DocumentProtocolRecord.Document = await record.data.json() + const data: Record.Document = await record.data.json() const { file, otherFiles, ...restPayload } = payload const fileData = data.file if (file) { - const blobRecord = await updateBlobRecord(agent, data.file.id, file) + const blobRecord = await BlobUtils.updateBlobRecord(agent, data.file.id, { file }) if (!blobRecord) return false fileData.id = blobRecord.id @@ -232,7 +193,7 @@ async function updateDocumentRecord(agent: Agent, idOrRecord: string | Web5Recor const file = otherFiles[i] const otherFile = otherFilesData[i] - const blobRecord = await updateBlobRecord(agent, otherFile.id, file) + const blobRecord = await BlobUtils.updateBlobRecord(agent, otherFile.id, { file }) if (!blobRecord) return false otherFile.id = blobRecord.id @@ -248,7 +209,7 @@ async function updateDocumentRecord(agent: Agent, idOrRecord: string | Web5Recor for (let i = otherFilesData.length; i < otherFiles.length; i++) { const file = otherFiles[i] - const blobRecord = await createBlobRecord(agent, file) + const blobRecord = await BlobUtils.createBlobRecord(agent, { file }) if (!blobRecord) return false otherFilesData.push({ @@ -273,33 +234,6 @@ async function updateDocumentRecord(agent: Agent, idOrRecord: string | Web5Recor return record } -async function updateBlobRecord(agent: Agent, id: string, file: File): Promise; -async function updateBlobRecord(agent: Agent, record: Web5Record, file: File): Promise; - -async function updateBlobRecord(agent: Agent, idOrRecord: string | Web5Record, file: File): Promise { - let record: Web5Record - - if (typeof idOrRecord === "string") { - const blobRecord = await fetchBlobRecord(agent, idOrRecord) - if (!blobRecord) return false - record = blobRecord - } - else { - record = idOrRecord - } - - const { status } = await record.update({ - data: new Blob([file], { type: file.type }) - }) - - if (status.code !== 202) { - console.log("Failed to sync blob record update with remote DWN:", status) - return false - } - - return record -} - async function deleteDocumentRecord(agent: Agent, id: string): Promise; async function deleteDocumentRecord(agent: Agent, record: Web5Record): Promise; @@ -317,13 +251,13 @@ async function deleteDocumentRecord(agent: Agent, idOrRecord: string | Web5Recor record = idOrRecord } - const document: DocumentProtocolRecord.Document = await record.data.json() + const document: Record.Document = await record.data.json() - const hasDeletedBlobRecord = await deleteBlobRecord(agent, document.file.id) + const hasDeletedBlobRecord = await BlobUtils.deleteBlobRecord(agent, document.file.id) if (!hasDeletedBlobRecord) return false for (const otherFile of document.otherFiles) { - await deleteBlobRecord(agent, otherFile.id) + await BlobUtils.deleteBlobRecord(agent, otherFile.id) } const { status } = await agent.web5.dwn.records.delete({ @@ -339,36 +273,12 @@ async function deleteDocumentRecord(agent: Agent, idOrRecord: string | Web5Recor return true } -async function deleteBlobRecord(agent: Agent, id: string): Promise; -async function deleteBlobRecord(agent: Agent, record: Web5Record): Promise; - -async function deleteBlobRecord(agent: Agent, idOrRecord: string | Web5Record): Promise { - const record = typeof idOrRecord === "string" ? await fetchBlobRecord(agent, idOrRecord) : idOrRecord - if (!record) return false - - const { status } = await agent.web5.dwn.records.delete({ - message: { - recordId: record.id - } - }) - if (status.code !== 202) { - console.log("Failed to delete blob record:", status) - return false - } - - return true -} - const DocumentUtils = { createDocumentRecord, - createBlobRecord, fetchDocumentRecord, fetchDocumentRecords, - fetchBlobRecord, updateDocumentRecord, - updateBlobRecord, deleteDocumentRecord, - deleteBlobRecord } export default DocumentUtils diff --git a/tauri-app/src/utils/protocols/defns.ts b/tauri-app/src/utils/protocols/defns.ts index d2f24d1..b1ffec6 100644 --- a/tauri-app/src/utils/protocols/defns.ts +++ b/tauri-app/src/utils/protocols/defns.ts @@ -1 +1 @@ -export const url = "https://dschema.org/v0.0.7" as const +export const url = "https://dschema.org/v0.0.8" as const diff --git a/tauri-app/src/utils/protocols/document.ts b/tauri-app/src/utils/protocols/document.ts index 33838c2..a13f7e6 100644 --- a/tauri-app/src/utils/protocols/document.ts +++ b/tauri-app/src/utils/protocols/document.ts @@ -10,15 +10,6 @@ const DocumentProtocol = { dataFormats: [ "application/json" ] - }, - blob: { - schema: `${protocol}/schema/blob.json`, - dataFormats: [ - "image/png", - "image/jpeg", - "image/jpg", - "application/pdf" - ] } }, structure: { @@ -33,18 +24,6 @@ const DocumentProtocol = { can: "write" } ] - }, - blob: { - $actions: [ - { - who: "anyone", - can: "read" - }, - { - who: "anyone", - can: "write" - } - ] } } } as const @@ -57,8 +36,6 @@ export namespace Record { name: string } - export type File = Blob - export type Document = { title: string file: FileMeta, diff --git a/tauri-app/src/utils/protocols/index.ts b/tauri-app/src/utils/protocols/index.ts index 1c0a671..e6a7e25 100644 --- a/tauri-app/src/utils/protocols/index.ts +++ b/tauri-app/src/utils/protocols/index.ts @@ -1,9 +1,11 @@ import DocumentProtocol from "./document" import ConditionsProtocol from "./conditions" import UserDetailsProtocol from "./user" +import BlobProtocol from "./blob" export const protocols = [ DocumentProtocol, + BlobProtocol, UserDetailsProtocol, ConditionsProtocol, ] diff --git a/tauri-app/src/utils/user.ts b/tauri-app/src/utils/user.ts index 91db42d..73b8238 100644 --- a/tauri-app/src/utils/user.ts +++ b/tauri-app/src/utils/user.ts @@ -1,7 +1,7 @@ import { Web5, Record as Web5Record } from "@web5/api/browser" import UserDetailsProtocol, { Record as UserDetailsProtocolRecord, did as UserDetailsProtocolDID } from "./protocols/user"; -import DocumentUtils from "./document"; import _ from "lodash"; +import BlobUtils from "./blob"; type Agent = { web5: Web5 @@ -42,18 +42,22 @@ async function createRecord(agent: Agent, data: UserDetailsProto return false } - const { status: syncStatus } = await record.send(UserDetailsProtocolDID) + const { status: protocolDwnSyncStatus } = await record.send(UserDetailsProtocolDID) + if (protocolDwnSyncStatus.code !== 202) { + console.log("Failed to sync record with protocol remote DWN:", protocolDwnSyncStatus) + } - if (syncStatus.code !== 202) { - console.log("Failed to sync record with remote DWN:", syncStatus) + const { status: remoteDwnSyncStatus } = await record.send(agent.did) + if (remoteDwnSyncStatus.code !== 202) { + console.log("Failed to sync record with remote DWN:", remoteDwnSyncStatus) } return record } -async function fetchRecords(agent: Agent, filter: FullFilterObj, from?: string) { +async function fetchRecords(agent: Agent, filter: FullFilterObj, remote?: boolean) { const { records, status } = await agent.web5.dwn.records.query({ - from, + from: remote ? UserDetailsProtocolDID : undefined, message: { filter: { ...filter, @@ -82,7 +86,7 @@ async function createUserDetailsRecord(agent: Agent, payload: CreatePayload) { return false } - const blobRecord = await DocumentUtils.createBlobRecord(agent, payload.profilePicture) + const blobRecord = await BlobUtils.createBlobRecord(agent, { file: payload.profilePicture }, true) if (!blobRecord) return false const { profilePicture, ...restPayload } = payload @@ -109,13 +113,13 @@ async function createUserDetailsRecord(agent: Agent, payload: CreatePayload) { return record } -async function fetchUserDetailsRecord(agent: Agent) { +async function fetchUserDetailsRecord(agent: Agent, remote?: boolean) { const records = await fetchRecords(agent, { schema: UserDetailsProtocol.types.details.schema, protocolPath: "details", - }) + }, remote) - if (!records || !records[0]) return false + if (!records) return false return records[0] } @@ -124,7 +128,7 @@ async function fetchUserDetailsRecords(agent: Agent) { return fetchRecords(agent, { protocolPath: "details", schema: UserDetailsProtocol.types.details.schema, - }) + }, true) } type UpdatePayload = Partial< @@ -151,16 +155,16 @@ async function updateUserDetailsRecord(agent: Agent, idOrRecord: string | Web5Re const data: UserDetailsProtocolRecord.Details = await record.data.json() const { profilePicture, ...restPayload } = payload - let url = data.profilePictureId + let profilePictureId = data.profilePictureId if (profilePicture) { - const blobRecord = await DocumentUtils.updateBlobRecord(agent, url, profilePicture) + const blobRecord = await BlobUtils.updateBlobRecord(agent, profilePictureId, { file: profilePicture }) if (!blobRecord) return false - url = blobRecord.id + profilePictureId = blobRecord.id } const { status } = await record.update({ - data: _.merge(data, Object.assign(restPayload, { url })) + data: _.merge(data, Object.assign(restPayload, { profilePictureId })) }) if (status.code !== 202) { @@ -177,7 +181,7 @@ async function deleteUserDetailsRecord(agent: Agent) { const profile: UserDetailsProtocolRecord.Details = await record.data.json() - const hasDeletedProfilePictureRecord = await DocumentUtils.deleteBlobRecord(agent, profile.profilePictureId) + const hasDeletedProfilePictureRecord = await BlobUtils.deleteBlobRecord(agent, profile.profilePictureId) if (!hasDeletedProfilePictureRecord) return false const { status } = await agent.web5.dwn.records.delete({ @@ -196,6 +200,7 @@ async function deleteUserDetailsRecord(agent: Agent) { const UserDetailsUtils = { fetchUserDetailsRecord, + fetchUserDetailsRecords, updateUserDetailsRecord, createUserDetailsRecord, deleteUserDetailsRecord From a05c87d667beb5b0440025550b44dc5bcad73e53 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 12:37:03 +0000 Subject: [PATCH 098/136] added a new blob protocol --- tauri-app/src/utils/blob.ts | 181 ++++++++++++++++++++++++++ tauri-app/src/utils/protocols/blob.ts | 42 ++++++ 2 files changed, 223 insertions(+) create mode 100644 tauri-app/src/utils/blob.ts create mode 100644 tauri-app/src/utils/protocols/blob.ts diff --git a/tauri-app/src/utils/blob.ts b/tauri-app/src/utils/blob.ts new file mode 100644 index 0000000..67ea009 --- /dev/null +++ b/tauri-app/src/utils/blob.ts @@ -0,0 +1,181 @@ +import { Web5, Record as Web5Record } from "@web5/api/browser" +import BlobProtocol, { Record, did as BlobProtocolDID } from "./protocols/blob"; +import _ from "lodash"; + +type Agent = { + web5: Web5 + did: string +} + +type FilterObj = { + recordId: string, +} + +type Type = keyof typeof BlobProtocol["types"] +type Schema = typeof BlobProtocol["types"][T]["schema"] +type DataFormat = typeof BlobProtocol["types"][T]["dataFormats"][number] + +type FullFilterObj = { + protocolPath: T + schema: Schema +} + +type FullMessageObj = { + schema: Schema + protocolPath: T + dataFormat: DataFormat + published: typeof BlobProtocol["published"] +} + +async function createRecord(agent: Agent, data: Record.Blob, message: FullMessageObj, remote?: boolean) { + const { record, status } = await agent.web5.dwn.records.create({ + data, + message: Object.assign({ + ...message, + protocol: BlobProtocol.protocol, + }) + }); + + if (!record) { + console.error("Failed to create record:", status) + return false + } + + if (remote) { + const { status: syncStatus } = await record.send(BlobProtocolDID) + + if (syncStatus.code !== 202) { + console.log("Failed to sync record protocol with remote DWN:", syncStatus) + return false + } + } + + const { status: syncStatus } = await record.send(agent.did) + + if (syncStatus.code !== 202) { + console.log("Failed to sync record with remote DWN:", syncStatus) + + if (remote) + return false + } + + return record +} + +async function fetchRecords(agent: Agent, filter: FullFilterObj, remote?: boolean) { + const { records, status } = await agent.web5.dwn.records.query({ + from: remote ? BlobProtocolDID : undefined, + message: { + filter: { + ...filter, + protocol: BlobProtocol.protocol, + }, + // @ts-ignore + dateSort: "createdAscending", + }, + }); + + if (!records) { + console.log("Failed to fetch records:", status) + return false + } + return records +} + +type CreatePayload = { + file: File +} +async function createBlobRecord(agent: Agent, payload: CreatePayload, remote?: boolean) { + const { file } = payload + + const record = await createRecord( + agent, + new Blob([file], { type: file.type }), + { + schema: BlobProtocol.types.blob.schema, + protocolPath: "blob", + dataFormat: file.type as DataFormat<"blob">, + published: BlobProtocol.published, + }, + remote + ) + + if (!record) { + console.error("Failed to create blob record") + return false + } + + return record +} + +async function fetchBlobRecord(agent: Agent, filter: FilterObj) { + const records = await fetchRecords(agent, { + ...filter, + protocolPath: "blob", + schema: BlobProtocol.types.blob.schema, + }) + + if (!records || !records[0]) return false + + return records[0] +} + +async function fetchBlobRecords(agent: Agent) { + return fetchRecords(agent, { + protocolPath: "blob", + schema: BlobProtocol.types.blob.schema, + }) +} + +type UpdatePayload = CreatePayload + +async function updateBlobRecord(agent: Agent, id: string, payload: UpdatePayload): Promise; +async function updateBlobRecord(agent: Agent, record: Web5Record, payload: UpdatePayload): Promise; + +async function updateBlobRecord(agent: Agent, idOrRecord: string | Web5Record, payload: UpdatePayload): Promise { + const { file } = payload + + const record = typeof idOrRecord === "string" ? await fetchBlobRecord(agent, { recordId: idOrRecord }) : idOrRecord + if (!record) return false + + const { status } = await record.update({ + data: new Blob([file], { type: file.type }) + }) + + if (status.code !== 202) { + console.log("Failed to sync blob record update with remote DWN:", status) + return false + } + + return record +} + +async function deleteBlobRecord(agent: Agent, id: string): Promise; +async function deleteBlobRecord(agent: Agent, record: Web5Record): Promise; + +async function deleteBlobRecord(agent: Agent, idOrRecord: string | Web5Record): Promise { + const record = typeof idOrRecord === "string" ? await fetchBlobRecord(agent, { recordId: idOrRecord }) : idOrRecord + if (!record) return false + + const { status } = await agent.web5.dwn.records.delete({ + message: { + recordId: record.id + } + }) + if (status.code !== 202) { + console.log("Failed to delete blob record:", status) + return false + } + + return true +} + +const BlobUtils = { + createBlobRecord, + fetchBlobRecords, + fetchBlobRecord, + updateBlobRecord, + deleteBlobRecord +} + +export default BlobUtils diff --git a/tauri-app/src/utils/protocols/blob.ts b/tauri-app/src/utils/protocols/blob.ts new file mode 100644 index 0000000..f6d65a5 --- /dev/null +++ b/tauri-app/src/utils/protocols/blob.ts @@ -0,0 +1,42 @@ +import { url } from "./defns" +const protocol = `${url}/protocols/blob` as const + +const BlobProtocol = { + protocol, + published: true, + types: { + blob: { + schema: `${protocol}/schema/blob.json`, + dataFormats: [ + "image/png", + "image/jpeg", + "image/jpg", + "application/pdf" + ] + } + }, + structure: { + blob: { + $actions: [ + { + who: "anyone", + // of: "blob", + can: "read" + }, + { + who: "anyone", + // of: "blob", + can: "write" + } + ] + } + } +} as const + +export namespace Record { + export type Blob = globalThis.Blob +} + +export const did = "did:ion:EiAx_twrw3f0yLOv3Pe6pk4gWG4miV9SVXiHe_Q4lMn8Ow:eyJkZWx0YSI6eyJwYXRjaGVzIjpbeyJhY3Rpb24iOiJyZXBsYWNlIiwiZG9jdW1lbnQiOnsicHVibGljS2V5cyI6W3siaWQiOiJkd24tc2lnIiwicHVibGljS2V5SndrIjp7ImNydiI6IkVkMjU1MTkiLCJrdHkiOiJPS1AiLCJ4IjoiV1M1QXFqeDA1V2Z0YWMwYUhYRnpGNV9wZjM2eTVPQ0N0Qy1tM1lCTFo4WSJ9LCJwdXJwb3NlcyI6WyJhdXRoZW50aWNhdGlvbiJdLCJ0eXBlIjoiSnNvbldlYktleTIwMjAifSx7ImlkIjoiZHduLWVuYyIsInB1YmxpY0tleUp3ayI6eyJjcnYiOiJzZWNwMjU2azEiLCJrdHkiOiJFQyIsIngiOiJpSnpYYkljR0FHdm1QMzd2Z2VfTjB1M3FadllmLWpteGdyM2RTaDUtOE5vIiwieSI6InBBc1BuQ1hLcXlXRWhiS1ZDWjFJejhrWkljVVRXQXBNS2NOS3VtQ3R4T2cifSwicHVycG9zZXMiOlsia2V5QWdyZWVtZW50Il0sInR5cGUiOiJKc29uV2ViS2V5MjAyMCJ9XSwic2VydmljZXMiOlt7ImlkIjoiZHduIiwic2VydmljZUVuZHBvaW50Ijp7ImVuY3J5cHRpb25LZXlzIjpbIiNkd24tZW5jIl0sIm5vZGVzIjpbImh0dHBzOi8vZHduLnRiZGRldi5vcmcvZHduNSIsImh0dHBzOi8vZHduLnRiZGRldi5vcmcvZHduMyJdLCJzaWduaW5nS2V5cyI6WyIjZHduLXNpZyJdfSwidHlwZSI6IkRlY2VudHJhbGl6ZWRXZWJOb2RlIn1dfX1dLCJ1cGRhdGVDb21taXRtZW50IjoiRWlBSVIyQWFjQXZFVi16ODgwWHl2eHB4bWMzWDJkbDdYVmcwRHdWTGtfTms0QSJ9LCJzdWZmaXhEYXRhIjp7ImRlbHRhSGFzaCI6IkVpRGlvWktVc3cyZ0gzU29Nb0V5T0duVE9NQkZURFhZZ1hFX3Z6am5RU0M5aUEiLCJyZWNvdmVyeUNvbW1pdG1lbnQiOiJFaUQzU0JIaEtXXzduUF9QamV1WDcybDRjcXVTMWVPVTBCUk1EcW1vdnFpVGxnIn19" + +export default BlobProtocol From 5c090e30102a1df35560867a13b90f2e156ec8c7 Mon Sep 17 00:00:00 2001 From: coder12git Date: Sun, 7 Jan 2024 18:10:52 +0530 Subject: [PATCH 099/136] added chat initialization and deleted server Signed-off-by: coder12git --- server/.gitignore | 146 --- server/package-lock.json | 2354 ---------------------------------- server/package.json | 18 - server/script.ts | 94 -- server/server.ts | 9 - server/src/app.ts | 32 - server/src/middleware.ts | 22 - server/src/utils.ts | 89 -- server/tsconfig.json | 22 - tauri-app/package-lock.json | 54 +- tauri-app/src/pages/chat.tsx | 278 ++++ 11 files changed, 330 insertions(+), 2788 deletions(-) delete mode 100644 server/.gitignore delete mode 100644 server/package-lock.json delete mode 100644 server/package.json delete mode 100644 server/script.ts delete mode 100644 server/server.ts delete mode 100644 server/src/app.ts delete mode 100644 server/src/middleware.ts delete mode 100644 server/src/utils.ts delete mode 100644 server/tsconfig.json create mode 100644 tauri-app/src/pages/chat.tsx diff --git a/server/.gitignore b/server/.gitignore deleted file mode 100644 index 5b81ddf..0000000 --- a/server/.gitignore +++ /dev/null @@ -1,146 +0,0 @@ -# Created by https://www.toptal.com/developers/gitignore/api/node -# Edit at https://www.toptal.com/developers/gitignore?templates=node - -### Node ### -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* -.pnpm-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional stylelint cache -.stylelintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variable files -.env -.env.development.local -.env.test.local -.env.production.local -.env.local - -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Next.js build output -.next -out - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# vuepress v2.x temp and cache directory -.temp - -# Docusaurus cache and generated files -.docusaurus - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* - -### Node Patch ### -# Serverless Webpack directories -.webpack/ - -# Optional stylelint cache - -# SvelteKit build / generate output -.svelte-kit - -# End of https://www.toptal.com/developers/gitignore/api/node - -DATA/ diff --git a/server/package-lock.json b/server/package-lock.json deleted file mode 100644 index 9794805..0000000 --- a/server/package-lock.json +++ /dev/null @@ -1,2354 +0,0 @@ -{ - "name": "server", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "dependencies": { - "@hono/node-server": "^1.4.0", - "@hono/zod-validator": "^0.1.11", - "@web5/api": "^0.8.3", - "hono": "^3.12.0", - "true-myth": "5", - "tsconfig-paths": "^4.2.0", - "zod": "^3.22.4" - }, - "devDependencies": { - "tsx": "^4.7.0", - "typescript": "^5.3.3" - } - }, - "node_modules/@assemblyscript/loader": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.9.4.tgz", - "integrity": "sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==" - }, - "node_modules/@decentralized-identity/ion-pow-sdk": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/@decentralized-identity/ion-pow-sdk/-/ion-pow-sdk-1.0.17.tgz", - "integrity": "sha512-vk7DTDM8aKDbFyu1ad/qkoRrGL4q+KvNeL/FNZXhkWPaDhVExBN/qGEoRLf1YSfFe+myto3+4RYTPut+riiqnw==", - "dependencies": { - "buffer": "6.0.3", - "cross-fetch": "3.1.5", - "hash-wasm": "4.9.0" - } - }, - "node_modules/@decentralized-identity/ion-pow-sdk/node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dependencies": { - "node-fetch": "2.6.7" - } - }, - "node_modules/@decentralized-identity/ion-pow-sdk/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@decentralized-identity/ion-sdk": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@decentralized-identity/ion-sdk/-/ion-sdk-1.0.1.tgz", - "integrity": "sha512-+P+DXcRSFjsEsI5KIqUmVjpzgUT28B2lWpTO+IxiBcfibAN/1Sg20NebGTO/+serz2CnSZf95N2a1OZ6eXypGQ==", - "dependencies": { - "@noble/ed25519": "^2.0.0", - "@noble/secp256k1": "^2.0.0", - "canonicalize": "^2.0.0", - "multiformats": "^12.0.1", - "multihashes": "^4.0.3", - "uri-js": "^4.4.1" - } - }, - "node_modules/@decentralized-identity/ion-sdk/node_modules/multiformats": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz", - "integrity": "sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", - "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", - "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", - "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", - "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", - "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", - "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", - "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", - "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", - "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", - "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", - "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", - "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", - "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", - "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", - "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", - "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", - "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", - "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", - "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", - "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", - "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", - "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", - "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@hono/node-server": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.4.0.tgz", - "integrity": "sha512-bhDkhldW7w9VgjrX0gG1vJ2YyvTxFWd5WG9nHjSR4UauhVECQZC3qy7mVVuQ054I5NWhKttHfKzYfoPzmUzAjw==", - "engines": { - "node": ">=18.14.1" - } - }, - "node_modules/@hono/zod-validator": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@hono/zod-validator/-/zod-validator-0.1.11.tgz", - "integrity": "sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==", - "peerDependencies": { - "hono": ">=3.9.0", - "zod": "^3.19.1" - } - }, - "node_modules/@ipld/dag-cbor": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@ipld/dag-cbor/-/dag-cbor-9.0.3.tgz", - "integrity": "sha512-A2UFccS0+sARK9xwXiVZIaWbLbPxLGP3UZOjBeOMWfDY04SXi8h1+t4rHBzOlKYF/yWNm3RbFLyclWO7hZcy4g==", - "dependencies": { - "cborg": "^2.0.1", - "multiformats": "^12.0.1" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@ipld/dag-cbor/node_modules/multiformats": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz", - "integrity": "sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@ipld/dag-pb": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@ipld/dag-pb/-/dag-pb-4.0.7.tgz", - "integrity": "sha512-EqJtSAcELiYbp9K0Y5ckbg+W0pD5cSy5PnE/QsCrpKvoq+u0E8Vi07chNGDLaShd5AjDq0AMtnuudKUUuEuSjg==", - "dependencies": { - "multiformats": "^13.0.0" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@ipld/dag-pb/node_modules/multiformats": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.0.0.tgz", - "integrity": "sha512-xiIB0p7EKmETm3wyKedOg/xuyQ18PoWwXCzzgpZAiDxL9ktl3XTh8AqoDT5kAqRg+DU48XAGPsUJL2Rn6Bx3Lw==" - }, - "node_modules/@js-temporal/polyfill": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@js-temporal/polyfill/-/polyfill-0.4.4.tgz", - "integrity": "sha512-2X6bvghJ/JAoZO52lbgyAPFj8uCflhTo2g7nkFzEQdXd/D8rEeD4HtmTEpmtGCva260fcd66YNXBOYdnmHqSOg==", - "dependencies": { - "jsbi": "^4.3.0", - "tslib": "^2.4.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" - }, - "node_modules/@multiformats/base-x": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/base-x/-/base-x-4.0.1.tgz", - "integrity": "sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==" - }, - "node_modules/@multiformats/murmur3": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@multiformats/murmur3/-/murmur3-2.1.8.tgz", - "integrity": "sha512-6vId1C46ra3R1sbJUOFCZnsUIveR9oF20yhPmAFxPm0JfrX3/ZRCgP3YDrBzlGoEppOXnA9czHeYc0T9mB6hbA==", - "dependencies": { - "multiformats": "^13.0.0", - "murmurhash3js-revisited": "^3.0.0" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@multiformats/murmur3/node_modules/multiformats": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.0.0.tgz", - "integrity": "sha512-xiIB0p7EKmETm3wyKedOg/xuyQ18PoWwXCzzgpZAiDxL9ktl3XTh8AqoDT5kAqRg+DU48XAGPsUJL2Rn6Bx3Lw==" - }, - "node_modules/@noble/ciphers": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.1.4.tgz", - "integrity": "sha512-d3ZR8vGSpy3v/nllS+bD/OMN5UZqusWiQqkyj7AwzTnhXFH72pF5oB4Ach6DQ50g5kXxC28LdaYBEpsyv9KOUQ==", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/curves": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", - "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", - "dependencies": { - "@noble/hashes": "1.3.1" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/ed25519": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-2.0.0.tgz", - "integrity": "sha512-/extjhkwFupyopDrt80OMWKdLgP429qLZj+z6sYJz90rF2Iz0gjZh2ArMKPImUl13Kx+0EXI2hN9T/KJV0/Zng==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@noble/hashes": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", - "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/secp256k1": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-2.0.0.tgz", - "integrity": "sha512-rUGBd95e2a45rlmFTqQJYEFA4/gdIARFfuTuTqLglz0PZ6AKyzyXsEZZq7UZn8hZsvaBgpCzKKBJizT2cJERXw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@tbd54566975/dwn-sdk-js": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@tbd54566975/dwn-sdk-js/-/dwn-sdk-js-0.2.8.tgz", - "integrity": "sha512-oiKk+ekAQO94bUkt6yk+xkDY8uCGmNC+rKaYQLhAoTrhYrczeRSuDT04F5/vPBT5K6NfAoRcQsIyBmvgRCUvgA==", - "dependencies": { - "@ipld/dag-cbor": "9.0.3", - "@js-temporal/polyfill": "0.4.4", - "@noble/ed25519": "2.0.0", - "@noble/secp256k1": "2.0.0", - "abstract-level": "1.0.3", - "ajv": "8.12.0", - "blockstore-core": "4.2.0", - "cross-fetch": "4.0.0", - "eciesjs": "0.4.5", - "flat": "5.0.2", - "interface-blockstore": "5.2.3", - "interface-store": "5.1.2", - "ipfs-unixfs-exporter": "13.1.5", - "ipfs-unixfs-importer": "15.1.5", - "level": "8.0.0", - "lodash": "4.17.21", - "lru-cache": "9.1.2", - "ms": "2.1.3", - "multiformats": "11.0.2", - "randombytes": "2.1.0", - "readable-stream": "4.4.2", - "ulidx": "2.1.0", - "uuid": "8.3.2", - "varint": "6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@web5/agent": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@web5/agent/-/agent-0.2.5.tgz", - "integrity": "sha512-Z9JY/43Yrg0xKK26y/iZFdHNtVf/k9XLxw8mXP5zfYidrqfAgVR0i4LKA7qZKfUSxC7/uaD/STYYIKpNByd/cw==", - "dependencies": { - "@tbd54566975/dwn-sdk-js": "0.2.8", - "@web5/common": "0.2.2", - "@web5/crypto": "0.2.2", - "@web5/dids": "0.2.3", - "level": "8.0.0", - "readable-stream": "4.4.2", - "readable-web-to-node-stream": "3.0.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/api": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@web5/api/-/api-0.8.3.tgz", - "integrity": "sha512-YXQ++ZShtd5LeFRqEMGlhVqJ7Zg5P6bMequpaLl068bCGjtjCwiFFgDtM1KeL36IAzQ4pFLFyj9aTGZ/JgCXHA==", - "dependencies": { - "@tbd54566975/dwn-sdk-js": "0.2.8", - "@web5/agent": "0.2.5", - "@web5/common": "0.2.2", - "@web5/crypto": "0.2.2", - "@web5/dids": "0.2.3", - "@web5/user-agent": "0.2.5", - "level": "8.0.0", - "ms": "2.1.3", - "readable-stream": "4.4.2", - "readable-web-to-node-stream": "3.0.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/common": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@web5/common/-/common-0.2.2.tgz", - "integrity": "sha512-dRn6SmALExeTLMTK/W5ozGarfaddK+Lraf5OjuIGLAaLfcX1RWx3oDMoY5Hr9LjfxHJC8mGXB8DnKflbeYJRgA==", - "dependencies": { - "level": "8.0.0", - "multiformats": "11.0.2", - "readable-stream": "4.4.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/crypto": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@web5/crypto/-/crypto-0.2.2.tgz", - "integrity": "sha512-vHFg0wXQSQXrwuBNQyDHnmSZchfTfO6/Sv+7rDsNkvofs+6lGTE8CZ02cwUYMeIwTRMLer12c+fMfzYrXokEUQ==", - "dependencies": { - "@noble/ciphers": "0.1.4", - "@noble/curves": "1.1.0", - "@noble/hashes": "1.3.1", - "@web5/common": "0.2.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/crypto/node_modules/@web5/common": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@web5/common/-/common-0.2.1.tgz", - "integrity": "sha512-Tt5P17HgQCx+Epw0IHnhRKqp5UU3E4xtsE8PkdghOBnvntBB0op5P6efvR1WqmJft5+VunDHt3yZAZstuqQkNg==", - "dependencies": { - "level": "8.0.0", - "multiformats": "11.0.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/dids": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@web5/dids/-/dids-0.2.3.tgz", - "integrity": "sha512-Y3PHOavNkSyjBxZQEpKE6XueaqemBO5w0UMOnFh4xH6+5B43ENEE4LHIqVyn2bCpfEBGLXENgDZYqyJphBu0pA==", - "dependencies": { - "@decentralized-identity/ion-pow-sdk": "1.0.17", - "@decentralized-identity/ion-sdk": "1.0.1", - "@web5/common": "0.2.2", - "@web5/crypto": "0.2.2", - "did-resolver": "4.1.0", - "dns-packet": "5.6.1", - "level": "8.0.0", - "ms": "2.1.3", - "pkarr": "1.1.1", - "z32": "1.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/user-agent": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@web5/user-agent/-/user-agent-0.2.5.tgz", - "integrity": "sha512-qv5M698C5HSvq30xUgLWtcsbZppjfOH5qZthpTRx4ItL5UWA/eQ9DsQiQeb4vet3uIUy3NHRDIQezclOdwYErw==", - "dependencies": { - "@web5/agent": "0.2.5", - "@web5/common": "0.2.2", - "@web5/crypto": "0.2.2", - "@web5/dids": "0.2.3" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/abstract-level": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", - "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", - "dependencies": { - "buffer": "^6.0.3", - "catering": "^2.1.0", - "is-buffer": "^2.0.5", - "level-supports": "^4.0.0", - "level-transcoder": "^1.0.1", - "module-error": "^1.0.1", - "queue-microtask": "^1.2.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/b4a": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" - }, - "node_modules/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bencode": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bencode/-/bencode-3.1.1.tgz", - "integrity": "sha512-btsxX9201yoWh45TdqYg6+OZ5O1xTYKTYSGvJndICDFtznE/9zXgow8yjMvvhOqKKuzuL7h+iiCMpfkG8+QuBA==", - "dependencies": { - "uint8-util": "^2.1.6" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/bittorrent-dht": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/bittorrent-dht/-/bittorrent-dht-11.0.5.tgz", - "integrity": "sha512-R09D6uNaziRqsc+B/j5QzkjceTak+wH9vcNLnkmt8A52EWF9lQwBP0vvCKgSA3AJOYYl+41n3osA2KYYn/z5uQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "bencode": "^4.0.0", - "debug": "^4.3.4", - "k-bucket": "^5.1.0", - "k-rpc": "^5.1.0", - "last-one-wins": "^1.0.4", - "lru": "^3.1.0", - "randombytes": "^2.1.0", - "record-cache": "^1.2.0" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/bittorrent-dht/node_modules/bencode": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/bencode/-/bencode-4.0.0.tgz", - "integrity": "sha512-AERXw18df0pF3ziGOCyUjqKZBVNH8HV3lBxnx5w0qtgMIk4a1wb9BkcCQbkp9Zstfrn/dzRwl7MmUHHocX3sRQ==", - "dependencies": { - "uint8-util": "^2.2.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/blake2b": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.4.tgz", - "integrity": "sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A==", - "dependencies": { - "blake2b-wasm": "^2.4.0", - "nanoassert": "^2.0.0" - } - }, - "node_modules/blake2b-wasm": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz", - "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==", - "dependencies": { - "b4a": "^1.0.1", - "nanoassert": "^2.0.0" - } - }, - "node_modules/blockstore-core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/blockstore-core/-/blockstore-core-4.2.0.tgz", - "integrity": "sha512-F8BCobc75D+9/+hUD+5cixbU6zmZA+lBgNiuBkNlJqRgmAaBBvLOQF6Ad9Jei0Nvmy2a1jaF4CiN76W1apIghA==", - "dependencies": { - "err-code": "^3.0.1", - "interface-blockstore": "^5.0.0", - "interface-store": "^5.0.0", - "multiformats": "^11.0.2" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/browser-level": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", - "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.1", - "module-error": "^1.0.2", - "run-parallel-limit": "^1.1.0" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/canonicalize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/canonicalize/-/canonicalize-2.0.0.tgz", - "integrity": "sha512-ulDEYPv7asdKvqahuAY35c1selLdzDwHqugK92hfkzvlDCwXRRelDkR+Er33md/PtnpqHemgkuDPanZ4fiYZ8w==" - }, - "node_modules/catering": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cborg": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cborg/-/cborg-2.0.5.tgz", - "integrity": "sha512-xVW1rSIw1ZXbkwl2XhJ7o/jAv0vnVoQv/QlfQxV8a7V5PlA4UU/AcIiXqmpyybwNWy/GPQU1m/aBVNIWr7/T0w==", - "bin": { - "cborg": "cli.js" - } - }, - "node_modules/chacha20-universal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chacha20-universal/-/chacha20-universal-1.0.4.tgz", - "integrity": "sha512-/IOxdWWNa7nRabfe7+oF+jVkGjlr2xUL4J8l/OvzZhj+c9RpMqoo3Dq+5nU1j/BflRV4BKnaQ4+4oH1yBpQG1Q==", - "dependencies": { - "nanoassert": "^2.0.0" - } - }, - "node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chrome-dgram": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/chrome-dgram/-/chrome-dgram-3.0.6.tgz", - "integrity": "sha512-bqBsUuaOiXiqxXt/zA/jukNJJ4oaOtc7ciwqJpZVEaaXwwxqgI2/ZdG02vXYWUhHGziDlvGMQWk0qObgJwVYKA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "inherits": "^2.0.4", - "run-series": "^1.1.9" - } - }, - "node_modules/chrome-dns": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chrome-dns/-/chrome-dns-1.0.1.tgz", - "integrity": "sha512-HqsYJgIc8ljJJOqOzLphjAs79EUuWSX3nzZi2LNkzlw3GIzAeZbaSektC8iT/tKvLqZq8yl1GJu5o6doA4TRbg==", - "dependencies": { - "chrome-net": "^3.3.2" - } - }, - "node_modules/chrome-net": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/chrome-net/-/chrome-net-3.3.4.tgz", - "integrity": "sha512-Jzy2EnzmE+ligqIZUsmWnck9RBXLuUy6CaKyuNMtowFG3ZvLt8d+WBJCTPEludV0DHpIKjAOlwjFmTaEdfdWCw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "inherits": "^2.0.1" - } - }, - "node_modules/classic-level": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", - "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", - "hasInstallScript": true, - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.0", - "module-error": "^1.0.1", - "napi-macros": "^2.2.2", - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/did-resolver": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/did-resolver/-/did-resolver-4.1.0.tgz", - "integrity": "sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA==" - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eciesjs": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.5.tgz", - "integrity": "sha512-2zSRIygO48LpdS95Rwt9ryIkJNO37IdbkjRsnYyAn7gx7e4WPBNimnk6jGNdx2QQYr/VJRPnSVdwQpO5bycYZw==", - "dependencies": { - "@noble/ciphers": "^0.3.0", - "@noble/curves": "^1.2.0", - "@noble/hashes": "^1.3.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/eciesjs/node_modules/@noble/ciphers": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.3.0.tgz", - "integrity": "sha512-ldbrnOjmNRwFdXcTM6uXDcxpMIFrbzAWNnpBPp4oTJTFF0XByGD6vf45WrehZGXRQTRVV+Zm8YP+EgEf+e4cWA==", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/eciesjs/node_modules/@noble/curves": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz", - "integrity": "sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==", - "dependencies": { - "@noble/hashes": "1.3.3" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/eciesjs/node_modules/@noble/hashes": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", - "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/err-code": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", - "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==" - }, - "node_modules/esbuild": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", - "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.11", - "@esbuild/android-arm": "0.19.11", - "@esbuild/android-arm64": "0.19.11", - "@esbuild/android-x64": "0.19.11", - "@esbuild/darwin-arm64": "0.19.11", - "@esbuild/darwin-x64": "0.19.11", - "@esbuild/freebsd-arm64": "0.19.11", - "@esbuild/freebsd-x64": "0.19.11", - "@esbuild/linux-arm": "0.19.11", - "@esbuild/linux-arm64": "0.19.11", - "@esbuild/linux-ia32": "0.19.11", - "@esbuild/linux-loong64": "0.19.11", - "@esbuild/linux-mips64el": "0.19.11", - "@esbuild/linux-ppc64": "0.19.11", - "@esbuild/linux-riscv64": "0.19.11", - "@esbuild/linux-s390x": "0.19.11", - "@esbuild/linux-x64": "0.19.11", - "@esbuild/netbsd-x64": "0.19.11", - "@esbuild/openbsd-x64": "0.19.11", - "@esbuild/sunos-x64": "0.19.11", - "@esbuild/win32-arm64": "0.19.11", - "@esbuild/win32-ia32": "0.19.11", - "@esbuild/win32-x64": "0.19.11" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "bin": { - "flat": "cli.js" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/graceful-goodbye": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/graceful-goodbye/-/graceful-goodbye-1.3.0.tgz", - "integrity": "sha512-hcZOs20emYlTM7MmUE0FpuZcjlk2GPsR+UYTHDeWxtGjXcbh2CawGi8vlzqsIvspqAbot7mRv3sC/uhgtKc4hQ==", - "dependencies": { - "safety-catch": "^1.0.2" - } - }, - "node_modules/hamt-sharding": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/hamt-sharding/-/hamt-sharding-3.0.2.tgz", - "integrity": "sha512-f0DzBD2tSmLFdFsLAvOflIBqFPjerbA7BfmwO8mVho/5hXwgyyYhv+ijIzidQf/DpDX3bRjAQvhGoBFj+DBvPw==", - "dependencies": { - "sparse-array": "^1.3.1", - "uint8arrays": "^4.0.2" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/hash-wasm": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/hash-wasm/-/hash-wasm-4.9.0.tgz", - "integrity": "sha512-7SW7ejyfnRxuOc7ptQHSf4LDoZaWOivfzqw+5rpcQku0nHfmicPKE51ra9BiRLAmT8+gGLestr1XroUkqdjL6w==" - }, - "node_modules/hono": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/hono/-/hono-3.12.0.tgz", - "integrity": "sha512-UPEtZuLY7Wo7g0mqKWSOjLFdT8t7wJ60IYEcxKl3AQNU4u+R2QqU2fJMPmSu24C+/ag20Z8mOTQOErZzK4DMvA==", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/interface-blockstore": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/interface-blockstore/-/interface-blockstore-5.2.3.tgz", - "integrity": "sha512-15cN+ZFdcVXdXo6I/SrSzFDsuJyDTyEI52XuvXQlR/G5fe3cK8p0tvVjfu5diRQH1XqNgmJEdMPixyt0xgjtvQ==", - "dependencies": { - "interface-store": "^5.0.0", - "multiformats": "^11.0.2" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/interface-store": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/interface-store/-/interface-store-5.1.2.tgz", - "integrity": "sha512-q2sLoqC+UdaWnjwGyghsH0jwqqVk226lsG207e3QwPB8sAZYmYIWUnJwJH3JjFNNRV9e6CUTmm+gDO0Xg4KRiw==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/ipfs-unixfs": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-11.1.2.tgz", - "integrity": "sha512-HVjrACOhU8RgMskcrfydk+FDAE9pFKr8tneKLaVYQ2f81HUKXoiSdgsAJY/jt7Ieyj4tE12TZGduIeWtNpScOw==", - "dependencies": { - "err-code": "^3.0.1", - "protons-runtime": "^5.0.0", - "uint8arraylist": "^2.4.3" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/ipfs-unixfs-exporter": { - "version": "13.1.5", - "resolved": "https://registry.npmjs.org/ipfs-unixfs-exporter/-/ipfs-unixfs-exporter-13.1.5.tgz", - "integrity": "sha512-O5aMawsHoe4DaYk5FFil2EPrNOaU3pkHC6qUR5JMnW7es93W3b/RjJoO7AyDL1rpb+M3K0oRu86Yc5wLNQQ8jg==", - "dependencies": { - "@ipld/dag-cbor": "^9.0.0", - "@ipld/dag-pb": "^4.0.0", - "@multiformats/murmur3": "^2.0.0", - "err-code": "^3.0.1", - "hamt-sharding": "^3.0.0", - "interface-blockstore": "^5.0.0", - "ipfs-unixfs": "^11.0.0", - "it-filter": "^3.0.2", - "it-last": "^3.0.2", - "it-map": "^3.0.3", - "it-parallel": "^3.0.0", - "it-pipe": "^3.0.1", - "it-pushable": "^3.1.0", - "multiformats": "^11.0.0", - "p-queue": "^7.3.0", - "progress-events": "^1.0.0", - "uint8arrays": "^4.0.2" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/ipfs-unixfs-importer": { - "version": "15.1.5", - "resolved": "https://registry.npmjs.org/ipfs-unixfs-importer/-/ipfs-unixfs-importer-15.1.5.tgz", - "integrity": "sha512-TXaOI0M5KNpq2+qLw8AIYd0Lnc0gWTKCBqUd9eErBUwaP3Fna4qauF+JX9Rj2UrwaOvG/1xbF8Vm+92eOcKWMA==", - "dependencies": { - "@ipld/dag-pb": "^4.0.0", - "@multiformats/murmur3": "^2.0.0", - "err-code": "^3.0.1", - "hamt-sharding": "^3.0.0", - "interface-blockstore": "^5.0.0", - "interface-store": "^5.0.1", - "ipfs-unixfs": "^11.0.0", - "it-all": "^3.0.2", - "it-batch": "^3.0.2", - "it-first": "^3.0.2", - "it-parallel-batch": "^3.0.1", - "multiformats": "^11.0.0", - "progress-events": "^1.0.0", - "rabin-wasm": "^0.1.4", - "uint8arraylist": "^2.4.3", - "uint8arrays": "^4.0.2" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/it-all": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/it-all/-/it-all-3.0.4.tgz", - "integrity": "sha512-UMiy0i9DqCHBdWvMbzdYvVGa5/w4t1cc4nchpbnjdLhklglv8mQeEYnii0gvKESJuL1zV32Cqdb33R6/GPfxpQ==" - }, - "node_modules/it-batch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/it-batch/-/it-batch-3.0.4.tgz", - "integrity": "sha512-WRu2mqOYIs+T9k7+yxSK9VJdk0UE4R0jKQsWQcti5c6vhb1FhjC2+yCB5XBrctQ9edNfCMU/wVzdDj8qSwimbA==" - }, - "node_modules/it-filter": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/it-filter/-/it-filter-3.0.4.tgz", - "integrity": "sha512-e0sz+st4sudK/zH6GZ/gRTRP8A/ADuJFCYDmRgMbZvR79y5+v4ZXav850bBZk5wL9zXaYZFxS1v/6Qi+Vjwh5g==", - "dependencies": { - "it-peekable": "^3.0.0" - } - }, - "node_modules/it-first": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/it-first/-/it-first-3.0.4.tgz", - "integrity": "sha512-FtQl84iTNxN5EItP/JgL28V2rzNMkCzTUlNoj41eVdfix2z1DBuLnBqZ0hzYhGGa1rMpbQf0M7CQSA2adlrLJg==" - }, - "node_modules/it-last": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/it-last/-/it-last-3.0.4.tgz", - "integrity": "sha512-Ns+KTsQWhs0KCvfv5X3Ck3lpoYxHcp4zUp4d+AOdmC8cXXqDuoZqAjfWhgCbxJubXyIYWdfE2nRcfWqgvZHP8Q==" - }, - "node_modules/it-map": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/it-map/-/it-map-3.0.5.tgz", - "integrity": "sha512-hB0TDXo/h4KSJJDSRLgAPmDroiXP6Fx1ck4Bzl3US9hHfZweTKsuiP0y4gXuTMcJlS6vj0bb+f70rhkD47ZA3w==", - "dependencies": { - "it-peekable": "^3.0.0" - } - }, - "node_modules/it-merge": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/it-merge/-/it-merge-3.0.3.tgz", - "integrity": "sha512-FYVU15KC5pb/GQX1Ims+lee8d4pdqGVCpWr0lkNj8o4xuNo7jY71k6GuEiWdP+T7W1bJqewSxX5yoTy5yZpRVA==", - "dependencies": { - "it-pushable": "^3.2.0" - } - }, - "node_modules/it-parallel": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/it-parallel/-/it-parallel-3.0.6.tgz", - "integrity": "sha512-i7UM7I9LTkDJw3YIqXHFAPZX6CWYzGc+X3irdNrVExI4vPazrJdI7t5OqrSVN8CONXLAunCiqaSV/zZRbQR56A==", - "dependencies": { - "p-defer": "^4.0.0" - } - }, - "node_modules/it-parallel-batch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/it-parallel-batch/-/it-parallel-batch-3.0.4.tgz", - "integrity": "sha512-O1omh8ss8+UtXiMjE+8kM5C20DT0Ma4VtKVfrSHOJU0UHZ+iWBXarabzPYEp+WiuQmrv+klDPPlTZ9KaLN9xOA==", - "dependencies": { - "it-batch": "^3.0.0" - } - }, - "node_modules/it-peekable": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/it-peekable/-/it-peekable-3.0.3.tgz", - "integrity": "sha512-Wx21JX/rMzTEl9flx3DGHuPV1KQFGOl8uoKfQtmZHgPQtGb89eQ6RyVd82h3HuP9Ghpt0WgBDlmmdWeHXqyx7w==" - }, - "node_modules/it-pipe": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/it-pipe/-/it-pipe-3.0.1.tgz", - "integrity": "sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==", - "dependencies": { - "it-merge": "^3.0.0", - "it-pushable": "^3.1.2", - "it-stream-types": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/it-pushable": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.2.3.tgz", - "integrity": "sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==", - "dependencies": { - "p-defer": "^4.0.0" - } - }, - "node_modules/it-stream-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.1.tgz", - "integrity": "sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/jsbi": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-4.3.0.tgz", - "integrity": "sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/k-bucket": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/k-bucket/-/k-bucket-5.1.0.tgz", - "integrity": "sha512-Fac7iINEovXIWU20GPnOMLUbjctiS+cnmyjC4zAUgvs3XPf1vo9akfCHkigftSic/jiKqKl+KA3a/vFcJbHyCg==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/k-rpc": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/k-rpc/-/k-rpc-5.1.0.tgz", - "integrity": "sha512-FGc+n70Hcjoa/X2JTwP+jMIOpBz+pkRffHnSl9yrYiwUxg3FIgD50+u1ePfJUOnRCnx6pbjmVk5aAeB1wIijuQ==", - "dependencies": { - "k-bucket": "^5.0.0", - "k-rpc-socket": "^1.7.2", - "randombytes": "^2.0.5" - } - }, - "node_modules/k-rpc-socket": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/k-rpc-socket/-/k-rpc-socket-1.11.1.tgz", - "integrity": "sha512-8xtA8oqbZ6v1Niryp2/g4GxW16EQh5MvrUylQoOG+zcrDff5CKttON2XUXvMwlIHq4/2zfPVFiinAccJ+WhxoA==", - "dependencies": { - "bencode": "^2.0.0", - "chrome-dgram": "^3.0.2", - "chrome-dns": "^1.0.0", - "chrome-net": "^3.3.2" - } - }, - "node_modules/k-rpc-socket/node_modules/bencode": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/bencode/-/bencode-2.0.3.tgz", - "integrity": "sha512-D/vrAD4dLVX23NalHwb8dSvsUsxeRPO8Y7ToKA015JQYq69MLDOMkC0uGZYA/MPpltLO8rt8eqFC2j8DxjTZ/w==" - }, - "node_modules/last-one-wins": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/last-one-wins/-/last-one-wins-1.0.4.tgz", - "integrity": "sha512-t+KLJFkHPQk8lfN6WBOiGkiUXoub+gnb2XTYI2P3aiISL+94xgZ1vgz1SXN/N4hthuOoLXarXfBZPUruyjQtfA==" - }, - "node_modules/layerr": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/layerr/-/layerr-2.0.1.tgz", - "integrity": "sha512-z0730CwG/JO24evdORnyDkwG1Q7b7mF2Tp1qRQ0YvrMMARbt1DFG694SOv439Gm7hYKolyZyaB49YIrYIfZBdg==" - }, - "node_modules/level": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", - "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", - "dependencies": { - "browser-level": "^1.0.1", - "classic-level": "^1.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/level" - } - }, - "node_modules/level-supports": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/level-transcoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", - "dependencies": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lru": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lru/-/lru-3.1.0.tgz", - "integrity": "sha512-5OUtoiVIGU4VXBOshidmtOsvBIvcQR6FD/RzWSvaeHyxCGB+PCUCu+52lqMfdc0h/2CLvHhZS4TwUmMQrrMbBQ==", - "dependencies": { - "inherits": "^2.0.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/lru-cache": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz", - "integrity": "sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/module-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/multibase": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.6.tgz", - "integrity": "sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ==", - "deprecated": "This module has been superseded by the multiformats module", - "dependencies": { - "@multiformats/base-x": "^4.0.1" - }, - "engines": { - "node": ">=12.0.0", - "npm": ">=6.0.0" - } - }, - "node_modules/multiformats": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz", - "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/multihashes": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.3.tgz", - "integrity": "sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA==", - "dependencies": { - "multibase": "^4.0.1", - "uint8arrays": "^3.0.0", - "varint": "^5.0.2" - }, - "engines": { - "node": ">=12.0.0", - "npm": ">=6.0.0" - } - }, - "node_modules/multihashes/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" - }, - "node_modules/multihashes/node_modules/uint8arrays": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", - "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", - "dependencies": { - "multiformats": "^9.4.2" - } - }, - "node_modules/multihashes/node_modules/varint": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", - "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" - }, - "node_modules/murmurhash3js-revisited": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz", - "integrity": "sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/nanoassert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", - "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==" - }, - "node_modules/napi-macros": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", - "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==" - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-gyp-build": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.7.1.tgz", - "integrity": "sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/p-defer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-4.0.0.tgz", - "integrity": "sha512-Vb3QRvQ0Y5XnF40ZUWW7JfLogicVh/EnA5gBIvKDJoYpeI82+1E3AlB9yOcKFS0AhHrWVnAQO39fbR0G99IVEQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-queue": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.4.1.tgz", - "integrity": "sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==", - "dependencies": { - "eventemitter3": "^5.0.1", - "p-timeout": "^5.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", - "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkarr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pkarr/-/pkarr-1.1.1.tgz", - "integrity": "sha512-X27LKqf83X3WuJd2Z9qdfVxkmfOu6HUbY0pm11LqeBbFmgmZRPgOxJG8bKiIsmmD6Vjc25j45KHYflF2lfodyQ==", - "dependencies": { - "bencode": "^3.0.3", - "bittorrent-dht": "^11.0.4", - "chalk": "^5.2.0", - "dns-packet": "^5.6.1", - "graceful-goodbye": "^1.3.0", - "sodium-universal": "^4.0.0", - "z32": "^1.0.0" - }, - "bin": { - "pkarr": "bin.js" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/progress-events": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/progress-events/-/progress-events-1.0.0.tgz", - "integrity": "sha512-zIB6QDrSbPfRg+33FZalluFIowkbV5Xh1xSuetjG+rlC5he6u2dc6VQJ0TbMdlN3R1RHdpOqxEFMKTnQ+itUwA==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/protons-runtime": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-5.2.1.tgz", - "integrity": "sha512-Rt4ORm1WR62ysrXX5sCV32a5jPwVoIpU90XUzrdAfMIOSNTizvqlx/7wedNpogvZjUUY/gLJp3VftpA+ebx/og==", - "dependencies": { - "uint8arraylist": "^2.4.3", - "uint8arrays": "^5.0.1" - } - }, - "node_modules/protons-runtime/node_modules/multiformats": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.0.0.tgz", - "integrity": "sha512-xiIB0p7EKmETm3wyKedOg/xuyQ18PoWwXCzzgpZAiDxL9ktl3XTh8AqoDT5kAqRg+DU48XAGPsUJL2Rn6Bx3Lw==" - }, - "node_modules/protons-runtime/node_modules/uint8arrays": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.0.1.tgz", - "integrity": "sha512-ND5RpJAnPgHmZT7hWD/2T4BwRp04j8NLKvMKC/7bhiEwEjUMkQ4kvBKiH6hOqbljd6qJ2xS8reL3vl1e33grOQ==", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/rabin-wasm": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/rabin-wasm/-/rabin-wasm-0.1.5.tgz", - "integrity": "sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA==", - "dependencies": { - "@assemblyscript/loader": "^0.9.4", - "bl": "^5.0.0", - "debug": "^4.3.1", - "minimist": "^1.2.5", - "node-fetch": "^2.6.1", - "readable-stream": "^3.6.0" - }, - "bin": { - "rabin-wasm": "cli/bin.js" - } - }, - "node_modules/rabin-wasm/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/readable-stream": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", - "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/readable-web-to-node-stream": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", - "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", - "dependencies": { - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/readable-web-to-node-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/record-cache": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/record-cache/-/record-cache-1.2.0.tgz", - "integrity": "sha512-kyy3HWCez2WrotaL3O4fTn0rsIdfRKOdQQcEJ9KpvmKmbffKVvwsloX063EgRUlpJIXHiDQFhJcTbZequ2uTZw==", - "dependencies": { - "b4a": "^1.3.1" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/run-parallel-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", - "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/run-series": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz", - "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safety-catch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/safety-catch/-/safety-catch-1.0.2.tgz", - "integrity": "sha512-C1UYVZ4dtbBxEtvOcpjBaaD27nP8MlvyAQEp2fOTOEe6pfUpk1cDUxij6BR1jZup6rSyUTaBBplK7LanskrULA==" - }, - "node_modules/sha256-universal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sha256-universal/-/sha256-universal-1.2.1.tgz", - "integrity": "sha512-ghn3muhdn1ailCQqqceNxRgkOeZSVfSE13RQWEg6njB+itsFzGVSJv+O//2hvNXZuxVIRyNzrgsZ37SPDdGJJw==", - "dependencies": { - "b4a": "^1.0.1", - "sha256-wasm": "^2.2.1" - } - }, - "node_modules/sha256-wasm": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/sha256-wasm/-/sha256-wasm-2.2.2.tgz", - "integrity": "sha512-qKSGARvao+JQlFiA+sjJZhJ/61gmW/3aNLblB2rsgIxDlDxsJPHo8a1seXj12oKtuHVgJSJJ7QEGBUYQN741lQ==", - "dependencies": { - "b4a": "^1.0.1", - "nanoassert": "^2.0.0" - } - }, - "node_modules/sha512-universal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sha512-universal/-/sha512-universal-1.2.1.tgz", - "integrity": "sha512-kehYuigMoRkIngCv7rhgruLJNNHDnitGTBdkcYbCbooL8Cidj/bS78MDxByIjcc69M915WxcQTgZetZ1JbeQTQ==", - "dependencies": { - "b4a": "^1.0.1", - "sha512-wasm": "^2.3.1" - } - }, - "node_modules/sha512-wasm": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/sha512-wasm/-/sha512-wasm-2.3.4.tgz", - "integrity": "sha512-akWoxJPGCB3aZCrZ+fm6VIFhJ/p8idBv7AWGFng/CZIrQo51oQNsvDbTSRXWAzIiZJvpy16oIDiCCPqTe21sKg==", - "dependencies": { - "b4a": "^1.0.1", - "nanoassert": "^2.0.0" - } - }, - "node_modules/siphash24": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/siphash24/-/siphash24-1.3.1.tgz", - "integrity": "sha512-moemC3ZKiTzH29nbFo3Iw8fbemWWod4vNs/WgKbQ54oEs6mE6XVlguxvinYjB+UmaE0PThgyED9fUkWvirT8hA==", - "dependencies": { - "nanoassert": "^2.0.0" - } - }, - "node_modules/sodium-javascript": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/sodium-javascript/-/sodium-javascript-0.8.0.tgz", - "integrity": "sha512-rEBzR5mPxPES+UjyMDvKPIXy9ImF17KOJ32nJNi9uIquWpS/nfj+h6m05J5yLJaGXjgM72LmQoUbWZVxh/rmGg==", - "dependencies": { - "blake2b": "^2.1.1", - "chacha20-universal": "^1.0.4", - "nanoassert": "^2.0.0", - "sha256-universal": "^1.1.0", - "sha512-universal": "^1.1.0", - "siphash24": "^1.0.1", - "xsalsa20": "^1.0.0" - } - }, - "node_modules/sodium-native": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.0.4.tgz", - "integrity": "sha512-faqOKw4WQKK7r/ybn6Lqo1F9+L5T6NlBJJYvpxbZPetpWylUVqz449mvlwIBKBqxEHbWakWuOlUt8J3Qpc4sWw==", - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.6.0" - } - }, - "node_modules/sodium-universal": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-4.0.0.tgz", - "integrity": "sha512-iKHl8XnBV96k1c75gwwzANFdephw/MDWSjQAjPmBE+du0y3P23Q8uf7AcdcfFsYAMwLg7WVBfSAIBtV/JvRsjA==", - "dependencies": { - "blake2b": "^2.1.1", - "chacha20-universal": "^1.0.4", - "nanoassert": "^2.0.0", - "sha256-universal": "^1.1.0", - "sha512-universal": "^1.1.0", - "siphash24": "^1.0.1", - "sodium-javascript": "~0.8.0", - "sodium-native": "^4.0.0", - "xsalsa20": "^1.0.0" - } - }, - "node_modules/sparse-array": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/sparse-array/-/sparse-array-1.3.2.tgz", - "integrity": "sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg==" - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/true-myth": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/true-myth/-/true-myth-5.4.0.tgz", - "integrity": "sha512-MonJqkJf+VOXZ2msbpvAI1uJWoyfCN7nirR8/fNK+IlFDWYNLb9iqeAc2uhIbAQBynHtM02azZgepQDQclOwAw==", - "engines": { - "node": "12.* || 14.* || 16.* || >= 18.*" - } - }, - "node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/tsx": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.0.tgz", - "integrity": "sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==", - "dev": true, - "dependencies": { - "esbuild": "~0.19.10", - "get-tsconfig": "^4.7.2" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uint8-util": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/uint8-util/-/uint8-util-2.2.4.tgz", - "integrity": "sha512-uEI5lLozmKQPYEevfEhP9LY3Je5ZmrQhaWXrzTVqrLNQl36xsRh8NiAxYwB9J+2BAt99TRbmCkROQB2ZKhx4UA==", - "dependencies": { - "base64-arraybuffer": "^1.0.2" - } - }, - "node_modules/uint8arraylist": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.4.8.tgz", - "integrity": "sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==", - "dependencies": { - "uint8arrays": "^5.0.1" - } - }, - "node_modules/uint8arraylist/node_modules/multiformats": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.0.0.tgz", - "integrity": "sha512-xiIB0p7EKmETm3wyKedOg/xuyQ18PoWwXCzzgpZAiDxL9ktl3XTh8AqoDT5kAqRg+DU48XAGPsUJL2Rn6Bx3Lw==" - }, - "node_modules/uint8arraylist/node_modules/uint8arrays": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.0.1.tgz", - "integrity": "sha512-ND5RpJAnPgHmZT7hWD/2T4BwRp04j8NLKvMKC/7bhiEwEjUMkQ4kvBKiH6hOqbljd6qJ2xS8reL3vl1e33grOQ==", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/uint8arrays": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.10.tgz", - "integrity": "sha512-AnJNUGGDJAgFw/eWu/Xb9zrVKEGlwJJCaeInlf3BkecE/zcTobk5YXYIPNQJO1q5Hh1QZrQQHf0JvcHqz2hqoA==", - "dependencies": { - "multiformats": "^12.0.1" - } - }, - "node_modules/uint8arrays/node_modules/multiformats": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz", - "integrity": "sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/ulidx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ulidx/-/ulidx-2.1.0.tgz", - "integrity": "sha512-DlMi97oP9HASI3kLCjBlOhAG1SoisUrEqC2PJ7itiFbq9q5Zo0JejupXeu2Gke99W62epNzA4MFNToNiq8A5LA==", - "dependencies": { - "layerr": "^2.0.1" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/xsalsa20": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/xsalsa20/-/xsalsa20-1.2.0.tgz", - "integrity": "sha512-FIr/DEeoHfj7ftfylnoFt3rAIRoWXpx2AoDfrT2qD2wtp7Dp+COajvs/Icb7uHqRW9m60f5iXZwdsJJO3kvb7w==" - }, - "node_modules/z32": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/z32/-/z32-1.0.1.tgz", - "integrity": "sha512-Uytfqf6VEVchHKZDw0NRdCViOARHP84uzvOw0CXCMLOwhgHZUL9XibpEPLLQN10mCVLxOlGCQWbkV7km7yNYcw==", - "dependencies": { - "b4a": "^1.5.3" - } - }, - "node_modules/zod": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", - "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - } - } -} diff --git a/server/package.json b/server/package.json deleted file mode 100644 index ce20a8d..0000000 --- a/server/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "scripts": { - "dev": "tsx --watch server.ts" - }, - "dependencies": { - "@hono/node-server": "^1.4.0", - "@hono/zod-validator": "^0.1.11", - "@web5/api": "^0.8.3", - "hono": "^3.12.0", - "true-myth": "5", - "tsconfig-paths": "^4.2.0", - "zod": "^3.22.4" - }, - "devDependencies": { - "tsx": "^4.7.0", - "typescript": "^5.3.3" - } -} diff --git a/server/script.ts b/server/script.ts deleted file mode 100644 index e58a7e5..0000000 --- a/server/script.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { Web5 } from "@web5/api"; -import { protocols } from "@frontend/utils/protocols"; -import DocumentUtils from "@frontend/utils/document"; -import { Agent } from "@backend/utils"; - -async function configureProtocols(agent: Agent) { - console.log("=== CONFIGURE PROTOCOL ===") - - for (const protocol of protocols) { - const { protocols } = await agent.web5.dwn.protocols.query({ - message: { - filter: { - protocol: protocol.protocol, - } - } - }) - - if (protocols.length > 0) { - console.log("Protocol already exists:", protocol.protocol) - continue - } - - const { protocol: configuredProtocol, status: localProtocolConfigurationStatus } = await agent.web5.dwn.protocols.configure({ - message: { - definition: Object.assign({ ...protocol }), - } - }); - - if (!configuredProtocol) { - console.log("Failed to configure protocol:", localProtocolConfigurationStatus) - return - } - - console.log("Configured protocol on local DWN:", protocol.protocol) - const { status: remoteProtocolConfigurationStatus } = await configuredProtocol.send(agent.did) - - console.log("Sent protocol to remote DWN") - console.log(protocol.protocol, remoteProtocolConfigurationStatus) - } - - console.log("=== END CONFIGURE PROTOCOL ===") -} - -async function queryConditions(agent: Agent) { - console.log("=== QUERY CONDITIONS ===") - - const records = await DocumentUtils.fetchDocumentRecords(agent) - if (!records) { - console.log("No records found") - return - } - - if (records.length > 0) { - for (const record of records) { - // console.log("author:", record.author) - // console.log("recipient:", record.recipient) - // Bun.write("records/" + record.id + ".json", JSON.stringify(record)) - // console.log(record.author === record.target) - console.log(await record.data.json()) - } - } - - console.log("=== END QUERY CONDITIONS ===") -} - -async function createCondition(agent: Agent) { - console.log("=== CREATE CONDITION ===") - - const record = await DocumentUtils.createDocumentRecord(agent, { name: "test", condition: "command", file: new File([], "", { type: "image/png" }) }) - - if (!record) return false - - console.log("=== END CREATE CONDITION ===") -} - -async function connect() { - console.log("=== CONNECT ===") - const agent = await Web5.connect({ - sync: "5s", - }); - - console.log("=== END CONNECT ===") - - return agent -} -async function main() { - const agent = await connect() - await configureProtocols(agent) - await queryConditions(agent) - // await createCondition(agent) - // await queryConditions(agent) -} - -main() diff --git a/server/server.ts b/server/server.ts deleted file mode 100644 index f321b00..0000000 --- a/server/server.ts +++ /dev/null @@ -1,9 +0,0 @@ -import app from "./src/app"; -import { serve } from '@hono/node-server' - -serve({ - fetch: app.fetch, - port: process.env.PORT || 5000, -}, (addr) => { - console.log("Server running on port:", addr.port) -}) diff --git a/server/src/app.ts b/server/src/app.ts deleted file mode 100644 index 9344854..0000000 --- a/server/src/app.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Hono } from "hono"; -import { fetchConditions } from "./utils"; -import { agentMiddleware } from "./middleware"; -import { zValidator } from '@hono/zod-validator' -import { z } from 'zod' -import { logger } from "hono/logger" -import { cors } from 'hono/cors' - -const app = new Hono() - .basePath("/api") - .use("*", cors()) - .use("*", logger()) - .get("/conditions", - zValidator( - 'query', - z.object({ - condition: z.string() - })), - agentMiddleware, async (c) => { - const { condition } = c.req.valid("query") - const res = await fetchConditions(c.get("agent")) - if (res.isErr) - return c.json({ error: res.error }) - - // @ts-ignore - const conditions = res.value.filter(record => record.condition === condition) - return c.json(conditions) - }) - -export type App = typeof app - -export default app diff --git a/server/src/middleware.ts b/server/src/middleware.ts deleted file mode 100644 index e6503bc..0000000 --- a/server/src/middleware.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { type Agent, configureProtocol, setupAgent } from "./utils"; -import { MiddlewareHandler } from "hono" - -let agent: Agent - -export const agentMiddleware: MiddlewareHandler<{ - Variables: { - agent: Agent - } -}> = async (c, next) => { - if (!agent) - agent = await setupAgent() - - const connectionResult = await configureProtocol(agent) - if (connectionResult.isErr) { - console.log(connectionResult.error) - process.exit() - } - - c.set('agent', agent) - await next() -} diff --git a/server/src/utils.ts b/server/src/utils.ts deleted file mode 100644 index 4a9c280..0000000 --- a/server/src/utils.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { Web5 } from "@web5/api"; -import ConditionsProtocol, { type Record, did as ConditionsProtocolDID } from "@frontend/utils/protocols/conditions" -// @ts-ignore -import Result, { ok, err } from "true-myth/result" - -export type Agent = { - web5: Web5, - did: string -} - -export type Status = { - code: number, - detail: string, -} - -// @ts-ignore -export async function configureProtocol(agent: Agent): Promise> { - const { protocols } = await agent.web5.dwn.protocols.query({ - message: { - filter: { - protocol: ConditionsProtocol.protocol, - } - } - }) - - if (protocols.length > 0) - return ok(undefined) - - const { protocol, status: localProtocolConfigurationStatus } = await agent.web5.dwn.protocols.configure({ - message: { - definition: ConditionsProtocol, - } - }); - - if (!protocol) - return err({ - type: "LOCAL_PROTOCOL_CONFIGURATION_FAILED", - status: localProtocolConfigurationStatus, - }) - - const { status: remoteProtocolConfigurationStatus } = await protocol.send(ConditionsProtocolDID) - - if (remoteProtocolConfigurationStatus.code !== 202) - return err({ - type: "REMOTE_PROTOCOL_CONFIGURATION_FAILED", - status: remoteProtocolConfigurationStatus, - }) - - return ok(undefined) -} - -// @ts-ignore -export async function fetchConditions(agent: Agent): Promise> { - const { records, status } = await agent.web5.dwn.records.query({ - from: ConditionsProtocolDID, - message: { - filter: { - protocolPath: 'condition', - schema: ConditionsProtocol.types.condition.schema, - protocol: ConditionsProtocol.protocol, - }, - // @ts-ignore - dateSort: "createdAscending", - } - }) - - if (!records) { - if (status.code !== 200) - return err(status) - - return ok([]) - } - - const conditions: Record.Condition[] = [] - for (const record of records) { - conditions.push(await record.data.json()) - } - - return ok(conditions) -} - -// @ts-ignore -export async function setupAgent(): Promise { - const { web5, did } = await Web5.connect({ - sync: "5s", - }); - - return { web5, did } -} diff --git a/server/tsconfig.json b/server/tsconfig.json deleted file mode 100644 index 880f229..0000000 --- a/server/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "compilerOptions": { - "noEmit": true, - "strict": false, - "noImplicitAny": true, - "noFallthroughCasesInSwitch": true, - "module": "CommonJS", - "target": "ES2020", - "baseUrl": ".", - "paths": { - "@backend/*": ["./src/*"], - "@frontend/*": ["../tauri-app/src/*"] - } - }, - "include": [ - "*.ts", - "./src/**/*.ts" - ], - "exclude": [ - "node_modules" - ] -} diff --git a/tauri-app/package-lock.json b/tauri-app/package-lock.json index e01b1d3..5bfe707 100644 --- a/tauri-app/package-lock.json +++ b/tauri-app/package-lock.json @@ -19,6 +19,7 @@ "axios": "^1.6.3", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", + "date-fns": "^3.1.0", "hono": "^3.12.0", "lodash": "^4.17.21", "lucide-react": "^0.298.0", @@ -27,6 +28,7 @@ "react-dropzone": "^14.2.3", "react-easy-crop": "^5.0.4", "react-hook-form": "^7.49.2", + "react-hot-toast": "^2.4.1", "react-pdf": "^7.6.0", "react-router-dom": "^6.21.1", "react-spinners": "^0.13.8", @@ -44,6 +46,7 @@ "@types/react": "^18.2.15", "@types/react-dom": "^18.2.7", "@types/react-window": "^1.8.8", + "@types/readable-stream": "^4.0.10", "@vitejs/plugin-react": "^4.0.3", "autoprefixer": "^10.4.16", "postcss": "^8.4.32", @@ -2095,6 +2098,22 @@ "@types/react": "*" } }, + "node_modules/@types/readable-stream": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.10.tgz", + "integrity": "sha512-AbUKBjcC8SHmImNi4yK2bbjogQlkFSg7shZCcicxPQapniOlajG8GCc39lvXzCWX4lLRRs7DM3VAeSlqmEVZUA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "safe-buffer": "~5.1.1" + } + }, + "node_modules/@types/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "node_modules/@types/scheduler": { "version": "0.16.8", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", @@ -2991,8 +3010,16 @@ "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "devOptional": true + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/date-fns": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.1.0.tgz", + "integrity": "sha512-ZO7yefXV/wCWzd3I9haCHmfzlfA3i1a2HHO7ZXjtJrRjXt8FULKJ2Vl8wji3XYF4dQ0ZJ/tokXDZeYlFvgms9Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } }, "node_modules/debug": { "version": "4.3.4", @@ -3458,6 +3485,14 @@ "node": ">=4" } }, + "node_modules/goober": { + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.13.tgz", + "integrity": "sha512-jFj3BQeleOoy7t93E9rZ2de+ScC4lQICLwiAQmKMg9F6roKGaLSHoCDYKkWlSafg138jejvq/mTdvmnwDQgqoQ==", + "peerDependencies": { + "csstype": "^3.0.10" + } + }, "node_modules/graceful-goodbye": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/graceful-goodbye/-/graceful-goodbye-1.3.0.tgz", @@ -4870,6 +4905,21 @@ "react": "^16.8.0 || ^17 || ^18" } }, + "node_modules/react-hot-toast": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.4.1.tgz", + "integrity": "sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ==", + "dependencies": { + "goober": "^2.1.10" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", diff --git a/tauri-app/src/pages/chat.tsx b/tauri-app/src/pages/chat.tsx new file mode 100644 index 0000000..fbd5444 --- /dev/null +++ b/tauri-app/src/pages/chat.tsx @@ -0,0 +1,278 @@ +import { Web5 } from "@web5/api"; +import { useState, useEffect } from "react"; + +export default function Home() { + + const [web5, setWeb5] = useState(null); + const [myDid, setMyDid] = useState(null); + const [activeRecipient, setActiveRecipient] = useState(null); + + const [noteValue, setNoteValue] = useState(""); + const [errorMessage, setErrorMessage] = useState(''); + const [recipientDid, setRecipientDid] = useState(""); + + const [didCopied, setDidCopied] = useState(false); + const [showNewChatInput, setShowNewChatInput] = useState(false); + + const [allDings, setAllDings] = useState([]); + + const sortedDings = allDings.sort( + //@ts-ignore + (a, b) => new Date(a.timestampWritten) - new Date(b.timestampWritten) + ); + + const groupedDings = allDings.reduce((acc, ding) => { + //@ts-ignore + const recipient = ding.sender === myDid ? ding.recipient : ding.sender; + //@ts-ignore + if (!acc[recipient]) acc[recipient] = []; + //@ts-ignore + acc[recipient].push(ding); + return acc; + }, {}); + + useEffect(() => { + const initWeb5 = async () => { + const { web5, did } = await Web5.connect(); + //@ts-ignore + setWeb5(web5); + //@ts-ignore + setMyDid(did); + + if (web5 && did) { + await configureProtocol(web5, did); + await fetchDings(web5, did); + } + }; + initWeb5(); + }, []); + + useEffect(() => { + if (!web5 || !myDid) return; + const intervalId = setInterval(async () => { + await fetchDings(web5, myDid); + }, 2000); + + return () => clearInterval(intervalId); + }, [web5, myDid]); + + const createProtocolDefinition = () => { + const dingerProtocolDefinition = { + protocol: "https://blackgirlbytes.dev/dinger-chat-protocol", + published: true, + types: { + ding: { + schema: "https://blackgirlbytes.dev/ding", + dataFormats: ["application/json"], + }, + }, + structure: { + ding: { + $actions: [ + { who: "anyone", can: "write" }, + { who: "author", of: "ding", can: "read" }, + { who: "recipient", of: "ding", can: "read" }, + ], + }, + }, + }; + return dingerProtocolDefinition; + }; + + //@ts-ignore + const queryForProtocol = async (web5) => { + return await web5.dwn.protocols.query({ + message: { + filter: { + protocol: "https://blackgirlbytes.dev/dinger-chat-protocol", + }, + }, + }); + }; + + //@ts-ignore + const installProtocolLocally = async (web5, protocolDefinition) => { + return await web5.dwn.protocols.configure({ + message: { + definition: protocolDefinition, + }, + }); + }; + + //@ts-ignore + const configureProtocol = async (web5, did) => { + const protocolDefinition = await createProtocolDefinition(); + + const { protocols: localProtocol, status: localProtocolStatus } = + await queryForProtocol(web5); + console.log({ localProtocol, localProtocolStatus }); + if (localProtocolStatus.code !== 200 || localProtocol.length === 0) { + + const { protocol, status } = await installProtocolLocally(web5, protocolDefinition); + console.log("Protocol installed locally", protocol, status); + + const { status: configureRemoteStatus } = await protocol.send(did); + console.log("Did the protocol install on the remote DWN?", configureRemoteStatus); + } else { + console.log("Protocol already installed"); + } + }; + + + const constructDing = () => { + const currentDate = new Date().toLocaleDateString(); + const currentTime = new Date().toLocaleTimeString(); + const ding = { + sender: myDid, + note: noteValue, + recipient: recipientDid, + timestampWritten: `${currentDate} ${currentTime}`, + }; + return ding; + }; + + //@ts-ignore + const writeToDwn = async (ding) => { + //@ts-ignore + const { record } = await web5.dwn.records.write({ + data: ding, + message: { + protocol: "https://blackgirlbytes.dev/dinger-chat-protocol", + protocolPath: "ding", + schema: "https://blackgirlbytes.dev/ding", + recipient: recipientDid, + }, + }); + return record; + }; + + //@ts-ignore + const sendRecord = async (record) => { + return await record.send(recipientDid); + }; + //@ts-ignore + const handleSubmit = async (e) => { + e.preventDefault(); + + if (!noteValue.trim()) { + setErrorMessage('Please type a message before sending.'); + return; + } + + const ding = constructDing(); + const record = await writeToDwn(ding); + const { status } = await sendRecord(record); + + console.log("Send record status", status); + + await fetchDings(web5, myDid); + setNoteValue(""); + }; + + const handleCopyDid = async () => { + if (myDid) { + try { + await navigator.clipboard.writeText(myDid); + setDidCopied(true); + console.log("DID copied to clipboard"); + + setTimeout(() => { + setDidCopied(false); + }, 3000); + } catch (err) { + console.log("Failed to copy DID: " + err); + } + } + }; + + //@ts-ignore + const fetchSentMessages = async (web5, did) => { + const response = await web5.dwn.records.query({ + message: { + filter: { + protocol: "https://blackgirlbytes.dev/dinger-chat-protocol", + }, + }, + }); + + if (response.status.code === 200) { + const sentDings = await Promise.all( + //@ts-ignore + response.records.map(async (record) => { + const data = await record.data.json(); + return data; + }) + ); + console.log(sentDings, "I sent these dings"); + return sentDings; + } else { + console.log("error", response.status); + } + }; + + //@ts-ignore + const fetchReceivedMessages = async (web5, did) => { + const response = await web5.dwn.records.query({ + from: did, + message: { + filter: { + protocol: "https://blackgirlbytes.dev/dinger-chat-protocol", + schema: "https://blackgirlbytes.dev/ding", + }, + }, + }); + + if (response.status.code === 200) { + const receivedDings = await Promise.all( + //@ts-ignore + response.records.map(async (record) => { + const data = await record.data.json(); + return data; + }) + ); + console.log(receivedDings, "I received these dings"); + return receivedDings; + } else { + console.log("error", response.status); + } + }; + + //@ts-ignore + const fetchDings = async (web5, did) => { + const sentMessages = await fetchSentMessages(web5, did); + const receivedMessages = await fetchReceivedMessages(web5, did); + const allMessages = [...(sentMessages || []), ...(receivedMessages || [])]; + //@ts-ignore + setAllDings(allMessages); + + }; + + const handleStartNewChat = () => { + setActiveRecipient(null); + setShowNewChatInput(true); + }; + + //@ts-ignore + const handleSetActiveRecipient = (recipient) => { + setRecipientDid(recipient); + setActiveRecipient(recipient); + setShowNewChatInput(false); + }; + + const handleConfirmNewChat = () => { + //@ts-ignore + setActiveRecipient(recipientDid); + //@ts-ignore + setActiveRecipient(recipientDid); + setShowNewChatInput(false); + //@ts-ignore + if (!groupedDings[recipientDid]) { + //@ts-ignore + groupedDings[recipientDid] = []; + } + }; + + return ( +
    + ); +} \ No newline at end of file From 9276266508034a74b3b2255a56ffe073ae66d1fe Mon Sep 17 00:00:00 2001 From: koko_codes <58889001+EnebeliEmmanuel@users.noreply.github.com> Date: Sun, 7 Jan 2024 14:02:41 +0100 Subject: [PATCH 100/136] Update README.md --- README.md | 136 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 123 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 5c39ce2..1d306c8 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,34 @@ -# PulsePal 🌟 - -Safely store medical records with decentralized identifiers and web nodes, ensuring data security. Connect with similar conditions, share home remedies with a rating system, and access specialized doctors based on your location. PulsePal – where advanced technology meets user-friendly design for your secure, connected health journey. - -## What it does +# Pulsepal-MVP 🌟 + +## Welcome to the Pulsepal MVP repository + +

    + site +

    + +> ## Table of contents +- [Overview](#overview) +- [Core Features Implemented](#core-features-implemented) +- [Technologies](#technologies) +- [Repo Setup](#repo-setup) +- [Requirements](#requirements) +- [Setup the Project](#setup-the-project) +- [Setup the Frontend](#setup-the-frontend) + - [Install Dependencies](#install-dependencies) + - [Steps to host the live site on Vercel](#steps-to-host-the-live-site-on-vercel) +- [Live Link](#live-link) +- [Contributors](#contributors) +- [Contributing to the project](#contributing-to-the-project) +# +> ## Overview +

    +Welcome to PulsePal, your health guardian in WEB5. Safely store medical records with decentralized identifiers and web nodes, ensuring data security. Connect with similar conditions, share home remedies with a rating system, and access specialized doctors based on your location. PulsePal – where advanced technology meets user-friendly design for your secure, connected health journey. +

    + + + +# +> ## Core Features Implemented 1. Secure Medical Record Storage: - Users can securely store their medical records using decentralized identifiers (DIDs) in the app. @@ -18,8 +44,43 @@ Safely store medical records with decentralized identifiers and web nodes, ensur 4. Recommend specialized doctors in your nearby areas, based on your current location -## Setting up Local Development + +

    + +# +> ## Technologies +| Stack | Usage | +| :------------------ | :------------------ | +| **`Web5`** | Backend | +| **`React JS + tauri + tailwind`** | Frontend | + +# +> ## Repo Setup + +

    +To setup the repo, first fork the Web5-hack Repo, then clone the forked repository to create a copy on the local machine. +

    + + $ git clone https://github.com/coder12git/Web5-Hack.git + +

    +Change directory to the cloned repo and set the original Web5-Hack repository as the "upstream" and your forked repository as the "origin" using gitbash. and make sure to switch to dev branch +

    + + $ git remote add upstream https://github.com/coder12git/Web5-Hack.git + +# + +> ## Requirements +# +- [Cors extension](https://chromewebstore.google.com/detail/allow-cors-access-control/lhobafahddgcelffkeicbaginigeejlf) +- Node JS + +# +> ## Setup the Frontend +- First run the frontend on your local server to ensure it's fully functional before building for production. +# 1. Clone the repository ``` @@ -44,16 +105,65 @@ npm install npm run dev ``` -## What's next for Pulsepal -1. Personalized Health Insights: "Our plan includes integrating AI-driven analytics to offer personalized health insights, assessing individual health risks and predicting future health trends based on users' medical records." +# + +## Useful links + +## View attribution files here + + + +## Explainer video (User POV) + + + +## Demo Video (Clients POV) + + + + +- [Pitch Deck](https://github.com/coder12git/Web5-Hack/files/13853501/PULSEPal.pdf) +- [Frontend Deployment](https://web5-hack-413v.vercel.app/#/) + + + +> ## Contributors + +This Project was created by these awesome dedicated members + +

    + Team +

    + + +> ## What's next for Pulsepal + +- Personalized Health Insights: "Our plan includes integrating AI-driven analytics to offer personalized health insights, assessing individual health risks and predicting future health trends based on users' medical records." + +- Natural Language Processing (NLP) Chatbot: "We aim to implement an NLP-powered chatbot that assists users in comprehending medical terminology, interpreting test results, and providing preliminary guidance in emergencies based on entered symptoms." + +- AI-Driven Diagnostics: "Incorporating an AI system for preliminary diagnostics, we intend to analyze symptoms and user-entered data to provide suggestive measures or identify potential health issues, prompting users to seek professional medical advice." + +- Augmented Reality (AR) for First Aid Guidance: "Our future plan involves integrating AR technology to guide users through basic first aid procedures by overlaying instructional visuals onto real-time surroundings." + +- Health Gamification and Incentivization: "To encourage healthy habits, we plan to introduce gamification within PulsePal, utilizing AI to personalize challenges, rewards, and reminders aligned with individual health goals." + +- Predictive Appointment Scheduling: "Utilizing AI algorithms, we aim to predict potential health concerns or follow-up appointments based on stored medical records, proactively suggesting relevant appointments or check-ups." + -2. Natural Language Processing (NLP) Chatbot: "We aim to implement an NLP-powered chatbot that assists users in comprehending medical terminology, interpreting test results, and providing preliminary guidance in emergencies based on entered symptoms." +# +> ## Contributing to the project -3. AI-Driven Diagnostics: "Incorporating an AI system for preliminary diagnostics, we intend to analyze symptoms and user-entered data to provide suggestive measures or identify potential health issues, prompting users to seek professional medical advice." +If you find something worth contributing, please fork the repo, make a pull request and add valid and well-reasoned explanations about your changes or comments. -4. Augmented Reality (AR) for First Aid Guidance: "Our future plan involves integrating AR technology to guide users through basic first aid procedures by overlaying instructional visuals onto real-time surroundings." +Before adding a pull request, please note: -5. Health Gamification and Incentivization: "To encourage healthy habits, we plan to introduce gamification within PulsePal, utilizing AI to personalize challenges, rewards, and reminders aligned with individual health goals." +- This is an open source project. +- Your contributions should be inviting and clear. +- Any additions should be relevant. +- New features should be easy to contribute to. -6. Predictive Appointment Scheduling: "Utilizing AI algorithms, we aim to predict potential health concerns or follow-up appointments based on stored medical records, proactively suggesting relevant appointments or check-ups." +All **`suggestions`** are welcome! +# +> ##### README Created by `Enebeli Emmanuel` for Pulsepal From bbee27406a1ea4d5a3b7fd350c099243fb3c4cf4 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 13:02:41 +0000 Subject: [PATCH 101/136] updated the protocols --- .../src/components/AddCardComponent/index.tsx | 9 +++- tauri-app/src/pages/Home/SignUpForm.tsx | 4 +- tauri-app/src/stores/profile.ts | 50 +++++++++++++++---- tauri-app/src/utils/protocols/defns.ts | 2 +- tauri-app/src/utils/protocols/user.ts | 1 + 5 files changed, 50 insertions(+), 16 deletions(-) diff --git a/tauri-app/src/components/AddCardComponent/index.tsx b/tauri-app/src/components/AddCardComponent/index.tsx index a30753f..f939403 100644 --- a/tauri-app/src/components/AddCardComponent/index.tsx +++ b/tauri-app/src/components/AddCardComponent/index.tsx @@ -6,7 +6,7 @@ import { useForm } from "react-hook-form" import toast from "react-hot-toast"; import DocumentUtils from "@/utils/document"; import { Agent } from "../Auth/types"; -import { ProfileState } from "@/stores/profile"; +import { ProfileState, useProfile } from "@/stores/profile"; const possibleConditions = [ "Cancer", @@ -64,7 +64,8 @@ const formSchema = z.object({ otherFiles: z.array(z.instanceof(File)) }) -const index: FunctionComponent<{profile: ProfileState, agent: Agent, onClose: () => void}> = ({ profile, agent, onClose }) => { +const index: FunctionComponent<{ agent: Agent, onClose: () => void }> = ({ agent, onClose }) => { + const { profile, addCondition } = useProfile(store => ({ profile: store.state.profile!, addCondition: store.addCondition })) const [numFileUploaders, setNumFileUploaders] = useState(0) const form = useForm>({ @@ -86,6 +87,10 @@ const index: FunctionComponent<{profile: ProfileState, agent: Agent, onClose: () return } + const hasAddedCondition = await addCondition(agent, data.condition) + if (hasAddedCondition) + console.log("Added condition to profile") + toast.success('Successfully created record!') onClose() diff --git a/tauri-app/src/pages/Home/SignUpForm.tsx b/tauri-app/src/pages/Home/SignUpForm.tsx index b232969..fd4254f 100644 --- a/tauri-app/src/pages/Home/SignUpForm.tsx +++ b/tauri-app/src/pages/Home/SignUpForm.tsx @@ -7,7 +7,7 @@ import { z } from "zod" import { zodResolver } from "@hookform/resolvers/zod" import { useForm } from "react-hook-form" import toast from "react-hot-toast"; -import { CreatePayload } from "@/utils/user"; +import { SignUpPayload } from "@/stores/profile"; const formSchema = z.object({ firstName: z.string().min(1), @@ -68,7 +68,7 @@ export default function SignUpForm() { } }) - const createProfile = async (agent: Agent, payload: CreatePayload) => { + const createProfile = async (agent: Agent, payload: SignUpPayload) => { const hasSignedUpSuccessfully = await signUp(agent, payload) if (!hasSignedUpSuccessfully) { diff --git a/tauri-app/src/stores/profile.ts b/tauri-app/src/stores/profile.ts index 69aa213..f332ecb 100644 --- a/tauri-app/src/stores/profile.ts +++ b/tauri-app/src/stores/profile.ts @@ -4,27 +4,27 @@ import { Record as UserDetailsProtocolRecord } from "@/utils/protocols/user"; import { Agent } from "@/components/Auth/types"; import UserDetailsUtils, { CreatePayload } from "@/utils/user"; import BlobUtils from "@/utils/blob"; +import { Record as Web5Record } from "@web5/api/browser" -export type ProfileState = { +export type SignUpPayload = Omit + +export type ProfileState = Omit & +{ id: string // username: string - firstName: string, - lastName: string, profilePictureUrl: string } type State = { profile: ProfileState, isSignedIn: true + record: Web5Record } | { profile: null, + record: null, isSignedIn: false } -type Payload = Omit & { - profilePicture: File -} - export const useProfile = create( combine({ state: { @@ -41,6 +41,7 @@ export const useProfile = create( set({ state: { isSignedIn: false, + record: null, profile: null } }) @@ -62,10 +63,10 @@ export const useProfile = create( set({ state: { isSignedIn: true, + record: profileRecord, profile: { + ...profile, id: profileRecord.id, - firstName: profile.firstName, - lastName: profile.lastName, profilePictureUrl } } @@ -73,8 +74,35 @@ export const useProfile = create( return true }, - signUp: async (agent: Agent, payload: CreatePayload) => { - const profile = await UserDetailsUtils.createUserDetailsRecord(agent, payload) + addCondition: async (agent: Agent, condition: string) => { + const state = get().state + if (!state.isSignedIn) return false + + const { profilePictureUrl, ...payload } = state.profile + if (payload.conditions.indexOf(condition) < -1) return + + payload.conditions.push(condition) + + const updatedRecord = await UserDetailsUtils.updateUserDetailsRecord(agent, state.record, payload) + if (!updatedRecord) return false + const profile = await updatedRecord.data.json() + + set({ + state: { + isSignedIn: true, + record: updatedRecord, + profile: { + ...profile, + id: updatedRecord.id, + profilePictureUrl + } + } + }) + + return updatedRecord + }, + signUp: async (agent: Agent, payload: SignUpPayload) => { + const profile = await UserDetailsUtils.createUserDetailsRecord(agent, { ...payload, conditions: [] }) if (!profile) return false return profile diff --git a/tauri-app/src/utils/protocols/defns.ts b/tauri-app/src/utils/protocols/defns.ts index b1ffec6..3a26bbd 100644 --- a/tauri-app/src/utils/protocols/defns.ts +++ b/tauri-app/src/utils/protocols/defns.ts @@ -1 +1 @@ -export const url = "https://dschema.org/v0.0.8" as const +export const url = "https://dschema.org/v0.0.10a" as const diff --git a/tauri-app/src/utils/protocols/user.ts b/tauri-app/src/utils/protocols/user.ts index 95967af..7f63622 100644 --- a/tauri-app/src/utils/protocols/user.ts +++ b/tauri-app/src/utils/protocols/user.ts @@ -33,6 +33,7 @@ export namespace Record { firstName: string lastName: string profilePictureId: string + conditions: string[] description: string dateCreated: string } From dc87ecf3b986ed62bdeeca87d1f8d29254b488cb Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 13:28:03 +0000 Subject: [PATCH 102/136] updated the schema --- tauri-app/src/stores/profile.ts | 4 ++-- tauri-app/src/utils/protocols/defns.ts | 2 +- tauri-app/src/utils/protocols/user.ts | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tauri-app/src/stores/profile.ts b/tauri-app/src/stores/profile.ts index f332ecb..9740536 100644 --- a/tauri-app/src/stores/profile.ts +++ b/tauri-app/src/stores/profile.ts @@ -6,7 +6,7 @@ import UserDetailsUtils, { CreatePayload } from "@/utils/user"; import BlobUtils from "@/utils/blob"; import { Record as Web5Record } from "@web5/api/browser" -export type SignUpPayload = Omit +export type SignUpPayload = Omit export type ProfileState = Omit & { @@ -102,7 +102,7 @@ export const useProfile = create( return updatedRecord }, signUp: async (agent: Agent, payload: SignUpPayload) => { - const profile = await UserDetailsUtils.createUserDetailsRecord(agent, { ...payload, conditions: [] }) + const profile = await UserDetailsUtils.createUserDetailsRecord(agent, { ...payload, conditions: [], did: agent.did }) if (!profile) return false return profile diff --git a/tauri-app/src/utils/protocols/defns.ts b/tauri-app/src/utils/protocols/defns.ts index 3a26bbd..0614789 100644 --- a/tauri-app/src/utils/protocols/defns.ts +++ b/tauri-app/src/utils/protocols/defns.ts @@ -1 +1 @@ -export const url = "https://dschema.org/v0.0.10a" as const +export const url = "https://dschema.org/v0.0.10b" as const diff --git a/tauri-app/src/utils/protocols/user.ts b/tauri-app/src/utils/protocols/user.ts index 7f63622..0fd726f 100644 --- a/tauri-app/src/utils/protocols/user.ts +++ b/tauri-app/src/utils/protocols/user.ts @@ -30,6 +30,7 @@ const UserDetailsProtocol = { export namespace Record { export type Details = { + did: string firstName: string lastName: string profilePictureId: string From f09be33892f5d96a86e2d61f380aa7778c052632 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 13:28:15 +0000 Subject: [PATCH 103/136] added guard to the remedies page --- tauri-app/src/App.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index fd55a1b..02ae5d6 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -25,7 +25,13 @@ const router = createHashRouter([ ) }, { path: "/connect", element: }, - { path: "/remedies", element: }, + { + path: "/remedies", element: ( + }> + + + ) + }, { path: "/contact", element: }, { path: "/chat", element: }, ], From 42a729136a95767d52a98c04e26ef24de4d5f9d6 Mon Sep 17 00:00:00 2001 From: koko_codes <58889001+EnebeliEmmanuel@users.noreply.github.com> Date: Sun, 7 Jan 2024 14:59:08 +0100 Subject: [PATCH 104/136] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 1d306c8..c0625bb 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Pulsepal-MVP 🌟 +# PulsePal-MVP 🌟 -## Welcome to the Pulsepal MVP repository +## Welcome to the PulsePal MVP repository

    site @@ -137,7 +137,7 @@ This Project was created by these awesome dedicated members

    -> ## What's next for Pulsepal +> ## What's next for PulsePal - Personalized Health Insights: "Our plan includes integrating AI-driven analytics to offer personalized health insights, assessing individual health risks and predicting future health trends based on users' medical records." @@ -166,4 +166,4 @@ Before adding a pull request, please note: All **`suggestions`** are welcome! # -> ##### README Created by `Enebeli Emmanuel` for Pulsepal +> ##### README Created by `Enebeli Emmanuel` for PulsePal From 402d66ccee7417a3b8bf1521291c3d95ef82ec69 Mon Sep 17 00:00:00 2001 From: coder12git Date: Sun, 7 Jan 2024 21:37:51 +0530 Subject: [PATCH 105/136] added toast for alert and fix slice in record for text Signed-off-by: coder12git --- tauri-app/src/components/Card/index.tsx | 2 +- tauri-app/src/pages/chat.tsx | 6 +++++- tauri-app/src/pages/remedy.tsx | 5 +++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/tauri-app/src/components/Card/index.tsx b/tauri-app/src/components/Card/index.tsx index 994dabd..c1b8abf 100644 --- a/tauri-app/src/components/Card/index.tsx +++ b/tauri-app/src/components/Card/index.tsx @@ -48,7 +48,7 @@ const index: FC = ({

    {title ? title : file_name}

    -

    {desc.slice(0, 150)}

    +

    {desc.substring(0, 50) + "..."}

    {date} diff --git a/tauri-app/src/pages/chat.tsx b/tauri-app/src/pages/chat.tsx index fbd5444..7ac018d 100644 --- a/tauri-app/src/pages/chat.tsx +++ b/tauri-app/src/pages/chat.tsx @@ -273,6 +273,10 @@ export default function Home() { }; return ( -
    +
    +

    {myDid}

    + + +
    ); } \ No newline at end of file diff --git a/tauri-app/src/pages/remedy.tsx b/tauri-app/src/pages/remedy.tsx index eb39b90..ac456cf 100644 --- a/tauri-app/src/pages/remedy.tsx +++ b/tauri-app/src/pages/remedy.tsx @@ -1,6 +1,7 @@ import { FunctionComponent, useEffect, useRef, useState } from "react"; import useWeb5Store, { schemaOrgProtocolDefinition } from "@/stores/useWeb5Store"; import { useRemedies } from "@/stores/useRemedy"; +import toast from "react-hot-toast"; import Remedies from './Remedies'; const cards = [ @@ -76,10 +77,10 @@ const Remedy: FunctionComponent = () => { console.log(res) if (res) { - alert(`Remedy record saved: ${res}`) + toast.success('Successfully created remedy!') } else { - alert("Failed to save record") + toast.error('Failed to create remedy!') console.error(); } } From 0ea5c26ae74d86daacf6233a01c7b2983230f74a Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Sun, 7 Jan 2024 23:06:29 +0100 Subject: [PATCH 106/136] partially done awating reviews --- tauri-app/package.json | 1 + tauri-app/src/App.tsx | 5 +- tauri-app/src/components/Chat/index.css | 2 +- tauri-app/src/components/MobileChat/index.css | 101 ++++++++++++ tauri-app/src/components/MobileChat/index.tsx | 70 +++++++++ tauri-app/src/components/Navbar/index.css | 31 ++++ tauri-app/src/components/Navbar/index.tsx | 41 +++-- .../src/components/UserFriendList/index.css | 19 ++- .../src/components/UserFriendList/index.tsx | 12 +- .../components/UserMobileFriendList/index.css | 69 +++++++++ .../components/UserMobileFriendList/index.tsx | 79 ++++++++++ .../components/UserMobileProfile/index.css | 53 +++++++ .../components/UserMobileProfile/index.tsx | 42 +++++ tauri-app/src/index.css | 2 +- tauri-app/src/pages/Chat/index.css | 21 ++- tauri-app/src/pages/Chat/index.tsx | 54 ++++++- tauri-app/src/pages/Home/SignUpForm.tsx | 89 ++++++----- tauri-app/src/pages/Home/index.tsx | 11 +- tauri-app/src/pages/Records/index.css | 44 ++++++ tauri-app/src/pages/Records/index.tsx | 98 ++++++++---- tauri-app/src/pages/Remedies/index.tsx | 31 +++- tauri-app/src/stores/profile.ts | 146 ++++++++++-------- 22 files changed, 846 insertions(+), 175 deletions(-) create mode 100644 tauri-app/src/components/MobileChat/index.css create mode 100644 tauri-app/src/components/MobileChat/index.tsx create mode 100644 tauri-app/src/components/UserMobileFriendList/index.css create mode 100644 tauri-app/src/components/UserMobileFriendList/index.tsx create mode 100644 tauri-app/src/components/UserMobileProfile/index.css create mode 100644 tauri-app/src/components/UserMobileProfile/index.tsx diff --git a/tauri-app/package.json b/tauri-app/package.json index 63472a0..f90ccef 100644 --- a/tauri-app/package.json +++ b/tauri-app/package.json @@ -34,6 +34,7 @@ "react-pdf": "^7.6.0", "react-router-dom": "^6.21.1", "react-spinners": "^0.13.8", + "react-toastify": "^9.1.3", "react-virtualized-auto-sizer": "^1.0.20", "react-window": "^1.8.10", "tailwind-merge": "^2.1.0", diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index fd55a1b..5b8ba6c 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -18,11 +18,12 @@ const router = createHashRouter([ children: [ { path: "/", element: }, { - path: "/records", element: ( + path: "/records", + element: ( }> - ) + ), }, { path: "/connect", element: }, { path: "/remedies", element: }, diff --git a/tauri-app/src/components/Chat/index.css b/tauri-app/src/components/Chat/index.css index a5a6d6c..4ecba23 100644 --- a/tauri-app/src/components/Chat/index.css +++ b/tauri-app/src/components/Chat/index.css @@ -64,7 +64,7 @@ .chats-container::-webkit-scrollbar-thumb { width: 2px; background: var(--color-blue); - border-radius: 5px; + border-radius: 0 5px 5px 0; margin: 0 3px; } diff --git a/tauri-app/src/components/MobileChat/index.css b/tauri-app/src/components/MobileChat/index.css new file mode 100644 index 0000000..3113d50 --- /dev/null +++ b/tauri-app/src/components/MobileChat/index.css @@ -0,0 +1,101 @@ +.m-chat-m-container { + width: 320px; + height: 440px; + background: var(--color-white); + border-radius: 15px; + padding: 8px; +} + +.m-chat-component-container { + box-shadow: var(--box-shadow-black); + border-radius: 15px; + padding: 20px; + width: 80%; + height: 100%; + min-height: 500px; +} + +.m-chat-message-input-container { + width: 100%; + padding: 15px 0px; + display: flex; + justify-content: space-around; + align-items: center; +} + +.m-chat-message-input-container input { + width: 65%; + padding: 8px 5px; + background: var(--color-slate-accent); + border: none; + border-radius: 25px; + outline: none; + font-family: "Roboto"; + font-size: 20px; + text-indent: 8px; +} + +.m-chat-message-input-container button { + width: 40px; + height: 40px; + border: none; + border-radius: 50%; + color: var(--color-white); + background: var(--color-blue); + box-shadow: var(--box-shadow-blue); + font-size: 20px; + outline: none; +} + +.m-chats-container { + width: 90%; + background: var(--color-light-grey); + padding: 12px; + border-radius: 15px 5px 5px 15px; + margin: 0 auto; + overflow-y: scroll; + overflow-x: hidden; + height: 350px; +} + +.m-chats-container::-webkit-scrollbar { + width: 6px; +} + +.m-chats-container::-webkit-scrollbar-track { + box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.1); + border-radius: 0 15px 15px 0; + transform: translateX(-4px); +} + +.m-chats-container::-webkit-scrollbar-thumb { + width: 2px; + background: var(--color-blue); + border-radius: 0 5px 5px 0; + margin: 0 3px; +} + +.msg-container { + width: 100%; + margin: 25px 2px; +} + +.msg-f { + width: max-content; + background: var(--color-light-green); + font-family: "Open Sans"; + padding: 4px 10px; + border-radius: 8px 8px 8px 0px; + margin-right: auto; + max-width: 200px; +} + +.msg-t { + width: max-content; + background: var(--color-light-blue); + font-family: "Open Sans"; + padding: 4px 10px; + border-radius: 8px 8px 0px 8px; + margin-left: auto; + max-width: 200px; +} diff --git a/tauri-app/src/components/MobileChat/index.tsx b/tauri-app/src/components/MobileChat/index.tsx new file mode 100644 index 0000000..b462dc6 --- /dev/null +++ b/tauri-app/src/components/MobileChat/index.tsx @@ -0,0 +1,70 @@ +import "./index.css"; +import React, { FC } from "react"; + +interface MessageProp { + message: string; + isLeft: boolean; +} + +const Message: FC = ({ message, isLeft }) => { + return ( +
    +
    +

    {message}

    +
    +
    + ); +}; + +const index: FC = ({ setHideChat, hideChat }) => { + return ( +
    +
    + + + + + + +
    +
    + + + +
    +
    + ); +}; + +export default index; diff --git a/tauri-app/src/components/Navbar/index.css b/tauri-app/src/components/Navbar/index.css index b433b8d..0227c4f 100644 --- a/tauri-app/src/components/Navbar/index.css +++ b/tauri-app/src/components/Navbar/index.css @@ -104,6 +104,37 @@ margin-left: 10px; } +.did-container { + width: 200px; + height: 150px; + background: var(--color-white); + box-shadow: var(--box-shadow-black); + position: absolute; + top: 100px; + right: 45px; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + padding: 8px; + border-radius: 5px; +} + +.did-container .auth_container { + background: var(--color-red); + box-shadow: var(--box-shadow-red); +} + +.did-container input { + background: var(--color-slate-accent); + border-radius: 5px; + border: none; + font-family: "Roboto"; + outline: none; + padding: 8px 4px; + margin: 14px 0px; +} + @media (max-width: 750px) { .main_navbar_container { padding: 15px 25px; diff --git a/tauri-app/src/components/Navbar/index.tsx b/tauri-app/src/components/Navbar/index.tsx index 7482576..a6b8649 100644 --- a/tauri-app/src/components/Navbar/index.tsx +++ b/tauri-app/src/components/Navbar/index.tsx @@ -4,23 +4,28 @@ import { NavLink } from "react-router-dom"; import useWeb5Store from "@/stores/useWeb5Store.ts"; import { Agent } from "../Auth/types"; import { useProfile } from "@/stores/profile.ts"; +import { useState } from "react"; const index = () => { - const { web5, did } = useWeb5Store((state) => ({ web5: state.web5, did: state.did })); - const { signIn, setShowAuthModal, signOut } = useProfile(state => ({ + const { web5, did } = useWeb5Store((state) => ({ + web5: state.web5, + did: state.did, + })); + const { signIn, setShowAuthModal, signOut } = useProfile((state) => ({ signIn: state.signIn, signOut: state.signOut, - setShowAuthModal: state.setShowAuthModal - })) + setShowAuthModal: state.setShowAuthModal, + })); const beginAuthFlow = async (agent: Agent) => { - const signedIn = await signIn(agent) + const signedIn = await signIn(agent); if (!signedIn) { - console.log("displaying auth modal") - setShowAuthModal(true) + console.log("displaying auth modal"); + setShowAuthModal(true); } - } + }; + const [showSignOutUtils, setShowSignOutUtils] = useState(false); return (
    @@ -67,18 +72,32 @@ const index = () => { } > + {showSignOutUtils && ( +
    +
    + DID: + +
    + +
    + )} + diff --git a/tauri-app/src/components/UserFriendList/index.css b/tauri-app/src/components/UserFriendList/index.css index 9082926..9fe13c0 100644 --- a/tauri-app/src/components/UserFriendList/index.css +++ b/tauri-app/src/components/UserFriendList/index.css @@ -20,6 +20,22 @@ border-radius: 5px; } +.friend-tag-container span { + font-family: "Roboto"; + background: var(--color-red); + border-radius: 3px; + padding: 2px 3px; + color: var(--color-white); + border: 2px solid var(--color-white); + border-radius: 8px; + + font-size: 8px; + position: relative; + left: -5px; + width: 20px; + height: 20px; +} + .friends-list-container hr { width: 60%; margin: 0 auto; @@ -42,7 +58,6 @@ } .friends-list-header { - background: var(--color-blue); padding: 8px 12px; border-radius: 10px; color: var(--color-white); @@ -52,7 +67,7 @@ .friend-main-list-container { overflow-y: scroll; - height: 300px; + height: 250px; margin: 15px 0; padding: 5px; } diff --git a/tauri-app/src/components/UserFriendList/index.tsx b/tauri-app/src/components/UserFriendList/index.tsx index 38833b0..210ade9 100644 --- a/tauri-app/src/components/UserFriendList/index.tsx +++ b/tauri-app/src/components/UserFriendList/index.tsx @@ -5,16 +5,21 @@ interface FriendTagProp { friendProfileImg: string; friendName: string; isFriendOnline: boolean; + newChat?: number; } const FriendTag: FC = ({ friendProfileImg, friendName, isFriendOnline, + newChat, }) => { return (
    - +
    + + {newChat && {newChat}} +

    {friendName.slice(0, 6) + "..."}

    = ({ interface UserFriendListProp { friendList: FriendTagProp[]; + setHideChat: () => void; + hideChat: boolean; } -const index: FC = ({ friendList }) => { +const index: FC = ({ friendList, setHideChat, hideChat }) => { return (
    @@ -46,6 +53,7 @@ const index: FC = ({ friendList }) => { friendProfileImg={friend.profile_pic} isFriendOnline={friend.isOnline} friendName={friend.username} + newChat={friend.newChat} />
    diff --git a/tauri-app/src/components/UserMobileFriendList/index.css b/tauri-app/src/components/UserMobileFriendList/index.css new file mode 100644 index 0000000..68bbd6e --- /dev/null +++ b/tauri-app/src/components/UserMobileFriendList/index.css @@ -0,0 +1,69 @@ +.m-friend-tag-container { + display: flex; + justify-content: space-around; + align-items: center; + border-radius: 15px; + padding: 2px 8px; + transition: 0.3s; + margin: 15px 20px; + background: var(--color-slate-accent); + box-shadow: var(--box-shadow-black); + height: 80px; +} + +.m-friend-tag-container h1 { + font-size: 15px; + font-family: "Roboto"; +} + +.m-friend-tag-container img { + width: 60px; + height: 60px; + border-radius: 50%; +} + +.m-friend-tag-container span { + font-family: "Roboto"; + background: var(--color-red); + border-radius: 3px; + padding: 2px 3px; + color: var(--color-white); + border: 2px solid var(--color-white); + border-radius: 8px; + font-size: 8px; + position: relative; + left: -15px; + top: -4px; + width: 40px; + height: 40px; +} + +.m-friends-list-container hr { + width: 80%; + margin: 0 auto; +} + +.m-friends-list-container hr:last-child { + display: none; +} + +.m-friends-list-container { + border-radius: 15px; +} + +.m-friends-list-header { + padding: var(--padding-mobile); + font-family: "Roboto"; + text-align: left; +} + +.m-friend-main-list-container { + overflow: hidden; +} + +.m-header { + background: var(--color-blue); + color: var(--color-white); + font-family: "Roboto"; + padding: 8px 25px; +} diff --git a/tauri-app/src/components/UserMobileFriendList/index.tsx b/tauri-app/src/components/UserMobileFriendList/index.tsx new file mode 100644 index 0000000..2d22492 --- /dev/null +++ b/tauri-app/src/components/UserMobileFriendList/index.tsx @@ -0,0 +1,79 @@ +import "./index.css"; +import React, { FC, useState } from "react"; + +interface FriendTagProp { + friendProfileImg: string; + friendName: string; + isFriendOnline: boolean; + newChat?: number; + setHideChat: () => void; + hideChat: boolean; +} + +interface UserFriendListProp { + friendList: FriendTagProp[]; +} + +const FriendTag: FC = ({ + friendProfileImg, + friendName, + isFriendOnline, + newChat, + setHideChat, + hideChat, +}) => { + return ( +
    setHideChat(!hideChat)} + className="m-friend-tag-container" + > +
    + + {newChat && {newChat}} +
    +
    +

    {friendName.slice(0, 20) + "..."}

    +
    + +
    + ); +}; + +const index: FC = ({ + friendList, + hideChat, + setHideChat, +}) => { + return ( +
    +
    +

    Friends

    +
    +
    + {friendList.map((friend) => { + return ( + <> + + + ); + })} +
    +
    + ); +}; + +export default index; diff --git a/tauri-app/src/components/UserMobileProfile/index.css b/tauri-app/src/components/UserMobileProfile/index.css new file mode 100644 index 0000000..2704664 --- /dev/null +++ b/tauri-app/src/components/UserMobileProfile/index.css @@ -0,0 +1,53 @@ +.m-userprofile-container { + box-shadow: var(--box-shadow-black); + text-align: center; + position: relative; + padding-bottom: 15px; +} + +.m-userprofile-info-container img { + width: 80px; + height: 80px; + border-radius: 50%; + background: var(--color-white); + padding: 10px; + position: absolute; + top: 80px; + right: 20px; +} + +.m-userprofile-info-container p { + font-family: "Open Sans"; + margin-top: 50px; +} + +.m-cover-container { + height: 130px; + width: auto; + text-align: left; + padding-right: 6px; +} + +.m-cover-container h3 { + color: var(--color-white); + font-family: "Roboto"; + font-size: 18px; + position: relative; + left: 6px; + top: 10px; +} + +.m-cover-container p { + color: var(--color-white); + font-family: "Open Sans"; + font-size: 14px; + position: relative; + left: 6px; + top: 25px; +} + +@media (max-width: 750px) { + .m-userprofile-container { + width: auto; + } +} diff --git a/tauri-app/src/components/UserMobileProfile/index.tsx b/tauri-app/src/components/UserMobileProfile/index.tsx new file mode 100644 index 0000000..e25db19 --- /dev/null +++ b/tauri-app/src/components/UserMobileProfile/index.tsx @@ -0,0 +1,42 @@ +import React, { FC } from "react"; + +import "./index.css"; + +interface UserProfileProps { + username: String; + profile_pic: String; + cover_pic: String; + about_user: String; + friends: Number; +} +const index: FC = ({ + username, + profile_pic, + cover_pic, + about_user, + friends, +}) => { + return ( +
    +
    +

    @{username}

    +

    + Friends | {friends} +

    +
    +
    + +

    {about_user}

    +
    +
    + ); +}; + +export default index; diff --git a/tauri-app/src/index.css b/tauri-app/src/index.css index 5bfae8d..1696928 100644 --- a/tauri-app/src/index.css +++ b/tauri-app/src/index.css @@ -5,7 +5,7 @@ --box-shadow-red: 0 5px 12px rgba(239, 68, 68, 0.5); --color-blue: #0ea5e9; --box-shadow-blue: 0 5px 12px rgba(14, 165, 233, 0.3); - --box-shadow-black: 0 3px 12px rgba(0, 0, 0, 0.2); + --box-shadow-black: 0 3px 12px rgba(0, 0, 0, 0.1); --color-slate-accent: #f1f5f9; --color-white: #fff; --color-black: #000; diff --git a/tauri-app/src/pages/Chat/index.css b/tauri-app/src/pages/Chat/index.css index 4632a88..866178c 100644 --- a/tauri-app/src/pages/Chat/index.css +++ b/tauri-app/src/pages/Chat/index.css @@ -1,14 +1,14 @@ .main-chat-container { padding: var(--padding-desktop); display: flex; - justify-content: space-between; + justify-content: space-around; align-items: flex-start; position: relative; max-height: 100%; } .utils-container { - width: 30%; + width: 25%; } .chat-container { @@ -16,8 +16,17 @@ height: 100%; } -@media (max-width: 750px) { - .main-chat-container { - padding: var(--padding-mobile); - } +.data-container { + background: rgba(0, 0, 0, 0.3); + position: fixed; + width: 100%; + height: 100vh; + top: 0; + left: 0; + display: flex; + justify-content: center; + align-items: center; + z-index: 7; } + +@media (max-width: 750px) {} diff --git a/tauri-app/src/pages/Chat/index.tsx b/tauri-app/src/pages/Chat/index.tsx index 560826e..307e28b 100644 --- a/tauri-app/src/pages/Chat/index.tsx +++ b/tauri-app/src/pages/Chat/index.tsx @@ -1,18 +1,64 @@ import "./index.css"; import UserProfile from "../../components/UserProfile/"; import UserFriendList from "../../components/UserFriendList/"; + import Chat from "../../components/Chat/"; -import { useState } from "react"; +import UserMobileProfile from "../../components/UserMobileProfile/"; +import UserMobileFriendList from "../../components/UserMobileFriendList/"; +import MobileChat from "../../components/MobileChat"; + +import { useEffect, useState } from "react"; const index = () => { const [friends, setFriends] = useState([ { profile_pic: "/pg.jpg", username: "@scriptkidd", isOnline: false }, - { profile_pic: "/pg.jpg", username: "@nikki", isOnline: false }, - { profile_pic: "/pm.jpg", username: "@gregidd", isOnline: true }, - { profile_pic: "/pic.jpg", username: "@scdd", isOnline: false }, + { profile_pic: "/pg.jpg", username: "@nikki", isOnline: false, newChat: 1 }, + { + profile_pic: "/pm.jpg", + username: "@gregidd", + isOnline: true, + newChat: 7, + }, + { profile_pic: "/pic.jpg", username: "@scdd", isOnline: false, newChat: 4 }, ]); + const [isMobile, setIsMobile] = useState(false); + const [hideChat, setHideChat] = useState(false); + + useEffect(() => { + if (window.innerWidth < 750) { + setIsMobile(true); + return; + } + + setIsMobile(false); + }, []); + if (isMobile) { + return ( +
    + + + {hideChat && ( +
    + +
    + )} +
    + ); + } return (
    diff --git a/tauri-app/src/pages/Home/SignUpForm.tsx b/tauri-app/src/pages/Home/SignUpForm.tsx index 68a1fe6..95e7547 100644 --- a/tauri-app/src/pages/Home/SignUpForm.tsx +++ b/tauri-app/src/pages/Home/SignUpForm.tsx @@ -3,9 +3,9 @@ import useWeb5Store from "@/stores/useWeb5Store"; import { useProfile } from "@/stores/profile"; import { Agent } from "@/components/Auth/types"; import { FunctionComponent, useRef, useState } from "react"; -import { z } from "zod" -import { zodResolver } from "@hookform/resolvers/zod" -import { useForm } from "react-hook-form" +import { z } from "zod"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { useForm } from "react-hook-form"; import toast from "react-hot-toast"; import { CreatePayload } from "@/utils/user"; @@ -13,14 +13,16 @@ const formSchema = z.object({ firstName: z.string().min(1), lastName: z.string().min(1), description: z.string().min(1), - profilePicture: z.instanceof(File) -}) + profilePicture: z.instanceof(File), +}); interface FileProp { file: File | null | undefined; } -const FileUploader: FunctionComponent<{ onChange: (file: File | null) => void }> = ({ onChange }) => { +const FileUploader: FunctionComponent<{ + onChange: (file: File | null) => void; +}> = ({ onChange }) => { const [file, setFile] = useState({ file: null }); return ( @@ -29,8 +31,8 @@ const FileUploader: FunctionComponent<{ onChange: (file: File | null) => void }>
    { - const file = e?.target?.files?.[0] - onChange(file ? file : null) + const file = e?.target?.files?.[0]; + onChange(file ? file : null); setFile({ file: e?.target?.files?.[0] }); }} type="file" @@ -41,58 +43,64 @@ const FileUploader: FunctionComponent<{ onChange: (file: File | null) => void }> }; export default function SignUpForm() { - console.log("kfjle") - const { web5, did } = useWeb5Store((state) => ({ web5: state.web5!, did: state.did! })); + console.log("kfjle"); + const { web5, did } = useWeb5Store((state) => ({ + web5: state.web5!, + did: state.did!, + })); const submitBtnRef = useRef(null); - const { setShowAuthModal, signUp, signIn } = useProfile( - (state) => ({ signUp: state.signUp, signIn: state.signIn, setShowAuthModal: state.setShowAuthModal }), - ); + const { setShowAuthModal, signUp, signIn } = useProfile((state) => ({ + signUp: state.signUp, + signIn: state.signIn, + setShowAuthModal: state.setShowAuthModal, + })); const form = useForm>({ - resolver: zodResolver(formSchema) - }) + resolver: zodResolver(formSchema), + }); form.watch((value) => { - if (!submitBtnRef.current) return + if (!submitBtnRef.current) return; - const isValid = formSchema.safeParse(value).success + const isValid = formSchema.safeParse(value).success; if (isValid) { - submitBtnRef.current.classList.remove("not-filled-btn") - submitBtnRef.current.classList.add("filled-btn") - submitBtnRef.current.disabled = false - } - else { - submitBtnRef.current.classList.add("not-filled-btn") - submitBtnRef.current.classList.remove("filled-btn") - submitBtnRef.current.disabled = true + submitBtnRef.current.classList.remove("not-filled-btn"); + submitBtnRef.current.classList.add("filled-btn"); + submitBtnRef.current.disabled = false; + } else { + submitBtnRef.current.classList.add("not-filled-btn"); + submitBtnRef.current.classList.remove("filled-btn"); + submitBtnRef.current.disabled = true; } - }) + }); const createProfile = async (agent: Agent, payload: CreatePayload) => { - const hasSignedUpSuccessfully = await signUp(agent, payload) + const hasSignedUpSuccessfully = await signUp(agent, payload); if (!hasSignedUpSuccessfully) { - toast.error('Sorry an error occurred!') - return + toast.error("Sorry an error occurred!"); + return; } - if (!await signIn(agent)) return - - toast.success('Successfully signed up!') + if (!(await signIn(agent))) return; + toast.success("Successfully signed up!"); - setShowAuthModal(false) - } + setShowAuthModal(false); + }; const onSubmit = (value: z.infer) => { - if (web5 && did) createProfile({ web5, did }, value) - } + if (web5 && did) createProfile({ web5, did }, value); + }; return ( -
    -
    +
    setShowAuthModal(false)}> + e.stopPropagation()} + onSubmit={form.handleSubmit(onSubmit)} + > form.setValue("profilePicture", file as File)} /> @@ -124,6 +132,5 @@ export default function SignUpForm() {
    - ) + ); } - diff --git a/tauri-app/src/pages/Home/index.tsx b/tauri-app/src/pages/Home/index.tsx index 867031f..6e99dae 100644 --- a/tauri-app/src/pages/Home/index.tsx +++ b/tauri-app/src/pages/Home/index.tsx @@ -4,7 +4,7 @@ import SignUpForm from "./SignUpForm"; import AuthGuard from "@/components/Auth/Guard"; export default function HomePage() { - const showAuthModal = useProfile(state => state.showAuthModal); + const showAuthModal = useProfile((state) => state.showAuthModal); return ( <> @@ -219,13 +219,8 @@ export default function HomePage() {
    - {showAuthModal && ( - - {console.log("fjekkfle") || null} - - - )} -
    + {showAuthModal && } +
    ); } diff --git a/tauri-app/src/pages/Records/index.css b/tauri-app/src/pages/Records/index.css index f1bf303..fc6c53d 100644 --- a/tauri-app/src/pages/Records/index.css +++ b/tauri-app/src/pages/Records/index.css @@ -70,6 +70,50 @@ position: relative; } +.no-records { + font-family: "Open Sans"; +} + +.connect-wallet-container { + width: 300px; + height: 200px; + background: var(--color-white); + border-radius: 15px; + padding: 18px 8px; + text-align: center; +} + +.connect-wallet-container h1 { + font-family: "Roboto"; + font-size: 25px; + margin-top: 30px; +} + +.connect-wallet-container button { + padding: 8px 20px; + border-radius: 8px; + background: var(--color-green); + box-shadow: var(--box-shadow-green); + color: var(--color-white); + font-family: "Roboto"; + cursor: pointer; + font-weight: 800; + border: none; + min-width: 180px; + font-size: 25px; + text-align: center; + margin-top: 40px; + outline: none; +} + +.connect-wallet-container button i { + background: var(--color-white); + padding: 10px 12px; + border-radius: 50%; + color: var(--color-black); + margin-left: 10px; +} + @media (max-width: 750px) { .main-records-container { padding: var(--padding-mobile); diff --git a/tauri-app/src/pages/Records/index.tsx b/tauri-app/src/pages/Records/index.tsx index 6a3c4ef..5d53c6f 100644 --- a/tauri-app/src/pages/Records/index.tsx +++ b/tauri-app/src/pages/Records/index.tsx @@ -9,32 +9,46 @@ import Card from "../../components/Card"; import { useProfile } from "@/stores/profile"; import useWeb5Store from "@/stores/useWeb5Store"; import { CardData, fetchRecords } from "./utils"; +import toast, { Toaster } from "react-hot-toast"; const index = () => { - const agent = useWeb5Store(state => ({ web5: state.web5!, did: state.did! })) - const profile = useProfile(state => state.state.profile!) + const agent = useWeb5Store((state) => ({ + web5: state.web5!, + did: state.did!, + })); + const profile = useProfile((state) => state.state.profile!); + const isSignedIn = useProfile((state) => state.state.isSignedIn); + const [showConnectWalletComponent, setShowConnectWalletComponent] = + useState(false); const [cardsData, setCardsData] = useState([]); useEffect(() => { - refetchRecords() - }, []) + refetchRecords(); + }, []); const refetchRecords = async () => { - const records = await fetchRecords(agent, profile) - console.log('records:', records) + const records = await fetchRecords(agent, profile); + console.log("records:", records); - if (!records) return + if (!records) return; - setCardsData(records) + setCardsData(records); - return - } + return; + }; const [isAddCardActive, setIsAddCardActive] = useState(false); const [isCardDetailActive, setIsCardDetailActive] = useState(false); const [activeCard, setActiveCard] = useState(null); + const SignedInCheck = () => { + if (isSignedIn) { + setIsAddCardActive(!isAddCardActive); + } else { + setShowConnectWalletComponent(true); + } + }; // @ts-ignore const isCardClicked = (cardDetail) => { setIsCardDetailActive(!isCardDetailActive); @@ -50,24 +64,28 @@ const index = () => { className={ !isAddCardActive ? "add-records-btn" : "close-add-records-btn" } - onClick={() => setIsAddCardActive(!isAddCardActive)} + onClick={() => SignedInCheck()} >
    - {cardsData.length > 0 ? cardsData.map((card) => { - return ( - - ); - }) :
    No Records Found
    } + {cardsData.length > 0 ? ( + cardsData.map((card) => { + return ( + + ); + }) + ) : ( +
    No Records Found
    + )}
    {(isAddCardActive || isCardDetailActive) && (
    { style={{ zIndex: `${isCardDetailActive ? "7" : "6"}` }} >
    - {isAddCardActive && { - setIsAddCardActive(false) - refetchRecords() - }} /> - } + {isAddCardActive && ( + { + setIsAddCardActive(false); + refetchRecords(); + }} + /> + )} {isCardDetailActive && ( {
    )} + {showConnectWalletComponent && ( +
    setShowConnectWalletComponent(false)} + className="add-card-container" + > +
    { + e.stopPropagation(); + }} + > +

    Unauthorized - Please Sign in

    + +
    +
    + )}
    ); }; diff --git a/tauri-app/src/pages/Remedies/index.tsx b/tauri-app/src/pages/Remedies/index.tsx index c4ca609..f126edb 100644 --- a/tauri-app/src/pages/Remedies/index.tsx +++ b/tauri-app/src/pages/Remedies/index.tsx @@ -1,5 +1,6 @@ import "./index.css"; import { useState } from "react"; +import { useProfile } from "@/stores/profile"; import Ratings from "../../components/Ratings"; import RemedyCard from "../../components/RemedyCard/"; @@ -45,6 +46,10 @@ const index = ({ save, formFunc, form, remediesData, docsWithImageUrls }) => { }, ]); + const isSignedIn = useProfile((state) => state.state.isSignedIn); + const [showConnectWalletComponent, setShowConnectWalletComponent] = + useState(false); + const [isDetailRemedyActive, setIsDetailRemedyActive] = useState(false); const [activeRemedy, setActiveRemedy] = useState(null); @@ -83,6 +88,13 @@ const index = ({ save, formFunc, form, remediesData, docsWithImageUrls }) => { }; const [isAddRemedyActive, setIsAddRemedyActive] = useState(false); + const SignedInCheck = () => { + if (isSignedIn) { + setIsAddRemedyActive(!isAddRemedyActive); + } else { + setShowConnectWalletComponent(true); + } + }; return (
    @@ -92,7 +104,7 @@ const index = ({ save, formFunc, form, remediesData, docsWithImageUrls }) => { className={ !isAddRemedyActive ? "add-records-btn" : "close-add-records-btn" } - onClick={() => setIsAddRemedyActive(!isAddRemedyActive)} + onClick={() => SignedInCheck()} >
    @@ -205,6 +217,23 @@ const index = ({ save, formFunc, form, remediesData, docsWithImageUrls }) => { />
    )} + + {showConnectWalletComponent && ( +
    setShowConnectWalletComponent(false)} + className="add-remedy-container" + > +
    { + e.stopPropagation(); + }} + > +

    Unauthorized - Please Sign in

    + +
    +
    + )}
    ); }; diff --git a/tauri-app/src/stores/profile.ts b/tauri-app/src/stores/profile.ts index bce5670..8c3670b 100644 --- a/tauri-app/src/stores/profile.ts +++ b/tauri-app/src/stores/profile.ts @@ -1,4 +1,4 @@ -import { create } from "zustand" +import { create } from "zustand"; import { combine } from "zustand/middleware"; import { Record as UserDetailsProtocolRecord } from "@/utils/protocols/user"; import { Agent } from "@/components/Auth/types"; @@ -6,78 +6,94 @@ import UserDetailsUtils, { CreatePayload } from "@/utils/user"; import DocumentUtils from "@/utils/document"; export type ProfileState = { - id: string + id: string; // username: string - firstName: string, - lastName: string, - profilePictureUrl: string -} + firstName: string; + lastName: string; + profilePictureUrl: string; +}; -type State = { - profile: ProfileState, - isSignedIn: true -} | { - profile: null, - isSignedIn: false -} +type State = + | { + profile: ProfileState; + isSignedIn: true; + } + | { + profile: null; + isSignedIn: false; + }; -type Payload = Omit & { - profilePicture: File -} +type Payload = Omit< + UserDetailsProtocolRecord.Details, + "dateCreated" | "profilePictureUrl" +> & { + profilePicture: File; +}; export const useProfile = create( - combine({ - state: { - profile: null, - isSignedIn: false - } as State, - showAuthModal: false - }, (set, get) => ({ - setShowAuthModal: (showAuthModal: boolean) => { - set({ showAuthModal }) - }, - signOut: () => { - if (get().state.isSignedIn) { - set({ - state: { - isSignedIn: false, - profile: null - } - }) - } + combine( + { + state: { + profile: null, + isSignedIn: false, + } as State, + showAuthModal: false, }, - signIn: async (agent: Agent) => { - const profileRecord = await UserDetailsUtils.fetchUserDetailsRecord(agent) - if (!profileRecord) return false - - const profile: UserDetailsProtocolRecord.Details = await profileRecord.data.json() + (set, get) => ({ + setShowAuthModal: (showAuthModal: boolean) => { + set({ showAuthModal }); + }, + signOut: () => { + if (get().state.isSignedIn) { + set({ + state: { + isSignedIn: false, + profile: null, + }, + }); + } + }, + signIn: async (agent: Agent) => { + const profileRecord = + await UserDetailsUtils.fetchUserDetailsRecord(agent); + if (!profileRecord) return false; - const profilePicture = await DocumentUtils.fetchBlobRecord(agent, profile.profilePictureId) - let profilePictureUrl = "" - if (profilePicture) { - const profilePictureBlob = await profilePicture.data.blob() - profilePictureUrl = URL.createObjectURL(profilePictureBlob) - } + const profile: UserDetailsProtocolRecord.Details = + await profileRecord.data.json(); - set({ - state: { - isSignedIn: true, - profile: { - id: profileRecord.id, - firstName: profile.firstName, - lastName: profile.lastName, - profilePictureUrl - } + const profilePicture = await DocumentUtils.fetchBlobRecord( + agent, + profile.profilePictureId, + ); + let profilePictureUrl = ""; + if (profilePicture) { + const profilePictureBlob = await profilePicture.data.blob(); + profilePictureUrl = URL.createObjectURL(profilePictureBlob); } - }) - return true - }, - signUp: async (agent: Agent, payload: CreatePayload) => { - const profile = await UserDetailsUtils.createUserDetailsRecord(agent, payload) - if (!profile) return false + set({ + state: { + isSignedIn: true, + profile: { + id: profileRecord.id, + firstName: profile.firstName, + lastName: profile.lastName, + profilePictureUrl, + }, + }, + }); - return true - } - })) -) + return true; + }, + signUp: async (agent: Agent, payload: CreatePayload) => { + const profile = await UserDetailsUtils.createUserDetailsRecord( + agent, + payload, + ); + if (!profile) return false; + + return true; + }, + }), + ), +); From 99dd61bd10b3ad6a62d10b80e6ec0bf62f343a0c Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Mon, 8 Jan 2024 00:29:20 +0100 Subject: [PATCH 107/136] resolved errors --- tauri-app/src/pages/Home/SignUpForm.tsx | 11 +- tauri-app/src/pages/Home/index.tsx | 376 ++++++++++++------------ tauri-app/src/stores/profile.ts | 180 ++++++------ 3 files changed, 281 insertions(+), 286 deletions(-) diff --git a/tauri-app/src/pages/Home/SignUpForm.tsx b/tauri-app/src/pages/Home/SignUpForm.tsx index 6b3a019..dd58adb 100644 --- a/tauri-app/src/pages/Home/SignUpForm.tsx +++ b/tauri-app/src/pages/Home/SignUpForm.tsx @@ -43,15 +43,12 @@ const FileUploader: FunctionComponent<{ }; export default function SignUpForm() { -<<<<<<< HEAD console.log("kfjle"); const { web5, did } = useWeb5Store((state) => ({ web5: state.web5!, did: state.did!, })); -======= - const { web5, did } = useWeb5Store((state) => ({ web5: state.web5!, did: state.did! })); ->>>>>>> 402d66ccee7417a3b8bf1521291c3d95ef82ec69 + const submitBtnRef = useRef(null); const { setShowAuthModal, signUp, signIn } = useProfile((state) => ({ signUp: state.signUp, @@ -79,8 +76,8 @@ export default function SignUpForm() { } }); - const createProfile = async (agent: Agent, payload: SignUpPayload) => { - const hasSignedUpSuccessfully = await signUp(agent, payload) + const createProfile = async (agent: Agent, payload: SignUpPayload) => { + const hasSignedUpSuccessfully = await signUp(agent, payload); if (!hasSignedUpSuccessfully) { toast.error("Sorry an error occurred!"); @@ -93,8 +90,6 @@ export default function SignUpForm() { setShowAuthModal(false); }; - setShowAuthModal(false) - } const onSubmit = (value: z.infer) => { if (web5 && did) createProfile({ web5, did }, value); diff --git a/tauri-app/src/pages/Home/index.tsx b/tauri-app/src/pages/Home/index.tsx index aa0fc24..5e65db7 100644 --- a/tauri-app/src/pages/Home/index.tsx +++ b/tauri-app/src/pages/Home/index.tsx @@ -7,219 +7,219 @@ export default function HomePage() { const showAuthModal = useProfile((state) => state.showAuthModal); return ( - <> -
    -
    -
    - - Hi welcome to, - - pulsePal - +
    +
    +
    + + Hi welcome to, + + pulsePal -

    Stay up & running while connected

    +
    +

    Stay up & running while connected

    +

    + Welcome to PulsePal, your health guardian in WEB5. Safely store + medical records with decentralized identifiers and web nodes, + ensuring data security. Connect with similar conditions, share home + remedies with a rating system, and access specialized doctors based + on your location. PulsePal – where advanced technology meets + user-friendly design for your secure, connected health journey. +

    + +
    +
    +
    + + + +
    +

    Major Technologies

    +
    +
    + +

    WEB5

    - Welcome to PulsePal, your health guardian in WEB5. Safely store - medical records with decentralized identifiers and web nodes, - ensuring data security. Connect with similar conditions, share - home remedies with a rating system, and access specialized doctors - based on your location. PulsePal – where advanced technology meets - user-friendly design for your secure, connected health journey. + PulsePal utililizes WEB5 to ensure the immutability of user data + stored making it a breeze to safely store medical data and + records.

    -
    -
    -
    - - - -
    -

    Major Technologies

    -
    -
    - -

    WEB5

    -

    - PulsePal utililizes WEB5 to ensure the immutability of user data - stored making it a breeze to safely store medical data and - records. -

    -
    -
    - -

    A.I

    -

    - PulsePal uses artificial intelligence to aid users with similiar - medical conditions, find matches who can relate with them and - also find doctors/specialist within there regions on such - condition. -

    -
    -
    - -

    React

    -

    - PulsePal employes react a frontend framework to power our - frontend along with typescript enabling better user experience - and smoother and faster development,updates and feature roll - outs giving quality product delivery. -

    -
    +
    + +

    A.I

    +

    + PulsePal uses artificial intelligence to aid users with similiar + medical conditions, find matches who can relate with them and also + find doctors/specialist within there regions on such condition. +

    -
    - - - -
    -
    -
    -

    - "Our Culture" -

    +
    + +

    React

    - A culture where innovation and empathy converge to create - impactful solutions. Team members are driven by a shared - commitment to improving healthcare outcomes through cutting-edge - technology. + PulsePal employes react a frontend framework to power our frontend + along with typescript enabling better user experience and smoother + and faster development,updates and feature roll outs giving + quality product delivery.

    - - - -
    -

    Testimonials

    -
    -
    -
    -
    - -

    Dave

    -
    -
    -

    - PulsePal has being awesome so far making it a breeze - to keep track of my medical history coupled with guidance - have made staying healthy so much more accessible. The - user-friendly interface and helpful home remedies{" "} - keep me on prepared for emergency breakouts.{" "} - Thank you -

    -
    +
    + + + +
    +
    +
    +

    + "Our Culture" +

    +

    + A culture where innovation and empathy converge to create impactful + solutions. Team members are driven by a shared commitment to + improving healthcare outcomes through cutting-edge technology. +

    +
    +
    + + + +
    +

    Testimonials

    +
    +
    +
    +
    + +

    Dave

    -
    -
    - -

    Greg

    -
    -
    -

    - Knowing that blockchain is being used and it's - immutaility makes feel safer from losing such vital records - and there - chat functionality is quite great feel's nice to know - others with the same condition as me.Great job -

    -
    +
    +

    + PulsePal has being awesome so far making it a breeze to + keep track of my medical history coupled with guidance have + made staying healthy so much more accessible. The + user-friendly interface and helpful home remedies keep + me on prepared for emergency breakouts. Thank you +

    -
    +
    - -

    Nikki

    + +

    Greg

    - Using it for quite a while now and it had being nice - especially a beta feature,i heard it can find out what - is wrong with your just from your - finger print it is cool can't wait for the roll - out,talk about a.i in action + Knowing that blockchain is being used and it's + immutaility makes feel safer from losing such vital records + and there + chat functionality is quite great feel's nice to know + others with the same condition as me.Great job

    -
    - - - -
    -

    Major Features

    -
    -
    - -

    Secure Storage

    -

    - Medical records are stored with the utmost security using WEB5, - guaranteeing data integrity and user control over their personal - health information. -

    -
    -
    - -

    Find Your Tribe

    -

    - Our platform goes beyond conventional networking by employing a - sophisticated algorithm to match users based on their medical - records. PulsePal becomes a virtual community where individuals - can share experiences, insights, and support each other on their - health journeys. -

    -
    -
    - -

    Home Remedies

    -

    - PulsePal empowers users to contribute and share simple yet - effective home remedies. A user-driven rating system ensures the - most beneficial remedies rise to the top, creating a - community-driven repository of wellness solutions. -

    +
    +
    + +

    Nikki

    -
    - -

    Find Specialist

    +

    - Wherever you are, PulsePal provides a seamless experience by - recommending specialized doctors in your nearby areas based on - your current location, enhancing accessibility to healthcare - professionals. + Using it for quite a while now and it had being nice especially + a beta feature,i heard it can find out what is wrong with + your just from your + finger print it is cool can't wait for the roll out,talk + about a.i in action

    - {showAuthModal && } - +
    + + + +
    +

    Major Features

    +
    +
    + +

    Secure Storage

    +

    + Medical records are stored with the utmost security using WEB5, + guaranteeing data integrity and user control over their personal + health information. +

    +
    +
    + +

    Find Your Tribe

    +

    + Our platform goes beyond conventional networking by employing a + sophisticated algorithm to match users based on their medical + records. PulsePal becomes a virtual community where individuals + can share experiences, insights, and support each other on their + health journeys. +

    +
    +
    + +

    Home Remedies

    +

    + PulsePal empowers users to contribute and share simple yet + effective home remedies. A user-driven rating system ensures the + most beneficial remedies rise to the top, creating a + community-driven repository of wellness solutions. +

    +
    +
    + +

    Find Specialist

    +

    + Wherever you are, PulsePal provides a seamless experience by + recommending specialized doctors in your nearby areas based on + your current location, enhancing accessibility to healthcare + professionals. +

    +
    +
    +
    + {showAuthModal && ( + + + + )} +
    ); } diff --git a/tauri-app/src/stores/profile.ts b/tauri-app/src/stores/profile.ts index 551144c..069f337 100644 --- a/tauri-app/src/stores/profile.ts +++ b/tauri-app/src/stores/profile.ts @@ -4,9 +4,8 @@ import { Record as UserDetailsProtocolRecord } from "@/utils/protocols/user"; import { Agent } from "@/components/Auth/types"; import UserDetailsUtils, { CreatePayload } from "@/utils/user"; import BlobUtils from "@/utils/blob"; -import { Record as Web5Record } from "@web5/api/browser" +import { Record as Web5Record } from "@web5/api/browser"; -<<<<<<< HEAD export type ProfileState = { id: string; // username: string @@ -32,24 +31,28 @@ type Payload = Omit< profilePicture: File; }; -export type SignUpPayload = Omit +export type SignUpPayload = Omit; -export type ProfileState = Omit & -{ - id: string +export type ProfileState = Omit< + UserDetailsProtocolRecord.Details, + "profilePictureId" +> & { + id: string; // username: string - profilePictureUrl: string -} - -type State = { - profile: ProfileState, - isSignedIn: true - record: Web5Record -} | { - profile: null, - record: null, - isSignedIn: false -} + profilePictureUrl: string; +}; + +type State = + | { + profile: ProfileState; + isSignedIn: true; + record: Web5Record; + } + | { + profile: null; + record: null; + isSignedIn: false; + }; export const useProfile = create( combine( @@ -94,7 +97,6 @@ export const useProfile = create( set({ state: { -<<<<<<< HEAD isSignedIn: true, profile: { id: profileRecord.id, @@ -104,18 +106,11 @@ export const useProfile = create( }, }, }); -======= - isSignedIn: false, - record: null, - profile: null - } - }) - } - }, - signIn: async (agent: Agent) => { - const profileRecord = await UserDetailsUtils.fetchUserDetailsRecord(agent) - if (!profileRecord) return false ->>>>>>> 402d66ccee7417a3b8bf1521291c3d95ef82ec69 + }, + signIn: async (agent: Agent) => { + const profileRecord = + await UserDetailsUtils.fetchUserDetailsRecord(agent); + if (!profileRecord) return false; return true; }, @@ -126,67 +121,72 @@ export const useProfile = create( ); if (!profile) return false; -<<<<<<< HEAD return true; - }, - }), - ), -); -======= - const profilePicture = await BlobUtils.fetchBlobRecord(agent, { recordId: profile.profilePictureId }) - let profilePictureUrl = "" - if (profilePicture) { - const profilePictureBlob = await profilePicture.data.blob() - profilePictureUrl = URL.createObjectURL(profilePictureBlob) - } - - set({ - state: { - isSignedIn: true, - record: profileRecord, - profile: { - ...profile, - id: profileRecord.id, - profilePictureUrl - } - } - }) - return true - }, - addCondition: async (agent: Agent, condition: string) => { - const state = get().state - if (!state.isSignedIn) return false - - const { profilePictureUrl, ...payload } = state.profile - if (payload.conditions.indexOf(condition) < -1) return - - payload.conditions.push(condition) - - const updatedRecord = await UserDetailsUtils.updateUserDetailsRecord(agent, state.record, payload) - if (!updatedRecord) return false - const profile = await updatedRecord.data.json() - - set({ - state: { - isSignedIn: true, - record: updatedRecord, - profile: { - ...profile, - id: updatedRecord.id, - profilePictureUrl - } + const profilePicture = await BlobUtils.fetchBlobRecord(agent, { + recordId: profile.profilePictureId, + }); + let profilePictureUrl = ""; + if (profilePicture) { + const profilePictureBlob = await profilePicture.data.blob(); + profilePictureUrl = URL.createObjectURL(profilePictureBlob); } - }) - return updatedRecord - }, - signUp: async (agent: Agent, payload: SignUpPayload) => { - const profile = await UserDetailsUtils.createUserDetailsRecord(agent, { ...payload, conditions: [], did: agent.did }) - if (!profile) return false + set({ + state: { + isSignedIn: true, + record: profileRecord, + profile: { + ...profile, + id: profileRecord.id, + profilePictureUrl, + }, + }, + }); - return profile - } - })) -) ->>>>>>> 402d66ccee7417a3b8bf1521291c3d95ef82ec69 + return true; + }, + addCondition: async (agent: Agent, condition: string) => { + const state = get().state; + if (!state.isSignedIn) return false; + + const { profilePictureUrl, ...payload } = state.profile; + if (payload.conditions.indexOf(condition) < -1) return; + + payload.conditions.push(condition); + + const updatedRecord = await UserDetailsUtils.updateUserDetailsRecord( + agent, + state.record, + payload, + ); + if (!updatedRecord) return false; + const profile = await updatedRecord.data.json(); + + set({ + state: { + isSignedIn: true, + record: updatedRecord, + profile: { + ...profile, + id: updatedRecord.id, + profilePictureUrl, + }, + }, + }); + + return updatedRecord; + }, + signUp: async (agent: Agent, payload: SignUpPayload) => { + const profile = await UserDetailsUtils.createUserDetailsRecord(agent, { + ...payload, + conditions: [], + did: agent.did, + }); + if (!profile) return false; + + return profile; + }, + }), + ), +); From 8beb0b5fe663506ce7d2a9ac82cb09f388b32d3e Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Mon, 8 Jan 2024 01:18:13 +0100 Subject: [PATCH 108/136] minor bugs fixed --- tauri-app/src/App.tsx | 5 ----- tauri-app/src/components/Chat/index.css | 4 ++-- tauri-app/src/components/Navbar/index.tsx | 4 ++-- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index e924f54..ced8e50 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -9,7 +9,6 @@ import SharedLayout from "./pages/SharedLayout/"; import Records from "./pages/Records"; import Chat from "./pages/Chat/"; import { Toaster } from "react-hot-toast"; -import ProfileGuard from "./components/Auth/Profile/Guard"; const router = createHashRouter([ { @@ -20,17 +19,13 @@ const router = createHashRouter([ { path: "/records", element: ( - }> - ), }, { path: "/connect", element: }, { path: "/remedies", element: ( - }> - ) }, { path: "/contact", element: }, diff --git a/tauri-app/src/components/Chat/index.css b/tauri-app/src/components/Chat/index.css index 4ecba23..dd76343 100644 --- a/tauri-app/src/components/Chat/index.css +++ b/tauri-app/src/components/Chat/index.css @@ -80,7 +80,7 @@ padding: 4px 10px; border-radius: 8px 8px 8px 0px; margin-right: auto; - max-width: 400px; + max-width: 600px; } .msg-t { @@ -90,5 +90,5 @@ padding: 4px 10px; border-radius: 8px 8px 0px 8px; margin-left: auto; - max-width: 400px; + max-width: 600px; } diff --git a/tauri-app/src/components/Navbar/index.tsx b/tauri-app/src/components/Navbar/index.tsx index a6b8649..c0d7567 100644 --- a/tauri-app/src/components/Navbar/index.tsx +++ b/tauri-app/src/components/Navbar/index.tsx @@ -72,7 +72,7 @@ const index = () => { + + +
    From 087f38d6bcba4c770739ad3c7f881329adcd81e4 Mon Sep 17 00:00:00 2001 From: koko_codes <58889001+EnebeliEmmanuel@users.noreply.github.com> Date: Mon, 8 Jan 2024 01:35:18 +0100 Subject: [PATCH 111/136] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c0625bb..0d7151e 100644 --- a/README.md +++ b/README.md @@ -116,6 +116,7 @@ npm run dev ## Explainer video (User POV) +https://github.com/coder12git/Web5-Hack/assets/58889001/b5c4aa11-426c-492b-88fb-37425991ab47 ## Demo Video (Clients POV) From cb67de2089f3b58efc21dc911a19651a99c91346 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Mon, 8 Jan 2024 00:29:20 +0100 Subject: [PATCH 112/136] resolved errors --- tauri-app/src/pages/Home/SignUpForm.tsx | 11 +- tauri-app/src/pages/Home/index.tsx | 376 ++++++++++++------------ 2 files changed, 191 insertions(+), 196 deletions(-) diff --git a/tauri-app/src/pages/Home/SignUpForm.tsx b/tauri-app/src/pages/Home/SignUpForm.tsx index 6b3a019..dd58adb 100644 --- a/tauri-app/src/pages/Home/SignUpForm.tsx +++ b/tauri-app/src/pages/Home/SignUpForm.tsx @@ -43,15 +43,12 @@ const FileUploader: FunctionComponent<{ }; export default function SignUpForm() { -<<<<<<< HEAD console.log("kfjle"); const { web5, did } = useWeb5Store((state) => ({ web5: state.web5!, did: state.did!, })); -======= - const { web5, did } = useWeb5Store((state) => ({ web5: state.web5!, did: state.did! })); ->>>>>>> 402d66ccee7417a3b8bf1521291c3d95ef82ec69 + const submitBtnRef = useRef(null); const { setShowAuthModal, signUp, signIn } = useProfile((state) => ({ signUp: state.signUp, @@ -79,8 +76,8 @@ export default function SignUpForm() { } }); - const createProfile = async (agent: Agent, payload: SignUpPayload) => { - const hasSignedUpSuccessfully = await signUp(agent, payload) + const createProfile = async (agent: Agent, payload: SignUpPayload) => { + const hasSignedUpSuccessfully = await signUp(agent, payload); if (!hasSignedUpSuccessfully) { toast.error("Sorry an error occurred!"); @@ -93,8 +90,6 @@ export default function SignUpForm() { setShowAuthModal(false); }; - setShowAuthModal(false) - } const onSubmit = (value: z.infer) => { if (web5 && did) createProfile({ web5, did }, value); diff --git a/tauri-app/src/pages/Home/index.tsx b/tauri-app/src/pages/Home/index.tsx index aa0fc24..5e65db7 100644 --- a/tauri-app/src/pages/Home/index.tsx +++ b/tauri-app/src/pages/Home/index.tsx @@ -7,219 +7,219 @@ export default function HomePage() { const showAuthModal = useProfile((state) => state.showAuthModal); return ( - <> -
    -
    -
    - - Hi welcome to, - - pulsePal - +
    +
    +
    + + Hi welcome to, + + pulsePal -

    Stay up & running while connected

    +
    +

    Stay up & running while connected

    +

    + Welcome to PulsePal, your health guardian in WEB5. Safely store + medical records with decentralized identifiers and web nodes, + ensuring data security. Connect with similar conditions, share home + remedies with a rating system, and access specialized doctors based + on your location. PulsePal – where advanced technology meets + user-friendly design for your secure, connected health journey. +

    + +
    +
    +
    + + + +
    +

    Major Technologies

    +
    +
    + +

    WEB5

    - Welcome to PulsePal, your health guardian in WEB5. Safely store - medical records with decentralized identifiers and web nodes, - ensuring data security. Connect with similar conditions, share - home remedies with a rating system, and access specialized doctors - based on your location. PulsePal – where advanced technology meets - user-friendly design for your secure, connected health journey. + PulsePal utililizes WEB5 to ensure the immutability of user data + stored making it a breeze to safely store medical data and + records.

    -
    -
    -
    - - - -
    -

    Major Technologies

    -
    -
    - -

    WEB5

    -

    - PulsePal utililizes WEB5 to ensure the immutability of user data - stored making it a breeze to safely store medical data and - records. -

    -
    -
    - -

    A.I

    -

    - PulsePal uses artificial intelligence to aid users with similiar - medical conditions, find matches who can relate with them and - also find doctors/specialist within there regions on such - condition. -

    -
    -
    - -

    React

    -

    - PulsePal employes react a frontend framework to power our - frontend along with typescript enabling better user experience - and smoother and faster development,updates and feature roll - outs giving quality product delivery. -

    -
    +
    + +

    A.I

    +

    + PulsePal uses artificial intelligence to aid users with similiar + medical conditions, find matches who can relate with them and also + find doctors/specialist within there regions on such condition. +

    -
    - - - -
    -
    -
    -

    - "Our Culture" -

    +
    + +

    React

    - A culture where innovation and empathy converge to create - impactful solutions. Team members are driven by a shared - commitment to improving healthcare outcomes through cutting-edge - technology. + PulsePal employes react a frontend framework to power our frontend + along with typescript enabling better user experience and smoother + and faster development,updates and feature roll outs giving + quality product delivery.

    - - - -
    -

    Testimonials

    -
    -
    -
    -
    - -

    Dave

    -
    -
    -

    - PulsePal has being awesome so far making it a breeze - to keep track of my medical history coupled with guidance - have made staying healthy so much more accessible. The - user-friendly interface and helpful home remedies{" "} - keep me on prepared for emergency breakouts.{" "} - Thank you -

    -
    +
    + + + +
    +
    +
    +

    + "Our Culture" +

    +

    + A culture where innovation and empathy converge to create impactful + solutions. Team members are driven by a shared commitment to + improving healthcare outcomes through cutting-edge technology. +

    +
    +
    + + + +
    +

    Testimonials

    +
    +
    +
    +
    + +

    Dave

    -
    -
    - -

    Greg

    -
    -
    -

    - Knowing that blockchain is being used and it's - immutaility makes feel safer from losing such vital records - and there - chat functionality is quite great feel's nice to know - others with the same condition as me.Great job -

    -
    +
    +

    + PulsePal has being awesome so far making it a breeze to + keep track of my medical history coupled with guidance have + made staying healthy so much more accessible. The + user-friendly interface and helpful home remedies keep + me on prepared for emergency breakouts. Thank you +

    -
    +
    - -

    Nikki

    + +

    Greg

    - Using it for quite a while now and it had being nice - especially a beta feature,i heard it can find out what - is wrong with your just from your - finger print it is cool can't wait for the roll - out,talk about a.i in action + Knowing that blockchain is being used and it's + immutaility makes feel safer from losing such vital records + and there + chat functionality is quite great feel's nice to know + others with the same condition as me.Great job

    -
    - - - -
    -

    Major Features

    -
    -
    - -

    Secure Storage

    -

    - Medical records are stored with the utmost security using WEB5, - guaranteeing data integrity and user control over their personal - health information. -

    -
    -
    - -

    Find Your Tribe

    -

    - Our platform goes beyond conventional networking by employing a - sophisticated algorithm to match users based on their medical - records. PulsePal becomes a virtual community where individuals - can share experiences, insights, and support each other on their - health journeys. -

    -
    -
    - -

    Home Remedies

    -

    - PulsePal empowers users to contribute and share simple yet - effective home remedies. A user-driven rating system ensures the - most beneficial remedies rise to the top, creating a - community-driven repository of wellness solutions. -

    +
    +
    + +

    Nikki

    -
    - -

    Find Specialist

    +

    - Wherever you are, PulsePal provides a seamless experience by - recommending specialized doctors in your nearby areas based on - your current location, enhancing accessibility to healthcare - professionals. + Using it for quite a while now and it had being nice especially + a beta feature,i heard it can find out what is wrong with + your just from your + finger print it is cool can't wait for the roll out,talk + about a.i in action

    - {showAuthModal && } - +
    + + + +
    +

    Major Features

    +
    +
    + +

    Secure Storage

    +

    + Medical records are stored with the utmost security using WEB5, + guaranteeing data integrity and user control over their personal + health information. +

    +
    +
    + +

    Find Your Tribe

    +

    + Our platform goes beyond conventional networking by employing a + sophisticated algorithm to match users based on their medical + records. PulsePal becomes a virtual community where individuals + can share experiences, insights, and support each other on their + health journeys. +

    +
    +
    + +

    Home Remedies

    +

    + PulsePal empowers users to contribute and share simple yet + effective home remedies. A user-driven rating system ensures the + most beneficial remedies rise to the top, creating a + community-driven repository of wellness solutions. +

    +
    +
    + +

    Find Specialist

    +

    + Wherever you are, PulsePal provides a seamless experience by + recommending specialized doctors in your nearby areas based on + your current location, enhancing accessibility to healthcare + professionals. +

    +
    +
    +
    + {showAuthModal && ( + + + + )} +
    ); } From 0421ca8b95136e6e794e9b9f2e94681553dbb377 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Mon, 8 Jan 2024 01:18:13 +0100 Subject: [PATCH 113/136] minor bugs fixed --- tauri-app/src/App.tsx | 5 ----- tauri-app/src/components/Chat/index.css | 4 ++-- tauri-app/src/components/Navbar/index.tsx | 4 ++-- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index e924f54..ced8e50 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -9,7 +9,6 @@ import SharedLayout from "./pages/SharedLayout/"; import Records from "./pages/Records"; import Chat from "./pages/Chat/"; import { Toaster } from "react-hot-toast"; -import ProfileGuard from "./components/Auth/Profile/Guard"; const router = createHashRouter([ { @@ -20,17 +19,13 @@ const router = createHashRouter([ { path: "/records", element: ( - }> - ), }, { path: "/connect", element: }, { path: "/remedies", element: ( - }> - ) }, { path: "/contact", element: }, diff --git a/tauri-app/src/components/Chat/index.css b/tauri-app/src/components/Chat/index.css index 4ecba23..dd76343 100644 --- a/tauri-app/src/components/Chat/index.css +++ b/tauri-app/src/components/Chat/index.css @@ -80,7 +80,7 @@ padding: 4px 10px; border-radius: 8px 8px 8px 0px; margin-right: auto; - max-width: 400px; + max-width: 600px; } .msg-t { @@ -90,5 +90,5 @@ padding: 4px 10px; border-radius: 8px 8px 0px 8px; margin-left: auto; - max-width: 400px; + max-width: 600px; } diff --git a/tauri-app/src/components/Navbar/index.tsx b/tauri-app/src/components/Navbar/index.tsx index a6b8649..c0d7567 100644 --- a/tauri-app/src/components/Navbar/index.tsx +++ b/tauri-app/src/components/Navbar/index.tsx @@ -72,7 +72,7 @@ const index = () => { +
    + )} + + + + ) +} + const index = () => { const { web5, did } = useWeb5Store((state) => ({ web5: state.web5, @@ -25,44 +62,43 @@ const index = () => { } }; - const [showSignOutUtils, setShowSignOutUtils] = useState(false); return (
    - - + +
    - +

    Home

    - +

    Records

    28
    - +

    Chats

    5
    - +

    DIY Remedies

    99+
    - +

    Contact

    @@ -72,34 +108,14 @@ const index = () => { } > - {showSignOutUtils && ( -
    -
    - DID: - -
    - -
    - )} - - +
    ); diff --git a/tauri-app/src/stores/profile.ts b/tauri-app/src/stores/profile.ts index 069f337..9740536 100644 --- a/tauri-app/src/stores/profile.ts +++ b/tauri-app/src/stores/profile.ts @@ -1,192 +1,111 @@ -import { create } from "zustand"; +import { create } from "zustand" import { combine } from "zustand/middleware"; import { Record as UserDetailsProtocolRecord } from "@/utils/protocols/user"; import { Agent } from "@/components/Auth/types"; import UserDetailsUtils, { CreatePayload } from "@/utils/user"; import BlobUtils from "@/utils/blob"; -import { Record as Web5Record } from "@web5/api/browser"; +import { Record as Web5Record } from "@web5/api/browser" -export type ProfileState = { - id: string; - // username: string - firstName: string; - lastName: string; - profilePictureUrl: string; -}; - -type State = - | { - profile: ProfileState; - isSignedIn: true; - } - | { - profile: null; - isSignedIn: false; - }; - -type Payload = Omit< - UserDetailsProtocolRecord.Details, - "dateCreated" | "profilePictureUrl" -> & { - profilePicture: File; -}; +export type SignUpPayload = Omit -export type SignUpPayload = Omit; - -export type ProfileState = Omit< - UserDetailsProtocolRecord.Details, - "profilePictureId" -> & { - id: string; +export type ProfileState = Omit & +{ + id: string // username: string - profilePictureUrl: string; -}; - -type State = - | { - profile: ProfileState; - isSignedIn: true; - record: Web5Record; - } - | { - profile: null; - record: null; - isSignedIn: false; - }; + profilePictureUrl: string +} + +type State = { + profile: ProfileState, + isSignedIn: true + record: Web5Record +} | { + profile: null, + record: null, + isSignedIn: false +} export const useProfile = create( - combine( - { - state: { - profile: null, - isSignedIn: false, - } as State, - showAuthModal: false, + combine({ + state: { + profile: null, + isSignedIn: false + } as State, + showAuthModal: false + }, (set, get) => ({ + setShowAuthModal: (showAuthModal: boolean) => { + set({ showAuthModal }) }, - (set, get) => ({ - setShowAuthModal: (showAuthModal: boolean) => { - set({ showAuthModal }); - }, - signOut: () => { - if (get().state.isSignedIn) { - set({ - state: { - isSignedIn: false, - profile: null, - }, - }); - } - }, - signIn: async (agent: Agent) => { - const profileRecord = - await UserDetailsUtils.fetchUserDetailsRecord(agent); - if (!profileRecord) return false; - - const profile: UserDetailsProtocolRecord.Details = - await profileRecord.data.json(); - - const profilePicture = await DocumentUtils.fetchBlobRecord( - agent, - profile.profilePictureId, - ); - let profilePictureUrl = ""; - if (profilePicture) { - const profilePictureBlob = await profilePicture.data.blob(); - profilePictureUrl = URL.createObjectURL(profilePictureBlob); - } - + signOut: () => { + if (get().state.isSignedIn) { set({ state: { - isSignedIn: true, - profile: { - id: profileRecord.id, - firstName: profile.firstName, - lastName: profile.lastName, - profilePictureUrl, - }, - }, - }); - }, - signIn: async (agent: Agent) => { - const profileRecord = - await UserDetailsUtils.fetchUserDetailsRecord(agent); - if (!profileRecord) return false; - - return true; - }, - signUp: async (agent: Agent, payload: CreatePayload) => { - const profile = await UserDetailsUtils.createUserDetailsRecord( - agent, - payload, - ); - if (!profile) return false; - - return true; - - const profilePicture = await BlobUtils.fetchBlobRecord(agent, { - recordId: profile.profilePictureId, - }); - let profilePictureUrl = ""; - if (profilePicture) { - const profilePictureBlob = await profilePicture.data.blob(); - profilePictureUrl = URL.createObjectURL(profilePictureBlob); + isSignedIn: false, + record: null, + profile: null + } + }) + } + }, + signIn: async (agent: Agent) => { + const profileRecord = await UserDetailsUtils.fetchUserDetailsRecord(agent) + if (!profileRecord) return false + + const profile: UserDetailsProtocolRecord.Details = await profileRecord.data.json() + + const profilePicture = await BlobUtils.fetchBlobRecord(agent, { recordId: profile.profilePictureId }) + let profilePictureUrl = "" + if (profilePicture) { + const profilePictureBlob = await profilePicture.data.blob() + profilePictureUrl = URL.createObjectURL(profilePictureBlob) + } + + set({ + state: { + isSignedIn: true, + record: profileRecord, + profile: { + ...profile, + id: profileRecord.id, + profilePictureUrl + } } + }) - set({ - state: { - isSignedIn: true, - record: profileRecord, - profile: { - ...profile, - id: profileRecord.id, - profilePictureUrl, - }, - }, - }); - - return true; - }, - addCondition: async (agent: Agent, condition: string) => { - const state = get().state; - if (!state.isSignedIn) return false; - - const { profilePictureUrl, ...payload } = state.profile; - if (payload.conditions.indexOf(condition) < -1) return; - - payload.conditions.push(condition); - - const updatedRecord = await UserDetailsUtils.updateUserDetailsRecord( - agent, - state.record, - payload, - ); - if (!updatedRecord) return false; - const profile = await updatedRecord.data.json(); - - set({ - state: { - isSignedIn: true, - record: updatedRecord, - profile: { - ...profile, - id: updatedRecord.id, - profilePictureUrl, - }, - }, - }); + return true + }, + addCondition: async (agent: Agent, condition: string) => { + const state = get().state + if (!state.isSignedIn) return false + + const { profilePictureUrl, ...payload } = state.profile + if (payload.conditions.indexOf(condition) < -1) return + + payload.conditions.push(condition) + + const updatedRecord = await UserDetailsUtils.updateUserDetailsRecord(agent, state.record, payload) + if (!updatedRecord) return false + const profile = await updatedRecord.data.json() + + set({ + state: { + isSignedIn: true, + record: updatedRecord, + profile: { + ...profile, + id: updatedRecord.id, + profilePictureUrl + } + } + }) - return updatedRecord; - }, - signUp: async (agent: Agent, payload: SignUpPayload) => { - const profile = await UserDetailsUtils.createUserDetailsRecord(agent, { - ...payload, - conditions: [], - did: agent.did, - }); - if (!profile) return false; + return updatedRecord + }, + signUp: async (agent: Agent, payload: SignUpPayload) => { + const profile = await UserDetailsUtils.createUserDetailsRecord(agent, { ...payload, conditions: [], did: agent.did }) + if (!profile) return false - return profile; - }, - }), - ), -); + return profile + } + })) +) From 421449b24ccbd3a4feffa8481cd43dcaff3d8327 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Mon, 8 Jan 2024 02:08:04 +0000 Subject: [PATCH 116/136] added code to sync profile updates with remote dwn --- tauri-app/src/pages/connect.tsx | 1 - tauri-app/src/utils/user.ts | 5 +++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/tauri-app/src/pages/connect.tsx b/tauri-app/src/pages/connect.tsx index 5bd976a..d3dcc6b 100644 --- a/tauri-app/src/pages/connect.tsx +++ b/tauri-app/src/pages/connect.tsx @@ -12,7 +12,6 @@ const fetchProfilesWithCondition = async (agent: Agent, condition: string) => { const matchingProfiles = [] for (const record of profileRecords) { const profile: UserDetailsProtocolRecord.Details = await record.data.json() - console.log(profile) if (profile.conditions.indexOf(condition) > -1 && profile.did !== agent.did) { matchingProfiles.push(profile) diff --git a/tauri-app/src/utils/user.ts b/tauri-app/src/utils/user.ts index 73b8238..4c0c46c 100644 --- a/tauri-app/src/utils/user.ts +++ b/tauri-app/src/utils/user.ts @@ -172,6 +172,11 @@ async function updateUserDetailsRecord(agent: Agent, idOrRecord: string | Web5Re return false } + const { status: protocolDwnSyncStatus } = await record.send(UserDetailsProtocolDID) + if (protocolDwnSyncStatus.code !== 202) { + console.log("Failed to sync document record update with protocol remote DWN:", protocolDwnSyncStatus) + } + return record } From 5c3204db28d5f8d7613c9bf4a453df0a356d27f9 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Mon, 8 Jan 2024 02:08:24 +0000 Subject: [PATCH 117/136] updated gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index a873b84..b5fa95f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ pnpm-lock.yaml *.tsbuildinfo -utils/ +server/ From 0c4eef1c047b81f9d98f597153ff7abe26abb982 Mon Sep 17 00:00:00 2001 From: coder12git Date: Mon, 8 Jan 2024 09:53:27 +0530 Subject: [PATCH 118/136] add chat feature Signed-off-by: coder12git --- tauri-app/src/App.tsx | 2 + tauri-app/src/pages/chat.tsx | 485 ++++++++++++++++------------------- 2 files changed, 220 insertions(+), 267 deletions(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index ced8e50..14be1c1 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -9,6 +9,7 @@ import SharedLayout from "./pages/SharedLayout/"; import Records from "./pages/Records"; import Chat from "./pages/Chat/"; import { Toaster } from "react-hot-toast"; +import ChatConnect from "./pages/chat"; const router = createHashRouter([ { @@ -30,6 +31,7 @@ const router = createHashRouter([ }, { path: "/contact", element: }, { path: "/chat", element: }, + { path: "/chatConnect", element: }, ], }, ]); diff --git a/tauri-app/src/pages/chat.tsx b/tauri-app/src/pages/chat.tsx index 7ac018d..f886fe0 100644 --- a/tauri-app/src/pages/chat.tsx +++ b/tauri-app/src/pages/chat.tsx @@ -1,282 +1,233 @@ -import { Web5 } from "@web5/api"; -import { useState, useEffect } from "react"; - -export default function Home() { - - const [web5, setWeb5] = useState(null); - const [myDid, setMyDid] = useState(null); - const [activeRecipient, setActiveRecipient] = useState(null); - - const [noteValue, setNoteValue] = useState(""); - const [errorMessage, setErrorMessage] = useState(''); - const [recipientDid, setRecipientDid] = useState(""); - - const [didCopied, setDidCopied] = useState(false); - const [showNewChatInput, setShowNewChatInput] = useState(false); - - const [allDings, setAllDings] = useState([]); - - const sortedDings = allDings.sort( - //@ts-ignore - (a, b) => new Date(a.timestampWritten) - new Date(b.timestampWritten) - ); - - const groupedDings = allDings.reduce((acc, ding) => { - //@ts-ignore - const recipient = ding.sender === myDid ? ding.recipient : ding.sender; - //@ts-ignore - if (!acc[recipient]) acc[recipient] = []; - //@ts-ignore - acc[recipient].push(ding); - return acc; - }, {}); - - useEffect(() => { - const initWeb5 = async () => { - const { web5, did } = await Web5.connect(); - //@ts-ignore - setWeb5(web5); +// Import necessary libraries and modules +import React, { useEffect } from 'react'; +import { Web5 } from "@web5/api/browser"; +import { dingerProtocolDefinition } from '@/stores/useWeb5Store'; + +// Define your dingerProtocolDefinition object + +const ChatConnect: React.FC = () => { + useEffect(() => { + const initDinger = async () => { + const copyDidElement = document.querySelector('#copy-did'); + const dingForm = document.querySelector('#ding-form'); + const dingErrorElement = document.querySelector('#ding-error'); + const dingProgressElement = document.querySelector('#ding-progress'); + const dingedList = document.querySelector('#dinged-list'); + const dingedByList = document.querySelector('#dinged-by-list'); + + const { web5, did: myDid } = await Web5.connect(); + await configureProtocol(web5); + + setInterval(async () => { + await renderDings(web5, myDid, dingedList, dingedByList); + }, 2000); + + //@ts-ignore + copyDidElement.addEventListener('click', async () => { + try { + await navigator.clipboard.writeText(myDid); + } catch (err) { //@ts-ignore - setMyDid(did); - - if (web5 && did) { - await configureProtocol(web5, did); - await fetchDings(web5, did); - } - }; - initWeb5(); - }, []); - - useEffect(() => { - if (!web5 || !myDid) return; - const intervalId = setInterval(async () => { - await fetchDings(web5, myDid); - }, 2000); - - return () => clearInterval(intervalId); - }, [web5, myDid]); - - const createProtocolDefinition = () => { - const dingerProtocolDefinition = { - protocol: "https://blackgirlbytes.dev/dinger-chat-protocol", - published: true, - types: { - ding: { - schema: "https://blackgirlbytes.dev/ding", - dataFormats: ["application/json"], - }, - }, - structure: { - ding: { - $actions: [ - { who: "anyone", can: "write" }, - { who: "author", of: "ding", can: "read" }, - { who: "recipient", of: "ding", can: "read" }, - ], - }, - }, - }; - return dingerProtocolDefinition; - }; - + alert('Failed to copy DID: ', err); + } + }); + + //@ts-ignore + dingForm.addEventListener('submit', async (event) => { + // ... (your existing form submission logic) + event.preventDefault(); + +//@ts-ignore + dingErrorElement.textContent = ''; + //@ts-ignore + dingProgressElement.textContent = ''; +//@ts-ignore + const did = document.querySelector('#did').value; + //@ts-ignore + const note = document.querySelector('#note').value; + + if (did.length === 0) { //@ts-ignore - const queryForProtocol = async (web5) => { - return await web5.dwn.protocols.query({ - message: { - filter: { - protocol: "https://blackgirlbytes.dev/dinger-chat-protocol", - }, - }, - }); - }; + dingErrorElement.textContent = 'DID required'; + return; + } + const ding = { dinger: myDid }; + if (note) { //@ts-ignore - const installProtocolLocally = async (web5, protocolDefinition) => { - return await web5.dwn.protocols.configure({ - message: { - definition: protocolDefinition, - }, - }); - }; + ding.note = note; + } +//@ts-ignore + dingProgressElement.textContent = 'writing ding to local DWN...'; + + try { + const { record, status } = await web5.dwn.records.write({ + data: ding, + message: { + protocol: dingerProtocolDefinition.protocol, + protocolPath: 'ding', + schema: 'ding', + recipient: did + } + }); + + if (status.code !== 202) { + //@ts-ignore + dingErrorElement.textContent = `${status.code} - ${status.detail}`; + return; + } + const shortenedDid = did.substr(0, 22); //@ts-ignore - const configureProtocol = async (web5, did) => { - const protocolDefinition = await createProtocolDefinition(); - - const { protocols: localProtocol, status: localProtocolStatus } = - await queryForProtocol(web5); - console.log({ localProtocol, localProtocolStatus }); - if (localProtocolStatus.code !== 200 || localProtocol.length === 0) { - - const { protocol, status } = await installProtocolLocally(web5, protocolDefinition); - console.log("Protocol installed locally", protocol, status); - - const { status: configureRemoteStatus } = await protocol.send(did); - console.log("Did the protocol install on the remote DWN?", configureRemoteStatus); - } else { - console.log("Protocol already installed"); - } - }; - - - const constructDing = () => { - const currentDate = new Date().toLocaleDateString(); - const currentTime = new Date().toLocaleTimeString(); - const ding = { - sender: myDid, - note: noteValue, - recipient: recipientDid, - timestampWritten: `${currentDate} ${currentTime}`, - }; - return ding; - }; + dingProgressElement.textContent = `Ding written locally! Dinging ${shortenedDid}...`; +//@ts-ignore + const { status: sendStatus } = await record.send(did); + console.log('send status', sendStatus); - //@ts-ignore - const writeToDwn = async (ding) => { + if (sendStatus.code !== 202) { //@ts-ignore - const { record } = await web5.dwn.records.write({ - data: ding, - message: { - protocol: "https://blackgirlbytes.dev/dinger-chat-protocol", - protocolPath: "ding", - schema: "https://blackgirlbytes.dev/ding", - recipient: recipientDid, - }, - }); - return record; - }; - + dingErrorElement.textContent = `${sendStatus.code} - ${sendStatus.detail}`; + return; + } +//@ts-ignore + dingProgressElement.textContent = `Dinged ${shortenedDid}!`; + } catch (e) { //@ts-ignore - const sendRecord = async (record) => { - return await record.send(recipientDid); + dingErrorElement.textContent = e.message; + return; + } + }); }; - //@ts-ignore - const handleSubmit = async (e) => { - e.preventDefault(); - - if (!noteValue.trim()) { - setErrorMessage('Please type a message before sending.'); - return; - } - - const ding = constructDing(); - const record = await writeToDwn(ding); - const { status } = await sendRecord(record); - - console.log("Send record status", status); - await fetchDings(web5, myDid); - setNoteValue(""); - }; - - const handleCopyDid = async () => { - if (myDid) { - try { - await navigator.clipboard.writeText(myDid); - setDidCopied(true); - console.log("DID copied to clipboard"); + initDinger(); + }, []); - setTimeout(() => { - setDidCopied(false); - }, 3000); - } catch (err) { - console.log("Failed to copy DID: " + err); - } + const configureProtocol = async (web5: any) => { + // ... (your existing configureProtocol function) + const { protocols, status } = await web5.dwn.protocols.query({ + message: { + filter: { + protocol: 'https://dinger.app/protocol' } - }; - - //@ts-ignore - const fetchSentMessages = async (web5, did) => { - const response = await web5.dwn.records.query({ - message: { - filter: { - protocol: "https://blackgirlbytes.dev/dinger-chat-protocol", - }, - }, - }); - - if (response.status.code === 200) { - const sentDings = await Promise.all( - //@ts-ignore - response.records.map(async (record) => { - const data = await record.data.json(); - return data; - }) - ); - console.log(sentDings, "I sent these dings"); - return sentDings; - } else { - console.log("error", response.status); + } + }); + + if (status.code !== 200) { + alert('Failed to query protocols. check console'); + console.error('Failed to query protocols', status); + + return; + } + + // protocol already exists + if (protocols.length > 0) { + console.log('protocol already exists'); + return; + } + + // create protocol + const { status: configureStatus } = await web5.dwn.protocols.configure({ + message: { + definition: dingerProtocolDefinition + } + }); + + console.log('configure protocol status', configureStatus); + }; + + const renderDings = async (web5: any, myDid: string, dingedList: any, dingedByList: any) => { + // ... (your existing renderDings function) + const { records, status } = await web5.dwn.records.query({ + message: { + filter: { + protocol: dingerProtocolDefinition.protocol } - }; - - //@ts-ignore - const fetchReceivedMessages = async (web5, did) => { - const response = await web5.dwn.records.query({ - from: did, - message: { - filter: { - protocol: "https://blackgirlbytes.dev/dinger-chat-protocol", - schema: "https://blackgirlbytes.dev/ding", - }, - }, + } + }); + + if (status.code !== 200) { + alert('Failed to query for dings. check console'); + console.error('Failed to query dings', status); + } + + for (let record of records) { + const recordExists = document.getElementById(record.id); + if (recordExists) { + continue; + } + + const { dinger, note } = await record.data.json(); + if (dinger === myDid) { + const shortenedDid = record.recipient.substr(0, 22); + const formattedDing = `[${new Date(record.dateCreated).toLocaleString()}] ${shortenedDid}... - ${note || ''}`; + + const dingElement = document.createElement('li'); + dingElement.id = record.id; + dingElement.textContent = formattedDing; + + const dingBackButton = document.createElement('button'); + dingBackButton.className = 'ding-back'; + dingBackButton.textContent = 'Ding agane'; + dingBackButton.dataset.toDing = record.recipient; + + dingBackButton.addEventListener('click', event => { + const didInput = document.querySelector('#did'); + //@ts-ignore + didInput.value = event.target.dataset.toDing; }); - - if (response.status.code === 200) { - const receivedDings = await Promise.all( - //@ts-ignore - response.records.map(async (record) => { - const data = await record.data.json(); - return data; - }) - ); - console.log(receivedDings, "I received these dings"); - return receivedDings; - } else { - console.log("error", response.status); - } - }; - - //@ts-ignore - const fetchDings = async (web5, did) => { - const sentMessages = await fetchSentMessages(web5, did); - const receivedMessages = await fetchReceivedMessages(web5, did); - const allMessages = [...(sentMessages || []), ...(receivedMessages || [])]; - //@ts-ignore - setAllDings(allMessages); - - }; - - const handleStartNewChat = () => { - setActiveRecipient(null); - setShowNewChatInput(true); - }; - - //@ts-ignore - const handleSetActiveRecipient = (recipient) => { - setRecipientDid(recipient); - setActiveRecipient(recipient); - setShowNewChatInput(false); - }; - - const handleConfirmNewChat = () => { - //@ts-ignore - setActiveRecipient(recipientDid); - //@ts-ignore - setActiveRecipient(recipientDid); - setShowNewChatInput(false); - //@ts-ignore - if (!groupedDings[recipientDid]) { - //@ts-ignore - groupedDings[recipientDid] = []; - } - }; - - return ( -
    -

    {myDid}

    - - -
    - ); -} \ No newline at end of file + + dingElement.appendChild(dingBackButton); + dingedList.appendChild(dingElement); + } else { + const shortenedDid = dinger.substr(0, 22); + const formattedDing = `[${new Date(record.dateCreated).toLocaleString()}] ${shortenedDid}... - ${note || ''}`; + + const dingElement = document.createElement('li'); + dingElement.id = record.id; + dingElement.textContent = formattedDing; + + const dingBackButton = document.createElement('button'); + dingBackButton.className = 'ding-back'; + dingBackButton.textContent = 'Ding Back'; + dingBackButton.dataset.toDing = dinger; + + dingBackButton.addEventListener('click', event => { + const didInput = document.querySelector('#did'); + //@ts-ignore + didInput.value = event.target.dataset.toDing; + }); + + dingElement.appendChild(dingBackButton); + dingedByList.appendChild(dingElement); + } + } + + }; + + return ( +
    + +
    +

    + +
    + +
    + + +
    + +

    You Dinged:

    +
      + {/* List items will be added here dynamically */} +
    + +

    You were Dinged by:

    +
      + {/* List items will be added here dynamically */} +
    +
    + ); +}; + +export default ChatConnect; From adf3eeca6884bcccd9f24cc91707d26be68007d6 Mon Sep 17 00:00:00 2001 From: coder12git Date: Mon, 8 Jan 2024 10:18:23 +0530 Subject: [PATCH 119/136] fixed err Signed-off-by: coder12git --- tauri-app/src/components/MobileChat/index.tsx | 2 +- tauri-app/src/pages/Chat/index.tsx | 9 +++- tauri-app/src/pages/chat.tsx | 41 +++++++++++++++++-- 3 files changed, 45 insertions(+), 7 deletions(-) diff --git a/tauri-app/src/components/MobileChat/index.tsx b/tauri-app/src/components/MobileChat/index.tsx index b462dc6..617b14e 100644 --- a/tauri-app/src/components/MobileChat/index.tsx +++ b/tauri-app/src/components/MobileChat/index.tsx @@ -15,7 +15,7 @@ const Message: FC = ({ message, isLeft }) => {
    ); }; - +//@ts-ignore const index: FC = ({ setHideChat, hideChat }) => { return (
    diff --git a/tauri-app/src/pages/Chat/index.tsx b/tauri-app/src/pages/Chat/index.tsx index 307e28b..eb2f26d 100644 --- a/tauri-app/src/pages/Chat/index.tsx +++ b/tauri-app/src/pages/Chat/index.tsx @@ -47,13 +47,16 @@ const index = () => { friends={45} /> {hideChat && (
    - +
    )}
    @@ -71,7 +74,9 @@ const index = () => { cover_pic={"/pic.jpg"} friends={45} /> - +
    diff --git a/tauri-app/src/pages/chat.tsx b/tauri-app/src/pages/chat.tsx index f886fe0..010a4bc 100644 --- a/tauri-app/src/pages/chat.tsx +++ b/tauri-app/src/pages/chat.tsx @@ -2,6 +2,7 @@ import React, { useEffect } from 'react'; import { Web5 } from "@web5/api/browser"; import { dingerProtocolDefinition } from '@/stores/useWeb5Store'; +import '../components/Chat/index.css'; // Define your dingerProtocolDefinition object @@ -167,7 +168,7 @@ const ChatConnect: React.FC = () => { const dingBackButton = document.createElement('button'); dingBackButton.className = 'ding-back'; - dingBackButton.textContent = 'Ding agane'; + // dingBackButton.textContent = 'Ding agane'; dingBackButton.dataset.toDing = record.recipient; dingBackButton.addEventListener('click', event => { @@ -188,7 +189,7 @@ const ChatConnect: React.FC = () => { const dingBackButton = document.createElement('button'); dingBackButton.className = 'ding-back'; - dingBackButton.textContent = 'Ding Back'; + // dingBackButton.textContent = 'Ding Back'; dingBackButton.dataset.toDing = dinger; dingBackButton.addEventListener('click', event => { @@ -211,9 +212,9 @@ const ChatConnect: React.FC = () => {


    - +
    - + @@ -231,3 +232,35 @@ const ChatConnect: React.FC = () => { }; export default ChatConnect; + + +interface MessageProp { + message: string; + isLeft: boolean; + } + //@ts-ignore + const Message: FC = ({ message, isLeft }) => { + return ( +
    +
    +

    {message}

    +
    +
    + ); + }; + //@ts-ignore + export const index: FC = () => { + return ( +
    +
    +
    +
    + + +
    +
    + ); + }; + From 63e97d3a73d0870ab7c8b964ec1e995dcec964d8 Mon Sep 17 00:00:00 2001 From: coder12git Date: Mon, 8 Jan 2024 10:31:26 +0530 Subject: [PATCH 120/136] remove text Signed-off-by: coder12git --- tauri-app/src/pages/chat.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tauri-app/src/pages/chat.tsx b/tauri-app/src/pages/chat.tsx index 010a4bc..41b8929 100644 --- a/tauri-app/src/pages/chat.tsx +++ b/tauri-app/src/pages/chat.tsx @@ -80,7 +80,7 @@ const ChatConnect: React.FC = () => { const shortenedDid = did.substr(0, 22); //@ts-ignore - dingProgressElement.textContent = `Ding written locally! Dinging ${shortenedDid}...`; + dingProgressElement.textContent = `Ding written! Dinging ${shortenedDid}...`; //@ts-ignore const { status: sendStatus } = await record.send(did); console.log('send status', sendStatus); From 3d76a1d0857f8a829e7a6418796692e880076aa2 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Mon, 8 Jan 2024 15:36:01 +0100 Subject: [PATCH 121/136] minor.feature added --- tauri-app/src/App.tsx | 11 ++--- tauri-app/src/components/Navbar/index.css | 1 + tauri-app/src/components/Navbar/index.tsx | 40 +++++++++++++++---- .../src/components/UserFriendList/index.tsx | 2 +- .../components/UserMobileFriendList/index.tsx | 2 +- tauri-app/src/hooks/useCopy.tsx | 0 6 files changed, 40 insertions(+), 16 deletions(-) create mode 100644 tauri-app/src/hooks/useCopy.tsx diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index 14be1c1..f5fabe9 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -19,15 +19,12 @@ const router = createHashRouter([ { path: "/", element: }, { path: "/records", - element: ( - - ), + element: , }, { path: "/connect", element: }, { - path: "/remedies", element: ( - - ) + path: "/remedies", + element: , }, { path: "/contact", element: }, { path: "/chat", element: }, @@ -48,7 +45,7 @@ function App() { return ( <> <> - {web5 ? :
    Connecting...
    } + {true ? :
    Connecting...
    } diff --git a/tauri-app/src/components/Navbar/index.css b/tauri-app/src/components/Navbar/index.css index 0227c4f..50ace42 100644 --- a/tauri-app/src/components/Navbar/index.css +++ b/tauri-app/src/components/Navbar/index.css @@ -133,6 +133,7 @@ outline: none; padding: 8px 4px; margin: 14px 0px; + margin-right: 8px; } @media (max-width: 750px) { diff --git a/tauri-app/src/components/Navbar/index.tsx b/tauri-app/src/components/Navbar/index.tsx index ea02e2a..4ea6ab3 100644 --- a/tauri-app/src/components/Navbar/index.tsx +++ b/tauri-app/src/components/Navbar/index.tsx @@ -4,7 +4,7 @@ import { NavLink } from "react-router-dom"; import useWeb5Store from "@/stores/useWeb5Store.ts"; import { Agent } from "../Auth/types"; import { useProfile } from "@/stores/profile.ts"; -import { useState } from "react"; +import { useState, useRef } from "react"; const SignedInBtn = () => { const { profile, signOut } = useProfile((store) => ({ @@ -12,6 +12,8 @@ const SignedInBtn = () => { signOut: store.signOut, })); const [showSignOutUtils, setShowSignOutUtils] = useState(false); + const [isCopied, setIsCopied] = useState(false); + const copyRef = useRef(null); return ( <> @@ -19,12 +21,30 @@ const SignedInBtn = () => {
    DID: - + + {!isCopied ? ( + { + copyRef.current.select(); + document.execCommand("copy"); + setIsCopied(true); + }} + className="fa-regular fa-copy" + > + ) : ( + + )}
    @@ -34,14 +54,20 @@ const SignedInBtn = () => { - ) -} + ); +}; const index = () => { const { web5, did } = useWeb5Store((state) => ({ diff --git a/tauri-app/src/components/UserFriendList/index.tsx b/tauri-app/src/components/UserFriendList/index.tsx index 210ade9..b229d75 100644 --- a/tauri-app/src/components/UserFriendList/index.tsx +++ b/tauri-app/src/components/UserFriendList/index.tsx @@ -22,7 +22,7 @@ const FriendTag: FC = ({

    {friendName.slice(0, 6) + "..."}

    = ({

    {friendName.slice(0, 20) + "..."}

    Date: Mon, 8 Jan 2024 20:53:26 +0530 Subject: [PATCH 122/136] added chat to frontend Signed-off-by: coder12git --- tauri-app/src/components/Chat/index.tsx | 277 ++++++++++++++++++++++-- tauri-app/src/pages/Home/index.tsx | 5 - tauri-app/src/pages/chat.tsx | 51 +---- 3 files changed, 269 insertions(+), 64 deletions(-) diff --git a/tauri-app/src/components/Chat/index.tsx b/tauri-app/src/components/Chat/index.tsx index 4bc8898..64148bd 100644 --- a/tauri-app/src/components/Chat/index.tsx +++ b/tauri-app/src/components/Chat/index.tsx @@ -1,22 +1,231 @@ import "./index.css"; -import React, { FC } from "react"; +import React, { useEffect, FC } from "react"; -interface MessageProp { - message: string; - isLeft: boolean; -} +// Import necessary libraries and modules +// import React, { useEffect } from 'react'; +import { Web5 } from "@web5/api/browser"; +import { dingerProtocolDefinition } from '@/stores/useWeb5Store'; +// import Chat from '../components/Chat'; -const Message: FC = ({ message, isLeft }) => { - return ( -
    -
    -

    {message}

    +// Define your dingerProtocolDefinition object + +//@ts-ignore +const index: React.FC = () => { + useEffect(() => { + const initDinger = async () => { + // const copyDidElement = document.querySelector('#copy-did'); + const dingForm = document.querySelector('#ding-form'); + const dingErrorElement = document.querySelector('#ding-error'); + const dingProgressElement = document.querySelector('#ding-progress'); + const dingedList = document.querySelector('#dinged-list'); + const dingedByList = document.querySelector('#dinged-by-list'); + + const { web5, did: myDid } = await Web5.connect(); + await configureProtocol(web5); + + setInterval(async () => { + await renderDings(web5, myDid, dingedList, dingedByList); + }, 2000); + + //@ts-ignore + // copyDidElement.addEventListener('click', async () => { + // try { + // await navigator.clipboard.writeText(myDid); + // } catch (err) { + // //@ts-ignore + // alert('Failed to copy DID: ', err); + // } + // }); + + //@ts-ignore + dingForm.addEventListener('submit', async (event) => { + // ... (your existing form submission logic) + event.preventDefault(); + + //@ts-ignore + dingErrorElement.textContent = ''; + //@ts-ignore + dingProgressElement.textContent = ''; + //@ts-ignore + const did = document.querySelector('#did').value; + //@ts-ignore + const note = document.querySelector('#note').value; + + if (did.length === 0) { + //@ts-ignore + dingErrorElement.textContent = 'DID required'; + return; + } + + const ding = { dinger: myDid }; + if (note) { + //@ts-ignore + ding.note = note; + } + //@ts-ignore + dingProgressElement.textContent = 'writing ding to local DWN...'; + + try { + const { record, status } = await web5.dwn.records.write({ + data: ding, + message: { + protocol: dingerProtocolDefinition.protocol, + protocolPath: 'ding', + schema: 'ding', + recipient: did + } + }); + + if (status.code !== 202) { + //@ts-ignore + dingErrorElement.textContent = `${status.code} - ${status.detail}`; + return; + } + + const shortenedDid = did.substr(0, 22); + //@ts-ignore + dingProgressElement.textContent = `Ding written! Dinging ${shortenedDid}...`; + //@ts-ignore + const { status: sendStatus } = await record.send(did); + console.log('send status', sendStatus); + + if (sendStatus.code !== 202) { + //@ts-ignore + dingErrorElement.textContent = `${sendStatus.code} - ${sendStatus.detail}`; + return; + } + //@ts-ignore + dingProgressElement.textContent = `Dinged ${shortenedDid}!`; + } catch (e) { + //@ts-ignore + dingErrorElement.textContent = e.message; + return; + } + }); + }; + + initDinger(); + }, []); + + const configureProtocol = async (web5: any) => { + // ... (your existing configureProtocol function) + const { protocols, status } = await web5.dwn.protocols.query({ + message: { + filter: { + protocol: 'https://dinger.app/protocol' + } + } + }); + + if (status.code !== 200) { + alert('Failed to query protocols. check console'); + console.error('Failed to query protocols', status); + + return; + } + + // protocol already exists + if (protocols.length > 0) { + console.log('protocol already exists'); + return; + } + + // create protocol + const { status: configureStatus } = await web5.dwn.protocols.configure({ + message: { + definition: dingerProtocolDefinition + } + }); + + console.log('configure protocol status', configureStatus); + }; + + const renderDings = async (web5: any, myDid: string, dingedList: any, dingedByList: any) => { + // ... (your existing renderDings function) + const { records, status } = await web5.dwn.records.query({ + message: { + filter: { + protocol: dingerProtocolDefinition.protocol + } + } + }); + + if (status.code !== 200) { + alert('Failed to query for dings. check console'); + console.error('Failed to query dings', status); + } + + for (let record of records) { + const recordExists = document.getElementById(record.id); + if (recordExists) { + continue; + } + + const { dinger, note } = await record.data.json(); + if (dinger === myDid) { + const shortenedDid = record.recipient.substr(0, 22); + const formattedDing = `[${new Date(record.dateCreated).toLocaleString()}] ${shortenedDid}... - ${note || ''}`; + + const dingElement = document.createElement('li'); + dingElement.id = record.id; + dingElement.textContent = formattedDing; + + const dingBackButton = document.createElement('button'); + dingBackButton.className = 'ding-back'; + // dingBackButton.textContent = 'Ding agane'; + dingBackButton.dataset.toDing = record.recipient; + + dingBackButton.addEventListener('click', event => { + const didInput = document.querySelector('#did'); + //@ts-ignore + didInput.value = event.target.dataset.toDing; + }); + + dingElement.appendChild(dingBackButton); + dingedList.appendChild(dingElement); + } else { + const shortenedDid = dinger.substr(0, 22); + const formattedDing = `[${new Date(record.dateCreated).toLocaleString()}] ${shortenedDid}... - ${note || ''}`; + + const dingElement = document.createElement('li'); + dingElement.id = record.id; + dingElement.textContent = formattedDing; + + const dingBackButton = document.createElement('button'); + dingBackButton.className = 'ding-back'; + // dingBackButton.textContent = 'Ding Back'; + dingBackButton.dataset.toDing = dinger; + + dingBackButton.addEventListener('click', event => { + const didInput = document.querySelector('#did'); + //@ts-ignore + didInput.value = event.target.dataset.toDing; + }); + + dingElement.appendChild(dingBackButton); + dingedByList.appendChild(dingElement); + } + } + + }; + + + interface MessageProp { + message: string; + isLeft: boolean; + } + + const Message: FC = ({ message, isLeft }) => { + return ( +
    +
    +

    {message}

    +
    -
    - ); -}; + ); + }; -const index: FC = () => { + // const index: FC = () => { return (
    @@ -46,13 +255,45 @@ const index: FC = () => { } isLeft={false} /> + + {/*

    You Dinged:

    */} +
      + {/* List items will be added here dynamically */} +
    + + {/*

    You were Dinged by:

    */} +
      + {/* List items will be added here dynamically */} +
    - - + {/* */} +
    { + e.preventDefault(); + }} + id="ding-form"> +

    + {/*
    */} + + + {/*
    */} + + +
    + + {/*

    You Dinged:

    +
      */} + {/* List items will be added here dynamically */} + {/*
    + +

    You were Dinged by:

    */} + {/*
      */} + {/* List items will be added here dynamically */} + {/*
    */}
    ); }; diff --git a/tauri-app/src/pages/Home/index.tsx b/tauri-app/src/pages/Home/index.tsx index 21c534a..467bf42 100644 --- a/tauri-app/src/pages/Home/index.tsx +++ b/tauri-app/src/pages/Home/index.tsx @@ -50,11 +50,6 @@ export default function HomePage() { stored making it a breeze to safely store medical data and records.

    - - -
    diff --git a/tauri-app/src/pages/chat.tsx b/tauri-app/src/pages/chat.tsx index 41b8929..0703ca4 100644 --- a/tauri-app/src/pages/chat.tsx +++ b/tauri-app/src/pages/chat.tsx @@ -2,7 +2,7 @@ import React, { useEffect } from 'react'; import { Web5 } from "@web5/api/browser"; import { dingerProtocolDefinition } from '@/stores/useWeb5Store'; -import '../components/Chat/index.css'; +import Chat from '../components/Chat'; // Define your dingerProtocolDefinition object @@ -207,7 +207,8 @@ const ChatConnect: React.FC = () => { return (
    - + + {/*

    @@ -216,51 +217,19 @@ const ChatConnect: React.FC = () => {
    -
    + */} -

    You Dinged:

    -
      + {/*

      You Dinged:

      +
        */} {/* List items will be added here dynamically */} -
      + {/*

    You were Dinged by:

    -
      +
        */} {/* List items will be added here dynamically */} -
      + {/*
    */}
    ); }; -export default ChatConnect; - - -interface MessageProp { - message: string; - isLeft: boolean; - } - //@ts-ignore - const Message: FC = ({ message, isLeft }) => { - return ( -
    -
    -

    {message}

    -
    -
    - ); - }; - //@ts-ignore - export const index: FC = () => { - return ( -
    -
    -
    -
    - - -
    -
    - ); - }; - +export default ChatConnect; \ No newline at end of file From 4a5b04d1e5f83752d5096846693d156a44c4705b Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Mon, 8 Jan 2024 16:58:09 +0100 Subject: [PATCH 123/136] features added --- .../src/components/UserFriendList/index.css | 19 ++++++++++ .../src/components/UserFriendList/index.tsx | 36 +++++++++++++++++-- .../components/UserMobileFriendList/index.css | 24 ++++++++++--- .../components/UserMobileFriendList/index.tsx | 31 ++++++++++++++-- tauri-app/src/pages/Chat/index.tsx | 7 ++-- tauri-app/src/pages/Home/index.tsx | 7 +--- tauri-app/src/pages/Records/index.css | 28 ++------------- tauri-app/src/pages/Records/index.tsx | 1 - tauri-app/src/pages/Remedies/index.tsx | 1 - 9 files changed, 108 insertions(+), 46 deletions(-) diff --git a/tauri-app/src/components/UserFriendList/index.css b/tauri-app/src/components/UserFriendList/index.css index 9fe13c0..7cd7e00 100644 --- a/tauri-app/src/components/UserFriendList/index.css +++ b/tauri-app/src/components/UserFriendList/index.css @@ -65,8 +65,27 @@ text-align: center; } +.d-did-container { + display: flex; + justify-content: center; + align-items: center; +} + +.friend-tag-container input { + background: var(--color-light-grey); + border-radius: 5px; + border: none; + font-family: "Roboto"; + outline: none; + padding: 8px 4px; + margin: 14px 0px; + margin-right: 8px; + width: 40px; +} + .friend-main-list-container { overflow-y: scroll; + overflow-x: hidden; height: 250px; margin: 15px 0; padding: 5px; diff --git a/tauri-app/src/components/UserFriendList/index.tsx b/tauri-app/src/components/UserFriendList/index.tsx index b229d75..02676a3 100644 --- a/tauri-app/src/components/UserFriendList/index.tsx +++ b/tauri-app/src/components/UserFriendList/index.tsx @@ -1,11 +1,12 @@ import "./index.css"; -import React, { FC, useState } from "react"; +import React, { FC, useState, useRef } from "react"; interface FriendTagProp { friendProfileImg: string; friendName: string; isFriendOnline: boolean; newChat?: number; + did?: string; } const FriendTag: FC = ({ @@ -13,14 +14,42 @@ const FriendTag: FC = ({ friendName, isFriendOnline, newChat, + did, }) => { + const [isCopied, setIsCopied] = useState(false); + + const didRef = useRef(null); + return (
    {newChat && {newChat}}
    -

    {friendName.slice(0, 6) + "..."}

    +
    +

    {friendName.slice(0, 6) + "..."}

    +
    + + + {!isCopied ? ( + { + e.stopPropagation(); + didRef.current.select(); + document.execCommand("copy"); + setIsCopied(true); + }} + className="fa-regular fa-copy" + > + ) : ( + + )} +
    +
    { return (
    -
    +

    Friends

    @@ -54,6 +83,7 @@ const index: FC = ({ friendList, setHideChat, hideChat }) => { isFriendOnline={friend.isOnline} friendName={friend.username} newChat={friend.newChat} + did={friend.did} />
    diff --git a/tauri-app/src/components/UserMobileFriendList/index.css b/tauri-app/src/components/UserMobileFriendList/index.css index 68bbd6e..5da9c63 100644 --- a/tauri-app/src/components/UserMobileFriendList/index.css +++ b/tauri-app/src/components/UserMobileFriendList/index.css @@ -26,18 +26,34 @@ font-family: "Roboto"; background: var(--color-red); border-radius: 3px; - padding: 2px 3px; + padding: 2px 4px; color: var(--color-white); border: 2px solid var(--color-white); border-radius: 8px; - font-size: 8px; + font-size: 10px; position: relative; - left: -15px; - top: -4px; width: 40px; + top: -25px; height: 40px; } +.m-friend-tag-container input { + background: var(--color-white); + border-radius: 5px; + border: none; + font-family: "Roboto"; + outline: none; + padding: 8px 4px; + margin: 14px 0px; + margin-right: 8px; +} + +.m-did-container { + display: flex; + justify-content: center; + align-items: center; +} + .m-friends-list-container hr { width: 80%; margin: 0 auto; diff --git a/tauri-app/src/components/UserMobileFriendList/index.tsx b/tauri-app/src/components/UserMobileFriendList/index.tsx index 39dc86f..7de5ce9 100644 --- a/tauri-app/src/components/UserMobileFriendList/index.tsx +++ b/tauri-app/src/components/UserMobileFriendList/index.tsx @@ -1,5 +1,5 @@ import "./index.css"; -import React, { FC, useState } from "react"; +import React, { FC, useState, useRef } from "react"; interface FriendTagProp { friendProfileImg: string; @@ -8,6 +8,7 @@ interface FriendTagProp { newChat?: number; setHideChat: () => void; hideChat: boolean; + didi?: string; } interface UserFriendListProp { @@ -21,7 +22,11 @@ const FriendTag: FC = ({ newChat, setHideChat, hideChat, + did, }) => { + const [isCopied, setIsCopied] = useState(false); + const didRef = useRef(null); + return (
    setHideChat(!hideChat)} @@ -31,8 +36,29 @@ const FriendTag: FC = ({ {newChat && {newChat}}
    -
    +

    {friendName.slice(0, 20) + "..."}

    +
    + + + {!isCopied ? ( + { + e.stopPropagation(); + didRef.current.select(); + document.execCommand("copy"); + setIsCopied(true); + }} + className="fa-regular fa-copy" + > + ) : ( + + )} +
    = ({ newChat={friend.newChat} setHideChat={setHideChat} hideChat={hideChat} + did={friend.did} /> ); diff --git a/tauri-app/src/pages/Chat/index.tsx b/tauri-app/src/pages/Chat/index.tsx index eb2f26d..04e3063 100644 --- a/tauri-app/src/pages/Chat/index.tsx +++ b/tauri-app/src/pages/Chat/index.tsx @@ -12,15 +12,16 @@ import { useEffect, useState } from "react"; const index = () => { const [friends, setFriends] = useState([ - { profile_pic: "/pg.jpg", username: "@scriptkidd", isOnline: false }, - { profile_pic: "/pg.jpg", username: "@nikki", isOnline: false, newChat: 1 }, + { profile_pic: "/pg.jpg", username: "@scriptkidd", isOnline: false ,did:"1020383*@(wppwsj)"}, + { profile_pic: "/pg.jpg", username: "@nikki", isOnline: false, newChat: 1,did:"apqpwpudrZpwpsAaap" }, { profile_pic: "/pm.jpg", username: "@gregidd", isOnline: true, newChat: 7, + did:"12340APDPDISavavagaAjd" }, - { profile_pic: "/pic.jpg", username: "@scdd", isOnline: false, newChat: 4 }, + { profile_pic: "/pic.jpg", username: "@scdd", isOnline: false, newChat: 4 ,did:"APSOWJEHDHaksosodoQPPE1O"}, ]); const [isMobile, setIsMobile] = useState(false); const [hideChat, setHideChat] = useState(false); diff --git a/tauri-app/src/pages/Home/index.tsx b/tauri-app/src/pages/Home/index.tsx index 21c534a..2f374bd 100644 --- a/tauri-app/src/pages/Home/index.tsx +++ b/tauri-app/src/pages/Home/index.tsx @@ -50,12 +50,7 @@ export default function HomePage() { stored making it a breeze to safely store medical data and records.

    - - - -
    +

    A.I

    diff --git a/tauri-app/src/pages/Records/index.css b/tauri-app/src/pages/Records/index.css index fc6c53d..8c0bd43 100644 --- a/tauri-app/src/pages/Records/index.css +++ b/tauri-app/src/pages/Records/index.css @@ -76,7 +76,6 @@ .connect-wallet-container { width: 300px; - height: 200px; background: var(--color-white); border-radius: 15px; padding: 18px 8px; @@ -87,31 +86,8 @@ font-family: "Roboto"; font-size: 25px; margin-top: 30px; -} - -.connect-wallet-container button { - padding: 8px 20px; - border-radius: 8px; - background: var(--color-green); - box-shadow: var(--box-shadow-green); - color: var(--color-white); - font-family: "Roboto"; - cursor: pointer; - font-weight: 800; - border: none; - min-width: 180px; - font-size: 25px; - text-align: center; - margin-top: 40px; - outline: none; -} - -.connect-wallet-container button i { - background: var(--color-white); - padding: 10px 12px; - border-radius: 50%; - color: var(--color-black); - margin-left: 10px; + color: var(--color-red); + margin: auto auto; } @media (max-width: 750px) { diff --git a/tauri-app/src/pages/Records/index.tsx b/tauri-app/src/pages/Records/index.tsx index 5d53c6f..3ef81dd 100644 --- a/tauri-app/src/pages/Records/index.tsx +++ b/tauri-app/src/pages/Records/index.tsx @@ -125,7 +125,6 @@ const index = () => { }} >

    Unauthorized - Please Sign in

    -
    )} diff --git a/tauri-app/src/pages/Remedies/index.tsx b/tauri-app/src/pages/Remedies/index.tsx index f126edb..f70582a 100644 --- a/tauri-app/src/pages/Remedies/index.tsx +++ b/tauri-app/src/pages/Remedies/index.tsx @@ -230,7 +230,6 @@ const index = ({ save, formFunc, form, remediesData, docsWithImageUrls }) => { }} >

    Unauthorized - Please Sign in

    -
    )} From 455d96c995f747dbe09efecf4fe7d9e8f8861499 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Mon, 8 Jan 2024 17:02:52 +0100 Subject: [PATCH 124/136] fixed a minor typo --- tauri-app/src/App.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index f5fabe9..9a6d57d 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -45,7 +45,7 @@ function App() { return ( <> <> - {true ? :
    Connecting...
    } + {web5 ? :
    Connecting...
    } From 78b7d13758bb2f9073058958f29b9a909cdca34d Mon Sep 17 00:00:00 2001 From: Adophilus Date: Mon, 8 Jan 2024 16:50:46 +0000 Subject: [PATCH 125/136] added profile guard to chat route --- tauri-app/src/App.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index 9a6d57d..30924eb 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -10,6 +10,7 @@ import Records from "./pages/Records"; import Chat from "./pages/Chat/"; import { Toaster } from "react-hot-toast"; import ChatConnect from "./pages/chat"; +import ProfileGuard from "./components/Auth/Profile/Guard"; const router = createHashRouter([ { @@ -27,7 +28,7 @@ const router = createHashRouter([ element: , }, { path: "/contact", element: }, - { path: "/chat", element: }, + { path: "/chat", element: }, { path: "/chatConnect", element: }, ], }, From 43248891423ca6a2144bd72149bdb93c0df70631 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Mon, 8 Jan 2024 16:50:55 +0000 Subject: [PATCH 126/136] updated arguments to blob helper --- tauri-app/src/utils/blob.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tauri-app/src/utils/blob.ts b/tauri-app/src/utils/blob.ts index 67ea009..935c040 100644 --- a/tauri-app/src/utils/blob.ts +++ b/tauri-app/src/utils/blob.ts @@ -108,12 +108,12 @@ async function createBlobRecord(agent: Agent, payload: CreatePayload, remote?: b return record } -async function fetchBlobRecord(agent: Agent, filter: FilterObj) { +async function fetchBlobRecord(agent: Agent, filter: FilterObj, remote?: boolean) { const records = await fetchRecords(agent, { ...filter, protocolPath: "blob", schema: BlobProtocol.types.blob.schema, - }) + }, remote) if (!records || !records[0]) return false From 499f1964de53b184725503bcf7efa766f1394645 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Mon, 8 Jan 2024 16:51:08 +0000 Subject: [PATCH 127/136] integrated the conntect feature to the chats integrated the connect feature to the chats --- .../src/components/UserFriendList/index.tsx | 7 +- tauri-app/src/pages/Chat/index.tsx | 140 ++++++++++++++---- 2 files changed, 112 insertions(+), 35 deletions(-) diff --git a/tauri-app/src/components/UserFriendList/index.tsx b/tauri-app/src/components/UserFriendList/index.tsx index 02676a3..05d80f7 100644 --- a/tauri-app/src/components/UserFriendList/index.tsx +++ b/tauri-app/src/components/UserFriendList/index.tsx @@ -1,3 +1,4 @@ +import { Friend } from "@/pages/Chat"; import "./index.css"; import React, { FC, useState, useRef } from "react"; @@ -68,7 +69,7 @@ interface UserFriendListProp { hideChat: boolean; } -const index: FC = ({ friendList, setHideChat, hideChat }) => { +const index: FC<{ friendList: Friend[]}> = ({ friendList, setHideChat, hideChat }) => { return (
    @@ -79,10 +80,10 @@ const index: FC = ({ friendList, setHideChat, hideChat }) => { return ( <>
    diff --git a/tauri-app/src/pages/Chat/index.tsx b/tauri-app/src/pages/Chat/index.tsx index 04e3063..e7e7e6d 100644 --- a/tauri-app/src/pages/Chat/index.tsx +++ b/tauri-app/src/pages/Chat/index.tsx @@ -9,23 +9,104 @@ import UserMobileFriendList from "../../components/UserMobileFriendList/"; import MobileChat from "../../components/MobileChat"; import { useEffect, useState } from "react"; +import { Agent } from "@/components/Auth/types"; +import UserDetailsUtils from "@/utils/user"; +import { Record as UserDetailsProtocolRecord } from "@/utils/protocols/user"; +import BlobUtils from "@/utils/blob"; +import { useProfile } from "@/stores/profile"; +import useWeb5Store from "@/stores/useWeb5Store"; + +const fetchProfilesWithConditions = async (agent: Agent, conditions: string[]) => { + const profileRecords = await UserDetailsUtils.fetchUserDetailsRecords(agent) + if (!profileRecords) + return [] + + const profilesWithRank = [] + for (const record of profileRecords) { + const profile: UserDetailsProtocolRecord.Details = await record.data.json() + + if (profile.did === agent.did) continue + + const profileWithRank = { + profile, + rank: 0 + } + + for (const condition of conditions) { + if (profile.conditions.indexOf(condition) > -1) { + profileWithRank.rank += 1 + } + } + + if (profileWithRank.rank === 0) continue + + profilesWithRank.push(profileWithRank) + } + + const sortedProfiles = profilesWithRank + .sort((a, b) => b.rank - a.rank) + .map((profileWithRank) => profileWithRank.profile) + + const matchingProfiles: (Omit & { profilePictureUrl: string })[] = [] + + for (const p of sortedProfiles) { + const { profilePictureId, ...profile } = p + const profilePictureRecord = await BlobUtils.fetchBlobRecord(agent, { recordId: profilePictureId }, true) + + const payload = { + ...profile, + profilePictureUrl: "" + } + + if (profilePictureRecord) { + const profilePicture = await profilePictureRecord.data.blob() + payload.profilePictureUrl = URL.createObjectURL(profilePicture) + } + + matchingProfiles.push(payload) + } + + return matchingProfiles +} + +export type Friend = Awaited>[number] & { + isOnline: boolean + username: string +} const index = () => { - const [friends, setFriends] = useState([ - { profile_pic: "/pg.jpg", username: "@scriptkidd", isOnline: false ,did:"1020383*@(wppwsj)"}, - { profile_pic: "/pg.jpg", username: "@nikki", isOnline: false, newChat: 1,did:"apqpwpudrZpwpsAaap" }, - { - profile_pic: "/pm.jpg", - username: "@gregidd", - isOnline: true, - newChat: 7, - did:"12340APDPDISavavagaAjd" - }, - { profile_pic: "/pic.jpg", username: "@scdd", isOnline: false, newChat: 4 ,did:"APSOWJEHDHaksosodoQPPE1O"}, + const [friends, setFriends] = useState([ + // { profile_pic: "/pg.jpg", username: "@scriptkidd", isOnline: false, did: "1020383*@(wppwsj)" }, + // { profile_pic: "/pg.jpg", username: "@nikki", isOnline: false, newChat: 1, did: "apqpwpudrZpwpsAaap" }, + // { + // profile_pic: "/pm.jpg", + // username: "@gregidd", + // isOnline: true, + // newChat: 7, + // did: "12340APDPDISavavagaAjd" + // }, + // { profile_pic: "/pic.jpg", username: "@scdd", isOnline: false, newChat: 4, did: "APSOWJEHDHaksosodoQPPE1O" }, ]); const [isMobile, setIsMobile] = useState(false); const [hideChat, setHideChat] = useState(false); + const profile = useProfile(store => store.state.profile!) + const { web5, did } = useWeb5Store(store => ({ web5: store.web5!, did: store.did! })) + + useEffect(() => { + const fetchProfiles = async () => { + const res = await fetchProfilesWithConditions({ web5, did }, profile.conditions) + const newFriends = res.map(profile => ({ + ...profile, + isOnline: true, + username: `${profile.firstName}${profile.lastName}` + })) + setFriends(newFriends) + } + + fetchProfiles() + }, [profile, web5, did]) + useEffect(() => { if (window.innerWidth < 750) { setIsMobile(true); @@ -39,25 +120,23 @@ const index = () => { return (
    {hideChat && (
    - +
    )}
    @@ -67,17 +146,14 @@ const index = () => {
    - +
    From e951d031e71f32698c9b76bac68fabed9053884a Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Mon, 8 Jan 2024 22:08:08 +0100 Subject: [PATCH 128/136] done tho still need's work --- tauri-app/src/App.tsx | 2 +- .../src/components/FindFriends/index.css | 79 +++++++++++ .../src/components/FindFriends/index.tsx | 79 +++++++++++ .../src/components/FriendRequests/index.css | 127 ++++++++++++++++++ .../src/components/FriendRequests/index.tsx | 60 +++++++++ .../components/UserMobileProfile/index.tsx | 27 ++++ .../src/components/UserProfile/index.css | 55 ++++++++ .../src/components/UserProfile/index.tsx | 33 ++++- tauri-app/src/pages/Chat/index.tsx | 90 +++++++++++-- 9 files changed, 537 insertions(+), 15 deletions(-) create mode 100644 tauri-app/src/components/FindFriends/index.css create mode 100644 tauri-app/src/components/FindFriends/index.tsx create mode 100644 tauri-app/src/components/FriendRequests/index.css create mode 100644 tauri-app/src/components/FriendRequests/index.tsx diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index 9a6d57d..f5fabe9 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -45,7 +45,7 @@ function App() { return ( <> <> - {web5 ? :
    Connecting...
    } + {true ? :
    Connecting...
    } diff --git a/tauri-app/src/components/FindFriends/index.css b/tauri-app/src/components/FindFriends/index.css new file mode 100644 index 0000000..1c3afee --- /dev/null +++ b/tauri-app/src/components/FindFriends/index.css @@ -0,0 +1,79 @@ +.find-friends-container { + width: 500px; + height: max-content; + min-height: 420px; + background: var(--color-white); + border-radius: 15px; + padding: 20px; +} + +.find-friends-container h3 { + font-family: "Pacifico"; +} + +.loading-container { + display: flex; + justify-content: center; + align-items: center; + flex-direction: center; + width: 480px; + height: max-content; + margin: auto auto; + min-height: 300px; + position: relative; +} + +.pluse-container { + width: 100px; + height: 100px; + background: var(--color-red); + box-shadow: var(--box-shadow-red); + border-radius: 50%; + font-size: 30px; + color: var(--color-white); + display: flex; + justify-content: center; + align-items: center; + position: relative; +} + +.g-pluse { + position: absolute; + width: 100px; + height: 100px; + background: var(--color-green); + border-radius: 50%; + top: 100px; + transform: scale(1.5); + animation: pulseAnim 2s ease-out infinite; +} + +.b-pluse { + position: absolute; + width: 100px; + height: 100px; + background: var(--color-blue); + border-radius: 50%; + top: 100px; + transform: scale(1.5); + animation: pulseAnim 2s ease-out infinite; + animation-delay: 1s; +} + +@keyframes pulseAnim { + 100% { + transform: scale(2.5); + opacity: 0; + } +} + +@media (max-width: 750px) { + .find-friends-container { + width: 320px; + padding: 10px; + } + + .loading-container { + width: 310px; + } +} diff --git a/tauri-app/src/components/FindFriends/index.tsx b/tauri-app/src/components/FindFriends/index.tsx new file mode 100644 index 0000000..4a288d1 --- /dev/null +++ b/tauri-app/src/components/FindFriends/index.tsx @@ -0,0 +1,79 @@ +import "./index.css"; +import React, { FC, useState, useRef } from "react"; + +const FriendRequest: FC = () => { + const [isCopied, setIsCopied] = useState(false); + const copyRef = useRef(null); + + return ( +
    +
    + +
    +

    @Hello.world

    +
    + + {!isCopied ? ( + { + copyRef.current.select(); + document.execCommand("copy"); + setIsCopied(true); + }} + className="fa-regular fa-copy" + > + ) : ( + + )} +
    +
    +
    +
    + +
    +
    + ); +}; + +const index: FC = () => { + const [isLoading, setIsLoading] = useState(true); + setTimeout(() => { + setIsLoading(false); + }, 5000); + return ( +
    + {isLoading ? ( + <> +
    +
    +
    + +
    + +
    +
    +

    Recommending friends based off medical records...

    + + ) : ( + <> +
    + {[1, 2, 3, 4, 5, 6, 7].map((num) => { + return ; + })} +
    + + )} +
    + ); +}; + +export default index; diff --git a/tauri-app/src/components/FriendRequests/index.css b/tauri-app/src/components/FriendRequests/index.css new file mode 100644 index 0000000..ba82165 --- /dev/null +++ b/tauri-app/src/components/FriendRequests/index.css @@ -0,0 +1,127 @@ +.friend-request-container { + box-shadow: var(--box-shadow-black); + padding: 5px 8px; + border-radius: 5px; + width: 280px; + margin: 18px 0px; +} + +.friend-requests-container:n-child(1) { + margin-top: 60px; +} + +.btn-container { + display: flex; + justify-content: space-around; + align-items: center; +} + +.btn-container button { + width: max-content; + padding: 4px 12px; + outline: none; + border-radius: 3px; + border: none; + font-family: "Roboto"; + margin: 8px 0px; + font-weight: 800; + color: var(--color-white); + text-transform: uppercase; +} + +.btn-container button:nth-child(1) { + background: var(--color-green); + box-shadow: var(--box-shadow-green); +} + +.btn-container button:nth-child(2) { + background: var(--color-red); + box-shadow: var(--box-shadow-red); +} + +.friend-request-header { + display: flex; + justify-content: space-between; + align-items: center; + font-family: "Roboto"; + text-align: left; +} + +.friend-request-header img { + width: 50px; + height: 50px; + border-radius: 5px; +} + +.friend-request-header input { + padding: 4px 8px; + background: var(--color-slate-accent); + border: none; + border-radius: 3px; + font-family: "Roboto"; + margin: 8px 0; + margin-right: 10px; + outline: none; +} + +.friend-requests-container { + width: 400px; + height: max-content; + border-radius: 15px; + background: var(--color-white); + padding: 20px; +} + +.friend-requests-container h1 { + padding: 8px 10px; + font-family: "Pacifico"; +} + +.requests-container { + height: 420px; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + overflow-y: scroll; + overflow-x: hidden; + text-align: center; +} + +.requests-container::-webkit-scrollbar { + width: 6px; +} + +.requests-container::-webkit-scrollbar-track { + box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.1); + border-radius: 5px; +} + +.requests-container::-webkit-scrollbar-thumb { + width: 2px; + background: var(--color-blue); + border-radius: 5px; + margin: 0 3px; +} + +@media (max-width: 750px) { + .friend-requests-container { + width: 300px; + } + + .friend-request-container { + width: 270px; + } + + .friend-request-header img { + margin-right: 5px; + } + + .btn-container button { + padding: 8px 10px; + } + + .friend-requests-container:n-child(1) { + margin-top: 110px; + } +} diff --git a/tauri-app/src/components/FriendRequests/index.tsx b/tauri-app/src/components/FriendRequests/index.tsx new file mode 100644 index 0000000..ad5d819 --- /dev/null +++ b/tauri-app/src/components/FriendRequests/index.tsx @@ -0,0 +1,60 @@ +import "./index.css"; +import React, { FC, useState, useRef } from "react"; + +const FriendRequest: FC = () => { + const [isCopied, setIsCopied] = useState(false); + const copyRef = useRef(null); + + return ( +
    +
    + +
    +

    @Hello.world

    +
    + + {!isCopied ? ( + { + copyRef.current.select(); + document.execCommand("copy"); + setIsCopied(true); + }} + className="fa-regular fa-copy" + > + ) : ( + + )} +
    +
    +
    +
    + + +
    +
    + ); +}; +const index: FC = () => { + return ( +
    e.stopPropagation()} + > +

    Friend Requests!

    +
    + {[1, 2, 3, 4, 5, 6, 7].map((num) => { + return ; + })} +
    +
    + ); +}; + +export default index; diff --git a/tauri-app/src/components/UserMobileProfile/index.tsx b/tauri-app/src/components/UserMobileProfile/index.tsx index e25db19..272b42c 100644 --- a/tauri-app/src/components/UserMobileProfile/index.tsx +++ b/tauri-app/src/components/UserMobileProfile/index.tsx @@ -2,19 +2,35 @@ import React, { FC } from "react"; import "./index.css"; +interface friendUtils { + showFriendRequests: boolean; + setShowFriendRequests: () => void; +} + +interface findFriends { + showFriendRequests: boolean; + setShowFriendRequests: () => void; +} + interface UserProfileProps { username: String; profile_pic: String; cover_pic: String; about_user: String; friends: Number; + friendRequetsUtils: friendUtils[]; + findFriendsUtils: findFriendUtils[]; } + const index: FC = ({ username, profile_pic, cover_pic, about_user, friends, + friendRequests, + friendRequestsUtils, + findFriendsUtils }) => { return (
    @@ -30,6 +46,17 @@ const index: FC = ({

    Friends | {friends}

    +

    + +

    + +
    + friendRequestsUtils[1](!friendRequestsUtils[0])} + className="fa fa-bell" + > + {friendRequests} +
    diff --git a/tauri-app/src/components/UserProfile/index.css b/tauri-app/src/components/UserProfile/index.css index 084e0cd..d827ddc 100644 --- a/tauri-app/src/components/UserProfile/index.css +++ b/tauri-app/src/components/UserProfile/index.css @@ -49,8 +49,63 @@ top: 15px; } +.bell-container { + position: absolute; + right: 10px; + top: 22px; +} + +.bell-container i { + font-size: 25px; + color: var(--color-white); +} + +.bell-container span { + font-family: "Roboto"; + background: var(--color-red); + box-shadow: var(--box-shadow-red); + color: var(--color-white); + padding: 2px 4px; + border-radius: 10px; + border: 2px solid var(--color-white); + font-size: 10px; + position: relative; + left: -8px; +} + +.find-friend-btn { + background: transparent; + color: var(--color-white); + font-family: "Roboto"; + border: none; + outline: none; + text-decoration: underline; + cursor: pointer; +} + @media (max-width: 750px) { .userprofile-container { width: 100%; } + + .bell-container { + top: 18px; + } + + .bell-container i { + font-size: 30px; + } + + .find-friend-btn { + padding: 4px 6px; + margin-top: 5px; + background: var(--color-red); + box-shadow: var(--box-shadow-red); + color: var(--color-white); + border-radius: 5px; + font-family: "Roboto"; + border: none; + outline: none; + text-decoration: none; + } } diff --git a/tauri-app/src/components/UserProfile/index.tsx b/tauri-app/src/components/UserProfile/index.tsx index 59c87f0..fe9ff90 100644 --- a/tauri-app/src/components/UserProfile/index.tsx +++ b/tauri-app/src/components/UserProfile/index.tsx @@ -2,19 +2,35 @@ import React, { FC } from "react"; import "./index.css"; +interface friendUtils { + showFriendRequests: boolean; + setShowFriendRequests: () => void; +} + +interface findFriends { + showFriendRequests: boolean; + setShowFriendRequests: () => void; +} + interface UserProfileProps { username: String; profile_pic: String; cover_pic: String; about_user: String; friends: Number; + friendRequetsUtils: friendUtils[]; + findFriendsUtils: findFriendUtils[]; } + const index: FC = ({ username, profile_pic, cover_pic, about_user, friends, + friendRequests, + friendRequestsUtils, + findFriendsUtils, }) => { return (
    @@ -28,8 +44,23 @@ const index: FC = ({ >

    @{username}

    - Friends | {friends} + Friends {friends} +

    +

    +

    +
    + friendRequestsUtils[1](!friendRequestsUtils[0])} + className="fa fa-bell" + > + {friendRequests} +
    diff --git a/tauri-app/src/pages/Chat/index.tsx b/tauri-app/src/pages/Chat/index.tsx index 04e3063..282d2c4 100644 --- a/tauri-app/src/pages/Chat/index.tsx +++ b/tauri-app/src/pages/Chat/index.tsx @@ -1,8 +1,9 @@ import "./index.css"; import UserProfile from "../../components/UserProfile/"; import UserFriendList from "../../components/UserFriendList/"; - import Chat from "../../components/Chat/"; +import FriendRequests from "../../components/FriendRequests/"; +import FindFriends from "../../components/FindFriends/"; import UserMobileProfile from "../../components/UserMobileProfile/"; import UserMobileFriendList from "../../components/UserMobileFriendList/"; @@ -12,19 +13,38 @@ import { useEffect, useState } from "react"; const index = () => { const [friends, setFriends] = useState([ - { profile_pic: "/pg.jpg", username: "@scriptkidd", isOnline: false ,did:"1020383*@(wppwsj)"}, - { profile_pic: "/pg.jpg", username: "@nikki", isOnline: false, newChat: 1,did:"apqpwpudrZpwpsAaap" }, + { + profile_pic: "/pg.jpg", + username: "@scriptkidd", + isOnline: false, + did: "1020383*@(wppwsj)", + }, + { + profile_pic: "/pg.jpg", + username: "@nikki", + isOnline: false, + newChat: 1, + did: "apqpwpudrZpwpsAaap", + }, { profile_pic: "/pm.jpg", username: "@gregidd", isOnline: true, newChat: 7, - did:"12340APDPDISavavagaAjd" + did: "12340APDPDISavavagaAjd", + }, + { + profile_pic: "/pic.jpg", + username: "@scdd", + isOnline: false, + newChat: 4, + did: "APSOWJEHDHaksosodoQPPE1O", }, - { profile_pic: "/pic.jpg", username: "@scdd", isOnline: false, newChat: 4 ,did:"APSOWJEHDHaksosodoQPPE1O"}, ]); const [isMobile, setIsMobile] = useState(false); const [hideChat, setHideChat] = useState(false); + const [showFriendRequests, setShowFriendRequests] = useState(false); + const [showFindFriends, setShowFindFriends] = useState(false); useEffect(() => { if (window.innerWidth < 750) { @@ -33,7 +53,7 @@ const index = () => { } setIsMobile(false); - }, []); + }, [window.innerWidth]); if (isMobile) { return ( @@ -46,18 +66,40 @@ const index = () => { profile_pic={"/pg.jpg"} cover_pic={"/pic.jpg"} friends={45} + friendRequests={5} + friendRequestsUtils={[showFriendRequests, setShowFriendRequests]} + findFriendsUtils={[showFindFriends, setShowFindFriends]} /> {hideChat && (
    - + +
    + )} + + {showFriendRequests && ( +
    setShowFriendRequests(false)} + className="data-container" + > + +
    + )} + {showFindFriends && ( +
    setShowFindFriends(false)} + className="data-container" + > +
    )}
    @@ -74,14 +116,36 @@ const index = () => { profile_pic={"/pg.jpg"} cover_pic={"/pic.jpg"} friends={45} + friendRequests={5} + friendRequestsUtils={[showFriendRequests, setShowFriendRequests]} + findFriendsUtils={[showFindFriends, setShowFindFriends]} + /> + -
    + + {showFriendRequests && ( +
    setShowFriendRequests(false)} + className="data-container" + > + +
    + )} + + {showFindFriends && ( +
    setShowFindFriends(false)} + className="data-container" + > + +
    + )}
    ); }; From 7552db063ec523f144ed9d3b79079b12e3d1a32a Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Mon, 8 Jan 2024 22:11:55 +0100 Subject: [PATCH 129/136] minor typo fix --- tauri-app/src/App.tsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index 3a39460..78b72c9 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -28,7 +28,14 @@ const router = createHashRouter([ element: , }, { path: "/contact", element: }, - { path: "/chat", element: }, + { + path: "/chat", + element: ( + + + + ), + }, { path: "/chatConnect", element: }, ], }, @@ -46,7 +53,7 @@ function App() { return ( <> <> - {true ? :
    Connecting...
    } + {web5 ? :
    Connecting...
    } From 27a7c669dc1c11cd53b00bd4d1d70969a04b148a Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Mon, 8 Jan 2024 22:20:18 +0100 Subject: [PATCH 130/136] fixed some merge conflicts --- tauri-app/src/components/FindFriends/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tauri-app/src/components/FindFriends/index.tsx b/tauri-app/src/components/FindFriends/index.tsx index 4a288d1..9bb907e 100644 --- a/tauri-app/src/components/FindFriends/index.tsx +++ b/tauri-app/src/components/FindFriends/index.tsx @@ -50,7 +50,7 @@ const index: FC = () => { setIsLoading(false); }, 5000); return ( -
    +
    e.stopPropagation()}> {isLoading ? ( <>
    From d10c18c3963a74bbd88123a72c57acc484d42281 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Mon, 8 Jan 2024 22:20:34 +0100 Subject: [PATCH 131/136] fixed some merge conflicts --- tauri-app/src/pages/Chat/index.tsx | 49 ++++++------------------------ 1 file changed, 10 insertions(+), 39 deletions(-) diff --git a/tauri-app/src/pages/Chat/index.tsx b/tauri-app/src/pages/Chat/index.tsx index acc49b7..044dd82 100644 --- a/tauri-app/src/pages/Chat/index.tsx +++ b/tauri-app/src/pages/Chat/index.tsx @@ -154,27 +154,15 @@ const index = () => { return (
    >>>>>> 499f1964de53b184725503bcf7efa766f1394645 - /> - {
    @@ -204,9 +191,7 @@ const index = () => { className="data-container" > -======= setHideChat={setHideChat} hideChat={hideChat} /> ->>>>>>> 499f1964de53b184725503bcf7efa766f1394645
    )}
    @@ -216,32 +201,18 @@ const index = () => {
    - -======= - username={`${profile.firstName}${profile.lastName}`} + username={`${profile.firstName}${profile.lastName}`} about_user={profile.description} profile_pic={profile.profilePictureUrl} cover_pic={profile.profilePictureUrl} friends={friends.length} + friendRequests={5} + friendRequestsUtils={[showFriendRequests, setShowFriendRequests]} + findFriendsUtils={[showFindFriends, setShowFindFriends]} + /> ->>>>>>> 499f1964de53b184725503bcf7efa766f1394645
    From 643dad47182122e5311a1ab400a3d6fecc3bd9c1 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Mon, 8 Jan 2024 23:33:15 +0100 Subject: [PATCH 132/136] bugs fixed --- tauri-app/src/App.tsx | 2 +- tauri-app/src/components/FindFriends/index.tsx | 5 ++++- tauri-app/src/pages/Chat/index.tsx | 1 - 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index 78b72c9..a911cd8 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -53,7 +53,7 @@ function App() { return ( <> <> - {web5 ? :
    Connecting...
    } + {true ? :
    Connecting...
    } diff --git a/tauri-app/src/components/FindFriends/index.tsx b/tauri-app/src/components/FindFriends/index.tsx index 9bb907e..ce07ba3 100644 --- a/tauri-app/src/components/FindFriends/index.tsx +++ b/tauri-app/src/components/FindFriends/index.tsx @@ -50,7 +50,10 @@ const index: FC = () => { setIsLoading(false); }, 5000); return ( -
    e.stopPropagation()}> +
    e.stopPropagation()} + > {isLoading ? ( <>
    diff --git a/tauri-app/src/pages/Chat/index.tsx b/tauri-app/src/pages/Chat/index.tsx index 044dd82..5450385 100644 --- a/tauri-app/src/pages/Chat/index.tsx +++ b/tauri-app/src/pages/Chat/index.tsx @@ -191,7 +191,6 @@ const index = () => { className="data-container" > - setHideChat={setHideChat} hideChat={hideChat} />
    )}
    From c15abe2ab75eb5c9dbf9a25bd2999a88ab526a55 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Mon, 8 Jan 2024 23:54:22 +0100 Subject: [PATCH 133/136] fixes done and pushed --- tauri-app/src/components/FindFriends/index.css | 1 + tauri-app/src/components/UserMobileProfile/index.tsx | 11 ++++++++--- tauri-app/src/components/UserProfile/index.tsx | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/tauri-app/src/components/FindFriends/index.css b/tauri-app/src/components/FindFriends/index.css index 1c3afee..3618e78 100644 --- a/tauri-app/src/components/FindFriends/index.css +++ b/tauri-app/src/components/FindFriends/index.css @@ -5,6 +5,7 @@ background: var(--color-white); border-radius: 15px; padding: 20px; + margin-top: 30px; } .find-friends-container h3 { diff --git a/tauri-app/src/components/UserMobileProfile/index.tsx b/tauri-app/src/components/UserMobileProfile/index.tsx index 272b42c..eae5b80 100644 --- a/tauri-app/src/components/UserMobileProfile/index.tsx +++ b/tauri-app/src/components/UserMobileProfile/index.tsx @@ -30,7 +30,7 @@ const index: FC = ({ friends, friendRequests, friendRequestsUtils, - findFriendsUtils + findFriendsUtils, }) => { return (
    @@ -42,12 +42,17 @@ const index: FC = ({ }} className="m-cover-container" > -

    @{username}

    +

    @{username.slice(0, 10) + "..."}

    Friends | {friends}

    - +

    diff --git a/tauri-app/src/components/UserProfile/index.tsx b/tauri-app/src/components/UserProfile/index.tsx index fe9ff90..038de71 100644 --- a/tauri-app/src/components/UserProfile/index.tsx +++ b/tauri-app/src/components/UserProfile/index.tsx @@ -42,7 +42,7 @@ const index: FC = ({ }} className="cover-container" > -

    @{username}

    +

    @{username.slice(0, 10) + "..."}

    Friends {friends}

    From 97d92dc61cbc72b97389cef9edb88dc0de77eb0b Mon Sep 17 00:00:00 2001 From: coder12git Date: Tue, 9 Jan 2024 10:29:20 +0530 Subject: [PATCH 134/136] removed unwanted routes Signed-off-by: coder12git --- tauri-app/src/App.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index a911cd8..985fc9b 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -9,7 +9,6 @@ import SharedLayout from "./pages/SharedLayout/"; import Records from "./pages/Records"; import Chat from "./pages/Chat/"; import { Toaster } from "react-hot-toast"; -import ChatConnect from "./pages/chat"; import ProfileGuard from "./components/Auth/Profile/Guard"; const router = createHashRouter([ @@ -35,8 +34,7 @@ const router = createHashRouter([ ), - }, - { path: "/chatConnect", element: }, + } ], }, ]); From cdb8a79ff8444a07b8c97dfab0900d4e7ffd260b Mon Sep 17 00:00:00 2001 From: Suruchi Kumari Date: Tue, 9 Jan 2024 11:08:47 +0530 Subject: [PATCH 135/136] Update video in readme --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0d7151e..ebe173e 100644 --- a/README.md +++ b/README.md @@ -116,7 +116,10 @@ npm run dev ## Explainer video (User POV) -https://github.com/coder12git/Web5-Hack/assets/58889001/b5c4aa11-426c-492b-88fb-37425991ab47 + + +https://github.com/coder12git/Web5-Hack/assets/108334168/f465aff5-d1b9-4116-bb91-87e1906baec6 + ## Demo Video (Clients POV) From b9fe504b1d0f328542013b50db6d4e2c02509c4f Mon Sep 17 00:00:00 2001 From: coder12git Date: Tue, 9 Jan 2024 11:18:55 +0530 Subject: [PATCH 136/136] make web5 in app.tsx Signed-off-by: coder12git --- tauri-app/src/App.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index 985fc9b..0f543ce 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -51,7 +51,7 @@ function App() { return ( <> <> - {true ? :
    Connecting...
    } + {web5 ? :
    Connecting...
    }